From 191c5fae56b59b2e05bf213c192af813bc9cbaf4 Mon Sep 17 00:00:00 2001 From: Jeremy Long Date: Sun, 20 Sep 2015 07:41:29 -0400 Subject: [PATCH] documentation v1.3.1 --- SampleReport.html | 15509 ---------------- analyzers/archive-analyzer.html | 176 +- analyzers/assembly-analyzer.html | 176 +- analyzers/autoconf.html | 331 + analyzers/central-analyzer.html | 164 +- analyzers/cmake.html | 331 + analyzers/composer-lock.html | 246 + analyzers/index.html | 328 +- analyzers/jar-analyzer.html | 172 +- analyzers/nexus-analyzer.html | 178 +- analyzers/nodejs.html | 332 + analyzers/nuspec-analyzer.html | 172 +- analyzers/openssl.html | 331 + analyzers/python.html | 331 + analyzers/ruby-gemspec.html | 332 + css/apache-maven-fluido-1.4.min.css | 9 + current.txt | 2 +- data/cachenvd.html | 335 + data/database.html | 86 +- data/index.html | 90 +- data/mirrornvd.html | 86 +- data/proxy.html | 86 +- gradle.html => dependency-analysis.html | 145 +- .../apidocs/allclasses-frame.html | 12 +- .../apidocs/allclasses-noframe.html | 12 +- .../apidocs/constant-values.html | 8 +- .../apidocs/deprecated-list.html | 16 +- dependency-check-ant/apidocs/help-doc.html | 8 +- dependency-check-ant/apidocs/index-all.html | 329 +- dependency-check-ant/apidocs/index.html | 4 +- .../ant/logging/AntLoggerAdapter.html | 10 +- .../ant/logging/AntLoggerFactory.html | 8 +- .../logging/class-use/AntLoggerAdapter.html | 8 +- .../logging/class-use/AntLoggerFactory.html | 8 +- .../ant/logging/package-frame.html | 6 +- .../ant/logging/package-summary.html | 10 +- .../ant/logging/package-tree.html | 8 +- .../ant/logging/package-use.html | 8 +- .../taskdefs/Check.ReportFormats.html | 297 + .../owasp/dependencycheck/taskdefs/Check.html | 1370 ++ .../owasp/dependencycheck/taskdefs/Purge.html | 375 + .../dependencycheck/taskdefs/Update.html | 839 + .../class-use/Check.ReportFormats.html | 161 + .../taskdefs/class-use/Check.html | 117 + .../taskdefs/class-use/Purge.html | 167 + .../taskdefs/class-use/Update.html | 161 + .../taskdefs/package-frame.html | 12 +- .../taskdefs/package-summary.html | 24 +- .../taskdefs/package-tree.html | 20 +- .../dependencycheck/taskdefs/package-use.html | 20 +- .../org/slf4j/impl/StaticLoggerBinder.html | 8 +- .../impl/class-use/StaticLoggerBinder.html | 8 +- .../apidocs/org/slf4j/impl/package-frame.html | 6 +- .../org/slf4j/impl/package-summary.html | 8 +- .../apidocs/org/slf4j/impl/package-tree.html | 8 +- .../apidocs/org/slf4j/impl/package-use.html | 8 +- .../apidocs/overview-frame.html | 6 +- .../apidocs/overview-summary.html | 10 +- .../apidocs/overview-tree.html | 20 +- .../apidocs/serialized-form.html | 8 +- dependency-check-ant/checkstyle.html | 234 +- dependency-check-ant/checkstyle.rss | 146 +- ...org.owasp.dependencycheck.ant.logging.html | 4 +- ...es-org.owasp.dependencycheck.taskdefs.html | 8 +- .../frame-sourcefiles-org.slf4j.impl.html | 2 +- .../cobertura/frame-sourcefiles.html | 14 +- ...org.owasp.dependencycheck.ant.logging.html | 8 +- ...ry-org.owasp.dependencycheck.taskdefs.html | 12 +- .../frame-summary-org.slf4j.impl.html | 6 +- .../cobertura/frame-summary.html | 10 +- ...ncycheck.ant.logging.AntLoggerAdapter.html | 58 +- ...ncycheck.ant.logging.AntLoggerFactory.html | 12 +- ....owasp.dependencycheck.taskdefs.Check.html | 1710 ++ ....owasp.dependencycheck.taskdefs.Purge.html | 240 + ...owasp.dependencycheck.taskdefs.Update.html | 805 + .../org.slf4j.impl.StaticLoggerBinder.html | 28 +- dependency-check-ant/config-purge.html | 213 + dependency-check-ant/config-update.html | 357 + dependency-check-ant/configuration.html | 178 +- .../css/apache-maven-fluido-1.4.min.css | 9 + dependency-check-ant/dependency-analysis.html | 361 + .../dependency-updates-report.html | 563 +- dependency-check-ant/findbugs.html | 179 +- .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 35283 bytes .../fonts/glyphicons-halflings-regular.svg | 229 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 55016 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 41793 bytes .../images/apache-maven-project-2.png | Bin 33442 -> 43073 bytes dependency-check-ant/index.html | 86 +- dependency-check-ant/integration.html | 236 + dependency-check-ant/issue-tracking.html | 86 +- .../js/apache-maven-fluido-1.4.min.js | 25 + dependency-check-ant/license.html | 81 +- dependency-check-ant/mail-lists.html | 77 +- .../plugin-updates-report.html | 296 +- dependency-check-ant/project-info.html | 96 +- dependency-check-ant/project-reports.html | 202 +- dependency-check-ant/project-summary.html | 91 +- dependency-check-ant/source-repository.html | 106 +- dependency-check-ant/surefire-report.html | 183 +- dependency-check-ant/taglist.html | 175 +- dependency-check-ant/team-list.html | 104 +- dependency-check-ant/xref-test/index.html | 2 +- .../taskdefs/package-frame.html | 2 +- .../taskdefs/package-summary.html | 2 +- .../xref-test/overview-frame.html | 2 +- .../xref-test/overview-summary.html | 4 +- .../xref/allclasses-frame.html | 10 +- dependency-check-ant/xref/index.html | 2 +- .../ant/logging/AntLoggerAdapter.html | 2 +- .../ant/logging/package-frame.html | 2 +- .../ant/logging/package-summary.html | 2 +- .../owasp/dependencycheck/taskdefs/Check.html | 982 + .../owasp/dependencycheck/taskdefs/Purge.html | 140 + .../dependencycheck/taskdefs/Update.html | 446 + .../taskdefs/package-frame.html | 12 +- .../taskdefs/package-summary.html | 16 +- .../xref/org/slf4j/impl/package-frame.html | 2 +- .../xref/org/slf4j/impl/package-summary.html | 2 +- dependency-check-ant/xref/overview-frame.html | 2 +- .../xref/overview-summary.html | 4 +- .../apidocs/allclasses-frame.html | 6 +- .../apidocs/allclasses-noframe.html | 6 +- .../apidocs/constant-values.html | 81 +- .../apidocs/deprecated-list.html | 20 +- dependency-check-cli/apidocs/help-doc.html | 10 +- dependency-check-cli/apidocs/index-all.html | 64 +- dependency-check-cli/apidocs/index.html | 4 +- .../org/owasp/dependencycheck/App.html | 14 +- .../dependencycheck/CliParser.ARGUMENT.html | 189 +- .../org/owasp/dependencycheck/CliParser.html | 134 +- .../owasp/dependencycheck/class-use/App.html | 10 +- .../class-use/CliParser.ARGUMENT.html | 10 +- .../dependencycheck/class-use/CliParser.html | 10 +- .../owasp/dependencycheck/package-frame.html | 6 +- .../dependencycheck/package-summary.html | 10 +- .../owasp/dependencycheck/package-tree.html | 10 +- .../owasp/dependencycheck/package-use.html | 10 +- .../apidocs/overview-tree.html | 10 +- dependency-check-cli/arguments.html | 139 +- dependency-check-cli/checkstyle.html | 187 +- dependency-check-cli/checkstyle.rss | 38 +- ...sourcefiles-org.owasp.dependencycheck.html | 2 +- .../cobertura/frame-sourcefiles.html | 2 +- ...ame-summary-org.owasp.dependencycheck.html | 10 +- .../cobertura/frame-summary.html | 6 +- .../org.owasp.dependencycheck.App.html | 904 +- .../org.owasp.dependencycheck.CliParser.html | 2699 +-- ...endencycheck.InvalidScanPathException.html | 102 +- .../css/apache-maven-fluido-1.4.min.css | 9 + dependency-check-cli/dependency-analysis.html | 368 + .../dependency-updates-report.html | 553 +- dependency-check-cli/findbugs.html | 157 +- .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 35283 bytes .../fonts/glyphicons-halflings-regular.svg | 229 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 55016 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 41793 bytes .../images/apache-maven-project-2.png | Bin 33442 -> 43073 bytes dependency-check-cli/index.html | 88 +- dependency-check-cli/integration.html | 236 + dependency-check-cli/issue-tracking.html | 77 +- .../js/apache-maven-fluido-1.4.min.js | 25 + dependency-check-cli/license.html | 72 +- dependency-check-cli/mail-lists.html | 68 +- .../plugin-updates-report.html | 251 +- dependency-check-cli/pmd.html | 196 +- dependency-check-cli/project-info.html | 87 +- dependency-check-cli/project-reports.html | 193 +- dependency-check-cli/project-summary.html | 82 +- dependency-check-cli/source-repository.html | 97 +- dependency-check-cli/surefire-report.html | 181 +- dependency-check-cli/taglist.html | 149 +- dependency-check-cli/team-list.html | 95 +- dependency-check-cli/xref-test/index.html | 2 +- .../org/owasp/dependencycheck/AppTest.html | 124 +- .../owasp/dependencycheck/package-frame.html | 2 +- .../dependencycheck/package-summary.html | 2 +- .../xref-test/overview-frame.html | 2 +- .../xref-test/overview-summary.html | 4 +- dependency-check-cli/xref/index.html | 2 +- .../xref/org/owasp/dependencycheck/App.html | 725 +- .../org/owasp/dependencycheck/CliParser.html | 2232 +-- .../InvalidScanPathException.html | 71 +- .../owasp/dependencycheck/package-frame.html | 2 +- .../dependencycheck/package-summary.html | 2 +- dependency-check-cli/xref/overview-frame.html | 2 +- .../xref/overview-summary.html | 4 +- .../apidocs/allclasses-frame.html | 13 +- .../apidocs/allclasses-noframe.html | 13 +- .../apidocs/constant-values.html | 27 +- .../apidocs/deprecated-list.html | 8 +- dependency-check-core/apidocs/help-doc.html | 8 +- dependency-check-core/apidocs/index-all.html | 174 +- dependency-check-core/apidocs/index.html | 4 +- .../org/owasp/dependencycheck/Engine.html | 8 +- .../agent/DependencyCheckScanAgent.html | 8 +- .../class-use/DependencyCheckScanAgent.html | 8 +- .../dependencycheck/agent/package-frame.html | 6 +- .../agent/package-summary.html | 8 +- .../dependencycheck/agent/package-tree.html | 8 +- .../dependencycheck/agent/package-use.html | 8 +- .../analyzer/AbstractAnalyzer.html | 8 +- .../analyzer/AbstractFileTypeAnalyzer.html | 10 +- .../analyzer/AbstractSuppressionAnalyzer.html | 8 +- .../analyzer/AnalysisPhase.html | 8 +- .../dependencycheck/analyzer/Analyzer.html | 10 +- .../analyzer/AnalyzerService.html | 8 +- .../analyzer/ArchiveAnalyzer.html | 8 +- .../analyzer/AssemblyAnalyzer.html | 8 +- .../analyzer/AutoconfAnalyzer.html | 8 +- .../analyzer/CMakeAnalyzer.html | 12 +- .../dependencycheck/analyzer/CPEAnalyzer.html | 12 +- .../analyzer/CentralAnalyzer.html | 8 +- .../analyzer/ComposerLockAnalyzer.html | 404 + .../analyzer/CpeSuppressionAnalyzer.html | 8 +- .../analyzer/DependencyBundlingAnalyzer.html | 8 +- .../analyzer/FalsePositiveAnalyzer.html | 8 +- .../analyzer/FileNameAnalyzer.html | 8 +- .../analyzer/FileTypeAnalyzer.html | 10 +- .../analyzer/HintAnalyzer.html | 8 +- .../JarAnalyzer.ClassNameInformation.html | 8 +- .../dependencycheck/analyzer/JarAnalyzer.html | 8 +- .../analyzer/NexusAnalyzer.html | 12 +- .../analyzer/NodePackageAnalyzer.html | 448 + .../analyzer/NuspecAnalyzer.html | 12 +- .../analyzer/NvdCveAnalyzer.html | 8 +- .../analyzer/OpenSSLAnalyzer.html | 8 +- .../analyzer/PythonDistributionAnalyzer.html | 8 +- .../analyzer/PythonPackageAnalyzer.html | 12 +- .../analyzer/RubyGemspecAnalyzer.html | 412 + .../VulnerabilitySuppressionAnalyzer.html | 12 +- .../analyzer/class-use/AbstractAnalyzer.html | 39 +- .../class-use/AbstractFileTypeAnalyzer.html | 31 +- .../AbstractSuppressionAnalyzer.html | 8 +- .../analyzer/class-use/AnalysisPhase.html | 48 +- .../analyzer/class-use/Analyzer.html | 41 +- .../analyzer/class-use/AnalyzerService.html | 8 +- .../analyzer/class-use/ArchiveAnalyzer.html | 8 +- .../analyzer/class-use/AssemblyAnalyzer.html | 8 +- .../analyzer/class-use/AutoconfAnalyzer.html | 8 +- .../analyzer/class-use/CMakeAnalyzer.html | 8 +- .../analyzer/class-use/CPEAnalyzer.html | 8 +- .../analyzer/class-use/CentralAnalyzer.html | 8 +- .../class-use/ComposerLockAnalyzer.html | 117 + .../class-use/CpeSuppressionAnalyzer.html | 8 +- .../class-use/DependencyBundlingAnalyzer.html | 8 +- .../class-use/FalsePositiveAnalyzer.html | 8 +- .../analyzer/class-use/FileNameAnalyzer.html | 8 +- .../analyzer/class-use/FileTypeAnalyzer.html | 31 +- .../analyzer/class-use/HintAnalyzer.html | 8 +- .../JarAnalyzer.ClassNameInformation.html | 8 +- .../analyzer/class-use/JarAnalyzer.html | 8 +- .../analyzer/class-use/NexusAnalyzer.html | 8 +- .../class-use/NodePackageAnalyzer.html | 117 + .../analyzer/class-use/NuspecAnalyzer.html | 8 +- .../analyzer/class-use/NvdCveAnalyzer.html | 8 +- .../analyzer/class-use/OpenSSLAnalyzer.html | 8 +- .../class-use/PythonDistributionAnalyzer.html | 8 +- .../class-use/PythonPackageAnalyzer.html | 8 +- .../class-use/RubyGemspecAnalyzer.html | 117 + .../VulnerabilitySuppressionAnalyzer.html | 8 +- .../analyzer/exception/AnalysisException.html | 8 +- .../exception/ArchiveExtractionException.html | 8 +- .../class-use/AnalysisException.html | 43 +- .../class-use/ArchiveExtractionException.html | 8 +- .../analyzer/exception/package-frame.html | 6 +- .../analyzer/exception/package-summary.html | 8 +- .../analyzer/exception/package-tree.html | 8 +- .../analyzer/exception/package-use.html | 8 +- .../analyzer/package-frame.html | 9 +- .../analyzer/package-summary.html | 43 +- .../analyzer/package-tree.html | 11 +- .../dependencycheck/analyzer/package-use.html | 8 +- .../dependencycheck/class-use/Engine.html | 43 +- .../data/central/CentralSearch.html | 8 +- .../data/central/class-use/CentralSearch.html | 8 +- .../data/central/package-frame.html | 6 +- .../data/central/package-summary.html | 12 +- .../data/central/package-tree.html | 12 +- .../data/central/package-use.html | 8 +- .../data/composer/ComposerDependency.html | 341 + .../data/composer/ComposerException.html | 297 + .../data/composer/ComposerLockParser.html | 285 + .../class-use/ComposerDependency.html | 161 + .../composer/class-use/ComposerException.html | 117 + .../class-use/ComposerLockParser.html | 117 + .../data/composer/package-frame.html | 25 + .../data/composer/package-summary.html | 169 + .../data/composer/package-tree.html | 144 + .../data/composer/package-use.html | 154 + .../data/cpe/CpeMemoryIndex.html | 8 +- .../dependencycheck/data/cpe/Fields.html | 8 +- .../dependencycheck/data/cpe/IndexEntry.html | 8 +- .../data/cpe/IndexException.html | 8 +- .../data/cpe/class-use/CpeMemoryIndex.html | 8 +- .../data/cpe/class-use/Fields.html | 8 +- .../data/cpe/class-use/IndexEntry.html | 8 +- .../data/cpe/class-use/IndexException.html | 8 +- .../data/cpe/package-frame.html | 6 +- .../data/cpe/package-summary.html | 12 +- .../data/cpe/package-tree.html | 12 +- .../dependencycheck/data/cpe/package-use.html | 8 +- .../owasp/dependencycheck/data/cwe/CweDB.html | 8 +- .../dependencycheck/data/cwe/CweHandler.html | 8 +- .../data/cwe/class-use/CweDB.html | 8 +- .../data/cwe/class-use/CweHandler.html | 8 +- .../data/cwe/package-frame.html | 6 +- .../data/cwe/package-summary.html | 8 +- .../data/cwe/package-tree.html | 8 +- .../dependencycheck/data/cwe/package-use.html | 8 +- .../data/lucene/AbstractTokenizingFilter.html | 8 +- .../data/lucene/AlphaNumericTokenizer.html | 8 +- .../data/lucene/DependencySimilarity.html | 8 +- .../data/lucene/FieldAnalyzer.html | 8 +- .../data/lucene/LuceneUtils.html | 8 +- .../data/lucene/SearchFieldAnalyzer.html | 8 +- .../lucene/TokenPairConcatenatingFilter.html | 69 +- .../data/lucene/UrlTokenizingFilter.html | 8 +- .../class-use/AbstractTokenizingFilter.html | 8 +- .../class-use/AlphaNumericTokenizer.html | 8 +- .../class-use/DependencySimilarity.html | 8 +- .../data/lucene/class-use/FieldAnalyzer.html | 8 +- .../data/lucene/class-use/LuceneUtils.html | 8 +- .../lucene/class-use/SearchFieldAnalyzer.html | 8 +- .../TokenPairConcatenatingFilter.html | 8 +- .../lucene/class-use/UrlTokenizingFilter.html | 8 +- .../data/lucene/package-frame.html | 6 +- .../data/lucene/package-summary.html | 8 +- .../data/lucene/package-tree.html | 8 +- .../data/lucene/package-use.html | 8 +- .../data/nexus/MavenArtifact.html | 8 +- .../data/nexus/NexusSearch.html | 8 +- .../data/nexus/class-use/MavenArtifact.html | 8 +- .../data/nexus/class-use/NexusSearch.html | 8 +- .../data/nexus/package-frame.html | 6 +- .../data/nexus/package-summary.html | 8 +- .../data/nexus/package-tree.html | 8 +- .../data/nexus/package-use.html | 8 +- .../data/nuget/NugetPackage.html | 8 +- .../data/nuget/NuspecParseException.html | 8 +- .../data/nuget/NuspecParser.html | 8 +- .../data/nuget/XPathNuspecParser.html | 8 +- .../data/nuget/class-use/NugetPackage.html | 8 +- .../nuget/class-use/NuspecParseException.html | 8 +- .../data/nuget/class-use/NuspecParser.html | 8 +- .../nuget/class-use/XPathNuspecParser.html | 8 +- .../data/nuget/package-frame.html | 6 +- .../data/nuget/package-summary.html | 8 +- .../data/nuget/package-tree.html | 8 +- .../data/nuget/package-use.html | 8 +- .../data/nvdcve/ConnectionFactory.html | 8 +- .../dependencycheck/data/nvdcve/CveDB.html | 20 +- .../data/nvdcve/DatabaseException.html | 8 +- .../data/nvdcve/DatabaseProperties.html | 8 +- .../data/nvdcve/DriverLoadException.html | 8 +- .../data/nvdcve/DriverLoader.html | 8 +- .../nvdcve/class-use/ConnectionFactory.html | 8 +- .../data/nvdcve/class-use/CveDB.html | 8 +- .../nvdcve/class-use/DatabaseException.html | 8 +- .../nvdcve/class-use/DatabaseProperties.html | 8 +- .../nvdcve/class-use/DriverLoadException.html | 8 +- .../data/nvdcve/class-use/DriverLoader.html | 8 +- .../data/nvdcve/package-frame.html | 6 +- .../data/nvdcve/package-summary.html | 8 +- .../data/nvdcve/package-tree.html | 8 +- .../data/nvdcve/package-use.html | 8 +- .../data/update/BaseUpdater.html | 8 +- .../data/update/CachedWebDataSource.html | 8 +- .../data/update/CpeUpdater.html | 12 +- .../data/update/EngineVersionCheck.html | 8 +- .../data/update/NvdCveUpdater.html | 8 +- .../data/update/UpdateService.html | 8 +- .../data/update/class-use/BaseUpdater.html | 10 +- .../update/class-use/CachedWebDataSource.html | 10 +- .../data/update/class-use/CpeUpdater.html | 8 +- .../update/class-use/EngineVersionCheck.html | 8 +- .../data/update/class-use/NvdCveUpdater.html | 8 +- .../data/update/class-use/UpdateService.html | 8 +- .../data/update/cpe/CPEHandler.Element.html | 10 +- .../data/update/cpe/CPEHandler.html | 10 +- .../dependencycheck/data/update/cpe/Cpe.html | 8 +- .../cpe/class-use/CPEHandler.Element.html | 8 +- .../data/update/cpe/class-use/CPEHandler.html | 8 +- .../data/update/cpe/class-use/Cpe.html | 8 +- .../data/update/cpe/package-frame.html | 7 +- .../data/update/cpe/package-summary.html | 14 +- .../data/update/cpe/package-tree.html | 8 +- .../data/update/cpe/package-use.html | 8 +- .../exception/InvalidDataException.html | 8 +- .../update/exception/UpdateException.html | 8 +- .../class-use/InvalidDataException.html | 8 +- .../exception/class-use/UpdateException.html | 8 +- .../data/update/exception/package-frame.html | 6 +- .../update/exception/package-summary.html | 8 +- .../data/update/exception/package-tree.html | 8 +- .../data/update/exception/package-use.html | 8 +- .../data/update/nvd/DownloadTask.html | 8 +- .../update/nvd/NvdCve12Handler.Element.html | 8 +- .../data/update/nvd/NvdCve12Handler.html | 8 +- .../update/nvd/NvdCve20Handler.Element.html | 8 +- .../data/update/nvd/NvdCve20Handler.html | 8 +- .../data/update/nvd/NvdCveInfo.html | 8 +- .../data/update/nvd/ProcessTask.html | 8 +- .../data/update/nvd/UpdateableNvdCve.html | 8 +- .../update/nvd/class-use/DownloadTask.html | 8 +- .../class-use/NvdCve12Handler.Element.html | 8 +- .../update/nvd/class-use/NvdCve12Handler.html | 8 +- .../class-use/NvdCve20Handler.Element.html | 8 +- .../update/nvd/class-use/NvdCve20Handler.html | 8 +- .../data/update/nvd/class-use/NvdCveInfo.html | 8 +- .../update/nvd/class-use/ProcessTask.html | 8 +- .../nvd/class-use/UpdateableNvdCve.html | 8 +- .../data/update/nvd/package-frame.html | 6 +- .../data/update/nvd/package-summary.html | 8 +- .../data/update/nvd/package-tree.html | 8 +- .../data/update/nvd/package-use.html | 8 +- .../data/update/package-frame.html | 6 +- .../data/update/package-summary.html | 10 +- .../data/update/package-tree.html | 8 +- .../data/update/package-use.html | 8 +- .../dependency/Confidence.html | 8 +- .../dependency/Dependency.html | 8 +- .../dependencycheck/dependency/Evidence.html | 8 +- .../dependency/EvidenceCollection.html | 8 +- .../dependency/Identifier.html | 8 +- .../dependencycheck/dependency/Reference.html | 8 +- .../dependency/Vulnerability.html | 8 +- .../dependency/VulnerabilityComparator.html | 8 +- .../dependency/VulnerableSoftware.html | 8 +- .../dependency/class-use/Confidence.html | 8 +- .../dependency/class-use/Dependency.html | 55 +- .../dependency/class-use/Evidence.html | 8 +- .../class-use/EvidenceCollection.html | 8 +- .../dependency/class-use/Identifier.html | 8 +- .../dependency/class-use/Reference.html | 8 +- .../dependency/class-use/Vulnerability.html | 8 +- .../class-use/VulnerabilityComparator.html | 8 +- .../class-use/VulnerableSoftware.html | 8 +- .../dependency/package-frame.html | 6 +- .../dependency/package-summary.html | 8 +- .../dependency/package-tree.html | 8 +- .../dependency/package-use.html | 8 +- .../exception/NoDataException.html | 8 +- .../exception/ScanAgentException.html | 8 +- .../exception/class-use/NoDataException.html | 8 +- .../class-use/ScanAgentException.html | 8 +- .../exception/package-frame.html | 6 +- .../exception/package-summary.html | 8 +- .../exception/package-tree.html | 8 +- .../exception/package-use.html | 8 +- .../owasp/dependencycheck/package-frame.html | 6 +- .../dependencycheck/package-summary.html | 8 +- .../owasp/dependencycheck/package-tree.html | 8 +- .../owasp/dependencycheck/package-use.html | 8 +- .../dependencycheck/reporting/EscapeTool.html | 12 +- .../reporting/ReportGenerator.Format.html | 8 +- .../reporting/ReportGenerator.html | 8 +- .../reporting/VelocityLoggerRedirect.html | 8 +- .../reporting/class-use/EscapeTool.html | 8 +- .../class-use/ReportGenerator.Format.html | 8 +- .../reporting/class-use/ReportGenerator.html | 8 +- .../class-use/VelocityLoggerRedirect.html | 8 +- .../reporting/package-frame.html | 6 +- .../reporting/package-summary.html | 8 +- .../reporting/package-tree.html | 8 +- .../reporting/package-use.html | 8 +- .../suppression/PropertyType.html | 8 +- .../suppression/SuppressionErrorHandler.html | 8 +- .../suppression/SuppressionHandler.html | 8 +- .../SuppressionParseException.html | 8 +- .../suppression/SuppressionParser.html | 8 +- .../suppression/SuppressionRule.html | 8 +- .../suppression/class-use/PropertyType.html | 8 +- .../class-use/SuppressionErrorHandler.html | 8 +- .../class-use/SuppressionHandler.html | 8 +- .../class-use/SuppressionParseException.html | 8 +- .../class-use/SuppressionParser.html | 8 +- .../class-use/SuppressionRule.html | 8 +- .../suppression/package-frame.html | 6 +- .../suppression/package-summary.html | 8 +- .../suppression/package-tree.html | 8 +- .../suppression/package-use.html | 8 +- .../owasp/dependencycheck/utils/DBUtils.html | 8 +- .../owasp/dependencycheck/utils/DateUtil.html | 8 +- .../utils/DependencyVersion.html | 18 +- .../utils/DependencyVersionUtil.html | 8 +- .../dependencycheck/utils/ExtractionUtil.html | 8 +- .../utils/FileFilterBuilder.html | 8 +- .../owasp/dependencycheck/utils/Filter.html | 8 +- .../utils/NonClosingStream.html | 8 +- .../org/owasp/dependencycheck/utils/Pair.html | 8 +- .../dependencycheck/utils/UrlStringUtils.html | 8 +- .../utils/class-use/DBUtils.html | 8 +- .../utils/class-use/DateUtil.html | 8 +- .../utils/class-use/DependencyVersion.html | 8 +- .../class-use/DependencyVersionUtil.html | 8 +- .../utils/class-use/ExtractionUtil.html | 8 +- .../utils/class-use/FileFilterBuilder.html | 8 +- .../utils/class-use/Filter.html | 8 +- .../utils/class-use/NonClosingStream.html | 8 +- .../dependencycheck/utils/class-use/Pair.html | 8 +- .../utils/class-use/UrlStringUtils.html | 8 +- .../dependencycheck/utils/package-frame.html | 6 +- .../utils/package-summary.html | 8 +- .../dependencycheck/utils/package-tree.html | 8 +- .../dependencycheck/utils/package-use.html | 8 +- .../dependencycheck/xml/pom/License.html | 8 +- .../owasp/dependencycheck/xml/pom/Model.html | 8 +- .../dependencycheck/xml/pom/PomHandler.html | 8 +- .../xml/pom/PomParseException.html | 8 +- .../dependencycheck/xml/pom/PomParser.html | 8 +- .../dependencycheck/xml/pom/PomUtils.html | 8 +- .../xml/pom/class-use/License.html | 8 +- .../xml/pom/class-use/Model.html | 8 +- .../xml/pom/class-use/PomHandler.html | 8 +- .../xml/pom/class-use/PomParseException.html | 8 +- .../xml/pom/class-use/PomParser.html | 8 +- .../xml/pom/class-use/PomUtils.html | 8 +- .../xml/pom/package-frame.html | 6 +- .../xml/pom/package-summary.html | 8 +- .../dependencycheck/xml/pom/package-tree.html | 8 +- .../dependencycheck/xml/pom/package-use.html | 8 +- .../apidocs/overview-frame.html | 7 +- .../apidocs/overview-summary.html | 46 +- .../apidocs/overview-tree.html | 19 +- dependency-check-core/apidocs/package-list | 1 + .../apidocs/serialized-form.html | 42 +- dependency-check-core/checkstyle.html | 336 +- dependency-check-core/checkstyle.rss | 2396 +-- .../cobertura/frame-packages.html | 3 + ...es-org.owasp.dependencycheck.analyzer.html | 19 +- ...g.owasp.dependencycheck.data.composer.html | 29 + ...org.owasp.dependencycheck.data.lucene.html | 2 +- ...org.owasp.dependencycheck.data.update.html | 2 +- ...owasp.dependencycheck.data.update.nvd.html | 2 +- ...-org.owasp.dependencycheck.dependency.html | 4 +- ...files-org.owasp.dependencycheck.utils.html | 2 +- .../cobertura/frame-sourcefiles.html | 40 +- ...mmary-org.owasp.dependencycheck.agent.html | 2 +- ...sp.dependencycheck.analyzer.exception.html | 2 +- ...ry-org.owasp.dependencycheck.analyzer.html | 26 +- ...rg.owasp.dependencycheck.data.central.html | 2 +- ...g.owasp.dependencycheck.data.composer.html | 46 + ...ry-org.owasp.dependencycheck.data.cpe.html | 2 +- ...ry-org.owasp.dependencycheck.data.cwe.html | 2 +- ...org.owasp.dependencycheck.data.lucene.html | 8 +- ...-org.owasp.dependencycheck.data.nexus.html | 2 +- ...-org.owasp.dependencycheck.data.nuget.html | 2 +- ...org.owasp.dependencycheck.data.nvdcve.html | 2 +- ...owasp.dependencycheck.data.update.cpe.html | 2 +- ...dependencycheck.data.update.exception.html | 2 +- ...org.owasp.dependencycheck.data.update.html | 8 +- ...owasp.dependencycheck.data.update.nvd.html | 8 +- ...-org.owasp.dependencycheck.dependency.html | 8 +- ...y-org.owasp.dependencycheck.exception.html | 2 +- ...ame-summary-org.owasp.dependencycheck.html | 21 +- ...y-org.owasp.dependencycheck.reporting.html | 6 +- ...org.owasp.dependencycheck.suppression.html | 2 +- ...mmary-org.owasp.dependencycheck.utils.html | 8 +- ...ary-org.owasp.dependencycheck.xml.pom.html | 2 +- .../cobertura/frame-summary.html | 21 +- .../org.owasp.dependencycheck.Engine.html | 1295 +- ...ycheck.agent.DependencyCheckScanAgent.html | 2 +- ...ndencycheck.analyzer.AbstractAnalyzer.html | 8 +- ...eck.analyzer.AbstractFileTypeAnalyzer.html | 66 +- ....analyzer.AbstractSuppressionAnalyzer.html | 98 +- ...ependencycheck.analyzer.AnalysisPhase.html | 22 +- ...asp.dependencycheck.analyzer.Analyzer.html | 2 +- ...endencycheck.analyzer.AnalyzerService.html | 10 +- ...endencycheck.analyzer.ArchiveAnalyzer.html | 1128 +- ...ndencycheck.analyzer.AssemblyAnalyzer.html | 665 +- ...ndencycheck.analyzer.AutoconfAnalyzer.html | 134 +- ...ependencycheck.analyzer.CMakeAnalyzer.html | 150 +- ....dependencycheck.analyzer.CPEAnalyzer.html | 1929 +- ...endencycheck.analyzer.CentralAnalyzer.html | 38 +- ...cycheck.analyzer.ComposerLockAnalyzer.html | 311 + ...check.analyzer.CpeSuppressionAnalyzer.html | 20 +- ...k.analyzer.DependencyBundlingAnalyzer.html | 1006 +- ...ycheck.analyzer.FalsePositiveAnalyzer.html | 1213 +- ...ndencycheck.analyzer.FileNameAnalyzer.html | 192 +- ...ndencycheck.analyzer.FileTypeAnalyzer.html | 2 +- ...dependencycheck.analyzer.HintAnalyzer.html | 159 +- ....dependencycheck.analyzer.JarAnalyzer.html | 2340 ++- ...ependencycheck.analyzer.NexusAnalyzer.html | 32 +- ...ncycheck.analyzer.NodePackageAnalyzer.html | 348 + ...pendencycheck.analyzer.NuspecAnalyzer.html | 18 +- ...pendencycheck.analyzer.NvdCveAnalyzer.html | 50 +- ...endencycheck.analyzer.OpenSSLAnalyzer.html | 68 +- ...k.analyzer.PythonDistributionAnalyzer.html | 318 +- ...ycheck.analyzer.PythonPackageAnalyzer.html | 646 +- ...ncycheck.analyzer.RubyGemspecAnalyzer.html | 302 + ...yzer.VulnerabilitySuppressionAnalyzer.html | 20 +- ....analyzer.exception.AnalysisException.html | 6 +- ....exception.ArchiveExtractionException.html | 2 +- ...dencycheck.data.central.CentralSearch.html | 104 +- ...heck.data.composer.ComposerDependency.html | 222 + ...check.data.composer.ComposerException.html | 122 + ...heck.data.composer.ComposerLockParser.html | 233 + ...pendencycheck.data.cpe.CpeMemoryIndex.html | 144 +- ...owasp.dependencycheck.data.cpe.Fields.html | 2 +- ...p.dependencycheck.data.cpe.IndexEntry.html | 48 +- ...pendencycheck.data.cpe.IndexException.html | 2 +- ....owasp.dependencycheck.data.cwe.CweDB.html | 174 +- ...p.dependencycheck.data.cwe.CweHandler.html | 2 +- ....data.lucene.AbstractTokenizingFilter.html | 26 +- ...eck.data.lucene.AlphaNumericTokenizer.html | 8 +- ...heck.data.lucene.DependencySimilarity.html | 2 +- ...ndencycheck.data.lucene.FieldAnalyzer.html | 20 +- ...pendencycheck.data.lucene.LuceneUtils.html | 49 +- ...check.data.lucene.SearchFieldAnalyzer.html | 32 +- ...a.lucene.TokenPairConcatenatingFilter.html | 137 +- ...check.data.lucene.UrlTokenizingFilter.html | 36 +- ...endencycheck.data.nexus.MavenArtifact.html | 46 +- ...ependencycheck.data.nexus.NexusSearch.html | 6 +- ...pendencycheck.data.nuget.NugetPackage.html | 42 +- ...check.data.nuget.NuspecParseException.html | 10 +- ...pendencycheck.data.nuget.NuspecParser.html | 2 +- ...ncycheck.data.nuget.XPathNuspecParser.html | 36 +- ...cycheck.data.nvdcve.ConnectionFactory.html | 114 +- ....data.nvdcve.CorruptDatabaseException.html | 2 +- ...asp.dependencycheck.data.nvdcve.CveDB.html | 1102 +- ...cycheck.data.nvdcve.DatabaseException.html | 2 +- ...ycheck.data.nvdcve.DatabaseProperties.html | 18 +- ...check.data.nvdcve.DriverLoadException.html | 6 +- ...endencycheck.data.nvdcve.DriverLoader.html | 58 +- ...ependencycheck.data.nvdcve.DriverShim.html | 16 +- ...pendencycheck.data.update.BaseUpdater.html | 36 +- ...check.data.update.CachedWebDataSource.html | 2 +- ...ependencycheck.data.update.CpeUpdater.html | 392 +- ...ycheck.data.update.EngineVersionCheck.html | 384 +- ...ndencycheck.data.update.NvdCveUpdater.html | 528 +- ...ndencycheck.data.update.UpdateService.html | 2 +- ...dencycheck.data.update.cpe.CPEHandler.html | 4 +- ...p.dependencycheck.data.update.cpe.Cpe.html | 2 +- ...update.exception.InvalidDataException.html | 2 +- ...data.update.exception.UpdateException.html | 2 +- ...ncycheck.data.update.nvd.DownloadTask.html | 307 +- ...check.data.update.nvd.NvdCve12Handler.html | 108 +- ...check.data.update.nvd.NvdCve20Handler.html | 236 +- ...dencycheck.data.update.nvd.NvdCveInfo.html | 36 +- ...encycheck.data.update.nvd.ProcessTask.html | 53 +- ...heck.data.update.nvd.UpdateableNvdCve.html | 58 +- ...dependencycheck.dependency.Confidence.html | 12 +- ...dependencycheck.dependency.Dependency.html | 1877 +- ...p.dependencycheck.dependency.Evidence.html | 683 +- ...cycheck.dependency.EvidenceCollection.html | 860 +- ...dependencycheck.dependency.Identifier.html | 522 +- ....dependencycheck.dependency.Reference.html | 48 +- ...endencycheck.dependency.Vulnerability.html | 214 +- ...ck.dependency.VulnerabilityComparator.html | 12 +- ...cycheck.dependency.VulnerableSoftware.html | 138 +- ...ndencycheck.exception.NoDataException.html | 2 +- ...ncycheck.exception.ScanAgentException.html | 2 +- ....dependencycheck.reporting.EscapeTool.html | 100 +- ...ndencycheck.reporting.ReportGenerator.html | 2 +- ...heck.reporting.VelocityLoggerRedirect.html | 186 +- ...endencycheck.suppression.PropertyType.html | 58 +- ...k.suppression.SuppressionErrorHandler.html | 6 +- ...ycheck.suppression.SuppressionHandler.html | 92 +- ...suppression.SuppressionParseException.html | 102 +- ...cycheck.suppression.SuppressionParser.html | 54 +- ...encycheck.suppression.SuppressionRule.html | 238 +- ...g.owasp.dependencycheck.utils.DBUtils.html | 20 +- ....owasp.dependencycheck.utils.DateUtil.html | 6 +- ...pendencycheck.utils.DependencyVersion.html | 414 +- ...encycheck.utils.DependencyVersionUtil.html | 52 +- ....dependencycheck.utils.ExtractionUtil.html | 567 +- ...pendencycheck.utils.FileFilterBuilder.html | 50 +- ...rg.owasp.dependencycheck.utils.Filter.html | 140 +- ...ependencycheck.utils.NonClosingStream.html | 2 +- .../org.owasp.dependencycheck.utils.Pair.html | 26 +- ....dependencycheck.utils.UrlStringUtils.html | 42 +- ...owasp.dependencycheck.xml.pom.License.html | 22 +- ...g.owasp.dependencycheck.xml.pom.Model.html | 124 +- ...sp.dependencycheck.xml.pom.PomHandler.html | 74 +- ...ndencycheck.xml.pom.PomParseException.html | 102 +- ...asp.dependencycheck.xml.pom.PomParser.html | 36 +- ...wasp.dependencycheck.xml.pom.PomUtils.html | 30 +- dependency-check-core/cpd.html | 150 +- .../css/apache-maven-fluido-1.4.min.css | 9 + .../dependency-analysis.html | 598 + .../dependency-updates-report.html | 596 +- dependency-check-core/failsafe-report.html | 314 +- dependency-check-core/findbugs.html | 216 +- .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 35283 bytes .../fonts/glyphicons-halflings-regular.svg | 229 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 55016 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 41793 bytes .../images/apache-maven-project-2.png | Bin 33442 -> 43073 bytes dependency-check-core/index.html | 39 +- dependency-check-core/integration.html | 228 + dependency-check-core/issue-tracking.html | 77 +- .../js/apache-maven-fluido-1.4.min.js | 25 + dependency-check-core/license.html | 72 +- dependency-check-core/mail-lists.html | 68 +- .../plugin-updates-report.html | 252 +- dependency-check-core/pmd.html | 597 +- dependency-check-core/project-info.html | 87 +- dependency-check-core/project-reports.html | 173 +- dependency-check-core/project-summary.html | 82 +- dependency-check-core/source-repository.html | 97 +- dependency-check-core/surefire-report.html | 674 +- dependency-check-core/taglist.html | 176 +- dependency-check-core/team-list.html | 95 +- .../xref-test/allclasses-frame.html | 12 + dependency-check-core/xref-test/index.html | 2 +- .../ArchiveAnalyzerIntegrationTest.html | 478 +- .../analyzer/CMakeAnalyzerTest.html | 197 +- .../analyzer/ComposerLockAnalyzerTest.html | 114 + ...ndencyBundlingAnalyzerIntegrationTest.html | 156 +- .../analyzer/JarAnalyzerTest.html | 184 +- .../analyzer/NodePackageAnalyzerTest.html | 113 + .../analyzer/OpenSSLAnalyzerTest.html | 4 +- .../PythonDistributionAnalyzerTest.html | 2 +- .../analyzer/PythonPackageAnalyzerTest.html | 40 +- .../analyzer/RubyGemspecAnalyzerTest.html | 116 + .../analyzer/package-frame.html | 11 +- .../analyzer/package-summary.html | 17 +- .../data/central/package-frame.html | 2 +- .../data/central/package-summary.html | 2 +- .../data/composer/ComposerLockParserTest.html | 82 + .../data/composer/package-frame.html | 24 + .../data/composer/package-summary.html | 69 + .../data/cpe/IndexEntryTest.html | 73 +- .../data/cpe/package-frame.html | 2 +- .../data/cpe/package-summary.html | 2 +- .../data/cwe/package-frame.html | 2 +- .../data/cwe/package-summary.html | 2 +- .../TokenPairConcatenatingFilterTest.html | 78 +- .../data/lucene/package-frame.html | 2 +- .../data/lucene/package-summary.html | 2 +- .../data/nexus/package-frame.html | 2 +- .../data/nexus/package-summary.html | 2 +- .../data/nuget/XPathNuspecParserTest.html | 127 +- .../data/nuget/package-frame.html | 2 +- .../data/nuget/package-summary.html | 2 +- .../data/nvdcve/CveDBIntegrationTest.html | 319 +- .../data/nvdcve/package-frame.html | 2 +- .../data/nvdcve/package-summary.html | 2 +- .../update/CpeUpdaterIntegrationTest.html | 59 +- .../data/update/nvd/package-frame.html | 2 +- .../data/update/nvd/package-summary.html | 2 +- .../data/update/package-frame.html | 2 +- .../data/update/package-summary.html | 2 +- .../dependency/package-frame.html | 2 +- .../dependency/package-summary.html | 2 +- .../owasp/dependencycheck/package-frame.html | 2 +- .../dependencycheck/package-summary.html | 2 +- .../reporting/package-frame.html | 2 +- .../reporting/package-summary.html | 2 +- .../suppression/SuppressionRuleTest.html | 1013 +- .../suppression/package-frame.html | 2 +- .../suppression/package-summary.html | 2 +- .../utils/DependencyVersionTest.html | 374 +- .../dependencycheck/utils/FilterTest.html | 11 +- .../dependencycheck/utils/package-frame.html | 2 +- .../utils/package-summary.html | 2 +- .../dependencycheck/xml/pom/ModelTest.html | 547 +- .../dependencycheck/xml/pom/PomUtilsTest.html | 86 +- .../xml/pom/package-frame.html | 2 +- .../xml/pom/package-summary.html | 2 +- .../xref-test/overview-frame.html | 5 +- .../xref-test/overview-summary.html | 9 +- .../xref/allclasses-frame.html | 18 + dependency-check-core/xref/index.html | 2 +- .../org/owasp/dependencycheck/Engine.html | 957 +- .../dependencycheck/agent/package-frame.html | 2 +- .../agent/package-summary.html | 2 +- .../analyzer/ArchiveAnalyzer.html | 865 +- .../analyzer/AssemblyAnalyzer.html | 627 +- .../analyzer/AutoconfAnalyzer.html | 8 +- .../analyzer/CMakeAnalyzer.html | 75 +- .../dependencycheck/analyzer/CPEAnalyzer.html | 1253 +- .../analyzer/ComposerLockAnalyzer.html | 175 + .../analyzer/DependencyBundlingAnalyzer.html | 704 +- .../analyzer/FalsePositiveAnalyzer.html | 823 +- .../analyzer/FileNameAnalyzer.html | 128 +- .../analyzer/HintAnalyzer.html | 113 +- .../dependencycheck/analyzer/JarAnalyzer.html | 2231 ++- .../analyzer/NexusAnalyzer.html | 2 +- .../analyzer/NodePackageAnalyzer.html | 200 + .../analyzer/PythonDistributionAnalyzer.html | 210 +- .../analyzer/PythonPackageAnalyzer.html | 580 +- .../analyzer/RubyGemspecAnalyzer.html | 173 + .../analyzer/exception/package-frame.html | 2 +- .../analyzer/exception/package-summary.html | 2 +- .../analyzer/package-frame.html | 11 +- .../analyzer/package-summary.html | 17 +- .../data/central/CentralSearch.html | 2 +- .../data/central/package-frame.html | 2 +- .../data/central/package-summary.html | 2 +- .../data/composer/ComposerDependency.html | 123 + .../data/composer/ComposerException.html | 65 + .../data/composer/ComposerLockParser.html | 137 + .../data/composer/package-frame.html | 30 + .../data/composer/package-summary.html | 79 + .../data/cpe/CpeMemoryIndex.html | 2 +- .../data/cpe/package-frame.html | 2 +- .../data/cpe/package-summary.html | 2 +- .../owasp/dependencycheck/data/cwe/CweDB.html | 139 +- .../data/cwe/package-frame.html | 2 +- .../data/cwe/package-summary.html | 2 +- .../data/lucene/LuceneUtils.html | 23 +- .../lucene/TokenPairConcatenatingFilter.html | 65 +- .../data/lucene/package-frame.html | 2 +- .../data/lucene/package-summary.html | 2 +- .../data/nexus/NexusSearch.html | 4 +- .../data/nexus/package-frame.html | 2 +- .../data/nexus/package-summary.html | 2 +- .../data/nuget/package-frame.html | 2 +- .../data/nuget/package-summary.html | 2 +- .../dependencycheck/data/nvdcve/CveDB.html | 895 +- .../data/nvdcve/DriverShim.html | 2 +- .../data/nvdcve/package-frame.html | 2 +- .../data/nvdcve/package-summary.html | 2 +- .../data/update/CpeUpdater.html | 344 +- .../data/update/EngineVersionCheck.html | 381 +- .../data/update/NvdCveUpdater.html | 527 +- .../data/update/cpe/CPEHandler.html | 2 +- .../data/update/cpe/package-frame.html | 2 +- .../data/update/cpe/package-summary.html | 2 +- .../data/update/exception/package-frame.html | 2 +- .../update/exception/package-summary.html | 2 +- .../data/update/nvd/DownloadTask.html | 224 +- .../data/update/nvd/ProcessTask.html | 50 +- .../data/update/nvd/package-frame.html | 2 +- .../data/update/nvd/package-summary.html | 2 +- .../data/update/package-frame.html | 2 +- .../data/update/package-summary.html | 2 +- .../dependency/Dependency.html | 1426 +- .../dependencycheck/dependency/Evidence.html | 506 +- .../dependency/EvidenceCollection.html | 674 +- .../dependency/Identifier.html | 386 +- .../dependencycheck/dependency/Reference.html | 33 +- .../dependency/Vulnerability.html | 105 +- .../dependency/VulnerabilityComparator.html | 9 +- .../dependency/package-frame.html | 2 +- .../dependency/package-summary.html | 2 +- .../exception/package-frame.html | 2 +- .../exception/package-summary.html | 2 +- .../owasp/dependencycheck/package-frame.html | 2 +- .../dependencycheck/package-summary.html | 2 +- .../dependencycheck/reporting/EscapeTool.html | 73 +- .../reporting/VelocityLoggerRedirect.html | 142 +- .../reporting/package-frame.html | 2 +- .../reporting/package-summary.html | 2 +- .../suppression/SuppressionHandler.html | 4 +- .../SuppressionParseException.html | 71 +- .../suppression/package-frame.html | 2 +- .../suppression/package-summary.html | 2 +- .../utils/DependencyVersion.html | 309 +- .../dependencycheck/utils/ExtractionUtil.html | 535 +- .../owasp/dependencycheck/utils/Filter.html | 94 +- .../dependencycheck/utils/package-frame.html | 2 +- .../utils/package-summary.html | 2 +- .../dependencycheck/xml/pom/PomHandler.html | 4 +- .../xml/pom/PomParseException.html | 71 +- .../xml/pom/package-frame.html | 2 +- .../xml/pom/package-summary.html | 2 +- .../xref/overview-frame.html | 5 +- .../xref/overview-summary.html | 9 +- .../css/apache-maven-fluido-1.4.min.css | 9 + .../dependency-analysis.html | 184 + .../dependency-updates-report.html | 184 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 35283 bytes .../fonts/glyphicons-halflings-regular.svg | 229 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 55016 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 41793 bytes .../images/apache-maven-project-2.png | Bin 33442 -> 43073 bytes dependency-check-gradle/index.html | 44 +- dependency-check-gradle/integration.html | 221 + dependency-check-gradle/issue-tracking.html | 78 +- .../js/apache-maven-fluido-1.4.min.js | 25 + dependency-check-gradle/license.html | 73 +- dependency-check-gradle/mail-lists.html | 69 +- .../plugin-updates-report.html | 184 + dependency-check-gradle/project-info.html | 88 +- dependency-check-gradle/project-reports.html | 201 + dependency-check-gradle/project-summary.html | 81 +- .../source-repository.html | 98 +- dependency-check-gradle/team-list.html | 96 +- .../css/apache-maven-fluido-1.4.min.css | 9 + .../dependency-analysis.html | 184 + .../dependency-updates-report.html | 184 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 35283 bytes .../fonts/glyphicons-halflings-regular.svg | 229 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 55016 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 41793 bytes .../images/apache-maven-project-2.png | Bin 33442 -> 43073 bytes dependency-check-jenkins/index.html | 46 +- dependency-check-jenkins/integration.html | 221 + dependency-check-jenkins/issue-tracking.html | 78 +- .../js/apache-maven-fluido-1.4.min.js | 25 + dependency-check-jenkins/license.html | 73 +- dependency-check-jenkins/mail-lists.html | 69 +- .../plugin-updates-report.html | 184 + dependency-check-jenkins/project-info.html | 88 +- dependency-check-jenkins/project-reports.html | 201 + dependency-check-jenkins/project-summary.html | 81 +- .../source-repository.html | 98 +- dependency-check-jenkins/team-list.html | 96 +- dependency-check-maven/aggregate-mojo.html | 55 +- .../apidocs/allclasses-frame.html | 7 +- .../apidocs/allclasses-noframe.html | 7 +- .../apidocs/constant-values.html | 8 +- .../apidocs/deprecated-list.html | 8 +- dependency-check-maven/apidocs/help-doc.html | 8 +- dependency-check-maven/apidocs/index-all.html | 50 +- dependency-check-maven/apidocs/index.html | 4 +- .../dependencycheck/maven/AggregateMojo.html | 11 +- .../maven/BaseDependencyCheckMojo.html | 68 +- .../dependencycheck/maven/CheckMojo.html | 10 +- .../owasp/dependencycheck/maven/Engine.html | 8 +- .../owasp/dependencycheck/maven/HelpMojo.html | 20 +- .../dependencycheck/maven/PurgeMojo.html | 380 + .../dependencycheck/maven/UpdateMojo.html | 14 +- .../maven/class-use/AggregateMojo.html | 8 +- .../class-use/BaseDependencyCheckMojo.html | 14 +- .../maven/class-use/CheckMojo.html | 8 +- .../maven/class-use/Engine.html | 8 +- .../maven/class-use/HelpMojo.html | 8 +- .../maven/class-use/PurgeMojo.html | 117 + .../maven/class-use/UpdateMojo.html | 8 +- .../dependencycheck/maven/package-frame.html | 7 +- .../maven/package-summary.html | 16 +- .../dependencycheck/maven/package-tree.html | 9 +- .../dependencycheck/maven/package-use.html | 8 +- .../maven/slf4j/MavenLoggerAdapter.html | 8 +- .../maven/slf4j/MavenLoggerFactory.html | 8 +- .../slf4j/class-use/MavenLoggerAdapter.html | 8 +- .../slf4j/class-use/MavenLoggerFactory.html | 8 +- .../maven/slf4j/package-frame.html | 6 +- .../maven/slf4j/package-summary.html | 8 +- .../maven/slf4j/package-tree.html | 8 +- .../maven/slf4j/package-use.html | 8 +- .../org/slf4j/impl/StaticLoggerBinder.html | 8 +- .../impl/class-use/StaticLoggerBinder.html | 8 +- .../apidocs/org/slf4j/impl/package-frame.html | 6 +- .../org/slf4j/impl/package-summary.html | 8 +- .../apidocs/org/slf4j/impl/package-tree.html | 8 +- .../apidocs/org/slf4j/impl/package-use.html | 8 +- .../apidocs/overview-frame.html | 6 +- .../apidocs/overview-summary.html | 10 +- .../apidocs/overview-tree.html | 9 +- .../apidocs/serialized-form.html | 8 +- dependency-check-maven/check-mojo.html | 53 +- dependency-check-maven/checkstyle.html | 186 +- dependency-check-maven/checkstyle.rss | 718 +- ...files-org.owasp.dependencycheck.maven.html | 3 + ...org.owasp.dependencycheck.maven.slf4j.html | 2 +- .../frame-sourcefiles-org.slf4j.impl.html | 2 +- .../cobertura/frame-sourcefiles.html | 7 +- ...mmary-org.owasp.dependencycheck.maven.html | 14 +- ...org.owasp.dependencycheck.maven.slf4j.html | 6 +- .../frame-summary-org.slf4j.impl.html | 6 +- .../cobertura/frame-summary.html | 10 +- ...p.dependencycheck.maven.AggregateMojo.html | 456 +- ...cycheck.maven.BaseDependencyCheckMojo.html | 2282 ++- ...owasp.dependencycheck.maven.CheckMojo.html | 52 +- ...rg.owasp.dependencycheck.maven.Engine.html | 24 +- ....owasp.dependencycheck.maven.HelpMojo.html | 1091 +- ...owasp.dependencycheck.maven.PurgeMojo.html | 222 + ...wasp.dependencycheck.maven.UpdateMojo.html | 48 +- ...ycheck.maven.slf4j.MavenLoggerAdapter.html | 42 +- ...ycheck.maven.slf4j.MavenLoggerFactory.html | 10 +- .../org.slf4j.impl.StaticLoggerBinder.html | 188 +- dependency-check-maven/configuration.html | 48 +- .../css/apache-maven-fluido-1.4.min.css | 9 + .../dependency-analysis.html | 431 + .../dependency-updates-report.html | 559 +- dependency-check-maven/findbugs.html | 187 +- .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 35283 bytes .../fonts/glyphicons-halflings-regular.svg | 229 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 55016 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 41793 bytes dependency-check-maven/help-mojo.html | 51 +- .../images/apache-maven-project-2.png | Bin 33442 -> 43073 bytes dependency-check-maven/index.html | 87 +- dependency-check-maven/integration.html | 236 + dependency-check-maven/issue-tracking.html | 77 +- .../js/apache-maven-fluido-1.4.min.js | 25 + dependency-check-maven/license.html | 72 +- dependency-check-maven/mail-lists.html | 68 +- dependency-check-maven/plugin-info.html | 172 +- .../plugin-updates-report.html | 272 +- dependency-check-maven/pmd.html | 182 +- dependency-check-maven/project-info.html | 87 +- dependency-check-maven/project-reports.html | 201 +- dependency-check-maven/project-summary.html | 82 +- dependency-check-maven/purge-mojo.html | 1155 ++ dependency-check-maven/source-repository.html | 97 +- dependency-check-maven/surefire-report.html | 165 +- dependency-check-maven/taglist.html | 151 +- dependency-check-maven/team-list.html | 95 +- dependency-check-maven/update-only-mojo.html | 53 +- dependency-check-maven/xref-test/index.html | 2 +- .../dependencycheck/maven/package-frame.html | 2 +- .../maven/package-summary.html | 2 +- .../xref-test/overview-frame.html | 2 +- .../xref-test/overview-summary.html | 4 +- .../xref/allclasses-frame.html | 3 + dependency-check-maven/xref/index.html | 2 +- .../dependencycheck/maven/AggregateMojo.html | 427 +- .../maven/BaseDependencyCheckMojo.html | 1917 +- .../dependencycheck/maven/CheckMojo.html | 34 +- .../owasp/dependencycheck/maven/Engine.html | 4 +- .../owasp/dependencycheck/maven/HelpMojo.html | 856 +- .../dependencycheck/maven/PurgeMojo.html | 121 + .../dependencycheck/maven/UpdateMojo.html | 32 +- .../dependencycheck/maven/package-frame.html | 5 +- .../maven/package-summary.html | 7 +- .../maven/slf4j/package-frame.html | 2 +- .../maven/slf4j/package-summary.html | 2 +- .../org/slf4j/impl/StaticLoggerBinder.html | 156 +- .../xref/org/slf4j/impl/package-frame.html | 2 +- .../xref/org/slf4j/impl/package-summary.html | 2 +- .../xref/overview-frame.html | 2 +- .../xref/overview-summary.html | 4 +- .../apidocs/allclasses-frame.html | 34 +- .../apidocs/allclasses-noframe.html | 34 +- .../apidocs/constant-values.html | 290 +- .../apidocs/deprecated-list.html | 152 +- dependency-check-utils/apidocs/help-doc.html | 22 +- dependency-check-utils/apidocs/index-all.html | 1729 +- dependency-check-utils/apidocs/index.html | 11 +- .../owasp/dependencycheck/utils/Checksum.html | 14 +- .../utils/DownloadFailedException.html | 14 +- .../dependencycheck/utils/Downloader.html | 14 +- .../utils/ExtractionException.html | 14 +- .../dependencycheck/utils/FileUtils.html | 71 +- .../utils/InvalidSettingException.html | 14 +- .../dependencycheck/utils/Settings.KEYS.html | 84 +- .../owasp/dependencycheck/utils/Settings.html | 14 +- .../utils/URLConnectionFactory.html | 14 +- .../utils/URLConnectionFailureException.html | 14 +- .../utils/class-use/Checksum.html | 14 +- .../class-use/DownloadFailedException.html | 31 +- .../utils/class-use/Downloader.html | 14 +- .../utils/class-use/ExtractionException.html | 14 +- .../utils/class-use/FileUtils.html | 14 +- .../class-use/InvalidSettingException.html | 31 +- .../utils/class-use/Settings.KEYS.html | 14 +- .../utils/class-use/Settings.html | 31 +- .../utils/class-use/URLConnectionFactory.html | 14 +- .../URLConnectionFailureException.html | 31 +- .../dependencycheck/utils/package-frame.html | 6 +- .../utils/package-summary.html | 18 +- .../dependencycheck/utils/package-tree.html | 22 +- .../dependencycheck/utils/package-use.html | 31 +- .../apidocs/overview-tree.html | 81 +- dependency-check-utils/apidocs/package-list | 7 - .../apidocs/serialized-form.html | 106 +- dependency-check-utils/checkstyle.html | 166 +- dependency-check-utils/checkstyle.rss | 514 +- .../cobertura/frame-packages.html | 21 - ...files-org.owasp.dependencycheck.utils.html | 4 +- .../cobertura/frame-sourcefiles.html | 85 +- ...mmary-org.owasp.dependencycheck.utils.html | 10 +- .../cobertura/frame-summary.html | 13 +- ....owasp.dependencycheck.utils.Checksum.html | 58 +- ...cycheck.utils.DownloadFailedException.html | 2 +- ...wasp.dependencycheck.utils.Downloader.html | 18 +- ...ndencycheck.utils.ExtractionException.html | 2 +- ...owasp.dependencycheck.utils.FileUtils.html | 273 +- ...cycheck.utils.InvalidSettingException.html | 6 +- ....owasp.dependencycheck.utils.Settings.html | 1497 +- ...dencycheck.utils.URLConnectionFactory.html | 268 +- ...k.utils.URLConnectionFailureException.html | 2 +- .../css/apache-maven-fluido-1.4.min.css | 9 + .../dependency-analysis.html | 322 + .../dependency-updates-report.html | 514 +- dependency-check-utils/findbugs.html | 180 +- .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 35283 bytes .../fonts/glyphicons-halflings-regular.svg | 229 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 55016 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 41793 bytes .../images/apache-maven-project-2.png | Bin 33442 -> 43073 bytes dependency-check-utils/index.html | 37 +- dependency-check-utils/integration.html | 221 + dependency-check-utils/issue-tracking.html | 63 +- .../js/apache-maven-fluido-1.4.min.js | 25 + dependency-check-utils/license.html | 62 +- dependency-check-utils/mail-lists.html | 58 +- .../plugin-updates-report.html | 250 +- dependency-check-utils/project-info.html | 79 +- dependency-check-utils/project-reports.html | 191 +- dependency-check-utils/project-summary.html | 68 +- dependency-check-utils/source-repository.html | 83 +- dependency-check-utils/surefire-report.html | 246 +- dependency-check-utils/taglist.html | 298 +- dependency-check-utils/team-list.html | 81 +- .../xref-test/allclasses-frame.html | 3 - dependency-check-utils/xref-test/index.html | 2 +- .../dependencycheck/utils/ChecksumTest.html | 203 +- .../dependencycheck/utils/package-frame.html | 2 +- .../utils/package-summary.html | 2 +- .../xref-test/overview-frame.html | 5 +- .../xref-test/overview-summary.html | 9 +- .../xref/allclasses-frame.html | 86 +- dependency-check-utils/xref/index.html | 2 +- .../dependencycheck/utils/FileUtils.html | 224 +- .../owasp/dependencycheck/utils/Settings.html | 1116 +- .../utils/URLConnectionFactory.html | 204 +- .../dependencycheck/utils/package-frame.html | 2 +- .../utils/package-summary.html | 2 +- .../xref/overview-frame.html | 23 +- .../xref/overview-summary.html | 39 +- dependency-check.pdf | Bin 329686 -> 0 bytes dependency-check.pptx | Bin 569997 -> 0 bytes dependency-updates-report.html | 1438 ++ fonts/glyphicons-halflings-regular.eot | Bin 0 -> 35283 bytes fonts/glyphicons-halflings-regular.svg | 229 + fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 55016 bytes fonts/glyphicons-halflings-regular.woff | Bin 0 -> 41793 bytes general/dep-check-date.sh | 11 + general/internals.html | 77 +- general/nvd_download.sh | 5 + general/scan_iso.html | 328 + general/suppression.html | 81 +- general/thereport.html | 73 +- images/apache-maven-project-2.png | Bin 33442 -> 43073 bytes index.html | 75 +- integration.html | 310 + issue-tracking.html | 101 +- js/apache-maven-fluido-1.4.min.js | 25 + license.html | 100 +- mail-lists.html | 96 +- modules.html | 112 +- plugin-updates-report.html | 768 + project-info.html | 119 +- project-reports.html | 313 + project-summary.html | 104 +- related.html | 79 +- source-repository.html | 121 +- surefire-report.html | 323 + team-list.html | 119 +- xref-test/allclasses-frame.html | 242 + xref-test/index.html | 25 + .../org/owasp/dependencycheck/AppTest.html | 88 + .../org/owasp/dependencycheck/BaseTest.html | 89 + .../owasp/dependencycheck/CliParserTest.html | 286 + .../EngineIntegrationTest.html | 80 + .../AbstractFileTypeAnalyzerTest.html | 55 + .../AbstractSuppressionAnalyzerTest.html | 132 + .../analyzer/AnalyzerServiceTest.html | 61 + .../ArchiveAnalyzerIntegrationTest.html | 325 + .../analyzer/AssemblyAnalyzerTest.html | 193 + .../analyzer/AutoconfAnalyzerTest.html | 189 + .../analyzer/CMakeAnalyzerTest.html | 166 + .../analyzer/CPEAnalyzerIntegrationTest.html | 273 + .../analyzer/ComposerLockAnalyzerTest.html | 114 + ...ndencyBundlingAnalyzerIntegrationTest.html | 112 + .../DependencyBundlingAnalyzerTest.html | 138 + .../analyzer/FalsePositiveAnalyzerTest.html | 82 + .../analyzer/FileNameAnalyzerTest.html | 107 + .../analyzer/HintAnalyzerTest.html | 129 + .../analyzer/JarAnalyzerTest.html | 129 + .../analyzer/NodePackageAnalyzerTest.html | 113 + .../analyzer/NuspecAnalyzerTest.html | 70 + .../analyzer/OpenSSLAnalyzerTest.html | 132 + .../PythonDistributionAnalyzerTest.html | 181 + .../analyzer/PythonPackageAnalyzerTest.html | 116 + .../analyzer/RubyGemspecAnalyzerTest.html | 116 + ...itySuppressionAnalyzerIntegrationTest.html | 119 + .../analyzer/package-frame.html | 90 + .../analyzer/package-summary.html | 179 + .../data/central/CentralSearchTest.html | 77 + .../data/central/package-frame.html | 24 + .../data/central/package-summary.html | 69 + .../data/composer/ComposerLockParserTest.html | 82 + .../data/composer/package-frame.html | 24 + .../data/composer/package-summary.html | 69 + .../data/cpe/AbstractDatabaseTestCase.html | 50 + .../data/cpe/IndexEntryTest.html | 57 + .../data/cpe/package-frame.html | 27 + .../data/cpe/package-summary.html | 74 + .../dependencycheck/data/cwe/CweDBTest.html | 110 + .../data/cwe/package-frame.html | 24 + .../data/cwe/package-summary.html | 69 + .../data/lucene/FieldAnalyzerTest.html | 141 + .../data/lucene/LuceneUtilsTest.html | 106 + .../TokenPairConcatenatingFilterTest.html | 102 + .../data/lucene/UrlTokenizingFilterTest.html | 96 + .../data/lucene/package-frame.html | 33 + .../data/lucene/package-summary.html | 84 + .../data/nexus/NexusSearchTest.html | 94 + .../data/nexus/package-frame.html | 24 + .../data/nexus/package-summary.html | 69 + .../data/nuget/XPathNuspecParserTest.html | 96 + .../data/nuget/package-frame.html | 24 + .../data/nuget/package-summary.html | 69 + .../data/nvdcve/BaseDBTestCase.html | 134 + .../data/nvdcve/CveDBIntegrationTest.html | 194 + .../data/nvdcve/CveDBMySQLTest.html | 118 + .../DatabasePropertiesIntegrationTest.html | 158 + .../data/nvdcve/DriverLoaderTest.html | 169 + .../data/nvdcve/package-frame.html | 36 + .../data/nvdcve/package-summary.html | 89 + .../data/update/BaseUpdaterTest.html | 113 + .../update/CpeUpdaterIntegrationTest.html | 53 + .../data/update/EngineVersionCheckTest.html | 158 + .../update/NvdCveUpdaterIntegrationTest.html | 76 + .../data/update/nvd/DownloadTaskTest.html | 90 + .../data/update/nvd/NvdCveInfoTest.html | 104 + .../nvd/NvdCveUpdaterIntegrationTest.html | 82 + .../update/nvd/NvdCve_1_2_HandlerTest.html | 86 + .../update/nvd/NvdCve_2_0_HandlerTest.html | 92 + .../data/update/nvd/UpdateableNvdCveTest.html | 154 + .../data/update/nvd/package-frame.html | 39 + .../data/update/nvd/package-summary.html | 94 + .../data/update/package-frame.html | 36 + .../data/update/package-summary.html | 89 + .../dependency/DependencyTest.html | 327 + .../dependency/EvidenceTest.html | 127 + .../dependency/VulnerableSoftwareTest.html | 112 + .../dependency/package-frame.html | 30 + .../dependency/package-summary.html | 79 + .../maven/BaseDependencyCheckMojoTest.html | 139 + .../owasp/dependencycheck/maven/BaseTest.html | 60 + .../dependencycheck/maven/package-frame.html | 30 + .../maven/package-summary.html | 79 + .../owasp/dependencycheck/package-frame.html | 33 + .../dependencycheck/package-summary.html | 84 + .../ReportGeneratorIntegrationTest.html | 171 + .../reporting/package-frame.html | 24 + .../reporting/package-summary.html | 69 + .../suppression/PropertyTypeTest.html | 122 + .../suppression/SuppressionHandlerTest.html | 118 + .../suppression/SuppressionParserTest.html | 80 + .../suppression/SuppressionRuleTest.html | 536 + .../suppression/package-frame.html | 33 + .../suppression/package-summary.html | 84 + .../taskdefs/DependencyCheckTaskTest.html | 135 + .../taskdefs/package-frame.html | 24 + .../taskdefs/package-summary.html | 69 + .../owasp/dependencycheck/utils/BaseTest.html | 49 + .../dependencycheck/utils/ChecksumTest.html | 142 + .../dependencycheck/utils/DateUtilTest.html | 84 + .../utils/DependencyVersionTest.html | 212 + .../utils/DependencyVersionUtilTest.html | 96 + .../utils/DownloaderIntegrationTest.html | 67 + .../dependencycheck/utils/DownloaderTest.html | 52 + .../dependencycheck/utils/FileUtilsTest.html | 74 + .../dependencycheck/utils/FilterTest.html | 85 + .../dependencycheck/utils/SettingsTest.html | 198 + .../dependencycheck/utils/package-frame.html | 51 + .../utils/package-summary.html | 114 + .../dependencycheck/xml/pom/ModelTest.html | 298 + .../dependencycheck/xml/pom/PomUtilsTest.html | 56 + .../xml/pom/package-frame.html | 27 + .../xml/pom/package-summary.html | 74 + xref-test/overview-frame.html | 79 + xref-test/overview-summary.html | 156 + xref-test/stylesheet.css | 114 + xref/allclasses-frame.html | 470 + xref/index.html | 25 + xref/org/owasp/dependencycheck/App.html | 479 + xref/org/owasp/dependencycheck/CliParser.html | 1246 ++ xref/org/owasp/dependencycheck/Engine.html | 537 + .../InvalidScanPathException.html | 79 + .../agent/DependencyCheckScanAgent.html | 1080 ++ .../dependencycheck/agent/package-frame.html | 24 + .../agent/package-summary.html | 69 + .../analyzer/AbstractAnalyzer.html | 58 + .../analyzer/AbstractFileTypeAnalyzer.html | 236 + .../analyzer/AbstractSuppressionAnalyzer.html | 190 + .../analyzer/AnalysisPhase.html | 76 + .../dependencycheck/analyzer/Analyzer.html | 84 + .../analyzer/AnalyzerService.html | 66 + .../analyzer/ArchiveAnalyzer.html | 524 + .../analyzer/AssemblyAnalyzer.html | 348 + .../analyzer/AutoconfAnalyzer.html | 292 + .../analyzer/CMakeAnalyzer.html | 228 + .../dependencycheck/analyzer/CPEAnalyzer.html | 777 + .../analyzer/CentralAnalyzer.html | 251 + .../analyzer/ComposerLockAnalyzer.html | 175 + .../analyzer/CpeSuppressionAnalyzer.html | 88 + .../analyzer/DependencyBundlingAnalyzer.html | 443 + .../analyzer/FalsePositiveAnalyzer.html | 496 + .../analyzer/FileNameAnalyzer.html | 130 + .../analyzer/FileTypeAnalyzer.html | 46 + .../analyzer/HintAnalyzer.html | 189 + .../dependencycheck/analyzer/JarAnalyzer.html | 1193 ++ .../analyzer/NexusAnalyzer.html | 273 + .../analyzer/NodePackageAnalyzer.html | 200 + .../analyzer/NuspecAnalyzer.html | 177 + .../analyzer/NvdCveAnalyzer.html | 167 + .../analyzer/OpenSSLAnalyzer.html | 188 + .../analyzer/PythonDistributionAnalyzer.html | 387 + .../analyzer/PythonPackageAnalyzer.html | 326 + .../analyzer/RubyGemspecAnalyzer.html | 173 + .../VulnerabilitySuppressionAnalyzer.html | 88 + .../analyzer/exception/AnalysisException.html | 79 + .../exception/ArchiveExtractionException.html | 79 + .../analyzer/exception/package-frame.html | 27 + .../analyzer/exception/package-summary.html | 74 + .../analyzer/package-frame.html | 117 + .../analyzer/package-summary.html | 224 + .../ant/logging/AntLoggerAdapter.html | 284 + .../ant/logging/AntLoggerFactory.html | 69 + .../ant/logging/package-frame.html | 27 + .../ant/logging/package-summary.html | 74 + .../data/central/CentralSearch.html | 184 + .../data/central/package-frame.html | 24 + .../data/central/package-summary.html | 69 + .../data/composer/ComposerDependency.html | 123 + .../data/composer/ComposerException.html | 65 + .../data/composer/ComposerLockParser.html | 137 + .../data/composer/package-frame.html | 30 + .../data/composer/package-summary.html | 79 + .../data/cpe/CpeMemoryIndex.html | 343 + .../dependencycheck/data/cpe/Fields.html | 58 + .../dependencycheck/data/cpe/IndexEntry.html | 203 + .../data/cpe/IndexException.html | 79 + .../data/cpe/package-frame.html | 33 + .../data/cpe/package-summary.html | 84 + .../owasp/dependencycheck/data/cwe/CweDB.html | 109 + .../dependencycheck/data/cwe/CweHandler.html | 68 + .../data/cwe/package-frame.html | 27 + .../data/cwe/package-summary.html | 74 + .../data/lucene/AbstractTokenizingFilter.html | 96 + .../data/lucene/AlphaNumericTokenizer.html | 75 + .../data/lucene/DependencySimilarity.html | 60 + .../data/lucene/FieldAnalyzer.html | 93 + .../data/lucene/LuceneUtils.html | 117 + .../data/lucene/SearchFieldAnalyzer.html | 109 + .../lucene/TokenPairConcatenatingFilter.html | 178 + .../data/lucene/UrlTokenizingFilter.html | 99 + .../data/lucene/package-frame.html | 45 + .../data/lucene/package-summary.html | 104 + .../data/nexus/MavenArtifact.html | 237 + .../data/nexus/NexusSearch.html | 199 + .../data/nexus/package-frame.html | 27 + .../data/nexus/package-summary.html | 74 + .../data/nuget/NugetPackage.html | 199 + .../data/nuget/NuspecParseException.html | 80 + .../data/nuget/NuspecParser.html | 50 + .../data/nuget/XPathNuspecParser.html | 94 + .../data/nuget/package-frame.html | 33 + .../data/nuget/package-summary.html | 84 + .../data/nvdcve/ConnectionFactory.html | 376 + .../data/nvdcve/CorruptDatabaseException.html | 64 + .../dependencycheck/data/nvdcve/CveDB.html | 837 + .../data/nvdcve/DatabaseException.html | 72 + .../data/nvdcve/DatabaseProperties.html | 199 + .../data/nvdcve/DriverLoadException.html | 72 + .../data/nvdcve/DriverLoader.html | 164 + .../data/nvdcve/DriverShim.html | 218 + .../data/nvdcve/package-frame.html | 45 + .../data/nvdcve/package-summary.html | 104 + .../data/update/BaseUpdater.html | 101 + .../data/update/CachedWebDataSource.html | 50 + .../data/update/CpeUpdater.html | 213 + .../data/update/EngineVersionCheck.html | 226 + .../data/update/NvdCveUpdater.html | 297 + .../data/update/UpdateService.html | 66 + .../data/update/cpe/CPEHandler.html | 377 + .../dependencycheck/data/update/cpe/Cpe.html | 138 + .../data/update/cpe/package-frame.html | 30 + .../data/update/cpe/package-summary.html | 79 + .../exception/InvalidDataException.html | 63 + .../update/exception/UpdateException.html | 81 + .../data/update/exception/package-frame.html | 27 + .../update/exception/package-summary.html | 74 + .../data/update/nvd/DownloadTask.html | 314 + .../data/update/nvd/NvdCve12Handler.html | 256 + .../data/update/nvd/NvdCve20Handler.html | 508 + .../data/update/nvd/NvdCveInfo.html | 150 + .../data/update/nvd/ProcessTask.html | 198 + .../data/update/nvd/UpdateableNvdCve.html | 197 + .../data/update/nvd/package-frame.html | 42 + .../data/update/nvd/package-summary.html | 99 + .../data/update/package-frame.html | 39 + .../data/update/package-summary.html | 94 + .../dependency/Confidence.html | 56 + .../dependency/Dependency.html | 785 + .../dependencycheck/dependency/Evidence.html | 303 + .../dependency/EvidenceCollection.html | 420 + .../dependency/Identifier.html | 244 + .../dependencycheck/dependency/Reference.html | 165 + .../dependency/Vulnerability.html | 458 + .../dependency/VulnerabilityComparator.html | 59 + .../dependency/VulnerableSoftware.html | 387 + .../dependency/package-frame.html | 48 + .../dependency/package-summary.html | 109 + .../exception/NoDataException.html | 81 + .../exception/ScanAgentException.html | 81 + .../exception/package-frame.html | 27 + .../exception/package-summary.html | 74 + .../dependencycheck/maven/AggregateMojo.html | 296 + .../maven/BaseDependencyCheckMojo.html | 1030 + .../dependencycheck/maven/CheckMojo.html | 128 + .../owasp/dependencycheck/maven/Engine.html | 240 + .../dependencycheck/maven/PurgeMojo.html | 121 + .../dependencycheck/maven/UpdateMojo.html | 110 + .../dependencycheck/maven/package-frame.html | 39 + .../maven/package-summary.html | 94 + .../maven/slf4j/MavenLoggerAdapter.html | 348 + .../maven/slf4j/MavenLoggerFactory.html | 69 + .../maven/slf4j/package-frame.html | 27 + .../maven/slf4j/package-summary.html | 74 + .../owasp/dependencycheck/package-frame.html | 36 + .../dependencycheck/package-summary.html | 89 + .../dependencycheck/reporting/EscapeTool.html | 96 + .../reporting/ReportGenerator.html | 331 + .../reporting/VelocityLoggerRedirect.html | 138 + .../reporting/package-frame.html | 33 + .../reporting/package-summary.html | 84 + .../suppression/PropertyType.html | 196 + .../suppression/SuppressionErrorHandler.html | 110 + .../suppression/SuppressionHandler.html | 196 + .../SuppressionParseException.html | 81 + .../suppression/SuppressionParser.html | 143 + .../suppression/SuppressionRule.html | 497 + .../suppression/package-frame.html | 39 + .../suppression/package-summary.html | 94 + .../owasp/dependencycheck/taskdefs/Check.html | 982 + .../owasp/dependencycheck/taskdefs/Purge.html | 140 + .../dependencycheck/taskdefs/Update.html | 446 + .../taskdefs/package-frame.html | 33 + .../taskdefs/package-summary.html | 84 + .../owasp/dependencycheck/utils/Checksum.html | 164 + .../owasp/dependencycheck/utils/DBUtils.html | 111 + .../owasp/dependencycheck/utils/DateUtil.html | 59 + .../utils/DependencyVersion.html | 271 + .../utils/DependencyVersionUtil.html | 110 + .../utils/DownloadFailedException.html | 81 + .../dependencycheck/utils/Downloader.html | 322 + .../utils/ExtractionException.html | 81 + .../dependencycheck/utils/ExtractionUtil.html | 289 + .../utils/FileFilterBuilder.html | 151 + .../dependencycheck/utils/FileUtils.html | 128 + .../owasp/dependencycheck/utils/Filter.html | 87 + .../utils/InvalidSettingException.html | 81 + .../utils/NonClosingStream.html | 60 + .../org/owasp/dependencycheck/utils/Pair.html | 140 + .../owasp/dependencycheck/utils/Settings.html | 827 + .../utils/URLConnectionFactory.html | 135 + .../utils/URLConnectionFailureException.html | 81 + .../dependencycheck/utils/UrlStringUtils.html | 126 + .../dependencycheck/utils/package-frame.html | 84 + .../utils/package-summary.html | 169 + .../dependencycheck/xml/pom/License.html | 150 + .../owasp/dependencycheck/xml/pom/Model.html | 352 + .../dependencycheck/xml/pom/PomHandler.html | 203 + .../xml/pom/PomParseException.html | 81 + .../dependencycheck/xml/pom/PomParser.html | 126 + .../dependencycheck/xml/pom/PomUtils.html | 131 + .../xml/pom/package-frame.html | 39 + .../xml/pom/package-summary.html | 94 + xref/org/slf4j/impl/StaticLoggerBinder.html | 124 + xref/org/slf4j/impl/package-frame.html | 24 + xref/org/slf4j/impl/package-summary.html | 69 + xref/overview-frame.html | 103 + xref/overview-summary.html | 196 + xref/stylesheet.css | 114 + 1456 files changed, 125936 insertions(+), 63077 deletions(-) delete mode 100644 SampleReport.html create mode 100644 analyzers/autoconf.html create mode 100644 analyzers/cmake.html create mode 100644 analyzers/composer-lock.html create mode 100644 analyzers/nodejs.html create mode 100644 analyzers/openssl.html create mode 100644 analyzers/python.html create mode 100644 analyzers/ruby-gemspec.html create mode 100644 css/apache-maven-fluido-1.4.min.css create mode 100644 data/cachenvd.html rename gradle.html => dependency-analysis.html (69%) create mode 100644 dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Check.ReportFormats.html create mode 100644 dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Check.html create mode 100644 dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Purge.html create mode 100644 dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Update.html create mode 100644 dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Check.ReportFormats.html create mode 100644 dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Check.html create mode 100644 dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Purge.html create mode 100644 dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Update.html create mode 100644 dependency-check-ant/cobertura/org.owasp.dependencycheck.taskdefs.Check.html create mode 100644 dependency-check-ant/cobertura/org.owasp.dependencycheck.taskdefs.Purge.html create mode 100644 dependency-check-ant/cobertura/org.owasp.dependencycheck.taskdefs.Update.html create mode 100644 dependency-check-ant/config-purge.html create mode 100644 dependency-check-ant/config-update.html create mode 100644 dependency-check-ant/css/apache-maven-fluido-1.4.min.css create mode 100644 dependency-check-ant/dependency-analysis.html create mode 100644 dependency-check-ant/fonts/glyphicons-halflings-regular.eot create mode 100644 dependency-check-ant/fonts/glyphicons-halflings-regular.svg create mode 100644 dependency-check-ant/fonts/glyphicons-halflings-regular.ttf create mode 100644 dependency-check-ant/fonts/glyphicons-halflings-regular.woff create mode 100644 dependency-check-ant/integration.html create mode 100644 dependency-check-ant/js/apache-maven-fluido-1.4.min.js create mode 100644 dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/Check.html create mode 100644 dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/Purge.html create mode 100644 dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/Update.html create mode 100644 dependency-check-cli/css/apache-maven-fluido-1.4.min.css create mode 100644 dependency-check-cli/dependency-analysis.html create mode 100644 dependency-check-cli/fonts/glyphicons-halflings-regular.eot create mode 100644 dependency-check-cli/fonts/glyphicons-halflings-regular.svg create mode 100644 dependency-check-cli/fonts/glyphicons-halflings-regular.ttf create mode 100644 dependency-check-cli/fonts/glyphicons-halflings-regular.woff create mode 100644 dependency-check-cli/integration.html create mode 100644 dependency-check-cli/js/apache-maven-fluido-1.4.min.js create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/ComposerLockAnalyzer.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/NodePackageAnalyzer.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/RubyGemspecAnalyzer.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/class-use/ComposerLockAnalyzer.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/class-use/NodePackageAnalyzer.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/class-use/RubyGemspecAnalyzer.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/data/composer/ComposerDependency.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/data/composer/ComposerException.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/data/composer/ComposerLockParser.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/data/composer/class-use/ComposerDependency.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/data/composer/class-use/ComposerException.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/data/composer/class-use/ComposerLockParser.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/data/composer/package-frame.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/data/composer/package-summary.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/data/composer/package-tree.html create mode 100644 dependency-check-core/apidocs/org/owasp/dependencycheck/data/composer/package-use.html create mode 100644 dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.composer.html create mode 100644 dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.composer.html create mode 100644 dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.ComposerLockAnalyzer.html create mode 100644 dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NodePackageAnalyzer.html create mode 100644 dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.RubyGemspecAnalyzer.html create mode 100644 dependency-check-core/cobertura/org.owasp.dependencycheck.data.composer.ComposerDependency.html create mode 100644 dependency-check-core/cobertura/org.owasp.dependencycheck.data.composer.ComposerException.html create mode 100644 dependency-check-core/cobertura/org.owasp.dependencycheck.data.composer.ComposerLockParser.html create mode 100644 dependency-check-core/css/apache-maven-fluido-1.4.min.css create mode 100644 dependency-check-core/dependency-analysis.html create mode 100644 dependency-check-core/fonts/glyphicons-halflings-regular.eot create mode 100644 dependency-check-core/fonts/glyphicons-halflings-regular.svg create mode 100644 dependency-check-core/fonts/glyphicons-halflings-regular.ttf create mode 100644 dependency-check-core/fonts/glyphicons-halflings-regular.woff create mode 100644 dependency-check-core/integration.html create mode 100644 dependency-check-core/js/apache-maven-fluido-1.4.min.js create mode 100644 dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/ComposerLockAnalyzerTest.html create mode 100644 dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/NodePackageAnalyzerTest.html create mode 100644 dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/RubyGemspecAnalyzerTest.html create mode 100644 dependency-check-core/xref-test/org/owasp/dependencycheck/data/composer/ComposerLockParserTest.html create mode 100644 dependency-check-core/xref-test/org/owasp/dependencycheck/data/composer/package-frame.html create mode 100644 dependency-check-core/xref-test/org/owasp/dependencycheck/data/composer/package-summary.html create mode 100644 dependency-check-core/xref/org/owasp/dependencycheck/analyzer/ComposerLockAnalyzer.html create mode 100644 dependency-check-core/xref/org/owasp/dependencycheck/analyzer/NodePackageAnalyzer.html create mode 100644 dependency-check-core/xref/org/owasp/dependencycheck/analyzer/RubyGemspecAnalyzer.html create mode 100644 dependency-check-core/xref/org/owasp/dependencycheck/data/composer/ComposerDependency.html create mode 100644 dependency-check-core/xref/org/owasp/dependencycheck/data/composer/ComposerException.html create mode 100644 dependency-check-core/xref/org/owasp/dependencycheck/data/composer/ComposerLockParser.html create mode 100644 dependency-check-core/xref/org/owasp/dependencycheck/data/composer/package-frame.html create mode 100644 dependency-check-core/xref/org/owasp/dependencycheck/data/composer/package-summary.html create mode 100644 dependency-check-gradle/css/apache-maven-fluido-1.4.min.css create mode 100644 dependency-check-gradle/dependency-analysis.html create mode 100644 dependency-check-gradle/dependency-updates-report.html create mode 100644 dependency-check-gradle/fonts/glyphicons-halflings-regular.eot create mode 100644 dependency-check-gradle/fonts/glyphicons-halflings-regular.svg create mode 100644 dependency-check-gradle/fonts/glyphicons-halflings-regular.ttf create mode 100644 dependency-check-gradle/fonts/glyphicons-halflings-regular.woff create mode 100644 dependency-check-gradle/integration.html create mode 100644 dependency-check-gradle/js/apache-maven-fluido-1.4.min.js create mode 100644 dependency-check-gradle/plugin-updates-report.html create mode 100644 dependency-check-gradle/project-reports.html create mode 100644 dependency-check-jenkins/css/apache-maven-fluido-1.4.min.css create mode 100644 dependency-check-jenkins/dependency-analysis.html create mode 100644 dependency-check-jenkins/dependency-updates-report.html create mode 100644 dependency-check-jenkins/fonts/glyphicons-halflings-regular.eot create mode 100644 dependency-check-jenkins/fonts/glyphicons-halflings-regular.svg create mode 100644 dependency-check-jenkins/fonts/glyphicons-halflings-regular.ttf create mode 100644 dependency-check-jenkins/fonts/glyphicons-halflings-regular.woff create mode 100644 dependency-check-jenkins/integration.html create mode 100644 dependency-check-jenkins/js/apache-maven-fluido-1.4.min.js create mode 100644 dependency-check-jenkins/plugin-updates-report.html create mode 100644 dependency-check-jenkins/project-reports.html create mode 100644 dependency-check-maven/apidocs/org/owasp/dependencycheck/maven/PurgeMojo.html create mode 100644 dependency-check-maven/apidocs/org/owasp/dependencycheck/maven/class-use/PurgeMojo.html create mode 100644 dependency-check-maven/cobertura/org.owasp.dependencycheck.maven.PurgeMojo.html create mode 100644 dependency-check-maven/css/apache-maven-fluido-1.4.min.css create mode 100644 dependency-check-maven/dependency-analysis.html create mode 100644 dependency-check-maven/fonts/glyphicons-halflings-regular.eot create mode 100644 dependency-check-maven/fonts/glyphicons-halflings-regular.svg create mode 100644 dependency-check-maven/fonts/glyphicons-halflings-regular.ttf create mode 100644 dependency-check-maven/fonts/glyphicons-halflings-regular.woff create mode 100644 dependency-check-maven/integration.html create mode 100644 dependency-check-maven/js/apache-maven-fluido-1.4.min.js create mode 100644 dependency-check-maven/purge-mojo.html create mode 100644 dependency-check-maven/xref/org/owasp/dependencycheck/maven/PurgeMojo.html create mode 100644 dependency-check-utils/css/apache-maven-fluido-1.4.min.css create mode 100644 dependency-check-utils/dependency-analysis.html create mode 100644 dependency-check-utils/fonts/glyphicons-halflings-regular.eot create mode 100644 dependency-check-utils/fonts/glyphicons-halflings-regular.svg create mode 100644 dependency-check-utils/fonts/glyphicons-halflings-regular.ttf create mode 100644 dependency-check-utils/fonts/glyphicons-halflings-regular.woff create mode 100644 dependency-check-utils/integration.html create mode 100644 dependency-check-utils/js/apache-maven-fluido-1.4.min.js delete mode 100644 dependency-check.pdf delete mode 100644 dependency-check.pptx create mode 100644 dependency-updates-report.html create mode 100644 fonts/glyphicons-halflings-regular.eot create mode 100644 fonts/glyphicons-halflings-regular.svg create mode 100644 fonts/glyphicons-halflings-regular.ttf create mode 100644 fonts/glyphicons-halflings-regular.woff create mode 100644 general/dep-check-date.sh create mode 100644 general/nvd_download.sh create mode 100644 general/scan_iso.html create mode 100644 integration.html create mode 100644 js/apache-maven-fluido-1.4.min.js create mode 100644 plugin-updates-report.html create mode 100644 project-reports.html create mode 100644 surefire-report.html create mode 100644 xref-test/allclasses-frame.html create mode 100644 xref-test/index.html create mode 100644 xref-test/org/owasp/dependencycheck/AppTest.html create mode 100644 xref-test/org/owasp/dependencycheck/BaseTest.html create mode 100644 xref-test/org/owasp/dependencycheck/CliParserTest.html create mode 100644 xref-test/org/owasp/dependencycheck/EngineIntegrationTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/AbstractFileTypeAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/AbstractSuppressionAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/AnalyzerServiceTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/ArchiveAnalyzerIntegrationTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/AssemblyAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/AutoconfAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/CMakeAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/CPEAnalyzerIntegrationTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/ComposerLockAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/DependencyBundlingAnalyzerIntegrationTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/DependencyBundlingAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/FalsePositiveAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/FileNameAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/HintAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/JarAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/NodePackageAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/NuspecAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/OpenSSLAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/PythonDistributionAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/PythonPackageAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/RubyGemspecAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/VulnerabilitySuppressionAnalyzerIntegrationTest.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/analyzer/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/data/central/CentralSearchTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/central/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/data/central/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/data/composer/ComposerLockParserTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/composer/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/data/composer/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/data/cpe/AbstractDatabaseTestCase.html create mode 100644 xref-test/org/owasp/dependencycheck/data/cpe/IndexEntryTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/cpe/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/data/cpe/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/data/cwe/CweDBTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/cwe/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/data/cwe/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/data/lucene/FieldAnalyzerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/lucene/LuceneUtilsTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/lucene/TokenPairConcatenatingFilterTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/lucene/UrlTokenizingFilterTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/lucene/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/data/lucene/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/data/nexus/NexusSearchTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/nexus/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/data/nexus/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/data/nuget/XPathNuspecParserTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/nuget/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/data/nuget/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/data/nvdcve/BaseDBTestCase.html create mode 100644 xref-test/org/owasp/dependencycheck/data/nvdcve/CveDBIntegrationTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/nvdcve/CveDBMySQLTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/nvdcve/DatabasePropertiesIntegrationTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/nvdcve/DriverLoaderTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/nvdcve/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/data/nvdcve/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/BaseUpdaterTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/CpeUpdaterIntegrationTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/EngineVersionCheckTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/NvdCveUpdaterIntegrationTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/nvd/DownloadTaskTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/nvd/NvdCveInfoTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/nvd/NvdCveUpdaterIntegrationTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/nvd/NvdCve_1_2_HandlerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/nvd/NvdCve_2_0_HandlerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/nvd/UpdateableNvdCveTest.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/nvd/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/nvd/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/data/update/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/dependency/DependencyTest.html create mode 100644 xref-test/org/owasp/dependencycheck/dependency/EvidenceTest.html create mode 100644 xref-test/org/owasp/dependencycheck/dependency/VulnerableSoftwareTest.html create mode 100644 xref-test/org/owasp/dependencycheck/dependency/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/dependency/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/maven/BaseDependencyCheckMojoTest.html create mode 100644 xref-test/org/owasp/dependencycheck/maven/BaseTest.html create mode 100644 xref-test/org/owasp/dependencycheck/maven/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/maven/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/reporting/ReportGeneratorIntegrationTest.html create mode 100644 xref-test/org/owasp/dependencycheck/reporting/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/reporting/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/suppression/PropertyTypeTest.html create mode 100644 xref-test/org/owasp/dependencycheck/suppression/SuppressionHandlerTest.html create mode 100644 xref-test/org/owasp/dependencycheck/suppression/SuppressionParserTest.html create mode 100644 xref-test/org/owasp/dependencycheck/suppression/SuppressionRuleTest.html create mode 100644 xref-test/org/owasp/dependencycheck/suppression/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/suppression/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/taskdefs/DependencyCheckTaskTest.html create mode 100644 xref-test/org/owasp/dependencycheck/taskdefs/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/taskdefs/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/utils/BaseTest.html create mode 100644 xref-test/org/owasp/dependencycheck/utils/ChecksumTest.html create mode 100644 xref-test/org/owasp/dependencycheck/utils/DateUtilTest.html create mode 100644 xref-test/org/owasp/dependencycheck/utils/DependencyVersionTest.html create mode 100644 xref-test/org/owasp/dependencycheck/utils/DependencyVersionUtilTest.html create mode 100644 xref-test/org/owasp/dependencycheck/utils/DownloaderIntegrationTest.html create mode 100644 xref-test/org/owasp/dependencycheck/utils/DownloaderTest.html create mode 100644 xref-test/org/owasp/dependencycheck/utils/FileUtilsTest.html create mode 100644 xref-test/org/owasp/dependencycheck/utils/FilterTest.html create mode 100644 xref-test/org/owasp/dependencycheck/utils/SettingsTest.html create mode 100644 xref-test/org/owasp/dependencycheck/utils/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/utils/package-summary.html create mode 100644 xref-test/org/owasp/dependencycheck/xml/pom/ModelTest.html create mode 100644 xref-test/org/owasp/dependencycheck/xml/pom/PomUtilsTest.html create mode 100644 xref-test/org/owasp/dependencycheck/xml/pom/package-frame.html create mode 100644 xref-test/org/owasp/dependencycheck/xml/pom/package-summary.html create mode 100644 xref-test/overview-frame.html create mode 100644 xref-test/overview-summary.html create mode 100644 xref-test/stylesheet.css create mode 100644 xref/allclasses-frame.html create mode 100644 xref/index.html create mode 100644 xref/org/owasp/dependencycheck/App.html create mode 100644 xref/org/owasp/dependencycheck/CliParser.html create mode 100644 xref/org/owasp/dependencycheck/Engine.html create mode 100644 xref/org/owasp/dependencycheck/InvalidScanPathException.html create mode 100644 xref/org/owasp/dependencycheck/agent/DependencyCheckScanAgent.html create mode 100644 xref/org/owasp/dependencycheck/agent/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/agent/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/AbstractAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/AbstractFileTypeAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/AbstractSuppressionAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/AnalysisPhase.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/Analyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/AnalyzerService.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/ArchiveAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/AssemblyAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/AutoconfAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/CMakeAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/CPEAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/CentralAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/ComposerLockAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/CpeSuppressionAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/DependencyBundlingAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/FalsePositiveAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/FileNameAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/FileTypeAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/HintAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/JarAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/NexusAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/NodePackageAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/NuspecAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/NvdCveAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/OpenSSLAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/PythonDistributionAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/PythonPackageAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/RubyGemspecAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/VulnerabilitySuppressionAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/exception/AnalysisException.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/exception/ArchiveExtractionException.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/exception/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/exception/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/analyzer/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/ant/logging/AntLoggerAdapter.html create mode 100644 xref/org/owasp/dependencycheck/ant/logging/AntLoggerFactory.html create mode 100644 xref/org/owasp/dependencycheck/ant/logging/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/ant/logging/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/data/central/CentralSearch.html create mode 100644 xref/org/owasp/dependencycheck/data/central/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/data/central/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/data/composer/ComposerDependency.html create mode 100644 xref/org/owasp/dependencycheck/data/composer/ComposerException.html create mode 100644 xref/org/owasp/dependencycheck/data/composer/ComposerLockParser.html create mode 100644 xref/org/owasp/dependencycheck/data/composer/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/data/composer/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/data/cpe/CpeMemoryIndex.html create mode 100644 xref/org/owasp/dependencycheck/data/cpe/Fields.html create mode 100644 xref/org/owasp/dependencycheck/data/cpe/IndexEntry.html create mode 100644 xref/org/owasp/dependencycheck/data/cpe/IndexException.html create mode 100644 xref/org/owasp/dependencycheck/data/cpe/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/data/cpe/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/data/cwe/CweDB.html create mode 100644 xref/org/owasp/dependencycheck/data/cwe/CweHandler.html create mode 100644 xref/org/owasp/dependencycheck/data/cwe/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/data/cwe/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/data/lucene/AbstractTokenizingFilter.html create mode 100644 xref/org/owasp/dependencycheck/data/lucene/AlphaNumericTokenizer.html create mode 100644 xref/org/owasp/dependencycheck/data/lucene/DependencySimilarity.html create mode 100644 xref/org/owasp/dependencycheck/data/lucene/FieldAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/data/lucene/LuceneUtils.html create mode 100644 xref/org/owasp/dependencycheck/data/lucene/SearchFieldAnalyzer.html create mode 100644 xref/org/owasp/dependencycheck/data/lucene/TokenPairConcatenatingFilter.html create mode 100644 xref/org/owasp/dependencycheck/data/lucene/UrlTokenizingFilter.html create mode 100644 xref/org/owasp/dependencycheck/data/lucene/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/data/lucene/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/data/nexus/MavenArtifact.html create mode 100644 xref/org/owasp/dependencycheck/data/nexus/NexusSearch.html create mode 100644 xref/org/owasp/dependencycheck/data/nexus/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/data/nexus/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/data/nuget/NugetPackage.html create mode 100644 xref/org/owasp/dependencycheck/data/nuget/NuspecParseException.html create mode 100644 xref/org/owasp/dependencycheck/data/nuget/NuspecParser.html create mode 100644 xref/org/owasp/dependencycheck/data/nuget/XPathNuspecParser.html create mode 100644 xref/org/owasp/dependencycheck/data/nuget/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/data/nuget/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/data/nvdcve/ConnectionFactory.html create mode 100644 xref/org/owasp/dependencycheck/data/nvdcve/CorruptDatabaseException.html create mode 100644 xref/org/owasp/dependencycheck/data/nvdcve/CveDB.html create mode 100644 xref/org/owasp/dependencycheck/data/nvdcve/DatabaseException.html create mode 100644 xref/org/owasp/dependencycheck/data/nvdcve/DatabaseProperties.html create mode 100644 xref/org/owasp/dependencycheck/data/nvdcve/DriverLoadException.html create mode 100644 xref/org/owasp/dependencycheck/data/nvdcve/DriverLoader.html create mode 100644 xref/org/owasp/dependencycheck/data/nvdcve/DriverShim.html create mode 100644 xref/org/owasp/dependencycheck/data/nvdcve/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/data/nvdcve/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/data/update/BaseUpdater.html create mode 100644 xref/org/owasp/dependencycheck/data/update/CachedWebDataSource.html create mode 100644 xref/org/owasp/dependencycheck/data/update/CpeUpdater.html create mode 100644 xref/org/owasp/dependencycheck/data/update/EngineVersionCheck.html create mode 100644 xref/org/owasp/dependencycheck/data/update/NvdCveUpdater.html create mode 100644 xref/org/owasp/dependencycheck/data/update/UpdateService.html create mode 100644 xref/org/owasp/dependencycheck/data/update/cpe/CPEHandler.html create mode 100644 xref/org/owasp/dependencycheck/data/update/cpe/Cpe.html create mode 100644 xref/org/owasp/dependencycheck/data/update/cpe/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/data/update/cpe/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/data/update/exception/InvalidDataException.html create mode 100644 xref/org/owasp/dependencycheck/data/update/exception/UpdateException.html create mode 100644 xref/org/owasp/dependencycheck/data/update/exception/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/data/update/exception/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/data/update/nvd/DownloadTask.html create mode 100644 xref/org/owasp/dependencycheck/data/update/nvd/NvdCve12Handler.html create mode 100644 xref/org/owasp/dependencycheck/data/update/nvd/NvdCve20Handler.html create mode 100644 xref/org/owasp/dependencycheck/data/update/nvd/NvdCveInfo.html create mode 100644 xref/org/owasp/dependencycheck/data/update/nvd/ProcessTask.html create mode 100644 xref/org/owasp/dependencycheck/data/update/nvd/UpdateableNvdCve.html create mode 100644 xref/org/owasp/dependencycheck/data/update/nvd/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/data/update/nvd/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/data/update/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/data/update/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/dependency/Confidence.html create mode 100644 xref/org/owasp/dependencycheck/dependency/Dependency.html create mode 100644 xref/org/owasp/dependencycheck/dependency/Evidence.html create mode 100644 xref/org/owasp/dependencycheck/dependency/EvidenceCollection.html create mode 100644 xref/org/owasp/dependencycheck/dependency/Identifier.html create mode 100644 xref/org/owasp/dependencycheck/dependency/Reference.html create mode 100644 xref/org/owasp/dependencycheck/dependency/Vulnerability.html create mode 100644 xref/org/owasp/dependencycheck/dependency/VulnerabilityComparator.html create mode 100644 xref/org/owasp/dependencycheck/dependency/VulnerableSoftware.html create mode 100644 xref/org/owasp/dependencycheck/dependency/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/dependency/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/exception/NoDataException.html create mode 100644 xref/org/owasp/dependencycheck/exception/ScanAgentException.html create mode 100644 xref/org/owasp/dependencycheck/exception/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/exception/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/maven/AggregateMojo.html create mode 100644 xref/org/owasp/dependencycheck/maven/BaseDependencyCheckMojo.html create mode 100644 xref/org/owasp/dependencycheck/maven/CheckMojo.html create mode 100644 xref/org/owasp/dependencycheck/maven/Engine.html create mode 100644 xref/org/owasp/dependencycheck/maven/PurgeMojo.html create mode 100644 xref/org/owasp/dependencycheck/maven/UpdateMojo.html create mode 100644 xref/org/owasp/dependencycheck/maven/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/maven/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/maven/slf4j/MavenLoggerAdapter.html create mode 100644 xref/org/owasp/dependencycheck/maven/slf4j/MavenLoggerFactory.html create mode 100644 xref/org/owasp/dependencycheck/maven/slf4j/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/maven/slf4j/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/reporting/EscapeTool.html create mode 100644 xref/org/owasp/dependencycheck/reporting/ReportGenerator.html create mode 100644 xref/org/owasp/dependencycheck/reporting/VelocityLoggerRedirect.html create mode 100644 xref/org/owasp/dependencycheck/reporting/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/reporting/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/suppression/PropertyType.html create mode 100644 xref/org/owasp/dependencycheck/suppression/SuppressionErrorHandler.html create mode 100644 xref/org/owasp/dependencycheck/suppression/SuppressionHandler.html create mode 100644 xref/org/owasp/dependencycheck/suppression/SuppressionParseException.html create mode 100644 xref/org/owasp/dependencycheck/suppression/SuppressionParser.html create mode 100644 xref/org/owasp/dependencycheck/suppression/SuppressionRule.html create mode 100644 xref/org/owasp/dependencycheck/suppression/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/suppression/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/taskdefs/Check.html create mode 100644 xref/org/owasp/dependencycheck/taskdefs/Purge.html create mode 100644 xref/org/owasp/dependencycheck/taskdefs/Update.html create mode 100644 xref/org/owasp/dependencycheck/taskdefs/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/taskdefs/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/utils/Checksum.html create mode 100644 xref/org/owasp/dependencycheck/utils/DBUtils.html create mode 100644 xref/org/owasp/dependencycheck/utils/DateUtil.html create mode 100644 xref/org/owasp/dependencycheck/utils/DependencyVersion.html create mode 100644 xref/org/owasp/dependencycheck/utils/DependencyVersionUtil.html create mode 100644 xref/org/owasp/dependencycheck/utils/DownloadFailedException.html create mode 100644 xref/org/owasp/dependencycheck/utils/Downloader.html create mode 100644 xref/org/owasp/dependencycheck/utils/ExtractionException.html create mode 100644 xref/org/owasp/dependencycheck/utils/ExtractionUtil.html create mode 100644 xref/org/owasp/dependencycheck/utils/FileFilterBuilder.html create mode 100644 xref/org/owasp/dependencycheck/utils/FileUtils.html create mode 100644 xref/org/owasp/dependencycheck/utils/Filter.html create mode 100644 xref/org/owasp/dependencycheck/utils/InvalidSettingException.html create mode 100644 xref/org/owasp/dependencycheck/utils/NonClosingStream.html create mode 100644 xref/org/owasp/dependencycheck/utils/Pair.html create mode 100644 xref/org/owasp/dependencycheck/utils/Settings.html create mode 100644 xref/org/owasp/dependencycheck/utils/URLConnectionFactory.html create mode 100644 xref/org/owasp/dependencycheck/utils/URLConnectionFailureException.html create mode 100644 xref/org/owasp/dependencycheck/utils/UrlStringUtils.html create mode 100644 xref/org/owasp/dependencycheck/utils/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/utils/package-summary.html create mode 100644 xref/org/owasp/dependencycheck/xml/pom/License.html create mode 100644 xref/org/owasp/dependencycheck/xml/pom/Model.html create mode 100644 xref/org/owasp/dependencycheck/xml/pom/PomHandler.html create mode 100644 xref/org/owasp/dependencycheck/xml/pom/PomParseException.html create mode 100644 xref/org/owasp/dependencycheck/xml/pom/PomParser.html create mode 100644 xref/org/owasp/dependencycheck/xml/pom/PomUtils.html create mode 100644 xref/org/owasp/dependencycheck/xml/pom/package-frame.html create mode 100644 xref/org/owasp/dependencycheck/xml/pom/package-summary.html create mode 100644 xref/org/slf4j/impl/StaticLoggerBinder.html create mode 100644 xref/org/slf4j/impl/package-frame.html create mode 100644 xref/org/slf4j/impl/package-summary.html create mode 100644 xref/overview-frame.html create mode 100644 xref/overview-summary.html create mode 100644 xref/stylesheet.css diff --git a/SampleReport.html b/SampleReport.html deleted file mode 100644 index d31014370..000000000 --- a/SampleReport.html +++ /dev/null @@ -1,15509 +0,0 @@ - - - - - - - - Dependency-Check Report - - - - - - - - - - -
- -

Dependency-Check is an open source tool performing a best effort analysis of 3rd party dependencies; -false positives and false negatives may exist in the analysis performed by the tool. Use of the tool and -the reporting provided constitutes acceptance for use in an AS IS condition, and there are NO warranties, -implied or otherwise, with regard to the analysis or its use. Any use of the tool and the reporting provided -is at the user’s risk. In no event shall the copyright holder or OWASP be held liable for any damages whatsoever -arising out of or in connection with the use of this tool, the analysis performed, or the resulting report.

- -

Project: DependencyCheck

-
- - Scan Information (show all):
-
    -
  • dependency-check version: 1.2.11
  • -
  • Report Generated On: May 11, 2015 at 20:38:49 EDT
  • -
  • Dependencies Scanned: 171
  • -
  • Vulnerable Dependencies: 29
  • -
  • Vulnerabilities Found: 126
  • -
  • Vulnerabilities Suppressed: 0
  • -
  • ...
  • - - - - - - - - - - - - - - - - - - -

- Display: Showing Vulnerable Dependencies (click to show all)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DependencyCPEGAVHighest SeverityCVE CountCPE ConfidenceEvidence Count
annogen-0.1.0.jar - annogen:annogen:0.1.0 - -   - 08
ant-1.8.2.jar - org.apache.ant:ant:1.8.2 - -   - 011
aopalliance-1.0.jar - aopalliance:aopalliance:1.0 - -   - 09
aspectjrt-1.6.5.jar - org.aspectj:aspectjrt:1.6.5 - -   - 010
aspectjweaver-1.6.5.jar - org.aspectj:aspectjweaver:1.6.5 - -   - 016
axiom-api-1.2.7.jar - org.apache.ws.commons.axiom:axiom-api:1.2.7 - -   - 016
axiom-dom-1.2.7.jar - org.apache.ws.commons.axiom:axiom-dom:1.2.7 - -   - 017
axiom-impl-1.2.7.jar - org.apache.ws.commons.axiom:axiom-impl:1.2.7 - -   - 017
axis-1.4.jar - cpe:/a:apache:axis:1.4 - axis:axis:1.4 - - Medium - 2HIGHEST10
axis2-kernel-1.4.1.jar - cpe:/a:apache:axis2:1.4.1 - org.apache.axis2:axis2-kernel:1.4.1 - - High - 6HIGHEST15
backport-util-concurrent-3.1.jar - backport-util-concurrent:backport-util-concurrent:3.1 - -   - 012
commons-cli-1.2.jar - commons-cli:commons-cli:1.2 - -   - 022
commons-codec-1.2.jar - commons-codec:commons-codec:1.2 - -   - 016
commons-fileupload-1.2.1.jar - cpe:/a:apache:commons_fileupload:1.2.1 - commons-fileupload:commons-fileupload:1.2.1 - - Medium - 2HIGHEST16
commons-httpclient-3.1.jar - cpe:/a:apache:commons-httpclient:3.1 -
- cpe:/a:apache:httpclient:3.1 -
commons-httpclient:commons-httpclient:3.1 - - Medium - 1LOW11
commons-logging-1.1.1.jar - commons-logging:commons-logging:1.1.1 - -   - 019
commons-pool-1.5.3.jar - commons-pool:commons-pool:1.5.3 - -   - 022
commons-validator-1.4.0.jar - commons-validator:commons-validator:1.4.0 - -   - 023
daytrader-ear-2.1.7.ear - -   - 01
daytrader-ear-2.1.7.ear: dt-ejb.jar - cpe:/a:apache:geronimo:2.1.7 - org.apache.geronimo.daytrader:daytrader-ejb:2.1.7 - - High - 2HIGHEST10
daytrader-ear-2.1.7.ear: geronimo-jaxrpc_1.1_spec-2.0.0.jar - cpe:/a:apache:geronimo:2.0 - org.apache.geronimo.specs:geronimo-jaxrpc_1.1_spec:2.0.0 - - High - 4HIGHEST11
daytrader-ear-2.1.7.ear: streamer.jar - cpe:/a:apache:geronimo:2.1.7 - org.apache.geronimo.daytrader:daytrader-streamer:2.1.7 - - High - 2HIGHEST11
daytrader-ear-2.1.7.ear: web.war - -   - 05
daytrader-ear-2.1.7.ear: wsappclient.jar - cpe:/a:apache:geronimo:2.1.7 - org.apache.geronimo.daytrader:daytrader-wsappclient:2.1.7 - - High - 2HIGHEST11
dojo-war-1.3.0.war - cpe:/a:dojo_toolkit:dojo_toolkit:1.3.0 -
- cpe:/a:dojotoolkit:dojo:1.3 -
org.dojotoolkit:dojo-war:1.3.0 - - High - 5HIGHEST7
dwr-1.1.1.jar - cpe:/a:getahead:direct_web_remoting:1.1.1 - uk.ltd.getahead:dwr:1.1.1 - - High - 3HIGHEST15
ehcache-core-2.2.0.jar - net.sf.ehcache:ehcache-core:2.2.0 - -   - 012
FileHelpers.2.0.0.0.nupkg - -   - 02
FileHelpers.2.0.0.0.nupkg: FileHelpers.nuspec - -   - 05
FileHelpers.2.0.0.0.nupkg: FileHelpers.dll - -   - 04
FileHelpers.2.0.0.0.nupkg: FileHelpers.ExcelStorage.dll - -   - 04
FileHelpers.2.0.0.0.nupkg: Interop.Excel.dll - -   - 03
FileHelpers.2.0.0.0.nupkg: Interop.Office.dll - -   - 03
freemarker-2.3.12.jar - org.freemarker:freemarker:2.3.12 - -   - 013
geronimo-javamail_1.4_spec-1.2.jar - cpe:/a:apache:geronimo:1.2 - org.apache.geronimo.specs:geronimo-javamail_1.4_spec:1.2 - - High - 2HIGHEST13
geronimo-jms_1.1_spec-1.1.1.jar - cpe:/a:apache:geronimo:1.1.1 - org.apache.geronimo.specs:geronimo-jms_1.1_spec:1.1.1 - - High - 2HIGHEST11
geronimo-jpa_2.0_spec-1.1.jar - cpe:/a:apache:geronimo:1.1 - org.apache.geronimo.specs:geronimo-jpa_2.0_spec:1.1 - - High - 2HIGHEST16
geronimo-stax-api_1.0_spec-1.0.1.jar - cpe:/a:apache:geronimo:1.0.1 - org.apache.geronimo.specs:geronimo-stax-api_1.0_spec:1.0.1 - - High - 2LOW15
guice-3.0.jar - com.google.inject:guice:3.0 - -   - 020
hazelcast-2.5.jar - com.hazelcast:hazelcast:2.5 - -   - 019
hibernate3.jar - -   - 08
hibernate3.jar\META-INF/maven/org.hibernate/hibernate-c3p0/pom.xml - org.hibernate:hibernate-c3p0:3.6.6.Final - -   - 06
hibernate3.jar\META-INF/maven/org.hibernate/hibernate-commons-annotations/pom.xml - org.hibernate:hibernate-commons-annotations:3.2.0.Final - -   - 05
hibernate3.jar\META-INF/maven/org.hibernate/hibernate-core/pom.xml - org.hibernate:hibernate-core:3.6.6.Final - -   - 06
hibernate3.jar\META-INF/maven/org.hibernate/hibernate-ehcache/pom.xml - org.hibernate:hibernate-ehcache:3.6.6.Final - -   - 06
hibernate3.jar\META-INF/maven/org.hibernate/hibernate-entitymanager/pom.xml - org.hibernate:hibernate-entitymanager:3.6.6.Final - -   - 06
hibernate3.jar\META-INF/maven/org.hibernate/hibernate-envers/pom.xml - org.hibernate:hibernate-envers:3.6.6.Final - -   - 06
hibernate3.jar\META-INF/maven/org.hibernate/hibernate-infinispan/pom.xml - org.hibernate:hibernate-infinispan:3.6.6.Final - -   - 06
hibernate3.jar\META-INF/maven/org.hibernate/hibernate-jbosscache/pom.xml - org.hibernate:hibernate-jbosscache:3.6.6.Final - -   - 04
hibernate3.jar\META-INF/maven/org.hibernate/hibernate-oscache/pom.xml - org.hibernate:hibernate-oscache:3.6.6.Final - -   - 06
hibernate3.jar\META-INF/maven/org.hibernate/hibernate-proxool/pom.xml - org.hibernate:hibernate-proxool:3.6.6.Final - -   - 06
hibernate3.jar\META-INF/maven/org.hibernate/hibernate-swarmcache/pom.xml - org.hibernate:hibernate-swarmcache:3.6.6.Final - -   - 06
hibernate3.jar\META-INF/maven/org.hibernate/hibernate-testing/pom.xml - org.hibernate:hibernate-testing:3.6.6.Final - -   - 06
httpcore-4.0-beta1.jar - org.apache.httpcomponents:httpcore:4.0-beta1 - -   - 012
httpcore-nio-4.0-beta1.jar - org.apache.httpcomponents:httpcore-nio:4.0-beta1 - -   - 013
javax.inject-1.jar - javax.inject:javax.inject:1 - -   - 09
jaxb-xercesImpl-1.5.jar - activesoap:jaxb-xercesImpl:1.5 - -   - 019
jaxen-1.1.1.jar - jaxen:jaxen:1.1.1 - -   - 015
jetty-6.1.0.jar - cpe:/a:jetty:jetty:6.1.0 -
- cpe:/a:mortbay:jetty:6.1.0 -
- cpe:/a:mortbay_jetty:jetty:6.1 -
org.mortbay.jetty:jetty:6.1.0 - - High - 10HIGHEST12
log4net.2.0.3.nuspec - cpe:/a:apache:log4net:2.0.3 - -   - 0LOW5
log4net.dll - cpe:/a:apache:log4net:1.2.13.0 - -   - 0LOW5
mail-1.4.jar - cpe:/a:sun:javamail:1.4 - javax.mail:mail:1.4 - - Medium - 1LOW17
maven-scm-api-1.8.1.jar - org.apache.maven.scm:maven-scm-api:1.8.1 - -   - 013
maven-scm-provider-cvs-commons-1.8.1.jar - org.apache.maven.scm:maven-scm-provider-cvs-commons:1.8.1 - -   - 015
maven-scm-provider-cvsexe-1.8.1.jar - org.apache.maven.scm:maven-scm-provider-cvsexe:1.8.1 - -   - 014
neethi-2.0.4.jar - cpe:/a:apache:apache_test:2.0.4 - org.apache.neethi:neethi:2.0.4 - -   - 0LOW21
ognl-2.6.11.jar - opensymphony:ognl:2.6.11 - -   - 08
openjpa-2.0.1.jar - cpe:/a:apache:openjpa:2.0.1 - org.apache.openjpa:openjpa:2.0.1 - - High - 1HIGHEST14
org.mortbay.jetty.jar - cpe:/a:jetty:jetty:4.2.27 -
- cpe:/a:mortbay:jetty:4.2.27 -
- cpe:/a:mortbay_jetty:jetty:4.2 -
jetty:jetty:4.2.27 - - High - 7HIGHEST9
org.mortbay.jmx.jar - -   - 03
plexus-utils-3.0.7.jar - org.codehaus.plexus:plexus-utils:3.0.7 - -   - 014
EggTest-0.0.1-py2.7.egg - -   - 05
eggtest/__init__.py - -   - 06
Django-1.7.2-py2.py3-none-any.whl - cpe:/a:djangoproject:django:1.7.2 - - Medium - 7HIGHEST6
eggtest/__init__.py - -   - 06
Django-1.7.2.dist-info/METADATA - -   - 06
EggTest.egg-info/PKG-INFO - -   - 05
regexp-1.3.jar - regexp:regexp:1.3 - -   - 07
serp-1.13.1.jar - net.sourceforge.serp:serp:1.13.1 - -   - 010
servlet-api-2.5.jar - javax.servlet:servlet-api:2.5 - -   - 012
slf4j-api-1.5.11.jar - org.slf4j:slf4j-api:1.5.11 - -   - 016
spring-core-2.5.5.jar - cpe:/a:springsource:spring_framework:2.5.5 -
- cpe:/a:vmware:springsource_spring_framework:2.5.5 -
org.springframework:spring-core:2.5.5 - - High - 7HIGHEST19
spring-core-3.0.0.RELEASE.jar - cpe:/a:springsource:spring_framework:3.0.0 -
- cpe:/a:vmware:springsource_spring_framework:3.0.0 -
org.springframework:spring-core:3.0.0.RELEASE - - High - 8HIGHEST20
spring-retry-1.1.0.RELEASE.jar - cpe:/a:vmware:springsource_spring_framework:1.1.0 - org.springframework.retry:spring-retry:1.1.0.RELEASE - -   - 0LOW17
spring-security-core-3.0.0.RELEASE.jar - cpe:/a:vmware:springsource_spring_security:3.0.0 - org.springframework.security:spring-security-core:3.0.0.RELEASE - - Medium - 5HIGHEST16
stagedhttp-modified.tar: commons-httpclient-2.0.jar - cpe:/a:apache:commons-httpclient:2.0 -
- cpe:/a:apache:httpclient:2.0 -
commons-httpclient:commons-httpclient:2.0 - - Medium - 1LOW13
stagedhttp-modified.tar: commons-logging.jar - commons-logging:commons-logging:1.0.3 - -   - 015
stagedhttp-modified.tar: dom4j.jar - dom4j:dom4j:1.4 - -   - 012
stagedhttp-modified.tar: jgroups-all.jar - jgroups:jgroups-all:2.2.7 - -   - 06
stagedhttp-modified.tar: log4j.jar - -   - 03
stagedhttp-modified.tar: mail.jar - cpe:/a:sun:javamail:1.3.2 - - Medium - 3HIGH11
stagedhttp-modified.tar: serializer.jar - -   - 04
stagedhttp-modified.tar: xalan.jar - -   - 02
stagedhttp-modified.tar: xmlsec-1.3.0.jar - org.codehaus.xfire:xmlsec:1.3.0 - -   - 013
stagedhttp-modified.tar: xss4j.jar - -   - 03
struts.jar - cpe:/a:apache:struts:1.2.7 - struts:struts:1.2.7 - - High - 7HIGHEST10
struts2-core-2.1.2.jar - cpe:/a:apache:struts:2.1.2 - org.apache.struts:struts2-core:2.1.2 - - High - 26HIGHEST11
uber-1.0-SNAPSHOT.jar - -   - 01
uber-1.0-SNAPSHOT.jar\META-INF/maven/com.google.guava/guava/pom.xml - com.google.guava:guava:11.0.1 - -   - 06
uber-1.0-SNAPSHOT.jar\META-INF/maven/com.googlecode.jtype/jtype/pom.xml - com.googlecode.jtype:jtype:0.1.1 - -   - 04
uber-1.0-SNAPSHOT.jar\META-INF/maven/com.sun.jersey/jersey-core/pom.xml - com.sun.jersey:jersey-core:1.11 - -   - 05
uber-1.0-SNAPSHOT.jar\META-INF/maven/com.sun.jersey/jersey-server/pom.xml - com.sun.jersey:jersey-server:1.11 - -   - 05
uber-1.0-SNAPSHOT.jar\META-INF/maven/com.sun.jersey/jersey-servlet/pom.xml - com.sun.jersey:jersey-servlet:1.11 - -   - 05
uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.dropwizard/dropwizard-core/pom.xml - com.yammer.dropwizard:dropwizard-core:0.1.3 - -   - 05
uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-annotation/pom.xml - com.yammer.metrics:metrics-annotation:2.0.0-RC0 - -   - 06
uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-core/pom.xml - com.yammer.metrics:metrics-core:2.0.0-RC0 - -   - 05
uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-jersey/pom.xml - com.yammer.metrics:metrics-jersey:2.0.0-RC0 - -   - 06
uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-jetty/pom.xml - cpe:/a:jetty:jetty:2.0.0.rc0 - com.yammer.metrics:metrics-jetty:2.0.0-RC0 - -   - 0LOW4
uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-log4j/pom.xml - com.yammer.metrics:metrics-log4j:2.0.0-RC0 - -   - 05
uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-servlet/pom.xml - com.yammer.metrics:metrics-servlet:2.0.0-RC0 - -   - 05
uber-1.0-SNAPSHOT.jar\META-INF/maven/commons-io/commons-io/pom.xml - commons-io:commons-io:1.3.2 - -   - 06
uber-1.0-SNAPSHOT.jar\META-INF/maven/javax.validation/validation-api/pom.xml - javax.validation:validation-api:1.0.0.GA - -   - 04
uber-1.0-SNAPSHOT.jar\META-INF/maven/log4j/log4j/pom.xml - log4j:log4j:1.2.16 - -   - 05
uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-continuation/pom.xml - cpe:/a:jetty:jetty:7.6.0.rc4 - org.eclipse.jetty:jetty-continuation:7.6.0.RC4 - -   - 0LOW3
uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-http/pom.xml - cpe:/a:jetty:jetty:7.6.0.rc4 - org.eclipse.jetty:jetty-http:7.6.0.RC4 - -   - 0LOW3
uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-io/pom.xml - cpe:/a:jetty:jetty:7.6.0.rc4 - org.eclipse.jetty:jetty-io:7.6.0.RC4 - -   - 0LOW3
uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-security/pom.xml - cpe:/a:jetty:jetty:7.6.0.rc4 - org.eclipse.jetty:jetty-security:7.6.0.RC4 - -   - 0LOW3
uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-server/pom.xml - cpe:/a:jetty:jetty:7.6.0.rc4 - org.eclipse.jetty:jetty-server:7.6.0.RC4 - -   - 0LOW3
uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-servlet/pom.xml - cpe:/a:jetty:jetty:7.6.0.rc4 - org.eclipse.jetty:jetty-servlet:7.6.0.RC4 - -   - 0LOW3
uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-util/pom.xml - cpe:/a:jetty:jetty:7.6.0.rc4 - org.eclipse.jetty:jetty-util:7.6.0.RC4 - -   - 0LOW3
uber-1.0-SNAPSHOT.jar\META-INF/maven/org.hibernate/hibernate-validator/pom.xml - cpe:/a:hibernate:hibernate_validator:4.2.0 - org.hibernate:hibernate-validator:4.2.0.Final - - Medium - 1HIGHEST3
uber-1.0-SNAPSHOT.jar\META-INF/maven/org.owasp.dependency-check/uber/pom.xml - org.owasp.dependency-check:uber:1.0-SNAPSHOT - -   - 03
uber-1.0-SNAPSHOT.jar\META-INF/maven/org.slf4j/jul-to-slf4j/pom.xml - org.slf4j:jul-to-slf4j:1.6.4 - -   - 06
uber-1.0-SNAPSHOT.jar\META-INF/maven/org.slf4j/slf4j-api/pom.xml - org.slf4j:slf4j-api:1.6.4 - -   - 06
uber-1.0-SNAPSHOT.jar\META-INF/maven/org.slf4j/slf4j-log4j12/pom.xml - org.slf4j:slf4j-log4j12:1.6.4 - -   - 06
uber-1.0-SNAPSHOT.jar\META-INF/maven/org.yaml/snakeyaml/pom.xml - org.yaml:snakeyaml:1.9 - -   - 04
velocity-1.7.jar - org.apache.velocity:velocity:1.7 - -   - 023
war-4.0.war - org.glassfish.main.admingui:war:4.0 - -   - 07
war-4.0.war: commons-fileupload-1.1.1.jar - cpe:/a:apache:commons_fileupload:1.1.1 - commons-fileupload:commons-fileupload:1.1.1 - - Medium - 2HIGHEST13
war-4.0.war: commons-io-1.3.1.jar - commons-io:commons-io:1.3.1 - -   - 017
war-4.0.war: dojo-ajax-nodemo-0.4.1.jar - cpe:/a:sun:woodstock:0.4.1 - com.sun.woodstock.dependlibs:dojo-ajax-nodemo:0.4.1 - -   - 0LOW8
war-4.0.war: json-1.0.jar - com.sun.woodstock.dependlibs:json:1.0 - -   - 06
war-4.0.war: prototype-1.5.0.jar - cpe:/a:sun:woodstock:1.5.0 - com.sun.woodstock.dependlibs:prototype:1.5.0 - -   - 0LOW8
war-4.0.war: webui-jsf-4.0.2.10.jar - com.sun.woodstock:webui-jsf:4.0.2.10 - -   - 012
war-4.0.war: webui-jsf-suntheme-4.0.2.10.jar - com.sun.woodstock:webui-jsf-suntheme:4.0.2.10 - -   - 010
war-4.0.war: console-core-4.0.jar - org.glassfish.main.admingui:console-core:4.0 - -   - 013
woden-api-1.0M8.jar - org.apache.woden:woden-api:1.0M8 - -   - 017
woden-impl-dom-1.0M8.jar - org.apache.woden:woden-impl-dom:1.0M8 - -   - 015
wsdl4j-1.6.2.jar - wsdl4j:wsdl4j:1.6.2 - -   - 014
wstx-asl-3.2.4.jar - org.codehaus.woodstox:wstx-asl:3.2.4 - -   - 018
xalan-2.7.0.jar - xalan:xalan:2.7.0 - -   - 07
xercesImpl-2.8.1.jar - xerces:xercesImpl:2.8.1 - -   - 011
xml-apis-1.3.04.jar - xml-apis:xml-apis:1.3.04 - -   - 011
xmlParserAPIs-2.6.0.jar - xerces:xmlParserAPIs:2.6.0 - -   - 07
XmlSchema-1.4.2.jar - org.apache.ws.commons.schema:XmlSchema:1.4.2 - -   - 017
xwork-2.1.1.jar - cpe:/a:opensymphony:xwork:2.1.1 - com.opensymphony:xwork:2.1.1 - - Medium - 3HIGHEST14
-

Dependencies

-

annogen-0.1.0.jar

-
-

- File Path: target\test-classes\annogen-0.1.0.jar
- MD5: ff275c3491ac6715ad9f6c22a9660503
- SHA1: a8de34ea7aa93765d24dc16ec9c61af5160bb899 -

- - -

Identifiers

-
- -
-
-

ant-1.8.2.jar

-
-

- File Path: target\test-classes\ant-1.8.2.jar
- MD5: 9463f65940f928d650a95aeb057a4e0a
- SHA1: fc33bf7cd8c5309dd7b81228e8626515ee42efd9 -

- - -

Identifiers

-
- -
-
-

aopalliance-1.0.jar

-
-

Description: AOP Alliance

-

- License:

Public Domain
- File Path: target\test-classes\aopalliance-1.0.jar
- MD5: 04177054e180d09e3998808efa0401c7
- SHA1: 0235ba8b489512805ac13a8f9ea77a1ca5ebe3e8 -

- - -

Identifiers

-
- -
-
-

aspectjrt-1.6.5.jar

-
-

Description: The runtime needed to execute a program using AspectJ

-

- License:

Eclipse Public License - v 1.0: http://www.eclipse.org/legal/epl-v10.html
- File Path: target\test-classes\aspectjrt-1.6.5.jar
- MD5: 71d9982a11bf94ac21221e2f052f3869
- SHA1: d35f32a63eb823dc2dffc7ee6fdb8e00a680d114 -

- - -

Identifiers

-
- -
-
-

aspectjweaver-1.6.5.jar

-
-

Description: The AspectJ weaver introduces advices to java classes

-

- License:

Eclipse Public License - v 1.0: http://www.eclipse.org/legal/epl-v10.html
- File Path: target\test-classes\aspectjweaver-1.6.5.jar
- MD5: 2fa7d0e921c46245d0e1b39f3ac365f5
- SHA1: 3ead0550dc9e2e0a5abd0fdb3116e636b59e4dc4 -

- - -

Identifiers

-
- -
-
-

axiom-api-1.2.7.jar

-
-

Description: The Axiom API

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\axiom-api-1.2.7.jar
- MD5: b06e716d6e5c3a0e3289d28126d01121
- SHA1: aa260a5f3fcaee3b95b551a9bbcbe63f56e5a2ad -

- - -

Identifiers

-
- -
-
-

axiom-dom-1.2.7.jar

-
-

Description: The Axiom DOM implementation.

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\axiom-dom-1.2.7.jar
- MD5: 9d1ff1229a42b8a93fc1db8c349ce830
- SHA1: 34f6d22244963bc617f3971a826104162eef1da4 -

- - -

Identifiers

-
- -
-
-

axiom-impl-1.2.7.jar

-
-

Description: The Axiom default implementation.

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\axiom-impl-1.2.7.jar
- MD5: b58763085089fe3d4d106386323ccd63
- SHA1: 378b814d1a6129a3e8175d95cf60d48c60ae9d51 -

- - -

Identifiers

-
- -
-
-

axis-1.4.jar

-
-

Description:  - An implementation of the SOAP ("Simple Object Access Protocol") submission to W3C. -

-

- License:

The Apache Software License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\axis-1.4.jar
- MD5: 03dcfdd88502505cc5a805a128bfdd8d
- SHA1: 94a9ce681a42d0352b3ad22659f67835e560d107 -

- - -

Identifiers

-
- -
- -
-

CVE-2014-3596  

-

Severity: - Medium -
CVSS Score: 5.8 -

-

The getCN function in Apache Axis 1.4 and earlier does not properly verify that the server hostname matches a domain name in the subject's Common Name (CN) or subjectAltName field of the X.509 certificate, which allows man-in-the-middle attackers to spoof SSL servers via a certificate with a subject that specifies a common name in a field that is not the CN field. NOTE: this issue exists because of an incomplete fix for CVE-2012-5784. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2012-5784  

-

Severity: - Medium -
CVSS Score: 5.8 -
CWE: CWE-20 Improper Input Validation -

-

Apache Axis 1.4 and earlier, as used in PayPal Payments Pro, PayPal Mass Pay, PayPal Transactional Information SOAP, the Java Message Service implementation in Apache ActiveMQ, and other products, does not verify that the server hostname matches a domain name in the subject's Common Name (CN) or subjectAltName field of the X.509 certificate, which allows man-in-the-middle attackers to spoof SSL servers via an arbitrary valid certificate. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

axis2-kernel-1.4.1.jar

-
-

Description: Core Parts of Axis 2.0. This includes Axis 2.0 engine, Client API, Addressing support, etc., -

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\axis2-kernel-1.4.1.jar
- MD5: f5f5255626be01918cece10d14f937df
- SHA1: fd59331a4bbc734c290744316e627ea343329f49 -

- - - - -

Identifiers

-
- -
- -
-

CVE-2012-5785  

-

Severity: - Medium -
CVSS Score: 5.8 -
CWE: CWE-20 Improper Input Validation -

-

Apache Axis2/Java 1.6.2 and earlier does not verify that the server hostname matches a domain name in the subject's Common Name (CN) or subjectAltName field of the X.509 certificate, which allows man-in-the-middle attackers to spoof SSL servers via an arbitrary valid certificate. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2012-5351  

-

Severity: - Medium -
CVSS Score: 6.4 -
CWE: CWE-287 Improper Authentication -

-

Apache Axis2 allows remote attackers to forge messages and bypass authentication via a SAML assertion that lacks a Signature element, aka a "Signature exclusion attack," a different vulnerability than CVE-2012-4418. -

-

- -

Vulnerable Software & Versions:

-

CVE-2012-4418  

-

Severity: - Medium -
CVSS Score: 5.8 -
CWE: CWE-287 Improper Authentication -

-

Apache Axis2 allows remote attackers to forge messages and bypass authentication via an "XML Signature wrapping attack." -

-

- -

Vulnerable Software & Versions:

-

CVE-2010-2103  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Cross-site scripting (XSS) vulnerability in axis2-admin/axis2-admin/engagingglobally in the administration console in Apache Axis2/Java 1.4.1, 1.5.1, and possibly other versions, as used in SAP Business Objects 12, 3com IMC, and possibly other products, allows remote attackers to inject arbitrary web script or HTML via the modules parameter. NOTE: some of these details are obtained from third party information. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2010-1632  

-

Severity: - High -
CVSS Score: 7.5 -
CWE: CWE-20 Improper Input Validation -

-

Apache Axis2 before 1.5.2, as used in IBM WebSphere Application Server (WAS) 7.0 through 7.0.0.12, IBM Feature Pack for Web Services 6.1.0.9 through 6.1.0.32, IBM Feature Pack for Web 2.0 1.0.1.0, Apache Synapse, Apache ODE, Apache Tuscany, Apache Geronimo, and other products, does not properly reject DTDs in SOAP messages, which allows remote attackers to read arbitrary files, send HTTP requests to intranet servers, or cause a denial of service (CPU and memory consumption) via a crafted DTD, as demonstrated by an entity declaration in a request to the Synapse SimpleStockQuoteService. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2010-0219  

-

Severity: - High -
CVSS Score: 10.0 -
CWE: CWE-255 Credentials Management -

-

Apache Axis2, as used in dswsbobje.war in SAP BusinessObjects Enterprise XI 3.2, CA ARCserve D2D r15, and other products, has a default password of axis2 for the admin account, which makes it easier for remote attackers to execute arbitrary code by uploading a crafted web service. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

backport-util-concurrent-3.1.jar

-
-

Description: Dawid Kurzyniec's backport of JSR 166

-

- License:

Public Domain: http://creativecommons.org/licenses/publicdomain
- File Path: target\test-classes\backport-util-concurrent-3.1.jar
- MD5: 748bb0cbf4780b2e3121dc9c12e10cd9
- SHA1: 682f7ac17fed79e92f8e87d8455192b63376347b -

- - -

Identifiers

-
- -
-
-

commons-cli-1.2.jar

-
-

Description:  - Commons CLI provides a simple API for presenting, processing and validating a command line interface. -

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\commons-cli-1.2.jar
- MD5: bfdcae1ff93f0c07d733f03bdce28c9e
- SHA1: 2bf96b7aa8b611c177d329452af1dc933e14501c -

- - - - -

Identifiers

-
- -
-
-

commons-codec-1.2.jar

-
-

Description: The codec package contains simple encoder and decoders for - various formats such as Base64 and Hexadecimal. In addition to these - widely used encoders and decoders, the codec package also maintains a - collection of phonetic encoding utilities.

-

- File Path: target\test-classes\commons-codec-1.2.jar
- MD5: 2617b220009f952bb9542af167d040cf
- SHA1: 397f4731a9f9b6eb1907e224911c77ea3aa27a8b -

- - -

Identifiers

-
- -
-
-

commons-fileupload-1.2.1.jar

-
-

Description:  - The FileUpload component provides a simple yet flexible means of adding support for multipart - file upload functionality to servlets and web applications. -

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\commons-fileupload-1.2.1.jar
- MD5: 951b36984148fc4f4e901f06ab382273
- SHA1: 384faa82e193d4e4b0546059ca09572654bc3970 -

- - - - -

Identifiers

-
- -
- -
-

CVE-2014-0050  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

MultipartStream.java in Apache Commons FileUpload before 1.3.1, as used in Apache Tomcat, JBoss Web, and other products, allows remote attackers to cause a denial of service (infinite loop and CPU consumption) via a crafted Content-Type header that bypasses a loop's intended exit conditions. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-0248  

-

Severity: - Low -
CVSS Score: 3.3 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

The default configuration of javax.servlet.context.tempdir in Apache Commons FileUpload 1.0 through 1.2.2 uses the /tmp directory for uploaded files, which allows local users to overwrite arbitrary files via an unspecified symlink attack. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

commons-httpclient-3.1.jar

-
-

Description: The HttpClient component supports the client-side of RFC 1945 (HTTP/1.0) and RFC 2616 (HTTP/1.1) , several related specifications (RFC 2109 (Cookies) , RFC 2617 (HTTP Authentication) , etc.), and provides a framework by which new request types (methods) or HTTP extensions can be created easily.

-

- License:

Apache License: http://www.apache.org/licenses/LICENSE-2.0
- File Path: target\test-classes\commons-httpclient-3.1.jar
- MD5: 8ad8c9229ef2d59ab9f59f7050e846a5
- SHA1: 964cd74171f427720480efdec40a7c7f6e58426a -

- - -

Identifiers

-
-
    -
  • maven: commons-httpclient:commons-httpclient:3.1 -   Confidence:HIGHEST -
  • -
  • cpe: cpe:/a:apache:commons-httpclient:3.1 -   Confidence:LOW -    -
  • -
  • cpe: cpe:/a:apache:httpclient:3.1 -   Confidence:LOW -    -
  • -
-
- -
-

CVE-2014-3577  

-

Severity: - Medium -
CVSS Score: 5.8 -

-

org.apache.http.conn.ssl.AbstractVerifier in Apache HttpComponents HttpClient before 4.3.5 and HttpAsyncClient before 4.0.2 does not properly verify that the server hostname matches a domain name in the subject's Common Name (CN) or subjectAltName field of the X.509 certificate, which allows man-in-the-middle attackers to spoof SSL servers via a "CN=" string in a field in the distinguished name (DN) of a certificate, as demonstrated by the "foo,CN=www.apache.org" string in the O field. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

commons-logging-1.1.1.jar

-
-

Description: Commons Logging is a thin adapter allowing configurable bridging to other, - well known logging systems.

-

- File Path: target\test-classes\commons-logging-1.1.1.jar
- MD5: ed448347fc0104034aa14c8189bf37de
- SHA1: 5043bfebc3db072ed80fbd362e7caf00e885d8ae -

- - - - -

Identifiers

-
- -
-
-

commons-pool-1.5.3.jar

-
-

Description: Commons Object Pooling Library

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\commons-pool-1.5.3.jar
- MD5: 0c6fdbaaac00387df7d738379422912e
- SHA1: 7ad440d63c6eea5e79f1737e264810c76258d042 -

- - -

Identifiers

-
- -
-
-

commons-validator-1.4.0.jar

-
-

Description:  - Commons Validator provides the building blocks for both client side validation and server side data validation. - It may be used standalone or with a framework like Struts. -

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\commons-validator-1.4.0.jar
- MD5: 8f381c168688704a85c550cf343a5ca2
- SHA1: 42fa1046955ade59f5354a1876cfc523cea33815 -

- - -

Identifiers

-
- -
-
-

daytrader-ear-2.1.7.ear

-
-

- File Path: target\test-classes\daytrader-ear-2.1.7.ear
- MD5: 9fa8c4e8072904589fc0d1a12e8eb291
- SHA1: 61868609eb138c41c0298373c9f8c19713fefa54 -

- - -

Identifiers

-
-
  • None
-
-
-

daytrader-ear-2.1.7.ear: dt-ejb.jar

-
-

Description: Daytrader EJBs

-

- File Path: target\test-classes\daytrader-ear-2.1.7.ear\dt-ejb.jar
- MD5: 26e92dbacad11c73f03ede043b113653
- SHA1: f2f7c05243ec8e5fb93efb35f5908bba88651bf3 -

- - -

Identifiers

-
- -
- -
-

CVE-2011-5034  

-

Severity: - High -
CVSS Score: 7.8 -
CWE: CWE-20 Improper Input Validation -

-

Apache Geronimo 2.2.1 and earlier computes hash values for form parameters without restricting the ability to trigger hash collisions predictably, which allows remote attackers to cause a denial of service (CPU consumption) by sending many crafted parameters. NOTE: this might overlap CVE-2011-4461. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2008-0732  

-

Severity: - Low -
CVSS Score: 2.1 -
CWE: CWE-59 Improper Link Resolution Before File Access ('Link Following') -

-

The init script for Apache Geronimo on SUSE Linux follows symlinks when performing a chown operation, which might allow local users to obtain access to unspecified files or directories. -

-

- -

Vulnerable Software & Versions:

-
-
-

daytrader-ear-2.1.7.ear: geronimo-jaxrpc_1.1_spec-2.0.0.jar

-
-

Description: Provides open-source implementations of Sun specifications.

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\daytrader-ear-2.1.7.ear\geronimo-jaxrpc_1.1_spec-2.0.0.jar
- MD5: 89b6273486a7c78353d919941f9f843c
- SHA1: 4fad4b521e38ef8d9a2434a2421a9a1dc7910285 -

- - -

Identifiers

-
- -
- -
-

CVE-2011-5034  

-

Severity: - High -
CVSS Score: 7.8 -
CWE: CWE-20 Improper Input Validation -

-

Apache Geronimo 2.2.1 and earlier computes hash values for form parameters without restricting the ability to trigger hash collisions predictably, which allows remote attackers to cause a denial of service (CPU consumption) by sending many crafted parameters. NOTE: this might overlap CVE-2011-4461. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2008-0732  

-

Severity: - Low -
CVSS Score: 2.1 -
CWE: CWE-59 Improper Link Resolution Before File Access ('Link Following') -

-

The init script for Apache Geronimo on SUSE Linux follows symlinks when performing a chown operation, which might allow local users to obtain access to unspecified files or directories. -

-

- -

Vulnerable Software & Versions:

-

CVE-2007-5797  

-

Severity: - High -
CVSS Score: 7.5 -
CWE: CWE-287 Improper Authentication -

-

SQLLoginModule in Apache Geronimo 2.0 through 2.1 does not throw an exception for a nonexistent username, which allows remote attackers to bypass authentication via a login attempt with any username not contained in the database. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2007-4548  

-

Severity: - High -
CVSS Score: 10.0 -
CWE: CWE-287 Improper Authentication -

-

The login method in LoginModule implementations in Apache Geronimo 2.0 does not throw FailedLoginException for failed logins, which allows remote attackers to bypass authentication requirements, deploy arbitrary modules, and gain administrative access by sending a blank username and password with the command line deployer in the deployment module. -

-

- -

Vulnerable Software & Versions:

-
-
-

daytrader-ear-2.1.7.ear: streamer.jar

-
-

Description: Streamer Application for Day Trader

-

- File Path: target\test-classes\daytrader-ear-2.1.7.ear\streamer.jar
- MD5: 5bc6de1a34935d20331ef777463fd28b
- SHA1: ec631c926ab667182840b3e5e32bd3d2f8a808ac -

- - -

Identifiers

-
- -
- -
-

CVE-2011-5034  

-

Severity: - High -
CVSS Score: 7.8 -
CWE: CWE-20 Improper Input Validation -

-

Apache Geronimo 2.2.1 and earlier computes hash values for form parameters without restricting the ability to trigger hash collisions predictably, which allows remote attackers to cause a denial of service (CPU consumption) by sending many crafted parameters. NOTE: this might overlap CVE-2011-4461. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2008-0732  

-

Severity: - Low -
CVSS Score: 2.1 -
CWE: CWE-59 Improper Link Resolution Before File Access ('Link Following') -

-

The init script for Apache Geronimo on SUSE Linux follows symlinks when performing a chown operation, which might allow local users to obtain access to unspecified files or directories. -

-

- -

Vulnerable Software & Versions:

-
-
-

daytrader-ear-2.1.7.ear: web.war

-
-

- File Path: target\test-classes\daytrader-ear-2.1.7.ear\web.war
- MD5: 857655bb1ddb4204f09d63e5ca8c56bc
- SHA1: 7a7455f5d78bb4e1b8e66cd3e6c1f964d18705f9 -

- - -

Identifiers

-
-
  • None
-
-
-

daytrader-ear-2.1.7.ear: wsappclient.jar

-
-

Description: Client demonstrating Web Services

-

- File Path: target\test-classes\daytrader-ear-2.1.7.ear\wsappclient.jar
- MD5: c343646c162fdd19156400fe83f41ce2
- SHA1: ece01974be048ba75e2b344c39efb176915a1c16 -

- - -

Identifiers

-
- -
- -
-

CVE-2011-5034  

-

Severity: - High -
CVSS Score: 7.8 -
CWE: CWE-20 Improper Input Validation -

-

Apache Geronimo 2.2.1 and earlier computes hash values for form parameters without restricting the ability to trigger hash collisions predictably, which allows remote attackers to cause a denial of service (CPU consumption) by sending many crafted parameters. NOTE: this might overlap CVE-2011-4461. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2008-0732  

-

Severity: - Low -
CVSS Score: 2.1 -
CWE: CWE-59 Improper Link Resolution Before File Access ('Link Following') -

-

The init script for Apache Geronimo on SUSE Linux follows symlinks when performing a chown operation, which might allow local users to obtain access to unspecified files or directories. -

-

- -

Vulnerable Software & Versions:

-
-
-

dojo-war-1.3.0.war

-
-

- File Path: target\test-classes\dojo-war-1.3.0.war
- MD5: cd00cb6bc15004638548148a21d799aa
- SHA1: 36572b4e096421becab9346da41bbc4ec1316a54 -

- - -

Identifiers

-
- -
- -
-

CVE-2010-2276  

-

Severity: - High -
CVSS Score: 10.0 -
CWE: CWE-16 Configuration -

-

The default configuration of the build process in Dojo 0.4.x before 0.4.4, 1.0.x before 1.0.3, 1.1.x before 1.1.2, 1.2.x before 1.2.4, 1.3.x before 1.3.3, and 1.4.x before 1.4.2 has the copyTests=true and mini=false options, which makes it easier for remote attackers to have an unspecified impact via a request to a (1) test or (2) demo component. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2010-2275  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Cross-site scripting (XSS) vulnerability in dijit/tests/_testCommon.js in Dojo Toolkit SDK before 1.4.2 allows remote attackers to inject arbitrary web script or HTML via the theme parameter, as demonstrated by an attack against dijit/tests/form/test_Button.html. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2010-2274  

-

Severity: - Medium -
CVSS Score: 4.3 -

-

Multiple open redirect vulnerabilities in Dojo 1.0.x before 1.0.3, 1.1.x before 1.1.2, 1.2.x before 1.2.4, 1.3.x before 1.3.3, and 1.4.x before 1.4.2 allow remote attackers to redirect users to arbitrary web sites and conduct phishing attacks via unspecified vectors, possibly related to dojo/resources/iframe_history.html, dojox/av/FLAudio.js, dojox/av/FLVideo.js, dojox/av/resources/audio.swf, dojox/av/resources/video.swf, util/buildscripts/jslib/build.js, util/buildscripts/jslib/buildUtil.js, and util/doh/runner.html. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2010-2273  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Multiple cross-site scripting (XSS) vulnerabilities in Dojo 1.0.x before 1.0.3, 1.1.x before 1.1.2, 1.2.x before 1.2.4, 1.3.x before 1.3.3, and 1.4.x before 1.4.2 allow remote attackers to inject arbitrary web script or HTML via unspecified vectors, possibly related to dojo/resources/iframe_history.html, dojox/av/FLAudio.js, dojox/av/FLVideo.js, dojox/av/resources/audio.swf, dojox/av/resources/video.swf, util/buildscripts/jslib/build.js, and util/buildscripts/jslib/buildUtil.js, as demonstrated by the (1) dojoUrl and (2) testUrl parameters to util/doh/runner.html. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2007-2376  

-

Severity: - Medium -
CVSS Score: 5.0 -

-

The Dojo framework exchanges data using JavaScript Object Notation (JSON) without an associated protection scheme, which allows remote attackers to obtain the data via a web page that retrieves the data through a URL in the SRC attribute of a SCRIPT element and captures the data using other JavaScript code, aka "JavaScript Hijacking." -

-

- -

Vulnerable Software & Versions:

-
-
-

dwr-1.1.1.jar

-
-

Description: DWR is easy Ajax for Java.

-

- File Path: target\test-classes\dwr-1.1.1.jar
- MD5: acf4c23760ecb7377ee5047cd89afc90
- SHA1: 52fa2a12084cef04a5ce4e99d6dd63ba3fbf1071 -

- - -

Identifiers

-
- -
- -
-

CVE-2007-0185  

-

Severity: - Medium -
CVSS Score: 5.0 -

-

Getahead Direct Web Remoting (DWR) before 1.1.4 allows attackers to cause a denial of service (memory exhaustion and servlet outage) via unknown vectors related to a large number of calls in a batch. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2007-0184  

-

Severity: - High -
CVSS Score: 7.5 -

-

Getahead Direct Web Remoting (DWR) before 1.1.4 allows attackers to obtain unauthorized access to public methods via a crafted request that bypasses the include/exclude checks. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2006-6916  

-

Severity: - High -
CVSS Score: 7.5 -

-

Getahead Direct Web Remoting (DWR) before 1.1.3 allows attackers to cause a denial of service (infinite loop) via unknown vectors related to "crafted input." -

-

- -

Vulnerable Software & Versions:

-
-
-

ehcache-core-2.2.0.jar

-
-

Description: This is the ehcache core module. Pair it with other modules for added - functionality. -

-

- License:

The Apache Software License, Version 2.0: src/assemble/LICENSE.txt
- File Path: target\test-classes\ehcache-core-2.2.0.jar
- MD5: 2c95e83b612691ba2a54e0c56cb9177f
- SHA1: c3fba1f00073a38d370990ce7d8b5d4f9b05a11a -

- - -

Identifiers

-
- -
-
-

FileHelpers.2.0.0.0.nupkg

-
-

- File Path: target\test-classes\FileHelpers.2.0.0.0.nupkg
- MD5: 0bf948b505852a2af8a597b8a129ef9a
- SHA1: 30fb37d6163cf16e3ba740343becdd14d5457619 -

- - -

Identifiers

-
-
  • None
-
-
-

FileHelpers.2.0.0.0.nupkg: FileHelpers.nuspec

-
-

- File Path: target\test-classes\FileHelpers.2.0.0.0.nupkg\FileHelpers.nuspec
- MD5: 9e2287f0174bcd79cf7e2427d73a1197
- SHA1: d14a722b66388d84ac3b57c4de56e702aa5fea96 -

- - -

Identifiers

-
-
  • None
-
-
-

FileHelpers.2.0.0.0.nupkg: FileHelpers.dll

-
-

- File Path: target\test-classes\FileHelpers.2.0.0.0.nupkg\lib\FileHelpers.dll
- MD5: 4829fa768de37c315a3a3b7bca027b64
- SHA1: a256f622a6209ec21a13d490443ffd6dbda4f5b7 -

- - -

Identifiers

-
-
  • None
-
-
-

FileHelpers.2.0.0.0.nupkg: FileHelpers.ExcelStorage.dll

-
-

- File Path: target\test-classes\FileHelpers.2.0.0.0.nupkg\lib\FileHelpers.ExcelStorage.dll
- MD5: d22aeca6ee71a2e6f5b3d296280ba98a
- SHA1: e416350e2ee0e0711e2716cf7efce54168accc52 -

- - -

Identifiers

-
-
  • None
-
-
-

FileHelpers.2.0.0.0.nupkg: Interop.Excel.dll

-
-

- File Path: target\test-classes\FileHelpers.2.0.0.0.nupkg\lib\Interop.Excel.dll
- MD5: 728ff3aeae71cbd8d303f442e3843c4c
- SHA1: cdaa993485f737951fd91c71f41c929cd06dffa3 -

- - -

Identifiers

-
-
  • None
-
-
-

FileHelpers.2.0.0.0.nupkg: Interop.Office.dll

-
-

- File Path: target\test-classes\FileHelpers.2.0.0.0.nupkg\lib\Interop.Office.dll
- MD5: 7b55e3bf19775b7a6fa5bf3c271e2c0c
- SHA1: eefcfe4b0c90b6f4232d07d588a08bc04fd32e84 -

- - -

Identifiers

-
-
  • None
-
-
-

freemarker-2.3.12.jar

-
-

Description:  - FreeMarker is a "template engine"; a generic tool to generate text output based on templates. -

-

- License:

BSD-style license: http://www.freemarker.org/LICENSE.txt
- File Path: target\test-classes\freemarker-2.3.12.jar
- MD5: 719554bbc3d8a98582a8a93328134fe2
- SHA1: 3501b670aa7e3822ddf7693082f621b1cd8ce086 -

- - -

Identifiers

-
- -
-
-

geronimo-javamail_1.4_spec-1.2.jar

-
-

Description: Provides open-source implementations of Sun specifications.

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\geronimo-javamail_1.4_spec-1.2.jar
- MD5: f9f0465816f2db5fa9f409fb1d9700c8
- SHA1: 0f6b07582a3d6ba452b10527fb508809aff8b353 -

- - -

Identifiers

-
- -
- -
-

CVE-2011-5034  

-

Severity: - High -
CVSS Score: 7.8 -
CWE: CWE-20 Improper Input Validation -

-

Apache Geronimo 2.2.1 and earlier computes hash values for form parameters without restricting the ability to trigger hash collisions predictably, which allows remote attackers to cause a denial of service (CPU consumption) by sending many crafted parameters. NOTE: this might overlap CVE-2011-4461. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2008-0732  

-

Severity: - Low -
CVSS Score: 2.1 -
CWE: CWE-59 Improper Link Resolution Before File Access ('Link Following') -

-

The init script for Apache Geronimo on SUSE Linux follows symlinks when performing a chown operation, which might allow local users to obtain access to unspecified files or directories. -

-

- -

Vulnerable Software & Versions:

-
-
-

geronimo-jms_1.1_spec-1.1.1.jar

-
-

Description: Provides open-source implementations of Sun specifications.

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\geronimo-jms_1.1_spec-1.1.1.jar
- MD5: d80ce71285696d36c1add1989b94f084
- SHA1: c872b46c601d8dc03633288b81269f9e42762cea -

- - - - -

Identifiers

-
- -
- -
-

CVE-2011-5034  

-

Severity: - High -
CVSS Score: 7.8 -
CWE: CWE-20 Improper Input Validation -

-

Apache Geronimo 2.2.1 and earlier computes hash values for form parameters without restricting the ability to trigger hash collisions predictably, which allows remote attackers to cause a denial of service (CPU consumption) by sending many crafted parameters. NOTE: this might overlap CVE-2011-4461. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2008-0732  

-

Severity: - Low -
CVSS Score: 2.1 -
CWE: CWE-59 Improper Link Resolution Before File Access ('Link Following') -

-

The init script for Apache Geronimo on SUSE Linux follows symlinks when performing a chown operation, which might allow local users to obtain access to unspecified files or directories. -

-

- -

Vulnerable Software & Versions:

-
-
-

geronimo-jpa_2.0_spec-1.1.jar

-
-

Description: Implementation of Sun JSR-317 JPA 2.0 Spec API

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\geronimo-jpa_2.0_spec-1.1.jar
- MD5: 007c972f6dcfea68a6686b262c6f3d2f
- SHA1: f4d90788691f5f5f201f39a53a23d392cde660a3 -

- - -

Identifiers

-
- -
- -
-

CVE-2011-5034  

-

Severity: - High -
CVSS Score: 7.8 -
CWE: CWE-20 Improper Input Validation -

-

Apache Geronimo 2.2.1 and earlier computes hash values for form parameters without restricting the ability to trigger hash collisions predictably, which allows remote attackers to cause a denial of service (CPU consumption) by sending many crafted parameters. NOTE: this might overlap CVE-2011-4461. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2008-0732  

-

Severity: - Low -
CVSS Score: 2.1 -
CWE: CWE-59 Improper Link Resolution Before File Access ('Link Following') -

-

The init script for Apache Geronimo on SUSE Linux follows symlinks when performing a chown operation, which might allow local users to obtain access to unspecified files or directories. -

-

- -

Vulnerable Software & Versions:

-
-
-

geronimo-stax-api_1.0_spec-1.0.1.jar

-
-

Description: Provides open-source implementations of Sun specifications.

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\geronimo-stax-api_1.0_spec-1.0.1.jar
- MD5: b7c2a715cd3d1c43dc4ccfae426e8e2e
- SHA1: 1c171093a8b43aa550c6050ac441abe713ebb4f2 -

- - - - -

Identifiers

-
- -
- -
-

CVE-2011-5034  

-

Severity: - High -
CVSS Score: 7.8 -
CWE: CWE-20 Improper Input Validation -

-

Apache Geronimo 2.2.1 and earlier computes hash values for form parameters without restricting the ability to trigger hash collisions predictably, which allows remote attackers to cause a denial of service (CPU consumption) by sending many crafted parameters. NOTE: this might overlap CVE-2011-4461. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2008-0732  

-

Severity: - Low -
CVSS Score: 2.1 -
CWE: CWE-59 Improper Link Resolution Before File Access ('Link Following') -

-

The init script for Apache Geronimo on SUSE Linux follows symlinks when performing a chown operation, which might allow local users to obtain access to unspecified files or directories. -

-

- -

Vulnerable Software & Versions:

-
-
-

guice-3.0.jar

-
-

Description: Guice is a lightweight dependency injection framework for Java 5 and above

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\guice-3.0.jar
- MD5: ca1c7ba366884cfcd2cfb48d2395c400
- SHA1: 9d84f15fe35e2c716a02979fb62f50a29f38aefa -

- - -

Identifiers

-
- -
-
-

hazelcast-2.5.jar

-
-

Description: Hazelcast In-Memory DataGrid

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\hazelcast-2.5.jar
- MD5: cecb9f89cf60f8947451f620e542cbc8
- SHA1: 3614fa9e42e8cd4d124ca37a2edb36d0e926959d -

- - -

Identifiers

-
- -
-
-

hibernate3.jar

-
-

- File Path: target\test-classes\hibernate3.jar
- MD5: b22bbafa38341db968033f1acbfa8dd9
- SHA1: 826da9fc452e7009116dffc2d348ba705fe2aa82 -

- - -

Identifiers

-
-
  • None
-
-
-

hibernate3.jar\META-INF/maven/org.hibernate/hibernate-c3p0/pom.xml

-
-

Description: C3P0-based implementation of the Hibernate ConnectionProvder contract

-

- File Path: target\test-classes\hibernate3.jar\META-INF/maven/org.hibernate/hibernate-c3p0/pom.xml
- MD5: 301251db8497b5100b7d6e9efb0afc44
- SHA1: 55119c84a43a9af05482e077ab241cacd1910d93 -

- - -

Identifiers

-
-
    -
  • maven: org.hibernate:hibernate-c3p0:3.6.6.Final -   Confidence:HIGH -
  • -
-
-
-

hibernate3.jar\META-INF/maven/org.hibernate/hibernate-commons-annotations/pom.xml

-
-

Description: Common reflection code used in support of annotation processing

-

- License:

GNU LESSER GENERAL PUBLIC LICENSE: http://www.gnu.org/licenses/lgpl.txt
- File Path: target\test-classes\hibernate3.jar\META-INF/maven/org.hibernate/hibernate-commons-annotations/pom.xml
- MD5: 08b54aba75a160ec63d3677d89b2a9bb
- SHA1: 4665e68571641943c1a12ed16a1b7c05c6c40943 -

- - -

Identifiers

-
-
    -
  • maven: org.hibernate:hibernate-commons-annotations:3.2.0.Final -   Confidence:HIGH -
  • -
-
-
-

hibernate3.jar\META-INF/maven/org.hibernate/hibernate-core/pom.xml

-
-

Description: The core functionality of Hibernate

-

- File Path: target\test-classes\hibernate3.jar\META-INF/maven/org.hibernate/hibernate-core/pom.xml
- MD5: bd41ed501d7218dc30403320127372f2
- SHA1: 7d8f09aa7d0100318d826625cb42dbc358e07abd -

- - -

Identifiers

-
-
    -
  • maven: org.hibernate:hibernate-core:3.6.6.Final -   Confidence:HIGH -
  • -
-
-
-

hibernate3.jar\META-INF/maven/org.hibernate/hibernate-ehcache/pom.xml

-
-

Description: Integration of Hibernate with Ehcache

-

- File Path: target\test-classes\hibernate3.jar\META-INF/maven/org.hibernate/hibernate-ehcache/pom.xml
- MD5: 19610cc4510ae1067e83e910590ca011
- SHA1: 9218f8cd87f3e28c49d4947361b4c6f66757cc25 -

- - -

Identifiers

-
-
    -
  • maven: org.hibernate:hibernate-ehcache:3.6.6.Final -   Confidence:HIGH -
  • -
-
-
-

hibernate3.jar\META-INF/maven/org.hibernate/hibernate-entitymanager/pom.xml

-
-

Description: Hibernate Entity Manager

-

- File Path: target\test-classes\hibernate3.jar\META-INF/maven/org.hibernate/hibernate-entitymanager/pom.xml
- MD5: 68c7e92964df6fab1e9082d29a78d9c4
- SHA1: 38d087e745fa330ad03fd5ab3e2d029845913de7 -

- - -

Identifiers

-
-
    -
  • maven: org.hibernate:hibernate-entitymanager:3.6.6.Final -   Confidence:HIGH -
  • -
-
-
-

hibernate3.jar\META-INF/maven/org.hibernate/hibernate-envers/pom.xml

-
-

Description: Support for entity auditing

-

- File Path: target\test-classes\hibernate3.jar\META-INF/maven/org.hibernate/hibernate-envers/pom.xml
- MD5: 897a79ec7b20d46002f0bbc441ed1ca9
- SHA1: 02094fd8813c1b0b43b0e4d36df791ea80cfced1 -

- - -

Identifiers

-
-
    -
  • maven: org.hibernate:hibernate-envers:3.6.6.Final -   Confidence:HIGH -
  • -
-
-
-

hibernate3.jar\META-INF/maven/org.hibernate/hibernate-infinispan/pom.xml

-
-

Description: Integration of Hibernate with Infinispan

-

- File Path: target\test-classes\hibernate3.jar\META-INF/maven/org.hibernate/hibernate-infinispan/pom.xml
- MD5: 2cc34e9876b4c73c4d9876e784e78e5d
- SHA1: bd2454348c57618c3e02b329a6822d5979d3c871 -

- - -

Identifiers

-
-
    -
  • maven: org.hibernate:hibernate-infinispan:3.6.6.Final -   Confidence:HIGH -
  • -
-
-
-

hibernate3.jar\META-INF/maven/org.hibernate/hibernate-jbosscache/pom.xml

-
-

Description: Integration of Hibernate with JBossCache 3.x (though 2.x sould work as well)

-

- File Path: target\test-classes\hibernate3.jar\META-INF/maven/org.hibernate/hibernate-jbosscache/pom.xml
- MD5: 339d8af2672ed9e1bef0e04649a33f46
- SHA1: ef975161e9c45b177283d9105220f791ed512aea -

- - -

Identifiers

-
-
    -
  • maven: org.hibernate:hibernate-jbosscache:3.6.6.Final -   Confidence:HIGH -
  • -
-
-
-

hibernate3.jar\META-INF/maven/org.hibernate/hibernate-oscache/pom.xml

-
-

Description: Integration of Hibernate with OSCache

-

- File Path: target\test-classes\hibernate3.jar\META-INF/maven/org.hibernate/hibernate-oscache/pom.xml
- MD5: 97443939f6f7e9c45375397aac16e0b9
- SHA1: 4aadcf3391317e2a62332e9fd801b8284c3d985c -

- - -

Identifiers

-
-
    -
  • maven: org.hibernate:hibernate-oscache:3.6.6.Final -   Confidence:HIGH -
  • -
-
-
-

hibernate3.jar\META-INF/maven/org.hibernate/hibernate-proxool/pom.xml

-
-

Description: Proxool-based implementation of the Hibernate ConnectionProvder contract

-

- File Path: target\test-classes\hibernate3.jar\META-INF/maven/org.hibernate/hibernate-proxool/pom.xml
- MD5: d1749afd6014c4465a13a87583429af2
- SHA1: 5a4af64267474034f5d844e6a0af599aea7b746f -

- - -

Identifiers

-
-
    -
  • maven: org.hibernate:hibernate-proxool:3.6.6.Final -   Confidence:HIGH -
  • -
-
-
-

hibernate3.jar\META-INF/maven/org.hibernate/hibernate-swarmcache/pom.xml

-
-

Description: Integration of Hibernate with SwarmCache

-

- File Path: target\test-classes\hibernate3.jar\META-INF/maven/org.hibernate/hibernate-swarmcache/pom.xml
- MD5: 6e1b739de3e65236403d0eb82db58243
- SHA1: aa700e6e775c476182a1e1ad0f15c63cdb537fe0 -

- - -

Identifiers

-
-
    -
  • maven: org.hibernate:hibernate-swarmcache:3.6.6.Final -   Confidence:HIGH -
  • -
-
-
-

hibernate3.jar\META-INF/maven/org.hibernate/hibernate-testing/pom.xml

-
-

Description: Hibernate JUnit test utilities

-

- File Path: target\test-classes\hibernate3.jar\META-INF/maven/org.hibernate/hibernate-testing/pom.xml
- MD5: 6cad956c9362f77504bf2d9aaf1731ee
- SHA1: b8710fde765268f33442497aace2848f4fa986f4 -

- - -

Identifiers

-
-
    -
  • maven: org.hibernate:hibernate-testing:3.6.6.Final -   Confidence:HIGH -
  • -
-
-
-

httpcore-4.0-beta1.jar

-
-

Description:  - HttpComponents Core (Java 1.3 compatible) -

-

- License:

Apache License: ../LICENSE.txt
- File Path: target\test-classes\httpcore-4.0-beta1.jar
- MD5: 7515cfff71e32ce55d5ba6b73251d93a
- SHA1: c642a5f7c20539840957584b1af2ad798cd1ba52 -

- - -

Identifiers

-
- -
-
-

httpcore-nio-4.0-beta1.jar

-
-

Description:  - HttpComponents Core (NIO extensions) -

-

- License:

Apache License: ../LICENSE.txt
- File Path: target\test-classes\httpcore-nio-4.0-beta1.jar
- MD5: 926965bc84b5f5f138df66ddd05baed0
- SHA1: a0d825beaa0bc0b03fcf11315abc4b7fd60fe2e8 -

- - -

Identifiers

-
- -
-
-

javax.inject-1.jar

-
-

Description: The javax.inject API

-

- License:

The Apache Software License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\javax.inject-1.jar
- MD5: 289075e48b909e9e74e6c915b3631d2e
- SHA1: 6975da39a7040257bd51d21a231b76c915872d38 -

- - -

Identifiers

-
- -
-
-

jaxb-xercesImpl-1.5.jar

-
-

- File Path: target\test-classes\jaxb-xercesImpl-1.5.jar
- MD5: 8cd074364c830fc8ff40a8a19c0a74c8
- SHA1: 73a51faadb407dccdbd77234e0d5a0a648665692 -

- - -

Identifiers

-
- -
-
-

jaxen-1.1.1.jar

-
-

Description: Jaxen is a universal Java XPath engine.

-

- File Path: target\test-classes\jaxen-1.1.1.jar
- MD5: 261d1aa59865842ecc32b3848b0c6538
- SHA1: 9f5d3c5974dbe5cf69c2c2ec7d8a4eb6e0fce7f9 -

- - -

Identifiers

-
- -
-
-

jetty-6.1.0.jar

-
-

- File Path: target\test-classes\jetty-6.1.0.jar
- MD5: 121a72b1dea1a9adf83079a44ca08e7b
- SHA1: fb39ebc0cdccea6b54ad87d229a352a894eebecc -

- - - - -

Identifiers

-
- -
- -
-

CVE-2011-4461  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-310 Cryptographic Issues -

-

Jetty 8.1.0.RC2 and earlier computes hash values for form parameters without restricting the ability to trigger hash collisions predictably, which allows remote attackers to cause a denial of service (CPU consumption) by sending many crafted parameters. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2009-4612  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Multiple cross-site scripting (XSS) vulnerabilities in the WebApp JSP Snoop page in Mort Bay Jetty 6.1.x through 6.1.21 allow remote attackers to inject arbitrary web script or HTML via the PATH_INFO to the default URI under (1) jspsnoop/, (2) jspsnoop/ERROR/, and (3) jspsnoop/IOException/, and possibly the PATH_INFO to (4) snoop.jsp. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2009-4611  

-

Severity: - High -
CVSS Score: 7.5 -
CWE: CWE-20 Improper Input Validation -

-

Mort Bay Jetty 6.x and 7.0.0 writes backtrace data without sanitizing non-printable characters, which might allow remote attackers to modify a window's title, or possibly execute arbitrary commands or overwrite files, via an HTTP request containing an escape sequence for a terminal emulator, related to (1) a string value in the Age parameter to the default URI for the Cookie Dump Servlet in test-jetty-webapp/src/main/java/com/acme/CookieDump.java under cookie/, (2) an alphabetic value in the A parameter to jsp/expr.jsp, or (3) an alphabetic value in the Content-Length HTTP header to an arbitrary application. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2009-4610  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Multiple cross-site scripting (XSS) vulnerabilities in Mort Bay Jetty 6.x and 7.0.0 allow remote attackers to inject arbitrary web script or HTML via (1) the query string to jsp/dump.jsp in the JSP Dump feature, or the (2) Name or (3) Value parameter to the default URI for the Session Dump Servlet under session/. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2009-4609  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-200 Information Exposure -

-

The Dump Servlet in Mort Bay Jetty 6.x and 7.0.0 allows remote attackers to obtain sensitive information about internal variables and other data via a request to a URI ending in /dump/, as demonstrated by discovering the value of the getPathTranslated variable. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2009-1524  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Cross-site scripting (XSS) vulnerability in Mort Bay Jetty before 6.1.17 allows remote attackers to inject arbitrary web script or HTML via a directory listing request containing a ; (semicolon) character. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2009-1523  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-22 Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') -

-

Directory traversal vulnerability in the HTTP server in Mort Bay Jetty 5.1.14, 6.x before 6.1.17, and 7.x through 7.0.0.M2 allows remote attackers to access arbitrary files via directory traversal sequences in the URI. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2007-5615  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-94 Improper Control of Generation of Code ('Code Injection') -

-

CRLF injection vulnerability in Mortbay Jetty before 6.1.6rc0 allows remote attackers to inject arbitrary HTTP headers and conduct HTTP response splitting attacks via unspecified vectors. -

-

- -

Vulnerable Software & Versions:

-

CVE-2007-5614  

-

Severity: - High -
CVSS Score: 7.5 -

-

Mortbay Jetty before 6.1.6rc1 does not properly handle "certain quote sequences" in HTML cookie parameters, which allows remote attackers to hijack browser sessions via unspecified vectors. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2007-5613  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Cross-site scripting (XSS) vulnerability in Dump Servlet in Mortbay Jetty before 6.1.6rc1 allows remote attackers to inject arbitrary web script or HTML via unspecified parameters and cookies. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

log4net.2.0.3.nuspec

-
-

- File Path: target\test-classes\log4net.2.0.3.nuspec
- MD5: d95207bfd2539c046ba7271b695b08f7
- SHA1: b82102a0767f56525926698fbba4b7c47e96d4ab -

- - -

Identifiers

-
-
    -
  • cpe: cpe:/a:apache:log4net:2.0.3 -   Confidence:LOW -    -
  • -
-
-
-

log4net.dll

-
-

- File Path: target\test-classes\log4net.dll
- MD5: e873f47ff9ed73a7ed7054aaf4e7601a
- SHA1: 44d7ee86c72be615da883a24f0b54fd0725ad298 -

- - -

Identifiers

-
-
    -
  • cpe: cpe:/a:apache:log4net:1.2.13.0 -   Confidence:LOW -    -
  • -
-
-
-

mail-1.4.jar

-
-

Description:  - The JavaMail API provides a platform-independent and protocol-independent framework to build mail and messaging applications. -

-

- License:

Common Development and Distribution License (CDDL) v1.0: https://glassfish.dev.java.net/public/CDDLv1.0.html
- File Path: target\test-classes\mail-1.4.jar
- MD5: 2e64a3805d543bdb86e6e5eeca5529f8
- SHA1: 1aa1579ae5ecd41920c4f355b0a9ef40b68315dd -

- - -

Identifiers

-
- -
- -
-

CVE-2007-6059  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-399 Resource Management Errors -

-

** DISPUTED ** Javamail does not properly handle a series of invalid login attempts in which the same e-mail address is entered as username and password, and the domain portion of this address yields a Java UnknownHostException error, which allows remote attackers to cause a denial of service (connection pool exhaustion) via a large number of requests, resulting in a SQLNestedException. NOTE: Sun disputes this issue, stating "The report makes references to source code and files that do not exist in the mentioned products." -

-

- -

Vulnerable Software & Versions:

-
-
-

maven-scm-api-1.8.1.jar

-
-

Description: The SCM API provides mechanisms to manage all SCM tools.

-

- File Path: target\test-classes\maven-scm-api-1.8.1.jar
- MD5: c409fc1a6c9baf928cc37b2ffb852c83
- SHA1: d72bcdc54a873e8bfbc53fde6200e53911c3d9fe -

- - -

Identifiers

-
- -
-
-

maven-scm-provider-cvs-commons-1.8.1.jar

-
-

Description: Common library for SCM CVS Provider.

-

- File Path: target\test-classes\maven-scm-provider-cvs-commons-1.8.1.jar
- MD5: 7d35f493a22226b821b5d5363e85765c
- SHA1: 97411239d474ecafcc2ab89facaf2593eb0de49b -

- - -

Identifiers

-
- -
-
-

maven-scm-provider-cvsexe-1.8.1.jar

-
-

Description: Executable implementation for SCM CVS Provider.

-

- File Path: target\test-classes\maven-scm-provider-cvsexe-1.8.1.jar
- MD5: 8900abe1192b79b35aedb0f683a8b412
- SHA1: 5c7bf6d2c741885d2a6c17cb044ff8e2966f69ca -

- - -

Identifiers

-
- -
-
-

neethi-2.0.4.jar

-
-

Description: Apache Neethi provides general framework for the programmers to use WS Policy. It is compliant with latest WS Policy specification which was published in March 2006. This framework is specifically written to enable the Apache Web services stack to use WS Policy as a way of expressing it's requirements and capabilities.

-

- License:

The Apache Software License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\neethi-2.0.4.jar
- MD5: 3f0948a3b1316dfc94f9abce02da8901
- SHA1: c5bbf05c56ef0d68eec17a7eb1ed9241052fd763 -

- - -

Identifiers

-
- -
-
-

ognl-2.6.11.jar

-
-

- File Path: target\test-classes\ognl-2.6.11.jar
- MD5: 1173ec5f8b1f6fb1473f4546d4b83bba
- SHA1: 0c3f31f4a65461c44e6697bf29070e638bef09d8 -

- - - - -

Identifiers

-
- -
-
-

openjpa-2.0.1.jar

-
-

Description: Apache OpenJPA implementation of JSR-317 JPA 2.0

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\openjpa-2.0.1.jar
- MD5: d7bb08188165023ec883e32f4d636888
- SHA1: 09b61112d8d8a100b06174074631c8a43e3e0a91 -

- - -

Identifiers

-
- -
- -
-

CVE-2013-1768  

-

Severity: - High -
CVSS Score: 7.5 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

The BrokerFactory functionality in Apache OpenJPA 1.x before 1.2.3 and 2.x before 2.2.2 creates local executable JSP files containing logging trace data produced during deserialization of certain crafted OpenJPA objects, which makes it easier for remote attackers to execute arbitrary code by creating a serialized object and leveraging improperly secured server programs. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

org.mortbay.jetty.jar

-
-

Description:  -Jetty is an open-source, standards-based, full-featured web server implemented entirely in Java. It is released under the Apache 2.0 licence and is therefore free for commercial use and distribution. First created in 1995, Jetty has benefitted from input from a vast user community and consistent and focused development by a stable core of lead developers. There are many more examples of Jetty in action on the Jetty Powered Page that has selections from among the tens of thousands of production Jetty instances. However, as Jetty aims to be as unobtrusive as possible, countless websites and products are based around Jetty, but Jetty is invisible! -

-

- License:

Apache 2.0: http://jetty.mortbay.org/LICENSE.TXT
- File Path: target\test-classes\org.mortbay.jetty.jar
- MD5: 8abfd9ef03680c5b9b418abd918ce525
- SHA1: 7b11e767b884d5b872310ce390219b59ffd64a1e -

- - -

Identifiers

-
- -
- -
-

CVE-2011-4461  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-310 Cryptographic Issues -

-

Jetty 8.1.0.RC2 and earlier computes hash values for form parameters without restricting the ability to trigger hash collisions predictably, which allows remote attackers to cause a denial of service (CPU consumption) by sending many crafted parameters. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2009-1524  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Cross-site scripting (XSS) vulnerability in Mort Bay Jetty before 6.1.17 allows remote attackers to inject arbitrary web script or HTML via a directory listing request containing a ; (semicolon) character. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2009-1523  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-22 Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') -

-

Directory traversal vulnerability in the HTTP server in Mort Bay Jetty 5.1.14, 6.x before 6.1.17, and 7.x through 7.0.0.M2 allows remote attackers to access arbitrary files via directory traversal sequences in the URI. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2007-5615  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-94 Improper Control of Generation of Code ('Code Injection') -

-

CRLF injection vulnerability in Mortbay Jetty before 6.1.6rc0 allows remote attackers to inject arbitrary HTTP headers and conduct HTTP response splitting attacks via unspecified vectors. -

-

- -

Vulnerable Software & Versions:

-

CVE-2007-5614  

-

Severity: - High -
CVSS Score: 7.5 -

-

Mortbay Jetty before 6.1.6rc1 does not properly handle "certain quote sequences" in HTML cookie parameters, which allows remote attackers to hijack browser sessions via unspecified vectors. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2007-5613  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Cross-site scripting (XSS) vulnerability in Dump Servlet in Mortbay Jetty before 6.1.6rc1 allows remote attackers to inject arbitrary web script or HTML via unspecified parameters and cookies. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2005-3747  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-200 Information Exposure -

-

Unspecified vulnerability in Jetty before 5.1.6 allows remote attackers to obtain source code of JSP pages, possibly involving requests for .jsp files with URL-encoded backslash ("%5C") characters. NOTE: this might be the same issue as CVE-2006-2758. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

org.mortbay.jmx.jar

-
-

- File Path: target\test-classes\org.mortbay.jmx.jar
- MD5: 82d35b88a6caecb9ad5cc8a0ca2c6c81
- SHA1: 938031afdf33d3c5fee6077312fb44be25a9725c -

- - -

Identifiers

-
-
  • None
-
-
-

plexus-utils-3.0.7.jar

-
-

Description: A collection of various utility classes to ease working with strings, files, command lines, XML and more.

-

- File Path: target\test-classes\plexus-utils-3.0.7.jar
- MD5: c22b393490a46da89d91dd6322446e40
- SHA1: eb10e9cb2b2326fbf0cb68249b10a5c89e0642ef -

- - -

Identifiers

-
- -
-
-

EggTest-0.0.1-py2.7.egg

-
-

Description: Simple project for producing an .egg.

-

- File Path: target\test-classes\python\dist\EggTest-0.0.1-py2.7.egg
- MD5: d314004a75bb4fe6907c016126ee0c7f
- SHA1: 7cb9966e32f5d53564ec4c90868b31794ffa6130 -

- - -

Identifiers

-
-
  • None
-
-
-

eggtest/__init__.py

-
-

Description: Simple project for producing an .egg.

-

- File Path: target\test-classes\python\dist\EggTest-0.0.1-py2.7.zip\eggtest\__init__.py
- MD5: d7a0966daf5b65237aabf1bdc07ceea7
- SHA1: 44869d68deff98ba535291755fd2d8f3fc7e5ea7 -

- - -

Identifiers

-
-
  • None
-
-
-

Django-1.7.2-py2.py3-none-any.whl

-
-

Description: A high-level Python Web framework that encourages rapid development and clean, pragmatic design.

-

- File Path: target\test-classes\python\Django-1.7.2-py2.py3-none-any.whl
- MD5: dc54b224746c157e89df31c886412a40
- SHA1: 3aff2fabdd09e00b51bd0522a2c3ad672958d361 -

- - -

Identifiers

-
- -
- -
-

CVE-2015-2317  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

The utils.http.is_safe_url function in Django before 1.4.20, 1.5.x, 1.6.x before 1.6.11, 1.7.x before 1.7.7, and 1.8.x before 1.8c1 does not properly validate URLs, which allows remote attackers to conduct cross-site scripting (XSS) attacks via a control character in a URL, as demonstrated by a \x08javascript: URL. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2015-2316  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-399 Resource Management Errors -

-

The utils.html.strip_tags function in Django 1.6.x before 1.6.11, 1.7.x before 1.7.7, and 1.8.x before 1.8c1, when using certain versions of Python, allows remote attackers to cause a denial of service (infinite loop) by increasing the length of the input string. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2015-2241  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Cross-site scripting (XSS) vulnerability in the contents function in admin/helpers.py in Django before 1.7.6 and 1.8 before 1.8b2 allows remote attackers to inject arbitrary web script or HTML via a model attribute in ModelAdmin.readonly_fields, as demonstrated by a @property. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2015-0222  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-17 Code -

-

ModelMultipleChoiceField in Django 1.6.x before 1.6.10 and 1.7.x before 1.7.3, when show_hidden_initial is set to True, allows remote attackers to cause a denial of service by submitting duplicate values, which triggers a large number of SQL queries. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2015-0221  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-399 Resource Management Errors -

-

The django.views.static.serve view in Django before 1.4.18, 1.6.x before 1.6.10, and 1.7.x before 1.7.3 reads files an entire line at a time, which allows remote attackers to cause a denial of service (memory consumption) via a long line in a file. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2015-0220  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

The django.util.http.is_safe_url function in Django before 1.4.18, 1.6.x before 1.6.10, and 1.7.x before 1.7.3 does not properly handle leading whitespaces, which allows remote attackers to conduct cross-site scripting (XSS) attacks via a crafted URL, related to redirect URLs, as demonstrated by a "\njavascript:" URL. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2015-0219  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-17 Code -

-

Django before 1.4.18, 1.6.x before 1.6.10, and 1.7.x before 1.7.3 allows remote attackers to spoof WSGI headers by using an _ (underscore) character instead of a - (dash) character in an HTTP header, as demonstrated by an X-Auth_User header. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

eggtest/__init__.py

-
-

Description: Simple project for producing an .egg.

-

- File Path: target\test-classes\python\eggtest\__init__.py
- MD5: ee53cac6173f2233cb2dd6dac4413b67
- SHA1: e55fa8e5d163a2e3d1044d1bf17dd2c09d7f4d43 -

- - - - -

Identifiers

-
-
  • None
-
-
-

Django-1.7.2.dist-info/METADATA

-
-

Description: A high-level Python Web framework that encourages rapid development and clean, pragmatic design.

-

- File Path: target\test-classes\python\site-packages\Django-1.7.2.dist-info\METADATA
- MD5: d77b67751477ae5bfb425e707222c275
- SHA1: 7f928e5ecbf0fa6d65d51d84d7d3abb3be7cf50d -

- - -

Identifiers

-
-
  • None
-
-
-

EggTest.egg-info/PKG-INFO

-
-

Description: Simple project for producing an .egg.

-

- File Path: target\test-classes\python\site-packages\EggTest.egg-info\PKG-INFO
- MD5: 583b6174a81fc2428ea51510ea082a69
- SHA1: 7b80ef725101822f447a3f85b39ed7f00263e98c -

- - - - -

Identifiers

-
-
  • None
-
-
-

regexp-1.3.jar

-
-

- File Path: target\test-classes\regexp-1.3.jar
- MD5: 6dcdc325850e40b843cac2a25fb2121e
- SHA1: 973df2b78b67bcd3144c3dbbb88da691065a3f8d -

- - -

Identifiers

-
- -
-
-

serp-1.13.1.jar

-
-

Description: Serp is an open source framework for manipulating Java bytecode.

-

- License:

BSD: LICENSE.txt
- File Path: target\test-classes\serp-1.13.1.jar
- MD5: f25cbd8e7d102a3f62cac34d8f623df5
- SHA1: 737a7b53f80fa2a4265d647a9417bd9ea671a592 -

- - -

Identifiers

-
- -
-
-

servlet-api-2.5.jar

-
-

- File Path: target\test-classes\servlet-api-2.5.jar
- MD5: 69ca51af4e9a67a1027a7f95b52c3e8f
- SHA1: 5959582d97d8b61f4d154ca9e495aafd16726e34 -

- - -

Identifiers

-
- -
-
-

slf4j-api-1.5.11.jar

-
-

Description: The slf4j API

-

- File Path: target\test-classes\slf4j-api-1.5.11.jar
- MD5: 30cb7bee9b52fcb5f5b03d2a006e26e8
- SHA1: d6a855b608971025b4fbb0970f829391cc6f727a -

- - -

Identifiers

-
- -
-
-

spring-core-2.5.5.jar

-
-

Description: Spring Framework: Core

-

- License:

The Apache Software License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\spring-core-2.5.5.jar
- MD5: 05432ef3bf4efa1394b127563cb1dd8c
- SHA1: 1b3b0fad8e30ebb9560a81989f5b5bfb28915109 -

- - - - -

Identifiers

-
- -
- -
-

CVE-2014-1904  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Cross-site scripting (XSS) vulnerability in web/servlet/tags/form/FormTag.java in Spring MVC in Spring Framework 3.0.0 before 3.2.8 and 4.0.0 before 4.0.2 allows remote attackers to inject arbitrary web script or HTML via the requested URI in a default action. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2014-0054  

-

Severity: - Medium -
CVSS Score: 6.8 -
CWE: CWE-352 -

-

The Jaxb2RootElementHttpMessageConverter in Spring MVC in Spring Framework before 3.2.8 and 4.0.0 before 4.0.2 does not disable external entity resolution, which allows remote attackers to read arbitrary files, cause a denial of service, and conduct CSRF attacks via crafted XML, aka an XML External Entity (XXE) issue. NOTE: this vulnerability exists because of an incomplete fix for CVE-2013-4152, CVE-2013-7315, and CVE-2013-6429. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-7315  

-

Severity: - Medium -
CVSS Score: 6.8 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

The Spring MVC in Spring Framework before 3.2.4 and 4.0.0.M1 through 4.0.0.M2 does not disable external entity resolution for the StAX XMLInputFactory, which allows context-dependent attackers to read arbitrary files, cause a denial of service, and conduct CSRF attacks via crafted XML with JAXB, aka an XML External Entity (XXE) issue, and a different vulnerability than CVE-2013-4152. NOTE: this issue was SPLIT from CVE-2013-4152 due to different affected versions. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-6429  

-

Severity: - Medium -
CVSS Score: 6.8 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

The SourceHttpMessageConverter in Spring MVC in Spring Framework before 3.2.5 and 4.0.0.M1 through 4.0.0.RC1 does not disable external entity resolution, which allows remote attackers to read arbitrary files, cause a denial of service, and conduct CSRF attacks via crafted XML, aka an XML External Entity (XXE) issue, and a different vulnerability than CVE-2013-4152 and CVE-2013-7315. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-4152  

-

Severity: - Medium -
CVSS Score: 6.8 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

The Spring OXM wrapper in Spring Framework before 3.2.4 and 4.0.0.M1, when using the JAXB marshaller, does not disable entity resolution, which allows context-dependent attackers to read arbitrary files, cause a denial of service, and conduct CSRF attacks via an XML external entity declaration in conjunction with an entity reference in a (1) DOMSource, (2) StAXSource, (3) SAXSource, or (4) StreamSource, aka an XML External Entity (XXE) issue. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2011-2730  

-

Severity: - High -
CVSS Score: 7.5 -
CWE: CWE-16 Configuration -

-

VMware SpringSource Spring Framework before 2.5.6.SEC03, 2.5.7.SR023, and 3.x before 3.0.6, when a container supports Expression Language (EL), evaluates EL expressions in tags twice, which allows remote attackers to obtain sensitive information via a (1) name attribute in a (a) spring:hasBindErrors tag; (2) path attribute in a (b) spring:bind or (c) spring:nestedpath tag; (3) arguments, (4) code, (5) text, (6) var, (7) scope, or (8) message attribute in a (d) spring:message or (e) spring:theme tag; or (9) var, (10) scope, or (11) value attribute in a (f) spring:transform tag, aka "Expression Language Injection." -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2010-1622  

-

Severity: - Medium -
CVSS Score: 5.1 -
CWE: CWE-94 Improper Control of Generation of Code ('Code Injection') -

-

SpringSource Spring Framework 2.5.x before 2.5.6.SEC02, 2.5.7 before 2.5.7.SR01, and 3.0.x before 3.0.3 allows remote attackers to execute arbitrary code via an HTTP request containing class.classLoader.URLs[0]=jar: followed by a URL of a crafted .jar file. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

spring-core-3.0.0.RELEASE.jar

-
-

- File Path: target\test-classes\spring-core-3.0.0.RELEASE.jar
- MD5: 2d52a505f093291e4a2c7e1a28f34557
- SHA1: 4f268922155ff53fb7b28aeca24fb28d5a439d95 -

- - - - -

Identifiers

-
- -
- -
-

CVE-2014-1904  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Cross-site scripting (XSS) vulnerability in web/servlet/tags/form/FormTag.java in Spring MVC in Spring Framework 3.0.0 before 3.2.8 and 4.0.0 before 4.0.2 allows remote attackers to inject arbitrary web script or HTML via the requested URI in a default action. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2014-0054  

-

Severity: - Medium -
CVSS Score: 6.8 -
CWE: CWE-352 -

-

The Jaxb2RootElementHttpMessageConverter in Spring MVC in Spring Framework before 3.2.8 and 4.0.0 before 4.0.2 does not disable external entity resolution, which allows remote attackers to read arbitrary files, cause a denial of service, and conduct CSRF attacks via crafted XML, aka an XML External Entity (XXE) issue. NOTE: this vulnerability exists because of an incomplete fix for CVE-2013-4152, CVE-2013-7315, and CVE-2013-6429. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-7315  

-

Severity: - Medium -
CVSS Score: 6.8 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

The Spring MVC in Spring Framework before 3.2.4 and 4.0.0.M1 through 4.0.0.M2 does not disable external entity resolution for the StAX XMLInputFactory, which allows context-dependent attackers to read arbitrary files, cause a denial of service, and conduct CSRF attacks via crafted XML with JAXB, aka an XML External Entity (XXE) issue, and a different vulnerability than CVE-2013-4152. NOTE: this issue was SPLIT from CVE-2013-4152 due to different affected versions. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-6429  

-

Severity: - Medium -
CVSS Score: 6.8 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

The SourceHttpMessageConverter in Spring MVC in Spring Framework before 3.2.5 and 4.0.0.M1 through 4.0.0.RC1 does not disable external entity resolution, which allows remote attackers to read arbitrary files, cause a denial of service, and conduct CSRF attacks via crafted XML, aka an XML External Entity (XXE) issue, and a different vulnerability than CVE-2013-4152 and CVE-2013-7315. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-4152  

-

Severity: - Medium -
CVSS Score: 6.8 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

The Spring OXM wrapper in Spring Framework before 3.2.4 and 4.0.0.M1, when using the JAXB marshaller, does not disable entity resolution, which allows context-dependent attackers to read arbitrary files, cause a denial of service, and conduct CSRF attacks via an XML external entity declaration in conjunction with an entity reference in a (1) DOMSource, (2) StAXSource, (3) SAXSource, or (4) StreamSource, aka an XML External Entity (XXE) issue. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2011-2894  

-

Severity: - Medium -
CVSS Score: 6.8 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

Spring Framework 3.0.0 through 3.0.5, Spring Security 3.0.0 through 3.0.5 and 2.0.0 through 2.0.6, and possibly other versions deserialize objects from untrusted sources, which allows remote attackers to bypass intended security restrictions and execute untrusted code by (1) serializing a java.lang.Proxy instance and using InvocationHandler, or (2) accessing internal AOP interfaces, as demonstrated using deserialization of a DefaultListableBeanFactory instance to execute arbitrary commands via the java.lang.Runtime class. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2011-2730  

-

Severity: - High -
CVSS Score: 7.5 -
CWE: CWE-16 Configuration -

-

VMware SpringSource Spring Framework before 2.5.6.SEC03, 2.5.7.SR023, and 3.x before 3.0.6, when a container supports Expression Language (EL), evaluates EL expressions in tags twice, which allows remote attackers to obtain sensitive information via a (1) name attribute in a (a) spring:hasBindErrors tag; (2) path attribute in a (b) spring:bind or (c) spring:nestedpath tag; (3) arguments, (4) code, (5) text, (6) var, (7) scope, or (8) message attribute in a (d) spring:message or (e) spring:theme tag; or (9) var, (10) scope, or (11) value attribute in a (f) spring:transform tag, aka "Expression Language Injection." -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2010-1622  

-

Severity: - Medium -
CVSS Score: 5.1 -
CWE: CWE-94 Improper Control of Generation of Code ('Code Injection') -

-

SpringSource Spring Framework 2.5.x before 2.5.6.SEC02, 2.5.7 before 2.5.7.SR01, and 3.0.x before 3.0.3 allows remote attackers to execute arbitrary code via an HTTP request containing class.classLoader.URLs[0]=jar: followed by a URL of a crafted .jar file. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

spring-retry-1.1.0.RELEASE.jar

-
-

Description: Spring Retry provides an abstraction around retrying failed operations, with an emphasis on declarative control of the process and policy-based bahaviour that is easy to extend and customize. For instance, you can configure a plain POJO operation to retry if it fails, based on the type of exception, and with a fixed or exponential backoff. -

-

- License:

Apache 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\spring-retry-1.1.0.RELEASE.jar
- MD5: 0958739406306923bde05542a035fb48
- SHA1: f7e1ec1fd7c8fcaca490fd298c5b3fe711cb5ed9 -

- - -

Identifiers

-
- -
-
-

spring-security-core-3.0.0.RELEASE.jar

-
-

- File Path: target\test-classes\spring-security-core-3.0.0.RELEASE.jar
- MD5: 740649fa36b65f4bfe7d2a57e2b2807e
- SHA1: 23dd919891e86a1b74b9198bd67a4ae9f4849c28 -

- - - - -

Identifiers

-
- -
- -
-

CVE-2012-5055  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-200 Information Exposure -

-

DaoAuthenticationProvider in VMware SpringSource Spring Security before 2.0.8, 3.0.x before 3.0.8, and 3.1.x before 3.1.3 does not check the password if the user is not found, which makes the response delay shorter and might allow remote attackers to enumerate valid usernames via a series of login requests. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2011-2894  

-

Severity: - Medium -
CVSS Score: 6.8 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

Spring Framework 3.0.0 through 3.0.5, Spring Security 3.0.0 through 3.0.5 and 2.0.0 through 2.0.6, and possibly other versions deserialize objects from untrusted sources, which allows remote attackers to bypass intended security restrictions and execute untrusted code by (1) serializing a java.lang.Proxy instance and using InvocationHandler, or (2) accessing internal AOP interfaces, as demonstrated using deserialization of a DefaultListableBeanFactory instance to execute arbitrary commands via the java.lang.Runtime class. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2011-2732  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-94 Improper Control of Generation of Code ('Code Injection') -

-

CRLF injection vulnerability in the logout functionality in VMware SpringSource Spring Security before 2.0.7 and 3.0.x before 3.0.6 allows remote attackers to inject arbitrary HTTP headers and conduct HTTP response splitting attacks via the spring-security-redirect parameter. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2011-2731  

-

Severity: - Medium -
CVSS Score: 5.1 -
CWE: CWE-362 Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition') -

-

Race condition in the RunAsManager mechanism in VMware SpringSource Spring Security before 2.0.7 and 3.0.x before 3.0.6 stores the Authentication object in the shared security context, which allows attackers to gain privileges via a crafted thread. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2010-3700  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

VMware SpringSource Spring Security 2.x before 2.0.6 and 3.x before 3.0.4, and Acegi Security 1.0.0 through 1.0.7, as used in IBM WebSphere Application Server (WAS) 6.1 and 7.0, allows remote attackers to bypass security constraints via a path parameter. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

stagedhttp-modified.tar: commons-httpclient-2.0.jar

-
-

- File Path: target\test-classes\stagedhttp-modified.tar\WEB-INF\lib\commons-httpclient-2.0.jar
- MD5: e0c0c1f887a8b1025a8bed9bff6ab771
- SHA1: 19f1cb5ffd50c37b7ee43b8bc7a185b421ea3e9c -

- - -

Identifiers

-
-
    -
  • maven: commons-httpclient:commons-httpclient:2.0 -   Confidence:HIGHEST -
  • -
  • cpe: cpe:/a:apache:commons-httpclient:2.0 -   Confidence:LOW -    -
  • -
  • cpe: cpe:/a:apache:httpclient:2.0 -   Confidence:LOW -    -
  • -
-
- -
-

CVE-2014-3577  

-

Severity: - Medium -
CVSS Score: 5.8 -

-

org.apache.http.conn.ssl.AbstractVerifier in Apache HttpComponents HttpClient before 4.3.5 and HttpAsyncClient before 4.0.2 does not properly verify that the server hostname matches a domain name in the subject's Common Name (CN) or subjectAltName field of the X.509 certificate, which allows man-in-the-middle attackers to spoof SSL servers via a "CN=" string in a field in the distinguished name (DN) of a certificate, as demonstrated by the "foo,CN=www.apache.org" string in the O field. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

stagedhttp-modified.tar: commons-logging.jar

-
-

Description: Commons Logging

-

- File Path: target\test-classes\stagedhttp-modified.tar\WEB-INF\lib\commons-logging.jar
- MD5: 5bc8bdd15b18018e84fd862993aaca42
- SHA1: 760c711c71588bc273d3e56d196d720a7678cd93 -

- - -

Identifiers

-
- -
-
-

stagedhttp-modified.tar: dom4j.jar

-
-

- File Path: target\test-classes\stagedhttp-modified.tar\WEB-INF\lib\dom4j.jar
- MD5: 85e3e7dfd9d039da0b8ea0a46129323f
- SHA1: 8decb7e2c04c9340375aaf7dd43a7a6a9b9a46b1 -

- - -

Identifiers

-
- -
-
-

stagedhttp-modified.tar: jgroups-all.jar

-
-

- File Path: target\test-classes\stagedhttp-modified.tar\WEB-INF\lib\jgroups-all.jar
- MD5: 06b44a40f4215af9a534ace65c51a2ca
- SHA1: 15201a98948972d4e890a1d9bd6b728b917ef21c -

- - -

Identifiers

-
- -
-
-

stagedhttp-modified.tar: log4j.jar

-
-

- File Path: target\test-classes\stagedhttp-modified.tar\WEB-INF\lib\log4j.jar
- MD5: 91e6a0cd2788d69808c05fae11d69679
- SHA1: c28b336aa1547a885ddef944af6bfb7bff25abf0 -

- - -

Identifiers

-
-
  • None
-
-
-

stagedhttp-modified.tar: mail.jar

-
-

- File Path: target\test-classes\stagedhttp-modified.tar\WEB-INF\lib\mail.jar
- MD5: 3ad3cde613b7e9700fed08d979bcccc7
- SHA1: 6d16579c99ea9fd5ca5fd2dbe45a5144c2873681 -

- - -

Identifiers

-
- -
- -
-

CVE-2007-6059  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-399 Resource Management Errors -

-

** DISPUTED ** Javamail does not properly handle a series of invalid login attempts in which the same e-mail address is entered as username and password, and the domain portion of this address yields a Java UnknownHostException error, which allows remote attackers to cause a denial of service (connection pool exhaustion) via a large number of requests, resulting in a SQLNestedException. NOTE: Sun disputes this issue, stating "The report makes references to source code and files that do not exist in the mentioned products." -

-

- -

Vulnerable Software & Versions:

-

CVE-2005-1754  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-200 Information Exposure -

-

** DISPUTED ** JavaMail API 1.1.3 through 1.3, as used by Apache Tomcat 5.0.16, allows remote attackers to read arbitrary files via a full pathname in the argument to the Download parameter. NOTE: Sun and Apache dispute this issue. Sun states: "The report makes references to source code and files that do not exist in the mentioned products." -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2005-1105  

-

Severity: - Medium -
CVSS Score: 5.0 -

-

Directory traversal vulnerability in the MimeBodyPart.getFileName method in JavaMail 1.3.2 allows remote attackers to write arbitrary files via a .. (dot dot) in the filename in the Content-Disposition header. -

-

- -

Vulnerable Software & Versions:

-
-
-

stagedhttp-modified.tar: serializer.jar

-
-

- File Path: target\test-classes\stagedhttp-modified.tar\WEB-INF\lib\serializer.jar
- MD5: 35aa6a56662458d9dc28a9b628f84847
- SHA1: 85ddd38e4cdbc22fb6c518f3d35744336da6fbfd -

- - -

Identifiers

-
-
  • None
-
-
-

stagedhttp-modified.tar: xalan.jar

-
-

- File Path: target\test-classes\stagedhttp-modified.tar\WEB-INF\lib\xalan.jar
- MD5: 126c0c876a6b9726cfdd43f052923660
- SHA1: 10f170da8dfbcdcc4098131ba773710f0ba7aef1 -

- - -

Identifiers

-
-
  • None
-
-
-

stagedhttp-modified.tar: xmlsec-1.3.0.jar

-
-

Description:  - The XML Security project is aimed at providing implementation of security standards for XML -

-

- File Path: target\test-classes\stagedhttp-modified.tar\WEB-INF\lib\xmlsec-1.3.0.jar
- MD5: ed82e8662f1823e70ba8f468f57eb11b
- SHA1: 59c4b71e0a5871f26db91eaab236e5b9bf41122e -

- - -

Identifiers

-
- -
-
-

stagedhttp-modified.tar: xss4j.jar

-
-

- File Path: target\test-classes\stagedhttp-modified.tar\WEB-INF\lib\xss4j.jar
- MD5: 3572ac321c3a854ec49d8594a17e3699
- SHA1: d0f4126b39370c3fad93163ca17fd3caa3d29e97 -

- - -

Identifiers

-
-
  • None
-
-
-

struts.jar

-
-

Description: The core of the Struts framework is a flexible control layer based on - standard technologies like Java Servlets, JavaBeans, ResourceBundles, - and Extensible Markup Language (XML), as well as various Jakarta Commons - packages. - - Struts encourages application architectures based on the Model - 2 approach, a variation of the classic Model-View-Controller (MVC) design - paradigm. Struts provides its own Controller component and integrates with - other technologies to provide the Model and the View. - - For the Model, Struts can interact with any standard data access technology, - including Enterprise Java Beans, JDBC, and Object Relational Bridge. - - For the View, Struts works well with JavaServer Pages, including JSTL and - JSF, as well as Velocity Templates, XSLT, and other presentation systems. - - The Struts framework provides the invisible underpinnings every professional - web application needs to survive. Struts helps you create an extensible - development environment for your application, based on published standards - and proven design patterns.

-

- License:

The Apache Software License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0
- File Path: target\test-classes\struts.jar
- MD5: aa4ae098ec87fbcd6591402e5cbd781a
- SHA1: f69e6119eb01f9ad064bd358ed0315618fb1cb5c -

- - - - -

Identifiers

-
- -
- -
-

CVE-2014-0114  

-

Severity: - High -
CVSS Score: 7.5 -
CWE: CWE-20 Improper Input Validation -

-

Apache Commons BeanUtils, as distributed in lib/commons-beanutils-1.8.0.jar in Apache Struts 1.x through 1.3.10 and in other products requiring commons-beanutils through 1.9.2, does not suppress the class property, which allows remote attackers to "manipulate" the ClassLoader and execute arbitrary code via the class parameter, as demonstrated by the passing of this parameter to the getClass method of the ActionForm object in Struts 1. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2008-6504  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-20 Improper Input Validation -

-

ParametersInterceptor in OpenSymphony XWork 2.0.x before 2.0.6 and 2.1.x before 2.1.2, as used in Apache Struts and other products, does not properly restrict # (pound sign) references to context objects, which allows remote attackers to execute Object-Graph Navigation Language (OGNL) statements and modify server-side context objects, as demonstrated by use of a \u0023 representation for the # character. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2008-2025  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Cross-site scripting (XSS) vulnerability in Apache Struts before 1.2.9-162.31.1 on SUSE Linux Enterprise (SLE) 11, before 1.2.9-108.2 on SUSE openSUSE 10.3, before 1.2.9-198.2 on SUSE openSUSE 11.0, and before 1.2.9-162.163.2 on SUSE openSUSE 11.1 allows remote attackers to inject arbitrary web script or HTML via unspecified vectors related to "insufficient quoting of parameters." -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2006-1548  

-

Severity: - Medium -
CVSS Score: 4.3 -

-

Cross-site scripting (XSS) vulnerability in (1) LookupDispatchAction and possibly (2) DispatchAction and (3) ActionDispatcher in Apache Software Foundation (ASF) Struts before 1.2.9 allows remote attackers to inject arbitrary web script or HTML via the parameter name, which is not filtered in the resulting error message. -

-

- -

Vulnerable Software & Versions:

-

CVE-2006-1547  

-

Severity: - High -
CVSS Score: 7.8 -

-

ActionForm in Apache Software Foundation (ASF) Struts before 1.2.9 with BeanUtils 1.7 allows remote attackers to cause a denial of service via a multipart/form-data encoded form with a parameter name that references the public getMultipartRequestHandler method, which provides further access to elements in the CommonsMultipartRequestHandler implementation and BeanUtils. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2006-1546  

-

Severity: - High -
CVSS Score: 7.5 -

-

Apache Software Foundation (ASF) Struts before 1.2.9 allows remote attackers to bypass validation via a request with a 'org.apache.struts.taglib.html.Constants.CANCEL' parameter, which causes the action to be canceled but would not be detected from applications that do not use the isCancelled check. -

-

- -

Vulnerable Software & Versions:

-

CVE-2005-3745  

-

Severity: - Medium -
CVSS Score: 4.3 -

-

Cross-site scripting (XSS) vulnerability in Apache Struts 1.2.7, and possibly other versions allows remote attackers to inject arbitrary web script or HTML via the query string, which is not properly quoted or filtered when the request handler generates an error message. -

-

- -

Vulnerable Software & Versions:

-
-
-

struts2-core-2.1.2.jar

-
-

Description: Apache Struts 2

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\struts2-core-2.1.2.jar
- MD5: c30b57142e1ccbc1efd5cd15f307358f
- SHA1: 89ce9e36aa9a9e03f1450936d2f4f8dd0f961f8b -

- - - - -

Identifiers

-
- -
- -
-

CVE-2014-7809  

-

Severity: - Medium -
CVSS Score: 6.8 -
CWE: CWE-352 -

-

Apache Struts 2.0.0 through 2.3.x before 2.3.20 uses predictable <s:token/> values, which allows remote attackers to bypass the CSRF protection mechanism. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2014-0116  

-

Severity: - Medium -
CVSS Score: 5.8 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

CookieInterceptor in Apache Struts 2.x before 2.3.16.3, when a wildcard cookiesName value is used, does not properly restrict access to the getClass method, which allows remote attackers to "manipulate" the ClassLoader and modify session state via a crafted request. NOTE: this vulnerability exists because of an incomplete fix for CVE-2014-0113. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2014-0113  

-

Severity: - High -
CVSS Score: 7.5 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

CookieInterceptor in Apache Struts before 2.3.16.2, when a wildcard cookiesName value is used, does not properly restrict access to the getClass method, which allows remote attackers to "manipulate" the ClassLoader and execute arbitrary code via a crafted request. NOTE: this vulnerability exists because of an incomplete fix for CVE-2014-0094. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2014-0112  

-

Severity: - High -
CVSS Score: 7.5 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

ParametersInterceptor in Apache Struts before 2.3.16.2 does not properly restrict access to the getClass method, which allows remote attackers to "manipulate" the ClassLoader and execute arbitrary code via a crafted request. NOTE: this vulnerability exists because of an incomplete fix for CVE-2014-0094. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2014-0094  

-

Severity: - Medium -
CVSS Score: 5.0 -

-

The ParametersInterceptor in Apache Struts before 2.3.16.1 allows remote attackers to "manipulate" the ClassLoader via the class parameter, which is passed to the getClass method. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-4316  

-

Severity: - High -
CVSS Score: 10.0 -
CWE: CWE-16 Configuration -

-

Apache Struts 2.0.0 through 2.3.15.1 enables Dynamic Method Invocation by default, which has unknown impact and attack vectors. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-4310  

-

Severity: - Medium -
CVSS Score: 5.8 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

Apache Struts 2.0.0 through 2.3.15.1 allows remote attackers to bypass access controls via a crafted action: prefix. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-2251  

-

Severity: - High -
CVSS Score: 9.3 -
CWE: CWE-20 Improper Input Validation -

-

Apache Struts 2.0.0 through 2.3.15 allows remote attackers to execute arbitrary OGNL expressions via a parameter with a crafted (1) action:, (2) redirect:, or (3) redirectAction: prefix. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-2248  

-

Severity: - Medium -
CVSS Score: 5.8 -
CWE: CWE-20 Improper Input Validation -

-

Multiple open redirect vulnerabilities in Apache Struts 2.0.0 through 2.3.15 allow remote attackers to redirect users to arbitrary web sites and conduct phishing attacks via a URL in a parameter using the (1) redirect: or (2) redirectAction: prefix. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-2135  

-

Severity: - High -
CVSS Score: 9.3 -
CWE: CWE-94 Improper Control of Generation of Code ('Code Injection') -

-

Apache Struts 2 before 2.3.14.3 allows remote attackers to execute arbitrary OGNL code via a request with a crafted value that contains both "${}" and "%{}" sequences, which causes the OGNL code to be evaluated twice. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-2134  

-

Severity: - High -
CVSS Score: 9.3 -
CWE: CWE-94 Improper Control of Generation of Code ('Code Injection') -

-

Apache Struts 2 before 2.3.14.3 allows remote attackers to execute arbitrary OGNL code via a request with a crafted action name that is not properly handled during wildcard matching, a different vulnerability than CVE-2013-2135. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-2115  

-

Severity: - High -
CVSS Score: 9.3 -
CWE: CWE-94 Improper Control of Generation of Code ('Code Injection') -

-

Apache Struts 2 before 2.3.14.2 allows remote attackers to execute arbitrary OGNL code via a crafted request that is not properly handled when using the includeParams attribute in the (1) URL or (2) A tag. NOTE: this issue is due to an incomplete fix for CVE-2013-1966. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-1966  

-

Severity: - High -
CVSS Score: 9.3 -
CWE: CWE-94 Improper Control of Generation of Code ('Code Injection') -

-

Apache Struts 2 before 2.3.14.1 allows remote attackers to execute arbitrary OGNL code via a crafted request that is not properly handled when using the includeParams attribute in the (1) URL or (2) A tag. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-1965  

-

Severity: - High -
CVSS Score: 9.3 -
CWE: CWE-94 Improper Control of Generation of Code ('Code Injection') -

-

Apache Struts Showcase App 2.0.0 through 2.3.13, as used in Struts 2 before 2.3.14.1, allows remote attackers to execute arbitrary OGNL code via a crafted parameter name that is not properly handled when invoking a redirect. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2012-4387  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

Apache Struts 2.0.0 through 2.3.4 allows remote attackers to cause a denial of service (CPU consumption) via a long parameter name, which is processed as an OGNL expression. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2012-4386  

-

Severity: - Medium -
CVSS Score: 6.8 -
CWE: CWE-352 -

-

The token check mechanism in Apache Struts 2.0.0 through 2.3.4 does not properly validate the token name configuration parameter, which allows remote attackers to perform cross-site request forgery (CSRF) attacks by setting the token name configuration parameter to a session attribute. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2012-0838  

-

Severity: - High -
CVSS Score: 10.0 -
CWE: CWE-20 Improper Input Validation -

-

Apache Struts 2 before 2.2.3.1 evaluates a string as an OGNL expression during the handling of a conversion error, which allows remote attackers to modify run-time data values, and consequently execute arbitrary code, via invalid input to a field. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2012-0394  

-

Severity: - Medium -
CVSS Score: 6.8 -
CWE: CWE-94 Improper Control of Generation of Code ('Code Injection') -

-

** DISPUTED ** The DebuggingInterceptor component in Apache Struts before 2.3.1.1, when developer mode is used, allows remote attackers to execute arbitrary commands via unspecified vectors. NOTE: the vendor characterizes this behavior as not "a security vulnerability itself." -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2012-0393  

-

Severity: - Medium -
CVSS Score: 6.4 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

The ParameterInterceptor component in Apache Struts before 2.3.1.1 does not prevent access to public constructors, which allows remote attackers to create or overwrite arbitrary files via a crafted parameter that triggers the creation of a Java object. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2012-0392  

-

Severity: - High -
CVSS Score: 9.3 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

The CookieInterceptor component in Apache Struts before 2.3.1.1 does not use the parameter-name whitelist, which allows remote attackers to execute arbitrary commands via a crafted HTTP Cookie header that triggers Java code execution through a static method. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2012-0391  

-

Severity: - High -
CVSS Score: 9.3 -
CWE: CWE-20 Improper Input Validation -

-

The ExceptionDelegator component in Apache Struts before 2.2.3.1 interprets parameter values as OGNL expressions during certain exception handling for mismatched data types of properties, which allows remote attackers to execute arbitrary Java code via a crafted parameter. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2011-5057  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

Apache Struts 2.3.1.1 and earlier provides interfaces that do not properly restrict access to collections such as the session and request collections, which might allow remote attackers to modify run-time data values via a crafted parameter to an application that implements an affected interface, as demonstrated by the SessionAware, RequestAware, ApplicationAware, ServletRequestAware, ServletResponseAware, and ParameterAware interfaces. NOTE: the vendor disputes the significance of this report because of an "easy work-around in existing apps by configuring the interceptor." -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2011-2087  

-

Severity: - Medium -
CVSS Score: 4.3 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Multiple cross-site scripting (XSS) vulnerabilities in component handlers in the javatemplates (aka Java Templates) plugin in Apache Struts 2.x before 2.2.3 allow remote attackers to inject arbitrary web script or HTML via an arbitrary parameter value to a .action URI, related to improper handling of value attributes in (1) FileHandler.java, (2) HiddenHandler.java, (3) PasswordHandler.java, (4) RadioHandler.java, (5) ResetHandler.java, (6) SelectHandler.java, (7) SubmitHandler.java, and (8) TextFieldHandler.java. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2011-1772  

-

Severity: - Low -
CVSS Score: 2.6 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Multiple cross-site scripting (XSS) vulnerabilities in XWork in Apache Struts 2.x before 2.2.3, and OpenSymphony XWork in OpenSymphony WebWork, allow remote attackers to inject arbitrary web script or HTML via vectors involving (1) an action name, (2) the action attribute of an s:submit element, or (3) the method attribute of an s:submit element. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2010-1870  

-

Severity: - Medium -
CVSS Score: 5.0 -

-

The OGNL extensive expression evaluation capability in XWork in Struts 2.0.0 through 2.1.8.1, as used in Atlassian Fisheye, Crucible, and possibly other products, uses a permissive whitelist, which allows remote attackers to modify server-side context objects and bypass the "#" protection mechanism in ParameterInterceptors via the (1) #context, (2) #_memberAccess, (3) #root, (4) #this, (5) #_typeResolver, (6) #_classResolver, (7) #_traceEvaluations, (8) #_lastEvaluation, (9) #_keepLastEvaluation, and possibly other OGNL context variables, a different vulnerability than CVE-2008-6504. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2008-6504  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-20 Improper Input Validation -

-

ParametersInterceptor in OpenSymphony XWork 2.0.x before 2.0.6 and 2.1.x before 2.1.2, as used in Apache Struts and other products, does not properly restrict # (pound sign) references to context objects, which allows remote attackers to execute Object-Graph Navigation Language (OGNL) statements and modify server-side context objects, as demonstrated by use of a \u0023 representation for the # character. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

uber-1.0-SNAPSHOT.jar

-
-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar
- MD5: 634d5cc32238fc3d023941d265189ddd
- SHA1: e9a3159254a01777f536d556bcdb539c7617b0e5 -

- - -

Identifiers

-
-
  • None
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/com.google.guava/guava/pom.xml

-
-

Description:  - Guava is a suite of core and expanded libraries that include - utility classes, google's collections, io classes, and much - much more. - - This project is a complete packaging of all the Guava libraries - into a single jar. Individual portions of Guava can be used - by downloading the appropriate module and its dependencies. - - Guava (complete) has only one code dependency - javax.annotation, - per the JSR-305 spec. -

-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/com.google.guava/guava/pom.xml
- MD5: 76e749cc3e65c708116326959af90f64
- SHA1: b7f1e532b79c7e1c09849c89460798d9a7c59eaf -

- - -

Identifiers

-
-
    -
  • maven: com.google.guava:guava:11.0.1 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/com.googlecode.jtype/jtype/pom.xml

-
-

Description: Library for working with the Java 5 type system

-

- License:

The Apache Software License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/com.googlecode.jtype/jtype/pom.xml
- MD5: a1dde0cb5b6ebe7e7d3540e0310042ac
- SHA1: 2b51d041544482b183c1ae49eba99099d6f14998 -

- - -

Identifiers

-
-
    -
  • maven: com.googlecode.jtype:jtype:0.1.1 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/com.sun.jersey/jersey-core/pom.xml

-
-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/com.sun.jersey/jersey-core/pom.xml
- MD5: ff77b5aceaf6d73a121bcb471444f071
- SHA1: e1c1339fa2c342aa5a24dcdd3658c00a2139263a -

- - -

Identifiers

-
-
    -
  • maven: com.sun.jersey:jersey-core:1.11 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/com.sun.jersey/jersey-server/pom.xml

-
-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/com.sun.jersey/jersey-server/pom.xml
- MD5: 07a7be16c32692944c7fe8dcc8685d3c
- SHA1: baffe4cdc261e43b5e727d47a5f92691a473ca78 -

- - -

Identifiers

-
-
    -
  • maven: com.sun.jersey:jersey-server:1.11 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/com.sun.jersey/jersey-servlet/pom.xml

-
-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/com.sun.jersey/jersey-servlet/pom.xml
- MD5: ed005c0838de5f8a6e0fe6ef31b827a0
- SHA1: f1c4462e1f967afe6c150b3955b72c71780e2916 -

- - -

Identifiers

-
-
    -
  • maven: com.sun.jersey:jersey-servlet:1.11 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.dropwizard/dropwizard-core/pom.xml

-
-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.dropwizard/dropwizard-core/pom.xml
- MD5: 818fd048671bd58716cd687cdcd79ba4
- SHA1: 905a71014bc2ba9e893107268ba8227528f31617 -

- - -

Identifiers

-
-
    -
  • maven: com.yammer.dropwizard:dropwizard-core:0.1.3 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-annotation/pom.xml

-
-

Description:  - A dependency-less package of just the annotations used by other Metrics modules. -

-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-annotation/pom.xml
- MD5: fac7425f6b8789ee45f7a7ad56711af0
- SHA1: f28c170c7fbff96de88602d1d11afd9b618e6c59 -

- - -

Identifiers

-
-
    -
  • maven: com.yammer.metrics:metrics-annotation:2.0.0-RC0 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-core/pom.xml

-
-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-core/pom.xml
- MD5: 726812bd630cb75b3cadf40346c669e9
- SHA1: c04a80a736ae29268265e22aa7e21dea68c63d1b -

- - -

Identifiers

-
-
    -
  • maven: com.yammer.metrics:metrics-core:2.0.0-RC0 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-jersey/pom.xml

-
-

Description:  - A set of class providing Metrics integration for Jersey, the reference JAX- - implementation. -

-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-jersey/pom.xml
- MD5: 0b751b9e702fbd84c41644d71ba55862
- SHA1: 8f90c99a87e2e1c67a1056c387bbe3ff1e92f2aa -

- - -

Identifiers

-
-
    -
  • maven: com.yammer.metrics:metrics-jersey:2.0.0-RC0 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-jetty/pom.xml

-
-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-jetty/pom.xml
- MD5: 994485bf6db4621a698290e213f0838e
- SHA1: 3d4c7ee060f83ca829ee3ef22900e3af49579f53 -

- - -

Identifiers

-
-
    -
  • maven: com.yammer.metrics:metrics-jetty:2.0.0-RC0 -   Confidence:HIGH -
  • -
  • cpe: cpe:/a:jetty:jetty:2.0.0.rc0 -   Confidence:LOW -    -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-log4j/pom.xml

-
-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-log4j/pom.xml
- MD5: 72b71c62a25ec1c934d7b1463fe9790d
- SHA1: 66c0601572c4ea1df2aa24e69ff0a7c16a42623b -

- - -

Identifiers

-
-
    -
  • maven: com.yammer.metrics:metrics-log4j:2.0.0-RC0 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-servlet/pom.xml

-
-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/com.yammer.metrics/metrics-servlet/pom.xml
- MD5: f71c2da1da38a5d505d892c2fe6022d2
- SHA1: 838aaae3f56141a6e35e87003d90f1c7132f839c -

- - -

Identifiers

-
-
    -
  • maven: com.yammer.metrics:metrics-servlet:2.0.0-RC0 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/commons-io/commons-io/pom.xml

-
-

Description:  - Commons-IO contains utility classes, stream implementations, file filters, and endian classes. -

-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/commons-io/commons-io/pom.xml
- MD5: 92beb726a369cb3ce2503796f98e2f3b
- SHA1: d30e29bee45e6da52a776266a460f10b51ceca98 -

- - -

Identifiers

-
-
    -
  • maven: commons-io:commons-io:1.3.2 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/javax.validation/validation-api/pom.xml

-
-

Description:  - Bean Validation (JSR-303) API. -

-

- License:

Apache License, Version 2.0: license.txt
- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/javax.validation/validation-api/pom.xml
- MD5: 16476d0cc05b8a4fa53fe1c06383e5dd
- SHA1: 257066393db253e1b7ab5f5ee76256615795d08f -

- - -

Identifiers

-
-
    -
  • maven: javax.validation:validation-api:1.0.0.GA -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/log4j/log4j/pom.xml

-
-

Description: Apache Log4j 1.2

-

- License:

The Apache Software License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/log4j/log4j/pom.xml
- MD5: e15d65d6c97d87704176c1e9338a2adb
- SHA1: 88efb1b8d3d993fe339e9e2b201c75eed57d4c65 -

- - -

Identifiers

-
-
    -
  • maven: log4j:log4j:1.2.16 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-continuation/pom.xml

-
-

Description: Asynchronous API

-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-continuation/pom.xml
- MD5: 74919244c9ca106d221f23a832e1076d
- SHA1: b59985a1ba1b93fbbd5d90b6ff5ed9f44cc91ac7 -

- - -

Identifiers

-
-
    -
  • cpe: cpe:/a:jetty:jetty:7.6.0.rc4 -   Confidence:LOW -    -
  • -
  • maven: org.eclipse.jetty:jetty-continuation:7.6.0.RC4 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-http/pom.xml

-
-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-http/pom.xml
- MD5: f1b6db43b8a499e66ddf58c8165714a5
- SHA1: 885e6e766ec3452c085324a9759de5ad8a1c8971 -

- - -

Identifiers

-
-
    -
  • cpe: cpe:/a:jetty:jetty:7.6.0.rc4 -   Confidence:LOW -    -
  • -
  • maven: org.eclipse.jetty:jetty-http:7.6.0.RC4 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-io/pom.xml

-
-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-io/pom.xml
- MD5: 941c55f8ac0d6c14971d20be7b60ec19
- SHA1: f8f0907153f891113bdee011063e540d7d57a496 -

- - -

Identifiers

-
-
    -
  • cpe: cpe:/a:jetty:jetty:7.6.0.rc4 -   Confidence:LOW -    -
  • -
  • maven: org.eclipse.jetty:jetty-io:7.6.0.RC4 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-security/pom.xml

-
-

Description: Jetty security infrastructure

-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-security/pom.xml
- MD5: 266a3467a1d03bce12e34fda16dfa615
- SHA1: 53b54057b58ae7d3c4c12b520b048889a2c28ad8 -

- - -

Identifiers

-
-
    -
  • cpe: cpe:/a:jetty:jetty:7.6.0.rc4 -   Confidence:LOW -    -
  • -
  • maven: org.eclipse.jetty:jetty-security:7.6.0.RC4 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-server/pom.xml

-
-

Description: The core jetty server artifact.

-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-server/pom.xml
- MD5: 55a7034666834be8a62b8db044ac8d70
- SHA1: a9ae16cb473f1797940dd58ed3d5541c88b34396 -

- - -

Identifiers

-
-
    -
  • cpe: cpe:/a:jetty:jetty:7.6.0.rc4 -   Confidence:LOW -    -
  • -
  • maven: org.eclipse.jetty:jetty-server:7.6.0.RC4 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-servlet/pom.xml

-
-

Description: Jetty Servlet Container

-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-servlet/pom.xml
- MD5: e662a30ea722c442a57a83c478fd7d7e
- SHA1: 4a2d357d991aff1ee18e617b7c1076dbcfe89986 -

- - -

Identifiers

-
-
    -
  • cpe: cpe:/a:jetty:jetty:7.6.0.rc4 -   Confidence:LOW -    -
  • -
  • maven: org.eclipse.jetty:jetty-servlet:7.6.0.RC4 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-util/pom.xml

-
-

Description: Utility classes for Jetty

-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/org.eclipse.jetty/jetty-util/pom.xml
- MD5: c147343fa7f11c15a5f99ddf8a830b20
- SHA1: 9a86a0c493d3834471b7a03e174a9f4d469cbd98 -

- - -

Identifiers

-
-
    -
  • cpe: cpe:/a:jetty:jetty:7.6.0.rc4 -   Confidence:LOW -    -
  • -
  • maven: org.eclipse.jetty:jetty-util:7.6.0.RC4 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/org.hibernate/hibernate-validator/pom.xml

-
-

Description:  - Hibernate's Bean Validation (JSR-303) reference implementation. -

-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/org.hibernate/hibernate-validator/pom.xml
- MD5: 80f5387c7495664fc4ba31138829b0b8
- SHA1: 02ae7dae4450b00f78d8bc458590221e7401eee7 -

- - -

Identifiers

-
- -
- -
-

CVE-2014-3558  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

ReflectionHelper (org.hibernate.validator.util.ReflectionHelper) in Hibernate Validator 4.1.0 before 4.2.1, 4.3.x before 4.3.2, and 5.x before 5.1.2 allows attackers to bypass Java Security Manager (JSM) restrictions and execute restricted reflection calls via a crafted application. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/org.owasp.dependency-check/uber/pom.xml

-
-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/org.owasp.dependency-check/uber/pom.xml
- MD5: 2c67a7108125ede340218e9deba58e82
- SHA1: 52fb11f0fc1666a343aa5c5ea0f756ba54934c1f -

- - -

Identifiers

-
-
    -
  • maven: org.owasp.dependency-check:uber:1.0-SNAPSHOT -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/org.slf4j/jul-to-slf4j/pom.xml

-
-

Description:  - JUL to SLF4J bridge -

-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/org.slf4j/jul-to-slf4j/pom.xml
- MD5: ae2b577066d99bea42b1e1f2f0aaf45d
- SHA1: bd08211dd5fa0ab44a0a3b04c1ec0c5f67348334 -

- - -

Identifiers

-
-
    -
  • maven: org.slf4j:jul-to-slf4j:1.6.4 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/org.slf4j/slf4j-api/pom.xml

-
-

Description: The slf4j API

-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/org.slf4j/slf4j-api/pom.xml
- MD5: d000b772974fbe3ad9e1a68ad8f484e7
- SHA1: 93c66c9afd6cf7b91bd4ecf38a60ca48fc5f2078 -

- - -

Identifiers

-
-
    -
  • maven: org.slf4j:slf4j-api:1.6.4 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/org.slf4j/slf4j-log4j12/pom.xml

-
-

Description:  - The slf4j log4j-12 binding -

-

- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/org.slf4j/slf4j-log4j12/pom.xml
- MD5: 228315739fc30a7eb2403bcc8aaca619
- SHA1: ab93dfaa2fb9619d91fb31a64bb65802b56ed0fb -

- - -

Identifiers

-
-
    -
  • maven: org.slf4j:slf4j-log4j12:1.6.4 -   Confidence:HIGH -
  • -
-
-
-

uber-1.0-SNAPSHOT.jar\META-INF/maven/org.yaml/snakeyaml/pom.xml

-
-

Description: YAML 1.1 parser and emitter for Java

-

- License:

Apache License Version 2.0: LICENSE.txt
- File Path: target\test-classes\uber-1.0-SNAPSHOT.jar\META-INF/maven/org.yaml/snakeyaml/pom.xml
- MD5: 53d95f8de1150f5addaecae68a5dd5cc
- SHA1: 6464e4a69d7d79c63a6eb286db777d1e3819c4f7 -

- - -

Identifiers

-
-
    -
  • maven: org.yaml:snakeyaml:1.9 -   Confidence:HIGH -
  • -
-
-
-

velocity-1.7.jar

-
-

Description: Apache Velocity is a general purpose template engine.

-

- File Path: target\test-classes\velocity-1.7.jar
- MD5: 3692dd72f8367cb35fb6280dc2916725
- SHA1: 2ceb567b8f3f21118ecdec129fe1271dbc09aa7a -

- - -

Identifiers

-
- -
-
-

war-4.0.war

-
-

- File Path: target\test-classes\war-4.0.war
- MD5: 54070e31aa8e6256ea8c850642a3c434
- SHA1: eaede5596599912d70cb9b517cb87fff336a8422 -

- - -

Identifiers

-
-
    -
  • maven: org.glassfish.main.admingui:war:4.0 -   Confidence:HIGH -
  • -
-
-
-

war-4.0.war: commons-fileupload-1.1.1.jar

-
-

Description: The FileUpload component provides a simple yet flexible means of adding - support for multipart file upload functionality to servlets and web - applications.

-

- License:

The Apache Software License, Version 2.0: /LICENSE.txt
- File Path: target\test-classes\war-4.0.war\WEB-INF\extra\commons-fileupload-1.1.1.jar
- MD5: adb15d9a4da4a30d77e88b32a45cbddb
- SHA1: d587a50727ba905aad13de9ea119081403bf6823 -

- - -

Identifiers

-
- -
- -
-

CVE-2014-0050  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

MultipartStream.java in Apache Commons FileUpload before 1.3.1, as used in Apache Tomcat, JBoss Web, and other products, allows remote attackers to cause a denial of service (infinite loop and CPU consumption) via a crafted Content-Type header that bypasses a loop's intended exit conditions. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2013-0248  

-

Severity: - Low -
CVSS Score: 3.3 -
CWE: CWE-264 Permissions, Privileges, and Access Controls -

-

The default configuration of javax.servlet.context.tempdir in Apache Commons FileUpload 1.0 through 1.2.2 uses the /tmp directory for uploaded files, which allows local users to overwrite arbitrary files via an unspecified symlink attack. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
-

war-4.0.war: commons-io-1.3.1.jar

-
-

Description: Commons-IO contains utility classes, stream implementations, file filters, and endian classes.

-

- License:

The Apache Software License, Version 2.0: /LICENSE.txt
- File Path: target\test-classes\war-4.0.war\WEB-INF\extra\commons-io-1.3.1.jar
- MD5: 2e55c05d3386889af97caae4517ac9df
- SHA1: b90b6ac57cf27a2858eaa490d02ba7945d18ca7b -

- - -

Identifiers

-
- -
-
-

war-4.0.war: dojo-ajax-nodemo-0.4.1.jar

-
-

- File Path: target\test-classes\war-4.0.war\WEB-INF\extra\dojo-ajax-nodemo-0.4.1.jar
- MD5: 91fda9e8b3c95eee6f566567cf790a9e
- SHA1: 0e77d6bb7687a7084a1b92da563dfda6324ba83f -

- - -

Identifiers

-
- -
-
-

war-4.0.war: json-1.0.jar

-
-

- File Path: target\test-classes\war-4.0.war\WEB-INF\extra\json-1.0.jar
- MD5: a7aa9a187cb901ec6e299f65f583f140
- SHA1: 0fe8ce55b9f83f16185192821a385916b0eef38e -

- - -

Identifiers

-
- -
-
-

war-4.0.war: prototype-1.5.0.jar

-
-

- File Path: target\test-classes\war-4.0.war\WEB-INF\extra\prototype-1.5.0.jar
- MD5: 206bd786024eca29e41a12e44c055c0a
- SHA1: b02b002f0e9bb289b311db49c561c58afb8eb58c -

- - -

Identifiers

-
- -
-
-

war-4.0.war: webui-jsf-4.0.2.10.jar

-
-

Description: Project Woodstock

-

- License:

CDDL + GPLv2 with classpath exception: http://glassfish.java.net/nonav/public/CDDL+GPL_1_1.html
- File Path: target\test-classes\war-4.0.war\WEB-INF\extra\webui-jsf-4.0.2.10.jar
- MD5: 411e6e13bc190d58e10337e502371cfc
- SHA1: 977a6fa7f65f8ea68101aa1252c05e8193de97b5 -

- - -

Identifiers

-
- -
-
-

war-4.0.war: webui-jsf-suntheme-4.0.2.10.jar

-
-

Description: Project Woodstock

-

- License:

CDDL + GPLv2 with classpath exception: http://glassfish.java.net/nonav/public/CDDL+GPL_1_1.html
- File Path: target\test-classes\war-4.0.war\WEB-INF\extra\webui-jsf-suntheme-4.0.2.10.jar
- MD5: 62a5f094e9832dce2a7ce138dfee3507
- SHA1: 4ec663ae9ab37d9d6504dc5754e1e59d36d2cd9e -

- - -

Identifiers

-
- -
-
-

war-4.0.war: console-core-4.0.jar

-
-

Description: Java.net - The Source for Java Technology Collaboration

-

- License:

http://glassfish.java.net/nonav/public/CDDL+GPL.html
- File Path: target\test-classes\war-4.0.war\WEB-INF\lib\console-core-4.0.jar
- MD5: 34989ef1706408666ee87eec5b55c09b
- SHA1: 165c3df4d1ede6f2850e44730cb547dcfdb45a08 -

- - -

Identifiers

-
- -
-
-

woden-api-1.0M8.jar

-
-

Description: The Woden project is a subproject of the Apache Web Services Project to develop a Java class library for reading, manipulating, creating and writing WSDL documents, initially to support WSDL 2.0 but with the longer term aim of supporting past, present and future versions of WSDL. There are two main deliverables: an API and an implementation. The Woden API consists of a set of Java interfaces. The WSDL 2.0-specific portion of the Woden API conforms to the W3C WSDL 2.0 specification. The implementation will be a high performance implementation directly usable in other Apache projects such as Axis2.

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\woden-api-1.0M8.jar
- MD5: ffa59063e09ee05d3f588adc0dce97bf
- SHA1: e15d817dc457976e9ab5ed5b92e14c6f0ff4bcc9 -

- - -

Identifiers

-
- -
-
-

woden-impl-dom-1.0M8.jar

-
-

Description: The Woden project is a subproject of the Apache Web Services Project to develop a Java class library for reading, manipulating, creating and writing WSDL documents, initially to support WSDL 2.0 but with the longer term aim of supporting past, present and future versions of WSDL. There are two main deliverables: an API and an implementation. The Woden API consists of a set of Java interfaces. The WSDL 2.0-specific portion of the Woden API conforms to the W3C WSDL 2.0 specification. The implementation will be a high performance implementation directly usable in other Apache projects such as Axis2.

-

- License:

http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\woden-impl-dom-1.0M8.jar
- MD5: 6cefbde48cf35f36ae20f72b6e58a30a
- SHA1: a8f543456fc71426e62d003dadf3004b198aceaf -

- - -

Identifiers

-
- -
-
-

wsdl4j-1.6.2.jar

-
-

Description: Java stub generator for WSDL

-

- License:

CPL: http://www.opensource.org/licenses/cpl1.0.txt
- File Path: target\test-classes\wsdl4j-1.6.2.jar
- MD5: 2608a8ea3f07b0c08de8a7d3d0d3fc09
- SHA1: dec1669fb6801b7328e01ad72fc9e10b69ea06c1 -

- - -

Identifiers

-
- -
-
-

wstx-asl-3.2.4.jar

-
-

Description: Woodstox is a high-performance XML processor that implements Stax (JSR-173) API

-

- License:

The Apache Software License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\wstx-asl-3.2.4.jar
- MD5: f3fac27a7387452f1c4243c695fa0f0d
- SHA1: aada03a08ae547bee92caf3b1e0cd756134e9226 -

- - -

Identifiers

-
- -
-
-

xalan-2.7.0.jar

-
-

- File Path: target\test-classes\xalan-2.7.0.jar
- MD5: a018d032c21a873225e702b36b171a10
- SHA1: a33c0097f1c70b20fa7ded220ea317eb3500515e -

- - -

Identifiers

-
- -
-
-

xercesImpl-2.8.1.jar

-
-

Description: Xerces2 is the next generation of high performance, fully - compliant XML parsers in the Apache Xerces family. This new - version of Xerces introduces the Xerces Native Interface (XNI), - a complete framework for building parser components and - configurations that is extremely modular and easy to program.

-

- File Path: target\test-classes\xercesImpl-2.8.1.jar
- MD5: e86f321c8191b37bd720ff5679f57288
- SHA1: 25101e37ec0c907db6f0612cbf106ee519c1aef1 -

- - -

Identifiers

-
- -
-
-

xml-apis-1.3.04.jar

-
-

Description: xml-commons provides an Apache-hosted set of DOM, SAX, and - JAXP interfaces for use in other xml-based projects. Our hope is that we - can standardize on both a common version and packaging scheme for these - critical XML standards interfaces to make the lives of both our developers - and users easier. The External Components portion of xml-commons contains - interfaces that are defined by external standards organizations. For DOM, - that's the W3C; for SAX it's David Megginson and sax.sourceforge.net; for - JAXP it's Sun.

-

- File Path: target\test-classes\xml-apis-1.3.04.jar
- MD5: 9ae9c29e4497fc35a3eade1e6dd0bbeb
- SHA1: 90b215f48fe42776c8c7f6e3509ec54e84fd65ef -

- - -

Identifiers

-
- -
-
-

xmlParserAPIs-2.6.0.jar

-
-

- File Path: target\test-classes\xmlParserAPIs-2.6.0.jar
- MD5: 2651f9f7c39e3524f3e2c394625ac63a
- SHA1: 065acede1e5305bd2b92213d7b5761328c6f4fd9 -

- - -

Identifiers

-
- -
-
-

XmlSchema-1.4.2.jar

-
-

Description: Commons XMLSchema is a light weight schema object model that can be used to manipualte or - generate a schema. It has a clean, easy to use API and can easily be integrated into an existing project - since it has almost no dependancies on third party libraries.

-

- License:

The Apache Software License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0.txt
- File Path: target\test-classes\XmlSchema-1.4.2.jar
- MD5: ced8c8555d4e965cf7ce06459730479a
- SHA1: 7cf868b0d6a5b68be0dea014126b986b3387755a -

- - -

Identifiers

-
- -
-
-

xwork-2.1.1.jar

-
-

Description:  - XWork is an command-pattern framework that is used to power WebWork - as well as other applications. XWork provides an Inversion of Control - container, a powerful expression language, data type conversion, - validation, and pluggable configuration. -

-

- License:

The OpenSymphony Software License 1.1: src/etc/LICENSE.txt
- File Path: target\test-classes\xwork-2.1.1.jar
- MD5: fed42fc127540dbbf88fb4ee80a2c039
- SHA1: e509a9c3a66ae7b26b56cce0657ca2550aa43512 -

- - -

Identifiers

-
- -
- -
-

CVE-2011-2088  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-200 Information Exposure -

-

XWork 2.2.1 in Apache Struts 2.2.1, and OpenSymphony XWork in OpenSymphony WebWork, allows remote attackers to obtain potentially sensitive information about internal Java class paths via vectors involving an s:submit element and a nonexistent method, a different vulnerability than CVE-2011-1772.3. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2011-1772  

-

Severity: - Low -
CVSS Score: 2.6 -
CWE: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') -

-

Multiple cross-site scripting (XSS) vulnerabilities in XWork in Apache Struts 2.x before 2.2.3, and OpenSymphony XWork in OpenSymphony WebWork, allow remote attackers to inject arbitrary web script or HTML via vectors involving (1) an action name, (2) the action attribute of an s:submit element, or (3) the method attribute of an s:submit element. -

-

- -

Vulnerable Software & Versions: (show all)

-

CVE-2008-6504  

-

Severity: - Medium -
CVSS Score: 5.0 -
CWE: CWE-20 Improper Input Validation -

-

ParametersInterceptor in OpenSymphony XWork 2.0.x before 2.0.6 and 2.1.x before 2.1.2, as used in Apache Struts and other products, does not properly restrict # (pound sign) references to context objects, which allows remote attackers to execute Object-Graph Navigation Language (OGNL) statements and modify server-side context objects, as demonstrated by use of a \u0023 representation for the # character. -

-

- -

Vulnerable Software & Versions: (show all)

-
-
- - - -
-
-


This report contains data retrieved from the National Vulnerability Database.
- - diff --git a/analyzers/archive-analyzer.html b/analyzers/archive-analyzer.html index 74a0cc508..0bb1dc779 100644 --- a/analyzers/archive-analyzer.html +++ b/analyzers/archive-analyzer.html @@ -1,21 +1,21 @@ - + - dependency-check - Archive Analyzer - + dependency-check – Archive Analyzer + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,162 +72,197 @@
    -
    +
    -
    +

    Archive Analyzer

    OWASP dependency-check includes an analyzer an archive analyzer that will attempt to extract files from the archive that are supported by the other file type analyzers.

    @@ -284,15 +319,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/analyzers/assembly-analyzer.html b/analyzers/assembly-analyzer.html index 17f8ba8dd..6aa21c314 100644 --- a/analyzers/assembly-analyzer.html +++ b/analyzers/assembly-analyzer.html @@ -1,21 +1,21 @@ - + - dependency-check - Assembly Analyzer - + dependency-check – Assembly Analyzer + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,162 +72,197 @@
    -
    +
    -
    +

    Assembly Analyzer

    OWASP dependency-check includes an analyzer that scans .NET dll and exe files and collect as much information it can about the files as it can. The information collected is internally referred to as evidence and is grouped into vendor, product, and version buckets. Other analyzers later use this evidence to identify any Common Platform Enumeration (CPE) identifiers that apply.

    @@ -282,15 +317,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/analyzers/autoconf.html b/analyzers/autoconf.html new file mode 100644 index 000000000..3f9713d12 --- /dev/null +++ b/analyzers/autoconf.html @@ -0,0 +1,331 @@ + + + + + + + + + dependency-check – Autoconf Analyzer + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +

    Autoconf Analyzer

    +

    OWASP dependency-check includes an analyzer that will scan Autoconf project configuration files. The analyzer will collect as much information it can about the project. The information collected is internally referred to as evidence and is grouped into vendor, product, and version buckets. Other analyzers later use this evidence to identify any Common Platform Enumeration (CPE) identifiers that apply.

    +

    File names scanned: configure, configure.in, configure.ac

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/analyzers/central-analyzer.html b/analyzers/central-analyzer.html index 0d5af1528..63e4f5fd0 100644 --- a/analyzers/central-analyzer.html +++ b/analyzers/central-analyzer.html @@ -1,21 +1,21 @@ - + - dependency-check - Central Analyzer - + dependency-check – Central Analyzer + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,144 +72,172 @@
    -
    +
    -
    +

    Central Analyzer

    OWASP dependency-check includes an analyzer that will check for the Maven GAV (Group/Artifact/Version) information for artifacts in the scanned area. By default the information comes from Maven Central. If the artifact’s hash is found in the configured Nexus repository, its GAV is recorded as an Identifier and the Group is collected as Vendor evidence, the Artifact is collected as Product evidence, and the Version is collected as Version evidence.

    @@ -281,15 +316,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/analyzers/cmake.html b/analyzers/cmake.html new file mode 100644 index 000000000..f01a1145b --- /dev/null +++ b/analyzers/cmake.html @@ -0,0 +1,331 @@ + + + + + + + + + dependency-check – CMake Analyzer + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +

    CMake Analyzer

    +

    OWASP dependency-check includes an analyzer that will scan CMake project configuration files. The analyzer will collect as much information it can about the project. The information collected is internally referred to as evidence and is grouped into vendor, product, and version buckets. Other analyzers later use this evidence to identify any Common Platform Enumeration (CPE) identifiers that apply.

    +

    File names scanned: CMakeLists.txt, *.cmake

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/analyzers/composer-lock.html b/analyzers/composer-lock.html new file mode 100644 index 000000000..e3e636297 --- /dev/null +++ b/analyzers/composer-lock.html @@ -0,0 +1,246 @@ + + + + + + + + + dependency-check – Composer Lock Analyzer + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +

    Composer Lock Analyzer

    +

    OWASP dependency-check includes an analyzer that scans composer.lock files to get exact dependency version information from PHP projects which are managed with Composer. If you’re using Composer to manage your project, this will only analyze the composer.lock file currently, so you’ll need to run composer install to have Composer generate this file.

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/analyzers/index.html b/analyzers/index.html index aa41abcb7..37be39e68 100644 --- a/analyzers/index.html +++ b/analyzers/index.html @@ -1,21 +1,21 @@ - + - dependency-check - File Type Analyzers - + dependency-check – File Type Analyzers + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,162 +72,197 @@
    -
    +
    -
    +

    File Type Analyzers

    OWASP dependency-check contains several file type analyzers that are used to extract identification information from the files analyzed.

    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Analyzer File Types Scanned Analysis Method
    Archive Zip archive format (*.zip, *.ear, *.war, *.jar, *.sar, *.apk, *.nupkg); Tape Archive Format (*.tar); Gzip format (*.gz, *.tgz); Bzip2 format (*.bz2, *.tbz2) Extracts archive contents, then scans contents with all available analyzers.
    Assembly .NET Assemblies (*.exe, *.dll) Uses GrokAssembly.exe, which requires .NET Framework or Mono runtime to be installed.
    Autoconf Autoconf project configuration files (configure, configure.in, configure.ac) Regex scan for AC_INIT metadata, including in generated configuration script.
    Central Java archive files (*.jar) Searches Maven Central or a configured Nexus repository for the file’s SHA1 hash.
    CMake CMake project files (CMakeLists.txt) and scripts (*.cmake) Regex scan for project initialization and version setting commands.
    Composer Lock PHP Composer Lock files (composer.lock) Parses PHP Composer lock files for exact versions of dependencies.
    Jar Java archive files (*.jar); Web application archive (*.war) Examines archive manifest metadata, and Maven Project Object Model files (pom.xml).
    Nexus Java archive files (*.jar) Searches Sonatype or a configured Nexus repository for the file’s SHA1 hash. In most cases, superceded by Central .
    Node.js NPM package specification files (package.json) Parse JSON format for metadata.
    Nuspec Nuget package specification file (*.nuspec) Uses XPath to parse specification XML.
    OpenSSL OpenSSL Version Source Header File (opensslv.h) Regex parse of the OPENSSL_VERSION_NUMBER macro definition.
    Python Python source files (*.py); Package metadata files (PKG-INFO, METADATA); Package Distribution Files (*.whl, *.egg, *.zip) Regex scan of Python source files for setuptools metadata; Parse RFC822 header format for metadata in all other artifacts.
    Ruby Gemspec Ruby makefiles (Rakefile); Ruby Gemspec files (*.gemspec) Regex scan Gemspec initialization blocks for metadata.
    @@ -302,15 +449,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/analyzers/jar-analyzer.html b/analyzers/jar-analyzer.html index d8581e2f0..904a84f39 100644 --- a/analyzers/jar-analyzer.html +++ b/analyzers/jar-analyzer.html @@ -1,21 +1,21 @@ - + - dependency-check - Jar Analyzer - + dependency-check – Jar Analyzer + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,162 +72,197 @@
    -
    +
    -
    +

    Jar Analyzer

    OWASP dependency-check includes an analyzer that scans JAR files and collect as much information it can about the file as it can. The information collected is internally referred to as evidence and is grouped into vendor, product, and version buckets. Other analyzers later use this evidence to identify any Common Platform Enumeration (CPE) identifiers that apply. Additionally, if a POM is present the analyzer will add the Maven group, artifact, and version (GAV).

    @@ -282,15 +317,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/analyzers/nexus-analyzer.html b/analyzers/nexus-analyzer.html index 659ebea95..0beda133b 100644 --- a/analyzers/nexus-analyzer.html +++ b/analyzers/nexus-analyzer.html @@ -1,21 +1,21 @@ - + - dependency-check - Nexus Analyzer - + dependency-check – Nexus Analyzer + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,162 +72,197 @@
    -
    +
    -
    +

    Nexus Analyzer

    The Nexus Analyzer has been superceded by the Central Analyzer. If both the Central Analyzer and Nexus Analyzer are enabled and the Nexus URL has not been configured to point to an instance of Nexus Pro the Nexus Analyzer will disable itself.

    The Nexus Analyzer will check for the Maven GAV (Group/Artifact/Version) information for artifacts in the scanned area. This is done by determining if an artifact exists in a Nexus Pro installation using the SHA-1 hash of the artifact scanned. If the artifact’s hash is found in the configured Nexus repository, its GAV is recorded as an Identifier and the Group is collected as Vendor evidence, the Artifact is collected as Product evidence, and the Version is collected as Version evidence.

    -

    Logging

    +

    Logging

    You may see a log message similar to the following during analysis:

    -
    Mar 31, 2014 9:15:12 AM org.owasp.dependencycheck.analyzer.NexusAnalyzer initializeFileTypeAnalyzer
    +
    Mar 31, 2014 9:15:12 AM org.owasp.dependencycheck.analyzer.NexusAnalyzer initializeFileTypeAnalyzer
     WARNING: There was an issue getting Nexus status. Disabling analyzer.
    -
    +

    At the beginning of analysis, a check is made by the Nexus analyzer to see if it is able to reach the configured Nexus service, and if it cannot be reached, the analyzer will be disabled. If you see this message, you can use the configuration settings described in either the CLI, Ant, Maven, or Jenkins plugins to resolve the issue, or disable the analyzer altogether.

    @@ -291,15 +326,14 @@ WARNING: There was an issue getting Nexus status. Disabling analyzer.
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/analyzers/nodejs.html b/analyzers/nodejs.html new file mode 100644 index 000000000..280724872 --- /dev/null +++ b/analyzers/nodejs.html @@ -0,0 +1,332 @@ + + + + + + + + + dependency-check – Node.js Analyzer + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +

    Node.js Analyzer

    +

    OWASP dependency-check includes an analyzer that will scan Node Package Manager package specification files. The analyzer will collect as much information as it can about the package. The information collected is internally referred to as evidence and is grouped into vendor, product, and version buckets. Other analyzers later use this evidence to identify any Common Platform Enumeration (CPE) identifiers that apply.

    +

    Note: Also consider using the Node Security Project auditing tool, nsp.

    +

    Files Types Scanned: package.json

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/analyzers/nuspec-analyzer.html b/analyzers/nuspec-analyzer.html index 277c1732d..77c9d83ec 100644 --- a/analyzers/nuspec-analyzer.html +++ b/analyzers/nuspec-analyzer.html @@ -1,21 +1,21 @@ - + - dependency-check - Nuspec Analyzer - + dependency-check – Nuspec Analyzer + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,162 +72,197 @@
    -
    +
    -
    +

    Nuspec Analyzer

    OWASP dependency-check includes an analyzer that will scan NuGet’s Nuspec file to collect information about the component being used. The evidence collected is used by other analyzers to determine if there are any known vulnerabilities associated with the component.

    @@ -283,15 +318,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/analyzers/openssl.html b/analyzers/openssl.html new file mode 100644 index 000000000..2650c0e4f --- /dev/null +++ b/analyzers/openssl.html @@ -0,0 +1,331 @@ + + + + + + + + + dependency-check – OpenSSL Analyzer + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +

    OpenSSL Analyzer

    +

    OWASP dependency-check includes an analyzer that will scan OpenSSL source code files for the OpenSSL version information. The information collected is internally referred to as evidence and is grouped into vendor, product, and version buckets. Other analyzers later use this evidence to identify any Common Platform Enumeration (CPE) identifiers that apply.

    +

    File names scanned: opensslv.h

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/analyzers/python.html b/analyzers/python.html new file mode 100644 index 000000000..7af6730c7 --- /dev/null +++ b/analyzers/python.html @@ -0,0 +1,331 @@ + + + + + + + + + dependency-check – Python Analyzer + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +

    Python Analyzer

    +

    OWASP dependency-check includes an analyzer that will scan Python artifacts. The analyzer(s) will collect as much information it can about the Python artifacts. The information collected is internally referred to as evidence and is grouped into vendor, product, and version buckets. Other analyzers later use this evidence to identify any Common Platform Enumeration (CPE) identifiers that apply.

    +

    Files Types Scanned: py, whl, egg, zip, PKG-INFO, and METADATA

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/analyzers/ruby-gemspec.html b/analyzers/ruby-gemspec.html new file mode 100644 index 000000000..dfb820e20 --- /dev/null +++ b/analyzers/ruby-gemspec.html @@ -0,0 +1,332 @@ + + + + + + + + + dependency-check – Ruby Gemspec Analyzer + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +

    Ruby Gemspec Analyzer

    +

    OWASP dependency-check includes an analyzer that will scan Ruby Gem specifications. The analyzer will collect as much information as it can about the Gem. The information collected is internally referred to as evidence and is grouped into vendor, product, and version buckets. Other analyzers later use this evidence to identify any Common Platform Enumeration (CPE) identifiers that apply.

    +

    Note: Also consider using the Ruby bundler-audit tool.

    +

    Files Types Scanned: Rakefile, *.gemspec

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/css/apache-maven-fluido-1.4.min.css b/css/apache-maven-fluido-1.4.min.css new file mode 100644 index 000000000..54a006744 --- /dev/null +++ b/css/apache-maven-fluido-1.4.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eeeeee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #dddddd #eee #eeeeee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eeeeee #eee #dddddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}.clear{clear:both;visibility:hidden}.clear hr{display:none}.section p,.section p,.section dt,.section dt{margin-right:7px;margin-left:7px}#ohloh{margin-bottom:10px}#poweredBy{text-align:center}a.externalLink{padding-right:18px}a.newWindow{background:url('../images/window-new.png') right center no-repeat;padding-right:18px}a.externalLink[href^=http]{background:url('../images/internet-web-browser.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".asc"]{background:url('../images/accessories-text-editor.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".jpg"],a.externalLink[href$=".jpeg"],a.externalLink[href$=".gif"],a.externalLink[href$=".png"]{background:url('../images/image-x-generic.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".tar.gz"],a.externalLink[href$=".zip"]{background:url('../images/package-x-generic.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".md5"],a.externalLink[href$=".sha1"]{background:url('../images/document-properties.png') right center no-repeat;padding-right:18px}a.externalLink[href^=https]{background:url('../images/application-certificate.png') right center no-repeat;padding-right:18px}a.externalLink[href^=file]{background:url('../images/drive-harddisk.png') right center no-repeat;padding-right:18px}a.externalLink[href^=ftp]{background:url('../images/network-server.png') right center no-repeat;padding-right:18px}a.externalLink[href^=mailto]{background:url('../images/contact-new.png') right center no-repeat;padding-right:18px}li.none{list-style:none}.search-query{background-image:url(http://www.google.com/cse/intl/en/images/google_custom_search_watermark.gif);background-attachment:initial;background-origin:initial;background-clip:initial;background-color:#fff;background-position:0 50%;background-repeat:no-repeat no-repeat;width:95%}body.topBarEnabled{padding-top:60px}body.topBarDisabled{padding-top:20px}.builtBy{display:block}img.builtBy{margin:10px auto}#search-form{margin-left:9px;margin-right:9px}.hero-unit h2{font-size:60px}tt{padding:0 3px 2px;font-family:Monaco,Andale Mono,Courier New,monospace;font-size:.9em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#fee9cc;color:rgba(0,0,0,0.75);padding:1px 3px}li{color:#404040}table.zebra-striped{background-color:#FFF}.footer{background-color:#EEE}.sidebar-nav{padding-left:0;padding-right:0}.sidebar-nav .icon-chevron-right,.sidebar-nav .icon-chevron-down{margin-top:2px;margin-right:-6px;float:right;opacity:.25}li.pull-right{margin-left:3px;margin-right:3px}.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0;padding-left:15px}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/current.txt b/current.txt index 589268e6f..6261a05bb 100644 --- a/current.txt +++ b/current.txt @@ -1 +1 @@ -1.3.0 \ No newline at end of file +1.3.1 \ No newline at end of file diff --git a/data/cachenvd.html b/data/cachenvd.html new file mode 100644 index 000000000..f1e24b51e --- /dev/null +++ b/data/cachenvd.html @@ -0,0 +1,335 @@ + + + + + + + + + dependency-check – Snapshotting the NVD + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +

    Snapshotting the NVD

    +

    The Mirroring the NVD from NIST topic describes briefly how to use the Nist-Data-Mirror project to cache the NVD locally and run Dependency Check (D-C) against the local cache.

    +

    This topic goes into a bit more depth with the cli client, focusing on the following use case.

    + +
      + +
    1. You wish to have daily local snapshots of the NVD, so that
    2. + +
    3. in order to compare later runs of D-C with earlier runs, you can compare “apples with apples”.
    4. +
    +

    In other words: It is sometimes desirable to run a comparison D-C analysis against the same NVD snapshot that an earlier D-C report used.

    +

    In the steps below, concrete examples will be given assuming an Ubuntu Linux system. Hopefully, enough explanation is provided that the steps can easily be translated to other systems.

    +
    +

    Build Nist-Data-Mirror

    + +
      + +
    1. Perform a “git clone” of Nist-Data-Mirror
    2. + +
    3. Install gradle, if necessary. See here or your Linux distributions package management system. (e.g., sudo apt-get install gradle).
    4. + +
    5. Follow the build instructions. You will be left with a build artifact called nist-data-mirror-1.0.0.jar.
    6. +
    +
    +

    Set Up a Daily NVD Download Job

    +

    On Linux, the way to do this using the cron daemon. “Cron jobs” are configured by invoking crontab. For example, invoke crontab -e to add a line like the following to your crontab file:

    + +
    +
    4 5 * * * ~/.local/bin/nvd_download.sh ~/NVD ~/.local/jars
    +
    +

    This would run a job on your system at 4:05 AM daily to run the nvd_download.sh shell script with the two given arguments. The script is simple:

    + +
    +
    #!/bin/sh
    +NVD_ROOT=$1/`date -I`
    +JAR_PATH=$2/nist-data-mirror-1.0.0.jar
    +java -jar $JAR_PATH $NVD_ROOT
    +rm $NVD_ROOT/*.xml # D-C works directly with .gz files anyway.
    +
    +

    Nist-Data-Mirror will automatically create the directory, download the .xml.gz files, and extract the .xml files alongside them. Given the parameters in the cron example above, the new directory will be ~/NVD/2015-08-03 if executed on August 3rd, 2015. The download for 2015-08-03 pulled 47 MiB, and took up a total of 668 MiB after extracting from the compressed archive format. It turns out that D-C works directly with the .xml.gz files, so the above script preserves disk space by deleting the .xml files.

    +
    +

    Invoke the Command-Line Using a Specific Daily Snapshot

    +

    An example script named dep-check-date.sh is shown below, which facilitates a D-C scan against an arbitrary NVD snapshot:

    + +
    +
    #!/bin/sh
    +CLI_LOCATION=~/.local/dependency-check-1.2.11
    +CLI_SCRIPT=$CLI_LOCATION/bin/dependency-check.sh
    +NVD_PATH=$1/`date -I -d $2`
    +NVD=file://$NVD_PATH
    +shift 2 # We've used the first two params. The rest go to CLI_SCRIPT.
    +$CLI_SCRIPT --cveUrl20Base $NVD/nvdcve-2.0-%d.xml.gz \
    +    --cveUrl12Base $NVD/nvdcve-%d.xml.gz \
    +    --cveUrl20Modified $NVD/nvdcve-2.0-Modified.xml.gz \
    +    --cveUrl12Modified $NVD/nvdcve-Modified.xml.gz \
    +    --data $NVD_PATH $@
    +
    +

    The script takes advantage of the date command’s ability to parse a variety of date formats. The following invokation would successfully point to the ~/NVD/2015-08-03 folder.

    + +
    +
    $ ./dep-check-date.sh ~/NVD "08/03/2015" -app Foo -scan /path/to/Foo --out ~/DCreports/FooFollowup/
    +
    +

    If today happened to be August 4th, 2015, "yesterday" also would have worked. Also notice the usage of the --data parameter. This places the H2 database file directly in the folder alongside the .xml.gz files. This is critical, so that D-C doesn’t run against another version of the database, like the usual default in $CLI_LOCATION/data.

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/data/database.html b/data/database.html index 99fc5be4d..257323e2f 100644 --- a/data/database.html +++ b/data/database.html @@ -1,21 +1,21 @@ - + - dependency-check - Using a Database Server - + dependency-check – Using a Database Server + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,65 +72,72 @@
    -
    +
    -
    +

    Using a Database Server

    WARNING: This discusses an advanced setup and you may run into issues.

    @@ -267,15 +288,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/data/index.html b/data/index.html index ca995b41e..3299aabb9 100644 --- a/data/index.html +++ b/data/index.html @@ -1,21 +1,21 @@ - + - dependency-check - Internet Access Required - + dependency-check – Internet Access Required + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,64 +72,71 @@
    -
    +
    -
    +

    Internet Access Required

    There are two reasons dependency-check needs access to the Internet. Below you will find a discussion of each problem and possibly resolutions if you are facing organizational constraints.

    -

    Local NVD Database

    +

    Local NVD Database

    OWASP dependency-check maintains a local copy of the NVD data hosted by NIST. By default, a local H2 database instance is used. As each instance maintains its own copy of the NVD the machine will need access to nvd.nist.gov in order to download the NVD data feeds. While the initial download of the NVD data feed is large, if after the initial download the tool is run at least once every seven days only two small XML files containing the recent modifications will need to be downloaded.

    If your build servers are using dependency-check and are unable to access the Internet you have a few options:

    @@ -244,7 +265,7 @@
  • Use a more robust centralized database with a single update node
  • -

    Downloading Additional Information

    +

    Downloading Additional Information

    If the machine that is running dependency-check cannot reach the Central Repository the analysis may result in false negatives. This is because some POM files, that are not contained within the JAR file itself, contain evidence that is used to accurately identify a library. If Central cannot be reached, it is highly recommended to setup a Nexus server within your organization and to configure dependency-check to use the local Nexus server. Note, even with a Nexus server setup I have seen dependency-check be re-directed to other repositories on the Internet to download the actual POM file.

    @@ -255,15 +276,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/data/mirrornvd.html b/data/mirrornvd.html index c84b19c41..192959cda 100644 --- a/data/mirrornvd.html +++ b/data/mirrornvd.html @@ -1,21 +1,21 @@ - + - dependency-check - Mirroring the NVD from NIST - + dependency-check – Mirroring the NVD from NIST + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,64 +72,71 @@
    -
    +
    -
    +

    Mirroring the NVD from NIST

    Several organizations have opted to mirror the NVD on an internal server and have the dependency-check clients simply pull the updates from the mirror. This setup is fairly simple:

    @@ -267,15 +288,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/data/proxy.html b/data/proxy.html index 9c1f75208..3647157cf 100644 --- a/data/proxy.html +++ b/data/proxy.html @@ -1,21 +1,21 @@ - + - dependency-check - Proxy Configuration - + dependency-check – Proxy Configuration + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,64 +72,71 @@
    -
    +
    -
    +

    Proxy Configuration

    All of the dependency-check clients (CLI, Maven, Ant, Jenkins) can be configured to use a proxy to connect to the Internet. See the configuration settings for each:

    @@ -249,15 +270,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/gradle.html b/dependency-analysis.html similarity index 69% rename from gradle.html rename to dependency-analysis.html index a18277aa4..4b1f407a9 100644 --- a/gradle.html +++ b/dependency-analysis.html @@ -1,21 +1,21 @@ - + - dependency-check - Gradle Integration - + dependency-check – + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -58,13 +58,13 @@ / -
  • Gradle Integration
  • +
  • -
  • | Last Published: 2015-05-11
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.2.11 + Version: 1.3.1
  • @@ -72,99 +72,155 @@
    -
    +
    -
    +
    -

    Gradle Integration

    -

    While a full Gradle Plugin is planned, the following gradle task can be used to run dependency-check:

    - -
    -
    configurations {
    -    depCheck
    -}
    -
    -dependencies {
    -    depCheck "org.owasp:dependency-check-ant:1.2.11"
    -}
    -
    -task checkDeps << {
    -    ant.taskdef(name: 'checkDepsTask',
    -                classname: 'org.owasp.dependencycheck.taskdefs.DependencyCheckTask',
    -                classpath: configurations.depCheck.asPath)
    -
    -    ant.checkDepsTask() {
    -               path {
    -                     pathelement(path: sourceSets.main.runtimeClasspath.asPath)
    -               }
    -    }
    -}
    -
    -

    The above task definition was provided by Nikita Koksharov.

    +
    @@ -241,15 +273,14 @@ task checkDeps << {
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-ant/apidocs/allclasses-frame.html b/dependency-check-ant/apidocs/allclasses-frame.html index 2f993456b..ef02f2b4c 100644 --- a/dependency-check-ant/apidocs/allclasses-frame.html +++ b/dependency-check-ant/apidocs/allclasses-frame.html @@ -2,10 +2,10 @@ - + -All Classes (Dependency-Check Ant Task 1.3.0 API) - +All Classes (Dependency-Check Ant Task 1.3.1 API) + @@ -14,9 +14,11 @@
    diff --git a/dependency-check-ant/apidocs/allclasses-noframe.html b/dependency-check-ant/apidocs/allclasses-noframe.html index f8bdc1ea2..101275220 100644 --- a/dependency-check-ant/apidocs/allclasses-noframe.html +++ b/dependency-check-ant/apidocs/allclasses-noframe.html @@ -2,10 +2,10 @@ - + -All Classes (Dependency-Check Ant Task 1.3.0 API) - +All Classes (Dependency-Check Ant Task 1.3.1 API) + @@ -14,9 +14,11 @@
    diff --git a/dependency-check-ant/apidocs/constant-values.html b/dependency-check-ant/apidocs/constant-values.html index 5be92a0e5..6cfebe87d 100644 --- a/dependency-check-ant/apidocs/constant-values.html +++ b/dependency-check-ant/apidocs/constant-values.html @@ -2,16 +2,16 @@ - + -Constant Field Values (Dependency-Check Ant Task 1.3.0 API) - +Constant Field Values (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/deprecated-list.html b/dependency-check-ant/apidocs/deprecated-list.html index e39b74409..a63316aa2 100644 --- a/dependency-check-ant/apidocs/deprecated-list.html +++ b/dependency-check-ant/apidocs/deprecated-list.html @@ -2,16 +2,16 @@ - + -Deprecated List (Dependency-Check Ant Task 1.3.0 API) - +Deprecated List (Dependency-Check Ant Task 1.3.1 API) + @@ -82,13 +82,13 @@ -org.owasp.dependencycheck.taskdefs.DependencyCheckTask.getProxyUrl() - +org.owasp.dependencycheck.taskdefs.Check.getApplicationName() +
    use projectName instead.
    -org.owasp.dependencycheck.taskdefs.DependencyCheckTask.setProxyUrl(String) - +org.owasp.dependencycheck.taskdefs.Check.setApplicationName(String) +
    use projectName instead.
    diff --git a/dependency-check-ant/apidocs/help-doc.html b/dependency-check-ant/apidocs/help-doc.html index 537de2f04..0daf2774b 100644 --- a/dependency-check-ant/apidocs/help-doc.html +++ b/dependency-check-ant/apidocs/help-doc.html @@ -2,16 +2,16 @@ - + -API Help (Dependency-Check Ant Task 1.3.0 API) - +API Help (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/index-all.html b/dependency-check-ant/apidocs/index-all.html index 53128ec21..610d7a3dd 100644 --- a/dependency-check-ant/apidocs/index-all.html +++ b/dependency-check-ant/apidocs/index-all.html @@ -2,16 +2,16 @@ - + -Index (Dependency-Check Ant Task 1.3.0 API) - +Index (Dependency-Check Ant Task 1.3.1 API) + @@ -63,18 +63,18 @@
    -
    A D E G I O R S T W  +
    A C D E G I O P R S T U W 

    A

    -
    add(ResourceCollection) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    add(ResourceCollection) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Add an arbitrary ResourceCollection.
    AntLoggerAdapter - Class in org.owasp.dependencycheck.ant.logging
    -
    An instance of Logger which simply calls the log method on the delegate Ant task
    +
    An instance of Logger which simply calls the log method on the delegate Ant task.
    AntLoggerAdapter(Task) - Constructor for class org.owasp.dependencycheck.ant.logging.AntLoggerAdapter
    @@ -89,6 +89,26 @@
    Constructs a new Ant Logger Factory.
    + + + +

    C

    +
    +
    Check - Class in org.owasp.dependencycheck.taskdefs
    +
    +
    An Ant task definition to execute dependency-check during an Ant build.
    +
    +
    Check() - Constructor for class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Construct a new DependencyCheckTask.
    +
    +
    Check.ReportFormats - Class in org.owasp.dependencycheck.taskdefs
    +
    +
    An enumeration of supported report formats: "ALL", "HTML", "XML", "VULN", etc..
    +
    +
    Check.ReportFormats() - Constructor for class org.owasp.dependencycheck.taskdefs.Check.ReportFormats
    +
     
    +
    @@ -104,20 +124,6 @@
     
    debug(String, Throwable) - Method in class org.owasp.dependencycheck.ant.logging.AntLoggerAdapter
     
    -
    DependencyCheckTask - Class in org.owasp.dependencycheck.taskdefs
    -
    -
    An Ant task definition to execute dependency-check during an Ant build.
    -
    -
    DependencyCheckTask() - Constructor for class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    -
    -
    Construct a new DependencyCheckTask.
    -
    -
    DependencyCheckTask.ReportFormats - Class in org.owasp.dependencycheck.taskdefs
    -
    -
    An enumeration of supported report formats: "ALL", "HTML", "XML", "VULN", etc..
    -
    -
    DependencyCheckTask.ReportFormats() - Constructor for class org.owasp.dependencycheck.taskdefs.DependencyCheckTask.ReportFormats
    -
     
    @@ -134,63 +140,72 @@
     
    error(String, Throwable) - Method in class org.owasp.dependencycheck.ant.logging.AntLoggerAdapter
     
    -
    execute() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    execute() - Method in class org.owasp.dependencycheck.taskdefs.Check
     
    +
    execute() - Method in class org.owasp.dependencycheck.taskdefs.Purge
    +
     
    +
    execute() - Method in class org.owasp.dependencycheck.taskdefs.Update
    +
    +
    Executes the update by initializing the settings, downloads the NVD XML data, and then processes the data storing it in the + local database.
    +

    G

    -
    getApplicationName() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getApplicationName() - Method in class org.owasp.dependencycheck.taskdefs.Check
    -
    Get the value of applicationName.
    +
    Deprecated. +
    use projectName instead.
    +
    -
    getConnectionString() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getConnectionString() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of connectionString.
    -
    getConnectionTimeout() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getConnectionTimeout() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of connectionTimeout.
    -
    getCveUrl12Base() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getCveUrl12Base() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of cveUrl12Base.
    -
    getCveUrl12Modified() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getCveUrl12Modified() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of cveUrl12Modified.
    -
    getCveUrl20Base() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getCveUrl20Base() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of cveUrl20Base.
    -
    getCveUrl20Modified() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getCveUrl20Modified() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of cveUrl20Modified.
    -
    getDatabaseDriverName() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getDatabaseDriverName() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of databaseDriverName.
    -
    getDatabaseDriverPath() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getDatabaseDriverPath() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of databaseDriverPath.
    -
    getDatabasePassword() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getDatabasePassword() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of databasePassword.
    -
    getDatabaseUser() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getDatabaseUser() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of databaseUser.
    -
    getDataDirectory() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getDataDirectory() - Method in class org.owasp.dependencycheck.taskdefs.Purge
    Get the value of dataDirectory.
    -
    getFailBuildOnCVSS() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getFailBuildOnCVSS() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Get the value of failBuildOnCVSS.
    @@ -206,41 +221,39 @@
    Returns the logger factory class string.
    -
    getNexusUrl() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getNexusUrl() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Get the value of nexusUrl.
    -
    getPathToMono() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getPathToMono() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Get the value of pathToMono.
    -
    getProxyPassword() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getProjectName() - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Get the value of projectName.
    +
    +
    getProxyPassword() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of proxyPassword.
    -
    getProxyPort() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getProxyPort() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of proxyPort.
    -
    getProxyServer() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getProxyServer() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of proxyServer.
    -
    getProxyUrl() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    -
    -
    Deprecated. - -
    -
    -
    getProxyUsername() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getProxyUsername() - Method in class org.owasp.dependencycheck.taskdefs.Update
    Get the value of proxyUsername.
    -
    getReportFormat() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getReportFormat() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Get the value of reportFormat.
    -
    getReportOutputDirectory() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getReportOutputDirectory() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Get the value of reportOutputDirectory.
    @@ -248,15 +261,15 @@
    Return the singleton of this class.
    -
    getSuppressionFile() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getSuppressionFile() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Get the value of suppressionFile.
    -
    getValues() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask.ReportFormats
    +
    getValues() - Method in class org.owasp.dependencycheck.taskdefs.Check.ReportFormats
    Returns the list of values for the report format.
    -
    getZipExtensions() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    getZipExtensions() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Get the value of zipExtensions.
    @@ -276,55 +289,87 @@
     
    info(String, Throwable) - Method in class org.owasp.dependencycheck.ant.logging.AntLoggerAdapter
     
    -
    isArchiveAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    isArchiveAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Returns whether or not the analyzer is enabled.
    -
    isAssemblyAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    isAssemblyAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Returns whether or not the analyzer is enabled.
    -
    isAutoUpdate() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    isAutoconfAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Get the value of autoconfAnalyzerEnabled.
    +
    +
    isAutoUpdate() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Get the value of autoUpdate.
    -
    isCentralAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    isCentralAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Get the value of centralAnalyzerEnabled.
    +
    isCMakeAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Get the value of cmakeAnalyzerEnabled.
    +
    +
    isComposerAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Get the value of composerAnalyzerEnabled.
    +
    isDebugEnabled() - Method in class org.owasp.dependencycheck.ant.logging.AntLoggerAdapter
     
    isErrorEnabled() - Method in class org.owasp.dependencycheck.ant.logging.AntLoggerAdapter
     
    isInfoEnabled() - Method in class org.owasp.dependencycheck.ant.logging.AntLoggerAdapter
     
    -
    isJarAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    isJarAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Returns whether or not the analyzer is enabled.
    -
    isNexusAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    isNexusAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Get the value of nexusAnalyzerEnabled.
    -
    isNexusUsesProxy() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    isNexusUsesProxy() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Get the value of nexusUsesProxy.
    -
    isNuspecAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    isNodeAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Get the value of nodeAnalyzerEnabled.
    +
    +
    isNuspecAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Returns whether or not the analyzer is enabled.
    -
    isReference() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    isOpensslAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Get the value of opensslAnalyzerEnabled.
    +
    +
    isPyDistributionAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Get the value of pyDistributionAnalyzerEnabled.
    +
    +
    isPyPackageAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Get the value of pyPackageAnalyzerEnabled.
    +
    +
    isReference() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Learn whether the refid attribute of this element been set.
    -
    isShowSummary() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    isRubygemsAnalyzerEnabled() - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Get the value of rubygemsAnalyzerEnabled.
    +
    +
    isShowSummary() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Get the value of showSummary.
    isTraceEnabled() - Method in class org.owasp.dependencycheck.ant.logging.AntLoggerAdapter
     
    -
    isUpdateOnly() - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    isUpdateOnly() - Method in class org.owasp.dependencycheck.taskdefs.Check
    Get the value of updateOnly.
    @@ -349,6 +394,32 @@
    This package contains the static binder for the slf4j-ant logger.
    + + + +

    P

    +
    +
    populateSettings() - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Takes the properties supplied and updates the dependency-check settings.
    +
    +
    populateSettings() - Method in class org.owasp.dependencycheck.taskdefs.Purge
    +
    +
    Takes the properties supplied and updates the dependency-check settings.
    +
    +
    populateSettings() - Method in class org.owasp.dependencycheck.taskdefs.Update
    +
    +
    Takes the properties supplied and updates the dependency-check settings.
    +
    +
    Purge - Class in org.owasp.dependencycheck.taskdefs
    +
    +
    An Ant task definition to execute dependency-check during an Ant build.
    +
    +
    Purge() - Constructor for class org.owasp.dependencycheck.taskdefs.Purge
    +
    +
    Construct a new DependencyCheckTask.
    +
    +
    @@ -364,137 +435,169 @@

    S

    -
    setApplicationName(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setApplicationName(String) - Method in class org.owasp.dependencycheck.taskdefs.Check
    -
    Set the value of applicationName.
    +
    Deprecated. +
    use projectName instead.
    +
    -
    setArchiveAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setArchiveAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Sets whether or not the analyzer is enabled.
    -
    setAssemblyAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setAssemblyAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Sets whether or not the analyzer is enabled.
    -
    setAutoUpdate(boolean) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setAutoconfAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Set the value of autoconfAnalyzerEnabled.
    +
    +
    setAutoUpdate(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Set the value of autoUpdate.
    -
    setCentralAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setCentralAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Set the value of centralAnalyzerEnabled.
    -
    setConnectionString(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setCMakeAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Set the value of cmakeAnalyzerEnabled.
    +
    +
    setComposerAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Set the value of composerAnalyzerEnabled.
    +
    +
    setConnectionString(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of connectionString.
    -
    setConnectionTimeout(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setConnectionTimeout(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of connectionTimeout.
    -
    setCveUrl12Base(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setCveUrl12Base(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of cveUrl12Base.
    -
    setCveUrl12Modified(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setCveUrl12Modified(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of cveUrl12Modified.
    -
    setCveUrl20Base(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setCveUrl20Base(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of cveUrl20Base.
    -
    setCveUrl20Modified(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setCveUrl20Modified(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of cveUrl20Modified.
    -
    setDatabaseDriverName(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setDatabaseDriverName(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of databaseDriverName.
    -
    setDatabaseDriverPath(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setDatabaseDriverPath(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of databaseDriverPath.
    -
    setDatabasePassword(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setDatabasePassword(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of databasePassword.
    -
    setDatabaseUser(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setDatabaseUser(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of databaseUser.
    -
    setDataDirectory(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setDataDirectory(String) - Method in class org.owasp.dependencycheck.taskdefs.Purge
    Set the value of dataDirectory.
    -
    setFailBuildOnCVSS(float) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setFailBuildOnCVSS(float) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Set the value of failBuildOnCVSS.
    -
    setJarAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setJarAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Sets whether or not the analyzer is enabled.
    -
    setNexusAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setNexusAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Set the value of nexusAnalyzerEnabled.
    -
    setNexusUrl(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setNexusUrl(String) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Set the value of nexusUrl.
    -
    setNexusUsesProxy(boolean) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setNexusUsesProxy(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Set the value of nexusUsesProxy.
    -
    setNuspecAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setNodeAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Set the value of nodeAnalyzerEnabled.
    +
    +
    setNuspecAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Sets whether or not the analyzer is enabled.
    -
    setPathToMono(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setOpensslAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Set the value of opensslAnalyzerEnabled.
    +
    +
    setPathToMono(String) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Set the value of pathToMono.
    -
    setProxyPassword(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setProjectName(String) - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Set the value of projectName.
    +
    +
    setProxyPassword(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of proxyPassword.
    -
    setProxyPort(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setProxyPort(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of proxyPort.
    -
    setProxyServer(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setProxyServer(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of proxyServer.
    -
    setProxyUrl(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    -
    - -
    -
    setProxyUsername(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setProxyUsername(String) - Method in class org.owasp.dependencycheck.taskdefs.Update
    Set the value of proxyUsername.
    -
    setRefid(Reference) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setPyDistributionAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Set the value of pyDistributionAnalyzerEnabled.
    +
    +
    setPyPackageAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Set the value of pyPackageAnalyzerEnabled.
    +
    +
    setRefid(Reference) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Add a reference to a Path, FileSet, DirSet, or FileList defined elsewhere.
    -
    setReportFormat(DependencyCheckTask.ReportFormats) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setReportFormat(Check.ReportFormats) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Set the value of reportFormat.
    -
    setReportOutputDirectory(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setReportOutputDirectory(String) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Set the value of reportOutputDirectory.
    -
    setShowSummary(boolean) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setRubygemsAnalyzerEnabled(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    +
    +
    Set the value of rubygemsAnalyzerEnabled.
    +
    +
    setShowSummary(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Set the value of showSummary.
    -
    setSuppressionFile(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setSuppressionFile(String) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Set the value of suppressionFile.
    @@ -506,11 +609,11 @@
    Set the Task which will this is to log through.
    -
    setUpdateOnly(boolean) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setUpdateOnly(boolean) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Set the value of updateOnly.
    -
    setZipExtensions(String) - Method in class org.owasp.dependencycheck.taskdefs.DependencyCheckTask
    +
    setZipExtensions(String) - Method in class org.owasp.dependencycheck.taskdefs.Check
    Set the value of zipExtensions.
    @@ -536,6 +639,20 @@
    trace(String, Throwable) - Method in class org.owasp.dependencycheck.ant.logging.AntLoggerAdapter
     
    + + + +

    U

    +
    +
    Update - Class in org.owasp.dependencycheck.taskdefs
    +
    +
    An Ant task definition to execute dependency-check update.
    +
    +
    Update() - Constructor for class org.owasp.dependencycheck.taskdefs.Update
    +
    +
    Construct a new UpdateTask.
    +
    +
    @@ -552,7 +669,7 @@
    warn(String, Throwable) - Method in class org.owasp.dependencycheck.ant.logging.AntLoggerAdapter
     
    -A D E G I O R S T W 
    +A C D E G I O P R S T U W 
    diff --git a/dependency-check-ant/apidocs/index.html b/dependency-check-ant/apidocs/index.html index 493534ec3..35255606f 100644 --- a/dependency-check-ant/apidocs/index.html +++ b/dependency-check-ant/apidocs/index.html @@ -2,9 +2,9 @@ - + -Dependency-Check Ant Task 1.3.0 API +Dependency-Check Ant Task 1.3.1 API @@ -108,7 +108,7 @@
    public class AntLoggerAdapter
     extends org.slf4j.helpers.MarkerIgnoringBase
    -
    An instance of Logger which simply calls the log method on the delegate Ant task
    +
    An instance of Logger which simply calls the log method on the delegate Ant task.
    Author:
    colezlaw
    See Also:
    Serialized Form
    diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/AntLoggerFactory.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/AntLoggerFactory.html index cd8ec9dfd..d226b533b 100644 --- a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/AntLoggerFactory.html +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/AntLoggerFactory.html @@ -2,16 +2,16 @@ - + -AntLoggerFactory (Dependency-Check Ant Task 1.3.0 API) - +AntLoggerFactory (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/class-use/AntLoggerAdapter.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/class-use/AntLoggerAdapter.html index 692348d02..a3ba18033 100644 --- a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/class-use/AntLoggerAdapter.html +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/class-use/AntLoggerAdapter.html @@ -2,16 +2,16 @@ - + -Uses of Class org.owasp.dependencycheck.ant.logging.AntLoggerAdapter (Dependency-Check Ant Task 1.3.0 API) - +Uses of Class org.owasp.dependencycheck.ant.logging.AntLoggerAdapter (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/class-use/AntLoggerFactory.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/class-use/AntLoggerFactory.html index 983205ed2..5fbae5032 100644 --- a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/class-use/AntLoggerFactory.html +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/class-use/AntLoggerFactory.html @@ -2,16 +2,16 @@ - + -Uses of Class org.owasp.dependencycheck.ant.logging.AntLoggerFactory (Dependency-Check Ant Task 1.3.0 API) - +Uses of Class org.owasp.dependencycheck.ant.logging.AntLoggerFactory (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-frame.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-frame.html index 0cee24ccb..faf267759 100644 --- a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-frame.html +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-frame.html @@ -2,10 +2,10 @@ - + -org.owasp.dependencycheck.ant.logging (Dependency-Check Ant Task 1.3.0 API) - +org.owasp.dependencycheck.ant.logging (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-summary.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-summary.html index 251d0022f..6d84e70a3 100644 --- a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-summary.html +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-summary.html @@ -2,16 +2,16 @@ - + -org.owasp.dependencycheck.ant.logging (Dependency-Check Ant Task 1.3.0 API) - +org.owasp.dependencycheck.ant.logging (Dependency-Check Ant Task 1.3.1 API) + @@ -83,7 +83,7 @@ AntLoggerAdapter -
    An instance of Logger which simply calls the log method on the delegate Ant task
    +
    An instance of Logger which simply calls the log method on the delegate Ant task.
    diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-tree.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-tree.html index 039f6e770..075d8c6cf 100644 --- a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-tree.html +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-tree.html @@ -2,16 +2,16 @@ - + -org.owasp.dependencycheck.ant.logging Class Hierarchy (Dependency-Check Ant Task 1.3.0 API) - +org.owasp.dependencycheck.ant.logging Class Hierarchy (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-use.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-use.html index 1909a208b..778360fcf 100644 --- a/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-use.html +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/ant/logging/package-use.html @@ -2,16 +2,16 @@ - + -Uses of Package org.owasp.dependencycheck.ant.logging (Dependency-Check Ant Task 1.3.0 API) - +Uses of Package org.owasp.dependencycheck.ant.logging (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Check.ReportFormats.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Check.ReportFormats.html new file mode 100644 index 000000000..e6e7043bf --- /dev/null +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Check.ReportFormats.html @@ -0,0 +1,297 @@ + + + + + + +Check.ReportFormats (Dependency-Check Ant Task 1.3.1 API) + + + + + + + + + + + +
    +
    org.owasp.dependencycheck.taskdefs
    +

    Class Check.ReportFormats

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.apache.tools.ant.types.EnumeratedAttribute
      • +
      • +
          +
        • org.owasp.dependencycheck.taskdefs.Check.ReportFormats
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Enclosing class:
      +
      Check
      +
      +
      +
      +
      public static class Check.ReportFormats
      +extends org.apache.tools.ant.types.EnumeratedAttribute
      +
      An enumeration of supported report formats: "ALL", "HTML", "XML", "VULN", etc..
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        +
          +
        • + + +

          Fields inherited from class org.apache.tools.ant.types.EnumeratedAttribute

          +value
        • +
        +
      • +
      + + + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + +
        Methods 
        Modifier and TypeMethod and Description
        String[]getValues() +
        Returns the list of values for the report format.
        +
        +
          +
        • + + +

          Methods inherited from class org.apache.tools.ant.types.EnumeratedAttribute

          +containsValue, getIndex, getInstance, getValue, indexOfValue, setValue, toString
        • +
        + +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          Check.ReportFormats

          +
          public Check.ReportFormats()
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getValues

          +
          public String[] getValues()
          +
          Returns the list of values for the report format.
          +
          +
          Specified by:
          +
          getValues in class org.apache.tools.ant.types.EnumeratedAttribute
          +
          Returns:
          the list of values for the report format
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    + + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Check.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Check.html new file mode 100644 index 000000000..ab8d70ec0 --- /dev/null +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Check.html @@ -0,0 +1,1370 @@ + + + + + + +Check (Dependency-Check Ant Task 1.3.1 API) + + + + + + + + + + + +
    +
    org.owasp.dependencycheck.taskdefs
    +

    Class Check

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      Cloneable
      +
      +
      +
      +
      public class Check
      +extends Update
      +
      An Ant task definition to execute dependency-check during an Ant build.
      +
      Author:
      +
      Jeremy Long
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          Check

          +
          public Check()
          +
          Construct a new DependencyCheckTask.
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          add

          +
          public void add(org.apache.tools.ant.types.ResourceCollection rc)
          +
          Add an arbitrary ResourceCollection.
          +
          Parameters:
          rc - the ResourceCollection to add.
          Since:
          +
          Ant 1.7
          +
        • +
        + + + +
          +
        • +

          isReference

          +
          public boolean isReference()
          +
          Learn whether the refid attribute of this element been set.
          +
          Returns:
          true if refid is valid.
          +
        • +
        + + + +
          +
        • +

          setRefid

          +
          public void setRefid(org.apache.tools.ant.types.Reference r)
          +
          Add a reference to a Path, FileSet, DirSet, or FileList defined elsewhere.
          +
          Parameters:
          r - the reference to a path, fileset, dirset or filelist.
          +
        • +
        + + + +
          +
        • +

          getApplicationName

          +
          @Deprecated
          +public String getApplicationName()
          +
          Deprecated. use projectName instead.
          +
          Get the value of applicationName.
          +
          Returns:
          the value of applicationName
          +
        • +
        + + + +
          +
        • +

          setApplicationName

          +
          @Deprecated
          +public void setApplicationName(String applicationName)
          +
          Deprecated. use projectName instead.
          +
          Set the value of applicationName.
          +
          Parameters:
          applicationName - new value of applicationName
          +
        • +
        + + + +
          +
        • +

          getProjectName

          +
          public String getProjectName()
          +
          Get the value of projectName.
          +
          Returns:
          the value of projectName
          +
        • +
        + + + +
          +
        • +

          setProjectName

          +
          public void setProjectName(String projectName)
          +
          Set the value of projectName.
          +
          Parameters:
          projectName - new value of projectName
          +
        • +
        + + + +
          +
        • +

          getReportOutputDirectory

          +
          public String getReportOutputDirectory()
          +
          Get the value of reportOutputDirectory.
          +
          Returns:
          the value of reportOutputDirectory
          +
        • +
        + + + +
          +
        • +

          setReportOutputDirectory

          +
          public void setReportOutputDirectory(String reportOutputDirectory)
          +
          Set the value of reportOutputDirectory.
          +
          Parameters:
          reportOutputDirectory - new value of reportOutputDirectory
          +
        • +
        + + + +
          +
        • +

          getFailBuildOnCVSS

          +
          public float getFailBuildOnCVSS()
          +
          Get the value of failBuildOnCVSS.
          +
          Returns:
          the value of failBuildOnCVSS
          +
        • +
        + + + +
          +
        • +

          setFailBuildOnCVSS

          +
          public void setFailBuildOnCVSS(float failBuildOnCVSS)
          +
          Set the value of failBuildOnCVSS.
          +
          Parameters:
          failBuildOnCVSS - new value of failBuildOnCVSS
          +
        • +
        + + + +
          +
        • +

          isAutoUpdate

          +
          public boolean isAutoUpdate()
          +
          Get the value of autoUpdate.
          +
          Returns:
          the value of autoUpdate
          +
        • +
        + + + +
          +
        • +

          setAutoUpdate

          +
          public void setAutoUpdate(boolean autoUpdate)
          +
          Set the value of autoUpdate.
          +
          Parameters:
          autoUpdate - new value of autoUpdate
          +
        • +
        + + + +
          +
        • +

          isUpdateOnly

          +
          public boolean isUpdateOnly()
          +
          Get the value of updateOnly.
          +
          Returns:
          the value of updateOnly
          +
        • +
        + + + +
          +
        • +

          setUpdateOnly

          +
          public void setUpdateOnly(boolean updateOnly)
          +
          Set the value of updateOnly.
          +
          Parameters:
          updateOnly - new value of updateOnly
          +
        • +
        + + + +
          +
        • +

          getReportFormat

          +
          public String getReportFormat()
          +
          Get the value of reportFormat.
          +
          Returns:
          the value of reportFormat
          +
        • +
        + + + +
          +
        • +

          setReportFormat

          +
          public void setReportFormat(Check.ReportFormats reportFormat)
          +
          Set the value of reportFormat.
          +
          Parameters:
          reportFormat - new value of reportFormat
          +
        • +
        + + + +
          +
        • +

          getSuppressionFile

          +
          public String getSuppressionFile()
          +
          Get the value of suppressionFile.
          +
          Returns:
          the value of suppressionFile
          +
        • +
        + + + +
          +
        • +

          setSuppressionFile

          +
          public void setSuppressionFile(String suppressionFile)
          +
          Set the value of suppressionFile.
          +
          Parameters:
          suppressionFile - new value of suppressionFile
          +
        • +
        + + + +
          +
        • +

          isShowSummary

          +
          public boolean isShowSummary()
          +
          Get the value of showSummary.
          +
          Returns:
          the value of showSummary
          +
        • +
        + + + +
          +
        • +

          setShowSummary

          +
          public void setShowSummary(boolean showSummary)
          +
          Set the value of showSummary.
          +
          Parameters:
          showSummary - new value of showSummary
          +
        • +
        + + + +
          +
        • +

          isJarAnalyzerEnabled

          +
          public boolean isJarAnalyzerEnabled()
          +
          Returns whether or not the analyzer is enabled.
          +
          Returns:
          true if the analyzer is enabled
          +
        • +
        + + + +
          +
        • +

          setJarAnalyzerEnabled

          +
          public void setJarAnalyzerEnabled(boolean jarAnalyzerEnabled)
          +
          Sets whether or not the analyzer is enabled.
          +
          Parameters:
          jarAnalyzerEnabled - the value of the new setting
          +
        • +
        + + + +
          +
        • +

          isArchiveAnalyzerEnabled

          +
          public boolean isArchiveAnalyzerEnabled()
          +
          Returns whether or not the analyzer is enabled.
          +
          Returns:
          true if the analyzer is enabled
          +
        • +
        + + + +
          +
        • +

          setArchiveAnalyzerEnabled

          +
          public void setArchiveAnalyzerEnabled(boolean archiveAnalyzerEnabled)
          +
          Sets whether or not the analyzer is enabled.
          +
          Parameters:
          archiveAnalyzerEnabled - the value of the new setting
          +
        • +
        + + + +
          +
        • +

          isAssemblyAnalyzerEnabled

          +
          public boolean isAssemblyAnalyzerEnabled()
          +
          Returns whether or not the analyzer is enabled.
          +
          Returns:
          true if the analyzer is enabled
          +
        • +
        + + + +
          +
        • +

          setAssemblyAnalyzerEnabled

          +
          public void setAssemblyAnalyzerEnabled(boolean assemblyAnalyzerEnabled)
          +
          Sets whether or not the analyzer is enabled.
          +
          Parameters:
          assemblyAnalyzerEnabled - the value of the new setting
          +
        • +
        + + + +
          +
        • +

          isNuspecAnalyzerEnabled

          +
          public boolean isNuspecAnalyzerEnabled()
          +
          Returns whether or not the analyzer is enabled.
          +
          Returns:
          true if the analyzer is enabled
          +
        • +
        + + + +
          +
        • +

          setNuspecAnalyzerEnabled

          +
          public void setNuspecAnalyzerEnabled(boolean nuspecAnalyzerEnabled)
          +
          Sets whether or not the analyzer is enabled.
          +
          Parameters:
          nuspecAnalyzerEnabled - the value of the new setting
          +
        • +
        + + + +
          +
        • +

          isComposerAnalyzerEnabled

          +
          public boolean isComposerAnalyzerEnabled()
          +
          Get the value of composerAnalyzerEnabled.
          +
          Returns:
          the value of composerAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          setComposerAnalyzerEnabled

          +
          public void setComposerAnalyzerEnabled(boolean composerAnalyzerEnabled)
          +
          Set the value of composerAnalyzerEnabled.
          +
          Parameters:
          composerAnalyzerEnabled - new value of composerAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          isAutoconfAnalyzerEnabled

          +
          public boolean isAutoconfAnalyzerEnabled()
          +
          Get the value of autoconfAnalyzerEnabled.
          +
          Returns:
          the value of autoconfAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          setAutoconfAnalyzerEnabled

          +
          public void setAutoconfAnalyzerEnabled(boolean autoconfAnalyzerEnabled)
          +
          Set the value of autoconfAnalyzerEnabled.
          +
          Parameters:
          autoconfAnalyzerEnabled - new value of autoconfAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          isCMakeAnalyzerEnabled

          +
          public boolean isCMakeAnalyzerEnabled()
          +
          Get the value of cmakeAnalyzerEnabled.
          +
          Returns:
          the value of cmakeAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          setCMakeAnalyzerEnabled

          +
          public void setCMakeAnalyzerEnabled(boolean cmakeAnalyzerEnabled)
          +
          Set the value of cmakeAnalyzerEnabled.
          +
          Parameters:
          cmakeAnalyzerEnabled - new value of cmakeAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          isOpensslAnalyzerEnabled

          +
          public boolean isOpensslAnalyzerEnabled()
          +
          Get the value of opensslAnalyzerEnabled.
          +
          Returns:
          the value of opensslAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          setOpensslAnalyzerEnabled

          +
          public void setOpensslAnalyzerEnabled(boolean opensslAnalyzerEnabled)
          +
          Set the value of opensslAnalyzerEnabled.
          +
          Parameters:
          opensslAnalyzerEnabled - new value of opensslAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          isNodeAnalyzerEnabled

          +
          public boolean isNodeAnalyzerEnabled()
          +
          Get the value of nodeAnalyzerEnabled.
          +
          Returns:
          the value of nodeAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          setNodeAnalyzerEnabled

          +
          public void setNodeAnalyzerEnabled(boolean nodeAnalyzerEnabled)
          +
          Set the value of nodeAnalyzerEnabled.
          +
          Parameters:
          nodeAnalyzerEnabled - new value of nodeAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          isRubygemsAnalyzerEnabled

          +
          public boolean isRubygemsAnalyzerEnabled()
          +
          Get the value of rubygemsAnalyzerEnabled.
          +
          Returns:
          the value of rubygemsAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          setRubygemsAnalyzerEnabled

          +
          public void setRubygemsAnalyzerEnabled(boolean rubygemsAnalyzerEnabled)
          +
          Set the value of rubygemsAnalyzerEnabled.
          +
          Parameters:
          rubygemsAnalyzerEnabled - new value of rubygemsAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          isPyPackageAnalyzerEnabled

          +
          public boolean isPyPackageAnalyzerEnabled()
          +
          Get the value of pyPackageAnalyzerEnabled.
          +
          Returns:
          the value of pyPackageAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          setPyPackageAnalyzerEnabled

          +
          public void setPyPackageAnalyzerEnabled(boolean pyPackageAnalyzerEnabled)
          +
          Set the value of pyPackageAnalyzerEnabled.
          +
          Parameters:
          pyPackageAnalyzerEnabled - new value of pyPackageAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          isPyDistributionAnalyzerEnabled

          +
          public boolean isPyDistributionAnalyzerEnabled()
          +
          Get the value of pyDistributionAnalyzerEnabled.
          +
          Returns:
          the value of pyDistributionAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          setPyDistributionAnalyzerEnabled

          +
          public void setPyDistributionAnalyzerEnabled(boolean pyDistributionAnalyzerEnabled)
          +
          Set the value of pyDistributionAnalyzerEnabled.
          +
          Parameters:
          pyDistributionAnalyzerEnabled - new value of pyDistributionAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          isCentralAnalyzerEnabled

          +
          public boolean isCentralAnalyzerEnabled()
          +
          Get the value of centralAnalyzerEnabled.
          +
          Returns:
          the value of centralAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          setCentralAnalyzerEnabled

          +
          public void setCentralAnalyzerEnabled(boolean centralAnalyzerEnabled)
          +
          Set the value of centralAnalyzerEnabled.
          +
          Parameters:
          centralAnalyzerEnabled - new value of centralAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          isNexusAnalyzerEnabled

          +
          public boolean isNexusAnalyzerEnabled()
          +
          Get the value of nexusAnalyzerEnabled.
          +
          Returns:
          the value of nexusAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          setNexusAnalyzerEnabled

          +
          public void setNexusAnalyzerEnabled(boolean nexusAnalyzerEnabled)
          +
          Set the value of nexusAnalyzerEnabled.
          +
          Parameters:
          nexusAnalyzerEnabled - new value of nexusAnalyzerEnabled
          +
        • +
        + + + +
          +
        • +

          getNexusUrl

          +
          public String getNexusUrl()
          +
          Get the value of nexusUrl.
          +
          Returns:
          the value of nexusUrl
          +
        • +
        + + + +
          +
        • +

          setNexusUrl

          +
          public void setNexusUrl(String nexusUrl)
          +
          Set the value of nexusUrl.
          +
          Parameters:
          nexusUrl - new value of nexusUrl
          +
        • +
        + + + +
          +
        • +

          isNexusUsesProxy

          +
          public boolean isNexusUsesProxy()
          +
          Get the value of nexusUsesProxy.
          +
          Returns:
          the value of nexusUsesProxy
          +
        • +
        + + + +
          +
        • +

          setNexusUsesProxy

          +
          public void setNexusUsesProxy(boolean nexusUsesProxy)
          +
          Set the value of nexusUsesProxy.
          +
          Parameters:
          nexusUsesProxy - new value of nexusUsesProxy
          +
        • +
        + + + +
          +
        • +

          getZipExtensions

          +
          public String getZipExtensions()
          +
          Get the value of zipExtensions.
          +
          Returns:
          the value of zipExtensions
          +
        • +
        + + + +
          +
        • +

          setZipExtensions

          +
          public void setZipExtensions(String zipExtensions)
          +
          Set the value of zipExtensions.
          +
          Parameters:
          zipExtensions - new value of zipExtensions
          +
        • +
        + + + +
          +
        • +

          getPathToMono

          +
          public String getPathToMono()
          +
          Get the value of pathToMono.
          +
          Returns:
          the value of pathToMono
          +
        • +
        + + + +
          +
        • +

          setPathToMono

          +
          public void setPathToMono(String pathToMono)
          +
          Set the value of pathToMono.
          +
          Parameters:
          pathToMono - new value of pathToMono
          +
        • +
        + + + +
          +
        • +

          execute

          +
          public void execute()
          +             throws org.apache.tools.ant.BuildException
          +
          Description copied from class: Update
          +
          Executes the update by initializing the settings, downloads the NVD XML data, and then processes the data storing it in the + local database.
          +
          +
          Overrides:
          +
          execute in class Update
          +
          Throws:
          +
          org.apache.tools.ant.BuildException - thrown if a connection to the local database cannot be made.
          +
        • +
        + + + +
          +
        • +

          populateSettings

          +
          protected void populateSettings()
          +
          Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system properties + required to change the proxy server, port, and connection timeout.
          +
          +
          Overrides:
          +
          populateSettings in class Update
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    + + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Purge.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Purge.html new file mode 100644 index 000000000..0317ce210 --- /dev/null +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Purge.html @@ -0,0 +1,375 @@ + + + + + + +Purge (Dependency-Check Ant Task 1.3.1 API) + + + + + + + + + + + +
    +
    org.owasp.dependencycheck.taskdefs
    +

    Class Purge

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • org.apache.tools.ant.ProjectComponent
      • +
      • +
          +
        • org.apache.tools.ant.Task
        • +
        • +
            +
          • org.owasp.dependencycheck.taskdefs.Purge
          • +
          +
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      Cloneable
      +
      +
      +
      Direct Known Subclasses:
      +
      Update
      +
      +
      +
      +
      public class Purge
      +extends org.apache.tools.ant.Task
      +
      An Ant task definition to execute dependency-check during an Ant build.
      +
      Author:
      +
      Jeremy Long
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Field Summary

        +
          +
        • + + +

          Fields inherited from class org.apache.tools.ant.Task

          +target, taskName, taskType, wrapper
        • +
        +
          +
        • + + +

          Fields inherited from class org.apache.tools.ant.ProjectComponent

          +description, location, project
        • +
        +
      • +
      + +
        +
      • + + +

        Constructor Summary

        + + + + + + + + +
        Constructors 
        Constructor and Description
        Purge() +
        Construct a new DependencyCheckTask.
        +
        +
      • +
      + +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + +
        Methods 
        Modifier and TypeMethod and Description
        voidexecute() 
        StringgetDataDirectory() +
        Get the value of dataDirectory.
        +
        protected voidpopulateSettings() +
        Takes the properties supplied and updates the dependency-check settings.
        +
        voidsetDataDirectory(String dataDirectory) +
        Set the value of dataDirectory.
        +
        +
          +
        • + + +

          Methods inherited from class org.apache.tools.ant.Task

          +bindToOwner, getOwningTarget, getRuntimeConfigurableWrapper, getTaskName, getTaskType, getWrapper, handleErrorFlush, handleErrorOutput, handleFlush, handleInput, handleOutput, init, isInvalid, log, log, log, log, maybeConfigure, perform, reconfigure, setOwningTarget, setRuntimeConfigurableWrapper, setTaskName, setTaskType
        • +
        +
          +
        • + + +

          Methods inherited from class org.apache.tools.ant.ProjectComponent

          +clone, getDescription, getLocation, getProject, setDescription, setLocation, setProject
        • +
        + +
      • +
      +
    • +
    +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          Purge

          +
          public Purge()
          +
          Construct a new DependencyCheckTask.
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getDataDirectory

          +
          public String getDataDirectory()
          +
          Get the value of dataDirectory.
          +
          Returns:
          the value of dataDirectory
          +
        • +
        + + + +
          +
        • +

          setDataDirectory

          +
          public void setDataDirectory(String dataDirectory)
          +
          Set the value of dataDirectory.
          +
          Parameters:
          dataDirectory - new value of dataDirectory
          +
        • +
        + + + +
          +
        • +

          execute

          +
          public void execute()
          +             throws org.apache.tools.ant.BuildException
          +
          +
          Overrides:
          +
          execute in class org.apache.tools.ant.Task
          +
          Throws:
          +
          org.apache.tools.ant.BuildException
          +
        • +
        + + + +
          +
        • +

          populateSettings

          +
          protected void populateSettings()
          +
          Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system properties + required to change the proxy server, port, and connection timeout.
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    + + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Update.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Update.html new file mode 100644 index 000000000..acf3d5adb --- /dev/null +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/Update.html @@ -0,0 +1,839 @@ + + + + + + +Update (Dependency-Check Ant Task 1.3.1 API) + + + + + + + + + + + +
    +
    org.owasp.dependencycheck.taskdefs
    +

    Class Update

    +
    +
    + +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      Cloneable
      +
      +
      +
      Direct Known Subclasses:
      +
      Check
      +
      +
      +
      +
      public class Update
      +extends Purge
      +
      An Ant task definition to execute dependency-check update. This will download the latest data from the National Vulnerability + Database (NVD) and store a copy in the local database.
      +
      Author:
      +
      Jeremy Long
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          Update

          +
          public Update()
          +
          Construct a new UpdateTask.
          +
        • +
        +
      • +
      + +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getProxyServer

          +
          public String getProxyServer()
          +
          Get the value of proxyServer.
          +
          Returns:
          the value of proxyServer
          +
        • +
        + + + +
          +
        • +

          setProxyServer

          +
          public void setProxyServer(String server)
          +
          Set the value of proxyServer.
          +
          Parameters:
          server - new value of proxyServer
          +
        • +
        + + + +
          +
        • +

          getProxyPort

          +
          public String getProxyPort()
          +
          Get the value of proxyPort.
          +
          Returns:
          the value of proxyPort
          +
        • +
        + + + +
          +
        • +

          setProxyPort

          +
          public void setProxyPort(String proxyPort)
          +
          Set the value of proxyPort.
          +
          Parameters:
          proxyPort - new value of proxyPort
          +
        • +
        + + + +
          +
        • +

          getProxyUsername

          +
          public String getProxyUsername()
          +
          Get the value of proxyUsername.
          +
          Returns:
          the value of proxyUsername
          +
        • +
        + + + +
          +
        • +

          setProxyUsername

          +
          public void setProxyUsername(String proxyUsername)
          +
          Set the value of proxyUsername.
          +
          Parameters:
          proxyUsername - new value of proxyUsername
          +
        • +
        + + + +
          +
        • +

          getProxyPassword

          +
          public String getProxyPassword()
          +
          Get the value of proxyPassword.
          +
          Returns:
          the value of proxyPassword
          +
        • +
        + + + +
          +
        • +

          setProxyPassword

          +
          public void setProxyPassword(String proxyPassword)
          +
          Set the value of proxyPassword.
          +
          Parameters:
          proxyPassword - new value of proxyPassword
          +
        • +
        + + + +
          +
        • +

          getConnectionTimeout

          +
          public String getConnectionTimeout()
          +
          Get the value of connectionTimeout.
          +
          Returns:
          the value of connectionTimeout
          +
        • +
        + + + +
          +
        • +

          setConnectionTimeout

          +
          public void setConnectionTimeout(String connectionTimeout)
          +
          Set the value of connectionTimeout.
          +
          Parameters:
          connectionTimeout - new value of connectionTimeout
          +
        • +
        + + + +
          +
        • +

          getDatabaseDriverName

          +
          public String getDatabaseDriverName()
          +
          Get the value of databaseDriverName.
          +
          Returns:
          the value of databaseDriverName
          +
        • +
        + + + +
          +
        • +

          setDatabaseDriverName

          +
          public void setDatabaseDriverName(String databaseDriverName)
          +
          Set the value of databaseDriverName.
          +
          Parameters:
          databaseDriverName - new value of databaseDriverName
          +
        • +
        + + + +
          +
        • +

          getDatabaseDriverPath

          +
          public String getDatabaseDriverPath()
          +
          Get the value of databaseDriverPath.
          +
          Returns:
          the value of databaseDriverPath
          +
        • +
        + + + +
          +
        • +

          setDatabaseDriverPath

          +
          public void setDatabaseDriverPath(String databaseDriverPath)
          +
          Set the value of databaseDriverPath.
          +
          Parameters:
          databaseDriverPath - new value of databaseDriverPath
          +
        • +
        + + + +
          +
        • +

          getConnectionString

          +
          public String getConnectionString()
          +
          Get the value of connectionString.
          +
          Returns:
          the value of connectionString
          +
        • +
        + + + +
          +
        • +

          setConnectionString

          +
          public void setConnectionString(String connectionString)
          +
          Set the value of connectionString.
          +
          Parameters:
          connectionString - new value of connectionString
          +
        • +
        + + + +
          +
        • +

          getDatabaseUser

          +
          public String getDatabaseUser()
          +
          Get the value of databaseUser.
          +
          Returns:
          the value of databaseUser
          +
        • +
        + + + +
          +
        • +

          setDatabaseUser

          +
          public void setDatabaseUser(String databaseUser)
          +
          Set the value of databaseUser.
          +
          Parameters:
          databaseUser - new value of databaseUser
          +
        • +
        + + + +
          +
        • +

          getDatabasePassword

          +
          public String getDatabasePassword()
          +
          Get the value of databasePassword.
          +
          Returns:
          the value of databasePassword
          +
        • +
        + + + +
          +
        • +

          setDatabasePassword

          +
          public void setDatabasePassword(String databasePassword)
          +
          Set the value of databasePassword.
          +
          Parameters:
          databasePassword - new value of databasePassword
          +
        • +
        + + + +
          +
        • +

          getCveUrl12Modified

          +
          public String getCveUrl12Modified()
          +
          Get the value of cveUrl12Modified.
          +
          Returns:
          the value of cveUrl12Modified
          +
        • +
        + + + +
          +
        • +

          setCveUrl12Modified

          +
          public void setCveUrl12Modified(String cveUrl12Modified)
          +
          Set the value of cveUrl12Modified.
          +
          Parameters:
          cveUrl12Modified - new value of cveUrl12Modified
          +
        • +
        + + + +
          +
        • +

          getCveUrl20Modified

          +
          public String getCveUrl20Modified()
          +
          Get the value of cveUrl20Modified.
          +
          Returns:
          the value of cveUrl20Modified
          +
        • +
        + + + +
          +
        • +

          setCveUrl20Modified

          +
          public void setCveUrl20Modified(String cveUrl20Modified)
          +
          Set the value of cveUrl20Modified.
          +
          Parameters:
          cveUrl20Modified - new value of cveUrl20Modified
          +
        • +
        + + + +
          +
        • +

          getCveUrl12Base

          +
          public String getCveUrl12Base()
          +
          Get the value of cveUrl12Base.
          +
          Returns:
          the value of cveUrl12Base
          +
        • +
        + + + +
          +
        • +

          setCveUrl12Base

          +
          public void setCveUrl12Base(String cveUrl12Base)
          +
          Set the value of cveUrl12Base.
          +
          Parameters:
          cveUrl12Base - new value of cveUrl12Base
          +
        • +
        + + + +
          +
        • +

          getCveUrl20Base

          +
          public String getCveUrl20Base()
          +
          Get the value of cveUrl20Base.
          +
          Returns:
          the value of cveUrl20Base
          +
        • +
        + + + +
          +
        • +

          setCveUrl20Base

          +
          public void setCveUrl20Base(String cveUrl20Base)
          +
          Set the value of cveUrl20Base.
          +
          Parameters:
          cveUrl20Base - new value of cveUrl20Base
          +
        • +
        + + + +
          +
        • +

          execute

          +
          public void execute()
          +             throws org.apache.tools.ant.BuildException
          +
          Executes the update by initializing the settings, downloads the NVD XML data, and then processes the data storing it in the + local database.
          +
          +
          Overrides:
          +
          execute in class Purge
          +
          Throws:
          +
          org.apache.tools.ant.BuildException - thrown if a connection to the local database cannot be made.
          +
        • +
        + + + +
          +
        • +

          populateSettings

          +
          protected void populateSettings()
          +
          Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system properties + required to change the proxy server, port, and connection timeout.
          +
          +
          Overrides:
          +
          populateSettings in class Purge
          +
          +
        • +
        +
      • +
      +
    • +
    +
    +
    + + + + + +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    + + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Check.ReportFormats.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Check.ReportFormats.html new file mode 100644 index 000000000..465f2ed0b --- /dev/null +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Check.ReportFormats.html @@ -0,0 +1,161 @@ + + + + + + +Uses of Class org.owasp.dependencycheck.taskdefs.Check.ReportFormats (Dependency-Check Ant Task 1.3.1 API) + + + + + + + + + + +
    +

    Uses of Class
    org.owasp.dependencycheck.taskdefs.Check.ReportFormats

    +
    +
    + +
    + + + + +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    + + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Check.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Check.html new file mode 100644 index 000000000..068fe5881 --- /dev/null +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Check.html @@ -0,0 +1,117 @@ + + + + + + +Uses of Class org.owasp.dependencycheck.taskdefs.Check (Dependency-Check Ant Task 1.3.1 API) + + + + + + + + + + +
    +

    Uses of Class
    org.owasp.dependencycheck.taskdefs.Check

    +
    +
    No usage of org.owasp.dependencycheck.taskdefs.Check
    + + + + +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    + + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Purge.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Purge.html new file mode 100644 index 000000000..70653d38e --- /dev/null +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Purge.html @@ -0,0 +1,167 @@ + + + + + + +Uses of Class org.owasp.dependencycheck.taskdefs.Purge (Dependency-Check Ant Task 1.3.1 API) + + + + + + + + + + +
    +

    Uses of Class
    org.owasp.dependencycheck.taskdefs.Purge

    +
    +
    + +
    + + + + +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    + + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Update.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Update.html new file mode 100644 index 000000000..09ae1860e --- /dev/null +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/class-use/Update.html @@ -0,0 +1,161 @@ + + + + + + +Uses of Class org.owasp.dependencycheck.taskdefs.Update (Dependency-Check Ant Task 1.3.1 API) + + + + + + + + + + +
    +

    Uses of Class
    org.owasp.dependencycheck.taskdefs.Update

    +
    +
    + +
    + + + + +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    + + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-frame.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-frame.html index dd16a1e8b..7730dabb2 100644 --- a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-frame.html +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-frame.html @@ -2,10 +2,10 @@ - + -org.owasp.dependencycheck.taskdefs (Dependency-Check Ant Task 1.3.0 API) - +org.owasp.dependencycheck.taskdefs (Dependency-Check Ant Task 1.3.1 API) + @@ -13,8 +13,10 @@ diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-summary.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-summary.html index 12c60b29b..4d5115d7a 100644 --- a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-summary.html +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-summary.html @@ -2,16 +2,16 @@ - + -org.owasp.dependencycheck.taskdefs (Dependency-Check Ant Task 1.3.0 API) - +org.owasp.dependencycheck.taskdefs (Dependency-Check Ant Task 1.3.1 API) + @@ -81,17 +81,29 @@ -DependencyCheckTask +Check
    An Ant task definition to execute dependency-check during an Ant build.
    -DependencyCheckTask.ReportFormats +Check.ReportFormats
    An enumeration of supported report formats: "ALL", "HTML", "XML", "VULN", etc..
    + +Purge + +
    An Ant task definition to execute dependency-check during an Ant build.
    + + + +Update + +
    An Ant task definition to execute dependency-check update.
    + + diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-tree.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-tree.html index 33f608528..0357bd7b1 100644 --- a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-tree.html +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-tree.html @@ -2,16 +2,16 @@ - + -org.owasp.dependencycheck.taskdefs Class Hierarchy (Dependency-Check Ant Task 1.3.0 API) - +org.owasp.dependencycheck.taskdefs Class Hierarchy (Dependency-Check Ant Task 1.3.1 API) + @@ -77,14 +77,22 @@
    • org.apache.tools.ant.types.EnumeratedAttribute
    • org.apache.tools.ant.ProjectComponent (implements java.lang.Cloneable)
      • org.apache.tools.ant.Task
          -
        • org.owasp.dependencycheck.taskdefs.DependencyCheckTask
        • +
        • org.owasp.dependencycheck.taskdefs.Purge +
            +
          • org.owasp.dependencycheck.taskdefs.Update +
              +
            • org.owasp.dependencycheck.taskdefs.Check
            • +
            +
          • +
          +
      diff --git a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-use.html b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-use.html index 654a5a830..676e47236 100644 --- a/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-use.html +++ b/dependency-check-ant/apidocs/org/owasp/dependencycheck/taskdefs/package-use.html @@ -2,16 +2,16 @@ - + -Uses of Package org.owasp.dependencycheck.taskdefs (Dependency-Check Ant Task 1.3.0 API) - +Uses of Package org.owasp.dependencycheck.taskdefs (Dependency-Check Ant Task 1.3.1 API) + @@ -95,10 +95,20 @@ -DependencyCheckTask.ReportFormats +Check.ReportFormats
      An enumeration of supported report formats: "ALL", "HTML", "XML", "VULN", etc..
      + +Purge +
      An Ant task definition to execute dependency-check during an Ant build.
      + + + +Update +
      An Ant task definition to execute dependency-check update.
      + +
    • diff --git a/dependency-check-ant/apidocs/org/slf4j/impl/StaticLoggerBinder.html b/dependency-check-ant/apidocs/org/slf4j/impl/StaticLoggerBinder.html index 2316d6e2b..eff8afdf4 100644 --- a/dependency-check-ant/apidocs/org/slf4j/impl/StaticLoggerBinder.html +++ b/dependency-check-ant/apidocs/org/slf4j/impl/StaticLoggerBinder.html @@ -2,16 +2,16 @@ - + -StaticLoggerBinder (Dependency-Check Ant Task 1.3.0 API) - +StaticLoggerBinder (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/org/slf4j/impl/class-use/StaticLoggerBinder.html b/dependency-check-ant/apidocs/org/slf4j/impl/class-use/StaticLoggerBinder.html index ba3f40c8e..542d1b45a 100644 --- a/dependency-check-ant/apidocs/org/slf4j/impl/class-use/StaticLoggerBinder.html +++ b/dependency-check-ant/apidocs/org/slf4j/impl/class-use/StaticLoggerBinder.html @@ -2,16 +2,16 @@ - + -Uses of Class org.slf4j.impl.StaticLoggerBinder (Dependency-Check Ant Task 1.3.0 API) - +Uses of Class org.slf4j.impl.StaticLoggerBinder (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/org/slf4j/impl/package-frame.html b/dependency-check-ant/apidocs/org/slf4j/impl/package-frame.html index 8bf389aba..fccf56d25 100644 --- a/dependency-check-ant/apidocs/org/slf4j/impl/package-frame.html +++ b/dependency-check-ant/apidocs/org/slf4j/impl/package-frame.html @@ -2,10 +2,10 @@ - + -org.slf4j.impl (Dependency-Check Ant Task 1.3.0 API) - +org.slf4j.impl (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/org/slf4j/impl/package-summary.html b/dependency-check-ant/apidocs/org/slf4j/impl/package-summary.html index 4d0f0f2d9..2a3ce05f0 100644 --- a/dependency-check-ant/apidocs/org/slf4j/impl/package-summary.html +++ b/dependency-check-ant/apidocs/org/slf4j/impl/package-summary.html @@ -2,16 +2,16 @@ - + -org.slf4j.impl (Dependency-Check Ant Task 1.3.0 API) - +org.slf4j.impl (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/org/slf4j/impl/package-tree.html b/dependency-check-ant/apidocs/org/slf4j/impl/package-tree.html index 7de0a922c..33a5fd4d9 100644 --- a/dependency-check-ant/apidocs/org/slf4j/impl/package-tree.html +++ b/dependency-check-ant/apidocs/org/slf4j/impl/package-tree.html @@ -2,16 +2,16 @@ - + -org.slf4j.impl Class Hierarchy (Dependency-Check Ant Task 1.3.0 API) - +org.slf4j.impl Class Hierarchy (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/org/slf4j/impl/package-use.html b/dependency-check-ant/apidocs/org/slf4j/impl/package-use.html index f35d69a26..555470c56 100644 --- a/dependency-check-ant/apidocs/org/slf4j/impl/package-use.html +++ b/dependency-check-ant/apidocs/org/slf4j/impl/package-use.html @@ -2,16 +2,16 @@ - + -Uses of Package org.slf4j.impl (Dependency-Check Ant Task 1.3.0 API) - +Uses of Package org.slf4j.impl (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/overview-frame.html b/dependency-check-ant/apidocs/overview-frame.html index 97ccd9dca..5a8c9315b 100644 --- a/dependency-check-ant/apidocs/overview-frame.html +++ b/dependency-check-ant/apidocs/overview-frame.html @@ -2,10 +2,10 @@ - + -Overview List (Dependency-Check Ant Task 1.3.0 API) - +Overview List (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/apidocs/overview-summary.html b/dependency-check-ant/apidocs/overview-summary.html index e323cea69..972a1d539 100644 --- a/dependency-check-ant/apidocs/overview-summary.html +++ b/dependency-check-ant/apidocs/overview-summary.html @@ -2,16 +2,16 @@ - + -Overview (Dependency-Check Ant Task 1.3.0 API) - +Overview (Dependency-Check Ant Task 1.3.1 API) + @@ -64,7 +64,7 @@
    -

    Dependency-Check Ant Task 1.3.0 API

    +

    Dependency-Check Ant Task 1.3.1 API

    diff --git a/dependency-check-ant/apidocs/overview-tree.html b/dependency-check-ant/apidocs/overview-tree.html index 4270f0ed8..08746b46f 100644 --- a/dependency-check-ant/apidocs/overview-tree.html +++ b/dependency-check-ant/apidocs/overview-tree.html @@ -2,16 +2,16 @@ - + -Class Hierarchy (Dependency-Check Ant Task 1.3.0 API) - +Class Hierarchy (Dependency-Check Ant Task 1.3.1 API) + @@ -80,7 +80,7 @@
  • org.owasp.dependencycheck.ant.logging.AntLoggerFactory (implements org.slf4j.ILoggerFactory)
  • org.apache.tools.ant.types.EnumeratedAttribute
  • org.slf4j.helpers.MarkerIgnoringBase (implements org.slf4j.Logger) @@ -92,7 +92,15 @@
    • org.apache.tools.ant.Task
        -
      • org.owasp.dependencycheck.taskdefs.DependencyCheckTask
      • +
      • org.owasp.dependencycheck.taskdefs.Purge +
          +
        • org.owasp.dependencycheck.taskdefs.Update +
            +
          • org.owasp.dependencycheck.taskdefs.Check
          • +
          +
        • +
        +
    diff --git a/dependency-check-ant/apidocs/serialized-form.html b/dependency-check-ant/apidocs/serialized-form.html index 47a39023f..c5d9fb2f3 100644 --- a/dependency-check-ant/apidocs/serialized-form.html +++ b/dependency-check-ant/apidocs/serialized-form.html @@ -2,16 +2,16 @@ - + -Serialized Form (Dependency-Check Ant Task 1.3.0 API) - +Serialized Form (Dependency-Check Ant Task 1.3.1 API) + diff --git a/dependency-check-ant/checkstyle.html b/dependency-check-ant/checkstyle.html index cf38503c8..0bb979218 100644 --- a/dependency-check-ant/checkstyle.html +++ b/dependency-check-ant/checkstyle.html @@ -1,21 +1,21 @@ - + - dependency-check-ant - Checkstyle Results - + dependency-check-ant – Checkstyle Results + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Checkstyle Results

    -

    The following document contains the results of Checkstylerss feed

    +

    Checkstyle Results

    +

    The following document contains the results of Checkstyle 6.2 with C:\Users\jeremy\Projects\DependencyCheck\dependency-check-ant/../src/main/config/checkstyle-checks.xml ruleset. rss feed

    -

    Summary

    +

    Summary

    - - - + + + - + -
    FilesInfos InfosWarnings WarningsErrors Errors
     Info Warnings Errors
    2419 0 06
    +5
    -

    Details

    +

    Details

    -

    src/main/java/org/owasp/dependencycheck/ant/logging/AntLoggerAdapter.java

    +

    org/owasp/dependencycheck/taskdefs/Check.java

    - + + + - - -
    ViolationSeverityCategoryRule Message Line
    ErrorsFirst sentence should end with a period.26
    + Error +sizes +MethodCount +Total number of methods is 64 (max allowed is 40). +48
    -

    src/main/java/org/owasp/dependencycheck/taskdefs/DependencyCheckTask.java

    +

    org/slf4j/impl/StaticLoggerBinder.java

    - + + + - - -
    ViolationSeverityCategoryRule Message Line
    ErrorsTotal number of methods is 78 (max allowed is 40).50
    -
    -

    src/main/java/org/slf4j/impl/StaticLoggerBinder.java

    - - - - - - - + + + - + - + + + - + - + + + - + - + + + -
    ViolationMessageLine
    Errors ErrordesignFinalClass Class StaticLoggerBinder should be declared as final.31
    31
    Errors ErrornamingStaticVariableName Name 'REQUESTED_API_VERSION' must match pattern '^[a-z][a-zA-Z0-9]*$'.68
    68
    Errors ErrordesignVisibilityModifier Variable 'REQUESTED_API_VERSION' must be private and have accessor methods.68
    68
    Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.70
    +70
    @@ -317,15 +306,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-ant/checkstyle.rss b/dependency-check-ant/checkstyle.rss index ddba830a5..9aec75487 100644 --- a/dependency-check-ant/checkstyle.rss +++ b/dependency-check-ant/checkstyle.rss @@ -25,8 +25,8 @@ under the License. en-us ©2012 - 2015 OWASP - File: 24, - Errors: 6, + <title>File: 19, + Errors: 5, Warnings: 0, Infos: 0 @@ -60,7 +60,7 @@ under the License. - org/owasp/dependencycheck/taskdefs/DependencyCheckTask.java + dependency-check-taskdefs.properties 0 @@ -74,7 +74,35 @@ under the License. - src/main/resources/taskdefs.properties + org/owasp/dependencycheck/taskdefs/Update.java + + + 0 + + + 0 + + + 0 + + + + + LICENSE.txt + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/taskdefs/Purge.java 0 @@ -99,62 +127,6 @@ under the License. 0 - - - - src/main/java/org/owasp/dependencycheck/ant/logging/AntLoggerFactory.java - - - 0 - - - 0 - - - 0 - - - - - src/main/java/org/owasp/dependencycheck/ant/logging/AntLoggerAdapter.java - - - 0 - - - 0 - - - 1 - - - - - taskdefs.properties - - - 0 - - - 0 - - - 0 - - - - - src/main/resources/task.properties - - - 0 - - - 0 - - - 0 - @@ -172,7 +144,7 @@ under the License. - src/main/java/org/slf4j/impl/package-info.java + org/owasp/dependencycheck/taskdefs/Check.java 0 @@ -181,21 +153,7 @@ under the License. 0 - 0 - - - - - src/main/java/org/owasp/dependencycheck/taskdefs/package-info.java - - - 0 - - - 0 - - - 0 + 1 @@ -211,34 +169,6 @@ under the License. 0 - - - - src/main/java/org/slf4j/impl/StaticLoggerBinder.java - - - 0 - - - 0 - - - 4 - - - - - src/main/java/org/owasp/dependencycheck/taskdefs/DependencyCheckTask.java - - - 0 - - - 0 - - - 1 - @@ -265,12 +195,12 @@ under the License. 0 - 0 + 4 - target/classes/taskdefs.properties + target/generated-classes/cobertura/dependency-check-taskdefs.properties 0 @@ -284,7 +214,7 @@ under the License. - src/main/java/org/owasp/dependencycheck/ant/logging/package-info.java + target/classes/dependency-check-taskdefs.properties 0 @@ -312,7 +242,7 @@ under the License. - target/generated-classes/cobertura/taskdefs.properties + NOTICE.txt 0 diff --git a/dependency-check-ant/cobertura/frame-sourcefiles-org.owasp.dependencycheck.ant.logging.html b/dependency-check-ant/cobertura/frame-sourcefiles-org.owasp.dependencycheck.ant.logging.html index b3f96796f..cd7103d86 100644 --- a/dependency-check-ant/cobertura/frame-sourcefiles-org.owasp.dependencycheck.ant.logging.html +++ b/dependency-check-ant/cobertura/frame-sourcefiles-org.owasp.dependencycheck.ant.logging.html @@ -15,10 +15,10 @@ org.owasp.dependencycheck.ant.logging - + - +
    AntLoggerAdapter (26%)AntLoggerAdapter (0%)
    AntLoggerFactory (100%)AntLoggerFactory (0%)
    diff --git a/dependency-check-ant/cobertura/frame-sourcefiles-org.owasp.dependencycheck.taskdefs.html b/dependency-check-ant/cobertura/frame-sourcefiles-org.owasp.dependencycheck.taskdefs.html index f2cdcaf67..9378f1ffb 100644 --- a/dependency-check-ant/cobertura/frame-sourcefiles-org.owasp.dependencycheck.taskdefs.html +++ b/dependency-check-ant/cobertura/frame-sourcefiles-org.owasp.dependencycheck.taskdefs.html @@ -15,7 +15,13 @@ org.owasp.dependencycheck.taskdefs - + + + + + + +
    DependencyCheckTask (49%)Check (0%)
    Purge (0%)
    Update (0%)
    diff --git a/dependency-check-ant/cobertura/frame-sourcefiles-org.slf4j.impl.html b/dependency-check-ant/cobertura/frame-sourcefiles-org.slf4j.impl.html index 372e66737..2b7e2c2cb 100644 --- a/dependency-check-ant/cobertura/frame-sourcefiles-org.slf4j.impl.html +++ b/dependency-check-ant/cobertura/frame-sourcefiles-org.slf4j.impl.html @@ -15,7 +15,7 @@ org.slf4j.impl - +
    StaticLoggerBinder (92%)StaticLoggerBinder (0%)
    diff --git a/dependency-check-ant/cobertura/frame-sourcefiles.html b/dependency-check-ant/cobertura/frame-sourcefiles.html index d442094cd..92094afd8 100644 --- a/dependency-check-ant/cobertura/frame-sourcefiles.html +++ b/dependency-check-ant/cobertura/frame-sourcefiles.html @@ -15,16 +15,22 @@ All Packages - + - + - + - + + + + + + +
    AntLoggerAdapter (26%)AntLoggerAdapter (0%)
    AntLoggerFactory (100%)AntLoggerFactory (0%)
    DependencyCheckTask (49%)Check (0%)
    StaticLoggerBinder (92%)Purge (0%)
    StaticLoggerBinder (0%)
    Update (0%)
    diff --git a/dependency-check-ant/cobertura/frame-summary-org.owasp.dependencycheck.ant.logging.html b/dependency-check-ant/cobertura/frame-summary-org.owasp.dependencycheck.ant.logging.html index 00d31ab5f..4e61d33ec 100644 --- a/dependency-check-ant/cobertura/frame-summary-org.owasp.dependencycheck.ant.logging.html +++ b/dependency-check-ant/cobertura/frame-summary-org.owasp.dependencycheck.ant.logging.html @@ -16,7 +16,7 @@ - +
    Package # Classes Line Coverage Branch Coverage Complexity
    org.owasp.dependencycheck.ant.logging2
    29%
    30/103
    18%
    9/48
    1.706
    org.owasp.dependencycheck.ant.logging2
    0%
    0/103
    0%
    0/48
    1.706
    - + diff --git a/dependency-check-ant/cobertura/frame-summary-org.owasp.dependencycheck.taskdefs.html b/dependency-check-ant/cobertura/frame-summary-org.owasp.dependencycheck.taskdefs.html index 0c0848b70..35e33c84f 100644 --- a/dependency-check-ant/cobertura/frame-summary-org.owasp.dependencycheck.taskdefs.html +++ b/dependency-check-ant/cobertura/frame-summary-org.owasp.dependencycheck.taskdefs.html @@ -16,7 +16,7 @@ - +
    Package # Classes Line Coverage Branch Coverage Complexity
    org.owasp.dependencycheck.taskdefs2
    49%
    148/299
    39%
    55/138
    2.025
    org.owasp.dependencycheck.taskdefs4
    0%
    0/376
    0%
    0/148
    1.882
    - + diff --git a/dependency-check-ant/cobertura/frame-summary-org.slf4j.impl.html b/dependency-check-ant/cobertura/frame-summary-org.slf4j.impl.html index 43be0862e..5f0390c38 100644 --- a/dependency-check-ant/cobertura/frame-summary-org.slf4j.impl.html +++ b/dependency-check-ant/cobertura/frame-summary-org.slf4j.impl.html @@ -16,7 +16,7 @@ - +
    Package # Classes Line Coverage Branch Coverage Complexity
    org.slf4j.impl1
    92%
    12/13
    N/A
    1
    org.slf4j.impl1
    0%
    0/13
    N/A
    1
    - + diff --git a/dependency-check-ant/cobertura/frame-summary.html b/dependency-check-ant/cobertura/frame-summary.html index f06e2d9a8..0a01dd1c1 100644 --- a/dependency-check-ant/cobertura/frame-summary.html +++ b/dependency-check-ant/cobertura/frame-summary.html @@ -16,10 +16,10 @@ - - - - + + + +
    Package # Classes Line Coverage Branch Coverage Complexity
    All Packages5
    45%
    190/415
    34%
    64/186
    1.891
    org.owasp.dependencycheck.ant.logging2
    29%
    30/103
    18%
    9/48
    1.706
    org.owasp.dependencycheck.taskdefs2
    49%
    148/299
    39%
    55/138
    2.025
    org.slf4j.impl1
    92%
    12/13
    N/A
    1
    All Packages7
    0%
    0/492
    0%
    0/196
    1.809
    org.owasp.dependencycheck.ant.logging2
    0%
    0/103
    0%
    0/48
    1.706
    org.owasp.dependencycheck.taskdefs4
    0%
    0/376
    0%
    0/148
    1.882
    org.slf4j.impl1
    0%
    0/13
    N/A
    1
    - + diff --git a/dependency-check-ant/cobertura/org.owasp.dependencycheck.ant.logging.AntLoggerAdapter.html b/dependency-check-ant/cobertura/org.owasp.dependencycheck.ant.logging.AntLoggerAdapter.html index 5a6fbe97a..e32eb0ae6 100644 --- a/dependency-check-ant/cobertura/org.owasp.dependencycheck.ant.logging.AntLoggerAdapter.html +++ b/dependency-check-ant/cobertura/org.owasp.dependencycheck.ant.logging.AntLoggerAdapter.html @@ -12,7 +12,7 @@
     
    - +
    Classes in this File Line Coverage Branch Coverage Complexity
    AntLoggerAdapter
    26%
    26/99
    18%
    9/48
    1.75
    AntLoggerAdapter
    0%
    0/99
    0%
    0/48
    1.75
     
    @@ -70,7 +70,7 @@  26  
     /**
     27   -
      * An instance of {@link org.slf4j.Logger} which simply calls the log method on the delegate Ant task
    +
      * An instance of {@link org.slf4j.Logger} which simply calls the log method on the delegate Ant task.
     28  
      *
     29   @@ -103,9 +103,9 @@
          */
     43  
         public AntLoggerAdapter(Task task) {
    -  44  40
             super();
    -  45  40
             this.task = task;
    -  46  40
         }
    +  44  0
             super();
    +  45  0
             this.task = task;
    +  46  0
         }
     47  
     
     48   @@ -141,20 +141,20 @@
         @Override
     65  
         public void trace(String msg) {
    -  66  216
             task.log(msg, Project.MSG_VERBOSE);
    -  67  216
         }
    +  66  0
             task.log(msg, Project.MSG_VERBOSE);
    +  67  0
         }
     68  
     
     69  
         @Override
     70  
         public void trace(String format, Object arg) {
    -  71  64
             if (task != null) {
    +  71  0
             if (task != null) {
     72  0
                 final FormattingTuple tp = MessageFormatter.format(format, arg);
     73  0
                 task.log(tp.getMessage(), Project.MSG_VERBOSE);
     74  
             }
    -  75  64
         }
    +  75  0
         }
     76  
     
     77   @@ -196,7 +196,7 @@
         @Override
     101  
         public boolean isDebugEnabled() {
    -  102  80
             return true;
    +  102  0
             return true;
     103  
         }
     104   @@ -205,47 +205,47 @@
         @Override
     106  
         public void debug(String msg) {
    -  107  966
             if (task != null) {
    -  108  886
                 task.log(msg, Project.MSG_DEBUG);
    +  107  0
             if (task != null) {
    +  108  0
                 task.log(msg, Project.MSG_DEBUG);
     109  
             }
    -  110  966
         }
    +  110  0
         }
     111  
     
     112  
         @Override
     113  
         public void debug(String format, Object arg) {
    -  114  2960
             if (task != null) {
    -  115  2856
                 final FormattingTuple tp = MessageFormatter.format(format, arg);
    -  116  2856
                 task.log(tp.getMessage(), Project.MSG_DEBUG);
    +  114  0
             if (task != null) {
    +  115  0
                 final FormattingTuple tp = MessageFormatter.format(format, arg);
    +  116  0
                 task.log(tp.getMessage(), Project.MSG_DEBUG);
     117  
             }
    -  118  2960
         }
    +  118  0
         }
     119  
     
     120  
         @Override
     121  
         public void debug(String format, Object arg1, Object arg2) {
    -  122  280
             if (task != null) {
    -  123  64
                 final FormattingTuple tp = MessageFormatter.format(format, arg1, arg2);
    -  124  64
                 task.log(tp.getMessage(), Project.MSG_DEBUG);
    +  122  0
             if (task != null) {
    +  123  0
                 final FormattingTuple tp = MessageFormatter.format(format, arg1, arg2);
    +  124  0
                 task.log(tp.getMessage(), Project.MSG_DEBUG);
     125  
             }
    -  126  280
         }
    +  126  0
         }
     127  
     
     128  
         @Override
     129  
         public void debug(String format, Object... arguments) {
    -  130  16
             if (task != null) {
    -  131  16
                 final FormattingTuple tp = MessageFormatter.format(format, arguments);
    -  132  16
                 task.log(tp.getMessage(), Project.MSG_DEBUG);
    +  130  0
             if (task != null) {
    +  131  0
                 final FormattingTuple tp = MessageFormatter.format(format, arguments);
    +  132  0
                 task.log(tp.getMessage(), Project.MSG_DEBUG);
     133  
             }
    -  134  16
         }
    +  134  0
         }
     135  
     
     136   @@ -272,11 +272,11 @@
         @Override
     149  
         public void info(String msg) {
    -  150  72
             if (task != null) {
    -  151  72
                 task.log(msg, Project.MSG_INFO);
    +  150  0
             if (task != null) {
    +  151  0
                 task.log(msg, Project.MSG_INFO);
     152  
             }
    -  153  72
         }
    +  153  0
         }
     154  
     
     155   @@ -462,6 +462,6 @@
     }
    - + diff --git a/dependency-check-ant/cobertura/org.owasp.dependencycheck.ant.logging.AntLoggerFactory.html b/dependency-check-ant/cobertura/org.owasp.dependencycheck.ant.logging.AntLoggerFactory.html index 2148f28c9..1a35d5202 100644 --- a/dependency-check-ant/cobertura/org.owasp.dependencycheck.ant.logging.AntLoggerFactory.html +++ b/dependency-check-ant/cobertura/org.owasp.dependencycheck.ant.logging.AntLoggerFactory.html @@ -12,7 +12,7 @@
     
    - +
    Classes in this File Line Coverage Branch Coverage Complexity
    AntLoggerFactory
    100%
    4/4
    N/A
    1
    AntLoggerFactory
    0%
    0/4
    N/A
    1
     
    @@ -99,9 +99,9 @@
          */
     41  
         public AntLoggerFactory(Task task) {
    -  42  40
             super();
    -  43  40
             this.antLoggerAdapter = new AntLoggerAdapter(task);
    -  44  40
         }
    +  42  0
             super();
    +  43  0
             this.antLoggerAdapter = new AntLoggerAdapter(task);
    +  44  0
         }
     45  
     
     46   @@ -120,13 +120,13 @@
         @Override
     53  
         public Logger getLogger(String name) {
    -  54  288
             return antLoggerAdapter;
    +  54  0
             return antLoggerAdapter;
     55  
         }
     56  
     }
    - + diff --git a/dependency-check-ant/cobertura/org.owasp.dependencycheck.taskdefs.Check.html b/dependency-check-ant/cobertura/org.owasp.dependencycheck.taskdefs.Check.html new file mode 100644 index 000000000..10d694965 --- /dev/null +++ b/dependency-check-ant/cobertura/org.owasp.dependencycheck.taskdefs.Check.html @@ -0,0 +1,1710 @@ + + + + +Coverage Report + + + + +
    Coverage Report - org.owasp.dependencycheck.taskdefs.Check
    +
     
    + + + + + +
    Classes in this File Line Coverage Branch Coverage Complexity
    Check
    0%
    0/246
    0%
    0/80
    1.788
    Check$ReportFormats
    0%
    0/7
    0%
    0/2
    1.788
    +
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     1  
     /*
     2  
      * This file is part of dependency-check-ant.
     3  
      *
     4  
      * Licensed under the Apache License, Version 2.0 (the "License");
     5  
      * you may not use this file except in compliance with the License.
     6  
      * You may obtain a copy of the License at
     7  
      *
     8  
      *     http://www.apache.org/licenses/LICENSE-2.0
     9  
      *
     10  
      * Unless required by applicable law or agreed to in writing, software
     11  
      * distributed under the License is distributed on an "AS IS" BASIS,
     12  
      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  
      * See the License for the specific language governing permissions and
     14  
      * limitations under the License.
     15  
      *
     16  
      * Copyright (c) 2013 Jeremy Long. All Rights Reserved.
     17  
      */
     18  
     package org.owasp.dependencycheck.taskdefs;
     19  
     
     20  
     import java.io.File;
     21  
     import java.io.IOException;
     22  
     import java.util.List;
     23  
     import org.apache.tools.ant.BuildException;
     24  
     import org.apache.tools.ant.Project;
     25  
     import org.apache.tools.ant.types.EnumeratedAttribute;
     26  
     import org.apache.tools.ant.types.Reference;
     27  
     import org.apache.tools.ant.types.Resource;
     28  
     import org.apache.tools.ant.types.ResourceCollection;
     29  
     import org.apache.tools.ant.types.resources.FileProvider;
     30  
     import org.apache.tools.ant.types.resources.Resources;
     31  
     import org.owasp.dependencycheck.Engine;
     32  
     import org.owasp.dependencycheck.data.nvdcve.CveDB;
     33  
     import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
     34  
     import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties;
     35  
     import org.owasp.dependencycheck.dependency.Dependency;
     36  
     import org.owasp.dependencycheck.dependency.Identifier;
     37  
     import org.owasp.dependencycheck.dependency.Vulnerability;
     38  
     import org.owasp.dependencycheck.reporting.ReportGenerator;
     39  
     import org.owasp.dependencycheck.reporting.ReportGenerator.Format;
     40  
     import org.owasp.dependencycheck.utils.Settings;
     41  
     import org.slf4j.impl.StaticLoggerBinder;
     42  
     
     43  
     /**
     44  
      * An Ant task definition to execute dependency-check during an Ant build.
     45  
      *
     46  
      * @author Jeremy Long
     47  
      */
     48  
     public class Check extends Update {
     49  
     
     50  
         /**
     51  
          * System specific new line character.
     52  
          */
     53  0
         private static final String NEW_LINE = System.getProperty("line.separator", "\n").intern();
     54  
     
     55  
         /**
     56  
          * Construct a new DependencyCheckTask.
     57  
          */
     58  
         public Check() {
     59  0
             super();
     60  
             // Call this before Dependency Check Core starts logging anything - this way, all SLF4J messages from
     61  
             // core end up coming through this tasks logger
     62  0
             StaticLoggerBinder.getSingleton().setTask(this);
     63  0
         }
     64  
         //The following code was copied Apache Ant PathConvert
     65  
         //BEGIN COPY from org.apache.tools.ant.taskdefs.PathConvert
     66  
         /**
     67  
          * Path to be converted
     68  
          */
     69  0
         private Resources path = null;
     70  
         /**
     71  
          * Reference to path/fileset to convert
     72  
          */
     73  0
         private Reference refid = null;
     74  
     
     75  
         /**
     76  
          * Add an arbitrary ResourceCollection.
     77  
          *
     78  
          * @param rc the ResourceCollection to add.
     79  
          * @since Ant 1.7
     80  
          */
     81  
         public void add(ResourceCollection rc) {
     82  0
             if (isReference()) {
     83  0
                 throw new BuildException("Nested elements are not allowed when using the refid attribute.");
     84  
             }
     85  0
             getPath().add(rc);
     86  0
         }
     87  
     
     88  
         /**
     89  
          * Returns the path. If the path has not been initialized yet, this class is synchronized, and will instantiate the path
     90  
          * object.
     91  
          *
     92  
          * @return the path
     93  
          */
     94  
         private synchronized Resources getPath() {
     95  0
             if (path == null) {
     96  0
                 path = new Resources(getProject());
     97  0
                 path.setCache(true);
     98  
             }
     99  0
             return path;
     100  
         }
     101  
     
     102  
         /**
     103  
          * Learn whether the refid attribute of this element been set.
     104  
          *
     105  
          * @return true if refid is valid.
     106  
          */
     107  
         public boolean isReference() {
     108  0
             return refid != null;
     109  
         }
     110  
     
     111  
         /**
     112  
          * Add a reference to a Path, FileSet, DirSet, or FileList defined elsewhere.
     113  
          *
     114  
          * @param r the reference to a path, fileset, dirset or filelist.
     115  
          */
     116  
         public void setRefid(Reference r) {
     117  0
             if (path != null) {
     118  0
                 throw new BuildException("Nested elements are not allowed when using the refid attribute.");
     119  
             }
     120  0
             refid = r;
     121  0
         }
     122  
     
     123  
         /**
     124  
          * If this is a reference, this method will add the referenced resource collection to the collection of paths.
     125  
          *
     126  
          * @throws BuildException if the reference is not to a resource collection
     127  
          */
     128  
         private void dealWithReferences() throws BuildException {
     129  0
             if (isReference()) {
     130  0
                 final Object o = refid.getReferencedObject(getProject());
     131  0
                 if (!(o instanceof ResourceCollection)) {
     132  0
                     throw new BuildException("refid '" + refid.getRefId()
     133  
                             + "' does not refer to a resource collection.");
     134  
                 }
     135  0
                 getPath().add((ResourceCollection) o);
     136  
             }
     137  0
         }
     138  
         // END COPY from org.apache.tools.ant.taskdefs
     139  
         /**
     140  
          * The application name for the report.
     141  
          *
     142  
          * @deprecated use projectName instead.
     143  
          */
     144  0
         @Deprecated
     145  
         private String applicationName = null;
     146  
     
     147  
         /**
     148  
          * Get the value of applicationName.
     149  
          *
     150  
          * @return the value of applicationName
     151  
          *
     152  
          * @deprecated use projectName instead.
     153  
          */
     154  
         @Deprecated
     155  
         public String getApplicationName() {
     156  0
             return applicationName;
     157  
         }
     158  
     
     159  
         /**
     160  
          * Set the value of applicationName.
     161  
          *
     162  
          * @param applicationName new value of applicationName
     163  
          * @deprecated use projectName instead.
     164  
          */
     165  
         @Deprecated
     166  
         public void setApplicationName(String applicationName) {
     167  0
             this.applicationName = applicationName;
     168  0
         }
     169  
         /**
     170  
          * The name of the project being analyzed.
     171  
          */
     172  0
         private String projectName = "dependency-check";
     173  
     
     174  
         /**
     175  
          * Get the value of projectName.
     176  
          *
     177  
          * @return the value of projectName
     178  
          */
     179  
         public String getProjectName() {
     180  0
             if (applicationName != null) {
     181  0
                 log("Configuration 'applicationName' has been deprecated, please use 'projectName' instead", Project.MSG_WARN);
     182  0
                 if ("dependency-check".equals(projectName)) {
     183  0
                     projectName = applicationName;
     184  
                 }
     185  
             }
     186  0
             return projectName;
     187  
         }
     188  
     
     189  
         /**
     190  
          * Set the value of projectName.
     191  
          *
     192  
          * @param projectName new value of projectName
     193  
          */
     194  
         public void setProjectName(String projectName) {
     195  0
             this.projectName = projectName;
     196  0
         }
     197  
     
     198  
         /**
     199  
          * Specifies the destination directory for the generated Dependency-Check report.
     200  
          */
     201  0
         private String reportOutputDirectory = ".";
     202  
     
     203  
         /**
     204  
          * Get the value of reportOutputDirectory.
     205  
          *
     206  
          * @return the value of reportOutputDirectory
     207  
          */
     208  
         public String getReportOutputDirectory() {
     209  0
             return reportOutputDirectory;
     210  
         }
     211  
     
     212  
         /**
     213  
          * Set the value of reportOutputDirectory.
     214  
          *
     215  
          * @param reportOutputDirectory new value of reportOutputDirectory
     216  
          */
     217  
         public void setReportOutputDirectory(String reportOutputDirectory) {
     218  0
             this.reportOutputDirectory = reportOutputDirectory;
     219  0
         }
     220  
         /**
     221  
          * Specifies if the build should be failed if a CVSS score above a specified level is identified. The default is 11 which
     222  
          * means since the CVSS scores are 0-10, by default the build will never fail and the CVSS score is set to 11. The valid range
     223  
          * for the fail build on CVSS is 0 to 11, where anything above 10 will not cause the build to fail.
     224  
          */
     225  0
         private float failBuildOnCVSS = 11;
     226  
     
     227  
         /**
     228  
          * Get the value of failBuildOnCVSS.
     229  
          *
     230  
          * @return the value of failBuildOnCVSS
     231  
          */
     232  
         public float getFailBuildOnCVSS() {
     233  0
             return failBuildOnCVSS;
     234  
         }
     235  
     
     236  
         /**
     237  
          * Set the value of failBuildOnCVSS.
     238  
          *
     239  
          * @param failBuildOnCVSS new value of failBuildOnCVSS
     240  
          */
     241  
         public void setFailBuildOnCVSS(float failBuildOnCVSS) {
     242  0
             this.failBuildOnCVSS = failBuildOnCVSS;
     243  0
         }
     244  
         /**
     245  
          * Sets whether auto-updating of the NVD CVE/CPE data is enabled. It is not recommended that this be turned to false. Default
     246  
          * is true.
     247  
          */
     248  0
         private boolean autoUpdate = true;
     249  
     
     250  
         /**
     251  
          * Get the value of autoUpdate.
     252  
          *
     253  
          * @return the value of autoUpdate
     254  
          */
     255  
         public boolean isAutoUpdate() {
     256  0
             return autoUpdate;
     257  
         }
     258  
     
     259  
         /**
     260  
          * Set the value of autoUpdate.
     261  
          *
     262  
          * @param autoUpdate new value of autoUpdate
     263  
          */
     264  
         public void setAutoUpdate(boolean autoUpdate) {
     265  0
             this.autoUpdate = autoUpdate;
     266  0
         }
     267  
         /**
     268  
          * Whether only the update phase should be executed.
     269  
          */
     270  0
         private boolean updateOnly = false;
     271  
     
     272  
         /**
     273  
          * Get the value of updateOnly.
     274  
          *
     275  
          * @return the value of updateOnly
     276  
          */
     277  
         public boolean isUpdateOnly() {
     278  0
             return updateOnly;
     279  
         }
     280  
     
     281  
         /**
     282  
          * Set the value of updateOnly.
     283  
          *
     284  
          * @param updateOnly new value of updateOnly
     285  
          */
     286  
         public void setUpdateOnly(boolean updateOnly) {
     287  0
             this.updateOnly = updateOnly;
     288  0
         }
     289  
     
     290  
         /**
     291  
          * The report format to be generated (HTML, XML, VULN, ALL). Default is HTML.
     292  
          */
     293  0
         private String reportFormat = "HTML";
     294  
     
     295  
         /**
     296  
          * Get the value of reportFormat.
     297  
          *
     298  
          * @return the value of reportFormat
     299  
          */
     300  
         public String getReportFormat() {
     301  0
             return reportFormat;
     302  
         }
     303  
     
     304  
         /**
     305  
          * Set the value of reportFormat.
     306  
          *
     307  
          * @param reportFormat new value of reportFormat
     308  
          */
     309  
         public void setReportFormat(ReportFormats reportFormat) {
     310  0
             this.reportFormat = reportFormat.getValue();
     311  0
         }
     312  
         /**
     313  
          * The path to the suppression file.
     314  
          */
     315  
         private String suppressionFile;
     316  
     
     317  
         /**
     318  
          * Get the value of suppressionFile.
     319  
          *
     320  
          * @return the value of suppressionFile
     321  
          */
     322  
         public String getSuppressionFile() {
     323  0
             return suppressionFile;
     324  
         }
     325  
     
     326  
         /**
     327  
          * Set the value of suppressionFile.
     328  
          *
     329  
          * @param suppressionFile new value of suppressionFile
     330  
          */
     331  
         public void setSuppressionFile(String suppressionFile) {
     332  0
             this.suppressionFile = suppressionFile;
     333  0
         }
     334  
         /**
     335  
          * flag indicating whether or not to show a summary of findings.
     336  
          */
     337  0
         private boolean showSummary = true;
     338  
     
     339  
         /**
     340  
          * Get the value of showSummary.
     341  
          *
     342  
          * @return the value of showSummary
     343  
          */
     344  
         public boolean isShowSummary() {
     345  0
             return showSummary;
     346  
         }
     347  
     
     348  
         /**
     349  
          * Set the value of showSummary.
     350  
          *
     351  
          * @param showSummary new value of showSummary
     352  
          */
     353  
         public void setShowSummary(boolean showSummary) {
     354  0
             this.showSummary = showSummary;
     355  0
         }
     356  
     
     357  
         /**
     358  
          * Whether or not the Jar Analyzer is enabled.
     359  
          */
     360  0
         private boolean jarAnalyzerEnabled = true;
     361  
     
     362  
         /**
     363  
          * Returns whether or not the analyzer is enabled.
     364  
          *
     365  
          * @return true if the analyzer is enabled
     366  
          */
     367  
         public boolean isJarAnalyzerEnabled() {
     368  0
             return jarAnalyzerEnabled;
     369  
         }
     370  
     
     371  
         /**
     372  
          * Sets whether or not the analyzer is enabled.
     373  
          *
     374  
          * @param jarAnalyzerEnabled the value of the new setting
     375  
          */
     376  
         public void setJarAnalyzerEnabled(boolean jarAnalyzerEnabled) {
     377  0
             this.jarAnalyzerEnabled = jarAnalyzerEnabled;
     378  0
         }
     379  
         /**
     380  
          * Whether or not the Archive Analyzer is enabled.
     381  
          */
     382  0
         private boolean archiveAnalyzerEnabled = true;
     383  
     
     384  
         /**
     385  
          * Returns whether or not the analyzer is enabled.
     386  
          *
     387  
          * @return true if the analyzer is enabled
     388  
          */
     389  
         public boolean isArchiveAnalyzerEnabled() {
     390  0
             return archiveAnalyzerEnabled;
     391  
         }
     392  
         /**
     393  
          * Whether or not the .NET Assembly Analyzer is enabled.
     394  
          */
     395  0
         private boolean assemblyAnalyzerEnabled = true;
     396  
     
     397  
         /**
     398  
          * Sets whether or not the analyzer is enabled.
     399  
          *
     400  
          * @param archiveAnalyzerEnabled the value of the new setting
     401  
          */
     402  
         public void setArchiveAnalyzerEnabled(boolean archiveAnalyzerEnabled) {
     403  0
             this.archiveAnalyzerEnabled = archiveAnalyzerEnabled;
     404  0
         }
     405  
     
     406  
         /**
     407  
          * Returns whether or not the analyzer is enabled.
     408  
          *
     409  
          * @return true if the analyzer is enabled
     410  
          */
     411  
         public boolean isAssemblyAnalyzerEnabled() {
     412  0
             return assemblyAnalyzerEnabled;
     413  
         }
     414  
     
     415  
         /**
     416  
          * Sets whether or not the analyzer is enabled.
     417  
          *
     418  
          * @param assemblyAnalyzerEnabled the value of the new setting
     419  
          */
     420  
         public void setAssemblyAnalyzerEnabled(boolean assemblyAnalyzerEnabled) {
     421  0
             this.assemblyAnalyzerEnabled = assemblyAnalyzerEnabled;
     422  0
         }
     423  
         /**
     424  
          * Whether or not the .NET Nuspec Analyzer is enabled.
     425  
          */
     426  0
         private boolean nuspecAnalyzerEnabled = true;
     427  
     
     428  
         /**
     429  
          * Returns whether or not the analyzer is enabled.
     430  
          *
     431  
          * @return true if the analyzer is enabled
     432  
          */
     433  
         public boolean isNuspecAnalyzerEnabled() {
     434  0
             return nuspecAnalyzerEnabled;
     435  
         }
     436  
     
     437  
         /**
     438  
          * Sets whether or not the analyzer is enabled.
     439  
          *
     440  
          * @param nuspecAnalyzerEnabled the value of the new setting
     441  
          */
     442  
         public void setNuspecAnalyzerEnabled(boolean nuspecAnalyzerEnabled) {
     443  0
             this.nuspecAnalyzerEnabled = nuspecAnalyzerEnabled;
     444  0
         }
     445  
         /**
     446  
          * Whether or not the PHP Composer Analyzer is enabled.
     447  
          */
     448  0
         private boolean composerAnalyzerEnabled = true;
     449  
     
     450  
         /**
     451  
          * Get the value of composerAnalyzerEnabled.
     452  
          *
     453  
          * @return the value of composerAnalyzerEnabled
     454  
          */
     455  
         public boolean isComposerAnalyzerEnabled() {
     456  0
             return composerAnalyzerEnabled;
     457  
         }
     458  
     
     459  
         /**
     460  
          * Set the value of composerAnalyzerEnabled.
     461  
          *
     462  
          * @param composerAnalyzerEnabled new value of composerAnalyzerEnabled
     463  
          */
     464  
         public void setComposerAnalyzerEnabled(boolean composerAnalyzerEnabled) {
     465  0
             this.composerAnalyzerEnabled = composerAnalyzerEnabled;
     466  0
         }
     467  
         /**
     468  
          * Whether the autoconf analyzer should be enabled.
     469  
          */
     470  0
         private boolean autoconfAnalyzerEnabled = true;
     471  
     
     472  
         /**
     473  
          * Get the value of autoconfAnalyzerEnabled.
     474  
          *
     475  
          * @return the value of autoconfAnalyzerEnabled
     476  
          */
     477  
         public boolean isAutoconfAnalyzerEnabled() {
     478  0
             return autoconfAnalyzerEnabled;
     479  
         }
     480  
     
     481  
         /**
     482  
          * Set the value of autoconfAnalyzerEnabled.
     483  
          *
     484  
          * @param autoconfAnalyzerEnabled new value of autoconfAnalyzerEnabled
     485  
          */
     486  
         public void setAutoconfAnalyzerEnabled(boolean autoconfAnalyzerEnabled) {
     487  0
             this.autoconfAnalyzerEnabled = autoconfAnalyzerEnabled;
     488  0
         }
     489  
         /**
     490  
          * Whether the CMake analyzer should be enabled.
     491  
          */
     492  0
         private boolean cmakeAnalyzerEnabled = true;
     493  
     
     494  
         /**
     495  
          * Get the value of cmakeAnalyzerEnabled.
     496  
          *
     497  
          * @return the value of cmakeAnalyzerEnabled
     498  
          */
     499  
         public boolean isCMakeAnalyzerEnabled() {
     500  0
             return cmakeAnalyzerEnabled;
     501  
         }
     502  
     
     503  
         /**
     504  
          * Set the value of cmakeAnalyzerEnabled.
     505  
          *
     506  
          * @param cmakeAnalyzerEnabled new value of cmakeAnalyzerEnabled
     507  
          */
     508  
         public void setCMakeAnalyzerEnabled(boolean cmakeAnalyzerEnabled) {
     509  0
             this.cmakeAnalyzerEnabled = cmakeAnalyzerEnabled;
     510  0
         }
     511  
         /**
     512  
          * Whether or not the openssl analyzer is enabled.
     513  
          */
     514  0
         private boolean opensslAnalyzerEnabled = true;
     515  
     
     516  
         /**
     517  
          * Get the value of opensslAnalyzerEnabled.
     518  
          *
     519  
          * @return the value of opensslAnalyzerEnabled
     520  
          */
     521  
         public boolean isOpensslAnalyzerEnabled() {
     522  0
             return opensslAnalyzerEnabled;
     523  
         }
     524  
     
     525  
         /**
     526  
          * Set the value of opensslAnalyzerEnabled.
     527  
          *
     528  
          * @param opensslAnalyzerEnabled new value of opensslAnalyzerEnabled
     529  
          */
     530  
         public void setOpensslAnalyzerEnabled(boolean opensslAnalyzerEnabled) {
     531  0
             this.opensslAnalyzerEnabled = opensslAnalyzerEnabled;
     532  0
         }
     533  
         /**
     534  
          * Whether or not the Node.js Analyzer is enabled.
     535  
          */
     536  0
         private boolean nodeAnalyzerEnabled = true;
     537  
     
     538  
         /**
     539  
          * Get the value of nodeAnalyzerEnabled.
     540  
          *
     541  
          * @return the value of nodeAnalyzerEnabled
     542  
          */
     543  
         public boolean isNodeAnalyzerEnabled() {
     544  0
             return nodeAnalyzerEnabled;
     545  
         }
     546  
     
     547  
         /**
     548  
          * Set the value of nodeAnalyzerEnabled.
     549  
          *
     550  
          * @param nodeAnalyzerEnabled new value of nodeAnalyzerEnabled
     551  
          */
     552  
         public void setNodeAnalyzerEnabled(boolean nodeAnalyzerEnabled) {
     553  0
             this.nodeAnalyzerEnabled = nodeAnalyzerEnabled;
     554  0
         }
     555  
         /**
     556  
          * Whether the ruby gemspec analyzer should be enabled.
     557  
          */
     558  0
         private boolean rubygemsAnalyzerEnabled = true;
     559  
     
     560  
         /**
     561  
          * Get the value of rubygemsAnalyzerEnabled.
     562  
          *
     563  
          * @return the value of rubygemsAnalyzerEnabled
     564  
          */
     565  
         public boolean isRubygemsAnalyzerEnabled() {
     566  0
             return rubygemsAnalyzerEnabled;
     567  
         }
     568  
     
     569  
         /**
     570  
          * Set the value of rubygemsAnalyzerEnabled.
     571  
          *
     572  
          * @param rubygemsAnalyzerEnabled new value of rubygemsAnalyzerEnabled
     573  
          */
     574  
         public void setRubygemsAnalyzerEnabled(boolean rubygemsAnalyzerEnabled) {
     575  0
             this.rubygemsAnalyzerEnabled = rubygemsAnalyzerEnabled;
     576  0
         }
     577  
         /**
     578  
          * Whether the python package analyzer should be enabled.
     579  
          */
     580  0
         private boolean pyPackageAnalyzerEnabled = true;
     581  
     
     582  
         /**
     583  
          * Get the value of pyPackageAnalyzerEnabled.
     584  
          *
     585  
          * @return the value of pyPackageAnalyzerEnabled
     586  
          */
     587  
         public boolean isPyPackageAnalyzerEnabled() {
     588  0
             return pyPackageAnalyzerEnabled;
     589  
         }
     590  
     
     591  
         /**
     592  
          * Set the value of pyPackageAnalyzerEnabled.
     593  
          *
     594  
          * @param pyPackageAnalyzerEnabled new value of pyPackageAnalyzerEnabled
     595  
          */
     596  
         public void setPyPackageAnalyzerEnabled(boolean pyPackageAnalyzerEnabled) {
     597  0
             this.pyPackageAnalyzerEnabled = pyPackageAnalyzerEnabled;
     598  0
         }
     599  
     
     600  
         /**
     601  
          * Whether the python distribution analyzer should be enabled.
     602  
          */
     603  0
         private boolean pyDistributionAnalyzerEnabled = true;
     604  
     
     605  
         /**
     606  
          * Get the value of pyDistributionAnalyzerEnabled.
     607  
          *
     608  
          * @return the value of pyDistributionAnalyzerEnabled
     609  
          */
     610  
         public boolean isPyDistributionAnalyzerEnabled() {
     611  0
             return pyDistributionAnalyzerEnabled;
     612  
         }
     613  
     
     614  
         /**
     615  
          * Set the value of pyDistributionAnalyzerEnabled.
     616  
          *
     617  
          * @param pyDistributionAnalyzerEnabled new value of pyDistributionAnalyzerEnabled
     618  
          */
     619  
         public void setPyDistributionAnalyzerEnabled(boolean pyDistributionAnalyzerEnabled) {
     620  0
             this.pyDistributionAnalyzerEnabled = pyDistributionAnalyzerEnabled;
     621  0
         }
     622  
     
     623  
         /**
     624  
          * Whether or not the central analyzer is enabled.
     625  
          */
     626  0
         private boolean centralAnalyzerEnabled = false;
     627  
     
     628  
         /**
     629  
          * Get the value of centralAnalyzerEnabled.
     630  
          *
     631  
          * @return the value of centralAnalyzerEnabled
     632  
          */
     633  
         public boolean isCentralAnalyzerEnabled() {
     634  0
             return centralAnalyzerEnabled;
     635  
         }
     636  
     
     637  
         /**
     638  
          * Set the value of centralAnalyzerEnabled.
     639  
          *
     640  
          * @param centralAnalyzerEnabled new value of centralAnalyzerEnabled
     641  
          */
     642  
         public void setCentralAnalyzerEnabled(boolean centralAnalyzerEnabled) {
     643  0
             this.centralAnalyzerEnabled = centralAnalyzerEnabled;
     644  0
         }
     645  
     
     646  
         /**
     647  
          * Whether or not the nexus analyzer is enabled.
     648  
          */
     649  0
         private boolean nexusAnalyzerEnabled = true;
     650  
     
     651  
         /**
     652  
          * Get the value of nexusAnalyzerEnabled.
     653  
          *
     654  
          * @return the value of nexusAnalyzerEnabled
     655  
          */
     656  
         public boolean isNexusAnalyzerEnabled() {
     657  0
             return nexusAnalyzerEnabled;
     658  
         }
     659  
     
     660  
         /**
     661  
          * Set the value of nexusAnalyzerEnabled.
     662  
          *
     663  
          * @param nexusAnalyzerEnabled new value of nexusAnalyzerEnabled
     664  
          */
     665  
         public void setNexusAnalyzerEnabled(boolean nexusAnalyzerEnabled) {
     666  0
             this.nexusAnalyzerEnabled = nexusAnalyzerEnabled;
     667  0
         }
     668  
     
     669  
         /**
     670  
          * The URL of a Nexus server's REST API end point (http://domain/nexus/service/local).
     671  
          */
     672  
         private String nexusUrl;
     673  
     
     674  
         /**
     675  
          * Get the value of nexusUrl.
     676  
          *
     677  
          * @return the value of nexusUrl
     678  
          */
     679  
         public String getNexusUrl() {
     680  0
             return nexusUrl;
     681  
         }
     682  
     
     683  
         /**
     684  
          * Set the value of nexusUrl.
     685  
          *
     686  
          * @param nexusUrl new value of nexusUrl
     687  
          */
     688  
         public void setNexusUrl(String nexusUrl) {
     689  0
             this.nexusUrl = nexusUrl;
     690  0
         }
     691  
         /**
     692  
          * Whether or not the defined proxy should be used when connecting to Nexus.
     693  
          */
     694  0
         private boolean nexusUsesProxy = true;
     695  
     
     696  
         /**
     697  
          * Get the value of nexusUsesProxy.
     698  
          *
     699  
          * @return the value of nexusUsesProxy
     700  
          */
     701  
         public boolean isNexusUsesProxy() {
     702  0
             return nexusUsesProxy;
     703  
         }
     704  
     
     705  
         /**
     706  
          * Set the value of nexusUsesProxy.
     707  
          *
     708  
          * @param nexusUsesProxy new value of nexusUsesProxy
     709  
          */
     710  
         public void setNexusUsesProxy(boolean nexusUsesProxy) {
     711  0
             this.nexusUsesProxy = nexusUsesProxy;
     712  0
         }
     713  
     
     714  
         /**
     715  
          * Additional ZIP File extensions to add analyze. This should be a comma-separated list of file extensions to treat like ZIP
     716  
          * files.
     717  
          */
     718  
         private String zipExtensions;
     719  
     
     720  
         /**
     721  
          * Get the value of zipExtensions.
     722  
          *
     723  
          * @return the value of zipExtensions
     724  
          */
     725  
         public String getZipExtensions() {
     726  0
             return zipExtensions;
     727  
         }
     728  
     
     729  
         /**
     730  
          * Set the value of zipExtensions.
     731  
          *
     732  
          * @param zipExtensions new value of zipExtensions
     733  
          */
     734  
         public void setZipExtensions(String zipExtensions) {
     735  0
             this.zipExtensions = zipExtensions;
     736  0
         }
     737  
     
     738  
         /**
     739  
          * The path to Mono for .NET assembly analysis on non-windows systems.
     740  
          */
     741  
         private String pathToMono;
     742  
     
     743  
         /**
     744  
          * Get the value of pathToMono.
     745  
          *
     746  
          * @return the value of pathToMono
     747  
          */
     748  
         public String getPathToMono() {
     749  0
             return pathToMono;
     750  
         }
     751  
     
     752  
         /**
     753  
          * Set the value of pathToMono.
     754  
          *
     755  
          * @param pathToMono new value of pathToMono
     756  
          */
     757  
         public void setPathToMono(String pathToMono) {
     758  0
             this.pathToMono = pathToMono;
     759  0
         }
     760  
     
     761  
         @Override
     762  
         public void execute() throws BuildException {
     763  0
             dealWithReferences();
     764  0
             validateConfiguration();
     765  0
             populateSettings();
     766  0
             Engine engine = null;
     767  
             try {
     768  0
                 engine = new Engine(Check.class.getClassLoader());
     769  0
                 if (isUpdateOnly()) {
     770  0
                     log("Deprecated 'UpdateOnly' property set; please use the UpdateTask instead", Project.MSG_WARN);
     771  0
                     engine.doUpdates();
     772  
                 } else {
     773  
                     try {
     774  0
                         for (Resource resource : path) {
     775  0
                             final FileProvider provider = resource.as(FileProvider.class);
     776  0
                             if (provider != null) {
     777  0
                                 final File file = provider.getFile();
     778  0
                                 if (file != null && file.exists()) {
     779  0
                                     engine.scan(file);
     780  
                                 }
     781  
                             }
     782  0
                         }
     783  
     
     784  0
                         engine.analyzeDependencies();
     785  0
                         DatabaseProperties prop = null;
     786  0
                         CveDB cve = null;
     787  
                         try {
     788  0
                             cve = new CveDB();
     789  0
                             cve.open();
     790  0
                             prop = cve.getDatabaseProperties();
     791  0
                         } catch (DatabaseException ex) {
     792  0
                             log("Unable to retrieve DB Properties", ex, Project.MSG_DEBUG);
     793  
                         } finally {
     794  0
                             if (cve != null) {
     795  0
                                 cve.close();
     796  
                             }
     797  
                         }
     798  0
                         final ReportGenerator reporter = new ReportGenerator(getProjectName(), engine.getDependencies(), engine.getAnalyzers(), prop);
     799  0
                         reporter.generateReports(reportOutputDirectory, reportFormat);
     800  
     
     801  0
                         if (this.failBuildOnCVSS <= 10) {
     802  0
                             checkForFailure(engine.getDependencies());
     803  
                         }
     804  0
                         if (this.showSummary) {
     805  0
                             showSummary(engine.getDependencies());
     806  
                         }
     807  0
                     } catch (IOException ex) {
     808  0
                         log("Unable to generate dependency-check report", ex, Project.MSG_DEBUG);
     809  0
                         throw new BuildException("Unable to generate dependency-check report", ex);
     810  0
                     } catch (Exception ex) {
     811  0
                         log("An exception occurred; unable to continue task", ex, Project.MSG_DEBUG);
     812  0
                         throw new BuildException("An exception occurred; unable to continue task", ex);
     813  0
                     }
     814  
                 }
     815  0
             } catch (DatabaseException ex) {
     816  0
                 log("Unable to connect to the dependency-check database; analysis has stopped", ex, Project.MSG_ERR);
     817  
             } finally {
     818  0
                 Settings.cleanup(true);
     819  0
                 if (engine != null) {
     820  0
                     engine.cleanup();
     821  
                 }
     822  
             }
     823  0
         }
     824  
     
     825  
         /**
     826  
          * Validate the configuration to ensure the parameters have been properly configured/initialized.
     827  
          *
     828  
          * @throws BuildException if the task was not configured correctly.
     829  
          */
     830  
         private void validateConfiguration() throws BuildException {
     831  0
             if (path == null) {
     832  0
                 throw new BuildException("No project dependencies have been defined to analyze.");
     833  
             }
     834  0
             if (failBuildOnCVSS < 0 || failBuildOnCVSS > 11) {
     835  0
                 throw new BuildException("Invalid configuration, failBuildOnCVSS must be between 0 and 11.");
     836  
             }
     837  0
         }
     838  
     
     839  
         /**
     840  
          * Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system properties
     841  
          * required to change the proxy server, port, and connection timeout.
     842  
          */
     843  
         @Override
     844  
         protected void populateSettings() {
     845  0
             super.populateSettings();
     846  0
             Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, autoUpdate);
     847  
     
     848  0
             if (suppressionFile != null && !suppressionFile.isEmpty()) {
     849  0
                 Settings.setString(Settings.KEYS.SUPPRESSION_FILE, suppressionFile);
     850  
             }
     851  
     
     852  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_JAR_ENABLED, jarAnalyzerEnabled);
     853  
     
     854  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED, pyDistributionAnalyzerEnabled);
     855  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_PACKAGE_ENABLED, pyPackageAnalyzerEnabled);
     856  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_RUBY_GEMSPEC_ENABLED, rubygemsAnalyzerEnabled);
     857  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_OPENSSL_ENABLED, opensslAnalyzerEnabled);
     858  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_CMAKE_ENABLED, cmakeAnalyzerEnabled);
     859  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_AUTOCONF_ENABLED, autoconfAnalyzerEnabled);
     860  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_COMPOSER_LOCK_ENABLED, composerAnalyzerEnabled);
     861  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_NODE_PACKAGE_ENABLED, nodeAnalyzerEnabled);
     862  
     
     863  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_NUSPEC_ENABLED, nuspecAnalyzerEnabled);
     864  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, centralAnalyzerEnabled);
     865  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, nexusAnalyzerEnabled);
     866  0
             if (nexusUrl != null && !nexusUrl.isEmpty()) {
     867  0
                 Settings.setString(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl);
     868  
             }
     869  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_PROXY, nexusUsesProxy);
     870  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_ARCHIVE_ENABLED, archiveAnalyzerEnabled);
     871  0
             if (zipExtensions != null && !zipExtensions.isEmpty()) {
     872  0
                 Settings.setString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS, zipExtensions);
     873  
             }
     874  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED, assemblyAnalyzerEnabled);
     875  0
             if (pathToMono != null && !pathToMono.isEmpty()) {
     876  0
                 Settings.setString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH, pathToMono);
     877  
             }
     878  0
         }
     879  
     
     880  
         /**
     881  
          * Checks to see if a vulnerability has been identified with a CVSS score that is above the threshold set in the
     882  
          * configuration.
     883  
          *
     884  
          * @param dependencies the list of dependency objects
     885  
          * @throws BuildException thrown if a CVSS score is found that is higher then the threshold set
     886  
          */
     887  
         private void checkForFailure(List<Dependency> dependencies) throws BuildException {
     888  0
             final StringBuilder ids = new StringBuilder();
     889  0
             for (Dependency d : dependencies) {
     890  0
                 for (Vulnerability v : d.getVulnerabilities()) {
     891  0
                     if (v.getCvssScore() >= failBuildOnCVSS) {
     892  0
                         if (ids.length() == 0) {
     893  0
                             ids.append(v.getName());
     894  
                         } else {
     895  0
                             ids.append(", ").append(v.getName());
     896  
                         }
     897  
                     }
     898  0
                 }
     899  0
             }
     900  0
             if (ids.length() > 0) {
     901  0
                 final String msg = String.format("%n%nDependency-Check Failure:%n"
     902  
                         + "One or more dependencies were identified with vulnerabilities that have a CVSS score greater then '%.1f': %s%n"
     903  
                         + "See the dependency-check report for more details.%n%n", failBuildOnCVSS, ids.toString());
     904  0
                 throw new BuildException(msg);
     905  
             }
     906  0
         }
     907  
     
     908  
         /**
     909  
          * Generates a warning message listing a summary of dependencies and their associated CPE and CVE entries.
     910  
          *
     911  
          * @param dependencies a list of dependency objects
     912  
          */
     913  
         private void showSummary(List<Dependency> dependencies) {
     914  0
             final StringBuilder summary = new StringBuilder();
     915  0
             for (Dependency d : dependencies) {
     916  0
                 boolean firstEntry = true;
     917  0
                 final StringBuilder ids = new StringBuilder();
     918  0
                 for (Vulnerability v : d.getVulnerabilities()) {
     919  0
                     if (firstEntry) {
     920  0
                         firstEntry = false;
     921  
                     } else {
     922  0
                         ids.append(", ");
     923  
                     }
     924  0
                     ids.append(v.getName());
     925  0
                 }
     926  0
                 if (ids.length() > 0) {
     927  0
                     summary.append(d.getFileName()).append(" (");
     928  0
                     firstEntry = true;
     929  0
                     for (Identifier id : d.getIdentifiers()) {
     930  0
                         if (firstEntry) {
     931  0
                             firstEntry = false;
     932  
                         } else {
     933  0
                             summary.append(", ");
     934  
                         }
     935  0
                         summary.append(id.getValue());
     936  0
                     }
     937  0
                     summary.append(") : ").append(ids).append(NEW_LINE);
     938  
                 }
     939  0
             }
     940  0
             if (summary.length() > 0) {
     941  0
                 final String msg = String.format("%n%n"
     942  
                         + "One or more dependencies were identified with known vulnerabilities:%n%n%s"
     943  
                         + "%n%nSee the dependency-check report for more details.%n%n", summary.toString());
     944  0
                 log(msg, Project.MSG_WARN);
     945  
             }
     946  0
         }
     947  
     
     948  
         /**
     949  
          * An enumeration of supported report formats: "ALL", "HTML", "XML", "VULN", etc..
     950  
          */
     951  0
         public static class ReportFormats extends EnumeratedAttribute {
     952  
     
     953  
             /**
     954  
              * Returns the list of values for the report format.
     955  
              *
     956  
              * @return the list of values for the report format
     957  
              */
     958  
             @Override
     959  
             public String[] getValues() {
     960  0
                 int i = 0;
     961  0
                 final Format[] formats = Format.values();
     962  0
                 final String[] values = new String[formats.length];
     963  0
                 for (Format format : formats) {
     964  0
                     values[i++] = format.name();
     965  
                 }
     966  0
                 return values;
     967  
             }
     968  
         }
     969  
     }
    + + + + diff --git a/dependency-check-ant/cobertura/org.owasp.dependencycheck.taskdefs.Purge.html b/dependency-check-ant/cobertura/org.owasp.dependencycheck.taskdefs.Purge.html new file mode 100644 index 000000000..5a3588f8e --- /dev/null +++ b/dependency-check-ant/cobertura/org.owasp.dependencycheck.taskdefs.Purge.html @@ -0,0 +1,240 @@ + + + + +Coverage Report + + + + +
    Coverage Report - org.owasp.dependencycheck.taskdefs.Purge
    +
     
    + + + + +
    Classes in this File Line Coverage Branch Coverage Complexity
    Purge
    0%
    0/38
    0%
    0/8
    2.4
    +
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     1  
     /*
     2  
      * This file is part of dependency-check-ant.
     3  
      *
     4  
      * Licensed under the Apache License, Version 2.0 (the "License");
     5  
      * you may not use this file except in compliance with the License.
     6  
      * You may obtain a copy of the License at
     7  
      *
     8  
      *     http://www.apache.org/licenses/LICENSE-2.0
     9  
      *
     10  
      * Unless required by applicable law or agreed to in writing, software
     11  
      * distributed under the License is distributed on an "AS IS" BASIS,
     12  
      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  
      * See the License for the specific language governing permissions and
     14  
      * limitations under the License.
     15  
      *
     16  
      * Copyright (c) 2015 Jeremy Long. All Rights Reserved.
     17  
      */
     18  
     package org.owasp.dependencycheck.taskdefs;
     19  
     
     20  
     import java.io.File;
     21  
     import java.io.IOException;
     22  
     import java.io.InputStream;
     23  
     import org.apache.tools.ant.BuildException;
     24  
     import org.apache.tools.ant.Project;
     25  
     import org.apache.tools.ant.Task;
     26  
     import org.owasp.dependencycheck.utils.Settings;
     27  
     import org.slf4j.impl.StaticLoggerBinder;
     28  
     
     29  
     /**
     30  
      * An Ant task definition to execute dependency-check during an Ant build.
     31  
      *
     32  
      * @author Jeremy Long
     33  
      */
     34  
     public class Purge extends Task {
     35  
     
     36  
         /**
     37  
          * The properties file location.
     38  
          */
     39  
         private static final String PROPERTIES_FILE = "task.properties";
     40  
     
     41  
         /**
     42  
          * Construct a new DependencyCheckTask.
     43  
          */
     44  
         public Purge() {
     45  0
             super();
     46  
             // Call this before Dependency Check Core starts logging anything - this way, all SLF4J messages from
     47  
             // core end up coming through this tasks logger
     48  0
             StaticLoggerBinder.getSingleton().setTask(this);
     49  0
         }
     50  
     
     51  
         /**
     52  
          * The location of the data directory that contains
     53  
          */
     54  0
         private String dataDirectory = null;
     55  
     
     56  
         /**
     57  
          * Get the value of dataDirectory.
     58  
          *
     59  
          * @return the value of dataDirectory
     60  
          */
     61  
         public String getDataDirectory() {
     62  0
             return dataDirectory;
     63  
         }
     64  
     
     65  
         /**
     66  
          * Set the value of dataDirectory.
     67  
          *
     68  
          * @param dataDirectory new value of dataDirectory
     69  
          */
     70  
         public void setDataDirectory(String dataDirectory) {
     71  0
             this.dataDirectory = dataDirectory;
     72  0
         }
     73  
     
     74  
         @Override
     75  
         public void execute() throws BuildException {
     76  0
             populateSettings();
     77  
             File db;
     78  
             try {
     79  0
                 db = new File(Settings.getDataDirectory(), "dc.h2.db");
     80  0
                 if (db.exists()) {
     81  0
                     if (db.delete()) {
     82  0
                         log("Database file purged; local copy of the NVD has been removed", Project.MSG_INFO);
     83  
                     } else {
     84  0
                         log(String.format("Unable to delete '%s'; please delete the file manually", db.getAbsolutePath()), Project.MSG_ERR);
     85  
                     }
     86  
                 } else {
     87  0
                     log(String.format("Unable to purge database; the database file does not exists: %s", db.getAbsolutePath()), Project.MSG_ERR);
     88  
                 }
     89  0
             } catch (IOException ex) {
     90  0
                 log("Unable to delete the database", Project.MSG_ERR);
     91  
             } finally {
     92  0
                 Settings.cleanup(true);
     93  0
             }
     94  0
         }
     95  
     
     96  
         /**
     97  
          * Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system properties
     98  
          * required to change the proxy server, port, and connection timeout.
     99  
          */
     100  
         protected void populateSettings() {
     101  0
             Settings.initialize();
     102  0
             InputStream taskProperties = null;
     103  
             try {
     104  0
                 taskProperties = this.getClass().getClassLoader().getResourceAsStream(PROPERTIES_FILE);
     105  0
                 Settings.mergeProperties(taskProperties);
     106  0
             } catch (IOException ex) {
     107  0
                 log("Unable to load the dependency-check ant task.properties file.", ex, Project.MSG_WARN);
     108  
             } finally {
     109  0
                 if (taskProperties != null) {
     110  
                     try {
     111  0
                         taskProperties.close();
     112  0
                     } catch (IOException ex) {
     113  0
                         log("", ex, Project.MSG_DEBUG);
     114  0
                     }
     115  
                 }
     116  
             }
     117  0
             if (dataDirectory != null) {
     118  0
                 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDirectory);
     119  
             } else {
     120  0
                 final File jarPath = new File(Purge.class.getProtectionDomain().getCodeSource().getLocation().getPath());
     121  0
                 final File base = jarPath.getParentFile();
     122  0
                 final String sub = Settings.getString(Settings.KEYS.DATA_DIRECTORY);
     123  0
                 final File dataDir = new File(base, sub);
     124  0
                 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath());
     125  
             }
     126  0
         }
     127  
     }
    + + + + diff --git a/dependency-check-ant/cobertura/org.owasp.dependencycheck.taskdefs.Update.html b/dependency-check-ant/cobertura/org.owasp.dependencycheck.taskdefs.Update.html new file mode 100644 index 000000000..ce4e23fcd --- /dev/null +++ b/dependency-check-ant/cobertura/org.owasp.dependencycheck.taskdefs.Update.html @@ -0,0 +1,805 @@ + + + + +Coverage Report + + + + +
    Coverage Report - org.owasp.dependencycheck.taskdefs.Update
    +
     
    + + + + +
    Classes in this File Line Coverage Branch Coverage Complexity
    Update
    0%
    0/85
    0%
    0/58
    2
    +
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     1  
     /*
     2  
      * This file is part of dependency-check-ant.
     3  
      *
     4  
      * Licensed under the Apache License, Version 2.0 (the "License");
     5  
      * you may not use this file except in compliance with the License.
     6  
      * You may obtain a copy of the License at
     7  
      *
     8  
      *     http://www.apache.org/licenses/LICENSE-2.0
     9  
      *
     10  
      * Unless required by applicable law or agreed to in writing, software
     11  
      * distributed under the License is distributed on an "AS IS" BASIS,
     12  
      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  
      * See the License for the specific language governing permissions and
     14  
      * limitations under the License.
     15  
      *
     16  
      * Copyright (c) 2015 Jeremy Long. All Rights Reserved.
     17  
      */
     18  
     package org.owasp.dependencycheck.taskdefs;
     19  
     
     20  
     import org.apache.tools.ant.BuildException;
     21  
     import org.owasp.dependencycheck.Engine;
     22  
     import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
     23  
     import org.owasp.dependencycheck.utils.Settings;
     24  
     import org.slf4j.impl.StaticLoggerBinder;
     25  
     
     26  
     /**
     27  
      * An Ant task definition to execute dependency-check update. This will download the latest data from the National Vulnerability
     28  
      * Database (NVD) and store a copy in the local database.
     29  
      *
     30  
      * @author Jeremy Long
     31  
      */
     32  
     public class Update extends Purge {
     33  
     
     34  
         /**
     35  
          * Construct a new UpdateTask.
     36  
          */
     37  
         public Update() {
     38  0
             super();
     39  
             // Call this before Dependency Check Core starts logging anything - this way, all SLF4J messages from
     40  
             // core end up coming through this tasks logger
     41  0
             StaticLoggerBinder.getSingleton().setTask(this);
     42  0
         }
     43  
     
     44  
         /**
     45  
          * The Proxy Server.
     46  
          */
     47  
         private String proxyServer;
     48  
     
     49  
         /**
     50  
          * Get the value of proxyServer.
     51  
          *
     52  
          * @return the value of proxyServer
     53  
          */
     54  
         public String getProxyServer() {
     55  0
             return proxyServer;
     56  
         }
     57  
     
     58  
         /**
     59  
          * Set the value of proxyServer.
     60  
          *
     61  
          * @param server new value of proxyServer
     62  
          */
     63  
         public void setProxyServer(String server) {
     64  0
             this.proxyServer = server;
     65  0
         }
     66  
     
     67  
         /**
     68  
          * The Proxy Port.
     69  
          */
     70  
         private String proxyPort;
     71  
     
     72  
         /**
     73  
          * Get the value of proxyPort.
     74  
          *
     75  
          * @return the value of proxyPort
     76  
          */
     77  
         public String getProxyPort() {
     78  0
             return proxyPort;
     79  
         }
     80  
     
     81  
         /**
     82  
          * Set the value of proxyPort.
     83  
          *
     84  
          * @param proxyPort new value of proxyPort
     85  
          */
     86  
         public void setProxyPort(String proxyPort) {
     87  0
             this.proxyPort = proxyPort;
     88  0
         }
     89  
         /**
     90  
          * The Proxy username.
     91  
          */
     92  
         private String proxyUsername;
     93  
     
     94  
         /**
     95  
          * Get the value of proxyUsername.
     96  
          *
     97  
          * @return the value of proxyUsername
     98  
          */
     99  
         public String getProxyUsername() {
     100  0
             return proxyUsername;
     101  
         }
     102  
     
     103  
         /**
     104  
          * Set the value of proxyUsername.
     105  
          *
     106  
          * @param proxyUsername new value of proxyUsername
     107  
          */
     108  
         public void setProxyUsername(String proxyUsername) {
     109  0
             this.proxyUsername = proxyUsername;
     110  0
         }
     111  
         /**
     112  
          * The Proxy password.
     113  
          */
     114  
         private String proxyPassword;
     115  
     
     116  
         /**
     117  
          * Get the value of proxyPassword.
     118  
          *
     119  
          * @return the value of proxyPassword
     120  
          */
     121  
         public String getProxyPassword() {
     122  0
             return proxyPassword;
     123  
         }
     124  
     
     125  
         /**
     126  
          * Set the value of proxyPassword.
     127  
          *
     128  
          * @param proxyPassword new value of proxyPassword
     129  
          */
     130  
         public void setProxyPassword(String proxyPassword) {
     131  0
             this.proxyPassword = proxyPassword;
     132  0
         }
     133  
         /**
     134  
          * The Connection Timeout.
     135  
          */
     136  
         private String connectionTimeout;
     137  
     
     138  
         /**
     139  
          * Get the value of connectionTimeout.
     140  
          *
     141  
          * @return the value of connectionTimeout
     142  
          */
     143  
         public String getConnectionTimeout() {
     144  0
             return connectionTimeout;
     145  
         }
     146  
     
     147  
         /**
     148  
          * Set the value of connectionTimeout.
     149  
          *
     150  
          * @param connectionTimeout new value of connectionTimeout
     151  
          */
     152  
         public void setConnectionTimeout(String connectionTimeout) {
     153  0
             this.connectionTimeout = connectionTimeout;
     154  0
         }
     155  
         /**
     156  
          * The database driver name; such as org.h2.Driver.
     157  
          */
     158  
         private String databaseDriverName;
     159  
     
     160  
         /**
     161  
          * Get the value of databaseDriverName.
     162  
          *
     163  
          * @return the value of databaseDriverName
     164  
          */
     165  
         public String getDatabaseDriverName() {
     166  0
             return databaseDriverName;
     167  
         }
     168  
     
     169  
         /**
     170  
          * Set the value of databaseDriverName.
     171  
          *
     172  
          * @param databaseDriverName new value of databaseDriverName
     173  
          */
     174  
         public void setDatabaseDriverName(String databaseDriverName) {
     175  0
             this.databaseDriverName = databaseDriverName;
     176  0
         }
     177  
     
     178  
         /**
     179  
          * The path to the database driver JAR file if it is not on the class path.
     180  
          */
     181  
         private String databaseDriverPath;
     182  
     
     183  
         /**
     184  
          * Get the value of databaseDriverPath.
     185  
          *
     186  
          * @return the value of databaseDriverPath
     187  
          */
     188  
         public String getDatabaseDriverPath() {
     189  0
             return databaseDriverPath;
     190  
         }
     191  
     
     192  
         /**
     193  
          * Set the value of databaseDriverPath.
     194  
          *
     195  
          * @param databaseDriverPath new value of databaseDriverPath
     196  
          */
     197  
         public void setDatabaseDriverPath(String databaseDriverPath) {
     198  0
             this.databaseDriverPath = databaseDriverPath;
     199  0
         }
     200  
         /**
     201  
          * The database connection string.
     202  
          */
     203  
         private String connectionString;
     204  
     
     205  
         /**
     206  
          * Get the value of connectionString.
     207  
          *
     208  
          * @return the value of connectionString
     209  
          */
     210  
         public String getConnectionString() {
     211  0
             return connectionString;
     212  
         }
     213  
     
     214  
         /**
     215  
          * Set the value of connectionString.
     216  
          *
     217  
          * @param connectionString new value of connectionString
     218  
          */
     219  
         public void setConnectionString(String connectionString) {
     220  0
             this.connectionString = connectionString;
     221  0
         }
     222  
         /**
     223  
          * The user name for connecting to the database.
     224  
          */
     225  
         private String databaseUser;
     226  
     
     227  
         /**
     228  
          * Get the value of databaseUser.
     229  
          *
     230  
          * @return the value of databaseUser
     231  
          */
     232  
         public String getDatabaseUser() {
     233  0
             return databaseUser;
     234  
         }
     235  
     
     236  
         /**
     237  
          * Set the value of databaseUser.
     238  
          *
     239  
          * @param databaseUser new value of databaseUser
     240  
          */
     241  
         public void setDatabaseUser(String databaseUser) {
     242  0
             this.databaseUser = databaseUser;
     243  0
         }
     244  
     
     245  
         /**
     246  
          * The password to use when connecting to the database.
     247  
          */
     248  
         private String databasePassword;
     249  
     
     250  
         /**
     251  
          * Get the value of databasePassword.
     252  
          *
     253  
          * @return the value of databasePassword
     254  
          */
     255  
         public String getDatabasePassword() {
     256  0
             return databasePassword;
     257  
         }
     258  
     
     259  
         /**
     260  
          * Set the value of databasePassword.
     261  
          *
     262  
          * @param databasePassword new value of databasePassword
     263  
          */
     264  
         public void setDatabasePassword(String databasePassword) {
     265  0
             this.databasePassword = databasePassword;
     266  0
         }
     267  
     
     268  
         /**
     269  
          * The url for the modified NVD CVE (1.2 schema).
     270  
          */
     271  
         private String cveUrl12Modified;
     272  
     
     273  
         /**
     274  
          * Get the value of cveUrl12Modified.
     275  
          *
     276  
          * @return the value of cveUrl12Modified
     277  
          */
     278  
         public String getCveUrl12Modified() {
     279  0
             return cveUrl12Modified;
     280  
         }
     281  
     
     282  
         /**
     283  
          * Set the value of cveUrl12Modified.
     284  
          *
     285  
          * @param cveUrl12Modified new value of cveUrl12Modified
     286  
          */
     287  
         public void setCveUrl12Modified(String cveUrl12Modified) {
     288  0
             this.cveUrl12Modified = cveUrl12Modified;
     289  0
         }
     290  
     
     291  
         /**
     292  
          * The url for the modified NVD CVE (2.0 schema).
     293  
          */
     294  
         private String cveUrl20Modified;
     295  
     
     296  
         /**
     297  
          * Get the value of cveUrl20Modified.
     298  
          *
     299  
          * @return the value of cveUrl20Modified
     300  
          */
     301  
         public String getCveUrl20Modified() {
     302  0
             return cveUrl20Modified;
     303  
         }
     304  
     
     305  
         /**
     306  
          * Set the value of cveUrl20Modified.
     307  
          *
     308  
          * @param cveUrl20Modified new value of cveUrl20Modified
     309  
          */
     310  
         public void setCveUrl20Modified(String cveUrl20Modified) {
     311  0
             this.cveUrl20Modified = cveUrl20Modified;
     312  0
         }
     313  
     
     314  
         /**
     315  
          * Base Data Mirror URL for CVE 1.2.
     316  
          */
     317  
         private String cveUrl12Base;
     318  
     
     319  
         /**
     320  
          * Get the value of cveUrl12Base.
     321  
          *
     322  
          * @return the value of cveUrl12Base
     323  
          */
     324  
         public String getCveUrl12Base() {
     325  0
             return cveUrl12Base;
     326  
         }
     327  
     
     328  
         /**
     329  
          * Set the value of cveUrl12Base.
     330  
          *
     331  
          * @param cveUrl12Base new value of cveUrl12Base
     332  
          */
     333  
         public void setCveUrl12Base(String cveUrl12Base) {
     334  0
             this.cveUrl12Base = cveUrl12Base;
     335  0
         }
     336  
     
     337  
         /**
     338  
          * Data Mirror URL for CVE 2.0.
     339  
          */
     340  
         private String cveUrl20Base;
     341  
     
     342  
         /**
     343  
          * Get the value of cveUrl20Base.
     344  
          *
     345  
          * @return the value of cveUrl20Base
     346  
          */
     347  
         public String getCveUrl20Base() {
     348  0
             return cveUrl20Base;
     349  
         }
     350  
     
     351  
         /**
     352  
          * Set the value of cveUrl20Base.
     353  
          *
     354  
          * @param cveUrl20Base new value of cveUrl20Base
     355  
          */
     356  
         public void setCveUrl20Base(String cveUrl20Base) {
     357  0
             this.cveUrl20Base = cveUrl20Base;
     358  0
         }
     359  
     
     360  
         /**
     361  
          * Executes the update by initializing the settings, downloads the NVD XML data, and then processes the data storing it in the
     362  
          * local database.
     363  
          *
     364  
          * @throws BuildException thrown if a connection to the local database cannot be made.
     365  
          */
     366  
         @Override
     367  
         public void execute() throws BuildException {
     368  0
             populateSettings();
     369  0
             Engine engine = null;
     370  
             try {
     371  0
                 engine = new Engine(Update.class.getClassLoader());
     372  0
                 engine.doUpdates();
     373  0
             } catch (DatabaseException ex) {
     374  0
                 throw new BuildException("Unable to connect to the dependency-check database; unable to update the NVD data", ex);
     375  
             } finally {
     376  0
                 Settings.cleanup(true);
     377  0
                 if (engine != null) {
     378  0
                     engine.cleanup();
     379  
                 }
     380  
             }
     381  0
         }
     382  
     
     383  
         /**
     384  
          * Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system properties
     385  
          * required to change the proxy server, port, and connection timeout.
     386  
          */
     387  
         @Override
     388  
         protected void populateSettings() {
     389  0
             super.populateSettings();
     390  0
             if (proxyServer != null && !proxyServer.isEmpty()) {
     391  0
                 Settings.setString(Settings.KEYS.PROXY_SERVER, proxyServer);
     392  
             }
     393  0
             if (proxyPort != null && !proxyPort.isEmpty()) {
     394  0
                 Settings.setString(Settings.KEYS.PROXY_PORT, proxyPort);
     395  
             }
     396  0
             if (proxyUsername != null && !proxyUsername.isEmpty()) {
     397  0
                 Settings.setString(Settings.KEYS.PROXY_USERNAME, proxyUsername);
     398  
             }
     399  0
             if (proxyPassword != null && !proxyPassword.isEmpty()) {
     400  0
                 Settings.setString(Settings.KEYS.PROXY_PASSWORD, proxyPassword);
     401  
             }
     402  0
             if (connectionTimeout != null && !connectionTimeout.isEmpty()) {
     403  0
                 Settings.setString(Settings.KEYS.CONNECTION_TIMEOUT, connectionTimeout);
     404  
             }
     405  0
             if (databaseDriverName != null && !databaseDriverName.isEmpty()) {
     406  0
                 Settings.setString(Settings.KEYS.DB_DRIVER_NAME, databaseDriverName);
     407  
             }
     408  0
             if (databaseDriverPath != null && !databaseDriverPath.isEmpty()) {
     409  0
                 Settings.setString(Settings.KEYS.DB_DRIVER_PATH, databaseDriverPath);
     410  
             }
     411  0
             if (connectionString != null && !connectionString.isEmpty()) {
     412  0
                 Settings.setString(Settings.KEYS.DB_CONNECTION_STRING, connectionString);
     413  
             }
     414  0
             if (databaseUser != null && !databaseUser.isEmpty()) {
     415  0
                 Settings.setString(Settings.KEYS.DB_USER, databaseUser);
     416  
             }
     417  0
             if (databasePassword != null && !databasePassword.isEmpty()) {
     418  0
                 Settings.setString(Settings.KEYS.DB_PASSWORD, databasePassword);
     419  
             }
     420  0
             if (cveUrl12Modified != null && !cveUrl12Modified.isEmpty()) {
     421  0
                 Settings.setString(Settings.KEYS.CVE_MODIFIED_12_URL, cveUrl12Modified);
     422  
             }
     423  0
             if (cveUrl20Modified != null && !cveUrl20Modified.isEmpty()) {
     424  0
                 Settings.setString(Settings.KEYS.CVE_MODIFIED_20_URL, cveUrl20Modified);
     425  
             }
     426  0
             if (cveUrl12Base != null && !cveUrl12Base.isEmpty()) {
     427  0
                 Settings.setString(Settings.KEYS.CVE_SCHEMA_1_2, cveUrl12Base);
     428  
             }
     429  0
             if (cveUrl20Base != null && !cveUrl20Base.isEmpty()) {
     430  0
                 Settings.setString(Settings.KEYS.CVE_SCHEMA_2_0, cveUrl20Base);
     431  
             }
     432  0
         }
     433  
     }
    + + + + diff --git a/dependency-check-ant/cobertura/org.slf4j.impl.StaticLoggerBinder.html b/dependency-check-ant/cobertura/org.slf4j.impl.StaticLoggerBinder.html index c21eeb59b..8045caaa8 100644 --- a/dependency-check-ant/cobertura/org.slf4j.impl.StaticLoggerBinder.html +++ b/dependency-check-ant/cobertura/org.slf4j.impl.StaticLoggerBinder.html @@ -12,7 +12,7 @@
     
    - +
    Classes in this File Line Coverage Branch Coverage Complexity
    StaticLoggerBinder
    92%
    12/13
    N/A
    1
    StaticLoggerBinder
    0%
    0/13
    N/A
    1
     
    @@ -89,7 +89,7 @@
          *
     36  
          */
    -  37  8
         private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder();
    +  37  0
         private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder();
     38  
     
     39   @@ -104,7 +104,7 @@
          */
     44  
         public static final StaticLoggerBinder getSingleton() {
    -  45  328
             return SINGLETON;
    +  45  0
             return SINGLETON;
     46  
         }
     47   @@ -115,7 +115,7 @@
          * Ant tasks have the log method we actually want to call. So we hang onto the task as a delegate
     50  
          */
    -  51  8
         private Task task = null;
    +  51  0
         private Task task = null;
     52  
     
     53   @@ -130,9 +130,9 @@
          */
     58  
         public void setTask(Task task) {
    -  59  32
             this.task = task;
    -  60  32
             loggerFactory = new AntLoggerFactory(task);
    -  61  32
         }
    +  59  0
             this.task = task;
    +  60  0
             loggerFactory = new AntLoggerFactory(task);
    +  61  0
         }
     62  
     
     63   @@ -145,10 +145,10 @@
          */
     67  
         // to avoid constant folding by the compiler, this field must *not* be final
    -  68  8
         public static String REQUESTED_API_VERSION = "1.7.12"; // final
    +  68  0
         public static String REQUESTED_API_VERSION = "1.7.12"; // final
     69  
     
    -  70  8
         private static final String LOGGER_FACTORY_CLASS = AntLoggerFactory.class.getName();
    +  70  0
         private static final String LOGGER_FACTORY_CLASS = AntLoggerFactory.class.getName();
     71  
     
     72   @@ -167,9 +167,9 @@
          * Constructs a new static logger binder.
     79  
          */
    -  80  8
         private StaticLoggerBinder() {
    -  81  8
             loggerFactory = new AntLoggerFactory(task);
    -  82  8
         }
    +  80  0
         private StaticLoggerBinder() {
    +  81  0
             loggerFactory = new AntLoggerFactory(task);
    +  82  0
         }
     83  
     
     84   @@ -186,7 +186,7 @@
         @Override
     90  
         public ILoggerFactory getLoggerFactory() {
    -  91  288
             return loggerFactory;
    +  91  0
             return loggerFactory;
     92  
         }
     93   @@ -212,6 +212,6 @@
     }
    - + diff --git a/dependency-check-ant/config-purge.html b/dependency-check-ant/config-purge.html new file mode 100644 index 000000000..51c63adac --- /dev/null +++ b/dependency-check-ant/config-purge.html @@ -0,0 +1,213 @@ + + + + + + + + + dependency-check-ant – Configuration + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +

    Configuration

    +

    The dependency-check-purge task deletes the local copy of the NVD. This task should rarely be used, if ever. This is included as a convenience method in the rare circumstance that the local H2 database because corrupt.

    + +
    +
    <target name="dependency-check-purge" description="Dependency-Check purge">
    +    <dependency-check-purge />
    +</target>
    +
    +
    +

    Configuration: dependency-check-purge Task

    +

    The following properties can be set on the dependency-check-purge task.

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Property Description Default Value
    dataDirectory Data directory that is used to store the local copy of the NVD data
    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-ant/config-update.html b/dependency-check-ant/config-update.html new file mode 100644 index 000000000..dd13f2ba4 --- /dev/null +++ b/dependency-check-ant/config-update.html @@ -0,0 +1,357 @@ + + + + + + + + + dependency-check-ant – Configuration + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +

    Configuration

    +

    The dependency-check-update task downloads and updates the local copy of the NVD. There are several reasons that one may want to use this task; primarily, creating an update that will be run only once a day or once every few days (but not greater then 7 days) and then use the autoUpdate="false" setting on individual dependency-check scans. See Internet Access Required for more information on why this task would be used.

    + +
    +
    <target name="dependency-check-update" description="Dependency-Check Update">
    +    <dependency-check-update />
    +</target>
    +
    +
    +

    Configuration: dependency-check-update Task

    +

    The following properties can be set on the dependency-check task.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Property Description Default Value
    proxyServer The Proxy Server.  
    proxyPort The Proxy Port.  
    proxyUsername Defines the proxy user name.  
    proxyPassword Defines the proxy password.  
    connectionTimeout The URL Connection Timeout.  
    +

    Advanced Configuration

    +

    The following properties can be configured in the plugin. However, they are less frequently changed. One exception may be the cvedUrl properties, which can be used to host a mirror of the NVD within an enterprise environment.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Property Description Default Value
    cveUrl12Modified URL for the modified CVE 1.2. http://nvd.nist.gov/download/nvdcve-modified.xml
    cveUrl20Modified URL for the modified CVE 2.0. http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-modified.xml
    cveUrl12Base Base URL for each year’s CVE 1.2, the %d will be replaced with the year. http://nvd.nist.gov/download/nvdcve-%d.xml
    cveUrl20Base Base URL for each year’s CVE 2.0, the %d will be replaced with the year. http://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-%d.xml
    dataDirectory Data directory that is used to store the local copy of the NVD. This should generally not be changed. data
    databaseDriverName The name of the database driver. Example: org.h2.Driver.  
    databaseDriverPath The path to the database driver JAR file; only used if the driver is not in the class path.  
    connectionString The connection string used to connect to the database.  
    databaseUser The username used when connecting to the database.  
    databasePassword The password used when connecting to the database.  
    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-ant/configuration.html b/dependency-check-ant/configuration.html index a3683a940..f28ff5a1f 100644 --- a/dependency-check-ant/configuration.html +++ b/dependency-check-ant/configuration.html @@ -1,21 +1,21 @@ - + - dependency-check-ant - Configuration - + dependency-check-ant – Configuration + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +

    Configuration

    +

    Once dependency-check-ant has been installed the defined tasks can be used.

    + +
      + +
    • dependency-check - the primary task used to check the project dependencies. Configuration options are below.
    • + +
    • dependency-check-purge - deletes the local copy of the NVD; this should rarely be used (if ever). See the purge configuration for more information.
    • + +
    • dependency-check-update - downloads and updates the local copy of the NVD. See the update configuration for more information.
    • +

    To configure the dependency-check task you can add it to a target and include a file based resource collection such as a FileSet, DirSet, or FileList that includes the project’s dependencies.

    -
    <target name="dependency-check" description="Dependency-Check Analysis">
    -    <dependency-check applicationname="Hello World"
    +
    <target name="dependency-check" description="Dependency-Check Analysis">
    +    <dependency-check projectname="Hello World"
                           reportoutputdirectory="${basedir}"
                           reportformat="ALL">
     
    @@ -173,9 +176,10 @@
             </fileset>
         </dependency-check>
     </target>
    -
    -

    Configuration

    -

    The following properties can be set on the dependency-check-maven plugin.

    +
    +
    +

    Configuration: dependency-check Task

    +

    The following properties can be set on the dependency-check-update task.

    @@ -202,24 +206,15 @@ - + - + - + - - - - - - - - - @@ -227,7 +222,7 @@ - + @@ -236,7 +231,7 @@ - + @@ -245,7 +240,7 @@ - + @@ -254,7 +249,7 @@ - + @@ -263,7 +258,7 @@ - + @@ -272,7 +267,7 @@ - + @@ -281,7 +276,7 @@ - + @@ -290,7 +285,7 @@ - + @@ -382,6 +377,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -465,9 +532,9 @@ - + - + @@ -515,7 +582,7 @@ -
    updateOnly projectName If set to true only the update phase of dependency-check will be executed; no scan will be executed and no report will be generated. The name of the project being scanned. falseDependency-Check
    externalReport When using as a Site plugin this parameter sets whether or not the external report format should be used. false
    reportOutputDirectory The location to write the report(s). Note, this is not used if generating the report as part of a mvn site build ‘target’
    failBuildOnCVSS 11
    reportFormat HTML
    suppressionFile  
    proxyServer  
    proxyPort  
    proxyUsername  
    proxyPassword  
    connectionTimeout
    pyDistributionAnalyzerEnabled Sets whether the Python Distribution Analyzer will be used. true
    pyPackageAnalyzerEnabled Sets whether the Python Package Analyzer will be used. true
    rubygemsAnalyzerEnabled Sets whether the Ruby Gemspec Analyzer will be used. true
    opensslAnalyzerEnabled Sets whether or not the openssl Analyzer should be used. true
    cmakeAnalyzerEnabled Sets whether or not the CMake Analyzer should be used. true
    autoconfAnalyzerEnabled Sets whether or not the autoconf Analyzer should be used. true
    composerAnalyzerEnabled Sets whether or not the PHP Composer Lock File Analyzer should be used. true
    nodeAnalyzerEnabled Sets whether or not the Node.js Analyzer should be used. true
    nuspecAnalyzerEnabled Sets whether or not the .NET Nuget Nuspec Analyzer will be used. dataDirectory Data directory to hold SQL CVEs contents. This should generally not be changed. Data directory that is used to store the local copy of the NVD. This should generally not be changed.  data
     
    +
    @@ -525,15 +592,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-ant/css/apache-maven-fluido-1.4.min.css b/dependency-check-ant/css/apache-maven-fluido-1.4.min.css new file mode 100644 index 000000000..54a006744 --- /dev/null +++ b/dependency-check-ant/css/apache-maven-fluido-1.4.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eeeeee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #dddddd #eee #eeeeee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eeeeee #eee #dddddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}.clear{clear:both;visibility:hidden}.clear hr{display:none}.section p,.section p,.section dt,.section dt{margin-right:7px;margin-left:7px}#ohloh{margin-bottom:10px}#poweredBy{text-align:center}a.externalLink{padding-right:18px}a.newWindow{background:url('../images/window-new.png') right center no-repeat;padding-right:18px}a.externalLink[href^=http]{background:url('../images/internet-web-browser.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".asc"]{background:url('../images/accessories-text-editor.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".jpg"],a.externalLink[href$=".jpeg"],a.externalLink[href$=".gif"],a.externalLink[href$=".png"]{background:url('../images/image-x-generic.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".tar.gz"],a.externalLink[href$=".zip"]{background:url('../images/package-x-generic.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".md5"],a.externalLink[href$=".sha1"]{background:url('../images/document-properties.png') right center no-repeat;padding-right:18px}a.externalLink[href^=https]{background:url('../images/application-certificate.png') right center no-repeat;padding-right:18px}a.externalLink[href^=file]{background:url('../images/drive-harddisk.png') right center no-repeat;padding-right:18px}a.externalLink[href^=ftp]{background:url('../images/network-server.png') right center no-repeat;padding-right:18px}a.externalLink[href^=mailto]{background:url('../images/contact-new.png') right center no-repeat;padding-right:18px}li.none{list-style:none}.search-query{background-image:url(http://www.google.com/cse/intl/en/images/google_custom_search_watermark.gif);background-attachment:initial;background-origin:initial;background-clip:initial;background-color:#fff;background-position:0 50%;background-repeat:no-repeat no-repeat;width:95%}body.topBarEnabled{padding-top:60px}body.topBarDisabled{padding-top:20px}.builtBy{display:block}img.builtBy{margin:10px auto}#search-form{margin-left:9px;margin-right:9px}.hero-unit h2{font-size:60px}tt{padding:0 3px 2px;font-family:Monaco,Andale Mono,Courier New,monospace;font-size:.9em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#fee9cc;color:rgba(0,0,0,0.75);padding:1px 3px}li{color:#404040}table.zebra-striped{background-color:#FFF}.footer{background-color:#EEE}.sidebar-nav{padding-left:0;padding-right:0}.sidebar-nav .icon-chevron-right,.sidebar-nav .icon-chevron-down{margin-top:2px;margin-right:-6px;float:right;opacity:.25}li.pull-right{margin-left:3px;margin-right:3px}.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0;padding-left:15px}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/dependency-check-ant/dependency-analysis.html b/dependency-check-ant/dependency-analysis.html new file mode 100644 index 000000000..8bc85eab8 --- /dev/null +++ b/dependency-check-ant/dependency-analysis.html @@ -0,0 +1,361 @@ + + + + + + + + + dependency-check-ant – Dependencies Report + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +
    +

    Dependency Analysis

    +
    +

    Used and declared dependencies

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GroupIdArtifactIdVersionScopeClassifierTypeOptional
    org.owaspdependency-check-core1.3.1compilejarfalse
    org.owaspdependency-check-utils1.3.1compilejarfalse
    org.owaspdependency-check-core1.3.1testteststest-jarfalse
    org.apache.antant1.9.6providedjarfalse
    org.apache.antant-testutil1.9.6testjarfalse
    junitjunit4.12testjarfalse

    +
    +

    Used but undeclared dependencies

    + + + + + + + + + + + + + + + + +
    GroupIdArtifactIdVersionScopeClassifierTypeOptional
    org.slf4jslf4j-api1.7.12compilejarfalse

    +
    +

    Unused but declared dependencies

    + + + + + + + + + + + + + + + + + + + + + + + + +
    GroupIdArtifactIdVersionScopeClassifierTypeOptional
    org.hamcresthamcrest-core1.3testjarfalse
    com.google.code.findbugsannotations3.0.0providedjarfalse

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-ant/dependency-updates-report.html b/dependency-check-ant/dependency-updates-report.html index 69332f730..f5bacd786 100644 --- a/dependency-check-ant/dependency-updates-report.html +++ b/dependency-check-ant/dependency-updates-report.html @@ -1,21 +1,21 @@ - + - dependency-check-ant - Dependency Updates Report - + dependency-check-ant – Dependency Updates Report + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Overview

    +

    Overview

    This report summarizes newer versions that may be available for your project's various dependencies.

    - + @@ -260,17 +246,17 @@ - + - +
    # of dependencies using the latest version available22
    27
    # of dependencies where the next version available is smaller than an incremental version update
    # of dependencies where the next version available is an incremental version update5
    0
    # of dependencies where the next version available is a minor version update6
    5
    # of dependencies where the next version available is a major version update 0
    -

    Dependency Management

    +

    Dependency Management

    @@ -333,28 +319,28 @@ - + - + - + - + - + - + @@ -370,18 +356,6 @@ - - - - - - - - - - - - @@ -392,35 +366,47 @@ - - + + - + - + + + + + + + + + + + + + - - - - + + + + - + - - + + @@ -574,6 +560,18 @@ + + + + + + + + + + + + @@ -584,31 +582,31 @@ - - + + - + - - + + - - + + - + - - + + - + @@ -620,33 +618,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -656,7 +630,7 @@ - + @@ -669,9 +643,9 @@
    Status1.4.177
    com.sun.mail mailapi1.5.21.5.4 jar 1.5.3
    commons-cli commons-cli1.21.3.1 jar 1.3
    commons-langcommons-lang2.6jar
    junit junit 4.12
    org.apache.ant ant1.9.51.9.6 jar 1.9.6
    org.apache.antant-testutil1.9.6jar
    org.apache.antant-testutil1.9.5org.apache.commonscommons-compress1.10 jar 1.9.6
    org.apache.commonscommons-compress1.9commons-lang33.4 jar
    org.glassfishjavax.json1.0.4jar
    org.hamcrest hamcrest-core 1.3
    org.jmockit jmockit1.161.19 test jar 1.17-beta11.17
    org.jsoup jsoup1.7.21.8.3 jar 1.7.31.8.1
    org.slf4j slf4j-api
    org.slf4jslf4j-ext1.7.12jar
    org.slf4jslf4j-jdk141.7.12jar
    org.slf4j slf4j-simple 1.7.12
    Status Group Id Artifact IdNext Minor Next Major
    -

    Dependencies

    +

    Dependencies

    - + @@ -683,11 +657,23 @@ - + - + + + + + + + + + + + + + @@ -696,18 +682,6 @@ - - - - - - - - - - - - @@ -720,34 +694,34 @@
    Status Group Id Artifact IdNext Incremental Next Minor Next Major
    org.owasp dependency-check-core1.3.01.3.1compilejar
    org.owaspdependency-check-utils1.3.1 compile jar
    org.owaspdependency-check-utils1.3.0compilejar
    Status Group Id Artifact IdNext Minor Next Major
    -

    Dependency Updates

    +

    Dependency Updates

    -

    ch.qos.logback:logback-classic

    +

    ch.qos.logback:logback-classic

    - + - + - + - + - + - + - +
    Status  No newer versions available.
    Group Id ch.qos.logback
    Artifact Id logback-classic
    Current Version 1.1.3
    Scope
    Classifier
    Type jar
    -

    ch.qos.logback:logback-core

    +

    ch.qos.logback:logback-core

    @@ -771,7 +745,7 @@
    StatusType jar
    -

    com.google.code.findbugs:annotations

    +

    com.google.code.findbugs:annotations

    @@ -795,7 +769,7 @@
    StatusType jar
    -

    com.h2database:h2

    +

    com.h2database:h2

    @@ -820,13 +794,13 @@ -
    Statusjar
    Newer versions1.4.177 Next Minor
    1.4.178
    1.4.179
    1.4.180
    1.4.181
    1.4.182
    1.4.183
    1.4.184
    1.4.185
    1.4.186
    1.4.187 Latest Minor
    +1.4.177 Next Minor
    1.4.178
    1.4.179
    1.4.180
    1.4.181
    1.4.182
    1.4.183
    1.4.184
    1.4.185
    1.4.186
    1.4.187
    1.4.188
    1.4.189 Latest Minor
    -

    com.sun.mail:mailapi

    +

    com.sun.mail:mailapi

    - + @@ -835,7 +809,7 @@ - + @@ -844,16 +818,13 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id com.sun.mail
    mailapi
    Current Version1.5.2
    1.5.4
    Scope
    Typejar
    Newer versions1.5.3 Next Incremental
    1.5.4 Latest Incremental
    +jar
    -

    commons-cli:commons-cli

    +

    commons-cli:commons-cli

    - + @@ -862,7 +833,7 @@ - + @@ -871,12 +842,9 @@ - - - -
    Status There is at least one newer minor version available. Minor updates are sometimes passive.
     No newer versions available.
    Group Id commons-cli
    commons-cli
    Current Version1.2
    1.3.1
    Scope
    Typejar
    Newer versions1.3 Next Minor
    1.3.1 Latest Minor
    +jar
    -

    commons-io:commons-io

    +

    commons-io:commons-io

    @@ -900,31 +868,7 @@
    StatusType jar
    -

    commons-lang:commons-lang

    - - - - - - - - - - - - - - - - - - - - - -
    Status No newer versions available.
    Group Idcommons-lang
    Artifact Idcommons-lang
    Current Version2.6
    Scope
    Classifier
    Typejar
    -
    -

    junit:junit

    +

    junit:junit

    @@ -948,11 +892,11 @@
    StatusType jar
    -

    org.apache.ant:ant

    +

    org.apache.ant:ant

    - + @@ -961,7 +905,7 @@ - + @@ -970,16 +914,13 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.apache.ant
    ant
    Current Version1.9.5
    1.9.6
    Scope
    Typejar
    Newer versions1.9.6 Next Incremental
    +jar
    -

    org.apache.ant:ant-testutil

    +

    org.apache.ant:ant-testutil

    - + @@ -988,7 +929,7 @@ - + @@ -997,12 +938,9 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.apache.ant
    ant-testutil
    Current Version1.9.5
    1.9.6
    Scope
    Typejar
    Newer versions1.9.6 Next Incremental
    +jar
    -

    org.apache.commons:commons-compress

    +

    org.apache.commons:commons-compress

    @@ -1015,7 +953,7 @@ - + @@ -1026,7 +964,31 @@
    Statuscommons-compress
    Current Version1.9
    1.10
    Scope
    Type jar
    -

    org.apache.lucene:lucene-analyzers-common

    +

    org.apache.commons:commons-lang3

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.commons
    Artifact Idcommons-lang3
    Current Version3.4
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.lucene:lucene-analyzers-common

    @@ -1051,9 +1013,9 @@ -
    Statusjar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1 Latest Major
    +4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    -

    org.apache.lucene:lucene-core

    +

    org.apache.lucene:lucene-core

    @@ -1078,9 +1040,9 @@ -
    Statusjar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1 Latest Major
    +4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    -

    org.apache.lucene:lucene-queryparser

    +

    org.apache.lucene:lucene-queryparser

    @@ -1105,9 +1067,9 @@ -
    Statusjar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1 Latest Major
    +4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    -

    org.apache.lucene:lucene-test-framework

    +

    org.apache.lucene:lucene-test-framework

    @@ -1132,9 +1094,9 @@ -
    Statusjar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1 Latest Major
    +4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    -

    org.apache.maven:maven-core

    +

    org.apache.maven:maven-core

    @@ -1158,7 +1120,7 @@
    StatusType jar
    -

    org.apache.maven:maven-plugin-api

    +

    org.apache.maven:maven-plugin-api

    @@ -1182,7 +1144,7 @@
    StatusType jar
    -

    org.apache.maven:maven-settings

    +

    org.apache.maven:maven-settings

    @@ -1206,7 +1168,7 @@
    StatusType jar
    -

    org.apache.maven.plugin-testing:maven-plugin-testing-harness

    +

    org.apache.maven.plugin-testing:maven-plugin-testing-harness

    @@ -1230,7 +1192,7 @@
    StatusType jar
    -

    org.apache.maven.plugin-tools:maven-plugin-annotations

    +

    org.apache.maven.plugin-tools:maven-plugin-annotations

    @@ -1254,7 +1216,7 @@
    StatusType jar
    -

    org.apache.maven.plugins:maven-site-plugin

    +

    org.apache.maven.plugins:maven-site-plugin

    @@ -1278,7 +1240,7 @@
    StatusType jar
    -

    org.apache.maven.reporting:maven-reporting-api

    +

    org.apache.maven.reporting:maven-reporting-api

    @@ -1302,7 +1264,7 @@
    StatusType jar
    -

    org.apache.velocity:velocity

    +

    org.apache.velocity:velocity

    @@ -1326,7 +1288,31 @@
    StatusType jar
    -

    org.hamcrest:hamcrest-core

    +

    org.glassfish:javax.json

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.glassfish
    Artifact Idjavax.json
    Current Version1.0.4
    Scope
    Classifier
    Typejar
    +
    +

    org.hamcrest:hamcrest-core

    @@ -1350,11 +1336,11 @@
    StatusType jar
    -

    org.jmockit:jmockit

    +

    org.jmockit:jmockit

    - + @@ -1363,7 +1349,7 @@ - + @@ -1372,16 +1358,13 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.jmockit
    jmockit
    Current Version1.16
    1.19
    Scope test
    Typejar
    Newer versions1.17-beta1 Next Incremental
    1.17-beta2 Latest Incremental
    1.17 Next Minor
    +jar
    -

    org.jsoup:jsoup

    +

    org.jsoup:jsoup

    - + @@ -1390,7 +1373,7 @@ - + @@ -1399,12 +1382,9 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.jsoup
    jsoup
    Current Version1.7.2
    1.8.3
    Scope
    Typejar
    Newer versions1.7.3 Next Incremental
    1.8.1 Next Minor
    1.8.2 Latest Minor
    +jar
    -

    org.owasp:dependency-check-core

    +

    org.owasp:dependency-check-core

    @@ -1417,7 +1397,7 @@ - + @@ -1428,7 +1408,7 @@
    Statusdependency-check-core
    Current Version1.3.0
    1.3.1
    Scope compile
    Type jar
    -

    org.owasp:dependency-check-utils

    +

    org.owasp:dependency-check-utils

    @@ -1441,7 +1421,7 @@ - + @@ -1452,7 +1432,7 @@
    Statusdependency-check-utils
    Current Version1.3.0
    1.3.1
    Scope compile
    Type jar
    -

    org.slf4j:slf4j-api

    +

    org.slf4j:slf4j-api

    @@ -1476,55 +1456,7 @@
    StatusType jar
    -

    org.slf4j:slf4j-ext

    - - - - - - - - - - - - - - - - - - - - - -
    Status No newer versions available.
    Group Idorg.slf4j
    Artifact Idslf4j-ext
    Current Version1.7.12
    Scope
    Classifier
    Typejar
    -
    -

    org.slf4j:slf4j-jdk14

    - - - - - - - - - - - - - - - - - - - - - -
    Status No newer versions available.
    Group Idorg.slf4j
    Artifact Idslf4j-jdk14
    Current Version1.7.12
    Scope
    Classifier
    Typejar
    -
    -

    org.slf4j:slf4j-simple

    +

    org.slf4j:slf4j-simple

    @@ -1556,15 +1488,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-ant/findbugs.html b/dependency-check-ant/findbugs.html index 2de690d31..2bdd84495 100644 --- a/dependency-check-ant/findbugs.html +++ b/dependency-check-ant/findbugs.html @@ -1,21 +1,21 @@ - + - dependency-check-ant - FindBugs Bug Detector Report - + dependency-check-ant – FindBugs Bug Detector Report + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    FindBugs Bug Detector Report

    -

    The following document contains the results of FindBugs Report

    -

    FindBugs Version is 2.0.2

    +

    FindBugs Bug Detector Report

    +

    The following document contains the results of FindBugs

    +

    FindBugs Version is 3.0.1

    Threshold is medium

    Effort is min

    -

    Summary

    +

    Summary

    Status
    @@ -260,21 +246,21 @@ - +
    ClassesErrors Missing Classes
    57 1 0 0
    +org.owasp.dependencycheck.taskdefs.Check +1
    -

    org.owasp.dependencycheck.taskdefs.DependencyCheckTask

    +

    org.owasp.dependencycheck.taskdefs.Check

    @@ -283,10 +269,10 @@ - + - +
    BugLine Priority
    Inconsistent synchronization of org.owasp.dependencycheck.taskdefs.DependencyCheckTask.path; locked 44% of timeInconsistent synchronization of org.owasp.dependencycheck.taskdefs.Check.path; locked 44% of time MT_CORRECTNESS IS2_INCONSISTENT_SYNC123117 Medium
    @@ -297,15 +283,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-ant/fonts/glyphicons-halflings-regular.eot b/dependency-check-ant/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..637452ea5404ac01670c10db5276e73114d16178 GIT binary patch literal 35283 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 literal 0 HcmV?d00001 diff --git a/dependency-check-ant/fonts/glyphicons-halflings-regular.svg b/dependency-check-ant/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 000000000..446948874 --- /dev/null +++ b/dependency-check-ant/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dependency-check-ant/fonts/glyphicons-halflings-regular.ttf b/dependency-check-ant/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..282401576351ef7d0eb7313e74a251694b6d78bc GIT binary patch literal 55016 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

    ;Iyg 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 DH|yT| literal 0 HcmV?d00001 diff --git a/dependency-check-ant/fonts/glyphicons-halflings-regular.woff b/dependency-check-ant/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..f824ac15a0ac59d8c236f346f3bd429542cdf8b9 GIT binary patch literal 41793 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 literal 33442 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 - + - dependency-check-ant - About - + dependency-check-ant – About + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@

  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +

    About

    OWASP dependency-check-ant is an Ant Task that uses dependency-check-core to detect publicly disclosed vulnerabilities associated with the project’s dependencies. The task will generate a report listing the dependency, any identified Common Platform Enumeration (CPE) identifiers, and the associated Common Vulnerability and Exposure (CVE) entries.

    Installation

    -

    Download dependency-check-ant from bintray here. To install dependency-check-ant place the dependency-check-ant-1.3.0.jar into the lib directory of your Ant instalation directory. Once installed you can add the taskdef to you build.xml and add the task to a new or existing target:

    +
      + +
    1. Download dependency-check-ant from bintray here.
    2. + +
    3. Unzip the archive
    4. + +
    5. +

      Add the taskdef to your build.xml:

      +
      -
      <taskdef name="dependency-check" classname="org.owasp.dependencycheck.taskdefs.DependencyCheckTask"/>
      -
      -

      If you do not want to install dependency-check-ant into your ant’s lib directory when you define the task def you must add the classpath to the taskdef:

      - -
      -
      <taskdef name="dependency-check" classname="org.owasp.dependencycheck.taskdefs.DependencyCheckTask">
      -    <classpath path="[path]/[to]/dependency-check-ant-1.3.0.jar"/>
      +
      <!-- Set the value to the installation directory's path -->
      +<property name="dependency-check.home" value="C:/tools/dependency-check-ant"/>
      +<path id="dependency-check.path">
      +   <pathelement location="${dependency-check.home}/dependency-check-ant.jar"/>
      +</path>
      +   <taskdef resource="dependency-check-taskdefs.properties">
      +   <classpath refid="dependency-check.path" />
       </taskdef>
      -
      +
    + +
  • Use the defined taskdefs: + +
  • +

    It is important to understand that the first time this task is executed it may take 10 minutes or more as it downloads and processes the data from the National Vulnerability Database (NVD) hosted by NIST: https://nvd.nist.gov

    After the first batch download, as long as the task is executed at least once every seven days the update will only take a few seconds.

    @@ -187,15 +200,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-ant/integration.html b/dependency-check-ant/integration.html new file mode 100644 index 000000000..7850be197 --- /dev/null +++ b/dependency-check-ant/integration.html @@ -0,0 +1,236 @@ + + + + + + + + + dependency-check-ant – Continuous Integration + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +
    +

    Overview

    +

    This project uses Continuous Integration System.

    +
    +

    Access

    +

    The following is a link to the continuous integration system used by the project:

    +
    +
    +

    Notifiers

    +

    No notifiers are defined. Please check back at a later date.

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-ant/issue-tracking.html b/dependency-check-ant/issue-tracking.html index a1f3e2be4..7bbd36ce9 100644 --- a/dependency-check-ant/issue-tracking.html +++ b/dependency-check-ant/issue-tracking.html @@ -1,21 +1,21 @@ - + - dependency-check-ant - Issue Tracking - + dependency-check-ant – Issue Tracking + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Overview

    +

    Overview

    This project uses github to manage its issues.

    -

    Issue Tracking

    +

    Issue Tracking

    Issues, bugs, and feature requests should be submitted to the following issue tracking system for this project.

    -
    +
    @@ -220,15 +219,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-ant/js/apache-maven-fluido-1.4.min.js b/dependency-check-ant/js/apache-maven-fluido-1.4.min.js new file mode 100644 index 000000000..0537c09d6 --- /dev/null +++ b/dependency-check-ant/js/apache-maven-fluido-1.4.min.js @@ -0,0 +1,25 @@ +/*! + * jQuery JavaScript Library v1.11.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-17T15:27Z + */ +(function(b,a){if(typeof module==="object"&&typeof module.exports==="object"){module.exports=b.document?a(b,true):function(c){if(!c.document){throw new Error("jQuery requires a window with a document")}return a(c)}}else{a(b)}}(typeof window!=="undefined"?window:this,function(a5,av){var aP=[];var P=aP.slice;var az=aP.concat;var x=aP.push;var bU=aP.indexOf;var ac={};var y=ac.toString;var K=ac.hasOwnProperty;var D={};var ai="1.11.2",bI=function(e,i){return new bI.fn.init(e,i)},E=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bS=/^-ms-/,aW=/-([\da-z])/gi,O=function(e,i){return i.toUpperCase()};bI.fn=bI.prototype={jquery:ai,constructor:bI,selector:"",length:0,toArray:function(){return P.call(this)},get:function(e){return e!=null?(e<0?this[e+this.length]:this[e]):P.call(this)},pushStack:function(e){var i=bI.merge(this.constructor(),e);i.prevObject=this;i.context=this.context;return i},each:function(i,e){return bI.each(this,i,e)},map:function(e){return this.pushStack(bI.map(this,function(b7,b6){return e.call(b7,b6,b7)}))},slice:function(){return this.pushStack(P.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(b7){var e=this.length,b6=+b7+(b7<0?e:0);return this.pushStack(b6>=0&&b6=0},isEmptyObject:function(i){var e;for(e in i){return false}return true},isPlainObject:function(b7){var i;if(!b7||bI.type(b7)!=="object"||b7.nodeType||bI.isWindow(b7)){return false}try{if(b7.constructor&&!K.call(b7,"constructor")&&!K.call(b7.constructor.prototype,"isPrototypeOf")){return false}}catch(b6){return false}if(D.ownLast){for(i in b7){return K.call(b7,i)}}for(i in b7){}return i===undefined||K.call(b7,i)},type:function(e){if(e==null){return e+""}return typeof e==="object"||typeof e==="function"?ac[y.call(e)]||"object":typeof e},globalEval:function(e){if(e&&bI.trim(e)){(a5.execScript||function(i){a5["eval"].call(a5,i)})(e)}},camelCase:function(e){return e.replace(bS,"ms-").replace(aW,O)},nodeName:function(i,e){return i.nodeName&&i.nodeName.toLowerCase()===e.toLowerCase()},each:function(ca,cb,b6){var b9,b7=0,b8=ca.length,e=ad(ca);if(b6){if(e){for(;b70&&(i-1) in b6}var m= +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function(de){var cy,dh,cn,cH,cK,ci,cW,dg,dm,cI,cX,cZ,cC,co,c8,c3,df,ce,cF,da="sizzle"+1*new Date(),cJ=de.document,di=0,c4=0,b9=cA(),c9=cA(),cG=cA(),cE=function(i,e){if(i===e){cX=true}return 0},cQ=1<<31,cO=({}).hasOwnProperty,dc=[],dd=dc.pop,cM=dc.push,b7=dc.push,cm=dc.slice,cd=function(dq,dp){var dn=0,e=dq.length;for(;dn+~]|"+cp+")"+cp+"*"),ct=new RegExp("="+cp+"*([^\\]'\"]*?)"+cp+"*\\]","g"),cS=new RegExp(ck),cU=new RegExp("^"+cL+"$"),c2={ID:new RegExp("^#("+b6+")"),CLASS:new RegExp("^\\.("+b6+")"),TAG:new RegExp("^("+b6.replace("w","w*")+")"),ATTR:new RegExp("^"+c6),PSEUDO:new RegExp("^"+ck),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+cp+"*(even|odd|(([+-]|)(\\d*)n|)"+cp+"*(?:([+-]|)"+cp+"*(\\d+)|))"+cp+"*\\)|)","i"),bool:new RegExp("^(?:"+b8+")$","i"),needsContext:new RegExp("^"+cp+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+cp+"*((?:-\\d)?\\d*)"+cp+"*\\)|)(?=[^-]|$)","i")},cc=/^(?:input|select|textarea|button)$/i,cl=/^h\d$/i,cP=/^[^{]+\{\s*\[native \w/,cR=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,c1=/[+~]/,cN=/'|\\/g,cs=new RegExp("\\\\([\\da-f]{1,6}"+cp+"?|("+cp+")|.)","ig"),c5=function(e,dp,i){var dn="0x"+dp-65536;return dn!==dn||i?dp:dn<0?String.fromCharCode(dn+65536):String.fromCharCode(dn>>10|55296,dn&1023|56320)},dl=function(){cZ()};try{b7.apply((dc=cm.call(cJ.childNodes)),cJ.childNodes);dc[cJ.childNodes.length].nodeType}catch(cD){b7={apply:dc.length?function(i,e){cM.apply(i,cm.call(e))}:function(dq,dp){var e=dq.length,dn=0;while((dq[e++]=dp[dn++])){}dq.length=e-1}}}function cw(dv,dn,dz,dB){var dA,ds,dt,dx,dy,dr,dq,e,dp,dw;if((dn?dn.ownerDocument||dn:cJ)!==cC){cZ(dn)}dn=dn||cC;dz=dz||[];dx=dn.nodeType;if(typeof dv!=="string"||!dv||dx!==1&&dx!==9&&dx!==11){return dz}if(!dB&&c8){if(dx!==11&&(dA=cR.exec(dv))){if((dt=dA[1])){if(dx===9){ds=dn.getElementById(dt);if(ds&&ds.parentNode){if(ds.id===dt){dz.push(ds);return dz}}else{return dz}}else{if(dn.ownerDocument&&(ds=dn.ownerDocument.getElementById(dt))&&cF(dn,ds)&&ds.id===dt){dz.push(ds);return dz}}}else{if(dA[2]){b7.apply(dz,dn.getElementsByTagName(dv));return dz}else{if((dt=dA[3])&&dh.getElementsByClassName){b7.apply(dz,dn.getElementsByClassName(dt));return dz}}}}if(dh.qsa&&(!c3||!c3.test(dv))){e=dq=da;dp=dn;dw=dx!==1&&dv;if(dx===1&&dn.nodeName.toLowerCase()!=="object"){dr=ci(dv);if((dq=dn.getAttribute("id"))){e=dq.replace(cN,"\\$&")}else{dn.setAttribute("id",e)}e="[id='"+e+"'] ";dy=dr.length;while(dy--){dr[dy]=e+ch(dr[dy])}dp=c1.test(dv)&&cT(dn.parentNode)||dn;dw=dr.join(",")}if(dw){try{b7.apply(dz,dp.querySelectorAll(dw));return dz}catch(du){}finally{if(!dq){dn.removeAttribute("id")}}}}}return dg(dv.replace(cr,"$1"),dn,dz,dB)}function cA(){var i=[];function e(dn,dp){if(i.push(dn+" ")>cn.cacheLength){delete e[i.shift()]}return(e[dn+" "]=dp)}return e}function cj(e){e[da]=true;return e}function cf(i){var dp=cC.createElement("div");try{return !!i(dp)}catch(dn){return false}finally{if(dp.parentNode){dp.parentNode.removeChild(dp)}dp=null}}function dj(dn,dq){var e=dn.split("|"),dp=dn.length;while(dp--){cn.attrHandle[e[dp]]=dq}}function ca(i,e){var dp=e&&i,dn=dp&&i.nodeType===1&&e.nodeType===1&&(~e.sourceIndex||cQ)-(~i.sourceIndex||cQ);if(dn){return dn}if(dp){while((dp=dp.nextSibling)){if(dp===e){return -1}}}return i?1:-1}function cx(e){return function(dn){var i=dn.nodeName.toLowerCase();return i==="input"&&dn.type===e}}function cb(e){return function(dn){var i=dn.nodeName.toLowerCase();return(i==="input"||i==="button")&&dn.type===e}}function c7(e){return cj(function(i){i=+i;return cj(function(dn,ds){var dq,dp=e([],dn.length,i),dr=dp.length;while(dr--){if(dn[(dq=dp[dr])]){dn[dq]=!(ds[dq]=dn[dq])}}})})}function cT(e){return e&&typeof e.getElementsByTagName!=="undefined"&&e}dh=cw.support={};cK=cw.isXML=function(e){var i=e&&(e.ownerDocument||e).documentElement;return i?i.nodeName!=="HTML":false};cZ=cw.setDocument=function(dn){var e,i,dp=dn?dn.ownerDocument||dn:cJ;if(dp===cC||dp.nodeType!==9||!dp.documentElement){return cC}cC=dp;co=dp.documentElement;i=dp.defaultView;if(i&&i!==i.top){if(i.addEventListener){i.addEventListener("unload",dl,false)}else{if(i.attachEvent){i.attachEvent("onunload",dl)}}}c8=!cK(dp);dh.attributes=cf(function(dq){dq.className="i";return !dq.getAttribute("className")});dh.getElementsByTagName=cf(function(dq){dq.appendChild(dp.createComment(""));return !dq.getElementsByTagName("*").length});dh.getElementsByClassName=cP.test(dp.getElementsByClassName);dh.getById=cf(function(dq){co.appendChild(dq).id=da;return !dp.getElementsByName||!dp.getElementsByName(da).length});if(dh.getById){cn.find.ID=function(ds,dr){if(typeof dr.getElementById!=="undefined"&&c8){var dq=dr.getElementById(ds);return dq&&dq.parentNode?[dq]:[]}};cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(ds){return ds.getAttribute("id")===dq}}}else{delete cn.find.ID;cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(dt){var ds=typeof dt.getAttributeNode!=="undefined"&&dt.getAttributeNode("id");return ds&&ds.value===dq}}}cn.find.TAG=dh.getElementsByTagName?function(dq,dr){if(typeof dr.getElementsByTagName!=="undefined"){return dr.getElementsByTagName(dq)}else{if(dh.qsa){return dr.querySelectorAll(dq)}}}:function(dq,du){var dv,dt=[],ds=0,dr=du.getElementsByTagName(dq);if(dq==="*"){while((dv=dr[ds++])){if(dv.nodeType===1){dt.push(dv)}}return dt}return dr};cn.find.CLASS=dh.getElementsByClassName&&function(dr,dq){if(c8){return dq.getElementsByClassName(dr)}};df=[];c3=[];if((dh.qsa=cP.test(dp.querySelectorAll))){cf(function(dq){co.appendChild(dq).innerHTML="";if(dq.querySelectorAll("[msallowcapture^='']").length){c3.push("[*^$]="+cp+"*(?:''|\"\")")}if(!dq.querySelectorAll("[selected]").length){c3.push("\\["+cp+"*(?:value|"+b8+")")}if(!dq.querySelectorAll("[id~="+da+"-]").length){c3.push("~=")}if(!dq.querySelectorAll(":checked").length){c3.push(":checked")}if(!dq.querySelectorAll("a#"+da+"+*").length){c3.push(".#.+[+~]")}});cf(function(dr){var dq=dp.createElement("input");dq.setAttribute("type","hidden");dr.appendChild(dq).setAttribute("name","D");if(dr.querySelectorAll("[name=d]").length){c3.push("name"+cp+"*[*^$|!~]?=")}if(!dr.querySelectorAll(":enabled").length){c3.push(":enabled",":disabled")}dr.querySelectorAll("*,:x");c3.push(",.*:")})}if((dh.matchesSelector=cP.test((ce=co.matches||co.webkitMatchesSelector||co.mozMatchesSelector||co.oMatchesSelector||co.msMatchesSelector)))){cf(function(dq){dh.disconnectedMatch=ce.call(dq,"div");ce.call(dq,"[s!='']:x");df.push("!=",ck)})}c3=c3.length&&new RegExp(c3.join("|"));df=df.length&&new RegExp(df.join("|"));e=cP.test(co.compareDocumentPosition);cF=e||cP.test(co.contains)?function(dr,dq){var dt=dr.nodeType===9?dr.documentElement:dr,ds=dq&&dq.parentNode;return dr===ds||!!(ds&&ds.nodeType===1&&(dt.contains?dt.contains(ds):dr.compareDocumentPosition&&dr.compareDocumentPosition(ds)&16))}:function(dr,dq){if(dq){while((dq=dq.parentNode)){if(dq===dr){return true}}}return false};cE=e?function(dr,dq){if(dr===dq){cX=true;return 0}var ds=!dr.compareDocumentPosition-!dq.compareDocumentPosition;if(ds){return ds}ds=(dr.ownerDocument||dr)===(dq.ownerDocument||dq)?dr.compareDocumentPosition(dq):1;if(ds&1||(!dh.sortDetached&&dq.compareDocumentPosition(dr)===ds)){if(dr===dp||dr.ownerDocument===cJ&&cF(cJ,dr)){return -1}if(dq===dp||dq.ownerDocument===cJ&&cF(cJ,dq)){return 1}return cI?(cd(cI,dr)-cd(cI,dq)):0}return ds&4?-1:1}:function(dr,dq){if(dr===dq){cX=true;return 0}var dx,du=0,dw=dr.parentNode,dt=dq.parentNode,ds=[dr],dv=[dq];if(!dw||!dt){return dr===dp?-1:dq===dp?1:dw?-1:dt?1:cI?(cd(cI,dr)-cd(cI,dq)):0}else{if(dw===dt){return ca(dr,dq)}}dx=dr;while((dx=dx.parentNode)){ds.unshift(dx)}dx=dq;while((dx=dx.parentNode)){dv.unshift(dx)}while(ds[du]===dv[du]){du++}return du?ca(ds[du],dv[du]):ds[du]===cJ?-1:dv[du]===cJ?1:0};return dp};cw.matches=function(i,e){return cw(i,null,null,e)};cw.matchesSelector=function(dn,dq){if((dn.ownerDocument||dn)!==cC){cZ(dn)}dq=dq.replace(ct,"='$1']");if(dh.matchesSelector&&c8&&(!df||!df.test(dq))&&(!c3||!c3.test(dq))){try{var i=ce.call(dn,dq);if(i||dh.disconnectedMatch||dn.document&&dn.document.nodeType!==11){return i}}catch(dp){}}return cw(dq,cC,null,[dn]).length>0};cw.contains=function(e,i){if((e.ownerDocument||e)!==cC){cZ(e)}return cF(e,i)};cw.attr=function(dn,e){if((dn.ownerDocument||dn)!==cC){cZ(dn)}var i=cn.attrHandle[e.toLowerCase()],dp=i&&cO.call(cn.attrHandle,e.toLowerCase())?i(dn,e,!c8):undefined;return dp!==undefined?dp:dh.attributes||!c8?dn.getAttribute(e):(dp=dn.getAttributeNode(e))&&dp.specified?dp.value:null};cw.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};cw.uniqueSort=function(dp){var dq,dr=[],e=0,dn=0;cX=!dh.detectDuplicates;cI=!dh.sortStable&&dp.slice(0);dp.sort(cE);if(cX){while((dq=dp[dn++])){if(dq===dp[dn]){e=dr.push(dn)}}while(e--){dp.splice(dr[e],1)}}cI=null;return dp};cH=cw.getText=function(dr){var dq,dn="",dp=0,e=dr.nodeType;if(!e){while((dq=dr[dp++])){dn+=cH(dq)}}else{if(e===1||e===9||e===11){if(typeof dr.textContent==="string"){return dr.textContent}else{for(dr=dr.firstChild;dr;dr=dr.nextSibling){dn+=cH(dr)}}}else{if(e===3||e===4){return dr.nodeValue}}}return dn};cn=cw.selectors={cacheLength:50,createPseudo:cj,match:c2,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){e[1]=e[1].replace(cs,c5);e[3]=(e[3]||e[4]||e[5]||"").replace(cs,c5);if(e[2]==="~="){e[3]=" "+e[3]+" "}return e.slice(0,4)},CHILD:function(e){e[1]=e[1].toLowerCase();if(e[1].slice(0,3)==="nth"){if(!e[3]){cw.error(e[0])}e[4]=+(e[4]?e[5]+(e[6]||1):2*(e[3]==="even"||e[3]==="odd"));e[5]=+((e[7]+e[8])||e[3]==="odd")}else{if(e[3]){cw.error(e[0])}}return e},PSEUDO:function(i){var e,dn=!i[6]&&i[2];if(c2.CHILD.test(i[0])){return null}if(i[3]){i[2]=i[4]||i[5]||""}else{if(dn&&cS.test(dn)&&(e=ci(dn,true))&&(e=dn.indexOf(")",dn.length-e)-dn.length)){i[0]=i[0].slice(0,e);i[2]=dn.slice(0,e)}}return i.slice(0,3)}},filter:{TAG:function(i){var e=i.replace(cs,c5).toLowerCase();return i==="*"?function(){return true}:function(dn){return dn.nodeName&&dn.nodeName.toLowerCase()===e}},CLASS:function(e){var i=b9[e+" "];return i||(i=new RegExp("(^|"+cp+")"+e+"("+cp+"|$)"))&&b9(e,function(dn){return i.test(typeof dn.className==="string"&&dn.className||typeof dn.getAttribute!=="undefined"&&dn.getAttribute("class")||"")})},ATTR:function(dn,i,e){return function(dq){var dp=cw.attr(dq,dn);if(dp==null){return i==="!="}if(!i){return true}dp+="";return i==="="?dp===e:i==="!="?dp!==e:i==="^="?e&&dp.indexOf(e)===0:i==="*="?e&&dp.indexOf(e)>-1:i==="$="?e&&dp.slice(-e.length)===e:i==="~="?(" "+dp.replace(cu," ")+" ").indexOf(e)>-1:i==="|="?dp===e||dp.slice(0,e.length+1)===e+"-":false}},CHILD:function(i,dq,dp,dr,dn){var dt=i.slice(0,3)!=="nth",e=i.slice(-4)!=="last",ds=dq==="of-type";return dr===1&&dn===0?function(du){return !!du.parentNode}:function(dA,dy,dD){var du,dG,dB,dF,dC,dx,dz=dt!==e?"nextSibling":"previousSibling",dE=dA.parentNode,dw=ds&&dA.nodeName.toLowerCase(),dv=!dD&&!ds;if(dE){if(dt){while(dz){dB=dA;while((dB=dB[dz])){if(ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1){return false}}dx=dz=i==="only"&&!dx&&"nextSibling"}return true}dx=[e?dE.firstChild:dE.lastChild];if(e&&dv){dG=dE[da]||(dE[da]={});du=dG[i]||[];dC=du[0]===di&&du[1];dF=du[0]===di&&du[2];dB=dC&&dE.childNodes[dC];while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if(dB.nodeType===1&&++dF&&dB===dA){dG[i]=[di,dC,dF];break}}}else{if(dv&&(du=(dA[da]||(dA[da]={}))[i])&&du[0]===di){dF=du[1]}else{while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if((ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1)&&++dF){if(dv){(dB[da]||(dB[da]={}))[i]=[di,dF]}if(dB===dA){break}}}}}dF-=dn;return dF===dr||(dF%dr===0&&dF/dr>=0)}}},PSEUDO:function(dp,dn){var e,i=cn.pseudos[dp]||cn.setFilters[dp.toLowerCase()]||cw.error("unsupported pseudo: "+dp);if(i[da]){return i(dn)}if(i.length>1){e=[dp,dp,"",dn];return cn.setFilters.hasOwnProperty(dp.toLowerCase())?cj(function(ds,du){var dr,dq=i(ds,dn),dt=dq.length;while(dt--){dr=cd(ds,dq[dt]);ds[dr]=!(du[dr]=dq[dt])}}):function(dq){return i(dq,0,e)}}return i}},pseudos:{not:cj(function(e){var i=[],dn=[],dp=cW(e.replace(cr,"$1"));return dp[da]?cj(function(dr,dw,du,ds){var dv,dq=dp(dr,null,ds,[]),dt=dr.length;while(dt--){if((dv=dq[dt])){dr[dt]=!(dw[dt]=dv)}}}):function(ds,dr,dq){i[0]=ds;dp(i,null,dq,dn);i[0]=null;return !dn.pop()}}),has:cj(function(e){return function(i){return cw(e,i).length>0}}),contains:cj(function(e){e=e.replace(cs,c5);return function(i){return(i.textContent||i.innerText||cH(i)).indexOf(e)>-1}}),lang:cj(function(e){if(!cU.test(e||"")){cw.error("unsupported lang: "+e)}e=e.replace(cs,c5).toLowerCase();return function(dn){var i;do{if((i=c8?dn.lang:dn.getAttribute("xml:lang")||dn.getAttribute("lang"))){i=i.toLowerCase();return i===e||i.indexOf(e+"-")===0}}while((dn=dn.parentNode)&&dn.nodeType===1);return false}}),target:function(e){var i=de.location&&de.location.hash;return i&&i.slice(1)===e.id},root:function(e){return e===co},focus:function(e){return e===cC.activeElement&&(!cC.hasFocus||cC.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===false},disabled:function(e){return e.disabled===true},checked:function(e){var i=e.nodeName.toLowerCase();return(i==="input"&&!!e.checked)||(i==="option"&&!!e.selected)},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling){if(e.nodeType<6){return false}}return true},parent:function(e){return !cn.pseudos.empty(e)},header:function(e){return cl.test(e.nodeName)},input:function(e){return cc.test(e.nodeName)},button:function(i){var e=i.nodeName.toLowerCase();return e==="input"&&i.type==="button"||e==="button"},text:function(i){var e;return i.nodeName.toLowerCase()==="input"&&i.type==="text"&&((e=i.getAttribute("type"))==null||e.toLowerCase()==="text")},first:c7(function(){return[0]}),last:c7(function(e,i){return[i-1]}),eq:c7(function(e,dn,i){return[i<0?i+dn:i]}),even:c7(function(e,dp){var dn=0;for(;dn=0;){e.push(dn)}return e}),gt:c7(function(e,dq,dp){var dn=dp<0?dp+dq:dp;for(;++dn1?function(dr,dq,dn){var dp=e.length;while(dp--){if(!e[dp](dr,dq,dn)){return false}}return true}:e[0]}function cz(dn,dr,dq){var dp=0,e=dr.length;for(;dp-1){dC[dE]=!(dz[dE]=dw)}}}}else{dy=c0(dy===dz?dy.splice(dt,dy.length):dy);if(dr){dr(null,dz,dy,dB)}else{b7.apply(dz,dy)}}})}function db(dt){var dn,dr,dp,ds=dt.length,dw=cn.relative[dt[0].type],dx=dw||cn.relative[" "],dq=dw?1:0,du=cq(function(i){return i===dn},dx,true),dv=cq(function(i){return cd(dn,i)>-1},dx,true),e=[function(dA,dz,dy){var i=(!dw&&(dy||dz!==dm))||((dn=dz).nodeType?du(dA,dz,dy):dv(dA,dz,dy));dn=null;return i}];for(;dq1&&dk(e),dq>1&&ch(dt.slice(0,dq-1).concat({value:dt[dq-2].type===" "?"*":""})).replace(cr,"$1"),dr,dq0,dq=dp.length>0,i=function(dA,du,dz,dy,dD){var dv,dw,dB,dF=0,dx="0",dr=dA&&[],dG=[],dE=dm,dt=dA||dq&&cn.find.TAG("*",dD),ds=(di+=dE==null?1:Math.random()||0.1),dC=dt.length;if(dD){dm=du!==cC&&du}for(;dx!==dC&&(dv=dt[dx])!=null;dx++){if(dq&&dv){dw=0;while((dB=dp[dw++])){if(dB(dv,du,dz)){dy.push(dv);break}}if(dD){di=ds}}if(e){if((dv=!dB&&dv)){dF--}if(dA){dr.push(dv)}}}dF+=dx;if(e&&dx!==dF){dw=0;while((dB=dn[dw++])){dB(dr,dG,du,dz)}if(dA){if(dF>0){while(dx--){if(!(dr[dx]||dG[dx])){dG[dx]=dd.call(dy)}}}dG=c0(dG)}b7.apply(dy,dG);if(dD&&!dA&&dG.length>0&&(dF+dn.length)>1){cw.uniqueSort(dy)}}if(dD){di=ds;dm=dE}return dr};return e?cj(i):i}cW=cw.compile=function(e,dp){var dq,dn=[],ds=[],dr=cG[e+" "];if(!dr){if(!dp){dp=ci(e)}dq=dp.length;while(dq--){dr=db(dp[dq]);if(dr[da]){dn.push(dr)}else{ds.push(dr)}}dr=cG(e,cY(ds,dn));dr.selector=e}return dr};dg=cw.select=function(dp,e,dq,dt){var dr,dw,dn,dx,du,dv=typeof dp==="function"&&dp,ds=!dt&&ci((dp=dv.selector||dp));dq=dq||[];if(ds.length===1){dw=ds[0]=ds[0].slice(0);if(dw.length>2&&(dn=dw[0]).type==="ID"&&dh.getById&&e.nodeType===9&&c8&&cn.relative[dw[1].type]){e=(cn.find.ID(dn.matches[0].replace(cs,c5),e)||[])[0];if(!e){return dq}else{if(dv){e=e.parentNode}}dp=dp.slice(dw.shift().value.length)}dr=c2.needsContext.test(dp)?0:dw.length;while(dr--){dn=dw[dr];if(cn.relative[(dx=dn.type)]){break}if((du=cn.find[dx])){if((dt=du(dn.matches[0].replace(cs,c5),c1.test(dw[0].type)&&cT(e.parentNode)||e))){dw.splice(dr,1);dp=dt.length&&ch(dw);if(!dp){b7.apply(dq,dt);return dq}break}}}}(dv||cW(dp,ds))(dt,e,!c8,dq,c1.test(dp)&&cT(e.parentNode)||e);return dq};dh.sortStable=da.split("").sort(cE).join("")===da;dh.detectDuplicates=!!cX;cZ();dh.sortDetached=cf(function(e){return e.compareDocumentPosition(cC.createElement("div"))&1});if(!cf(function(e){e.innerHTML="";return e.firstChild.getAttribute("href")==="#"})){dj("type|href|height|width",function(i,e,dn){if(!dn){return i.getAttribute(e,e.toLowerCase()==="type"?1:2)}})}if(!dh.attributes||!cf(function(e){e.innerHTML="";e.firstChild.setAttribute("value","");return e.firstChild.getAttribute("value")===""})){dj("value",function(i,e,dn){if(!dn&&i.nodeName.toLowerCase()==="input"){return i.defaultValue}})}if(!cf(function(e){return e.getAttribute("disabled")==null})){dj(b8,function(i,e,dp){var dn;if(!dp){return i[e]===true?e.toLowerCase():(dn=i.getAttributeNode(e))&&dn.specified?dn.value:null}})}return cw})(a5);bI.find=m;bI.expr=m.selectors;bI.expr[":"]=bI.expr.pseudos;bI.unique=m.uniqueSort;bI.text=m.getText;bI.isXMLDoc=m.isXML;bI.contains=m.contains;var A=bI.expr.match.needsContext;var a=(/^<(\w+)\s*\/?>(?:<\/\1>|)$/);var aL=/^.[^:#\[\.,]*$/;function aR(b6,e,i){if(bI.isFunction(e)){return bI.grep(b6,function(b8,b7){return !!e.call(b8,b7,b8)!==i})}if(e.nodeType){return bI.grep(b6,function(b7){return(b7===e)!==i})}if(typeof e==="string"){if(aL.test(e)){return bI.filter(e,b6,i)}e=bI.filter(e,b6)}return bI.grep(b6,function(b7){return(bI.inArray(b7,e)>=0)!==i})}bI.filter=function(b7,e,b6){var i=e[0];if(b6){b7=":not("+b7+")"}return e.length===1&&i.nodeType===1?bI.find.matchesSelector(i,b7)?[i]:[]:bI.find.matches(b7,bI.grep(e,function(b8){return b8.nodeType===1}))};bI.fn.extend({find:function(b6){var b9,b8=[],b7=this,e=b7.length;if(typeof b6!=="string"){return this.pushStack(bI(b6).filter(function(){for(b9=0;b91?bI.unique(b8):b8);b8.selector=this.selector?this.selector+" "+b6:b6;return b8},filter:function(e){return this.pushStack(aR(this,e||[],false))},not:function(e){return this.pushStack(aR(this,e||[],true))},is:function(e){return !!aR(this,typeof e==="string"&&A.test(e)?bI(e):e||[],false).length}});var z,n=a5.document,bt=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,bV=bI.fn.init=function(e,b6){var i,b7;if(!e){return this}if(typeof e==="string"){if(e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3){i=[null,e,null]}else{i=bt.exec(e)}if(i&&(i[1]||!b6)){if(i[1]){b6=b6 instanceof bI?b6[0]:b6;bI.merge(this,bI.parseHTML(i[1],b6&&b6.nodeType?b6.ownerDocument||b6:n,true));if(a.test(i[1])&&bI.isPlainObject(b6)){for(i in b6){if(bI.isFunction(this[i])){this[i](b6[i])}else{this.attr(i,b6[i])}}}return this}else{b7=n.getElementById(i[2]);if(b7&&b7.parentNode){if(b7.id!==i[2]){return z.find(e)}this.length=1;this[0]=b7}this.context=n;this.selector=e;return this}}else{if(!b6||b6.jquery){return(b6||z).find(e)}else{return this.constructor(b6).find(e)}}}else{if(e.nodeType){this.context=this[0]=e;this.length=1;return this}else{if(bI.isFunction(e)){return typeof z.ready!=="undefined"?z.ready(e):e(bI)}}}if(e.selector!==undefined){this.selector=e.selector;this.context=e.context}return bI.makeArray(e,this)};bV.prototype=bI.fn;z=bI(n);var bv=/^(?:parents|prev(?:Until|All))/,bz={children:true,contents:true,next:true,prev:true};bI.extend({dir:function(b6,i,b8){var e=[],b7=b6[i];while(b7&&b7.nodeType!==9&&(b8===undefined||b7.nodeType!==1||!bI(b7).is(b8))){if(b7.nodeType===1){e.push(b7)}b7=b7[i]}return e},sibling:function(b6,i){var e=[];for(;b6;b6=b6.nextSibling){if(b6.nodeType===1&&b6!==i){e.push(b6)}}return e}});bI.fn.extend({has:function(b8){var b7,b6=bI(b8,this),e=b6.length;return this.filter(function(){for(b7=0;b7-1:ca.nodeType===1&&bI.find.matchesSelector(ca,b9))){e.push(ca);break}}}return this.pushStack(e.length>1?bI.unique(e):e)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.first().prevAll().length:-1}if(typeof e==="string"){return bI.inArray(this[0],bI(e))}return bI.inArray(e.jquery?e[0]:e,this)},add:function(e,i){return this.pushStack(bI.unique(bI.merge(this.get(),bI(e,i))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}});function aY(i,e){do{i=i[e]}while(i&&i.nodeType!==1);return i}bI.each({parent:function(i){var e=i.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return bI.dir(e,"parentNode")},parentsUntil:function(b6,e,b7){return bI.dir(b6,"parentNode",b7)},next:function(e){return aY(e,"nextSibling")},prev:function(e){return aY(e,"previousSibling")},nextAll:function(e){return bI.dir(e,"nextSibling")},prevAll:function(e){return bI.dir(e,"previousSibling")},nextUntil:function(b6,e,b7){return bI.dir(b6,"nextSibling",b7)},prevUntil:function(b6,e,b7){return bI.dir(b6,"previousSibling",b7)},siblings:function(e){return bI.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return bI.sibling(e.firstChild)},contents:function(e){return bI.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:bI.merge([],e.childNodes)}},function(e,i){bI.fn[e]=function(b8,b6){var b7=bI.map(this,i,b8);if(e.slice(-5)!=="Until"){b6=b8}if(b6&&typeof b6==="string"){b7=bI.filter(b6,b7)}if(this.length>1){if(!bz[e]){b7=bI.unique(b7)}if(bv.test(e)){b7=b7.reverse()}}return this.pushStack(b7)}});var aF=(/\S+/g);var b2={};function af(i){var e=b2[i]={};bI.each(i.match(aF)||[],function(b7,b6){e[b6]=true});return e}bI.Callbacks=function(ce){ce=typeof ce==="string"?(b2[ce]||af(ce)):bI.extend({},ce);var b8,b7,e,b9,ca,b6,cb=[],cc=!ce.once&&[],i=function(cf){b7=ce.memory&&cf;e=true;ca=b6||0;b6=0;b9=cb.length;b8=true;for(;cb&&ca-1){cb.splice(cg,1);if(b8){if(cg<=b9){b9--}if(cg<=ca){ca--}}}})}return this},has:function(cf){return cf?bI.inArray(cf,cb)>-1:!!(cb&&cb.length)},empty:function(){cb=[];b9=0;return this},disable:function(){cb=cc=b7=undefined;return this},disabled:function(){return !cb},lock:function(){cc=undefined;if(!b7){cd.disable()}return this},locked:function(){return !cc},fireWith:function(cg,cf){if(cb&&(!e||cc)){cf=cf||[];cf=[cg,cf.slice?cf.slice():cf];if(b8){cc.push(cf)}else{i(cf)}}return this},fire:function(){cd.fireWith(this,arguments);return this},fired:function(){return !!e}};return cd};bI.extend({Deferred:function(b6){var i=[["resolve","done",bI.Callbacks("once memory"),"resolved"],["reject","fail",bI.Callbacks("once memory"),"rejected"],["notify","progress",bI.Callbacks("memory")]],b7="pending",b8={state:function(){return b7},always:function(){e.done(arguments).fail(arguments);return this},then:function(){var b9=arguments;return bI.Deferred(function(ca){bI.each(i,function(cc,cb){var cd=bI.isFunction(b9[cc])&&b9[cc];e[cb[1]](function(){var ce=cd&&cd.apply(this,arguments);if(ce&&bI.isFunction(ce.promise)){ce.promise().done(ca.resolve).fail(ca.reject).progress(ca.notify)}else{ca[cb[0]+"With"](this===b8?ca.promise():this,cd?[ce]:arguments)}})});b9=null}).promise()},promise:function(b9){return b9!=null?bI.extend(b9,b8):b8}},e={};b8.pipe=b8.then;bI.each(i,function(ca,b9){var cc=b9[2],cb=b9[3];b8[b9[1]]=cc.add;if(cb){cc.add(function(){b7=cb},i[ca^1][2].disable,i[2][2].lock)}e[b9[0]]=function(){e[b9[0]+"With"](this===e?b8:this,arguments);return this};e[b9[0]+"With"]=cc.fireWith});b8.promise(e);if(b6){b6.call(e,e)}return e},when:function(b9){var b7=0,cb=P.call(arguments),e=cb.length,b6=e!==1||(b9&&bI.isFunction(b9.promise))?e:0,ce=b6===1?b9:bI.Deferred(),b8=function(cg,ch,cf){return function(i){ch[cg]=this;cf[cg]=arguments.length>1?P.call(arguments):i;if(cf===cd){ce.notifyWith(ch,cf)}else{if(!(--b6)){ce.resolveWith(ch,cf)}}}},cd,ca,cc;if(e>1){cd=new Array(e);ca=new Array(e);cc=new Array(e);for(;b70){return}ak.resolveWith(n,[bI]);if(bI.fn.triggerHandler){bI(n).triggerHandler("ready");bI(n).off("ready")}}});function bm(){if(n.addEventListener){n.removeEventListener("DOMContentLoaded",bZ,false);a5.removeEventListener("load",bZ,false)}else{n.detachEvent("onreadystatechange",bZ);a5.detachEvent("onload",bZ)}}function bZ(){if(n.addEventListener||event.type==="load"||n.readyState==="complete"){bm();bI.ready()}}bI.ready.promise=function(b8){if(!ak){ak=bI.Deferred();if(n.readyState==="complete"){setTimeout(bI.ready)}else{if(n.addEventListener){n.addEventListener("DOMContentLoaded",bZ,false);a5.addEventListener("load",bZ,false)}else{n.attachEvent("onreadystatechange",bZ);a5.attachEvent("onload",bZ);var b7=false;try{b7=a5.frameElement==null&&n.documentElement}catch(b6){}if(b7&&b7.doScroll){(function i(){if(!bI.isReady){try{b7.doScroll("left")}catch(b9){return setTimeout(i,50)}bm();bI.ready()}})()}}}}return ak.promise(b8)};var aC=typeof undefined;var bh;for(bh in bI(D)){break}D.ownLast=bh!=="0";D.inlineBlockNeedsLayout=false;bI(function(){var b6,b7,e,i;e=n.getElementsByTagName("body")[0];if(!e||!e.style){return}b7=n.createElement("div");i=n.createElement("div");i.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";e.appendChild(i).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";D.inlineBlockNeedsLayout=b6=b7.offsetWidth===3;if(b6){e.style.zoom=1}}e.removeChild(i)});(function(){var b6=n.createElement("div");if(D.deleteExpando==null){D.deleteExpando=true;try{delete b6.test}catch(i){D.deleteExpando=false}}b6=null})();bI.acceptData=function(b6){var i=bI.noData[(b6.nodeName+" ").toLowerCase()],e=+b6.nodeType||1;return e!==1&&e!==9?false:!i||i!==true&&b6.getAttribute("classid")===i};var by=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,aQ=/([A-Z])/g;function bA(b7,b6,b8){if(b8===undefined&&b7.nodeType===1){var i="data-"+b6.replace(aQ,"-$1").toLowerCase();b8=b7.getAttribute(i);if(typeof b8==="string"){try{b8=b8==="true"?true:b8==="false"?false:b8==="null"?null:+b8+""===b8?+b8:by.test(b8)?bI.parseJSON(b8):b8}catch(b9){}bI.data(b7,b6,b8)}else{b8=undefined}}return b8}function Q(i){var e;for(e in i){if(e==="data"&&bI.isEmptyObject(i[e])){continue}if(e!=="toJSON"){return false}}return true}function bc(b7,i,b9,b8){if(!bI.acceptData(b7)){return}var cb,ca,cc=bI.expando,cd=b7.nodeType,e=cd?bI.cache:b7,b6=cd?b7[cc]:b7[cc]&&cc;if((!b6||!e[b6]||(!b8&&!e[b6].data))&&b9===undefined&&typeof i==="string"){return}if(!b6){if(cd){b6=b7[cc]=aP.pop()||bI.guid++}else{b6=cc}}if(!e[b6]){e[b6]=cd?{}:{toJSON:bI.noop}}if(typeof i==="object"||typeof i==="function"){if(b8){e[b6]=bI.extend(e[b6],i)}else{e[b6].data=bI.extend(e[b6].data,i)}}ca=e[b6];if(!b8){if(!ca.data){ca.data={}}ca=ca.data}if(b9!==undefined){ca[bI.camelCase(i)]=b9}if(typeof i==="string"){cb=ca[i];if(cb==null){cb=ca[bI.camelCase(i)]}}else{cb=ca}return cb}function ab(b9,b7,e){if(!bI.acceptData(b9)){return}var cb,b8,ca=b9.nodeType,b6=ca?bI.cache:b9,cc=ca?b9[bI.expando]:bI.expando;if(!b6[cc]){return}if(b7){cb=e?b6[cc]:b6[cc].data;if(cb){if(!bI.isArray(b7)){if(b7 in cb){b7=[b7]}else{b7=bI.camelCase(b7);if(b7 in cb){b7=[b7]}else{b7=b7.split(" ")}}}else{b7=b7.concat(bI.map(b7,bI.camelCase))}b8=b7.length;while(b8--){delete cb[b7[b8]]}if(e?!Q(cb):!bI.isEmptyObject(cb)){return}}}if(!e){delete b6[cc].data;if(!Q(b6[cc])){return}}if(ca){bI.cleanData([b9],true)}else{if(D.deleteExpando||b6!=b6.window){delete b6[cc]}else{b6[cc]=null}}}bI.extend({cache:{},noData:{"applet ":true,"embed ":true,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){e=e.nodeType?bI.cache[e[bI.expando]]:e[bI.expando];return !!e&&!Q(e)},data:function(i,e,b6){return bc(i,e,b6)},removeData:function(i,e){return ab(i,e)},_data:function(i,e,b6){return bc(i,e,b6,true)},_removeData:function(i,e){return ab(i,e,true)}});bI.fn.extend({data:function(b8,cb){var b7,b6,ca,b9=this[0],e=b9&&b9.attributes;if(b8===undefined){if(this.length){ca=bI.data(b9);if(b9.nodeType===1&&!bI._data(b9,"parsedAttrs")){b7=e.length;while(b7--){if(e[b7]){b6=e[b7].name;if(b6.indexOf("data-")===0){b6=bI.camelCase(b6.slice(5));bA(b9,b6,ca[b6])}}}bI._data(b9,"parsedAttrs",true)}}return ca}if(typeof b8==="object"){return this.each(function(){bI.data(this,b8)})}return arguments.length>1?this.each(function(){bI.data(this,b8,cb)}):b9?bA(b9,b8,bI.data(b9,b8)):undefined},removeData:function(e){return this.each(function(){bI.removeData(this,e)})}});bI.extend({queue:function(b6,i,b7){var e;if(b6){i=(i||"fx")+"queue";e=bI._data(b6,i);if(b7){if(!e||bI.isArray(b7)){e=bI._data(b6,i,bI.makeArray(b7))}else{e.push(b7)}}return e||[]}},dequeue:function(b9,b8){b8=b8||"fx";var i=bI.queue(b9,b8),ca=i.length,b7=i.shift(),e=bI._queueHooks(b9,b8),b6=function(){bI.dequeue(b9,b8)};if(b7==="inprogress"){b7=i.shift();ca--}if(b7){if(b8==="fx"){i.unshift("inprogress")}delete e.stop;b7.call(b9,b6,e)}if(!ca&&e){e.empty.fire()}},_queueHooks:function(b6,i){var e=i+"queueHooks";return bI._data(b6,e)||bI._data(b6,e,{empty:bI.Callbacks("once memory").add(function(){bI._removeData(b6,i+"queue");bI._removeData(b6,e)})})}});bI.fn.extend({queue:function(e,i){var b6=2;if(typeof e!=="string"){i=e;e="fx";b6--}if(arguments.length
    a";D.leadingWhitespace=b8.firstChild.nodeType===3;D.tbody=!b8.getElementsByTagName("tbody").length;D.htmlSerialize=!!b8.getElementsByTagName("link").length;D.html5Clone=n.createElement("nav").cloneNode(true).outerHTML!=="<:nav>";i.type="checkbox";i.checked=true;b6.appendChild(i);D.appendChecked=i.checked;b8.innerHTML="";D.noCloneChecked=!!b8.cloneNode(true).lastChild.defaultValue;b6.appendChild(b8);b8.innerHTML="";D.checkClone=b8.cloneNode(true).cloneNode(true).lastChild.checked;D.noCloneEvent=true;if(b8.attachEvent){b8.attachEvent("onclick",function(){D.noCloneEvent=false});b8.cloneNode(true).click()}if(D.deleteExpando==null){D.deleteExpando=true;try{delete b8.test}catch(b7){D.deleteExpando=false}}})();(function(){var b6,e,b7=n.createElement("div");for(b6 in {submit:true,change:true,focusin:true}){e="on"+b6;if(!(D[b6+"Bubbles"]=e in a5)){b7.setAttribute(e,"t");D[b6+"Bubbles"]=b7.attributes[e].expando===false}}b7=null})();var bG=/^(?:input|select|textarea)$/i,a6=/^key/,bM=/^(?:mouse|pointer|contextmenu)|click/,bC=/^(?:focusinfocus|focusoutblur)$/,bx=/^([^.]*)(?:\.(.+)|)$/;function U(){return true}function Z(){return false}function am(){try{return n.activeElement}catch(e){}}bI.event={global:{},add:function(b8,cd,ci,ca,b9){var cb,cj,ck,b6,cf,cc,ch,b7,cg,e,i,ce=bI._data(b8);if(!ce){return}if(ci.handler){b6=ci;ci=b6.handler;b9=b6.selector}if(!ci.guid){ci.guid=bI.guid++}if(!(cj=ce.events)){cj=ce.events={}}if(!(cc=ce.handle)){cc=ce.handle=function(cl){return typeof bI!==aC&&(!cl||bI.event.triggered!==cl.type)?bI.event.dispatch.apply(cc.elem,arguments):undefined};cc.elem=b8}cd=(cd||"").match(aF)||[""];ck=cd.length;while(ck--){cb=bx.exec(cd[ck])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){continue}cf=bI.event.special[cg]||{};cg=(b9?cf.delegateType:cf.bindType)||cg;cf=bI.event.special[cg]||{};ch=bI.extend({type:cg,origType:i,data:ca,handler:ci,guid:ci.guid,selector:b9,needsContext:b9&&bI.expr.match.needsContext.test(b9),namespace:e.join(".")},b6);if(!(b7=cj[cg])){b7=cj[cg]=[];b7.delegateCount=0;if(!cf.setup||cf.setup.call(b8,ca,e,cc)===false){if(b8.addEventListener){b8.addEventListener(cg,cc,false)}else{if(b8.attachEvent){b8.attachEvent("on"+cg,cc)}}}}if(cf.add){cf.add.call(b8,ch);if(!ch.handler.guid){ch.handler.guid=ci.guid}}if(b9){b7.splice(b7.delegateCount++,0,ch)}else{b7.push(ch)}bI.event.global[cg]=true}b8=null},remove:function(b7,cd,ck,b8,cc){var ca,ch,cb,b9,cj,ci,cf,b6,cg,e,i,ce=bI.hasData(b7)&&bI._data(b7);if(!ce||!(ci=ce.events)){return}cd=(cd||"").match(aF)||[""];cj=cd.length;while(cj--){cb=bx.exec(cd[cj])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){for(cg in ci){bI.event.remove(b7,cg+cd[cj],ck,b8,true)}continue}cf=bI.event.special[cg]||{};cg=(b8?cf.delegateType:cf.bindType)||cg;b6=ci[cg]||[];cb=cb[2]&&new RegExp("(^|\\.)"+e.join("\\.(?:.*\\.|)")+"(\\.|$)");b9=ca=b6.length;while(ca--){ch=b6[ca];if((cc||i===ch.origType)&&(!ck||ck.guid===ch.guid)&&(!cb||cb.test(ch.namespace))&&(!b8||b8===ch.selector||b8==="**"&&ch.selector)){b6.splice(ca,1);if(ch.selector){b6.delegateCount--}if(cf.remove){cf.remove.call(b7,ch)}}}if(b9&&!b6.length){if(!cf.teardown||cf.teardown.call(b7,e,ce.handle)===false){bI.removeEvent(b7,cg,ce.handle)}delete ci[cg]}}if(bI.isEmptyObject(ci)){delete ce.handle;bI._removeData(b7,"events")}},trigger:function(b6,cd,b9,ck){var ce,b8,ci,cj,cg,cc,cb,ca=[b9||n],ch=K.call(b6,"type")?b6.type:b6,b7=K.call(b6,"namespace")?b6.namespace.split("."):[];ci=cc=b9=b9||n;if(b9.nodeType===3||b9.nodeType===8){return}if(bC.test(ch+bI.event.triggered)){return}if(ch.indexOf(".")>=0){b7=ch.split(".");ch=b7.shift();b7.sort()}b8=ch.indexOf(":")<0&&"on"+ch;b6=b6[bI.expando]?b6:new bI.Event(ch,typeof b6==="object"&&b6);b6.isTrigger=ck?2:3;b6.namespace=b7.join(".");b6.namespace_re=b6.namespace?new RegExp("(^|\\.)"+b7.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;b6.result=undefined;if(!b6.target){b6.target=b9}cd=cd==null?[b6]:bI.makeArray(cd,[b6]);cg=bI.event.special[ch]||{};if(!ck&&cg.trigger&&cg.trigger.apply(b9,cd)===false){return}if(!ck&&!cg.noBubble&&!bI.isWindow(b9)){cj=cg.delegateType||ch;if(!bC.test(cj+ch)){ci=ci.parentNode}for(;ci;ci=ci.parentNode){ca.push(ci);cc=ci}if(cc===(b9.ownerDocument||n)){ca.push(cc.defaultView||cc.parentWindow||a5)}}cb=0;while((ci=ca[cb++])&&!b6.isPropagationStopped()){b6.type=cb>1?cj:cg.bindType||ch;ce=(bI._data(ci,"events")||{})[b6.type]&&bI._data(ci,"handle");if(ce){ce.apply(ci,cd)}ce=b8&&ci[b8];if(ce&&ce.apply&&bI.acceptData(ci)){b6.result=ce.apply(ci,cd);if(b6.result===false){b6.preventDefault()}}}b6.type=ch;if(!ck&&!b6.isDefaultPrevented()){if((!cg._default||cg._default.apply(ca.pop(),cd)===false)&&bI.acceptData(b9)){if(b8&&b9[ch]&&!bI.isWindow(b9)){cc=b9[b8];if(cc){b9[b8]=null}bI.event.triggered=ch;try{b9[ch]()}catch(cf){}bI.event.triggered=undefined;if(cc){b9[b8]=cc}}}}return b6.result},dispatch:function(e){e=bI.event.fix(e);var b9,ca,ce,b6,b8,cd=[],cc=P.call(arguments),b7=(bI._data(this,"events")||{})[e.type]||[],cb=bI.event.special[e.type]||{};cc[0]=e;e.delegateTarget=this;if(cb.preDispatch&&cb.preDispatch.call(this,e)===false){return}cd=bI.event.handlers.call(this,e,b7);b9=0;while((b6=cd[b9++])&&!e.isPropagationStopped()){e.currentTarget=b6.elem;b8=0;while((ce=b6.handlers[b8++])&&!e.isImmediatePropagationStopped()){if(!e.namespace_re||e.namespace_re.test(ce.namespace)){e.handleObj=ce;e.data=ce.data;ca=((bI.event.special[ce.origType]||{}).handle||ce.handler).apply(b6.elem,cc);if(ca!==undefined){if((e.result=ca)===false){e.preventDefault();e.stopPropagation()}}}}}if(cb.postDispatch){cb.postDispatch.call(this,e)}return e.result},handlers:function(e,b7){var b6,cc,ca,b9,cb=[],b8=b7.delegateCount,cd=e.target;if(b8&&cd.nodeType&&(!e.button||e.type!=="click")){for(;cd!=this;cd=cd.parentNode||this){if(cd.nodeType===1&&(cd.disabled!==true||e.type!=="click")){ca=[];for(b9=0;b9=0:bI.find(b6,this,null,[cd]).length}if(ca[b6]){ca.push(cc)}}if(ca.length){cb.push({elem:cd,handlers:ca})}}}}if(b8]","i"),b5=/^\s+/,aH=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,o=/<([\w:]+)/,b0=/\s*$/g,W={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:D.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},aT=B(n),k=aT.appendChild(n.createElement("div"));W.optgroup=W.option;W.tbody=W.tfoot=W.colgroup=W.caption=W.thead;W.th=W.td;function l(b8,e){var b6,b9,b7=0,ca=typeof b8.getElementsByTagName!==aC?b8.getElementsByTagName(e||"*"):typeof b8.querySelectorAll!==aC?b8.querySelectorAll(e||"*"):undefined;if(!ca){for(ca=[],b6=b8.childNodes||b8;(b9=b6[b7])!=null;b7++){if(!e||bI.nodeName(b9,e)){ca.push(b9)}else{bI.merge(ca,l(b9,e))}}}return e===undefined||e&&bI.nodeName(b8,e)?bI.merge([b8],ca):ca}function bY(e){if(aM.test(e.type)){e.defaultChecked=e.checked}}function a3(i,e){return bI.nodeName(i,"table")&&bI.nodeName(e.nodeType!==11?e:e.firstChild,"tr")?i.getElementsByTagName("tbody")[0]||i.appendChild(i.ownerDocument.createElement("tbody")):i}function u(e){e.type=(bI.find.attr(e,"type")!==null)+"/"+e.type;return e}function bf(i){var e=ar.exec(i.type);if(e){i.type=e[1]}else{i.removeAttribute("type")}return i}function bu(e,b7){var b8,b6=0;for(;(b8=e[b6])!=null;b6++){bI._data(b8,"globalEval",!b7||bI._data(b7[b6],"globalEval"))}}function at(cc,b6){if(b6.nodeType!==1||!bI.hasData(cc)){return}var b9,b8,e,cb=bI._data(cc),ca=bI._data(b6,cb),b7=cb.events;if(b7){delete ca.handle;ca.events={};for(b9 in b7){for(b8=0,e=b7[b9].length;b8")){cd=b6.cloneNode(true)}else{k.innerHTML=b6.outerHTML;k.removeChild(cd=k.firstChild)}if((!D.noCloneEvent||!D.noCloneChecked)&&(b6.nodeType===1||b6.nodeType===11)&&!bI.isXMLDoc(b6)){ca=l(cd);cb=l(b6);for(b9=0;(b7=cb[b9])!=null;++b9){if(ca[b9]){T(b7,ca[b9])}}}if(b8){if(e){cb=cb||l(b6);ca=ca||l(cd);for(b9=0;(b7=cb[b9])!=null;b9++){at(b7,ca[b9])}}else{at(b6,cd)}}ca=l(cd,"script");if(ca.length>0){bu(ca,!cc&&l(b6,"script"))}ca=cb=b7=null;return cd},buildFragment:function(b6,b8,cd,ci){var ce,ca,cc,ch,cj,cg,b7,cb=b6.length,b9=B(b8),e=[],cf=0;for(;cf")+b7[2];ce=b7[0];while(ce--){ch=ch.lastChild}if(!D.leadingWhitespace&&b5.test(ca)){e.push(b8.createTextNode(b5.exec(ca)[0]))}if(!D.tbody){ca=cj==="table"&&!b0.test(ca)?ch.firstChild:b7[1]===""&&!b0.test(ca)?ch:0;ce=ca&&ca.childNodes.length;while(ce--){if(bI.nodeName((cg=ca.childNodes[ce]),"tbody")&&!cg.childNodes.length){ca.removeChild(cg)}}}bI.merge(e,ch.childNodes);ch.textContent="";while(ch.firstChild){ch.removeChild(ch.firstChild)}ch=b9.lastChild}}}}if(ch){b9.removeChild(ch)}if(!D.appendChecked){bI.grep(l(e,"input"),bY)}cf=0;while((ca=e[cf++])){if(ci&&bI.inArray(ca,ci)!==-1){continue}cc=bI.contains(ca.ownerDocument,ca);ch=l(b9.appendChild(ca),"script");if(cc){bu(ch)}if(cd){ce=0;while((ca=ch[ce++])){if(bB.test(ca.type||"")){cd.push(ca)}}}}ch=null;return b9},cleanData:function(b6,ce){var b8,cd,b7,b9,ca=0,cf=bI.expando,e=bI.cache,cb=D.deleteExpando,cc=bI.event.special;for(;(b8=b6[ca])!=null;ca++){if(ce||bI.acceptData(b8)){b7=b8[cf];b9=b7&&e[b7];if(b9){if(b9.events){for(cd in b9.events){if(cc[cd]){bI.event.remove(b8,cd)}else{bI.removeEvent(b8,cd,b9.handle)}}}if(e[b7]){delete e[b7];if(cb){delete b8[cf]}else{if(typeof b8.removeAttribute!==aC){b8.removeAttribute(cf)}else{b8[cf]=null}}aP.push(b7)}}}}}});bI.fn.extend({text:function(e){return aB(this,function(i){return i===undefined?bI.text(this):this.empty().append((this[0]&&this[0].ownerDocument||n).createTextNode(i))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.insertBefore(e,i.firstChild)}})},before:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this)}})},after:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this.nextSibling)}})},remove:function(e,b9){var b8,b6=e?bI.filter(e,this):this,b7=0;for(;(b8=b6[b7])!=null;b7++){if(!b9&&b8.nodeType===1){bI.cleanData(l(b8))}if(b8.parentNode){if(b9&&bI.contains(b8.ownerDocument,b8)){bu(l(b8,"script"))}b8.parentNode.removeChild(b8)}}return this},empty:function(){var b6,e=0;for(;(b6=this[e])!=null;e++){if(b6.nodeType===1){bI.cleanData(l(b6,false))}while(b6.firstChild){b6.removeChild(b6.firstChild)}if(b6.options&&bI.nodeName(b6,"select")){b6.options.length=0}}return this},clone:function(i,e){i=i==null?false:i;e=e==null?i:e;return this.map(function(){return bI.clone(this,i,e)})},html:function(e){return aB(this,function(b9){var b8=this[0]||{},b7=0,b6=this.length;if(b9===undefined){return b8.nodeType===1?b8.innerHTML.replace(aD,""):undefined}if(typeof b9==="string"&&!an.test(b9)&&(D.htmlSerialize||!M.test(b9))&&(D.leadingWhitespace||!b5.test(b9))&&!W[(o.exec(b9)||["",""])[1].toLowerCase()]){b9=b9.replace(aH,"<$1>");try{for(;b71&&typeof ce==="string"&&!D.checkClone&&bW.test(ce))){return this.each(function(cj){var i=cf.eq(cj);if(b6){cd[0]=ce.call(this,cj,i.html())}i.domManip(cd,ci)})}if(b8){cc=bI.buildFragment(cd,this[0].ownerDocument,false,this);cb=cc.firstChild;if(cc.childNodes.length===1){cc=cb}if(cb){b9=bI.map(l(cc,"script"),u);e=b9.length;for(;ca")).appendTo(i.documentElement);i=(aI[0].contentWindow||aI[0].contentDocument).document;i.write();i.close();e=a4(b6,i);aI.detach()}bl[b6]=e}return e}(function(){var e;D.shrinkWrapBlocks=function(){if(e!=null){return e}e=false;var b7,i,b6;i=n.getElementsByTagName("body")[0];if(!i||!i.style){return}b7=n.createElement("div");b6=n.createElement("div");b6.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";i.appendChild(b6).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1";b7.appendChild(n.createElement("div")).style.width="5px";e=b7.offsetWidth!==3}i.removeChild(b6);return e}})();var aZ=(/^margin/);var Y=new RegExp("^("+aE+")(?!px)[a-z%]+$","i");var bq,G,bo=/^(top|right|bottom|left)$/;if(a5.getComputedStyle){bq=function(e){if(e.ownerDocument.defaultView.opener){return e.ownerDocument.defaultView.getComputedStyle(e,null)}return a5.getComputedStyle(e,null)};G=function(cb,i,ca){var b8,b7,b9,e,b6=cb.style;ca=ca||bq(cb);e=ca?ca.getPropertyValue(i)||ca[i]:undefined;if(ca){if(e===""&&!bI.contains(cb.ownerDocument,cb)){e=bI.style(cb,i)}if(Y.test(e)&&aZ.test(i)){b8=b6.width;b7=b6.minWidth;b9=b6.maxWidth;b6.minWidth=b6.maxWidth=b6.width=e;e=ca.width;b6.width=b8;b6.minWidth=b7;b6.maxWidth=b9}}return e===undefined?e:e+""}}else{if(n.documentElement.currentStyle){bq=function(e){return e.currentStyle};G=function(ca,b7,b9){var cb,i,e,b6,b8=ca.style;b9=b9||bq(ca);b6=b9?b9[b7]:undefined;if(b6==null&&b8&&b8[b7]){b6=b8[b7]}if(Y.test(b6)&&!bo.test(b7)){cb=b8.left;i=ca.runtimeStyle;e=i&&i.left;if(e){i.left=ca.currentStyle.left}b8.left=b7==="fontSize"?"1em":b6;b6=b8.pixelLeft+"px";b8.left=cb;if(e){i.left=e}}return b6===undefined?b6:b6+""||"auto"}}}function a7(e,i){return{get:function(){var b6=e();if(b6==null){return}if(b6){delete this.get;return}return(this.get=i).apply(this,arguments)}}}(function(){var cb,b9,b7,ca,b6,b8,i;cb=n.createElement("div");cb.innerHTML="
    a";b7=cb.getElementsByTagName("a")[0];b9=b7&&b7.style;if(!b9){return}b9.cssText="float:left;opacity:.5";D.opacity=b9.opacity==="0.5";D.cssFloat=!!b9.cssFloat;cb.style.backgroundClip="content-box";cb.cloneNode(true).style.backgroundClip="";D.clearCloneStyle=cb.style.backgroundClip==="content-box";D.boxSizing=b9.boxSizing===""||b9.MozBoxSizing===""||b9.WebkitBoxSizing==="";bI.extend(D,{reliableHiddenOffsets:function(){if(b8==null){e()}return b8},boxSizingReliable:function(){if(b6==null){e()}return b6},pixelPosition:function(){if(ca==null){e()}return ca},reliableMarginRight:function(){if(i==null){e()}return i}});function e(){var cf,cc,cd,ce;cc=n.getElementsByTagName("body")[0];if(!cc||!cc.style){return}cf=n.createElement("div");cd=n.createElement("div");cd.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";cc.appendChild(cd).appendChild(cf);cf.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute";ca=b6=false;i=true;if(a5.getComputedStyle){ca=(a5.getComputedStyle(cf,null)||{}).top!=="1%";b6=(a5.getComputedStyle(cf,null)||{width:"4px"}).width==="4px";ce=cf.appendChild(n.createElement("div"));ce.style.cssText=cf.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0";ce.style.marginRight=ce.style.width="0";cf.style.width="1px";i=!parseFloat((a5.getComputedStyle(ce,null)||{}).marginRight);cf.removeChild(ce)}cf.innerHTML="
    t
    ";ce=cf.getElementsByTagName("td");ce[0].style.cssText="margin:0;border:0;padding:0;display:none";b8=ce[0].offsetHeight===0;if(b8){ce[0].style.display="";ce[1].style.display="none";b8=ce[0].offsetHeight===0}cc.removeChild(cd)}})();bI.swap=function(b9,b8,ca,b7){var b6,i,e={};for(i in b8){e[i]=b9.style[i];b9.style[i]=b8[i]}b6=ca.apply(b9,b7||[]);for(i in b8){b9.style[i]=e[i]}return b6};var bj=/alpha\([^)]*\)/i,aU=/opacity\s*=\s*([^)]*)/,H=/^(none|table(?!-c[ea]).+)/,bb=new RegExp("^("+aE+")(.*)$","i"),V=new RegExp("^([+-])=("+aE+")","i"),be={position:"absolute",visibility:"hidden",display:"block"},bD={letterSpacing:"0",fontWeight:"400"},aw=["Webkit","O","Moz","ms"];function c(b8,b6){if(b6 in b8){return b6}var b9=b6.charAt(0).toUpperCase()+b6.slice(1),e=b6,b7=aw.length;while(b7--){b6=aw[b7]+b9;if(b6 in b8){return b6}}return e}function s(ca,e){var cb,b8,b9,i=[],b6=0,b7=ca.length;for(;b6=1||b9==="")&&bI.trim(b6.replace(bj,""))===""&&b7.removeAttribute){b7.removeAttribute("filter");if(b9===""||i&&!i.filter){return}}b7.filter=bj.test(b6)?b6.replace(bj,e):b6+" "+e}}}bI.cssHooks.marginRight=a7(D.reliableMarginRight,function(i,e){if(e){return bI.swap(i,{display:"inline-block"},G,[i,"marginRight"])}});bI.each({margin:"",padding:"",border:"Width"},function(e,i){bI.cssHooks[e+i]={expand:function(b8){var b7=0,b6={},b9=typeof b8==="string"?b8.split(" "):[b8];for(;b7<4;b7++){b6[e+bT[b7]+i]=b9[b7]||b9[b7-2]||b9[0]}return b6}};if(!aZ.test(e)){bI.cssHooks[e+i].set=aN}});bI.fn.extend({css:function(e,i){return aB(this,function(ca,b7,cb){var b9,b6,cc={},b8=0;if(bI.isArray(b7)){b9=bq(ca);b6=b7.length;for(;b81)},show:function(){return s(this,true)},hide:function(){return s(this)},toggle:function(e){if(typeof e==="boolean"){return e?this.show():this.hide()}return this.each(function(){if(S(this)){bI(this).show()}else{bI(this).hide()}})}});function J(b6,i,b8,e,b7){return new J.prototype.init(b6,i,b8,e,b7)}bI.Tween=J;J.prototype={constructor:J,init:function(b7,i,b9,e,b8,b6){this.elem=b7;this.prop=b9;this.easing=b8||"swing";this.options=i;this.start=this.now=this.cur();this.end=e;this.unit=b6||(bI.cssNumber[b9]?"":"px")},cur:function(){var e=J.propHooks[this.prop];return e&&e.get?e.get(this):J.propHooks._default.get(this)},run:function(b6){var i,e=J.propHooks[this.prop];if(this.options.duration){this.pos=i=bI.easing[this.easing](b6,this.options.duration*b6,0,1,this.options.duration)}else{this.pos=i=b6}this.now=(this.end-this.start)*i+this.start;if(this.options.step){this.options.step.call(this.elem,this.now,this)}if(e&&e.set){e.set(this)}else{J.propHooks._default.set(this)}return this}};J.prototype.init.prototype=J.prototype;J.propHooks={_default:{get:function(i){var e;if(i.elem[i.prop]!=null&&(!i.elem.style||i.elem.style[i.prop]==null)){return i.elem[i.prop]}e=bI.css(i.elem,i.prop,"");return !e||e==="auto"?0:e},set:function(e){if(bI.fx.step[e.prop]){bI.fx.step[e.prop](e)}else{if(e.elem.style&&(e.elem.style[bI.cssProps[e.prop]]!=null||bI.cssHooks[e.prop])){bI.style(e.elem,e.prop,e.now+e.unit)}else{e.elem[e.prop]=e.now}}}}};J.propHooks.scrollTop=J.propHooks.scrollLeft={set:function(e){if(e.elem.nodeType&&e.elem.parentNode){e.elem[e.prop]=e.now}}};bI.easing={linear:function(e){return e},swing:function(e){return 0.5-Math.cos(e*Math.PI)/2}};bI.fx=J.prototype.init;bI.fx.step={};var N,ae,bR=/^(?:toggle|show|hide)$/,bJ=new RegExp("^(?:([+-])=|)("+aE+")([a-z%]*)$","i"),bP=/queueHooks$/,aG=[h],a2={"*":[function(e,ca){var cc=this.createTween(e,ca),b8=cc.cur(),b7=bJ.exec(ca),cb=b7&&b7[3]||(bI.cssNumber[e]?"":"px"),i=(bI.cssNumber[e]||cb!=="px"&&+b8)&&bJ.exec(bI.css(cc.elem,e)),b6=1,b9=20;if(i&&i[3]!==cb){cb=cb||i[3];b7=b7||[];i=+b8||1;do{b6=b6||".5";i=i/b6;bI.style(cc.elem,e,i+cb)}while(b6!==(b6=cc.cur()/b8)&&b6!==1&&--b9)}if(b7){i=cc.start=+i||+b8||0;cc.unit=cb;cc.end=b7[1]?i+(b7[1]+1)*b7[2]:+b7[2]}return cc}]};function bn(){setTimeout(function(){N=undefined});return(N=bI.now())}function bH(b7,b9){var b8,e={height:b7},b6=0;b9=b9?1:0;for(;b6<4;b6+=2-b9){b8=bT[b6];e["margin"+b8]=e["padding"+b8]=b7}if(b9){e.opacity=e.width=b7}return e}function bd(b8,ca,b7){var i,b9=(a2[ca]||[]).concat(a2["*"]),e=0,b6=b9.length;for(;e
    a";i=b8.getElementsByTagName("a")[0];e=n.createElement("select");b7=e.appendChild(n.createElement("option"));b6=b8.getElementsByTagName("input")[0];i.style.cssText="top:1px";D.getSetAttribute=b8.className!=="t";D.style=/top/.test(i.getAttribute("style"));D.hrefNormalized=i.getAttribute("href")==="/a";D.checkOn=!!b6.value;D.optSelected=b7.selected;D.enctype=!!n.createElement("form").enctype;e.disabled=true;D.optDisabled=!b7.disabled;b6=n.createElement("input");b6.setAttribute("value","");D.input=b6.getAttribute("value")==="";b6.value="t";b6.setAttribute("type","radio");D.radioValue=b6.value==="t"})();var al=/\r/g;bI.fn.extend({val:function(b7){var e,i,b8,b6=this[0];if(!arguments.length){if(b6){e=bI.valHooks[b6.type]||bI.valHooks[b6.nodeName.toLowerCase()];if(e&&"get" in e&&(i=e.get(b6,"value"))!==undefined){return i}i=b6.value;return typeof i==="string"?i.replace(al,""):i==null?"":i}return}b8=bI.isFunction(b7);return this.each(function(b9){var ca;if(this.nodeType!==1){return}if(b8){ca=b7.call(this,b9,bI(this).val())}else{ca=b7}if(ca==null){ca=""}else{if(typeof ca==="number"){ca+=""}else{if(bI.isArray(ca)){ca=bI.map(ca,function(cb){return cb==null?"":cb+""})}}}e=bI.valHooks[this.type]||bI.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,ca,"value")===undefined){this.value=ca}})}});bI.extend({valHooks:{option:{get:function(e){var i=bI.find.attr(e,"value");return i!=null?i:bI.trim(bI.text(e))}},select:{get:function(e){var cb,b7,cd=e.options,b9=e.selectedIndex,b8=e.type==="select-one"||b9<0,cc=b8?null:[],ca=b8?b9+1:cd.length,b6=b9<0?ca:b8?b9:0;for(;b6=0){try{b9.selected=cc=true}catch(b6){b9.scrollHeight}}else{b9.selected=false}}if(!cc){ca.selectedIndex=-1}return b7}}}});bI.each(["radio","checkbox"],function(){bI.valHooks[this]={set:function(e,i){if(bI.isArray(i)){return(e.checked=bI.inArray(bI(e).val(),i)>=0)}}};if(!D.checkOn){bI.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value}}});var ba,b3,bO=bI.expr.attrHandle,aq=/^(?:checked|selected)$/i,bN=D.getSetAttribute,bF=D.input;bI.fn.extend({attr:function(e,i){return aB(this,bI.attr,e,i,arguments.length>1)},removeAttr:function(e){return this.each(function(){bI.removeAttr(this,e)})}});bI.extend({attr:function(b8,b7,b9){var e,b6,i=b8.nodeType;if(!b8||i===3||i===8||i===2){return}if(typeof b8.getAttribute===aC){return bI.prop(b8,b7,b9)}if(i!==1||!bI.isXMLDoc(b8)){b7=b7.toLowerCase();e=bI.attrHooks[b7]||(bI.expr.match.bool.test(b7)?b3:ba)}if(b9!==undefined){if(b9===null){bI.removeAttr(b8,b7)}else{if(e&&"set" in e&&(b6=e.set(b8,b9,b7))!==undefined){return b6}else{b8.setAttribute(b7,b9+"");return b9}}}else{if(e&&"get" in e&&(b6=e.get(b8,b7))!==null){return b6}else{b6=bI.find.attr(b8,b7);return b6==null?undefined:b6}}},removeAttr:function(b7,b9){var e,b8,b6=0,ca=b9&&b9.match(aF);if(ca&&b7.nodeType===1){while((e=ca[b6++])){b8=bI.propFix[e]||e;if(bI.expr.match.bool.test(e)){if(bF&&bN||!aq.test(e)){b7[b8]=false}else{b7[bI.camelCase("default-"+e)]=b7[b8]=false}}else{bI.attr(b7,e,"")}b7.removeAttribute(bN?e:b8)}}},attrHooks:{type:{set:function(e,i){if(!D.radioValue&&i==="radio"&&bI.nodeName(e,"input")){var b6=e.value;e.setAttribute("type",i);if(b6){e.value=b6}return i}}}}});b3={set:function(i,b6,e){if(b6===false){bI.removeAttr(i,e)}else{if(bF&&bN||!aq.test(e)){i.setAttribute(!bN&&bI.propFix[e]||e,e)}else{i[bI.camelCase("default-"+e)]=i[e]=true}}return e}};bI.each(bI.expr.match.bool.source.match(/\w+/g),function(b7,b6){var e=bO[b6]||bI.find.attr;bO[b6]=bF&&bN||!aq.test(b6)?function(b9,b8,cb){var i,ca;if(!cb){ca=bO[b8];bO[b8]=i;i=e(b9,b8,cb)!=null?b8.toLowerCase():null;bO[b8]=ca}return i}:function(b8,i,b9){if(!b9){return b8[bI.camelCase("default-"+i)]?i.toLowerCase():null}}});if(!bF||!bN){bI.attrHooks.value={set:function(i,b6,e){if(bI.nodeName(i,"input")){i.defaultValue=b6}else{return ba&&ba.set(i,b6,e)}}}}if(!bN){ba={set:function(b6,b7,i){var e=b6.getAttributeNode(i);if(!e){b6.setAttributeNode((e=b6.ownerDocument.createAttribute(i)))}e.value=b7+="";if(i==="value"||b7===b6.getAttribute(i)){return b7}}};bO.id=bO.name=bO.coords=function(b6,i,b7){var e;if(!b7){return(e=b6.getAttributeNode(i))&&e.value!==""?e.value:null}};bI.valHooks.button={get:function(b6,i){var e=b6.getAttributeNode(i);if(e&&e.specified){return e.value}},set:ba.set};bI.attrHooks.contenteditable={set:function(i,b6,e){ba.set(i,b6===""?false:b6,e)}};bI.each(["width","height"],function(b6,e){bI.attrHooks[e]={set:function(i,b7){if(b7===""){i.setAttribute(e,"auto");return b7}}}})}if(!D.style){bI.attrHooks.style={get:function(e){return e.style.cssText||undefined},set:function(e,i){return(e.style.cssText=i+"")}}}var aJ=/^(?:input|select|textarea|button|object)$/i,F=/^(?:a|area)$/i;bI.fn.extend({prop:function(e,i){return aB(this,bI.prop,e,i,arguments.length>1)},removeProp:function(e){e=bI.propFix[e]||e;return this.each(function(){try{this[e]=undefined;delete this[e]}catch(i){}})}});bI.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(b9,b7,ca){var b6,e,b8,i=b9.nodeType;if(!b9||i===3||i===8||i===2){return}b8=i!==1||!bI.isXMLDoc(b9);if(b8){b7=bI.propFix[b7]||b7;e=bI.propHooks[b7]}if(ca!==undefined){return e&&"set" in e&&(b6=e.set(b9,ca,b7))!==undefined?b6:(b9[b7]=ca)}else{return e&&"get" in e&&(b6=e.get(b9,b7))!==null?b6:b9[b7]}},propHooks:{tabIndex:{get:function(i){var e=bI.find.attr(i,"tabindex");return e?parseInt(e,10):aJ.test(i.nodeName)||F.test(i.nodeName)&&i.href?0:-1}}}});if(!D.hrefNormalized){bI.each(["href","src"],function(b6,e){bI.propHooks[e]={get:function(i){return i.getAttribute(e,4)}}})}if(!D.optSelected){bI.propHooks.selected={get:function(i){var e=i.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}}}bI.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){bI.propFix[this.toLowerCase()]=this});if(!D.enctype){bI.propFix.enctype="encoding"}var bL=/[\t\r\n\f]/g;bI.fn.extend({addClass:function(cd){var b7,b6,ce,cb,b8,e,b9=0,ca=this.length,cc=typeof cd==="string"&&cd;if(bI.isFunction(cd)){return this.each(function(i){bI(this).addClass(cd.call(this,i,this.className))})}if(cc){b7=(cd||"").match(aF)||[];for(;b9=0){ce=ce.replace(" "+cb+" "," ")}}e=cd?bI.trim(ce):"";if(b6.className!==e){b6.className=e}}}}return this},toggleClass:function(b6,e){var i=typeof b6;if(typeof e==="boolean"&&i==="string"){return e?this.addClass(b6):this.removeClass(b6)}if(bI.isFunction(b6)){return this.each(function(b7){bI(this).toggleClass(b6.call(this,b7,this.className,e),e)})}return this.each(function(){if(i==="string"){var b9,b8=0,b7=bI(this),ca=b6.match(aF)||[];while((b9=ca[b8++])){if(b7.hasClass(b9)){b7.removeClass(b9)}else{b7.addClass(b9)}}}else{if(i===aC||i==="boolean"){if(this.className){bI._data(this,"__className__",this.className)}this.className=this.className||b6===false?"":bI._data(this,"__className__")||""}}})},hasClass:function(e){var b8=" "+e+" ",b7=0,b6=this.length;for(;b7=0){return true}}return false}});bI.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(b6,e){bI.fn[e]=function(b7,i){return arguments.length>0?this.on(e,null,b7,i):this.trigger(e)}});bI.fn.extend({hover:function(e,i){return this.mouseenter(e).mouseleave(i||e)},bind:function(e,b6,i){return this.on(e,null,b6,i)},unbind:function(e,i){return this.off(e,null,i)},delegate:function(e,i,b7,b6){return this.on(i,e,b7,b6)},undelegate:function(e,i,b6){return arguments.length===1?this.off(e,"**"):this.off(i,e||"**",b6)}});var bp=bI.now();var bQ=(/\?/);var a1=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;bI.parseJSON=function(e){if(a5.JSON&&a5.JSON.parse){return a5.JSON.parse(e+"")}var b7,b6=null,i=bI.trim(e+"");return i&&!bI.trim(i.replace(a1,function(ca,b8,b9,cb){if(b7&&b8){b6=0}if(b6===0){return ca}b7=b9||b8;b6+=!cb-!b9;return""}))?(Function("return "+i))():bI.error("Invalid JSON: "+e)};bI.parseXML=function(b7){var i,b6;if(!b7||typeof b7!=="string"){return null}try{if(a5.DOMParser){b6=new DOMParser();i=b6.parseFromString(b7,"text/xml")}else{i=new ActiveXObject("Microsoft.XMLDOM");i.async="false";i.loadXML(b7)}}catch(b8){i=undefined}if(!i||!i.documentElement||i.getElementsByTagName("parsererror").length){bI.error("Invalid XML: "+b7)}return i};var b4,aa,ap=/#.*$/,R=/([?&])_=[^&]*/,ah=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,C=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,r=/^(?:GET|HEAD)$/,aK=/^\/\//,aV=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,w={},a9={},aX="*/".concat("*");try{aa=location.href}catch(bi){aa=n.createElement("a");aa.href="";aa=aa.href}b4=aV.exec(aa.toLowerCase())||[];function bK(e){return function(b9,ca){if(typeof b9!=="string"){ca=b9;b9="*"}var b6,b7=0,b8=b9.toLowerCase().match(aF)||[];if(bI.isFunction(ca)){while((b6=b8[b7++])){if(b6.charAt(0)==="+"){b6=b6.slice(1)||"*";(e[b6]=e[b6]||[]).unshift(ca)}else{(e[b6]=e[b6]||[]).push(ca)}}}}}function p(e,b6,ca,b7){var i={},b8=(e===a9);function b9(cb){var cc;i[cb]=true;bI.each(e[cb]||[],function(ce,cd){var cf=cd(b6,ca,b7);if(typeof cf==="string"&&!b8&&!i[cf]){b6.dataTypes.unshift(cf);b9(cf);return false}else{if(b8){return !(cc=cf)}}});return cc}return b9(b6.dataTypes[0])||!i["*"]&&b9("*")}function t(b6,b7){var e,i,b8=bI.ajaxSettings.flatOptions||{};for(i in b7){if(b7[i]!==undefined){(b8[i]?b6:(e||(e={})))[i]=b7[i]}}if(e){bI.extend(true,b6,e)}return b6}function g(cc,cb,b8){var e,b7,b6,b9,i=cc.contents,ca=cc.dataTypes;while(ca[0]==="*"){ca.shift();if(b7===undefined){b7=cc.mimeType||cb.getResponseHeader("Content-Type")}}if(b7){for(b9 in i){if(i[b9]&&i[b9].test(b7)){ca.unshift(b9);break}}}if(ca[0] in b8){b6=ca[0]}else{for(b9 in b8){if(!ca[0]||cc.converters[b9+" "+ca[0]]){b6=b9;break}if(!e){e=b9}}b6=b6||e}if(b6){if(b6!==ca[0]){ca.unshift(b6)}return b8[b6]}}function ag(cg,b8,cd,b6){var i,cb,ce,b9,b7,cf={},cc=cg.dataTypes.slice();if(cc[1]){for(ce in cg.converters){cf[ce.toLowerCase()]=cg.converters[ce]}}cb=cc.shift();while(cb){if(cg.responseFields[cb]){cd[cg.responseFields[cb]]=b8}if(!b7&&b6&&cg.dataFilter){b8=cg.dataFilter(b8,cg.dataType)}b7=cb;cb=cc.shift();if(cb){if(cb==="*"){cb=b7}else{if(b7!=="*"&&b7!==cb){ce=cf[b7+" "+cb]||cf["* "+cb];if(!ce){for(i in cf){b9=i.split(" ");if(b9[1]===cb){ce=cf[b7+" "+b9[0]]||cf["* "+b9[0]];if(ce){if(ce===true){ce=cf[i]}else{if(cf[i]!==true){cb=b9[0];cc.unshift(b9[1])}}break}}}}if(ce!==true){if(ce&&cg["throws"]){b8=ce(b8)}else{try{b8=ce(b8)}catch(ca){return{state:"parsererror",error:ce?ca:"No conversion from "+b7+" to "+cb}}}}}}}}return{state:"success",data:b8}}bI.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:aa,type:"GET",isLocal:C.test(b4[1]),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":aX,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":bI.parseJSON,"text xml":bI.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(i,e){return e?t(t(i,bI.ajaxSettings),e):t(bI.ajaxSettings,i)},ajaxPrefilter:bK(w),ajaxTransport:bK(a9),ajax:function(ca,b7){if(typeof ca==="object"){b7=ca;ca=undefined}b7=b7||{};var cj,cl,cb,cq,cf,b6,cm,b8,ce=bI.ajaxSetup({},b7),cs=ce.context||ce,ch=ce.context&&(cs.nodeType||cs.jquery)?bI(cs):bI.event,cr=bI.Deferred(),co=bI.Callbacks("once memory"),cc=ce.statusCode||{},ci={},cp={},b9=0,cd="canceled",ck={readyState:0,getResponseHeader:function(i){var e;if(b9===2){if(!b8){b8={};while((e=ah.exec(cq))){b8[e[1].toLowerCase()]=e[2]}}e=b8[i.toLowerCase()]}return e==null?null:e},getAllResponseHeaders:function(){return b9===2?cq:null},setRequestHeader:function(i,ct){var e=i.toLowerCase();if(!b9){i=cp[e]=cp[e]||i;ci[i]=ct}return this},overrideMimeType:function(e){if(!b9){ce.mimeType=e}return this},statusCode:function(i){var e;if(i){if(b9<2){for(e in i){cc[e]=[cc[e],i[e]]}}else{ck.always(i[ck.status])}}return this},abort:function(i){var e=i||cd;if(cm){cm.abort(e)}cg(0,e);return this}};cr.promise(ck).complete=co.add;ck.success=ck.done;ck.error=ck.fail;ce.url=((ca||ce.url||aa)+"").replace(ap,"").replace(aK,b4[1]+"//");ce.type=b7.method||b7.type||ce.method||ce.type;ce.dataTypes=bI.trim(ce.dataType||"*").toLowerCase().match(aF)||[""];if(ce.crossDomain==null){cj=aV.exec(ce.url.toLowerCase());ce.crossDomain=!!(cj&&(cj[1]!==b4[1]||cj[2]!==b4[2]||(cj[3]||(cj[1]==="http:"?"80":"443"))!==(b4[3]||(b4[1]==="http:"?"80":"443"))))}if(ce.data&&ce.processData&&typeof ce.data!=="string"){ce.data=bI.param(ce.data,ce.traditional)}p(w,ce,b7,ck);if(b9===2){return ck}b6=bI.event&&ce.global;if(b6&&bI.active++===0){bI.event.trigger("ajaxStart")}ce.type=ce.type.toUpperCase();ce.hasContent=!r.test(ce.type);cb=ce.url;if(!ce.hasContent){if(ce.data){cb=(ce.url+=(bQ.test(cb)?"&":"?")+ce.data);delete ce.data}if(ce.cache===false){ce.url=R.test(cb)?cb.replace(R,"$1_="+bp++):cb+(bQ.test(cb)?"&":"?")+"_="+bp++}}if(ce.ifModified){if(bI.lastModified[cb]){ck.setRequestHeader("If-Modified-Since",bI.lastModified[cb])}if(bI.etag[cb]){ck.setRequestHeader("If-None-Match",bI.etag[cb])}}if(ce.data&&ce.hasContent&&ce.contentType!==false||b7.contentType){ck.setRequestHeader("Content-Type",ce.contentType)}ck.setRequestHeader("Accept",ce.dataTypes[0]&&ce.accepts[ce.dataTypes[0]]?ce.accepts[ce.dataTypes[0]]+(ce.dataTypes[0]!=="*"?", "+aX+"; q=0.01":""):ce.accepts["*"]);for(cl in ce.headers){ck.setRequestHeader(cl,ce.headers[cl])}if(ce.beforeSend&&(ce.beforeSend.call(cs,ck,ce)===false||b9===2)){return ck.abort()}cd="abort";for(cl in {success:1,error:1,complete:1}){ck[cl](ce[cl])}cm=p(a9,ce,b7,ck);if(!cm){cg(-1,"No Transport")}else{ck.readyState=1;if(b6){ch.trigger("ajaxSend",[ck,ce])}if(ce.async&&ce.timeout>0){cf=setTimeout(function(){ck.abort("timeout")},ce.timeout)}try{b9=1;cm.send(ci,cg)}catch(cn){if(b9<2){cg(-1,cn)}else{throw cn}}}function cg(cw,i,cx,cu){var e,cA,cy,cv,cz,ct=i;if(b9===2){return}b9=2;if(cf){clearTimeout(cf)}cm=undefined;cq=cu||"";ck.readyState=cw>0?4:0;e=cw>=200&&cw<300||cw===304;if(cx){cv=g(ce,ck,cx)}cv=ag(ce,cv,ck,e);if(e){if(ce.ifModified){cz=ck.getResponseHeader("Last-Modified");if(cz){bI.lastModified[cb]=cz}cz=ck.getResponseHeader("etag");if(cz){bI.etag[cb]=cz}}if(cw===204||ce.type==="HEAD"){ct="nocontent"}else{if(cw===304){ct="notmodified"}else{ct=cv.state;cA=cv.data;cy=cv.error;e=!cy}}}else{cy=ct;if(cw||!ct){ct="error";if(cw<0){cw=0}}}ck.status=cw;ck.statusText=(i||ct)+"";if(e){cr.resolveWith(cs,[cA,ct,ck])}else{cr.rejectWith(cs,[ck,ct,cy])}ck.statusCode(cc);cc=undefined;if(b6){ch.trigger(e?"ajaxSuccess":"ajaxError",[ck,ce,e?cA:cy])}co.fireWith(cs,[ck,ct]);if(b6){ch.trigger("ajaxComplete",[ck,ce]);if(!(--bI.active)){bI.event.trigger("ajaxStop")}}}return ck},getJSON:function(e,i,b6){return bI.get(e,i,b6,"json")},getScript:function(e,i){return bI.get(e,undefined,i,"script")}});bI.each(["get","post"],function(e,b6){bI[b6]=function(i,b8,b9,b7){if(bI.isFunction(b8)){b7=b7||b9;b9=b8;b8=undefined}return bI.ajax({url:i,type:b6,dataType:b7,data:b8,success:b9})}});bI._evalUrl=function(e){return bI.ajax({url:e,type:"GET",dataType:"script",async:false,global:false,"throws":true})};bI.fn.extend({wrapAll:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapAll(e.call(this,b6))})}if(this[0]){var i=bI(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){i.insertBefore(this[0])}i.map(function(){var b6=this;while(b6.firstChild&&b6.firstChild.nodeType===1){b6=b6.firstChild}return b6}).append(this)}return this},wrapInner:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapInner(e.call(this,b6))})}return this.each(function(){var i=bI(this),b6=i.contents();if(b6.length){b6.wrapAll(e)}else{i.append(e)}})},wrap:function(e){var i=bI.isFunction(e);return this.each(function(b6){bI(this).wrapAll(i?e.call(this,b6):e)})},unwrap:function(){return this.parent().each(function(){if(!bI.nodeName(this,"body")){bI(this).replaceWith(this.childNodes)}}).end()}});bI.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||(!D.reliableHiddenOffsets()&&((e.style&&e.style.display)||bI.css(e,"display"))==="none")};bI.expr.filters.visible=function(e){return !bI.expr.filters.hidden(e)};var bw=/%20/g,aS=/\[\]$/,X=/\r?\n/g,b=/^(?:submit|button|image|reset|file)$/i,au=/^(?:input|select|textarea|keygen)/i;function j(b6,b8,i,b7){var e;if(bI.isArray(b8)){bI.each(b8,function(ca,b9){if(i||aS.test(b6)){b7(b6,b9)}else{j(b6+"["+(typeof b9==="object"?ca:"")+"]",b9,i,b7)}})}else{if(!i&&bI.type(b8)==="object"){for(e in b8){j(b6+"["+e+"]",b8[e],i,b7)}}else{b7(b6,b8)}}}bI.param=function(e,b6){var b7,i=[],b8=function(b9,ca){ca=bI.isFunction(ca)?ca():(ca==null?"":ca);i[i.length]=encodeURIComponent(b9)+"="+encodeURIComponent(ca)};if(b6===undefined){b6=bI.ajaxSettings&&bI.ajaxSettings.traditional}if(bI.isArray(e)||(e.jquery&&!bI.isPlainObject(e))){bI.each(e,function(){b8(this.name,this.value)})}else{for(b7 in e){j(b7,e[b7],b6,b8)}}return i.join("&").replace(bw,"+")};bI.fn.extend({serialize:function(){return bI.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=bI.prop(this,"elements");return e?bI.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!bI(this).is(":disabled")&&au.test(this.nodeName)&&!b.test(e)&&(this.checked||!aM.test(e))}).map(function(e,b6){var b7=bI(this).val();return b7==null?null:bI.isArray(b7)?bI.map(b7,function(i){return{name:b6.name,value:i.replace(X,"\r\n")}}):{name:b6.name,value:b7.replace(X,"\r\n")}}).get()}});bI.ajaxSettings.xhr=a5.ActiveXObject!==undefined?function(){return !this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&bE()||bg()}:bE;var aA=0,aj={},ay=bI.ajaxSettings.xhr();if(a5.attachEvent){a5.attachEvent("onunload",function(){for(var e in aj){aj[e](undefined,true)}})}D.cors=!!ay&&("withCredentials" in ay);ay=D.ajax=!!ay;if(ay){bI.ajaxTransport(function(e){if(!e.crossDomain||D.cors){var i;return{send:function(b9,b6){var b7,b8=e.xhr(),ca=++aA;b8.open(e.type,e.url,e.async,e.username,e.password);if(e.xhrFields){for(b7 in e.xhrFields){b8[b7]=e.xhrFields[b7]}}if(e.mimeType&&b8.overrideMimeType){b8.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!b9["X-Requested-With"]){b9["X-Requested-With"]="XMLHttpRequest"}for(b7 in b9){if(b9[b7]!==undefined){b8.setRequestHeader(b7,b9[b7]+"")}}b8.send((e.hasContent&&e.data)||null);i=function(cd,cc){var cb,cg,ce;if(i&&(cc||b8.readyState===4)){delete aj[ca];i=undefined;b8.onreadystatechange=bI.noop;if(cc){if(b8.readyState!==4){b8.abort()}}else{ce={};cb=b8.status;if(typeof b8.responseText==="string"){ce.text=b8.responseText}try{cg=b8.statusText}catch(cf){cg=""}if(!cb&&e.isLocal&&!e.crossDomain){cb=ce.text?200:404}else{if(cb===1223){cb=204}}}}if(ce){b6(cb,cg,ce,b8.getAllResponseHeaders())}};if(!e.async){i()}else{if(b8.readyState===4){setTimeout(i)}else{b8.onreadystatechange=aj[ca]=i}}},abort:function(){if(i){i(undefined,true)}}}}})}function bE(){try{return new a5.XMLHttpRequest()}catch(i){}}function bg(){try{return new a5.ActiveXObject("Microsoft.XMLHTTP")}catch(i){}}bI.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){bI.globalEval(e);return e}}});bI.ajaxPrefilter("script",function(e){if(e.cache===undefined){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});bI.ajaxTransport("script",function(b6){if(b6.crossDomain){var e,i=n.head||bI("head")[0]||n.documentElement;return{send:function(b7,b8){e=n.createElement("script");e.async=true;if(b6.scriptCharset){e.charset=b6.scriptCharset}e.src=b6.url;e.onload=e.onreadystatechange=function(ca,b9){if(b9||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(e.parentNode){e.parentNode.removeChild(e)}e=null;if(!b9){b8(200,"success")}}};i.insertBefore(e,i.firstChild)},abort:function(){if(e){e.onload(undefined,true)}}}}});var bs=[],a8=/(=)\?(?=&|$)|\?\?/;bI.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=bs.pop()||(bI.expando+"_"+(bp++));this[e]=true;return e}});bI.ajaxPrefilter("json jsonp",function(b7,e,b8){var ca,i,b6,b9=b7.jsonp!==false&&(a8.test(b7.url)?"url":typeof b7.data==="string"&&!(b7.contentType||"").indexOf("application/x-www-form-urlencoded")&&a8.test(b7.data)&&"data");if(b9||b7.dataTypes[0]==="jsonp"){ca=b7.jsonpCallback=bI.isFunction(b7.jsonpCallback)?b7.jsonpCallback():b7.jsonpCallback;if(b9){b7[b9]=b7[b9].replace(a8,"$1"+ca)}else{if(b7.jsonp!==false){b7.url+=(bQ.test(b7.url)?"&":"?")+b7.jsonp+"="+ca}}b7.converters["script json"]=function(){if(!b6){bI.error(ca+" was not called")}return b6[0]};b7.dataTypes[0]="json";i=a5[ca];a5[ca]=function(){b6=arguments};b8.always(function(){a5[ca]=i;if(b7[ca]){b7.jsonpCallback=e.jsonpCallback;bs.push(ca)}if(b6&&bI.isFunction(i)){i(b6[0])}b6=i=undefined});return"script"}});bI.parseHTML=function(b8,b6,b7){if(!b8||typeof b8!=="string"){return null}if(typeof b6==="boolean"){b7=b6;b6=false}b6=b6||n;var i=a.exec(b8),e=!b7&&[];if(i){return[b6.createElement(i[1])]}i=bI.buildFragment([b8],b6,e);if(e&&e.length){bI(e).remove()}return bI.merge([],i.childNodes)};var b1=bI.fn.load;bI.fn.load=function(b7,ca,cb){if(typeof b7!=="string"&&b1){return b1.apply(this,arguments)}var e,b6,b8,i=this,b9=b7.indexOf(" ");if(b9>=0){e=bI.trim(b7.slice(b9,b7.length));b7=b7.slice(0,b9)}if(bI.isFunction(ca)){cb=ca;ca=undefined}else{if(ca&&typeof ca==="object"){b8="POST"}}if(i.length>0){bI.ajax({url:b7,type:b8,dataType:"html",data:ca}).done(function(cc){b6=arguments;i.html(e?bI("
    ").append(bI.parseHTML(cc)).find(e):cc)}).complete(cb&&function(cd,cc){i.each(cb,b6||[cd.responseText,cc,cd])})}return this};bI.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,b6){bI.fn[b6]=function(i){return this.on(b6,i)}});bI.expr.filters.animated=function(e){return bI.grep(bI.timers,function(i){return e===i.elem}).length};var bX=a5.document.documentElement;function br(e){return bI.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}bI.offset={setOffset:function(b7,ch,cb){var cd,ca,e,b8,b6,cf,cg,cc=bI.css(b7,"position"),b9=bI(b7),ce={};if(cc==="static"){b7.style.position="relative"}b6=b9.offset();e=bI.css(b7,"top");cf=bI.css(b7,"left");cg=(cc==="absolute"||cc==="fixed")&&bI.inArray("auto",[e,cf])>-1;if(cg){cd=b9.position();b8=cd.top;ca=cd.left}else{b8=parseFloat(e)||0;ca=parseFloat(cf)||0}if(bI.isFunction(ch)){ch=ch.call(b7,cb,b6)}if(ch.top!=null){ce.top=(ch.top-b6.top)+b8}if(ch.left!=null){ce.left=(ch.left-b6.left)+ca}if("using" in ch){ch.using.call(b7,ce)}else{b9.css(ce)}}};bI.fn.extend({offset:function(i){if(arguments.length){return i===undefined?this:this.each(function(ca){bI.offset.setOffset(this,i,ca)})}var e,b9,b7={top:0,left:0},b6=this[0],b8=b6&&b6.ownerDocument;if(!b8){return}e=b8.documentElement;if(!bI.contains(e,b6)){return b7}if(typeof b6.getBoundingClientRect!==aC){b7=b6.getBoundingClientRect()}b9=br(b8);return{top:b7.top+(b9.pageYOffset||e.scrollTop)-(e.clientTop||0),left:b7.left+(b9.pageXOffset||e.scrollLeft)-(e.clientLeft||0)}},position:function(){if(!this[0]){return}var b6,b7,e={top:0,left:0},i=this[0];if(bI.css(i,"position")==="fixed"){b7=i.getBoundingClientRect()}else{b6=this.offsetParent();b7=this.offset();if(!bI.nodeName(b6[0],"html")){e=b6.offset()}e.top+=bI.css(b6[0],"borderTopWidth",true);e.left+=bI.css(b6[0],"borderLeftWidth",true)}return{top:b7.top-e.top-bI.css(i,"marginTop",true),left:b7.left-e.left-bI.css(i,"marginLeft",true)}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||bX;while(e&&(!bI.nodeName(e,"html")&&bI.css(e,"position")==="static")){e=e.offsetParent}return e||bX})}});bI.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b6,i){var e=/Y/.test(i);bI.fn[b6]=function(b7){return aB(this,function(b8,cb,ca){var b9=br(b8);if(ca===undefined){return b9?(i in b9)?b9[i]:b9.document.documentElement[cb]:b8[cb]}if(b9){b9.scrollTo(!e?ca:bI(b9).scrollLeft(),e?ca:bI(b9).scrollTop())}else{b8[cb]=ca}},b6,b7,arguments.length,null)}});bI.each(["top","left"],function(e,b6){bI.cssHooks[b6]=a7(D.pixelPosition,function(b7,i){if(i){i=G(b7,b6);return Y.test(i)?bI(b7).position()[b6]+"px":i}})});bI.each({Height:"height",Width:"width"},function(e,i){bI.each({padding:"inner"+e,content:i,"":"outer"+e},function(b6,b7){bI.fn[b7]=function(cb,ca){var b9=arguments.length&&(b6||typeof cb!=="boolean"),b8=b6||(cb===true||ca===true?"margin":"border");return aB(this,function(cd,cc,ce){var cf;if(bI.isWindow(cd)){return cd.document.documentElement["client"+e]}if(cd.nodeType===9){cf=cd.documentElement;return Math.max(cd.body["scroll"+e],cf["scroll"+e],cd.body["offset"+e],cf["offset"+e],cf["client"+e])}return ce===undefined?bI.css(cd,cc,b8):bI.style(cd,cc,ce,b8)},i,b9?cb:undefined,b9,null)}})});bI.fn.size=function(){return this.length};bI.fn.andSelf=bI.fn.addBack;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return bI})}var bk=a5.jQuery,I=a5.$;bI.noConflict=function(e){if(a5.$===bI){a5.$=I}if(e&&a5.jQuery===bI){a5.jQuery=bk}return bI};if(typeof av===aC){a5.jQuery=a5.$=bI}return bI}));!function(a){a(function(){a.support.transition=(function(){var b=(function(){var e=document.createElement("bootstrap"),d={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in d){if(e.style[c]!==undefined){return d[c]}}}());return b&&{end:b}})()})}(window.jQuery);!function(d){var c='[data-dismiss="alert"]',b=function(e){d(e).on("click",c,this.close)};b.prototype.close=function(j){var i=d(this),g=i.attr("data-target"),h;if(!g){g=i.attr("href");g=g&&g.replace(/.*(?=#[^\s]*$)/,"")}h=d(g);j&&j.preventDefault();h.length||(h=i.hasClass("alert")?i:i.parent());h.trigger(j=d.Event("close"));if(j.isDefaultPrevented()){return}h.removeClass("in");function f(){h.trigger("closed").remove()}d.support.transition&&h.hasClass("fade")?h.on(d.support.transition.end,f):f()};var a=d.fn.alert;d.fn.alert=function(e){return this.each(function(){var g=d(this),f=g.data("alert");if(!f){g.data("alert",(f=new b(this)))}if(typeof e=="string"){f[e].call(g)}})};d.fn.alert.Constructor=b;d.fn.alert.noConflict=function(){d.fn.alert=a;return this};d(document).on("click.alert.data-api",c,b.prototype.close)}(window.jQuery);!function(c){var b=function(e,d){this.$element=c(e);this.options=c.extend({},c.fn.button.defaults,d)};b.prototype.setState=function(g){var i="disabled",e=this.$element,f=e.data(),h=e.is("input")?"val":"html";g=g+"Text";f.resetText||e.data("resetText",e[h]());e[h](f[g]||this.options[g]);setTimeout(function(){g=="loadingText"?e.addClass(i).attr(i,i):e.removeClass(i).removeAttr(i)},0)};b.prototype.toggle=function(){var d=this.$element.closest('[data-toggle="buttons-radio"]');d&&d.find(".active").removeClass("active");this.$element.toggleClass("active")};var a=c.fn.button;c.fn.button=function(d){return this.each(function(){var g=c(this),f=g.data("button"),e=typeof d=="object"&&d;if(!f){g.data("button",(f=new b(this,e)))}if(d=="toggle"){f.toggle()}else{if(d){f.setState(d)}}})};c.fn.button.defaults={loadingText:"loading..."};c.fn.button.Constructor=b;c.fn.button.noConflict=function(){c.fn.button=a;return this};c(document).on("click.button.data-api","[data-toggle^=button]",function(f){var d=c(f.target);if(!d.hasClass("btn")){d=d.closest(".btn")}d.button("toggle")})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.$indicators=this.$element.find(".carousel-indicators");this.options=d;this.options.pause=="hover"&&this.$element.on("mouseenter",b.proxy(this.pause,this)).on("mouseleave",b.proxy(this.cycle,this))};c.prototype={cycle:function(d){if(!d){this.paused=false}if(this.interval){clearInterval(this.interval)}this.options.interval&&!this.paused&&(this.interval=setInterval(b.proxy(this.next,this),this.options.interval));return this},getActiveIndex:function(){this.$active=this.$element.find(".item.active");this.$items=this.$active.parent().children();return this.$items.index(this.$active)},to:function(f){var d=this.getActiveIndex(),e=this;if(f>(this.$items.length-1)||f<0){return}if(this.sliding){return this.$element.one("slid",function(){e.to(f)})}if(d==f){return this.pause().cycle()}return this.slide(f>d?"next":"prev",b(this.$items[f]))},pause:function(d){if(!d){this.paused=true}if(this.$element.find(".next, .prev").length&&b.support.transition.end){this.$element.trigger(b.support.transition.end);this.cycle(true)}clearInterval(this.interval);this.interval=null;return this},next:function(){if(this.sliding){return}return this.slide("next")},prev:function(){if(this.sliding){return}return this.slide("prev")},slide:function(k,f){var m=this.$element.find(".item.active"),d=f||m[k](),j=this.interval,l=k=="next"?"left":"right",g=k=="next"?"first":"last",h=this,i;this.sliding=true;j&&this.pause();d=d.length?d:this.$element.find(".item")[g]();i=b.Event("slide",{relatedTarget:d[0],direction:l});if(d.hasClass("active")){return}if(this.$indicators.length){this.$indicators.find(".active").removeClass("active");this.$element.one("slid",function(){var e=b(h.$indicators.children()[h.getActiveIndex()]);e&&e.addClass("active")})}if(b.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(i);if(i.isDefaultPrevented()){return}d.addClass(k);d[0].offsetWidth;m.addClass(l);d.addClass(l);this.$element.one(b.support.transition.end,function(){d.removeClass([k,l].join(" ")).addClass("active");m.removeClass(["active",l].join(" "));h.sliding=false;setTimeout(function(){h.$element.trigger("slid")},0)})}else{this.$element.trigger(i);if(i.isDefaultPrevented()){return}m.removeClass("active");d.addClass("active");this.sliding=false;this.$element.trigger("slid")}j&&this.cycle();return this}};var a=b.fn.carousel;b.fn.carousel=function(d){return this.each(function(){var h=b(this),g=h.data("carousel"),e=b.extend({},b.fn.carousel.defaults,typeof d=="object"&&d),f=typeof d=="string"?d:e.slide;if(!g){h.data("carousel",(g=new c(this,e)))}if(typeof d=="number"){g.to(d)}else{if(f){g[f]()}else{if(e.interval){g.pause().cycle()}}}})};b.fn.carousel.defaults={interval:5000,pause:"hover"};b.fn.carousel.Constructor=c;b.fn.carousel.noConflict=function(){b.fn.carousel=a;return this};b(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(j){var i=b(this),f,d=b(i.attr("data-target")||(f=i.attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")),g=b.extend({},d.data(),i.data()),h;d.carousel(g);if(h=i.attr("data-slide-to")){d.data("carousel").pause().to(h).cycle()}j.preventDefault()})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.options=b.extend({},b.fn.collapse.defaults,d);if(this.options.parent){this.$parent=b(this.options.parent)}this.options.toggle&&this.toggle()};c.prototype={constructor:c,dimension:function(){var d=this.$element.hasClass("width");return d?"width":"height"},show:function(){var g,d,f,e;if(this.transitioning||this.$element.hasClass("in")){return}g=this.dimension();d=b.camelCase(["scroll",g].join("-"));f=this.$parent&&this.$parent.find("> .accordion-group > .in");if(f&&f.length){e=f.data("collapse");if(e&&e.transitioning){return}f.collapse("hide");e||f.data("collapse",null)}this.$element[g](0);this.transition("addClass",b.Event("show"),"shown");b.support.transition&&this.$element[g](this.$element[0][d])},hide:function(){var d;if(this.transitioning||!this.$element.hasClass("in")){return}d=this.dimension();this.reset(this.$element[d]());this.transition("removeClass",b.Event("hide"),"hidden");this.$element[d](0)},reset:function(d){var e=this.dimension();this.$element.removeClass("collapse")[e](d||"auto")[0].offsetWidth;this.$element[d!==null?"addClass":"removeClass"]("collapse");return this},transition:function(h,e,f){var g=this,d=function(){if(e.type=="show"){g.reset()}g.transitioning=0;g.$element.trigger(f)};this.$element.trigger(e);if(e.isDefaultPrevented()){return}this.transitioning=1;this.$element[h]("in");b.support.transition&&this.$element.hasClass("collapse")?this.$element.one(b.support.transition.end,d):d()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var a=b.fn.collapse;b.fn.collapse=function(d){return this.each(function(){var g=b(this),f=g.data("collapse"),e=b.extend({},b.fn.collapse.defaults,g.data(),typeof d=="object"&&d);if(!f){g.data("collapse",(f=new c(this,e)))}if(typeof d=="string"){f[d]()}})};b.fn.collapse.defaults={toggle:true};b.fn.collapse.Constructor=c;b.fn.collapse.noConflict=function(){b.fn.collapse=a;return this};b(document).on("click.collapse.data-api","[data-toggle=collapse]",function(i){var h=b(this),d,g=h.attr("data-target")||i.preventDefault()||(d=h.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=b(g).data("collapse")?"toggle":h.data();h[b(g).hasClass("in")?"addClass":"removeClass"]("collapsed");b(g).collapse(f)})}(window.jQuery);!function(f){var b="[data-toggle=dropdown]",a=function(h){var g=f(h).on("click.dropdown.data-api",this.toggle);f("html").on("click.dropdown.data-api",function(){g.parent().removeClass("open")})};a.prototype={constructor:a,toggle:function(j){var i=f(this),h,g;if(i.is(".disabled, :disabled")){return}h=e(i);g=h.hasClass("open");d();if(!g){if("ontouchstart" in document.documentElement){f('
    @@ -356,15 +342,14 @@ function toggleDisplay(elementId) {
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-ant/taglist.html b/dependency-check-ant/taglist.html index f95520978..18b63a0aa 100644 --- a/dependency-check-ant/taglist.html +++ b/dependency-check-ant/taglist.html @@ -1,21 +1,21 @@ - + - dependency-check-ant - Tag List report - + dependency-check-ant – Tag List report + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Tag List Report

    +

    Tag List Report

    The following document contains the listing of user tags found in the code. Below is the summary of the occurrences per tag.

    @@ -254,20 +240,10 @@ - - + +
    Total number of occurrences Tag strings used by tag class
    Todo Work1Todo Work0 todo, FIXME
    -

    Each tag is detailed below:

    -
    -

    Todo Work

    -

    Number of occurrences found in the code: 1

    - - - - - - -
    org.owasp.dependencycheck.taskdefs.DependencyCheckTaskLine
    - should this be its own task?907
    +

    Each tag is detailed below:

    @@ -277,15 +253,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-ant/team-list.html b/dependency-check-ant/team-list.html index a47e6a24b..491961551 100644 --- a/dependency-check-ant/team-list.html +++ b/dependency-check-ant/team-list.html @@ -1,21 +1,21 @@ - + - dependency-check-ant - Team list - + dependency-check-ant – Project Team + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -63,13 +63,13 @@ dependency-check / -
  • Team list
  • +
  • Project Team
  • -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    The Team

    +

    The Team

    A successful project requires many people to play many roles. Some members write code or documentation, while others are valuable as testers, submitting patches and suggestions.

    The team is comprised of Members and Contributors. Members have direct access to the source of a project and actively evolve the code-base. Contributors improve the project through submission of patches and suggestions to the Members. The number of Contributors to the project is unbounded. Get involved today. All contributions to the project are greatly appreciated.

    -

    Members

    +

    Members

    The following is a list of developers with commit privileges that have directly contributed to the project in one way or another.

    @@ -247,7 +247,7 @@
    https://www.ida.org/ developer
    -

    Contributors

    +

    Contributors

    The following additional people have contributed to this project through the way of suggestions, patches or documentation.

    @@ -259,22 +259,7 @@ -
    Hugo Costa OWASP https://www.owasp.org/logo design
    +logo design
    @@ -284,15 +269,14 @@ window.onLoad = init();
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-ant/xref-test/index.html b/dependency-check-ant/xref-test/index.html index 2f21e70fd..3dafe2f34 100644 --- a/dependency-check-ant/xref-test/index.html +++ b/dependency-check-ant/xref-test/index.html @@ -4,7 +4,7 @@ - Dependency-Check Ant Task 1.3.0 Reference + Dependency-Check Ant Task 1.3.1 Reference diff --git a/dependency-check-ant/xref-test/org/owasp/dependencycheck/taskdefs/package-frame.html b/dependency-check-ant/xref-test/org/owasp/dependencycheck/taskdefs/package-frame.html index e7c09372c..72595d9d0 100644 --- a/dependency-check-ant/xref-test/org/owasp/dependencycheck/taskdefs/package-frame.html +++ b/dependency-check-ant/xref-test/org/owasp/dependencycheck/taskdefs/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Ant Task 1.3.0 Reference Package org.owasp.dependencycheck.taskdefs + Dependency-Check Ant Task 1.3.1 Reference Package org.owasp.dependencycheck.taskdefs diff --git a/dependency-check-ant/xref-test/org/owasp/dependencycheck/taskdefs/package-summary.html b/dependency-check-ant/xref-test/org/owasp/dependencycheck/taskdefs/package-summary.html index d461154f2..2742a1de3 100644 --- a/dependency-check-ant/xref-test/org/owasp/dependencycheck/taskdefs/package-summary.html +++ b/dependency-check-ant/xref-test/org/owasp/dependencycheck/taskdefs/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Ant Task 1.3.0 Reference Package org.owasp.dependencycheck.taskdefs + Dependency-Check Ant Task 1.3.1 Reference Package org.owasp.dependencycheck.taskdefs diff --git a/dependency-check-ant/xref-test/overview-frame.html b/dependency-check-ant/xref-test/overview-frame.html index 191597d53..dc55d58c6 100644 --- a/dependency-check-ant/xref-test/overview-frame.html +++ b/dependency-check-ant/xref-test/overview-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Ant Task 1.3.0 Reference + Dependency-Check Ant Task 1.3.1 Reference diff --git a/dependency-check-ant/xref-test/overview-summary.html b/dependency-check-ant/xref-test/overview-summary.html index 6863db179..f2234de14 100644 --- a/dependency-check-ant/xref-test/overview-summary.html +++ b/dependency-check-ant/xref-test/overview-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Ant Task 1.3.0 Reference + Dependency-Check Ant Task 1.3.1 Reference @@ -24,7 +24,7 @@
    -

    Dependency-Check Ant Task 1.3.0 Reference

    +

    Dependency-Check Ant Task 1.3.1 Reference

    diff --git a/dependency-check-ant/xref/allclasses-frame.html b/dependency-check-ant/xref/allclasses-frame.html index 7131a61a0..58efea076 100644 --- a/dependency-check-ant/xref/allclasses-frame.html +++ b/dependency-check-ant/xref/allclasses-frame.html @@ -18,13 +18,19 @@ AntLoggerFactory
  • - DependencyCheckTask + Check
  • - ReportFormats + Purge +
  • +
  • + ReportFormats
  • StaticLoggerBinder +
  • +
  • + Update
  • diff --git a/dependency-check-ant/xref/index.html b/dependency-check-ant/xref/index.html index 2f21e70fd..3dafe2f34 100644 --- a/dependency-check-ant/xref/index.html +++ b/dependency-check-ant/xref/index.html @@ -4,7 +4,7 @@ - Dependency-Check Ant Task 1.3.0 Reference + Dependency-Check Ant Task 1.3.1 Reference diff --git a/dependency-check-ant/xref/org/owasp/dependencycheck/ant/logging/AntLoggerAdapter.html b/dependency-check-ant/xref/org/owasp/dependencycheck/ant/logging/AntLoggerAdapter.html index fbac1d909..b5a8a218b 100644 --- a/dependency-check-ant/xref/org/owasp/dependencycheck/ant/logging/AntLoggerAdapter.html +++ b/dependency-check-ant/xref/org/owasp/dependencycheck/ant/logging/AntLoggerAdapter.html @@ -32,7 +32,7 @@ 24import org.slf4j.helpers.MessageFormatter; 2526/** -27 * An instance of {@link org.slf4j.Logger} which simply calls the log method on the delegate Ant task +27 * An instance of {@link org.slf4j.Logger} which simply calls the log method on the delegate Ant task.28 *29 * @author colezlaw30 */ diff --git a/dependency-check-ant/xref/org/owasp/dependencycheck/ant/logging/package-frame.html b/dependency-check-ant/xref/org/owasp/dependencycheck/ant/logging/package-frame.html index 505dfca44..788ff8807 100644 --- a/dependency-check-ant/xref/org/owasp/dependencycheck/ant/logging/package-frame.html +++ b/dependency-check-ant/xref/org/owasp/dependencycheck/ant/logging/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Ant Task 1.3.0 Reference Package org.owasp.dependencycheck.ant.logging + Dependency-Check Ant Task 1.3.1 Reference Package org.owasp.dependencycheck.ant.logging diff --git a/dependency-check-ant/xref/org/owasp/dependencycheck/ant/logging/package-summary.html b/dependency-check-ant/xref/org/owasp/dependencycheck/ant/logging/package-summary.html index 45bc0efc2..7fabf27be 100644 --- a/dependency-check-ant/xref/org/owasp/dependencycheck/ant/logging/package-summary.html +++ b/dependency-check-ant/xref/org/owasp/dependencycheck/ant/logging/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Ant Task 1.3.0 Reference Package org.owasp.dependencycheck.ant.logging + Dependency-Check Ant Task 1.3.1 Reference Package org.owasp.dependencycheck.ant.logging diff --git a/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/Check.html b/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/Check.html new file mode 100644 index 000000000..cdef482bd --- /dev/null +++ b/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/Check.html @@ -0,0 +1,982 @@ + + + +Check xref + + + +
    +1   /*
    +2    * This file is part of dependency-check-ant.
    +3    *
    +4    * Licensed under the Apache License, Version 2.0 (the "License");
    +5    * you may not use this file except in compliance with the License.
    +6    * You may obtain a copy of the License at
    +7    *
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
    +9    *
    +10   * Unless required by applicable law or agreed to in writing, software
    +11   * distributed under the License is distributed on an "AS IS" BASIS,
    +12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +13   * See the License for the specific language governing permissions and
    +14   * limitations under the License.
    +15   *
    +16   * Copyright (c) 2013 Jeremy Long. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.taskdefs;
    +19  
    +20  import java.io.File;
    +21  import java.io.IOException;
    +22  import java.util.List;
    +23  import org.apache.tools.ant.BuildException;
    +24  import org.apache.tools.ant.Project;
    +25  import org.apache.tools.ant.types.EnumeratedAttribute;
    +26  import org.apache.tools.ant.types.Reference;
    +27  import org.apache.tools.ant.types.Resource;
    +28  import org.apache.tools.ant.types.ResourceCollection;
    +29  import org.apache.tools.ant.types.resources.FileProvider;
    +30  import org.apache.tools.ant.types.resources.Resources;
    +31  import org.owasp.dependencycheck.Engine;
    +32  import org.owasp.dependencycheck.data.nvdcve.CveDB;
    +33  import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
    +34  import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties;
    +35  import org.owasp.dependencycheck.dependency.Dependency;
    +36  import org.owasp.dependencycheck.dependency.Identifier;
    +37  import org.owasp.dependencycheck.dependency.Vulnerability;
    +38  import org.owasp.dependencycheck.reporting.ReportGenerator;
    +39  import org.owasp.dependencycheck.reporting.ReportGenerator.Format;
    +40  import org.owasp.dependencycheck.utils.Settings;
    +41  import org.slf4j.impl.StaticLoggerBinder;
    +42  
    +43  /**
    +44   * An Ant task definition to execute dependency-check during an Ant build.
    +45   *
    +46   * @author Jeremy Long
    +47   */
    +48  public class Check extends Update {
    +49  
    +50      /**
    +51       * System specific new line character.
    +52       */
    +53      private static final String NEW_LINE = System.getProperty("line.separator", "\n").intern();
    +54  
    +55      /**
    +56       * Construct a new DependencyCheckTask.
    +57       */
    +58      public Check() {
    +59          super();
    +60          // Call this before Dependency Check Core starts logging anything - this way, all SLF4J messages from
    +61          // core end up coming through this tasks logger
    +62          StaticLoggerBinder.getSingleton().setTask(this);
    +63      }
    +64      //The following code was copied Apache Ant PathConvert
    +65      //BEGIN COPY from org.apache.tools.ant.taskdefs.PathConvert
    +66      /**
    +67       * Path to be converted
    +68       */
    +69      private Resources path = null;
    +70      /**
    +71       * Reference to path/fileset to convert
    +72       */
    +73      private Reference refid = null;
    +74  
    +75      /**
    +76       * Add an arbitrary ResourceCollection.
    +77       *
    +78       * @param rc the ResourceCollection to add.
    +79       * @since Ant 1.7
    +80       */
    +81      public void add(ResourceCollection rc) {
    +82          if (isReference()) {
    +83              throw new BuildException("Nested elements are not allowed when using the refid attribute.");
    +84          }
    +85          getPath().add(rc);
    +86      }
    +87  
    +88      /**
    +89       * Returns the path. If the path has not been initialized yet, this class is synchronized, and will instantiate the path
    +90       * object.
    +91       *
    +92       * @return the path
    +93       */
    +94      private synchronized Resources getPath() {
    +95          if (path == null) {
    +96              path = new Resources(getProject());
    +97              path.setCache(true);
    +98          }
    +99          return path;
    +100     }
    +101 
    +102     /**
    +103      * Learn whether the refid attribute of this element been set.
    +104      *
    +105      * @return true if refid is valid.
    +106      */
    +107     public boolean isReference() {
    +108         return refid != null;
    +109     }
    +110 
    +111     /**
    +112      * Add a reference to a Path, FileSet, DirSet, or FileList defined elsewhere.
    +113      *
    +114      * @param r the reference to a path, fileset, dirset or filelist.
    +115      */
    +116     public void setRefid(Reference r) {
    +117         if (path != null) {
    +118             throw new BuildException("Nested elements are not allowed when using the refid attribute.");
    +119         }
    +120         refid = r;
    +121     }
    +122 
    +123     /**
    +124      * If this is a reference, this method will add the referenced resource collection to the collection of paths.
    +125      *
    +126      * @throws BuildException if the reference is not to a resource collection
    +127      */
    +128     private void dealWithReferences() throws BuildException {
    +129         if (isReference()) {
    +130             final Object o = refid.getReferencedObject(getProject());
    +131             if (!(o instanceof ResourceCollection)) {
    +132                 throw new BuildException("refid '" + refid.getRefId()
    +133                         + "' does not refer to a resource collection.");
    +134             }
    +135             getPath().add((ResourceCollection) o);
    +136         }
    +137     }
    +138     // END COPY from org.apache.tools.ant.taskdefs
    +139     /**
    +140      * The application name for the report.
    +141      *
    +142      * @deprecated use projectName instead.
    +143      */
    +144     @Deprecated
    +145     private String applicationName = null;
    +146 
    +147     /**
    +148      * Get the value of applicationName.
    +149      *
    +150      * @return the value of applicationName
    +151      *
    +152      * @deprecated use projectName instead.
    +153      */
    +154     @Deprecated
    +155     public String getApplicationName() {
    +156         return applicationName;
    +157     }
    +158 
    +159     /**
    +160      * Set the value of applicationName.
    +161      *
    +162      * @param applicationName new value of applicationName
    +163      * @deprecated use projectName instead.
    +164      */
    +165     @Deprecated
    +166     public void setApplicationName(String applicationName) {
    +167         this.applicationName = applicationName;
    +168     }
    +169     /**
    +170      * The name of the project being analyzed.
    +171      */
    +172     private String projectName = "dependency-check";
    +173 
    +174     /**
    +175      * Get the value of projectName.
    +176      *
    +177      * @return the value of projectName
    +178      */
    +179     public String getProjectName() {
    +180         if (applicationName != null) {
    +181             log("Configuration 'applicationName' has been deprecated, please use 'projectName' instead", Project.MSG_WARN);
    +182             if ("dependency-check".equals(projectName)) {
    +183                 projectName = applicationName;
    +184             }
    +185         }
    +186         return projectName;
    +187     }
    +188 
    +189     /**
    +190      * Set the value of projectName.
    +191      *
    +192      * @param projectName new value of projectName
    +193      */
    +194     public void setProjectName(String projectName) {
    +195         this.projectName = projectName;
    +196     }
    +197 
    +198     /**
    +199      * Specifies the destination directory for the generated Dependency-Check report.
    +200      */
    +201     private String reportOutputDirectory = ".";
    +202 
    +203     /**
    +204      * Get the value of reportOutputDirectory.
    +205      *
    +206      * @return the value of reportOutputDirectory
    +207      */
    +208     public String getReportOutputDirectory() {
    +209         return reportOutputDirectory;
    +210     }
    +211 
    +212     /**
    +213      * Set the value of reportOutputDirectory.
    +214      *
    +215      * @param reportOutputDirectory new value of reportOutputDirectory
    +216      */
    +217     public void setReportOutputDirectory(String reportOutputDirectory) {
    +218         this.reportOutputDirectory = reportOutputDirectory;
    +219     }
    +220     /**
    +221      * Specifies if the build should be failed if a CVSS score above a specified level is identified. The default is 11 which
    +222      * means since the CVSS scores are 0-10, by default the build will never fail and the CVSS score is set to 11. The valid range
    +223      * for the fail build on CVSS is 0 to 11, where anything above 10 will not cause the build to fail.
    +224      */
    +225     private float failBuildOnCVSS = 11;
    +226 
    +227     /**
    +228      * Get the value of failBuildOnCVSS.
    +229      *
    +230      * @return the value of failBuildOnCVSS
    +231      */
    +232     public float getFailBuildOnCVSS() {
    +233         return failBuildOnCVSS;
    +234     }
    +235 
    +236     /**
    +237      * Set the value of failBuildOnCVSS.
    +238      *
    +239      * @param failBuildOnCVSS new value of failBuildOnCVSS
    +240      */
    +241     public void setFailBuildOnCVSS(float failBuildOnCVSS) {
    +242         this.failBuildOnCVSS = failBuildOnCVSS;
    +243     }
    +244     /**
    +245      * Sets whether auto-updating of the NVD CVE/CPE data is enabled. It is not recommended that this be turned to false. Default
    +246      * is true.
    +247      */
    +248     private boolean autoUpdate = true;
    +249 
    +250     /**
    +251      * Get the value of autoUpdate.
    +252      *
    +253      * @return the value of autoUpdate
    +254      */
    +255     public boolean isAutoUpdate() {
    +256         return autoUpdate;
    +257     }
    +258 
    +259     /**
    +260      * Set the value of autoUpdate.
    +261      *
    +262      * @param autoUpdate new value of autoUpdate
    +263      */
    +264     public void setAutoUpdate(boolean autoUpdate) {
    +265         this.autoUpdate = autoUpdate;
    +266     }
    +267     /**
    +268      * Whether only the update phase should be executed.
    +269      */
    +270     private boolean updateOnly = false;
    +271 
    +272     /**
    +273      * Get the value of updateOnly.
    +274      *
    +275      * @return the value of updateOnly
    +276      */
    +277     public boolean isUpdateOnly() {
    +278         return updateOnly;
    +279     }
    +280 
    +281     /**
    +282      * Set the value of updateOnly.
    +283      *
    +284      * @param updateOnly new value of updateOnly
    +285      */
    +286     public void setUpdateOnly(boolean updateOnly) {
    +287         this.updateOnly = updateOnly;
    +288     }
    +289 
    +290     /**
    +291      * The report format to be generated (HTML, XML, VULN, ALL). Default is HTML.
    +292      */
    +293     private String reportFormat = "HTML";
    +294 
    +295     /**
    +296      * Get the value of reportFormat.
    +297      *
    +298      * @return the value of reportFormat
    +299      */
    +300     public String getReportFormat() {
    +301         return reportFormat;
    +302     }
    +303 
    +304     /**
    +305      * Set the value of reportFormat.
    +306      *
    +307      * @param reportFormat new value of reportFormat
    +308      */
    +309     public void setReportFormat(ReportFormats reportFormat) {
    +310         this.reportFormat = reportFormat.getValue();
    +311     }
    +312     /**
    +313      * The path to the suppression file.
    +314      */
    +315     private String suppressionFile;
    +316 
    +317     /**
    +318      * Get the value of suppressionFile.
    +319      *
    +320      * @return the value of suppressionFile
    +321      */
    +322     public String getSuppressionFile() {
    +323         return suppressionFile;
    +324     }
    +325 
    +326     /**
    +327      * Set the value of suppressionFile.
    +328      *
    +329      * @param suppressionFile new value of suppressionFile
    +330      */
    +331     public void setSuppressionFile(String suppressionFile) {
    +332         this.suppressionFile = suppressionFile;
    +333     }
    +334     /**
    +335      * flag indicating whether or not to show a summary of findings.
    +336      */
    +337     private boolean showSummary = true;
    +338 
    +339     /**
    +340      * Get the value of showSummary.
    +341      *
    +342      * @return the value of showSummary
    +343      */
    +344     public boolean isShowSummary() {
    +345         return showSummary;
    +346     }
    +347 
    +348     /**
    +349      * Set the value of showSummary.
    +350      *
    +351      * @param showSummary new value of showSummary
    +352      */
    +353     public void setShowSummary(boolean showSummary) {
    +354         this.showSummary = showSummary;
    +355     }
    +356 
    +357     /**
    +358      * Whether or not the Jar Analyzer is enabled.
    +359      */
    +360     private boolean jarAnalyzerEnabled = true;
    +361 
    +362     /**
    +363      * Returns whether or not the analyzer is enabled.
    +364      *
    +365      * @return true if the analyzer is enabled
    +366      */
    +367     public boolean isJarAnalyzerEnabled() {
    +368         return jarAnalyzerEnabled;
    +369     }
    +370 
    +371     /**
    +372      * Sets whether or not the analyzer is enabled.
    +373      *
    +374      * @param jarAnalyzerEnabled the value of the new setting
    +375      */
    +376     public void setJarAnalyzerEnabled(boolean jarAnalyzerEnabled) {
    +377         this.jarAnalyzerEnabled = jarAnalyzerEnabled;
    +378     }
    +379     /**
    +380      * Whether or not the Archive Analyzer is enabled.
    +381      */
    +382     private boolean archiveAnalyzerEnabled = true;
    +383 
    +384     /**
    +385      * Returns whether or not the analyzer is enabled.
    +386      *
    +387      * @return true if the analyzer is enabled
    +388      */
    +389     public boolean isArchiveAnalyzerEnabled() {
    +390         return archiveAnalyzerEnabled;
    +391     }
    +392     /**
    +393      * Whether or not the .NET Assembly Analyzer is enabled.
    +394      */
    +395     private boolean assemblyAnalyzerEnabled = true;
    +396 
    +397     /**
    +398      * Sets whether or not the analyzer is enabled.
    +399      *
    +400      * @param archiveAnalyzerEnabled the value of the new setting
    +401      */
    +402     public void setArchiveAnalyzerEnabled(boolean archiveAnalyzerEnabled) {
    +403         this.archiveAnalyzerEnabled = archiveAnalyzerEnabled;
    +404     }
    +405 
    +406     /**
    +407      * Returns whether or not the analyzer is enabled.
    +408      *
    +409      * @return true if the analyzer is enabled
    +410      */
    +411     public boolean isAssemblyAnalyzerEnabled() {
    +412         return assemblyAnalyzerEnabled;
    +413     }
    +414 
    +415     /**
    +416      * Sets whether or not the analyzer is enabled.
    +417      *
    +418      * @param assemblyAnalyzerEnabled the value of the new setting
    +419      */
    +420     public void setAssemblyAnalyzerEnabled(boolean assemblyAnalyzerEnabled) {
    +421         this.assemblyAnalyzerEnabled = assemblyAnalyzerEnabled;
    +422     }
    +423     /**
    +424      * Whether or not the .NET Nuspec Analyzer is enabled.
    +425      */
    +426     private boolean nuspecAnalyzerEnabled = true;
    +427 
    +428     /**
    +429      * Returns whether or not the analyzer is enabled.
    +430      *
    +431      * @return true if the analyzer is enabled
    +432      */
    +433     public boolean isNuspecAnalyzerEnabled() {
    +434         return nuspecAnalyzerEnabled;
    +435     }
    +436 
    +437     /**
    +438      * Sets whether or not the analyzer is enabled.
    +439      *
    +440      * @param nuspecAnalyzerEnabled the value of the new setting
    +441      */
    +442     public void setNuspecAnalyzerEnabled(boolean nuspecAnalyzerEnabled) {
    +443         this.nuspecAnalyzerEnabled = nuspecAnalyzerEnabled;
    +444     }
    +445     /**
    +446      * Whether or not the PHP Composer Analyzer is enabled.
    +447      */
    +448     private boolean composerAnalyzerEnabled = true;
    +449 
    +450     /**
    +451      * Get the value of composerAnalyzerEnabled.
    +452      *
    +453      * @return the value of composerAnalyzerEnabled
    +454      */
    +455     public boolean isComposerAnalyzerEnabled() {
    +456         return composerAnalyzerEnabled;
    +457     }
    +458 
    +459     /**
    +460      * Set the value of composerAnalyzerEnabled.
    +461      *
    +462      * @param composerAnalyzerEnabled new value of composerAnalyzerEnabled
    +463      */
    +464     public void setComposerAnalyzerEnabled(boolean composerAnalyzerEnabled) {
    +465         this.composerAnalyzerEnabled = composerAnalyzerEnabled;
    +466     }
    +467     /**
    +468      * Whether the autoconf analyzer should be enabled.
    +469      */
    +470     private boolean autoconfAnalyzerEnabled = true;
    +471 
    +472     /**
    +473      * Get the value of autoconfAnalyzerEnabled.
    +474      *
    +475      * @return the value of autoconfAnalyzerEnabled
    +476      */
    +477     public boolean isAutoconfAnalyzerEnabled() {
    +478         return autoconfAnalyzerEnabled;
    +479     }
    +480 
    +481     /**
    +482      * Set the value of autoconfAnalyzerEnabled.
    +483      *
    +484      * @param autoconfAnalyzerEnabled new value of autoconfAnalyzerEnabled
    +485      */
    +486     public void setAutoconfAnalyzerEnabled(boolean autoconfAnalyzerEnabled) {
    +487         this.autoconfAnalyzerEnabled = autoconfAnalyzerEnabled;
    +488     }
    +489     /**
    +490      * Whether the CMake analyzer should be enabled.
    +491      */
    +492     private boolean cmakeAnalyzerEnabled = true;
    +493 
    +494     /**
    +495      * Get the value of cmakeAnalyzerEnabled.
    +496      *
    +497      * @return the value of cmakeAnalyzerEnabled
    +498      */
    +499     public boolean isCMakeAnalyzerEnabled() {
    +500         return cmakeAnalyzerEnabled;
    +501     }
    +502 
    +503     /**
    +504      * Set the value of cmakeAnalyzerEnabled.
    +505      *
    +506      * @param cmakeAnalyzerEnabled new value of cmakeAnalyzerEnabled
    +507      */
    +508     public void setCMakeAnalyzerEnabled(boolean cmakeAnalyzerEnabled) {
    +509         this.cmakeAnalyzerEnabled = cmakeAnalyzerEnabled;
    +510     }
    +511     /**
    +512      * Whether or not the openssl analyzer is enabled.
    +513      */
    +514     private boolean opensslAnalyzerEnabled = true;
    +515 
    +516     /**
    +517      * Get the value of opensslAnalyzerEnabled.
    +518      *
    +519      * @return the value of opensslAnalyzerEnabled
    +520      */
    +521     public boolean isOpensslAnalyzerEnabled() {
    +522         return opensslAnalyzerEnabled;
    +523     }
    +524 
    +525     /**
    +526      * Set the value of opensslAnalyzerEnabled.
    +527      *
    +528      * @param opensslAnalyzerEnabled new value of opensslAnalyzerEnabled
    +529      */
    +530     public void setOpensslAnalyzerEnabled(boolean opensslAnalyzerEnabled) {
    +531         this.opensslAnalyzerEnabled = opensslAnalyzerEnabled;
    +532     }
    +533     /**
    +534      * Whether or not the Node.js Analyzer is enabled.
    +535      */
    +536     private boolean nodeAnalyzerEnabled = true;
    +537 
    +538     /**
    +539      * Get the value of nodeAnalyzerEnabled.
    +540      *
    +541      * @return the value of nodeAnalyzerEnabled
    +542      */
    +543     public boolean isNodeAnalyzerEnabled() {
    +544         return nodeAnalyzerEnabled;
    +545     }
    +546 
    +547     /**
    +548      * Set the value of nodeAnalyzerEnabled.
    +549      *
    +550      * @param nodeAnalyzerEnabled new value of nodeAnalyzerEnabled
    +551      */
    +552     public void setNodeAnalyzerEnabled(boolean nodeAnalyzerEnabled) {
    +553         this.nodeAnalyzerEnabled = nodeAnalyzerEnabled;
    +554     }
    +555     /**
    +556      * Whether the ruby gemspec analyzer should be enabled.
    +557      */
    +558     private boolean rubygemsAnalyzerEnabled = true;
    +559 
    +560     /**
    +561      * Get the value of rubygemsAnalyzerEnabled.
    +562      *
    +563      * @return the value of rubygemsAnalyzerEnabled
    +564      */
    +565     public boolean isRubygemsAnalyzerEnabled() {
    +566         return rubygemsAnalyzerEnabled;
    +567     }
    +568 
    +569     /**
    +570      * Set the value of rubygemsAnalyzerEnabled.
    +571      *
    +572      * @param rubygemsAnalyzerEnabled new value of rubygemsAnalyzerEnabled
    +573      */
    +574     public void setRubygemsAnalyzerEnabled(boolean rubygemsAnalyzerEnabled) {
    +575         this.rubygemsAnalyzerEnabled = rubygemsAnalyzerEnabled;
    +576     }
    +577     /**
    +578      * Whether the python package analyzer should be enabled.
    +579      */
    +580     private boolean pyPackageAnalyzerEnabled = true;
    +581 
    +582     /**
    +583      * Get the value of pyPackageAnalyzerEnabled.
    +584      *
    +585      * @return the value of pyPackageAnalyzerEnabled
    +586      */
    +587     public boolean isPyPackageAnalyzerEnabled() {
    +588         return pyPackageAnalyzerEnabled;
    +589     }
    +590 
    +591     /**
    +592      * Set the value of pyPackageAnalyzerEnabled.
    +593      *
    +594      * @param pyPackageAnalyzerEnabled new value of pyPackageAnalyzerEnabled
    +595      */
    +596     public void setPyPackageAnalyzerEnabled(boolean pyPackageAnalyzerEnabled) {
    +597         this.pyPackageAnalyzerEnabled = pyPackageAnalyzerEnabled;
    +598     }
    +599 
    +600     /**
    +601      * Whether the python distribution analyzer should be enabled.
    +602      */
    +603     private boolean pyDistributionAnalyzerEnabled = true;
    +604 
    +605     /**
    +606      * Get the value of pyDistributionAnalyzerEnabled.
    +607      *
    +608      * @return the value of pyDistributionAnalyzerEnabled
    +609      */
    +610     public boolean isPyDistributionAnalyzerEnabled() {
    +611         return pyDistributionAnalyzerEnabled;
    +612     }
    +613 
    +614     /**
    +615      * Set the value of pyDistributionAnalyzerEnabled.
    +616      *
    +617      * @param pyDistributionAnalyzerEnabled new value of pyDistributionAnalyzerEnabled
    +618      */
    +619     public void setPyDistributionAnalyzerEnabled(boolean pyDistributionAnalyzerEnabled) {
    +620         this.pyDistributionAnalyzerEnabled = pyDistributionAnalyzerEnabled;
    +621     }
    +622 
    +623     /**
    +624      * Whether or not the central analyzer is enabled.
    +625      */
    +626     private boolean centralAnalyzerEnabled = false;
    +627 
    +628     /**
    +629      * Get the value of centralAnalyzerEnabled.
    +630      *
    +631      * @return the value of centralAnalyzerEnabled
    +632      */
    +633     public boolean isCentralAnalyzerEnabled() {
    +634         return centralAnalyzerEnabled;
    +635     }
    +636 
    +637     /**
    +638      * Set the value of centralAnalyzerEnabled.
    +639      *
    +640      * @param centralAnalyzerEnabled new value of centralAnalyzerEnabled
    +641      */
    +642     public void setCentralAnalyzerEnabled(boolean centralAnalyzerEnabled) {
    +643         this.centralAnalyzerEnabled = centralAnalyzerEnabled;
    +644     }
    +645 
    +646     /**
    +647      * Whether or not the nexus analyzer is enabled.
    +648      */
    +649     private boolean nexusAnalyzerEnabled = true;
    +650 
    +651     /**
    +652      * Get the value of nexusAnalyzerEnabled.
    +653      *
    +654      * @return the value of nexusAnalyzerEnabled
    +655      */
    +656     public boolean isNexusAnalyzerEnabled() {
    +657         return nexusAnalyzerEnabled;
    +658     }
    +659 
    +660     /**
    +661      * Set the value of nexusAnalyzerEnabled.
    +662      *
    +663      * @param nexusAnalyzerEnabled new value of nexusAnalyzerEnabled
    +664      */
    +665     public void setNexusAnalyzerEnabled(boolean nexusAnalyzerEnabled) {
    +666         this.nexusAnalyzerEnabled = nexusAnalyzerEnabled;
    +667     }
    +668 
    +669     /**
    +670      * The URL of a Nexus server's REST API end point (http://domain/nexus/service/local).
    +671      */
    +672     private String nexusUrl;
    +673 
    +674     /**
    +675      * Get the value of nexusUrl.
    +676      *
    +677      * @return the value of nexusUrl
    +678      */
    +679     public String getNexusUrl() {
    +680         return nexusUrl;
    +681     }
    +682 
    +683     /**
    +684      * Set the value of nexusUrl.
    +685      *
    +686      * @param nexusUrl new value of nexusUrl
    +687      */
    +688     public void setNexusUrl(String nexusUrl) {
    +689         this.nexusUrl = nexusUrl;
    +690     }
    +691     /**
    +692      * Whether or not the defined proxy should be used when connecting to Nexus.
    +693      */
    +694     private boolean nexusUsesProxy = true;
    +695 
    +696     /**
    +697      * Get the value of nexusUsesProxy.
    +698      *
    +699      * @return the value of nexusUsesProxy
    +700      */
    +701     public boolean isNexusUsesProxy() {
    +702         return nexusUsesProxy;
    +703     }
    +704 
    +705     /**
    +706      * Set the value of nexusUsesProxy.
    +707      *
    +708      * @param nexusUsesProxy new value of nexusUsesProxy
    +709      */
    +710     public void setNexusUsesProxy(boolean nexusUsesProxy) {
    +711         this.nexusUsesProxy = nexusUsesProxy;
    +712     }
    +713 
    +714     /**
    +715      * Additional ZIP File extensions to add analyze. This should be a comma-separated list of file extensions to treat like ZIP
    +716      * files.
    +717      */
    +718     private String zipExtensions;
    +719 
    +720     /**
    +721      * Get the value of zipExtensions.
    +722      *
    +723      * @return the value of zipExtensions
    +724      */
    +725     public String getZipExtensions() {
    +726         return zipExtensions;
    +727     }
    +728 
    +729     /**
    +730      * Set the value of zipExtensions.
    +731      *
    +732      * @param zipExtensions new value of zipExtensions
    +733      */
    +734     public void setZipExtensions(String zipExtensions) {
    +735         this.zipExtensions = zipExtensions;
    +736     }
    +737 
    +738     /**
    +739      * The path to Mono for .NET assembly analysis on non-windows systems.
    +740      */
    +741     private String pathToMono;
    +742 
    +743     /**
    +744      * Get the value of pathToMono.
    +745      *
    +746      * @return the value of pathToMono
    +747      */
    +748     public String getPathToMono() {
    +749         return pathToMono;
    +750     }
    +751 
    +752     /**
    +753      * Set the value of pathToMono.
    +754      *
    +755      * @param pathToMono new value of pathToMono
    +756      */
    +757     public void setPathToMono(String pathToMono) {
    +758         this.pathToMono = pathToMono;
    +759     }
    +760 
    +761     @Override
    +762     public void execute() throws BuildException {
    +763         dealWithReferences();
    +764         validateConfiguration();
    +765         populateSettings();
    +766         Engine engine = null;
    +767         try {
    +768             engine = new Engine(Check.class.getClassLoader());
    +769             if (isUpdateOnly()) {
    +770                 log("Deprecated 'UpdateOnly' property set; please use the UpdateTask instead", Project.MSG_WARN);
    +771                 engine.doUpdates();
    +772             } else {
    +773                 try {
    +774                     for (Resource resource : path) {
    +775                         final FileProvider provider = resource.as(FileProvider.class);
    +776                         if (provider != null) {
    +777                             final File file = provider.getFile();
    +778                             if (file != null && file.exists()) {
    +779                                 engine.scan(file);
    +780                             }
    +781                         }
    +782                     }
    +783 
    +784                     engine.analyzeDependencies();
    +785                     DatabaseProperties prop = null;
    +786                     CveDB cve = null;
    +787                     try {
    +788                         cve = new CveDB();
    +789                         cve.open();
    +790                         prop = cve.getDatabaseProperties();
    +791                     } catch (DatabaseException ex) {
    +792                         log("Unable to retrieve DB Properties", ex, Project.MSG_DEBUG);
    +793                     } finally {
    +794                         if (cve != null) {
    +795                             cve.close();
    +796                         }
    +797                     }
    +798                     final ReportGenerator reporter = new ReportGenerator(getProjectName(), engine.getDependencies(), engine.getAnalyzers(), prop);
    +799                     reporter.generateReports(reportOutputDirectory, reportFormat);
    +800 
    +801                     if (this.failBuildOnCVSS <= 10) {
    +802                         checkForFailure(engine.getDependencies());
    +803                     }
    +804                     if (this.showSummary) {
    +805                         showSummary(engine.getDependencies());
    +806                     }
    +807                 } catch (IOException ex) {
    +808                     log("Unable to generate dependency-check report", ex, Project.MSG_DEBUG);
    +809                     throw new BuildException("Unable to generate dependency-check report", ex);
    +810                 } catch (Exception ex) {
    +811                     log("An exception occurred; unable to continue task", ex, Project.MSG_DEBUG);
    +812                     throw new BuildException("An exception occurred; unable to continue task", ex);
    +813                 }
    +814             }
    +815         } catch (DatabaseException ex) {
    +816             log("Unable to connect to the dependency-check database; analysis has stopped", ex, Project.MSG_ERR);
    +817         } finally {
    +818             Settings.cleanup(true);
    +819             if (engine != null) {
    +820                 engine.cleanup();
    +821             }
    +822         }
    +823     }
    +824 
    +825     /**
    +826      * Validate the configuration to ensure the parameters have been properly configured/initialized.
    +827      *
    +828      * @throws BuildException if the task was not configured correctly.
    +829      */
    +830     private void validateConfiguration() throws BuildException {
    +831         if (path == null) {
    +832             throw new BuildException("No project dependencies have been defined to analyze.");
    +833         }
    +834         if (failBuildOnCVSS < 0 || failBuildOnCVSS > 11) {
    +835             throw new BuildException("Invalid configuration, failBuildOnCVSS must be between 0 and 11.");
    +836         }
    +837     }
    +838 
    +839     /**
    +840      * Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system properties
    +841      * required to change the proxy server, port, and connection timeout.
    +842      */
    +843     @Override
    +844     protected void populateSettings() {
    +845         super.populateSettings();
    +846         Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, autoUpdate);
    +847 
    +848         if (suppressionFile != null && !suppressionFile.isEmpty()) {
    +849             Settings.setString(Settings.KEYS.SUPPRESSION_FILE, suppressionFile);
    +850         }
    +851 
    +852         Settings.setBoolean(Settings.KEYS.ANALYZER_JAR_ENABLED, jarAnalyzerEnabled);
    +853 
    +854         Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED, pyDistributionAnalyzerEnabled);
    +855         Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_PACKAGE_ENABLED, pyPackageAnalyzerEnabled);
    +856         Settings.setBoolean(Settings.KEYS.ANALYZER_RUBY_GEMSPEC_ENABLED, rubygemsAnalyzerEnabled);
    +857         Settings.setBoolean(Settings.KEYS.ANALYZER_OPENSSL_ENABLED, opensslAnalyzerEnabled);
    +858         Settings.setBoolean(Settings.KEYS.ANALYZER_CMAKE_ENABLED, cmakeAnalyzerEnabled);
    +859         Settings.setBoolean(Settings.KEYS.ANALYZER_AUTOCONF_ENABLED, autoconfAnalyzerEnabled);
    +860         Settings.setBoolean(Settings.KEYS.ANALYZER_COMPOSER_LOCK_ENABLED, composerAnalyzerEnabled);
    +861         Settings.setBoolean(Settings.KEYS.ANALYZER_NODE_PACKAGE_ENABLED, nodeAnalyzerEnabled);
    +862 
    +863         Settings.setBoolean(Settings.KEYS.ANALYZER_NUSPEC_ENABLED, nuspecAnalyzerEnabled);
    +864         Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, centralAnalyzerEnabled);
    +865         Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, nexusAnalyzerEnabled);
    +866         if (nexusUrl != null && !nexusUrl.isEmpty()) {
    +867             Settings.setString(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl);
    +868         }
    +869         Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_PROXY, nexusUsesProxy);
    +870         Settings.setBoolean(Settings.KEYS.ANALYZER_ARCHIVE_ENABLED, archiveAnalyzerEnabled);
    +871         if (zipExtensions != null && !zipExtensions.isEmpty()) {
    +872             Settings.setString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS, zipExtensions);
    +873         }
    +874         Settings.setBoolean(Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED, assemblyAnalyzerEnabled);
    +875         if (pathToMono != null && !pathToMono.isEmpty()) {
    +876             Settings.setString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH, pathToMono);
    +877         }
    +878     }
    +879 
    +880     /**
    +881      * Checks to see if a vulnerability has been identified with a CVSS score that is above the threshold set in the
    +882      * configuration.
    +883      *
    +884      * @param dependencies the list of dependency objects
    +885      * @throws BuildException thrown if a CVSS score is found that is higher then the threshold set
    +886      */
    +887     private void checkForFailure(List<Dependency> dependencies) throws BuildException {
    +888         final StringBuilder ids = new StringBuilder();
    +889         for (Dependency d : dependencies) {
    +890             for (Vulnerability v : d.getVulnerabilities()) {
    +891                 if (v.getCvssScore() >= failBuildOnCVSS) {
    +892                     if (ids.length() == 0) {
    +893                         ids.append(v.getName());
    +894                     } else {
    +895                         ids.append(", ").append(v.getName());
    +896                     }
    +897                 }
    +898             }
    +899         }
    +900         if (ids.length() > 0) {
    +901             final String msg = String.format("%n%nDependency-Check Failure:%n"
    +902                     + "One or more dependencies were identified with vulnerabilities that have a CVSS score greater then '%.1f': %s%n"
    +903                     + "See the dependency-check report for more details.%n%n", failBuildOnCVSS, ids.toString());
    +904             throw new BuildException(msg);
    +905         }
    +906     }
    +907 
    +908     /**
    +909      * Generates a warning message listing a summary of dependencies and their associated CPE and CVE entries.
    +910      *
    +911      * @param dependencies a list of dependency objects
    +912      */
    +913     private void showSummary(List<Dependency> dependencies) {
    +914         final StringBuilder summary = new StringBuilder();
    +915         for (Dependency d : dependencies) {
    +916             boolean firstEntry = true;
    +917             final StringBuilder ids = new StringBuilder();
    +918             for (Vulnerability v : d.getVulnerabilities()) {
    +919                 if (firstEntry) {
    +920                     firstEntry = false;
    +921                 } else {
    +922                     ids.append(", ");
    +923                 }
    +924                 ids.append(v.getName());
    +925             }
    +926             if (ids.length() > 0) {
    +927                 summary.append(d.getFileName()).append(" (");
    +928                 firstEntry = true;
    +929                 for (Identifier id : d.getIdentifiers()) {
    +930                     if (firstEntry) {
    +931                         firstEntry = false;
    +932                     } else {
    +933                         summary.append(", ");
    +934                     }
    +935                     summary.append(id.getValue());
    +936                 }
    +937                 summary.append(") : ").append(ids).append(NEW_LINE);
    +938             }
    +939         }
    +940         if (summary.length() > 0) {
    +941             final String msg = String.format("%n%n"
    +942                     + "One or more dependencies were identified with known vulnerabilities:%n%n%s"
    +943                     + "%n%nSee the dependency-check report for more details.%n%n", summary.toString());
    +944             log(msg, Project.MSG_WARN);
    +945         }
    +946     }
    +947 
    +948     /**
    +949      * An enumeration of supported report formats: "ALL", "HTML", "XML", "VULN", etc..
    +950      */
    +951     public static class ReportFormats extends EnumeratedAttribute {
    +952 
    +953         /**
    +954          * Returns the list of values for the report format.
    +955          *
    +956          * @return the list of values for the report format
    +957          */
    +958         @Override
    +959         public String[] getValues() {
    +960             int i = 0;
    +961             final Format[] formats = Format.values();
    +962             final String[] values = new String[formats.length];
    +963             for (Format format : formats) {
    +964                 values[i++] = format.name();
    +965             }
    +966             return values;
    +967         }
    +968     }
    +969 }
    +
    +
    + + + diff --git a/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/Purge.html b/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/Purge.html new file mode 100644 index 000000000..66f9e347c --- /dev/null +++ b/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/Purge.html @@ -0,0 +1,140 @@ + + + +Purge xref + + + +
    +1   /*
    +2    * This file is part of dependency-check-ant.
    +3    *
    +4    * Licensed under the Apache License, Version 2.0 (the "License");
    +5    * you may not use this file except in compliance with the License.
    +6    * You may obtain a copy of the License at
    +7    *
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
    +9    *
    +10   * Unless required by applicable law or agreed to in writing, software
    +11   * distributed under the License is distributed on an "AS IS" BASIS,
    +12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +13   * See the License for the specific language governing permissions and
    +14   * limitations under the License.
    +15   *
    +16   * Copyright (c) 2015 Jeremy Long. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.taskdefs;
    +19  
    +20  import java.io.File;
    +21  import java.io.IOException;
    +22  import java.io.InputStream;
    +23  import org.apache.tools.ant.BuildException;
    +24  import org.apache.tools.ant.Project;
    +25  import org.apache.tools.ant.Task;
    +26  import org.owasp.dependencycheck.utils.Settings;
    +27  import org.slf4j.impl.StaticLoggerBinder;
    +28  
    +29  /**
    +30   * An Ant task definition to execute dependency-check during an Ant build.
    +31   *
    +32   * @author Jeremy Long
    +33   */
    +34  public class Purge extends Task {
    +35  
    +36      /**
    +37       * The properties file location.
    +38       */
    +39      private static final String PROPERTIES_FILE = "task.properties";
    +40  
    +41      /**
    +42       * Construct a new DependencyCheckTask.
    +43       */
    +44      public Purge() {
    +45          super();
    +46          // Call this before Dependency Check Core starts logging anything - this way, all SLF4J messages from
    +47          // core end up coming through this tasks logger
    +48          StaticLoggerBinder.getSingleton().setTask(this);
    +49      }
    +50  
    +51      /**
    +52       * The location of the data directory that contains
    +53       */
    +54      private String dataDirectory = null;
    +55  
    +56      /**
    +57       * Get the value of dataDirectory.
    +58       *
    +59       * @return the value of dataDirectory
    +60       */
    +61      public String getDataDirectory() {
    +62          return dataDirectory;
    +63      }
    +64  
    +65      /**
    +66       * Set the value of dataDirectory.
    +67       *
    +68       * @param dataDirectory new value of dataDirectory
    +69       */
    +70      public void setDataDirectory(String dataDirectory) {
    +71          this.dataDirectory = dataDirectory;
    +72      }
    +73  
    +74      @Override
    +75      public void execute() throws BuildException {
    +76          populateSettings();
    +77          File db;
    +78          try {
    +79              db = new File(Settings.getDataDirectory(), "dc.h2.db");
    +80              if (db.exists()) {
    +81                  if (db.delete()) {
    +82                      log("Database file purged; local copy of the NVD has been removed", Project.MSG_INFO);
    +83                  } else {
    +84                      log(String.format("Unable to delete '%s'; please delete the file manually", db.getAbsolutePath()), Project.MSG_ERR);
    +85                  }
    +86              } else {
    +87                  log(String.format("Unable to purge database; the database file does not exists: %s", db.getAbsolutePath()), Project.MSG_ERR);
    +88              }
    +89          } catch (IOException ex) {
    +90              log("Unable to delete the database", Project.MSG_ERR);
    +91          } finally {
    +92              Settings.cleanup(true);
    +93          }
    +94      }
    +95  
    +96      /**
    +97       * Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system properties
    +98       * required to change the proxy server, port, and connection timeout.
    +99       */
    +100     protected void populateSettings() {
    +101         Settings.initialize();
    +102         InputStream taskProperties = null;
    +103         try {
    +104             taskProperties = this.getClass().getClassLoader().getResourceAsStream(PROPERTIES_FILE);
    +105             Settings.mergeProperties(taskProperties);
    +106         } catch (IOException ex) {
    +107             log("Unable to load the dependency-check ant task.properties file.", ex, Project.MSG_WARN);
    +108         } finally {
    +109             if (taskProperties != null) {
    +110                 try {
    +111                     taskProperties.close();
    +112                 } catch (IOException ex) {
    +113                     log("", ex, Project.MSG_DEBUG);
    +114                 }
    +115             }
    +116         }
    +117         if (dataDirectory != null) {
    +118             Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDirectory);
    +119         } else {
    +120             final File jarPath = new File(Purge.class.getProtectionDomain().getCodeSource().getLocation().getPath());
    +121             final File base = jarPath.getParentFile();
    +122             final String sub = Settings.getString(Settings.KEYS.DATA_DIRECTORY);
    +123             final File dataDir = new File(base, sub);
    +124             Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath());
    +125         }
    +126     }
    +127 }
    +
    +
    + + + diff --git a/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/Update.html b/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/Update.html new file mode 100644 index 000000000..015f73e1c --- /dev/null +++ b/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/Update.html @@ -0,0 +1,446 @@ + + + +Update xref + + + +
    +1   /*
    +2    * This file is part of dependency-check-ant.
    +3    *
    +4    * Licensed under the Apache License, Version 2.0 (the "License");
    +5    * you may not use this file except in compliance with the License.
    +6    * You may obtain a copy of the License at
    +7    *
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
    +9    *
    +10   * Unless required by applicable law or agreed to in writing, software
    +11   * distributed under the License is distributed on an "AS IS" BASIS,
    +12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +13   * See the License for the specific language governing permissions and
    +14   * limitations under the License.
    +15   *
    +16   * Copyright (c) 2015 Jeremy Long. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.taskdefs;
    +19  
    +20  import org.apache.tools.ant.BuildException;
    +21  import org.owasp.dependencycheck.Engine;
    +22  import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
    +23  import org.owasp.dependencycheck.utils.Settings;
    +24  import org.slf4j.impl.StaticLoggerBinder;
    +25  
    +26  /**
    +27   * An Ant task definition to execute dependency-check update. This will download the latest data from the National Vulnerability
    +28   * Database (NVD) and store a copy in the local database.
    +29   *
    +30   * @author Jeremy Long
    +31   */
    +32  public class Update extends Purge {
    +33  
    +34      /**
    +35       * Construct a new UpdateTask.
    +36       */
    +37      public Update() {
    +38          super();
    +39          // Call this before Dependency Check Core starts logging anything - this way, all SLF4J messages from
    +40          // core end up coming through this tasks logger
    +41          StaticLoggerBinder.getSingleton().setTask(this);
    +42      }
    +43  
    +44      /**
    +45       * The Proxy Server.
    +46       */
    +47      private String proxyServer;
    +48  
    +49      /**
    +50       * Get the value of proxyServer.
    +51       *
    +52       * @return the value of proxyServer
    +53       */
    +54      public String getProxyServer() {
    +55          return proxyServer;
    +56      }
    +57  
    +58      /**
    +59       * Set the value of proxyServer.
    +60       *
    +61       * @param server new value of proxyServer
    +62       */
    +63      public void setProxyServer(String server) {
    +64          this.proxyServer = server;
    +65      }
    +66  
    +67      /**
    +68       * The Proxy Port.
    +69       */
    +70      private String proxyPort;
    +71  
    +72      /**
    +73       * Get the value of proxyPort.
    +74       *
    +75       * @return the value of proxyPort
    +76       */
    +77      public String getProxyPort() {
    +78          return proxyPort;
    +79      }
    +80  
    +81      /**
    +82       * Set the value of proxyPort.
    +83       *
    +84       * @param proxyPort new value of proxyPort
    +85       */
    +86      public void setProxyPort(String proxyPort) {
    +87          this.proxyPort = proxyPort;
    +88      }
    +89      /**
    +90       * The Proxy username.
    +91       */
    +92      private String proxyUsername;
    +93  
    +94      /**
    +95       * Get the value of proxyUsername.
    +96       *
    +97       * @return the value of proxyUsername
    +98       */
    +99      public String getProxyUsername() {
    +100         return proxyUsername;
    +101     }
    +102 
    +103     /**
    +104      * Set the value of proxyUsername.
    +105      *
    +106      * @param proxyUsername new value of proxyUsername
    +107      */
    +108     public void setProxyUsername(String proxyUsername) {
    +109         this.proxyUsername = proxyUsername;
    +110     }
    +111     /**
    +112      * The Proxy password.
    +113      */
    +114     private String proxyPassword;
    +115 
    +116     /**
    +117      * Get the value of proxyPassword.
    +118      *
    +119      * @return the value of proxyPassword
    +120      */
    +121     public String getProxyPassword() {
    +122         return proxyPassword;
    +123     }
    +124 
    +125     /**
    +126      * Set the value of proxyPassword.
    +127      *
    +128      * @param proxyPassword new value of proxyPassword
    +129      */
    +130     public void setProxyPassword(String proxyPassword) {
    +131         this.proxyPassword = proxyPassword;
    +132     }
    +133     /**
    +134      * The Connection Timeout.
    +135      */
    +136     private String connectionTimeout;
    +137 
    +138     /**
    +139      * Get the value of connectionTimeout.
    +140      *
    +141      * @return the value of connectionTimeout
    +142      */
    +143     public String getConnectionTimeout() {
    +144         return connectionTimeout;
    +145     }
    +146 
    +147     /**
    +148      * Set the value of connectionTimeout.
    +149      *
    +150      * @param connectionTimeout new value of connectionTimeout
    +151      */
    +152     public void setConnectionTimeout(String connectionTimeout) {
    +153         this.connectionTimeout = connectionTimeout;
    +154     }
    +155     /**
    +156      * The database driver name; such as org.h2.Driver.
    +157      */
    +158     private String databaseDriverName;
    +159 
    +160     /**
    +161      * Get the value of databaseDriverName.
    +162      *
    +163      * @return the value of databaseDriverName
    +164      */
    +165     public String getDatabaseDriverName() {
    +166         return databaseDriverName;
    +167     }
    +168 
    +169     /**
    +170      * Set the value of databaseDriverName.
    +171      *
    +172      * @param databaseDriverName new value of databaseDriverName
    +173      */
    +174     public void setDatabaseDriverName(String databaseDriverName) {
    +175         this.databaseDriverName = databaseDriverName;
    +176     }
    +177 
    +178     /**
    +179      * The path to the database driver JAR file if it is not on the class path.
    +180      */
    +181     private String databaseDriverPath;
    +182 
    +183     /**
    +184      * Get the value of databaseDriverPath.
    +185      *
    +186      * @return the value of databaseDriverPath
    +187      */
    +188     public String getDatabaseDriverPath() {
    +189         return databaseDriverPath;
    +190     }
    +191 
    +192     /**
    +193      * Set the value of databaseDriverPath.
    +194      *
    +195      * @param databaseDriverPath new value of databaseDriverPath
    +196      */
    +197     public void setDatabaseDriverPath(String databaseDriverPath) {
    +198         this.databaseDriverPath = databaseDriverPath;
    +199     }
    +200     /**
    +201      * The database connection string.
    +202      */
    +203     private String connectionString;
    +204 
    +205     /**
    +206      * Get the value of connectionString.
    +207      *
    +208      * @return the value of connectionString
    +209      */
    +210     public String getConnectionString() {
    +211         return connectionString;
    +212     }
    +213 
    +214     /**
    +215      * Set the value of connectionString.
    +216      *
    +217      * @param connectionString new value of connectionString
    +218      */
    +219     public void setConnectionString(String connectionString) {
    +220         this.connectionString = connectionString;
    +221     }
    +222     /**
    +223      * The user name for connecting to the database.
    +224      */
    +225     private String databaseUser;
    +226 
    +227     /**
    +228      * Get the value of databaseUser.
    +229      *
    +230      * @return the value of databaseUser
    +231      */
    +232     public String getDatabaseUser() {
    +233         return databaseUser;
    +234     }
    +235 
    +236     /**
    +237      * Set the value of databaseUser.
    +238      *
    +239      * @param databaseUser new value of databaseUser
    +240      */
    +241     public void setDatabaseUser(String databaseUser) {
    +242         this.databaseUser = databaseUser;
    +243     }
    +244 
    +245     /**
    +246      * The password to use when connecting to the database.
    +247      */
    +248     private String databasePassword;
    +249 
    +250     /**
    +251      * Get the value of databasePassword.
    +252      *
    +253      * @return the value of databasePassword
    +254      */
    +255     public String getDatabasePassword() {
    +256         return databasePassword;
    +257     }
    +258 
    +259     /**
    +260      * Set the value of databasePassword.
    +261      *
    +262      * @param databasePassword new value of databasePassword
    +263      */
    +264     public void setDatabasePassword(String databasePassword) {
    +265         this.databasePassword = databasePassword;
    +266     }
    +267 
    +268     /**
    +269      * The url for the modified NVD CVE (1.2 schema).
    +270      */
    +271     private String cveUrl12Modified;
    +272 
    +273     /**
    +274      * Get the value of cveUrl12Modified.
    +275      *
    +276      * @return the value of cveUrl12Modified
    +277      */
    +278     public String getCveUrl12Modified() {
    +279         return cveUrl12Modified;
    +280     }
    +281 
    +282     /**
    +283      * Set the value of cveUrl12Modified.
    +284      *
    +285      * @param cveUrl12Modified new value of cveUrl12Modified
    +286      */
    +287     public void setCveUrl12Modified(String cveUrl12Modified) {
    +288         this.cveUrl12Modified = cveUrl12Modified;
    +289     }
    +290 
    +291     /**
    +292      * The url for the modified NVD CVE (2.0 schema).
    +293      */
    +294     private String cveUrl20Modified;
    +295 
    +296     /**
    +297      * Get the value of cveUrl20Modified.
    +298      *
    +299      * @return the value of cveUrl20Modified
    +300      */
    +301     public String getCveUrl20Modified() {
    +302         return cveUrl20Modified;
    +303     }
    +304 
    +305     /**
    +306      * Set the value of cveUrl20Modified.
    +307      *
    +308      * @param cveUrl20Modified new value of cveUrl20Modified
    +309      */
    +310     public void setCveUrl20Modified(String cveUrl20Modified) {
    +311         this.cveUrl20Modified = cveUrl20Modified;
    +312     }
    +313 
    +314     /**
    +315      * Base Data Mirror URL for CVE 1.2.
    +316      */
    +317     private String cveUrl12Base;
    +318 
    +319     /**
    +320      * Get the value of cveUrl12Base.
    +321      *
    +322      * @return the value of cveUrl12Base
    +323      */
    +324     public String getCveUrl12Base() {
    +325         return cveUrl12Base;
    +326     }
    +327 
    +328     /**
    +329      * Set the value of cveUrl12Base.
    +330      *
    +331      * @param cveUrl12Base new value of cveUrl12Base
    +332      */
    +333     public void setCveUrl12Base(String cveUrl12Base) {
    +334         this.cveUrl12Base = cveUrl12Base;
    +335     }
    +336 
    +337     /**
    +338      * Data Mirror URL for CVE 2.0.
    +339      */
    +340     private String cveUrl20Base;
    +341 
    +342     /**
    +343      * Get the value of cveUrl20Base.
    +344      *
    +345      * @return the value of cveUrl20Base
    +346      */
    +347     public String getCveUrl20Base() {
    +348         return cveUrl20Base;
    +349     }
    +350 
    +351     /**
    +352      * Set the value of cveUrl20Base.
    +353      *
    +354      * @param cveUrl20Base new value of cveUrl20Base
    +355      */
    +356     public void setCveUrl20Base(String cveUrl20Base) {
    +357         this.cveUrl20Base = cveUrl20Base;
    +358     }
    +359 
    +360     /**
    +361      * Executes the update by initializing the settings, downloads the NVD XML data, and then processes the data storing it in the
    +362      * local database.
    +363      *
    +364      * @throws BuildException thrown if a connection to the local database cannot be made.
    +365      */
    +366     @Override
    +367     public void execute() throws BuildException {
    +368         populateSettings();
    +369         Engine engine = null;
    +370         try {
    +371             engine = new Engine(Update.class.getClassLoader());
    +372             engine.doUpdates();
    +373         } catch (DatabaseException ex) {
    +374             throw new BuildException("Unable to connect to the dependency-check database; unable to update the NVD data", ex);
    +375         } finally {
    +376             Settings.cleanup(true);
    +377             if (engine != null) {
    +378                 engine.cleanup();
    +379             }
    +380         }
    +381     }
    +382 
    +383     /**
    +384      * Takes the properties supplied and updates the dependency-check settings. Additionally, this sets the system properties
    +385      * required to change the proxy server, port, and connection timeout.
    +386      */
    +387     @Override
    +388     protected void populateSettings() {
    +389         super.populateSettings();
    +390         if (proxyServer != null && !proxyServer.isEmpty()) {
    +391             Settings.setString(Settings.KEYS.PROXY_SERVER, proxyServer);
    +392         }
    +393         if (proxyPort != null && !proxyPort.isEmpty()) {
    +394             Settings.setString(Settings.KEYS.PROXY_PORT, proxyPort);
    +395         }
    +396         if (proxyUsername != null && !proxyUsername.isEmpty()) {
    +397             Settings.setString(Settings.KEYS.PROXY_USERNAME, proxyUsername);
    +398         }
    +399         if (proxyPassword != null && !proxyPassword.isEmpty()) {
    +400             Settings.setString(Settings.KEYS.PROXY_PASSWORD, proxyPassword);
    +401         }
    +402         if (connectionTimeout != null && !connectionTimeout.isEmpty()) {
    +403             Settings.setString(Settings.KEYS.CONNECTION_TIMEOUT, connectionTimeout);
    +404         }
    +405         if (databaseDriverName != null && !databaseDriverName.isEmpty()) {
    +406             Settings.setString(Settings.KEYS.DB_DRIVER_NAME, databaseDriverName);
    +407         }
    +408         if (databaseDriverPath != null && !databaseDriverPath.isEmpty()) {
    +409             Settings.setString(Settings.KEYS.DB_DRIVER_PATH, databaseDriverPath);
    +410         }
    +411         if (connectionString != null && !connectionString.isEmpty()) {
    +412             Settings.setString(Settings.KEYS.DB_CONNECTION_STRING, connectionString);
    +413         }
    +414         if (databaseUser != null && !databaseUser.isEmpty()) {
    +415             Settings.setString(Settings.KEYS.DB_USER, databaseUser);
    +416         }
    +417         if (databasePassword != null && !databasePassword.isEmpty()) {
    +418             Settings.setString(Settings.KEYS.DB_PASSWORD, databasePassword);
    +419         }
    +420         if (cveUrl12Modified != null && !cveUrl12Modified.isEmpty()) {
    +421             Settings.setString(Settings.KEYS.CVE_MODIFIED_12_URL, cveUrl12Modified);
    +422         }
    +423         if (cveUrl20Modified != null && !cveUrl20Modified.isEmpty()) {
    +424             Settings.setString(Settings.KEYS.CVE_MODIFIED_20_URL, cveUrl20Modified);
    +425         }
    +426         if (cveUrl12Base != null && !cveUrl12Base.isEmpty()) {
    +427             Settings.setString(Settings.KEYS.CVE_SCHEMA_1_2, cveUrl12Base);
    +428         }
    +429         if (cveUrl20Base != null && !cveUrl20Base.isEmpty()) {
    +430             Settings.setString(Settings.KEYS.CVE_SCHEMA_2_0, cveUrl20Base);
    +431         }
    +432     }
    +433 }
    +
    +
    + + + diff --git a/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/package-frame.html b/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/package-frame.html index 8df1a5f24..f36830a4b 100644 --- a/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/package-frame.html +++ b/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Ant Task 1.3.0 Reference Package org.owasp.dependencycheck.taskdefs + Dependency-Check Ant Task 1.3.1 Reference Package org.owasp.dependencycheck.taskdefs @@ -16,10 +16,16 @@ diff --git a/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/package-summary.html b/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/package-summary.html index a67113cef..ca92fefe3 100644 --- a/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/package-summary.html +++ b/dependency-check-ant/xref/org/owasp/dependencycheck/taskdefs/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Ant Task 1.3.0 Reference Package org.owasp.dependencycheck.taskdefs + Dependency-Check Ant Task 1.3.1 Reference Package org.owasp.dependencycheck.taskdefs @@ -37,12 +37,22 @@ + + + + + + diff --git a/dependency-check-ant/xref/org/slf4j/impl/package-frame.html b/dependency-check-ant/xref/org/slf4j/impl/package-frame.html index ba38ec30d..51a09d78d 100644 --- a/dependency-check-ant/xref/org/slf4j/impl/package-frame.html +++ b/dependency-check-ant/xref/org/slf4j/impl/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Ant Task 1.3.0 Reference Package org.slf4j.impl + Dependency-Check Ant Task 1.3.1 Reference Package org.slf4j.impl diff --git a/dependency-check-ant/xref/org/slf4j/impl/package-summary.html b/dependency-check-ant/xref/org/slf4j/impl/package-summary.html index 574f613a3..4a4ba09ea 100644 --- a/dependency-check-ant/xref/org/slf4j/impl/package-summary.html +++ b/dependency-check-ant/xref/org/slf4j/impl/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Ant Task 1.3.0 Reference Package org.slf4j.impl + Dependency-Check Ant Task 1.3.1 Reference Package org.slf4j.impl diff --git a/dependency-check-ant/xref/overview-frame.html b/dependency-check-ant/xref/overview-frame.html index c31684d5b..c50148da8 100644 --- a/dependency-check-ant/xref/overview-frame.html +++ b/dependency-check-ant/xref/overview-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Ant Task 1.3.0 Reference + Dependency-Check Ant Task 1.3.1 Reference diff --git a/dependency-check-ant/xref/overview-summary.html b/dependency-check-ant/xref/overview-summary.html index c1fc2ce69..6405d6a2d 100644 --- a/dependency-check-ant/xref/overview-summary.html +++ b/dependency-check-ant/xref/overview-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Ant Task 1.3.0 Reference + Dependency-Check Ant Task 1.3.1 Reference @@ -24,7 +24,7 @@ -

    Dependency-Check Ant Task 1.3.0 Reference

    +

    Dependency-Check Ant Task 1.3.1 Reference

    - DependencyCheckTask + Check
    - ReportFormats + Purge +
    + ReportFormats +
    + Update
    diff --git a/dependency-check-cli/apidocs/allclasses-frame.html b/dependency-check-cli/apidocs/allclasses-frame.html index 1655e2fab..783aa1b47 100644 --- a/dependency-check-cli/apidocs/allclasses-frame.html +++ b/dependency-check-cli/apidocs/allclasses-frame.html @@ -2,10 +2,10 @@ - + -All Classes (Dependency-Check Command Line 1.3.0 API) - +All Classes (Dependency-Check Command Line 1.3.1 API) + diff --git a/dependency-check-cli/apidocs/allclasses-noframe.html b/dependency-check-cli/apidocs/allclasses-noframe.html index cb227e09f..d93d85284 100644 --- a/dependency-check-cli/apidocs/allclasses-noframe.html +++ b/dependency-check-cli/apidocs/allclasses-noframe.html @@ -2,10 +2,10 @@ - + -All Classes (Dependency-Check Command Line 1.3.0 API) - +All Classes (Dependency-Check Command Line 1.3.1 API) + diff --git a/dependency-check-cli/apidocs/constant-values.html b/dependency-check-cli/apidocs/constant-values.html index 2d4704a09..6c2c34731 100644 --- a/dependency-check-cli/apidocs/constant-values.html +++ b/dependency-check-cli/apidocs/constant-values.html @@ -2,16 +2,16 @@ - + -Constant Field Values (Dependency-Check Command Line 1.3.0 API) - +Constant Field Values (Dependency-Check Command Line 1.3.1 API) + @@ -252,19 +252,33 @@ + + + + + - + + + + + + + + + + + - + - + - + - + - + - + - + - + - + + + + + + + + + + + - + - + - + - + - + - + - + - + @@ -524,6 +559,6 @@ -

    Copyright? 2012-15 Jeremy Long. All Rights Reserved.

    +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    diff --git a/dependency-check-cli/apidocs/deprecated-list.html b/dependency-check-cli/apidocs/deprecated-list.html index 42183731f..b1e575611 100644 --- a/dependency-check-cli/apidocs/deprecated-list.html +++ b/dependency-check-cli/apidocs/deprecated-list.html @@ -2,16 +2,16 @@ - + -Deprecated List (Dependency-Check Command Line 1.3.0 API) - +Deprecated List (Dependency-Check Command Line 1.3.1 API) + @@ -81,6 +81,16 @@ + + + + + + @@ -134,6 +144,6 @@ -

    Copyright? 2012-15 Jeremy Long. All Rights Reserved.

    +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    diff --git a/dependency-check-cli/apidocs/help-doc.html b/dependency-check-cli/apidocs/help-doc.html index a2a2d7efb..ada5702b7 100644 --- a/dependency-check-cli/apidocs/help-doc.html +++ b/dependency-check-cli/apidocs/help-doc.html @@ -2,16 +2,16 @@ - + -API Help (Dependency-Check Command Line 1.3.0 API) - +API Help (Dependency-Check Command Line 1.3.1 API) + @@ -211,6 +211,6 @@ -

    Copyright? 2012-15 Jeremy Long. All Rights Reserved.

    +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    diff --git a/dependency-check-cli/apidocs/index-all.html b/dependency-check-cli/apidocs/index-all.html index a2228ee7b..967632d64 100644 --- a/dependency-check-cli/apidocs/index-all.html +++ b/dependency-check-cli/apidocs/index-all.html @@ -2,16 +2,16 @@ - + -Index (Dependency-Check Command Line 1.3.0 API) - +Index (Dependency-Check Command Line 1.3.1 API) + @@ -83,11 +83,15 @@
     
    APP_NAME - Static variable in class org.owasp.dependencycheck.CliParser.ARGUMENT
    -
    The long CLI argument name specifying the name of the application to be scanned.
    +
    Deprecated. +
    project should be used instead
    +
    APP_NAME_SHORT - Static variable in class org.owasp.dependencycheck.CliParser.ARGUMENT
    -
    The short CLI argument name specifying the name of the application to be scanned.
    +
    Deprecated. +
    project should be used instead
    +
    @@ -193,6 +197,10 @@
    Disables the Cmake Analyzer.
    +
    DISABLE_COMPOSER - Static variable in class org.owasp.dependencycheck.CliParser.ARGUMENT
    +
    +
    Disables the Python Package Analyzer.
    +
    DISABLE_JAR - Static variable in class org.owasp.dependencycheck.CliParser.ARGUMENT
    Disables the Jar Analyzer.
    @@ -201,6 +209,10 @@
    Disables the Nexus Analyzer.
    +
    DISABLE_NODE_JS - Static variable in class org.owasp.dependencycheck.CliParser.ARGUMENT
    +
    +
    Disables the Node.js Package Analyzer.
    +
    DISABLE_NUSPEC - Static variable in class org.owasp.dependencycheck.CliParser.ARGUMENT
    Disables the Nuspec Analyzer.
    @@ -217,6 +229,10 @@
    Disables the Python Package Analyzer.
    +
    DISABLE_RUBYGEMS - Static variable in class org.owasp.dependencycheck.CliParser.ARGUMENT
    +
    +
    Disables the Ruby Gemspec Analyzer.
    +
    @@ -225,7 +241,7 @@
    ensureCanonicalPath(String) - Method in class org.owasp.dependencycheck.App
    -
    Takes a path and resolves it to be a canonical & absolute path.
    +
    Takes a path and resolves it to be a canonical & absolute path.
    EXCLUDE - Static variable in class org.owasp.dependencycheck.CliParser.ARGUMENT
    @@ -241,10 +257,6 @@
    Returns the additional Extensions if specified; otherwise null is returned.
    -
    getApplicationName() - Method in class org.owasp.dependencycheck.CliParser
    -
    -
    Returns the application name specified on the command line.
    -
    getBaseCve12Url() - Method in class org.owasp.dependencycheck.CliParser
    Returns the base URL for the CVE 1.2 XMl file.
    @@ -301,6 +313,10 @@
    Returns the path to Mono for .NET Assembly analysis on non-windows systems.
    +
    getProjectName() - Method in class org.owasp.dependencycheck.CliParser
    +
    +
    Returns the application name specified on the command line.
    +
    getPropertiesFile() - Method in class org.owasp.dependencycheck.CliParser
    Returns the properties file specified on the command line.
    @@ -389,6 +405,10 @@
    Returns true if the disableCmake command line argument was specified.
    +
    isComposerDisabled() - Method in class org.owasp.dependencycheck.CliParser
    +
    +
    Returns true if the disableComposer command line argument was specified.
    +
    isGetHelp() - Method in class org.owasp.dependencycheck.CliParser
    Determines if the 'help' command line argument was passed in.
    @@ -409,6 +429,10 @@
    Returns true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false is returned.
    +
    isNodeJsDisabled() - Method in class org.owasp.dependencycheck.CliParser
    +
    +
    Returns true if the disableNodeJS command line argument was specified.
    +
    isNuspecDisabled() - Method in class org.owasp.dependencycheck.CliParser
    Returns true if the disableNuspec command line argument was specified.
    @@ -417,6 +441,10 @@
    Returns true if the disableOpenSSL command line argument was specified.
    +
    isPurge() - Method in class org.owasp.dependencycheck.CliParser
    +
    +
    Checks if the purge NVD flag has been set.
    +
    isPythonDistributionDisabled() - Method in class org.owasp.dependencycheck.CliParser
    Returns true if the disablePyDist command line argument was specified.
    @@ -425,6 +453,10 @@
    Returns true if the disablePyPkg command line argument was specified.
    +
    isRubyGemspecDisabled() - Method in class org.owasp.dependencycheck.CliParser
    +
    +
    Returns whether the Ruby gemspec analyzer is disabled.
    +
    isRunScan() - Method in class org.owasp.dependencycheck.CliParser
    Determines if the 'scan' command line argument was passed in.
    @@ -506,6 +538,10 @@
    Prints the manifest information to standard output.
    +
    PROJECT - Static variable in class org.owasp.dependencycheck.CliParser.ARGUMENT
    +
    +
    The long CLI argument name specifying the name of the project to be scanned.
    +
    PROP - Static variable in class org.owasp.dependencycheck.CliParser.ARGUMENT
    The CLI argument name for setting the location of an additional properties file.
    @@ -536,6 +572,10 @@
    The CLI argument name indicating the proxy username.
    +
    PURGE_NVD - Static variable in class org.owasp.dependencycheck.CliParser.ARGUMENT
    +
    +
    The long CLI argument name specifying that only the update phase should be executed; no scan should be run.
    +
    @@ -646,6 +686,6 @@ -

    Copyright? 2012-15 Jeremy Long. All Rights Reserved.

    +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    diff --git a/dependency-check-cli/apidocs/index.html b/dependency-check-cli/apidocs/index.html index 5d3f36491..def3885c1 100644 --- a/dependency-check-cli/apidocs/index.html +++ b/dependency-check-cli/apidocs/index.html @@ -2,9 +2,9 @@ - + -Dependency-Check Command Line 1.3.0 API +Dependency-Check Command Line 1.3.1 API @@ -139,7 +139,7 @@ extends @@ -222,7 +222,7 @@ extends

    ensureCanonicalPath

    protected String ensureCanonicalPath(String path)
    - @@ -267,16 +271,28 @@ extends - + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - + - + - + - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + - + - + - + - + + + + + - + + + + + + + + - + - + - + @@ -285,7 +285,7 @@ - + @@ -458,6 +458,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -488,7 +514,7 @@ - + @@ -501,7 +527,7 @@ - + @@ -527,7 +553,7 @@ - + @@ -536,6 +562,19 @@ + + + + + + + + + + + + + @@ -545,7 +584,7 @@ - + @@ -558,7 +597,7 @@ - + @@ -571,7 +610,7 @@ - + @@ -584,7 +623,7 @@ - + @@ -597,7 +636,7 @@ - + @@ -610,7 +649,7 @@ - + @@ -623,7 +662,7 @@ - + @@ -636,7 +675,7 @@ - + @@ -649,7 +688,7 @@ - + @@ -662,7 +701,7 @@ - + @@ -675,7 +714,7 @@ - + @@ -688,7 +727,7 @@ - + @@ -701,7 +740,7 @@ - + @@ -714,7 +753,7 @@ - + @@ -727,7 +766,7 @@ - + @@ -740,7 +779,7 @@ - + @@ -753,7 +792,7 @@ - + @@ -763,6 +802,19 @@ + + + + + + + + + + + + + @@ -776,15 +828,14 @@ diff --git a/dependency-check-cli/checkstyle.html b/dependency-check-cli/checkstyle.html index 5682a92a9..b66b2c661 100644 --- a/dependency-check-cli/checkstyle.html +++ b/dependency-check-cli/checkstyle.html @@ -1,21 +1,21 @@ - + - dependency-check-cli - Checkstyle Results - + dependency-check-cli – Checkstyle Results + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Checkstyle Results

    -

    The following document contains the results of Checkstylerss feed

    +

    Checkstyle Results

    +

    The following document contains the results of Checkstyle 6.2 with C:\Users\jeremy\Projects\DependencyCheck\dependency-check-cli/../src/main/config/checkstyle-checks.xml ruleset. rss feed

    -

    Summary

    +

    Summary

    "disableCmake"
    + +public static final StringDISABLE_COMPOSER"disableComposer"
    public static final String DISABLE_JAR "disableJar"
    public static final String DISABLE_NEXUS "disableNexus"
    + +public static final StringDISABLE_NODE_JS"disableNodeJS"
    @@ -294,75 +308,89 @@ "disablePyPkg"
    + +public static final StringDISABLE_RUBYGEMS"disableRubygems"
    public static final String EXCLUDE "exclude"
    public static final String HELP "help"
    public static final String HELP_SHORT "h"
    public static final String NEXUS_URL "nexus"
    public static final String NEXUS_USES_PROXY "nexusUsesProxy"
    public static final String OUT "out"
    public static final String OUT_SHORT "o"
    public static final String OUTPUT_FORMAT "format"
    public static final String OUTPUT_FORMAT_SHORT "f"
    public static final String PATH_TO_MONO "mono"
    + +public static final StringPROJECT"project"
    @@ -413,62 +441,69 @@ "proxyuser"
    + +public static final StringPURGE_NVD"purge"
    public static final String SCAN "scan"
    public static final String SCAN_SHORT "s"
    public static final String SUPPRESSION_FILE "suppression"
    public static final String SYM_LINK_DEPTH "symLink"
    public static final String UPDATE_ONLY "updateonly"
    public static final String VERBOSE_LOG "log"
    public static final String VERBOSE_LOG_SHORT "l"
    public static final String VERSION "version"
    public static final String
    org.owasp.dependencycheck.CliParser.ARGUMENT.APP_NAME +
    project should be used instead
    +
    org.owasp.dependencycheck.CliParser.ARGUMENT.APP_NAME_SHORT +
    project should be used instead
    +
    org.owasp.dependencycheck.CliParser.ARGUMENT.PROXY_URL protected String ensureCanonicalPath(String path) -
    Takes a path and resolves it to be a canonical & absolute path.
    +
    Takes a path and resolves it to be a canonical & absolute path.
    static String APP_NAME -
    The long CLI argument name specifying the name of the application to be scanned.
    +
    Deprecated.  +
    project should be used instead
    +
    static String APP_NAME_SHORT -
    The short CLI argument name specifying the name of the application to be scanned.
    +
    Deprecated.  +
    project should be used instead
    +
    static StringDISABLE_JAR -
    Disables the Jar Analyzer.
    +
    DISABLE_COMPOSER +
    Disables the Python Package Analyzer.
    static StringDISABLE_JAR +
    Disables the Jar Analyzer.
    +
    static String DISABLE_NEXUS
    Disables the Nexus Analyzer.
    static StringDISABLE_NODE_JS +
    Disables the Node.js Package Analyzer.
    +
    static String DISABLE_NUSPEC @@ -303,64 +319,76 @@ extends static StringDISABLE_RUBYGEMS +
    Disables the Ruby Gemspec Analyzer.
    +
    static String EXCLUDE
    Exclude path argument.
    static String HELP
    The long CLI argument name asking for help.
    static String HELP_SHORT
    The short CLI argument name asking for help.
    static String NEXUS_URL
    The URL of the nexus server.
    static String NEXUS_USES_PROXY
    Whether or not the defined proxy should be used when connecting to Nexus.
    static String OUT
    The long CLI argument name specifying the directory to write the reports to.
    static String OUT_SHORT
    The short CLI argument name specifying the directory to write the reports to.
    static String OUTPUT_FORMAT
    The long CLI argument name specifying the output format to write the reports to.
    static String OUTPUT_FORMAT_SHORT
    The short CLI argument name specifying the output format to write the reports to.
    static String PATH_TO_MONO
    The CLI argument name for setting the path to mono for .NET Assembly analysis on non-windows systems.
    static StringPROJECT +
    The long CLI argument name specifying the name of the project to be scanned.
    +
    static String PROP @@ -407,53 +435,59 @@ extends static StringSCAN -
    The long CLI argument name specifying the directory/file to scan.
    -
    static StringSCAN_SHORT -
    The short CLI argument name specifying the directory/file to scan.
    -
    static StringSUPPRESSION_FILE -
    The CLI argument name for setting the location of the suppression file.
    -
    static StringSYM_LINK_DEPTH -
    The CLI argument name for setting the depth of symbolic links that will be followed.
    -
    static StringUPDATE_ONLY +PURGE_NVD
    The long CLI argument name specifying that only the update phase should be executed; no scan should be run.
    static StringSCAN +
    The long CLI argument name specifying the directory/file to scan.
    +
    static StringSCAN_SHORT +
    The short CLI argument name specifying the directory/file to scan.
    +
    static StringSUPPRESSION_FILE +
    The CLI argument name for setting the location of the suppression file.
    +
    static StringSYM_LINK_DEPTH +
    The CLI argument name for setting the depth of symbolic links that will be followed.
    +
    static StringUPDATE_ONLY +
    The long CLI argument name specifying that only the update phase should be executed; no scan should be run.
    +
    static String VERBOSE_LOG
    The CLI argument name for setting the location of the data directory.
    static String VERBOSE_LOG_SHORT
    The short CLI argument name for setting the location of the data directory.
    static String VERSION
    The short CLI argument name asking for the version.
    static String VERSION_SHORT
    The long CLI argument name asking for the version.
    @@ -561,6 +595,17 @@ extends See Also:
    Constant Field Values
    + + + +
      +
    • +

      PURGE_NVD

      +
      public static final String PURGE_NVD
      +
      The long CLI argument name specifying that only the update phase should be executed; no scan should be run.
      +
      See Also:
      Constant Field Values
      +
    • +
    @@ -605,13 +650,26 @@ extends See Also:
    Constant Field Values
    + + + +
      +
    • +

      PROJECT

      +
      public static final String PROJECT
      +
      The long CLI argument name specifying the name of the project to be scanned.
      +
      See Also:
      Constant Field Values
      +
    • +
    + + + +
      +
    • +

      DISABLE_COMPOSER

      +
      public static final String DISABLE_COMPOSER
      +
      Disables the Python Package Analyzer.
      +
      See Also:
      Constant Field Values
      +
    • +
    + + + +
      +
    • +

      DISABLE_RUBYGEMS

      +
      public static final String DISABLE_RUBYGEMS
      +
      Disables the Ruby Gemspec Analyzer.
      +
      See Also:
      Constant Field Values
      +
    • +
    @@ -1014,6 +1096,17 @@ public static final See Also:
    Constant Field Values
    + + + +
      +
    • +

      DISABLE_NODE_JS

      +
      public static final String DISABLE_NODE_JS
      +
      Disables the Node.js Package Analyzer.
      +
      See Also:
      Constant Field Values
      +
    • +
    @@ -1207,6 +1300,6 @@ public static final Copyright? 2012-15 Jeremy Long. All Rights Reserved.

    +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    diff --git a/dependency-check-cli/apidocs/org/owasp/dependencycheck/CliParser.html b/dependency-check-cli/apidocs/org/owasp/dependencycheck/CliParser.html index f8fcd5585..4a80d162e 100644 --- a/dependency-check-cli/apidocs/org/owasp/dependencycheck/CliParser.html +++ b/dependency-check-cli/apidocs/org/owasp/dependencycheck/CliParser.html @@ -2,16 +2,16 @@ - + -CliParser (Dependency-Check Command Line 1.3.0 API) - +CliParser (Dependency-Check Command Line 1.3.1 API) + @@ -165,94 +165,94 @@ extends
    StringgetApplicationName() -
    Returns the application name specified on the command line.
    -
    String getBaseCve12Url()
    Returns the base URL for the CVE 1.2 XMl file.
    String getBaseCve20Url()
    Returns the base URL for the CVE 2.0 XMl file.
    String getConnectionString()
    Returns the database connection string if specified; otherwise null is returned.
    String getConnectionTimeout()
    Returns the connection timeout.
    String getDatabaseDriverName()
    Returns the database driver name if specified; otherwise null is returned.
    String getDatabaseDriverPath()
    Returns the database driver path if specified; otherwise null is returned.
    String getDatabasePassword()
    Returns the database database password if specified; otherwise null is returned.
    String getDatabaseUser()
    Returns the database database user name if specified; otherwise null is returned.
    String getDataDirectory()
    Get the value of dataDirectory.
    String[] getExcludeList()
    Retrieves the list of excluded file patterns specified by the 'exclude' argument.
    String getModifiedCve12Url()
    Returns the URL for the modified CVE 1.2 XMl file.
    String getModifiedCve20Url()
    Returns the URL for the modified CVE 2.0 XMl file.
    String getNexusUrl()
    Returns the url to the nexus server if one was specified.
    String getPathToMono()
    Returns the path to Mono for .NET Assembly analysis on non-windows systems.
    StringgetProjectName() +
    Returns the application name specified on the command line.
    +
    File getPropertiesFile() @@ -357,34 +357,46 @@ extends booleanisComposerDisabled() +
    Returns true if the disableComposer command line argument was specified.
    +
    boolean isGetHelp()
    Determines if the 'help' command line argument was passed in.
    boolean isGetVersion()
    Determines if the 'version' command line argument was passed in.
    boolean isJarDisabled()
    Returns true if the disableJar command line argument was specified.
    boolean isNexusDisabled()
    Returns true if the disableNexus command line argument was specified.
    boolean isNexusUsesProxy()
    Returns true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false is returned.
    booleanisNodeJsDisabled() +
    Returns true if the disableNodeJS command line argument was specified.
    +
    boolean isNuspecDisabled() @@ -399,16 +411,28 @@ extends booleanisPythonDistributionDisabled() -
    Returns true if the disablePyDist command line argument was specified.
    +
    isPurge() +
    Checks if the purge NVD flag has been set.
    booleanisPythonDistributionDisabled() +
    Returns true if the disablePyDist command line argument was specified.
    +
    boolean isPythonPackageDisabled()
    Returns true if the disablePyPkg command line argument was specified.
    booleanisRubyGemspecDisabled() +
    Returns whether the Ruby gemspec analyzer is disabled.
    +
    boolean isRunScan() @@ -605,6 +629,17 @@ extends Returns:
    true if the disablePyPkg command line argument was specified; otherwise false
    +
    + + +
      +
    • +

      isRubyGemspecDisabled

      +
      public boolean isRubyGemspecDisabled()
      +
      Returns whether the Ruby gemspec analyzer is disabled.
      +
      Returns:
      true if the CliParser.ARGUMENT.DISABLE_RUBYGEMS command line argument was specified; otherwise false
      +
    • +
    @@ -627,6 +662,17 @@ extends Returns:
    true if the disableAutoconf command line argument was specified; otherwise false
    +
    + + +
      +
    • +

      isComposerDisabled

      +
      public boolean isComposerDisabled()
      +
      Returns true if the disableComposer command line argument was specified.
      +
      Returns:
      true if the disableComposer command line argument was specified; otherwise false
      +
    • +
    @@ -649,6 +695,17 @@ extends Returns:
    true if the disableOpenSSL command line argument was specified; otherwise false
    +
    + + +
      +
    • +

      isNodeJsDisabled

      +
      public boolean isNodeJsDisabled()
      +
      Returns true if the disableNodeJS command line argument was specified.
      +
      Returns:
      true if the disableNodeJS command line argument was specified; otherwise false
      +
    • +
    @@ -747,13 +804,13 @@ extends Returns:
    the output format name.
    -
    + + + + +
      +
    • +

      isPurge

      +
      public boolean isPurge()
      +
      Checks if the purge NVD flag has been set.
      +
      Returns:
      true if the purge nvd flag has been set; otherwise false.
      +
    • +
    @@ -1068,6 +1136,6 @@ extends Copyright? 2012-15 Jeremy Long. All Rights Reserved.

    +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    diff --git a/dependency-check-cli/apidocs/org/owasp/dependencycheck/class-use/App.html b/dependency-check-cli/apidocs/org/owasp/dependencycheck/class-use/App.html index 5be82f313..7f9875f42 100644 --- a/dependency-check-cli/apidocs/org/owasp/dependencycheck/class-use/App.html +++ b/dependency-check-cli/apidocs/org/owasp/dependencycheck/class-use/App.html @@ -2,16 +2,16 @@ - + -Uses of Class org.owasp.dependencycheck.App (Dependency-Check Command Line 1.3.0 API) - +Uses of Class org.owasp.dependencycheck.App (Dependency-Check Command Line 1.3.1 API) + @@ -110,6 +110,6 @@
    -

    Copyright? 2012-15 Jeremy Long. All Rights Reserved.

    +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    diff --git a/dependency-check-cli/apidocs/org/owasp/dependencycheck/class-use/CliParser.ARGUMENT.html b/dependency-check-cli/apidocs/org/owasp/dependencycheck/class-use/CliParser.ARGUMENT.html index 7bde7540a..6449a06db 100644 --- a/dependency-check-cli/apidocs/org/owasp/dependencycheck/class-use/CliParser.ARGUMENT.html +++ b/dependency-check-cli/apidocs/org/owasp/dependencycheck/class-use/CliParser.ARGUMENT.html @@ -2,16 +2,16 @@ - + -Uses of Class org.owasp.dependencycheck.CliParser.ARGUMENT (Dependency-Check Command Line 1.3.0 API) - +Uses of Class org.owasp.dependencycheck.CliParser.ARGUMENT (Dependency-Check Command Line 1.3.1 API) + @@ -110,6 +110,6 @@ -

    Copyright? 2012-15 Jeremy Long. All Rights Reserved.

    +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    diff --git a/dependency-check-cli/apidocs/org/owasp/dependencycheck/class-use/CliParser.html b/dependency-check-cli/apidocs/org/owasp/dependencycheck/class-use/CliParser.html index e91c2da63..60bc422b6 100644 --- a/dependency-check-cli/apidocs/org/owasp/dependencycheck/class-use/CliParser.html +++ b/dependency-check-cli/apidocs/org/owasp/dependencycheck/class-use/CliParser.html @@ -2,16 +2,16 @@ - + -Uses of Class org.owasp.dependencycheck.CliParser (Dependency-Check Command Line 1.3.0 API) - +Uses of Class org.owasp.dependencycheck.CliParser (Dependency-Check Command Line 1.3.1 API) + @@ -110,6 +110,6 @@ -

    Copyright? 2012-15 Jeremy Long. All Rights Reserved.

    +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    diff --git a/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-frame.html b/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-frame.html index 82a914c59..c213883bf 100644 --- a/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-frame.html +++ b/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-frame.html @@ -2,10 +2,10 @@ - + -org.owasp.dependencycheck (Dependency-Check Command Line 1.3.0 API) - +org.owasp.dependencycheck (Dependency-Check Command Line 1.3.1 API) + diff --git a/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-summary.html b/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-summary.html index 30fd05847..251a79838 100644 --- a/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-summary.html +++ b/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-summary.html @@ -2,16 +2,16 @@ - + -org.owasp.dependencycheck (Dependency-Check Command Line 1.3.0 API) - +org.owasp.dependencycheck (Dependency-Check Command Line 1.3.1 API) + @@ -151,6 +151,6 @@ -

    Copyright? 2012-15 Jeremy Long. All Rights Reserved.

    +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    diff --git a/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-tree.html b/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-tree.html index 24a05f467..cabf20061 100644 --- a/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-tree.html +++ b/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-tree.html @@ -2,16 +2,16 @@ - + -org.owasp.dependencycheck Class Hierarchy (Dependency-Check Command Line 1.3.0 API) - +org.owasp.dependencycheck Class Hierarchy (Dependency-Check Command Line 1.3.1 API) + @@ -121,6 +121,6 @@ -

    Copyright? 2012-15 Jeremy Long. All Rights Reserved.

    +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    diff --git a/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-use.html b/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-use.html index c4598ca01..9b5505317 100644 --- a/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-use.html +++ b/dependency-check-cli/apidocs/org/owasp/dependencycheck/package-use.html @@ -2,16 +2,16 @@ - + -Uses of Package org.owasp.dependencycheck (Dependency-Check Command Line 1.3.0 API) - +Uses of Package org.owasp.dependencycheck (Dependency-Check Command Line 1.3.1 API) + @@ -110,6 +110,6 @@ -

    Copyright? 2012-15 Jeremy Long. All Rights Reserved.

    +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    diff --git a/dependency-check-cli/apidocs/overview-tree.html b/dependency-check-cli/apidocs/overview-tree.html index 02b73ff6b..f8276f3d0 100644 --- a/dependency-check-cli/apidocs/overview-tree.html +++ b/dependency-check-cli/apidocs/overview-tree.html @@ -2,16 +2,16 @@ - + -Class Hierarchy (Dependency-Check Command Line 1.3.0 API) - +Class Hierarchy (Dependency-Check Command Line 1.3.1 API) + @@ -125,6 +125,6 @@ -

    Copyright? 2012-15 Jeremy Long. All Rights Reserved.

    +

    Copyright© 2012-15 Jeremy Long. All Rights Reserved.

    diff --git a/dependency-check-cli/arguments.html b/dependency-check-cli/arguments.html index a8e0258c5..bb8de8213 100644 --- a/dependency-check-cli/arguments.html +++ b/dependency-check-cli/arguments.html @@ -1,21 +1,21 @@ - + - dependency-check-cli - Command Line Arguments - + dependency-check-cli – Command Line Arguments + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +

    Command Line Arguments

    The following table lists the command line arguments:

    @@ -175,13 +175,13 @@
    -a --app --project <name> The name of the application being scanned. This is a required argument. The name of the project being scanned. Required
    <file> The file path to the suppression XML file; used to suppress false positives. The file path to the suppression XML file; used to suppress false positives. Optional
    --disableNodeJS Sets whether the Node.js Package Analyzer will be used. false
    --disableRubygems Sets whether the Ruby Gemspec Analyzer will be used. false
    --disableAutoconf Sets whether the Cmake Analyzer will be used. Sets whether the Cmake Analyzer will be disabled. false
    Sets whether the Archive Analyzer will be used. Sets whether the Archive Analyzer will be disabled. false
    Sets whether the Jar Analyzer will be used. Sets whether the Jar Analyzer will be disabled. false
    --disableComposer Sets whether the PHP Composer Lock File Analyzer will be disabled. false
    --disableCentral false
    false
     
    true
    false
    false
     
     
     
     
     
     
     
     
     
     
     
    -d The location of the data directory used to store persistent data. This option should generally not be set.  
    --purge Delete the local copy of the NVD. This is used to force a refresh of the data.  
    - - - + + + - + -
    FilesInfos InfosWarnings WarningsErrors Errors
     Info Warnings Errors
    108 0 02
    +1
    -

    Details

    +

    Details

    -

    src/main/java/org/owasp/dependencycheck/CliParser.java

    +

    org/owasp/dependencycheck/CliParser.java

    - + + + - - - - - - -
    ViolationSeverityCategoryRule Message Line
    ErrorsTotal number of methods is 55 (max allowed is 40).43
    Errors'}' is not preceded with whitespace.437
    + Error +sizes +MethodCount +Total number of methods is 59 (max allowed is 40). +42
    @@ -280,15 +280,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-cli/checkstyle.rss b/dependency-check-cli/checkstyle.rss index be2fbac4f..4b1c9e99e 100644 --- a/dependency-check-cli/checkstyle.rss +++ b/dependency-check-cli/checkstyle.rss @@ -25,8 +25,8 @@ under the License. en-us ©2012 - 2015 OWASP - File: 10, - Errors: 2, + <title>File: 8, + Errors: 1, Warnings: 0, Infos: 0 @@ -45,20 +45,6 @@ under the License. - - src/main/java/org/owasp/dependencycheck/InvalidScanPathException.java - - - 0 - - - 0 - - - 0 - - - org/owasp/dependencycheck/App.java @@ -74,7 +60,7 @@ under the License. - src/main/java/org/owasp/dependencycheck/package-info.java + LICENSE.txt 0 @@ -99,20 +85,6 @@ under the License. 0 - - - - src/main/java/org/owasp/dependencycheck/CliParser.java - - - 0 - - - 0 - - - 2 - @@ -139,7 +111,7 @@ under the License. 0 - 0 + 1 @@ -158,7 +130,7 @@ under the License. - src/main/java/org/owasp/dependencycheck/App.java + NOTICE.txt 0 diff --git a/dependency-check-cli/cobertura/frame-sourcefiles-org.owasp.dependencycheck.html b/dependency-check-cli/cobertura/frame-sourcefiles-org.owasp.dependencycheck.html index be4c0f69e..a1268042d 100644 --- a/dependency-check-cli/cobertura/frame-sourcefiles-org.owasp.dependencycheck.html +++ b/dependency-check-cli/cobertura/frame-sourcefiles-org.owasp.dependencycheck.html @@ -18,7 +18,7 @@ org.owasp.dependencycheck App (10%) -CliParser (58%) +CliParser (56%) InvalidScanPathException (0%) diff --git a/dependency-check-cli/cobertura/frame-sourcefiles.html b/dependency-check-cli/cobertura/frame-sourcefiles.html index fafc4405b..e4b8dec7c 100644 --- a/dependency-check-cli/cobertura/frame-sourcefiles.html +++ b/dependency-check-cli/cobertura/frame-sourcefiles.html @@ -18,7 +18,7 @@ All Packages App (10%) -CliParser (58%) +CliParser (56%) InvalidScanPathException (0%) diff --git a/dependency-check-cli/cobertura/frame-summary-org.owasp.dependencycheck.html b/dependency-check-cli/cobertura/frame-summary-org.owasp.dependencycheck.html index 099a9006e..3f681e1dc 100644 --- a/dependency-check-cli/cobertura/frame-summary-org.owasp.dependencycheck.html +++ b/dependency-check-cli/cobertura/frame-summary-org.owasp.dependencycheck.html @@ -16,7 +16,7 @@ - +
    Package # Classes Line Coverage Branch Coverage Complexity
    org.owasp.dependencycheck4
    31%
    144/464
    17%
    50/288
    3.239
    org.owasp.dependencycheck4
    30%
    148/485
    15%
    50/324
    3.282
    - + diff --git a/dependency-check-cli/cobertura/frame-summary.html b/dependency-check-cli/cobertura/frame-summary.html index d867fb93f..ec535537e 100644 --- a/dependency-check-cli/cobertura/frame-summary.html +++ b/dependency-check-cli/cobertura/frame-summary.html @@ -16,8 +16,8 @@ - - + +
    Package # Classes Line Coverage Branch Coverage Complexity
    All Packages4
    31%
    144/464
    17%
    50/288
    3.239
    org.owasp.dependencycheck4
    31%
    144/464
    17%
    50/288
    3.239
    All Packages4
    30%
    148/485
    15%
    50/324
    3.282
    org.owasp.dependencycheck4
    30%
    148/485
    15%
    50/324
    3.282
    - + diff --git a/dependency-check-cli/cobertura/org.owasp.dependencycheck.App.html b/dependency-check-cli/cobertura/org.owasp.dependencycheck.App.html index d79d957c3..df8df144e 100644 --- a/dependency-check-cli/cobertura/org.owasp.dependencycheck.App.html +++ b/dependency-check-cli/cobertura/org.owasp.dependencycheck.App.html @@ -12,7 +12,7 @@
     
    - +
    Classes in this File Line Coverage Branch Coverage Complexity
    App
    10%
    27/255
    6%
    10/144
    10.625
    App
    10%
    27/263
    6%
    10/158
    11.25
     
    @@ -84,7 +84,7 @@  33  
     import org.owasp.dependencycheck.dependency.Dependency;
     34   -
     import org.owasp.dependencycheck.org.apache.tools.ant.DirectoryScanner;
    +
     import org.apache.tools.ant.DirectoryScanner;
     35  
     import org.owasp.dependencycheck.reporting.ReportGenerator;
     36   @@ -109,7 +109,7 @@
      * @author Jeremy Long
     46  
      */
    -  47  16
     public class App {
    +  47  2
     public class App {
     48  
     
     49   @@ -118,7 +118,7 @@
          * The logger.
     51  
          */
    -  52  8
         private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
    +  52  1
         private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
     53  
     
     54   @@ -180,492 +180,514 @@
             }
     92  
     
    -  93  0
             if (cli.isGetVersion()) {
    -  94  0
                 cli.printVersionInfo();
    -  95  0
             } else if (cli.isUpdateOnly()) {
    -  96  0
                 populateSettings(cli);
    -  97  0
                 runUpdateOnly();
    -  98  0
             } else if (cli.isRunScan()) {
    -  99  0
                 populateSettings(cli);
    -  100   -
                 try {
    -  101  0
                     runScan(cli.getReportDirectory(), cli.getReportFormat(), cli.getApplicationName(), cli.getScanFiles(),
    -  102   -
                             cli.getExcludeList(), cli.getSymLinkDepth());
    -  103  0
                 } catch (InvalidScanPathException ex) {
    -  104  0
                     LOGGER.error("An invalid scan path was detected; unable to scan '//*' paths");
    -  105  0
                 }
    +  93  0
             if (cli.isPurge()) {
    +  94  0
                 if (cli.getConnectionString() != null) {
    +  95  0
                     LOGGER.error("Unable to purge the database when using a non-default connection string");
    +  96   +
                 } else {
    +  97  0
                     populateSettings(cli);
    +  98   +
                     File db;
    +  99   +
                     try {
    +  100  0
                         db = new File(Settings.getDataDirectory(), "dc.h2.db");
    +  101  0
                         if (db.exists()) {
    +  102  0
                             if (db.delete()) {
    +  103  0
                                 LOGGER.info("Database file purged; local copy of the NVD has been removed");
    +  104   +
                             } else {
    +  105  0
                                 LOGGER.error("Unable to delete '{}'; please delete the file manually", db.getAbsolutePath());
     106   -
             } else {
    -  107  0
                 cli.printHelp();
    -  108   -
             }
    -  109  0
         }
    -  110   -
     
    -  111   -
         /**
    -  112   -
          * Scans the specified directories and writes the dependency reports to the reportDirectory.
    -  113   -
          *
    -  114   -
          * @param reportDirectory the path to the directory where the reports will be written
    -  115   -
          * @param outputFormat the output format of the report
    -  116   -
          * @param applicationName the application name for the report
    -  117   -
          * @param files the files/directories to scan
    -  118   -
          * @param excludes the patterns for files/directories to exclude
    -  119   -
          * @param symLinkDepth the depth that symbolic links will be followed
    -  120   -
          *
    -  121   -
          * @throws InvalidScanPathException thrown if the path to scan starts with "//"
    -  122   -
          */
    -  123   -
         private void runScan(String reportDirectory, String outputFormat, String applicationName, String[] files,
    -  124   -
                 String[] excludes, int symLinkDepth) throws InvalidScanPathException {
    -  125  0
             Engine engine = null;
    -  126   -
             try {
    -  127  0
                 engine = new Engine();
    -  128  0
                 final List<String> antStylePaths = new ArrayList<String>();
    -  129  0
                 for (String file : files) {
    -  130  0
                     final String antPath = ensureCanonicalPath(file);
    -  131  0
                     antStylePaths.add(antPath);
    -  132   -
                 }
    -  133   -
     
    -  134  0
                 final Set<File> paths = new HashSet<File>();
    -  135  0
                 for (String file : antStylePaths) {
    -  136  0
                     LOGGER.debug("Scanning {}", file);
    -  137  0
                     final DirectoryScanner scanner = new DirectoryScanner();
    -  138  0
                     String include = file.replace('\\', '/');
    -  139   -
                     File baseDir;
    -  140   -
     
    -  141  0
                     if (include.startsWith("//")) {
    -  142  0
                         throw new InvalidScanPathException("Unable to scan paths specified by //");
    -  143   -
                     } else {
    -  144  0
                         final int pos = getLastFileSeparator(include);
    -  145  0
                         final String tmpBase = include.substring(0, pos);
    -  146  0
                         final String tmpInclude = include.substring(pos + 1);
    -  147  0
                         if (tmpInclude.indexOf('*') >= 0 || tmpInclude.indexOf('?') >= 0
    -  148   -
                                 || (new File(include)).isFile()) {
    -  149  0
                             baseDir = new File(tmpBase);
    -  150  0
                             include = tmpInclude;
    -  151   +
                             }
    +  107  
                         } else {
    -  152  0
                             baseDir = new File(tmpBase, tmpInclude);
    -  153  0
                             include = "**/*";
    -  154   +  108  0
                             LOGGER.error("Unable to purge database; the database file does not exists: {}", db.getAbsolutePath());
    +  109  
                         }
    -  155   -
                     }
    -  156   -
                     //LOGGER.debug("baseDir: {}", baseDir);
    -  157   -
                     //LOGGER.debug("include: {}", include);
    -  158  0
                     scanner.setBasedir(baseDir);
    -  159  0
                     scanner.setIncludes(include);
    -  160  0
                     scanner.setMaxLevelsOfSymlinks(symLinkDepth);
    -  161  0
                     if (symLinkDepth <= 0) {
    -  162  0
                         scanner.setFollowSymlinks(false);
    -  163   -
                     }
    -  164  0
                     if (excludes != null && excludes.length > 0) {
    -  165  0
                         scanner.addExcludes(excludes);
    -  166   -
                     }
    -  167  0
                     scanner.scan();
    -  168  0
                     if (scanner.getIncludedFilesCount() > 0) {
    -  169  0
                         for (String s : scanner.getIncludedFiles()) {
    -  170  0
                             final File f = new File(baseDir, s);
    -  171  0
                             LOGGER.debug("Found file {}", f.toString());
    -  172  0
                             paths.add(f);
    -  173   -
                         }
    -  174   -
                     }
    -  175  0
                 }
    -  176  0
                 engine.scan(paths);
    -  177   -
     
    -  178  0
                 engine.analyzeDependencies();
    -  179  0
                 final List<Dependency> dependencies = engine.getDependencies();
    -  180  0
                 DatabaseProperties prop = null;
    -  181  0
                 CveDB cve = null;
    -  182   +  110  0
                     } catch (IOException ex) {
    +  111  0
                         LOGGER.error("Unable to delete the database");
    +  112  0
                     }
    +  113  0
                 }
    +  114  0
             } else if (cli.isGetVersion()) {
    +  115  0
                 cli.printVersionInfo();
    +  116  0
             } else if (cli.isUpdateOnly()) {
    +  117  0
                 populateSettings(cli);
    +  118  0
                 runUpdateOnly();
    +  119  0
             } else if (cli.isRunScan()) {
    +  120  0
                 populateSettings(cli);
    +  121  
                 try {
    -  183  0
                     cve = new CveDB();
    -  184  0
                     cve.open();
    -  185  0
                     prop = cve.getDatabaseProperties();
    -  186  0
                 } catch (DatabaseException ex) {
    -  187  0
                     LOGGER.debug("Unable to retrieve DB Properties", ex);
    -  188   -
                 } finally {
    -  189  0
                     if (cve != null) {
    -  190  0
                         cve.close();
    -  191   -
                     }
    -  192   -
                 }
    -  193  0
                 final ReportGenerator report = new ReportGenerator(applicationName, dependencies, engine.getAnalyzers(), prop);
    -  194   -
                 try {
    -  195  0
                     report.generateReports(reportDirectory, outputFormat);
    -  196  0
                 } catch (IOException ex) {
    -  197  0
                     LOGGER.error("There was an IO error while attempting to generate the report.");
    -  198  0
                     LOGGER.debug("", ex);
    -  199  0
                 } catch (Throwable ex) {
    -  200  0
                     LOGGER.error("There was an error while attempting to generate the report.");
    -  201  0
                     LOGGER.debug("", ex);
    -  202  0
                 }
    -  203  0
             } catch (DatabaseException ex) {
    -  204  0
                 LOGGER.error("Unable to connect to the dependency-check database; analysis has stopped");
    -  205  0
                 LOGGER.debug("", ex);
    -  206   -
             } finally {
    -  207  0
                 if (engine != null) {
    -  208  0
                     engine.cleanup();
    -  209   -
                 }
    -  210   +  122  0
                     runScan(cli.getReportDirectory(), cli.getReportFormat(), cli.getProjectName(), cli.getScanFiles(),
    +  123   +
                             cli.getExcludeList(), cli.getSymLinkDepth());
    +  124  0
                 } catch (InvalidScanPathException ex) {
    +  125  0
                     LOGGER.error("An invalid scan path was detected; unable to scan '//*' paths");
    +  126  0
                 }
    +  127   +
             } else {
    +  128  0
                 cli.printHelp();
    +  129  
             }
    -  211  0
         }
    -  212   +  130  0
         }
    +  131  
     
    -  213   +  132  
         /**
    -  214   -
          * Only executes the update phase of dependency-check.
    -  215   -
          */
    -  216   -
         private void runUpdateOnly() {
    -  217  0
             Engine engine = null;
    -  218   -
             try {
    -  219  0
                 engine = new Engine();
    -  220  0
                 engine.doUpdates();
    -  221  0
             } catch (DatabaseException ex) {
    -  222  0
                 LOGGER.error("Unable to connect to the dependency-check database; analysis has stopped");
    -  223  0
                 LOGGER.debug("", ex);
    -  224   -
             } finally {
    -  225  0
                 if (engine != null) {
    -  226  0
                     engine.cleanup();
    -  227   -
                 }
    -  228   -
             }
    -  229  0
         }
    -  230   -
     
    -  231   -
         /**
    -  232   -
          * Updates the global Settings.
    -  233   +  133   +
          * Scans the specified directories and writes the dependency reports to the reportDirectory.
    +  134  
          *
    -  234   -
          * @param cli a reference to the CLI Parser that contains the command line arguments used to set the corresponding settings in
    -  235   -
          * the core engine.
    -  236   +  135   +
          * @param reportDirectory the path to the directory where the reports will be written
    +  136   +
          * @param outputFormat the output format of the report
    +  137   +
          * @param applicationName the application name for the report
    +  138   +
          * @param files the files/directories to scan
    +  139   +
          * @param excludes the patterns for files/directories to exclude
    +  140   +
          * @param symLinkDepth the depth that symbolic links will be followed
    +  141   +
          *
    +  142   +
          * @throws InvalidScanPathException thrown if the path to scan starts with "//"
    +  143  
          */
    -  237   -
         private void populateSettings(CliParser cli) {
    -  238   +  144   +
         private void runScan(String reportDirectory, String outputFormat, String applicationName, String[] files,
    +  145   +
                 String[] excludes, int symLinkDepth) throws InvalidScanPathException {
    +  146  0
             Engine engine = null;
    +  147   +
             try {
    +  148  0
                 engine = new Engine();
    +  149  0
                 final List<String> antStylePaths = new ArrayList<String>();
    +  150  0
                 for (String file : files) {
    +  151  0
                     final String antPath = ensureCanonicalPath(file);
    +  152  0
                     antStylePaths.add(antPath);
    +  153   +
                 }
    +  154  
     
    -  239  0
             final boolean autoUpdate = cli.isAutoUpdate();
    -  240  0
             final String connectionTimeout = cli.getConnectionTimeout();
    -  241  0
             final String proxyServer = cli.getProxyServer();
    -  242  0
             final String proxyPort = cli.getProxyPort();
    -  243  0
             final String proxyUser = cli.getProxyUsername();
    -  244  0
             final String proxyPass = cli.getProxyPassword();
    -  245  0
             final String dataDirectory = cli.getDataDirectory();
    -  246  0
             final File propertiesFile = cli.getPropertiesFile();
    -  247  0
             final String suppressionFile = cli.getSuppressionFile();
    -  248  0
             final boolean jarDisabled = cli.isJarDisabled();
    -  249  0
             final boolean archiveDisabled = cli.isArchiveDisabled();
    -  250  0
             final boolean pyDistDisabled = cli.isPythonDistributionDisabled();
    -  251  0
             final boolean cMakeDisabled = cli.isCmakeDisabled();
    -  252  0
             final boolean pyPkgDisabled = cli.isPythonPackageDisabled();
    -  253  0
             final boolean autoconfDisabled = cli.isAutoconfDisabled();
    -  254  0
             final boolean assemblyDisabled = cli.isAssemblyDisabled();
    -  255  0
             final boolean nuspecDisabled = cli.isNuspecDisabled();
    -  256  0
             final boolean centralDisabled = cli.isCentralDisabled();
    -  257  0
             final boolean nexusDisabled = cli.isNexusDisabled();
    -  258  0
             final String nexusUrl = cli.getNexusUrl();
    -  259  0
             final String databaseDriverName = cli.getDatabaseDriverName();
    -  260  0
             final String databaseDriverPath = cli.getDatabaseDriverPath();
    -  261  0
             final String connectionString = cli.getConnectionString();
    -  262  0
             final String databaseUser = cli.getDatabaseUser();
    -  263  0
             final String databasePassword = cli.getDatabasePassword();
    -  264  0
             final String additionalZipExtensions = cli.getAdditionalZipExtensions();
    -  265  0
             final String pathToMono = cli.getPathToMono();
    -  266  0
             final String cveMod12 = cli.getModifiedCve12Url();
    -  267  0
             final String cveMod20 = cli.getModifiedCve20Url();
    -  268  0
             final String cveBase12 = cli.getBaseCve12Url();
    -  269  0
             final String cveBase20 = cli.getBaseCve20Url();
    -  270   +  155  0
                 final Set<File> paths = new HashSet<File>();
    +  156  0
                 for (String file : antStylePaths) {
    +  157  0
                     LOGGER.debug("Scanning {}", file);
    +  158  0
                     final DirectoryScanner scanner = new DirectoryScanner();
    +  159  0
                     String include = file.replace('\\', '/');
    +  160   +
                     File baseDir;
    +  161  
     
    -  271  0
             if (propertiesFile != null) {
    -  272   +  162  0
                     if (include.startsWith("//")) {
    +  163  0
                         throw new InvalidScanPathException("Unable to scan paths specified by //");
    +  164   +
                     } else {
    +  165  0
                         final int pos = getLastFileSeparator(include);
    +  166  0
                         final String tmpBase = include.substring(0, pos);
    +  167  0
                         final String tmpInclude = include.substring(pos + 1);
    +  168  0
                         if (tmpInclude.indexOf('*') >= 0 || tmpInclude.indexOf('?') >= 0
    +  169   +
                                 || (new File(include)).isFile()) {
    +  170  0
                             baseDir = new File(tmpBase);
    +  171  0
                             include = tmpInclude;
    +  172   +
                         } else {
    +  173  0
                             baseDir = new File(tmpBase, tmpInclude);
    +  174  0
                             include = "**/*";
    +  175   +
                         }
    +  176   +
                     }
    +  177   +
                     //LOGGER.debug("baseDir: {}", baseDir);
    +  178   +
                     //LOGGER.debug("include: {}", include);
    +  179  0
                     scanner.setBasedir(baseDir);
    +  180  0
                     final String[] includes = {include};
    +  181  0
                     scanner.setIncludes(includes);
    +  182  0
                     scanner.setMaxLevelsOfSymlinks(symLinkDepth);
    +  183  0
                     if (symLinkDepth <= 0) {
    +  184  0
                         scanner.setFollowSymlinks(false);
    +  185   +
                     }
    +  186  0
                     if (excludes != null && excludes.length > 0) {
    +  187  0
                         scanner.addExcludes(excludes);
    +  188   +
                     }
    +  189  0
                     scanner.scan();
    +  190  0
                     if (scanner.getIncludedFilesCount() > 0) {
    +  191  0
                         for (String s : scanner.getIncludedFiles()) {
    +  192  0
                             final File f = new File(baseDir, s);
    +  193  0
                             LOGGER.debug("Found file {}", f.toString());
    +  194  0
                             paths.add(f);
    +  195   +
                         }
    +  196   +
                     }
    +  197  0
                 }
    +  198  0
                 engine.scan(paths);
    +  199   +
     
    +  200  0
                 engine.analyzeDependencies();
    +  201  0
                 final List<Dependency> dependencies = engine.getDependencies();
    +  202  0
                 DatabaseProperties prop = null;
    +  203  0
                 CveDB cve = null;
    +  204  
                 try {
    -  273  0
                     Settings.mergeProperties(propertiesFile);
    -  274  0
                 } catch (FileNotFoundException ex) {
    -  275  0
                     LOGGER.error("Unable to load properties file '{}'", propertiesFile.getPath());
    -  276  0
                     LOGGER.debug("", ex);
    -  277  0
                 } catch (IOException ex) {
    -  278  0
                     LOGGER.error("Unable to find properties file '{}'", propertiesFile.getPath());
    -  279  0
                     LOGGER.debug("", ex);
    -  280  0
                 }
    -  281   +  205  0
                     cve = new CveDB();
    +  206  0
                     cve.open();
    +  207  0
                     prop = cve.getDatabaseProperties();
    +  208  0
                 } catch (DatabaseException ex) {
    +  209  0
                     LOGGER.debug("Unable to retrieve DB Properties", ex);
    +  210   +
                 } finally {
    +  211  0
                     if (cve != null) {
    +  212  0
                         cve.close();
    +  213   +
                     }
    +  214   +
                 }
    +  215  0
                 final ReportGenerator report = new ReportGenerator(applicationName, dependencies, engine.getAnalyzers(), prop);
    +  216   +
                 try {
    +  217  0
                     report.generateReports(reportDirectory, outputFormat);
    +  218  0
                 } catch (IOException ex) {
    +  219  0
                     LOGGER.error("There was an IO error while attempting to generate the report.");
    +  220  0
                     LOGGER.debug("", ex);
    +  221  0
                 } catch (Throwable ex) {
    +  222  0
                     LOGGER.error("There was an error while attempting to generate the report.");
    +  223  0
                     LOGGER.debug("", ex);
    +  224  0
                 }
    +  225  0
             } catch (DatabaseException ex) {
    +  226  0
                 LOGGER.error("Unable to connect to the dependency-check database; analysis has stopped");
    +  227  0
                 LOGGER.debug("", ex);
    +  228   +
             } finally {
    +  229  0
                 if (engine != null) {
    +  230  0
                     engine.cleanup();
    +  231   +
                 }
    +  232  
             }
    +  233  0
         }
    +  234   +
     
    +  235   +
         /**
    +  236   +
          * Only executes the update phase of dependency-check.
    +  237   +
          */
    +  238   +
         private void runUpdateOnly() {
    +  239  0
             Engine engine = null;
    +  240   +
             try {
    +  241  0
                 engine = new Engine();
    +  242  0
                 engine.doUpdates();
    +  243  0
             } catch (DatabaseException ex) {
    +  244  0
                 LOGGER.error("Unable to connect to the dependency-check database; analysis has stopped");
    +  245  0
                 LOGGER.debug("", ex);
    +  246   +
             } finally {
    +  247  0
                 if (engine != null) {
    +  248  0
                     engine.cleanup();
    +  249   +
                 }
    +  250   +
             }
    +  251  0
         }
    +  252   +
     
    +  253   +
         /**
    +  254   +
          * Updates the global Settings.
    +  255   +
          *
    +  256   +
          * @param cli a reference to the CLI Parser that contains the command line arguments used to set the corresponding settings in
    +  257   +
          * the core engine.
    +  258   +
          */
    +  259   +
         private void populateSettings(CliParser cli) {
    +  260   +
     
    +  261  0
             final boolean autoUpdate = cli.isAutoUpdate();
    +  262  0
             final String connectionTimeout = cli.getConnectionTimeout();
    +  263  0
             final String proxyServer = cli.getProxyServer();
    +  264  0
             final String proxyPort = cli.getProxyPort();
    +  265  0
             final String proxyUser = cli.getProxyUsername();
    +  266  0
             final String proxyPass = cli.getProxyPassword();
    +  267  0
             final String dataDirectory = cli.getDataDirectory();
    +  268  0
             final File propertiesFile = cli.getPropertiesFile();
    +  269  0
             final String suppressionFile = cli.getSuppressionFile();
    +  270  0
             final String nexusUrl = cli.getNexusUrl();
    +  271  0
             final String databaseDriverName = cli.getDatabaseDriverName();
    +  272  0
             final String databaseDriverPath = cli.getDatabaseDriverPath();
    +  273  0
             final String connectionString = cli.getConnectionString();
    +  274  0
             final String databaseUser = cli.getDatabaseUser();
    +  275  0
             final String databasePassword = cli.getDatabasePassword();
    +  276  0
             final String additionalZipExtensions = cli.getAdditionalZipExtensions();
    +  277  0
             final String pathToMono = cli.getPathToMono();
    +  278  0
             final String cveMod12 = cli.getModifiedCve12Url();
    +  279  0
             final String cveMod20 = cli.getModifiedCve20Url();
    +  280  0
             final String cveBase12 = cli.getBaseCve12Url();
    +  281  0
             final String cveBase20 = cli.getBaseCve20Url();
     282   -
             // We have to wait until we've merged the properties before attempting to set whether we use
    -  283   -
             // the proxy for Nexus since it could be disabled in the properties, but not explicitly stated
    +
     
    +  283  0
             if (propertiesFile != null) {
     284   +
                 try {
    +  285  0
                     Settings.mergeProperties(propertiesFile);
    +  286  0
                 } catch (FileNotFoundException ex) {
    +  287  0
                     LOGGER.error("Unable to load properties file '{}'", propertiesFile.getPath());
    +  288  0
                     LOGGER.debug("", ex);
    +  289  0
                 } catch (IOException ex) {
    +  290  0
                     LOGGER.error("Unable to find properties file '{}'", propertiesFile.getPath());
    +  291  0
                     LOGGER.debug("", ex);
    +  292  0
                 }
    +  293   +
             }
    +  294   +
             // We have to wait until we've merged the properties before attempting to set whether we use
    +  295   +
             // the proxy for Nexus since it could be disabled in the properties, but not explicitly stated
    +  296  
             // on the command line
    -  285  0
             final boolean nexusUsesProxy = cli.isNexusUsesProxy();
    -  286  0
             if (dataDirectory != null) {
    -  287  0
                 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDirectory);
    -  288  0
             } else if (System.getProperty("basedir") != null) {
    -  289  0
                 final File dataDir = new File(System.getProperty("basedir"), "data");
    -  290  0
                 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath());
    -  291  0
             } else {
    -  292  0
                 final File jarPath = new File(App.class.getProtectionDomain().getCodeSource().getLocation().getPath());
    -  293  0
                 final File base = jarPath.getParentFile();
    -  294  0
                 final String sub = Settings.getString(Settings.KEYS.DATA_DIRECTORY);
    -  295  0
                 final File dataDir = new File(base, sub);
    -  296  0
                 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath());
    -  297   +  297  0
             final boolean nexusUsesProxy = cli.isNexusUsesProxy();
    +  298  0
             if (dataDirectory != null) {
    +  299  0
                 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDirectory);
    +  300  0
             } else if (System.getProperty("basedir") != null) {
    +  301  0
                 final File dataDir = new File(System.getProperty("basedir"), "data");
    +  302  0
                 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath());
    +  303  0
             } else {
    +  304  0
                 final File jarPath = new File(App.class.getProtectionDomain().getCodeSource().getLocation().getPath());
    +  305  0
                 final File base = jarPath.getParentFile();
    +  306  0
                 final String sub = Settings.getString(Settings.KEYS.DATA_DIRECTORY);
    +  307  0
                 final File dataDir = new File(base, sub);
    +  308  0
                 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath());
    +  309  
             }
    -  298  0
             Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, autoUpdate);
    -  299  0
             if (proxyServer != null && !proxyServer.isEmpty()) {
    -  300  0
                 Settings.setString(Settings.KEYS.PROXY_SERVER, proxyServer);
    -  301   -
             }
    -  302  0
             if (proxyPort != null && !proxyPort.isEmpty()) {
    -  303  0
                 Settings.setString(Settings.KEYS.PROXY_PORT, proxyPort);
    -  304   -
             }
    -  305  0
             if (proxyUser != null && !proxyUser.isEmpty()) {
    -  306  0
                 Settings.setString(Settings.KEYS.PROXY_USERNAME, proxyUser);
    -  307   -
             }
    -  308  0
             if (proxyPass != null && !proxyPass.isEmpty()) {
    -  309  0
                 Settings.setString(Settings.KEYS.PROXY_PASSWORD, proxyPass);
    -  310   -
             }
    -  311  0
             if (connectionTimeout != null && !connectionTimeout.isEmpty()) {
    -  312  0
                 Settings.setString(Settings.KEYS.CONNECTION_TIMEOUT, connectionTimeout);
    +  310  0
             Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, autoUpdate);
    +  311  0
             if (proxyServer != null && !proxyServer.isEmpty()) {
    +  312  0
                 Settings.setString(Settings.KEYS.PROXY_SERVER, proxyServer);
     313  
             }
    -  314  0
             if (suppressionFile != null && !suppressionFile.isEmpty()) {
    -  315  0
                 Settings.setString(Settings.KEYS.SUPPRESSION_FILE, suppressionFile);
    +  314  0
             if (proxyPort != null && !proxyPort.isEmpty()) {
    +  315  0
                 Settings.setString(Settings.KEYS.PROXY_PORT, proxyPort);
     316  
             }
    -  317   -
     
    -  318   -
             //File Type Analyzer Settings
    -  319  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_JAR_ENABLED, !jarDisabled);
    -  320  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_ARCHIVE_ENABLED, !archiveDisabled);
    -  321  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED, !pyDistDisabled);
    -  322  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_PACKAGE_ENABLED, !pyPkgDisabled);
    -  323  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_AUTOCONF_ENABLED, !autoconfDisabled);
    -  324  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_CMAKE_ENABLED, !cMakeDisabled);
    -  325  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_NUSPEC_ENABLED, !nuspecDisabled);
    -  326  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED, !assemblyDisabled);
    -  327  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_OPENSSL_ENABLED, !cli.isOpenSSLDisabled());
    +  317  0
             if (proxyUser != null && !proxyUser.isEmpty()) {
    +  318  0
                 Settings.setString(Settings.KEYS.PROXY_USERNAME, proxyUser);
    +  319   +
             }
    +  320  0
             if (proxyPass != null && !proxyPass.isEmpty()) {
    +  321  0
                 Settings.setString(Settings.KEYS.PROXY_PASSWORD, proxyPass);
    +  322   +
             }
    +  323  0
             if (connectionTimeout != null && !connectionTimeout.isEmpty()) {
    +  324  0
                 Settings.setString(Settings.KEYS.CONNECTION_TIMEOUT, connectionTimeout);
    +  325   +
             }
    +  326  0
             if (suppressionFile != null && !suppressionFile.isEmpty()) {
    +  327  0
                 Settings.setString(Settings.KEYS.SUPPRESSION_FILE, suppressionFile);
     328   +
             }
    +  329  
     
    -  329  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, !centralDisabled);
    -  330  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, !nexusDisabled);
    -  331  0
             if (nexusUrl != null && !nexusUrl.isEmpty()) {
    -  332  0
                 Settings.setString(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl);
    -  333   -
             }
    -  334  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_PROXY, nexusUsesProxy);
    -  335  0
             if (databaseDriverName != null && !databaseDriverName.isEmpty()) {
    -  336  0
                 Settings.setString(Settings.KEYS.DB_DRIVER_NAME, databaseDriverName);
    -  337   -
             }
    -  338  0
             if (databaseDriverPath != null && !databaseDriverPath.isEmpty()) {
    -  339  0
                 Settings.setString(Settings.KEYS.DB_DRIVER_PATH, databaseDriverPath);
    -  340   -
             }
    -  341  0
             if (connectionString != null && !connectionString.isEmpty()) {
    -  342  0
                 Settings.setString(Settings.KEYS.DB_CONNECTION_STRING, connectionString);
    +  330   +
             //File Type Analyzer Settings
    +  331  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_JAR_ENABLED, !cli.isJarDisabled());
    +  332  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_ARCHIVE_ENABLED, !cli.isArchiveDisabled());
    +  333  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED, !cli.isPythonDistributionDisabled());
    +  334  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_PACKAGE_ENABLED, !cli.isPythonPackageDisabled());
    +  335  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_AUTOCONF_ENABLED, !cli.isAutoconfDisabled());
    +  336  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_CMAKE_ENABLED, !cli.isCmakeDisabled());
    +  337  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_NUSPEC_ENABLED, !cli.isNuspecDisabled());
    +  338  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED, !cli.isAssemblyDisabled());
    +  339  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_OPENSSL_ENABLED, !cli.isOpenSSLDisabled());
    +  340  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_COMPOSER_LOCK_ENABLED, !cli.isComposerDisabled());
    +  341  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_NODE_PACKAGE_ENABLED, !cli.isNodeJsDisabled());
    +  342  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_RUBY_GEMSPEC_ENABLED, !cli.isRubyGemspecDisabled());
     343   +
     
    +  344  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, !cli.isCentralDisabled());
    +  345  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, !cli.isNexusDisabled());
    +  346  0
             if (nexusUrl != null && !nexusUrl.isEmpty()) {
    +  347  0
                 Settings.setString(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl);
    +  348  
             }
    -  344  0
             if (databaseUser != null && !databaseUser.isEmpty()) {
    -  345  0
                 Settings.setString(Settings.KEYS.DB_USER, databaseUser);
    -  346   -
             }
    -  347  0
             if (databasePassword != null && !databasePassword.isEmpty()) {
    -  348  0
                 Settings.setString(Settings.KEYS.DB_PASSWORD, databasePassword);
    -  349   -
             }
    -  350  0
             if (additionalZipExtensions != null && !additionalZipExtensions.isEmpty()) {
    -  351  0
                 Settings.setString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS, additionalZipExtensions);
    +  349  0
             Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_PROXY, nexusUsesProxy);
    +  350  0
             if (databaseDriverName != null && !databaseDriverName.isEmpty()) {
    +  351  0
                 Settings.setString(Settings.KEYS.DB_DRIVER_NAME, databaseDriverName);
     352  
             }
    -  353  0
             if (pathToMono != null && !pathToMono.isEmpty()) {
    -  354  0
                 Settings.setString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH, pathToMono);
    +  353  0
             if (databaseDriverPath != null && !databaseDriverPath.isEmpty()) {
    +  354  0
                 Settings.setString(Settings.KEYS.DB_DRIVER_PATH, databaseDriverPath);
     355  
             }
    -  356  0
             if (cveBase12 != null && !cveBase12.isEmpty()) {
    -  357  0
                 Settings.setString(Settings.KEYS.CVE_SCHEMA_1_2, cveBase12);
    -  358  0
                 Settings.setString(Settings.KEYS.CVE_SCHEMA_2_0, cveBase20);
    -  359  0
                 Settings.setString(Settings.KEYS.CVE_MODIFIED_12_URL, cveMod12);
    -  360  0
                 Settings.setString(Settings.KEYS.CVE_MODIFIED_20_URL, cveMod20);
    +  356  0
             if (connectionString != null && !connectionString.isEmpty()) {
    +  357  0
                 Settings.setString(Settings.KEYS.DB_CONNECTION_STRING, connectionString);
    +  358   +
             }
    +  359  0
             if (databaseUser != null && !databaseUser.isEmpty()) {
    +  360  0
                 Settings.setString(Settings.KEYS.DB_USER, databaseUser);
     361  
             }
    -  362  0
         }
    -  363   -
     
    +  362  0
             if (databasePassword != null && !databasePassword.isEmpty()) {
    +  363  0
                 Settings.setString(Settings.KEYS.DB_PASSWORD, databasePassword);
     364   -
         /**
    -  365   -
          * Creates a file appender and adds it to logback.
    -  366   -
          *
    +
             }
    +  365  0
             if (additionalZipExtensions != null && !additionalZipExtensions.isEmpty()) {
    +  366  0
                 Settings.setString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS, additionalZipExtensions);
     367   +
             }
    +  368  0
             if (pathToMono != null && !pathToMono.isEmpty()) {
    +  369  0
                 Settings.setString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH, pathToMono);
    +  370   +
             }
    +  371  0
             if (cveBase12 != null && !cveBase12.isEmpty()) {
    +  372  0
                 Settings.setString(Settings.KEYS.CVE_SCHEMA_1_2, cveBase12);
    +  373  0
                 Settings.setString(Settings.KEYS.CVE_SCHEMA_2_0, cveBase20);
    +  374  0
                 Settings.setString(Settings.KEYS.CVE_MODIFIED_12_URL, cveMod12);
    +  375  0
                 Settings.setString(Settings.KEYS.CVE_MODIFIED_20_URL, cveMod20);
    +  376   +
             }
    +  377  0
         }
    +  378   +
     
    +  379   +
         /**
    +  380   +
          * Creates a file appender and adds it to logback.
    +  381   +
          *
    +  382  
          * @param verboseLog the path to the verbose log file
    -  368   +  383  
          */
    -  369   +  384  
         private void prepareLogger(String verboseLog) {
    -  370  0
             final StaticLoggerBinder loggerBinder = StaticLoggerBinder.getSingleton();
    -  371  0
             final LoggerContext context = (LoggerContext) loggerBinder.getLoggerFactory();
    -  372   -
     
    -  373  0
             final PatternLayoutEncoder encoder = new PatternLayoutEncoder();
    -  374  0
             encoder.setPattern("%d %C:%L%n%-5level - %msg%n");
    -  375  0
             encoder.setContext(context);
    -  376  0
             encoder.start();
    -  377  0
             final FileAppender fa = new FileAppender();
    -  378  0
             fa.setAppend(true);
    -  379  0
             fa.setEncoder(encoder);
    -  380  0
             fa.setContext(context);
    -  381  0
             fa.setFile(verboseLog);
    -  382  0
             final File f = new File(verboseLog);
    -  383  0
             String name = f.getName();
    -  384  0
             final int i = name.lastIndexOf('.');
    -  385  0
             if (i > 1) {
    -  386  0
                 name = name.substring(0, i);
    +  385  0
             final StaticLoggerBinder loggerBinder = StaticLoggerBinder.getSingleton();
    +  386  0
             final LoggerContext context = (LoggerContext) loggerBinder.getLoggerFactory();
     387   -
             }
    -  388  0
             fa.setName(name);
    -  389  0
             fa.start();
    -  390  0
             final ch.qos.logback.classic.Logger rootLogger = context.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
    -  391  0
             rootLogger.addAppender(fa);
    -  392  0
         }
    -  393  
     
    -  394   -
         /**
    -  395   -
          * Takes a path and resolves it to be a canonical & absolute path. The caveats are that this method will take an Ant style
    -  396   -
          * file selector path (../someDir/**\/*.jar) and convert it to an absolute/canonical path (at least to the left of the first *
    -  397   -
          * or ?).
    -  398   -
          *
    -  399   -
          * @param path the path to canonicalize
    -  400   -
          * @return the canonical path
    -  401   -
          */
    +  388  0
             final PatternLayoutEncoder encoder = new PatternLayoutEncoder();
    +  389  0
             encoder.setPattern("%d %C:%L%n%-5level - %msg%n");
    +  390  0
             encoder.setContext(context);
    +  391  0
             encoder.start();
    +  392  0
             final FileAppender fa = new FileAppender();
    +  393  0
             fa.setAppend(true);
    +  394  0
             fa.setEncoder(encoder);
    +  395  0
             fa.setContext(context);
    +  396  0
             fa.setFile(verboseLog);
    +  397  0
             final File f = new File(verboseLog);
    +  398  0
             String name = f.getName();
    +  399  0
             final int i = name.lastIndexOf('.');
    +  400  0
             if (i > 1) {
    +  401  0
                 name = name.substring(0, i);
     402   -
         protected String ensureCanonicalPath(String path) {
    -  403  16
             String basePath = null;
    -  404  16
             String wildCards = null;
    -  405  16
             final String file = path.replace('\\', '/');
    -  406  16
             if (file.contains("*") || file.contains("?")) {
    -  407   -
     
    -  408  8
                 int pos = getLastFileSeparator(file);
    -  409  8
                 if (pos < 0) {
    -  410  0
                     return file;
    -  411   -
                 }
    -  412  8
                 pos += 1;
    -  413  8
                 basePath = file.substring(0, pos);
    -  414  8
                 wildCards = file.substring(pos);
    -  415  8
             } else {
    -  416  8
                 basePath = file;
    -  417  
             }
    -  418   +  403  0
             fa.setName(name);
    +  404  0
             fa.start();
    +  405  0
             final ch.qos.logback.classic.Logger rootLogger = context.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME);
    +  406  0
             rootLogger.addAppender(fa);
    +  407  0
         }
    +  408  
     
    -  419  16
             File f = new File(basePath);
    -  420   -
             try {
    -  421  16
                 f = f.getCanonicalFile();
    -  422  16
                 if (wildCards != null) {
    -  423  8
                     f = new File(f, wildCards);
    -  424   -
                 }
    -  425  0
             } catch (IOException ex) {
    -  426  0
                 LOGGER.warn("Invalid path '{}' was provided.", path);
    -  427  0
                 LOGGER.debug("Invalid path provided", ex);
    -  428  16
             }
    -  429  16
             return f.getAbsolutePath().replace('\\', '/');
    -  430   -
         }
    -  431   -
     
    -  432   +  409  
         /**
    -  433   -
          * Returns the position of the last file separator.
    -  434   +  410   +
          * Takes a path and resolves it to be a canonical &amp; absolute path. The caveats are that this method will take an Ant style
    +  411   +
          * file selector path (../someDir/**\/*.jar) and convert it to an absolute/canonical path (at least to the left of the first *
    +  412   +
          * or ?).
    +  413  
          *
    -  435   -
          * @param file a file path
    -  436   -
          * @return the position of the last file separator
    -  437   +  414   +
          * @param path the path to canonicalize
    +  415   +
          * @return the canonical path
    +  416  
          */
    -  438   -
         private int getLastFileSeparator(String file) {
    -  439  8
             if (file.contains("*") || file.contains("?")) {
    -  440  8
                 int p1 = file.indexOf('*');
    -  441  8
                 int p2 = file.indexOf('?');
    -  442  8
                 p1 = p1 > 0 ? p1 : file.length();
    -  443  8
                 p2 = p2 > 0 ? p2 : file.length();
    -  444  8
                 int pos = p1 < p2 ? p1 : p2;
    -  445  8
                 pos = file.lastIndexOf('/', pos);
    -  446  8
                 return pos;
    -  447   -
             } else {
    -  448  0
                 return file.lastIndexOf('/');
    -  449   +  417   +
         protected String ensureCanonicalPath(String path) {
    +  418  2
             String basePath = null;
    +  419  2
             String wildCards = null;
    +  420  2
             final String file = path.replace('\\', '/');
    +  421  2
             if (file.contains("*") || file.contains("?")) {
    +  422   +
     
    +  423  1
                 int pos = getLastFileSeparator(file);
    +  424  1
                 if (pos < 0) {
    +  425  0
                     return file;
    +  426   +
                 }
    +  427  1
                 pos += 1;
    +  428  1
                 basePath = file.substring(0, pos);
    +  429  1
                 wildCards = file.substring(pos);
    +  430  1
             } else {
    +  431  1
                 basePath = file;
    +  432  
             }
    -  450   +  433   +
     
    +  434  2
             File f = new File(basePath);
    +  435   +
             try {
    +  436  2
                 f = f.getCanonicalFile();
    +  437  2
                 if (wildCards != null) {
    +  438  1
                     f = new File(f, wildCards);
    +  439   +
                 }
    +  440  0
             } catch (IOException ex) {
    +  441  0
                 LOGGER.warn("Invalid path '{}' was provided.", path);
    +  442  0
                 LOGGER.debug("Invalid path provided", ex);
    +  443  2
             }
    +  444  2
             return f.getAbsolutePath().replace('\\', '/');
    +  445  
         }
    +  446   +
     
    +  447   +
         /**
    +  448   +
          * Returns the position of the last file separator.
    +  449   +
          *
    +  450   +
          * @param file a file path
     451   +
          * @return the position of the last file separator
    +  452   +
          */
    +  453   +
         private int getLastFileSeparator(String file) {
    +  454  1
             if (file.contains("*") || file.contains("?")) {
    +  455  1
                 int p1 = file.indexOf('*');
    +  456  1
                 int p2 = file.indexOf('?');
    +  457  1
                 p1 = p1 > 0 ? p1 : file.length();
    +  458  1
                 p2 = p2 > 0 ? p2 : file.length();
    +  459  1
                 int pos = p1 < p2 ? p1 : p2;
    +  460  1
                 pos = file.lastIndexOf('/', pos);
    +  461  1
                 return pos;
    +  462   +
             } else {
    +  463  0
                 return file.lastIndexOf('/');
    +  464   +
             }
    +  465   +
         }
    +  466  
     }
    - + diff --git a/dependency-check-cli/cobertura/org.owasp.dependencycheck.CliParser.html b/dependency-check-cli/cobertura/org.owasp.dependencycheck.CliParser.html index b76c4102b..e82579b98 100644 --- a/dependency-check-cli/cobertura/org.owasp.dependencycheck.CliParser.html +++ b/dependency-check-cli/cobertura/org.owasp.dependencycheck.CliParser.html @@ -12,8 +12,8 @@
     
    - - + +
    Classes in this File Line Coverage Branch Coverage Complexity
    CliParser
    58%
    117/200
    27%
    40/144
    2.327
    CliParser$ARGUMENT
    0%
    0/1
    N/A
    2.327
    CliParser
    56%
    121/213
    24%
    40/166
    2.356
    CliParser$ARGUMENT
    0%
    0/1
    N/A
    2.356
     
    @@ -67,11 +67,11 @@  24  
     import org.apache.commons.cli.CommandLineParser;
     25   -
     import org.apache.commons.cli.HelpFormatter;
    +
     import org.apache.commons.cli.DefaultParser;
     26   -
     import org.apache.commons.cli.Option;
    +
     import org.apache.commons.cli.HelpFormatter;
     27   -
     import org.apache.commons.cli.OptionBuilder;
    +
     import org.apache.commons.cli.Option;
     28  
     import org.apache.commons.cli.OptionGroup;
     29   @@ -79,1377 +79,1373 @@  30  
     import org.apache.commons.cli.ParseException;
     31   -
     import org.apache.commons.cli.PosixParser;
    -  32  
     import org.owasp.dependencycheck.reporting.ReportGenerator.Format;
    -  33   +  32  
     import org.owasp.dependencycheck.utils.InvalidSettingException;
    -  34   +  33  
     import org.owasp.dependencycheck.utils.Settings;
    -  35   +  34  
     import org.slf4j.Logger;
    -  36   +  35  
     import org.slf4j.LoggerFactory;
    +  36   +
     
     37   -
     
    -  38  
     /**
    -  39   +  38  
      * A utility to parse command line arguments for the DependencyCheck.
    -  40   +  39  
      *
    -  41   +  40  
      * @author Jeremy Long
    -  42   +  41  
      */
    -  43  72
     public final class CliParser {
    +  42  9
     public final class CliParser {
    +  43   +
     
     44   -
     
    +
         /**
     45   -
         /**
    -  46  
          * The logger.
    -  47   +  46  
          */
    -  48  8
         private static final Logger LOGGER = LoggerFactory.getLogger(CliParser.class);
    +  47  1
         private static final Logger LOGGER = LoggerFactory.getLogger(CliParser.class);
    +  48   +
         /**
     49   -
         /**
    -  50  
          * The command line.
    +  50   +
          */
     51   -
          */
    -  52  
         private CommandLine line;
    +  52   +
         /**
     53   -
         /**
    -  54  
          * Indicates whether the arguments are valid.
    -  55   +  54  
          */
    -  56  72
         private boolean isValid = true;
    +  55  9
         private boolean isValid = true;
    +  56   +
     
     57   -
     
    +
         /**
     58   -
         /**
    -  59  
          * Parses the arguments passed in and captures the results for later use.
    +  59   +
          *
     60   -
          *
    +
          * @param args the command line arguments
     61   -
          * @param args the command line arguments
    -  62  
          * @throws FileNotFoundException is thrown when a 'file' argument does not point to a file that exists.
    -  63   +  62  
          * @throws ParseException is thrown when a Parse Exception occurs.
    +  63   +
          */
     64   -
          */
    -  65  
         public void parse(String[] args) throws FileNotFoundException, ParseException {
    -  66  72
             line = parseArgs(args);
    -  67   +  65  9
             line = parseArgs(args);
    +  66  
     
    -  68  56
             if (line != null) {
    -  69  56
                 validateArgs();
    -  70   +  67  7
             if (line != null) {
    +  68  7
                 validateArgs();
    +  69  
             }
    -  71  48
         }
    +  70  6
         }
    +  71   +
     
     72   -
     
    +
         /**
     73   -
         /**
    -  74  
          * Parses the command line arguments.
    +  74   +
          *
     75   -
          *
    -  76  
          * @param args the command line arguments
    -  77   +  76  
          * @return the results of parsing the command line arguments
    -  78   +  77  
          * @throws ParseException if the arguments are invalid
    +  78   +
          */
     79   -
          */
    -  80  
         private CommandLine parseArgs(String[] args) throws ParseException {
    -  81  72
             final CommandLineParser parser = new PosixParser();
    -  82  72
             final Options options = createCommandLineOptions();
    -  83  72
             return parser.parse(options, args);
    +  80  9
             final CommandLineParser parser = new DefaultParser();
    +  81  9
             final Options options = createCommandLineOptions();
    +  82  9
             return parser.parse(options, args);
    +  83   +
         }
     84   -
         }
    +
     
     85   -
     
    +
         /**
     86   -
         /**
    -  87  
          * Validates that the command line arguments are valid.
    +  87   +
          *
     88   -
          *
    -  89  
          * @throws FileNotFoundException if there is a file specified by either the SCAN or CPE command line arguments that does not
    -  90   +  89  
          * exist.
    -  91   +  90  
          * @throws ParseException is thrown if there is an exception parsing the command line.
    +  91   +
          */
     92   -
          */
    -  93  
         private void validateArgs() throws FileNotFoundException, ParseException {
    -  94  56
             if (isRunScan()) {
    -  95  16
                 validatePathExists(getScanFiles(), ARGUMENT.SCAN);
    -  96  8
                 validatePathExists(getReportDirectory(), ARGUMENT.OUT);
    -  97  8
                 if (getPathToMono() != null) {
    -  98  0
                     validatePathExists(getPathToMono(), ARGUMENT.PATH_TO_MONO);
    -  99   +  93  7
             if (isRunScan()) {
    +  94  2
                 validatePathExists(getScanFiles(), ARGUMENT.SCAN);
    +  95  1
                 validatePathExists(getReportDirectory(), ARGUMENT.OUT);
    +  96  1
                 if (getPathToMono() != null) {
    +  97  0
                     validatePathExists(getPathToMono(), ARGUMENT.PATH_TO_MONO);
    +  98  
                 }
    -  100  8
                 if (!line.hasOption(ARGUMENT.APP_NAME)) {
    -  101  0
                     throw new ParseException("Missing 'app' argument; the scan cannot be run without the an application name.");
    -  102   +  99  1
                 if (!line.hasOption(ARGUMENT.APP_NAME) && !line.hasOption(ARGUMENT.PROJECT)) {
    +  100  0
                     throw new ParseException("Missing '" + ARGUMENT.PROJECT + "' argument; the scan cannot be run without the an project name.");
    +  101  
                 }
    -  103  8
                 if (line.hasOption(ARGUMENT.OUTPUT_FORMAT)) {
    -  104  0
                     final String format = line.getOptionValue(ARGUMENT.OUTPUT_FORMAT);
    -  105   +  102  1
                 if (line.hasOption(ARGUMENT.OUTPUT_FORMAT)) {
    +  103  0
                     final String format = line.getOptionValue(ARGUMENT.OUTPUT_FORMAT);
    +  104  
                     try {
    -  106  0
                         Format.valueOf(format);
    -  107  0
                     } catch (IllegalArgumentException ex) {
    -  108  0
                         final String msg = String.format("An invalid 'format' of '%s' was specified. "
    -  109   +  105  0
                         Format.valueOf(format);
    +  106  0
                     } catch (IllegalArgumentException ex) {
    +  107  0
                         final String msg = String.format("An invalid 'format' of '%s' was specified. "
    +  108  
                                 + "Supported output formats are XML, HTML, VULN, or ALL", format);
    -  110  0
                         throw new ParseException(msg);
    -  111  0
                     }
    -  112   +  109  0
                         throw new ParseException(msg);
    +  110  0
                     }
    +  111  
                 }
    -  113  8
                 if ((getBaseCve12Url() != null || getBaseCve20Url() != null || getModifiedCve12Url() != null || getModifiedCve20Url() != null)
    -  114   +  112  1
                 if ((getBaseCve12Url() != null || getBaseCve20Url() != null || getModifiedCve12Url() != null || getModifiedCve20Url() != null)
    +  113  
                         && (getBaseCve12Url() == null || getBaseCve20Url() == null || getModifiedCve12Url() == null || getModifiedCve20Url() == null)) {
    -  115  0
                     final String msg = "If one of the CVE URLs is specified they must all be specified; please add the missing CVE URL.";
    -  116  0
                     throw new ParseException(msg);
    -  117   +  114  0
                     final String msg = "If one of the CVE URLs is specified they must all be specified; please add the missing CVE URL.";
    +  115  0
                     throw new ParseException(msg);
    +  116  
                 }
    -  118  8
                 if (line.hasOption((ARGUMENT.SYM_LINK_DEPTH))) {
    -  119   +  117  1
                 if (line.hasOption((ARGUMENT.SYM_LINK_DEPTH))) {
    +  118  
                     try {
    -  120  0
                         final int i = Integer.parseInt(line.getOptionValue(ARGUMENT.SYM_LINK_DEPTH));
    -  121  0
                         if (i < 0) {
    -  122  0
                             throw new ParseException("Symbolic Link Depth (symLink) must be greater than zero.");
    -  123   +  119  0
                         final int i = Integer.parseInt(line.getOptionValue(ARGUMENT.SYM_LINK_DEPTH));
    +  120  0
                         if (i < 0) {
    +  121  0
                             throw new ParseException("Symbolic Link Depth (symLink) must be greater than zero.");
    +  122  
                         }
    -  124  0
                     } catch (NumberFormatException ex) {
    -  125  0
                         throw new ParseException("Symbolic Link Depth (symLink) is not a number.");
    -  126  0
                     }
    +  123  0
                     } catch (NumberFormatException ex) {
    +  124  0
                         throw new ParseException("Symbolic Link Depth (symLink) is not a number.");
    +  125  0
                     }
    +  126   +
                 }
     127   -
                 }
    -  128  
             }
    -  129  48
         }
    +  128  6
         }
    +  129   +
     
     130   -
     
    +
         /**
     131   -
         /**
    -  132  
          * Validates whether or not the path(s) points at a file that exists; if the path(s) does not point to an existing file a
    +  132   +
          * FileNotFoundException is thrown.
     133   -
          * FileNotFoundException is thrown.
    +
          *
     134   -
          *
    -  135  
          * @param paths the paths to validate if they exists
    -  136   +  135  
          * @param optType the option being validated (e.g. scan, out, etc.)
    -  137   +  136  
          * @throws FileNotFoundException is thrown if one of the paths being validated does not exist.
    +  137   +
          */
     138   -
          */
    -  139  
         private void validatePathExists(String[] paths, String optType) throws FileNotFoundException {
    -  140  24
             for (String path : paths) {
    -  141  16
                 validatePathExists(path, optType);
    -  142   +  139  3
             for (String path : paths) {
    +  140  2
                 validatePathExists(path, optType);
    +  141  
             }
    -  143  8
         }
    +  142  1
         }
    +  143   +
     
     144   -
     
    +
         /**
     145   -
         /**
    -  146  
          * Validates whether or not the path points at a file that exists; if the path does not point to an existing file a
    -  147   +  146  
          * FileNotFoundException is thrown.
    +  147   +
          *
     148   -
          *
    -  149  
          * @param path the paths to validate if they exists
    -  150   +  149  
          * @param argumentName the argument being validated (e.g. scan, out, etc.)
    -  151   +  150  
          * @throws FileNotFoundException is thrown if the path being validated does not exist.
    +  151   +
          */
     152   -
          */
    -  153  
         private void validatePathExists(String path, String argumentName) throws FileNotFoundException {
    -  154  24
             if (path == null) {
    -  155  0
                 isValid = false;
    -  156  0
                 final String msg = String.format("Invalid '%s' argument: null", argumentName);
    -  157  0
                 throw new FileNotFoundException(msg);
    -  158  24
             } else if (!path.contains("*") && !path.contains("?")) {
    -  159  24
                 File f = new File(path);
    -  160  24
                 if ("o".equalsIgnoreCase(argumentName.substring(0, 1)) && !"ALL".equalsIgnoreCase(this.getReportFormat())) {
    -  161  8
                     final String checkPath = path.toLowerCase();
    -  162  8
                     if (checkPath.endsWith(".html") || checkPath.endsWith(".xml") || checkPath.endsWith(".htm")) {
    -  163  0
                         if (f.getParentFile() == null) {
    -  164  0
                             f = new File(".", path);
    -  165   +  153  3
             if (path == null) {
    +  154  0
                 isValid = false;
    +  155  0
                 final String msg = String.format("Invalid '%s' argument: null", argumentName);
    +  156  0
                 throw new FileNotFoundException(msg);
    +  157  3
             } else if (!path.contains("*") && !path.contains("?")) {
    +  158  3
                 File f = new File(path);
    +  159  3
                 if ("o".equalsIgnoreCase(argumentName.substring(0, 1)) && !"ALL".equalsIgnoreCase(this.getReportFormat())) {
    +  160  1
                     final String checkPath = path.toLowerCase();
    +  161  1
                     if (checkPath.endsWith(".html") || checkPath.endsWith(".xml") || checkPath.endsWith(".htm")) {
    +  162  0
                         if (f.getParentFile() == null) {
    +  163  0
                             f = new File(".", path);
    +  164   +
                         }
    +  165  0
                         if (!f.getParentFile().isDirectory()) {
    +  166  0
                             isValid = false;
    +  167  0
                             final String msg = String.format("Invalid '%s' argument: '%s'", argumentName, path);
    +  168  0
                             throw new FileNotFoundException(msg);
    +  169  
                         }
    -  166  0
                         if (!f.getParentFile().isDirectory()) {
    -  167  0
                             isValid = false;
    -  168  0
                             final String msg = String.format("Invalid '%s' argument: '%s'", argumentName, path);
    -  169  0
                             throw new FileNotFoundException(msg);
     170   -
                         }
    -  171  
                     }
    -  172  8
                 } else {
    -  173  16
                     if (!f.exists()) {
    -  174  8
                         isValid = false;
    -  175  8
                         final String msg = String.format("Invalid '%s' argument: '%s'", argumentName, path);
    -  176  8
                         throw new FileNotFoundException(msg);
    +  171  1
                 } else {
    +  172  2
                     if (!f.exists()) {
    +  173  1
                         isValid = false;
    +  174  1
                         final String msg = String.format("Invalid '%s' argument: '%s'", argumentName, path);
    +  175  1
                         throw new FileNotFoundException(msg);
    +  176   +
                     }
     177   -
                     }
    -  178  
                 }
    -  179  16
             } else if (path.startsWith("//") || path.startsWith("\\\\")) {
    -  180  0
                 isValid = false;
    -  181  0
                 final String msg = String.format("Invalid '%s' argument: '%s'%nUnable to scan paths that start with '//'.", argumentName, path);
    -  182  0
                 throw new FileNotFoundException(msg);
    -  183   +  178  2
             } else if (path.startsWith("//") || path.startsWith("\\\\")) {
    +  179  0
                 isValid = false;
    +  180  0
                 final String msg = String.format("Invalid '%s' argument: '%s'%nUnable to scan paths that start with '//'.", argumentName, path);
    +  181  0
                 throw new FileNotFoundException(msg);
    +  182  
             }
    -  184  16
         }
    +  183  2
         }
    +  184   +
     
     185   -
     
    +
         /**
     186   -
         /**
    -  187  
          * Generates an Options collection that is used to parse the command line and to display the help message.
    +  187   +
          *
     188   -
          *
    -  189  
          * @return the command line options used for parsing the command line
    +  189   +
          */
     190   -
          */
    +
         @SuppressWarnings("static-access")
     191   -
         @SuppressWarnings("static-access")
    -  192  
         private Options createCommandLineOptions() {
    -  193  72
             final Options options = new Options();
    -  194  72
             addStandardOptions(options);
    -  195  72
             addAdvancedOptions(options);
    -  196  72
             addDeprecatedOptions(options);
    -  197  72
             return options;
    -  198   +  192  9
             final Options options = new Options();
    +  193  9
             addStandardOptions(options);
    +  194  9
             addAdvancedOptions(options);
    +  195  9
             addDeprecatedOptions(options);
    +  196  9
             return options;
    +  197  
         }
    +  198   +
     
     199   -
     
    -  200  
         /**
    -  201   +  200  
          * Adds the standard command line options to the given options collection.
    -  202   +  201  
          *
    -  203   +  202  
          * @param options a collection of command line arguments
    -  204   +  203  
          * @throws IllegalArgumentException thrown if there is an exception
    -  205   +  204  
          */
    -  206   +  205  
         @SuppressWarnings("static-access")
    -  207   +  206  
         private void addStandardOptions(final Options options) throws IllegalArgumentException {
    -  208  88
             final Option help = new Option(ARGUMENT.HELP_SHORT, ARGUMENT.HELP, false,
    -  209   +  207  11
             final Option help = new Option(ARGUMENT.HELP_SHORT, ARGUMENT.HELP, false,
    +  208  
                     "Print this message.");
    -  210   +  209  
     
    -  211  88
             final Option advancedHelp = OptionBuilder.withLongOpt(ARGUMENT.ADVANCED_HELP)
    +  210  11
             final Option advancedHelp = Option.builder().longOpt(ARGUMENT.ADVANCED_HELP)
    +  211   +
                     .desc("Print the advanced help message.").build();
     212   -
                     .withDescription("Print the advanced help message.").create();
    -  213  
     
    -  214  88
             final Option version = new Option(ARGUMENT.VERSION_SHORT, ARGUMENT.VERSION,
    -  215   +  213  11
             final Option version = new Option(ARGUMENT.VERSION_SHORT, ARGUMENT.VERSION,
    +  214  
                     false, "Print the version information.");
    -  216   +  215  
     
    -  217  88
             final Option noUpdate = new Option(ARGUMENT.DISABLE_AUTO_UPDATE_SHORT, ARGUMENT.DISABLE_AUTO_UPDATE,
    -  218   +  216  11
             final Option noUpdate = new Option(ARGUMENT.DISABLE_AUTO_UPDATE_SHORT, ARGUMENT.DISABLE_AUTO_UPDATE,
    +  217  
                     false, "Disables the automatic updating of the CPE data.");
    -  219   +  218  
     
    -  220  88
             final Option appName = OptionBuilder.withArgName("name").hasArg().withLongOpt(ARGUMENT.APP_NAME)
    +  219  11
             final Option projectName = Option.builder().hasArg().argName("name").longOpt(ARGUMENT.PROJECT)
    +  220   +
                     .desc("The name of the project being scanned. This is a required argument.")
     221   -
                     .withDescription("The name of the application being scanned. This is a required argument.")
    +
                     .build();
     222   -
                     .create(ARGUMENT.APP_NAME_SHORT);
    -  223  
     
    -  224  88
             final Option path = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.SCAN)
    +  223  11
             final Option path = Option.builder(ARGUMENT.SCAN_SHORT).argName("path").hasArg().longOpt(ARGUMENT.SCAN)
    +  224   +
                     .desc("The path to scan - this option can be specified multiple times. Ant style"
     225   -
                     .withDescription("The path to scan - this option can be specified multiple times. Ant style"
    -  226  
                             + " paths are supported (e.g. path/**/*.jar).")
    +  226   +
                     .build();
     227   -
                     .create(ARGUMENT.SCAN_SHORT);
    -  228  
     
    -  229  88
             final Option excludes = OptionBuilder.withArgName("pattern").hasArg().withLongOpt(ARGUMENT.EXCLUDE)
    +  228  11
             final Option excludes = Option.builder().argName("pattern").hasArg().longOpt(ARGUMENT.EXCLUDE)
    +  229   +
                     .desc("Specify and exclusion pattern. This option can be specified multiple times"
     230   -
                     .withDescription("Specify and exclusion pattern. This option can be specified multiple times"
    -  231  
                             + " and it accepts Ant style excludsions.")
    +  231   +
                     .build();
     232   -
                     .create();
    -  233  
     
    -  234  88
             final Option props = OptionBuilder.withArgName("file").hasArg().withLongOpt(ARGUMENT.PROP)
    +  233  11
             final Option props = Option.builder(ARGUMENT.PROP_SHORT).argName("file").hasArg().longOpt(ARGUMENT.PROP)
    +  234   +
                     .desc("A property file to load.")
     235   -
                     .withDescription("A property file to load.")
    +
                     .build();
     236   -
                     .create(ARGUMENT.PROP_SHORT);
    -  237  
     
    -  238  88
             final Option out = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.OUT)
    +  237  11
             final Option out = Option.builder(ARGUMENT.OUT_SHORT).argName("path").hasArg().longOpt(ARGUMENT.OUT)
    +  238   +
                     .desc("The folder to write reports to. This defaults to the current directory. "
     239   -
                     .withDescription("The folder to write reports to. This defaults to the current directory. "
    -  240  
                             + "It is possible to set this to a specific file name if the format argument is not set to ALL.")
    +  240   +
                     .build();
     241   -
                     .create(ARGUMENT.OUT_SHORT);
    -  242  
     
    -  243  88
             final Option outputFormat = OptionBuilder.withArgName("format").hasArg().withLongOpt(ARGUMENT.OUTPUT_FORMAT)
    +  242  11
             final Option outputFormat = Option.builder(ARGUMENT.OUTPUT_FORMAT_SHORT).argName("format").hasArg().longOpt(ARGUMENT.OUTPUT_FORMAT)
    +  243   +
                     .desc("The output format to write to (XML, HTML, VULN, ALL). The default is HTML.")
     244   -
                     .withDescription("The output format to write to (XML, HTML, VULN, ALL). The default is HTML.")
    +
                     .build();
     245   -
                     .create(ARGUMENT.OUTPUT_FORMAT_SHORT);
    -  246  
     
    -  247  88
             final Option verboseLog = OptionBuilder.withArgName("file").hasArg().withLongOpt(ARGUMENT.VERBOSE_LOG)
    +  246  11
             final Option verboseLog = Option.builder(ARGUMENT.VERBOSE_LOG_SHORT).argName("file").hasArg().longOpt(ARGUMENT.VERBOSE_LOG)
    +  247   +
                     .desc("The file path to write verbose logging information.")
     248   -
                     .withDescription("The file path to write verbose logging information.")
    +
                     .build();
     249   -
                     .create(ARGUMENT.VERBOSE_LOG_SHORT);
    -  250  
     
    -  251  88
             final Option symLinkDepth = OptionBuilder.withArgName("depth").hasArg().withLongOpt(ARGUMENT.SYM_LINK_DEPTH)
    +  250  11
             final Option symLinkDepth = Option.builder().argName("depth").hasArg().longOpt(ARGUMENT.SYM_LINK_DEPTH)
    +  251   +
                     .desc("Sets how deep nested symbolic links will be followed; 0 indicates symbolic links will not be followed.")
     252   -
                     .withDescription("Sets how deep nested symbolic links will be followed; 0 indicates symbolic links will not be followed.")
    +
                     .build();
     253   -
                     .create();
    -  254  
     
    -  255  88
             final Option suppressionFile = OptionBuilder.withArgName("file").hasArg().withLongOpt(ARGUMENT.SUPPRESSION_FILE)
    +  254  11
             final Option suppressionFile = Option.builder().argName("file").hasArg().longOpt(ARGUMENT.SUPPRESSION_FILE)
    +  255   +
                     .desc("The file path to the suppression XML file.")
     256   -
                     .withDescription("The file path to the suppression XML file.")
    +
                     .build();
     257   -
                     .create();
    +
     
     258   -
     
    -  259  
             //This is an option group because it can be specified more then once.
    -  260  88
             final OptionGroup og = new OptionGroup();
    -  261  88
             og.addOption(path);
    -  262   +  259  11
             final OptionGroup og = new OptionGroup();
    +  260  11
             og.addOption(path);
    +  261  
     
    -  263  88
             final OptionGroup exog = new OptionGroup();
    -  264  88
             exog.addOption(excludes);
    -  265   +  262  11
             final OptionGroup exog = new OptionGroup();
    +  263  11
             exog.addOption(excludes);
    +  264  
     
    -  266  88
             options.addOptionGroup(og)
    -  267   +  265  11
             options.addOptionGroup(og)
    +  266  
                     .addOptionGroup(exog)
    +  267   +
                     .addOption(projectName)
     268  
                     .addOption(out)
     269  
                     .addOption(outputFormat)
     270   -
                     .addOption(appName)
    -  271  
                     .addOption(version)
    -  272   +  271  
                     .addOption(help)
    -  273   +  272  
                     .addOption(advancedHelp)
    -  274   +  273  
                     .addOption(noUpdate)
    -  275   +  274  
                     .addOption(symLinkDepth)
    -  276   +  275  
                     .addOption(props)
    -  277   +  276  
                     .addOption(verboseLog)
    -  278   +  277  
                     .addOption(suppressionFile);
    -  279  88
         }
    +  278  11
         }
    +  279   +
     
     280   -
     
    +
         /**
     281   -
         /**
    -  282  
          * Adds the advanced command line options to the given options collection. These are split out for purposes of being able to
    -  283   +  282  
          * display two different help messages.
    +  283   +
          *
     284   -
          *
    +
          * @param options a collection of command line arguments
     285   -
          * @param options a collection of command line arguments
    +
          * @throws IllegalArgumentException thrown if there is an exception
     286   -
          * @throws IllegalArgumentException thrown if there is an exception
    +
          */
     287   -
          */
    -  288  
         @SuppressWarnings("static-access")
    -  289   +  288  
         private void addAdvancedOptions(final Options options) throws IllegalArgumentException {
    -  290   +  289  
     
    -  291  72
             final Option cve12Base = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.CVE_BASE_12)
    +  290  9
             final Option cve12Base = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.CVE_BASE_12)
    +  291   +
                     .desc("Base URL for each year’s CVE 1.2, the %d will be replaced with the year. ")
     292   -
                     .withDescription("Base URL for each year’s CVE 1.2, the %d will be replaced with the year. ")
    +
                     .build();
     293   -
                     .create();
    -  294  
     
    -  295  72
             final Option cve20Base = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.CVE_BASE_20)
    +  294  9
             final Option cve20Base = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.CVE_BASE_20)
    +  295   +
                     .desc("Base URL for each year’s CVE 2.0, the %d will be replaced with the year.")
     296   -
                     .withDescription("Base URL for each year’s CVE 2.0, the %d will be replaced with the year.")
    +
                     .build();
     297   -
                     .create();
    -  298  
     
    -  299  72
             final Option cve12Modified = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.CVE_MOD_12)
    +  298  9
             final Option cve12Modified = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.CVE_MOD_12)
    +  299   +
                     .desc("URL for the modified CVE 1.2.")
     300   -
                     .withDescription("URL for the modified CVE 1.2.")
    +
                     .build();
     301   -
                     .create();
    -  302  
     
    -  303  72
             final Option cve20Modified = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.CVE_MOD_20)
    +  302  9
             final Option cve20Modified = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.CVE_MOD_20)
    +  303   +
                     .desc("URL for the modified CVE 2.0.")
     304   -
                     .withDescription("URL for the modified CVE 2.0.")
    +
                     .build();
     305   -
                     .create();
    -  306  
     
    -  307  72
             final Option updateOnly = OptionBuilder.withLongOpt(ARGUMENT.UPDATE_ONLY)
    +  306  9
             final Option updateOnly = Option.builder().longOpt(ARGUMENT.UPDATE_ONLY)
    +  307   +
                     .desc("Only update the local NVD data cache; no scan will be executed.").build();
     308   -
                     .withDescription("Only update the local NVD data cache; no scan will be executed.").create();
    -  309  
     
    -  310  72
             final Option data = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.DATA_DIRECTORY)
    +  309  9
             final Option data = Option.builder(ARGUMENT.DATA_DIRECTORY_SHORT).argName("path").hasArg().longOpt(ARGUMENT.DATA_DIRECTORY)
    +  310   +
                     .desc("The location of the H2 Database file. This option should generally not be set.")
     311   -
                     .withDescription("The location of the H2 Database file. This option should generally not be set.")
    +
                     .build();
     312   -
                     .create(ARGUMENT.DATA_DIRECTORY_SHORT);
    -  313  
     
    -  314  72
             final Option nexusUrl = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.NEXUS_URL)
    +  313  9
             final Option nexusUrl = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.NEXUS_URL)
    +  314   +
                     .desc("The url to the Nexus Server's REST API Endpoint (http://domain/nexus/service/local). "
     315   -
                     .withDescription("The url to the Nexus Server's REST API Endpoint (http://domain/nexus/service/local). "
    +
                             + "If not set the Nexus Analyzer will be disabled.").build();
     316   -
                             + "If not set the Nexus Analyzer will be disabled.").create();
    -  317  
     
    -  318  72
             final Option nexusUsesProxy = OptionBuilder.withArgName("true/false").hasArg().withLongOpt(ARGUMENT.NEXUS_USES_PROXY)
    +  317  9
             final Option nexusUsesProxy = Option.builder().argName("true/false").hasArg().longOpt(ARGUMENT.NEXUS_USES_PROXY)
    +  318   +
                     .desc("Whether or not the configured proxy should be used when connecting to Nexus.")
     319   -
                     .withDescription("Whether or not the configured proxy should be used when connecting to Nexus.")
    +
                     .build();
     320   -
                     .create();
    -  321  
     
    -  322  72
             final Option additionalZipExtensions = OptionBuilder.withArgName("extensions").hasArg()
    +  321  9
             final Option additionalZipExtensions = Option.builder().argName("extensions").hasArg()
    +  322   +
                     .longOpt(ARGUMENT.ADDITIONAL_ZIP_EXTENSIONS)
     323   -
                     .withLongOpt(ARGUMENT.ADDITIONAL_ZIP_EXTENSIONS)
    +
                     .desc("A comma separated list of additional extensions to be scanned as ZIP files "
     324   -
                     .withDescription("A comma separated list of additional extensions to be scanned as ZIP files "
    +
                             + "(ZIP, EAR, WAR are already treated as zip files)").build();
     325   -
                             + "(ZIP, EAR, WAR are already treated as zip files)").create();
    -  326  
     
    -  327  72
             final Option pathToMono = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.PATH_TO_MONO)
    +  326  9
             final Option pathToMono = Option.builder().argName("path").hasArg().longOpt(ARGUMENT.PATH_TO_MONO)
    +  327   +
                     .desc("The path to Mono for .NET Assembly analysis on non-windows systems.")
     328   -
                     .withDescription("The path to Mono for .NET Assembly analysis on non-windows systems.")
    +
                     .build();
     329   -
                     .create();
    -  330  
     
    -  331  72
             final Option connectionTimeout = OptionBuilder.withArgName("timeout").hasArg().withLongOpt(ARGUMENT.CONNECTION_TIMEOUT)
    +  330  9
             final Option connectionTimeout = Option.builder(ARGUMENT.CONNECTION_TIMEOUT_SHORT).argName("timeout").hasArg()
    +  331   +
                     .longOpt(ARGUMENT.CONNECTION_TIMEOUT).desc("The connection timeout (in milliseconds) to use when downloading resources.")
     332   -
                     .withDescription("The connection timeout (in milliseconds) to use when downloading resources.")
    +
                     .build();
     333   -
                     .create(ARGUMENT.CONNECTION_TIMEOUT_SHORT);
    -  334  
     
    -  335  72
             final Option proxyServer = OptionBuilder.withArgName("server").hasArg().withLongOpt(ARGUMENT.PROXY_SERVER)
    +  334  9
             final Option proxyServer = Option.builder().argName("server").hasArg().longOpt(ARGUMENT.PROXY_SERVER)
    +  335   +
                     .desc("The proxy server to use when downloading resources.").build();
     336   -
                     .withDescription("The proxy server to use when downloading resources.").create();
    -  337  
     
    -  338  72
             final Option proxyPort = OptionBuilder.withArgName("port").hasArg().withLongOpt(ARGUMENT.PROXY_PORT)
    +  337  9
             final Option proxyPort = Option.builder().argName("port").hasArg().longOpt(ARGUMENT.PROXY_PORT)
    +  338   +
                     .desc("The proxy port to use when downloading resources.").build();
     339   -
                     .withDescription("The proxy port to use when downloading resources.").create();
    -  340  
     
    -  341  72
             final Option proxyUsername = OptionBuilder.withArgName("user").hasArg().withLongOpt(ARGUMENT.PROXY_USERNAME)
    +  340  9
             final Option proxyUsername = Option.builder().argName("user").hasArg().longOpt(ARGUMENT.PROXY_USERNAME)
    +  341   +
                     .desc("The proxy username to use when downloading resources.").build();
     342   -
                     .withDescription("The proxy username to use when downloading resources.").create();
    -  343  
     
    -  344  72
             final Option proxyPassword = OptionBuilder.withArgName("pass").hasArg().withLongOpt(ARGUMENT.PROXY_PASSWORD)
    +  343  9
             final Option proxyPassword = Option.builder().argName("pass").hasArg().longOpt(ARGUMENT.PROXY_PASSWORD)
    +  344   +
                     .desc("The proxy password to use when downloading resources.").build();
     345   -
                     .withDescription("The proxy password to use when downloading resources.").create();
    -  346  
     
    -  347  72
             final Option connectionString = OptionBuilder.withArgName("connStr").hasArg().withLongOpt(ARGUMENT.CONNECTION_STRING)
    +  346  9
             final Option connectionString = Option.builder().argName("connStr").hasArg().longOpt(ARGUMENT.CONNECTION_STRING)
    +  347   +
                     .desc("The connection string to the database.").build();
     348   -
                     .withDescription("The connection string to the database.").create();
    -  349  
     
    -  350  72
             final Option dbUser = OptionBuilder.withArgName("user").hasArg().withLongOpt(ARGUMENT.DB_NAME)
    +  349  9
             final Option dbUser = Option.builder().argName("user").hasArg().longOpt(ARGUMENT.DB_NAME)
    +  350   +
                     .desc("The username used to connect to the database.").build();
     351   -
                     .withDescription("The username used to connect to the database.").create();
    -  352  
     
    -  353  72
             final Option dbPassword = OptionBuilder.withArgName("password").hasArg().withLongOpt(ARGUMENT.DB_PASSWORD)
    +  352  9
             final Option dbPassword = Option.builder().argName("password").hasArg().longOpt(ARGUMENT.DB_PASSWORD)
    +  353   +
                     .desc("The password for connecting to the database.").build();
     354   -
                     .withDescription("The password for connecting to the database.").create();
    -  355  
     
    -  356  72
             final Option dbDriver = OptionBuilder.withArgName("driver").hasArg().withLongOpt(ARGUMENT.DB_DRIVER)
    +  355  9
             final Option dbDriver = Option.builder().argName("driver").hasArg().longOpt(ARGUMENT.DB_DRIVER)
    +  356   +
                     .desc("The database driver name.").build();
     357   -
                     .withDescription("The database driver name.").create();
    -  358  
     
    -  359  72
             final Option dbDriverPath = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.DB_DRIVER_PATH)
    +  358  9
             final Option dbDriverPath = Option.builder().argName("path").hasArg().longOpt(ARGUMENT.DB_DRIVER_PATH)
    +  359   +
                     .desc("The path to the database driver; note, this does not need to be set unless the JAR is outside of the classpath.")
     360   -
                     .withDescription("The path to the database driver; note, this does not need to be set unless the JAR is outside of the classpath.")
    +
                     .build();
     361   -
                     .create();
    -  362  
     
    -  363  72
             final Option disableJarAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_JAR)
    +  362  9
             final Option disableJarAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_JAR)
    +  363   +
                     .desc("Disable the Jar Analyzer.").build();
     364   -
                     .withDescription("Disable the Jar Analyzer.").create();
    -  365  
     
    -  366  72
             final Option disableArchiveAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_ARCHIVE)
    +  365  9
             final Option disableArchiveAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_ARCHIVE)
    +  366   +
                     .desc("Disable the Archive Analyzer.").build();
     367   -
                     .withDescription("Disable the Archive Analyzer.").create();
    -  368  
     
    -  369  72
             final Option disableNuspecAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_NUSPEC)
    +  368  9
             final Option disableNuspecAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_NUSPEC)
    +  369   +
                     .desc("Disable the Nuspec Analyzer.").build();
     370   -
                     .withDescription("Disable the Nuspec Analyzer.").create();
    -  371  
     
    -  372  72
             final Option disableAssemblyAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_ASSEMBLY)
    +  371  9
             final Option disableAssemblyAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_ASSEMBLY)
    +  372   +
                     .desc("Disable the .NET Assembly Analyzer.").build();
     373   -
                     .withDescription("Disable the .NET Assembly Analyzer.").create();
    -  374  
     
    -  375  72
             final Option disablePythonDistributionAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_PY_DIST)
    +  374  9
             final Option disablePythonDistributionAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_PY_DIST)
    +  375   +
                     .desc("Disable the Python Distribution Analyzer.").build();
     376   -
                     .withDescription("Disable the Python Distribution Analyzer.").create();
    -  377  
     
    -  378  72
             final Option disablePythonPackageAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_PY_PKG)
    +  377  9
             final Option disablePythonPackageAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_PY_PKG)
    +  378   +
                     .desc("Disable the Python Package Analyzer.").build();
     379   -
                     .withDescription("Disable the Python Package Analyzer.").create();
    -  380  
     
    -  381  72
             final Option disableAutoconfAnalyzer = OptionBuilder
    +  380  9
             final Option disableComposerAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_COMPOSER)
    +  381   +
                     .desc("Disable the PHP Composer Analyzer.").build();
     382   -
                     .withLongOpt(ARGUMENT.DISABLE_AUTOCONF)
    -  383   -
                     .withDescription("Disable the Autoconf Analyzer.").create();
    +
     
    +  383  9
             final Option disableAutoconfAnalyzer = Option.builder()
     384   -
     
    -  385  72
             final Option disableOpenSSLAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_OPENSSL)
    +
                     .longOpt(ARGUMENT.DISABLE_AUTOCONF)
    +  385   +
                     .desc("Disable the Autoconf Analyzer.").build();
     386   -
                     .withDescription("Disable the OpenSSL Analyzer.").create();
    -  387  72
             final Option disableCmakeAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_CMAKE).
    +
     
    +  387  9
             final Option disableOpenSSLAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_OPENSSL)
     388   -
                     withDescription("Disable the Cmake Analyzer.").create();
    -  389   -
     
    -  390  72
             final Option disableCentralAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_CENTRAL)
    +
                     .desc("Disable the OpenSSL Analyzer.").build();
    +  389  9
             final Option disableCmakeAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_CMAKE)
    +  390   +
                     .desc("Disable the Cmake Analyzer.").build();
     391   -
                     .withDescription("Disable the Central Analyzer. If this analyzer is disabled it is likely you also want to disable "
    -  392   -
                             + "the Nexus Analyzer.").create();
    +
     
    +  392  9
             final Option disableCentralAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_CENTRAL)
     393   -
     
    -  394  72
             final Option disableNexusAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_NEXUS)
    +
                     .desc("Disable the Central Analyzer. If this analyzer is disabled it is likely you also want to disable "
    +  394   +
                             + "the Nexus Analyzer.").build();
     395   -
                     .withDescription("Disable the Nexus Analyzer.").create();
    -  396  
     
    -  397  72
             options.addOption(updateOnly)
    +  396  9
             final Option disableNexusAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_NEXUS)
    +  397   +
                     .desc("Disable the Nexus Analyzer.").build();
     398   -
                     .addOption(cve12Base)
    -  399   -
                     .addOption(cve20Base)
    +
     
    +  399  9
             final Option purge = Option.builder().longOpt(ARGUMENT.PURGE_NVD)
     400   -
                     .addOption(cve12Modified)
    +
                     .desc("Purges the local NVD data cache")
     401   -
                     .addOption(cve20Modified)
    +
                     .build();
     402   -
                     .addOption(proxyPort)
    -  403   -
                     .addOption(proxyServer)
    +
     
    +  403  9
             options.addOption(updateOnly)
     404   -
                     .addOption(proxyUsername)
    +
                     .addOption(cve12Base)
     405   -
                     .addOption(proxyPassword)
    +
                     .addOption(cve20Base)
     406   -
                     .addOption(connectionTimeout)
    +
                     .addOption(cve12Modified)
     407   -
                     .addOption(connectionString)
    +
                     .addOption(cve20Modified)
     408   -
                     .addOption(dbUser)
    +
                     .addOption(proxyPort)
     409   -
                     .addOption(data)
    +
                     .addOption(proxyServer)
     410   -
                     .addOption(dbPassword)
    +
                     .addOption(proxyUsername)
     411   -
                     .addOption(dbDriver)
    +
                     .addOption(proxyPassword)
     412   -
                     .addOption(dbDriverPath)
    +
                     .addOption(connectionTimeout)
     413   -
                     .addOption(disableJarAnalyzer)
    +
                     .addOption(connectionString)
     414   -
                     .addOption(disableArchiveAnalyzer)
    +
                     .addOption(dbUser)
     415   -
                     .addOption(disableAssemblyAnalyzer)
    +
                     .addOption(data)
     416   -
                     .addOption(disablePythonDistributionAnalyzer)
    +
                     .addOption(dbPassword)
     417   -
                     .addOption(disableCmakeAnalyzer)
    +
                     .addOption(dbDriver)
     418   -
                     .addOption(disablePythonPackageAnalyzer)
    +
                     .addOption(dbDriverPath)
     419   -
                     .addOption(disableAutoconfAnalyzer)
    +
                     .addOption(disableJarAnalyzer)
     420   -
                     .addOption(disableOpenSSLAnalyzer)
    +
                     .addOption(disableArchiveAnalyzer)
     421   -
                     .addOption(disableNuspecAnalyzer)
    +
                     .addOption(disableAssemblyAnalyzer)
     422   -
                     .addOption(disableCentralAnalyzer)
    +
                     .addOption(disablePythonDistributionAnalyzer)
     423   -
                     .addOption(disableNexusAnalyzer)
    +
                     .addOption(disableCmakeAnalyzer)
     424   -
                     .addOption(nexusUrl)
    +
                     .addOption(disablePythonPackageAnalyzer)
     425   -
                     .addOption(nexusUsesProxy)
    +
                     .addOption(Option.builder().longOpt(ARGUMENT.DISABLE_RUBYGEMS)
     426   -
                     .addOption(additionalZipExtensions)
    +
                             .desc("Disable the Ruby Gemspec Analyzer.").build())
     427   -
                     .addOption(pathToMono);
    -  428  72
         }
    +
                     .addOption(disableAutoconfAnalyzer)
    +  428   +
                     .addOption(disableComposerAnalyzer)
     429   -
     
    +
                     .addOption(disableOpenSSLAnalyzer)
     430   -
         /**
    +
                     .addOption(disableNuspecAnalyzer)
     431   -
          * Adds the deprecated command line options to the given options collection. These are split out for purposes of not including
    +
                     .addOption(disableCentralAnalyzer)
     432   -
          * them in the help message. We need to add the deprecated options so as not to break existing scripts.
    +
                     .addOption(disableNexusAnalyzer)
     433   -
          *
    +
                     .addOption(Option.builder().longOpt(ARGUMENT.DISABLE_NODE_JS)
     434   -
          * @param options a collection of command line arguments
    +
                             .desc("Disable the Node.js Package Analyzer.").build())
     435   -
          * @throws IllegalArgumentException thrown if there is an exception
    +
                     .addOption(nexusUrl)
     436   -
          */
    +
                     .addOption(nexusUsesProxy)
     437   -
         @SuppressWarnings({"static-access", "deprecation"})
    +
                     .addOption(additionalZipExtensions)
     438   -
         private void addDeprecatedOptions(final Options options) throws IllegalArgumentException {
    +
                     .addOption(pathToMono)
     439   -
     
    -  440  72
             final Option proxyServer = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.PROXY_URL)
    +
                     .addOption(purge);
    +  440  9
         }
     441   -
                     .withDescription("The proxy url argument is deprecated, use proxyserver instead.")
    +
     
     442   -
                     .create();
    +
         /**
     443   -
     
    -  444  72
             options.addOption(proxyServer);
    -  445  72
         }
    +
          * Adds the deprecated command line options to the given options collection. These are split out for purposes of not including
    +  444   +
          * them in the help message. We need to add the deprecated options so as not to break existing scripts.
    +  445   +
          *
     446   -
     
    +
          * @param options a collection of command line arguments
     447   -
         /**
    +
          * @throws IllegalArgumentException thrown if there is an exception
     448   -
          * Determines if the 'version' command line argument was passed in.
    +
          */
     449   -
          *
    +
         @SuppressWarnings({"static-access", "deprecation"})
     450   -
          * @return whether or not the 'version' command line argument was passed in
    +
         private void addDeprecatedOptions(final Options options) throws IllegalArgumentException {
     451   -
          */
    -  452   -
         public boolean isGetVersion() {
    -  453  56
             return (line != null) && line.hasOption(ARGUMENT.VERSION);
    +
     
    +  452  9
             final Option proxyServer = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.PROXY_URL)
    +  453   +
                     .desc("The proxy url argument is deprecated, use proxyserver instead.")
     454   -
         }
    -  455   -
     
    +
                     .build();
    +  455  9
             final Option appName = Option.builder(ARGUMENT.APP_NAME_SHORT).argName("name").hasArg().longOpt(ARGUMENT.APP_NAME)
     456   -
         /**
    +
                     .desc("The name of the project being scanned.")
     457   -
          * Determines if the 'help' command line argument was passed in.
    +
                     .build();
     458   -
          *
    -  459   -
          * @return whether or not the 'help' command line argument was passed in
    -  460   -
          */
    -  461   -
         public boolean isGetHelp() {
    -  462  56
             return (line != null) && line.hasOption(ARGUMENT.HELP);
    +
     
    +  459  9
             options.addOption(proxyServer);
    +  460  9
             options.addOption(appName);
    +  461  9
         }
    +  462   +
     
     463   -
         }
    +
         /**
     464   -
     
    +
          * Determines if the 'version' command line argument was passed in.
     465   -
         /**
    +
          *
     466   -
          * Determines if the 'scan' command line argument was passed in.
    +
          * @return whether or not the 'version' command line argument was passed in
     467   -
          *
    +
          */
     468   -
          * @return whether or not the 'scan' command line argument was passed in
    -  469   -
          */
    +
         public boolean isGetVersion() {
    +  469  7
             return (line != null) && line.hasOption(ARGUMENT.VERSION);
     470   -
         public boolean isRunScan() {
    -  471  112
             return (line != null) && isValid && line.hasOption(ARGUMENT.SCAN);
    +
         }
    +  471   +
     
     472   -
         }
    +
         /**
     473   -
     
    +
          * Determines if the 'help' command line argument was passed in.
     474   -
         /**
    +
          *
     475   -
          * Returns the symbolic link depth (how deeply symbolic links will be followed).
    +
          * @return whether or not the 'help' command line argument was passed in
     476   -
          *
    +
          */
     477   -
          * @return the symbolic link depth
    -  478   -
          */
    +
         public boolean isGetHelp() {
    +  478  7
             return (line != null) && line.hasOption(ARGUMENT.HELP);
     479   -
         public int getSymLinkDepth() {
    -  480  0
             int value = 0;
    +
         }
    +  480   +
     
     481   -
             try {
    -  482  0
                 value = Integer.parseInt(line.getOptionValue(ARGUMENT.SYM_LINK_DEPTH, "0"));
    -  483  0
                 if (value < 0) {
    -  484  0
                     value = 0;
    +
         /**
    +  482   +
          * Determines if the 'scan' command line argument was passed in.
    +  483   +
          *
    +  484   +
          * @return whether or not the 'scan' command line argument was passed in
     485   -
                 }
    -  486  0
             } catch (NumberFormatException ex) {
    -  487  0
                 LOGGER.debug("Symbolic link was not a number");
    -  488  0
             }
    -  489  0
             return value;
    +
          */
    +  486   +
         public boolean isRunScan() {
    +  487  14
             return (line != null) && isValid && line.hasOption(ARGUMENT.SCAN);
    +  488   +
         }
    +  489   +
     
     490   -
         }
    +
         /**
     491   -
     
    +
          * Returns the symbolic link depth (how deeply symbolic links will be followed).
     492   -
         /**
    +
          *
     493   -
          * Returns true if the disableJar command line argument was specified.
    +
          * @return the symbolic link depth
     494   -
          *
    +
          */
     495   -
          * @return true if the disableJar command line argument was specified; otherwise false
    -  496   -
          */
    +
         public int getSymLinkDepth() {
    +  496  0
             int value = 0;
     497   -
         public boolean isJarDisabled() {
    -  498  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_JAR);
    -  499   -
         }
    -  500   -
     
    +
             try {
    +  498  0
                 value = Integer.parseInt(line.getOptionValue(ARGUMENT.SYM_LINK_DEPTH, "0"));
    +  499  0
                 if (value < 0) {
    +  500  0
                     value = 0;
     501   -
         /**
    -  502   -
          * Returns true if the disableArchive command line argument was specified.
    -  503   -
          *
    -  504   -
          * @return true if the disableArchive command line argument was specified; otherwise false
    -  505   -
          */
    -  506   -
         public boolean isArchiveDisabled() {
    -  507  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_ARCHIVE);
    -  508   -
         }
    -  509   -
     
    -  510   -
         /**
    -  511   -
          * Returns true if the disableNuspec command line argument was specified.
    -  512   -
          *
    -  513   -
          * @return true if the disableNuspec command line argument was specified; otherwise false
    -  514   -
          */
    -  515   -
         public boolean isNuspecDisabled() {
    -  516  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_NUSPEC);
    -  517   -
         }
    -  518   -
     
    -  519   -
         /**
    -  520   -
          * Returns true if the disableAssembly command line argument was specified.
    -  521   -
          *
    -  522   -
          * @return true if the disableAssembly command line argument was specified; otherwise false
    -  523   -
          */
    -  524   -
         public boolean isAssemblyDisabled() {
    -  525  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_ASSEMBLY);
    -  526   -
         }
    -  527   -
     
    -  528   -
         /**
    -  529   -
          * Returns true if the disablePyDist command line argument was specified.
    -  530   -
          *
    -  531   -
          * @return true if the disablePyDist command line argument was specified; otherwise false
    -  532   -
          */
    -  533   -
         public boolean isPythonDistributionDisabled() {
    -  534  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_PY_DIST);
    -  535   -
         }
    -  536   -
     
    -  537   -
         /**
    -  538   -
          * Returns true if the disablePyPkg command line argument was specified.
    -  539   -
          *
    -  540   -
          * @return true if the disablePyPkg command line argument was specified; otherwise false
    -  541   -
          */
    -  542   -
         public boolean isPythonPackageDisabled() {
    -  543  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_PY_PKG);
    -  544   -
         }
    -  545   -
     
    -  546   -
         /**
    -  547   -
          * Returns true if the disableCmake command line argument was specified.
    -  548   -
          *
    -  549   -
          * @return true if the disableCmake command line argument was specified; otherwise false
    -  550   -
          */
    -  551   -
         public boolean isCmakeDisabled() {
    -  552  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_CMAKE);
    -  553   -
         }
    -  554   -
     
    -  555   -
         /**
    -  556   -
          * Returns true if the disableAutoconf command line argument was specified.
    -  557   -
          *
    -  558   -
          * @return true if the disableAutoconf command line argument was specified; otherwise false
    -  559   -
          */
    -  560   -
         public boolean isAutoconfDisabled() {
    -  561  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_AUTOCONF);
    -  562   -
         }
    -  563   -
     
    -  564   -
         /**
    -  565   -
          * Returns true if the disableNexus command line argument was specified.
    -  566   -
          *
    -  567   -
          * @return true if the disableNexus command line argument was specified; otherwise false
    -  568   -
          */
    -  569   -
         public boolean isNexusDisabled() {
    -  570  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_NEXUS);
    -  571   -
         }
    -  572   -
     
    -  573   -
         /**
    -  574   -
          * Returns true if the disableOpenSSL command line argument was specified.
    -  575   -
          *
    -  576   -
          * @return true if the disableOpenSSL command line argument was specified; otherwise false
    -  577   -
          */
    -  578   -
         public boolean isOpenSSLDisabled() {
    -  579  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_OPENSSL);
    -  580   -
         }
    -  581   -
     
    -  582   -
         /**
    -  583   -
          * Returns true if the disableCentral command line argument was specified.
    -  584   -
          *
    -  585   -
          * @return true if the disableCentral command line argument was specified; otherwise false
    -  586   -
          */
    -  587   -
         public boolean isCentralDisabled() {
    -  588  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_CENTRAL);
    -  589   -
         }
    -  590   -
     
    -  591   -
         /**
    -  592   -
          * Returns the url to the nexus server if one was specified.
    -  593   -
          *
    -  594   -
          * @return the url to the nexus server; if none was specified this will return null;
    -  595   -
          */
    -  596   -
         public String getNexusUrl() {
    -  597  0
             if (line == null || !line.hasOption(ARGUMENT.NEXUS_URL)) {
    -  598  0
                 return null;
    -  599   -
             } else {
    -  600  0
                 return line.getOptionValue(ARGUMENT.NEXUS_URL);
    -  601   -
             }
    -  602   -
         }
    -  603   -
     
    -  604   -
         /**
    -  605   -
          * Returns true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false is returned.
    -  606   -
          *
    -  607   -
          * @return true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false
    -  608   -
          */
    -  609   -
         public boolean isNexusUsesProxy() {
    -  610   -
             // If they didn't specify whether Nexus needs to use the proxy, we should
    -  611   -
             // still honor the property if it's set.
    -  612  0
             if (line == null || !line.hasOption(ARGUMENT.NEXUS_USES_PROXY)) {
    -  613   -
                 try {
    -  614  0
                     return Settings.getBoolean(Settings.KEYS.ANALYZER_NEXUS_PROXY);
    -  615  0
                 } catch (InvalidSettingException ise) {
    -  616  0
                     return true;
    -  617  
                 }
    +  502  0
             } catch (NumberFormatException ex) {
    +  503  0
                 LOGGER.debug("Symbolic link was not a number");
    +  504  0
             }
    +  505  0
             return value;
    +  506   +
         }
    +  507   +
     
    +  508   +
         /**
    +  509   +
          * Returns true if the disableJar command line argument was specified.
    +  510   +
          *
    +  511   +
          * @return true if the disableJar command line argument was specified; otherwise false
    +  512   +
          */
    +  513   +
         public boolean isJarDisabled() {
    +  514  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_JAR);
    +  515   +
         }
    +  516   +
     
    +  517   +
         /**
    +  518   +
          * Returns true if the disableArchive command line argument was specified.
    +  519   +
          *
    +  520   +
          * @return true if the disableArchive command line argument was specified; otherwise false
    +  521   +
          */
    +  522   +
         public boolean isArchiveDisabled() {
    +  523  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_ARCHIVE);
    +  524   +
         }
    +  525   +
     
    +  526   +
         /**
    +  527   +
          * Returns true if the disableNuspec command line argument was specified.
    +  528   +
          *
    +  529   +
          * @return true if the disableNuspec command line argument was specified; otherwise false
    +  530   +
          */
    +  531   +
         public boolean isNuspecDisabled() {
    +  532  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_NUSPEC);
    +  533   +
         }
    +  534   +
     
    +  535   +
         /**
    +  536   +
          * Returns true if the disableAssembly command line argument was specified.
    +  537   +
          *
    +  538   +
          * @return true if the disableAssembly command line argument was specified; otherwise false
    +  539   +
          */
    +  540   +
         public boolean isAssemblyDisabled() {
    +  541  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_ASSEMBLY);
    +  542   +
         }
    +  543   +
     
    +  544   +
         /**
    +  545   +
          * Returns true if the disablePyDist command line argument was specified.
    +  546   +
          *
    +  547   +
          * @return true if the disablePyDist command line argument was specified; otherwise false
    +  548   +
          */
    +  549   +
         public boolean isPythonDistributionDisabled() {
    +  550  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_PY_DIST);
    +  551   +
         }
    +  552   +
     
    +  553   +
         /**
    +  554   +
          * Returns true if the disablePyPkg command line argument was specified.
    +  555   +
          *
    +  556   +
          * @return true if the disablePyPkg command line argument was specified; otherwise false
    +  557   +
          */
    +  558   +
         public boolean isPythonPackageDisabled() {
    +  559  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_PY_PKG);
    +  560   +
         }
    +  561   +
     
    +  562   +
         /**
    +  563   +
          * Returns whether the Ruby gemspec analyzer is disabled.
    +  564   +
          *
    +  565   +
          * @return true if the {@link ARGUMENT#DISABLE_RUBYGEMS} command line argument was specified; otherwise false
    +  566   +
          */
    +  567   +
         public boolean isRubyGemspecDisabled() {
    +  568  0
             return (null != line) && line.hasOption(ARGUMENT.DISABLE_RUBYGEMS);
    +  569   +
         }
    +  570   +
     
    +  571   +
         /**
    +  572   +
          * Returns true if the disableCmake command line argument was specified.
    +  573   +
          *
    +  574   +
          * @return true if the disableCmake command line argument was specified; otherwise false
    +  575   +
          */
    +  576   +
         public boolean isCmakeDisabled() {
    +  577  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_CMAKE);
    +  578   +
         }
    +  579   +
     
    +  580   +
         /**
    +  581   +
          * Returns true if the disableAutoconf command line argument was specified.
    +  582   +
          *
    +  583   +
          * @return true if the disableAutoconf command line argument was specified; otherwise false
    +  584   +
          */
    +  585   +
         public boolean isAutoconfDisabled() {
    +  586  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_AUTOCONF);
    +  587   +
         }
    +  588   +
     
    +  589   +
         /**
    +  590   +
          * Returns true if the disableComposer command line argument was specified.
    +  591   +
          *
    +  592   +
          * @return true if the disableComposer command line argument was specified; otherwise false
    +  593   +
          */
    +  594   +
         public boolean isComposerDisabled() {
    +  595  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_COMPOSER);
    +  596   +
         }
    +  597   +
     
    +  598   +
         /**
    +  599   +
          * Returns true if the disableNexus command line argument was specified.
    +  600   +
          *
    +  601   +
          * @return true if the disableNexus command line argument was specified; otherwise false
    +  602   +
          */
    +  603   +
         public boolean isNexusDisabled() {
    +  604  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_NEXUS);
    +  605   +
         }
    +  606   +
     
    +  607   +
         /**
    +  608   +
          * Returns true if the disableOpenSSL command line argument was specified.
    +  609   +
          *
    +  610   +
          * @return true if the disableOpenSSL command line argument was specified; otherwise false
    +  611   +
          */
    +  612   +
         public boolean isOpenSSLDisabled() {
    +  613  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_OPENSSL);
    +  614   +
         }
    +  615   +
     
    +  616   +
         /**
    +  617   +
          * Returns true if the disableNodeJS command line argument was specified.
     618   -
             } else {
    -  619  0
                 return Boolean.parseBoolean(line.getOptionValue(ARGUMENT.NEXUS_USES_PROXY));
    +
          *
    +  619   +
          * @return true if the disableNodeJS command line argument was specified; otherwise false
     620   -
             }
    +
          */
     621   -
         }
    -  622   -
     
    +
         public boolean isNodeJsDisabled() {
    +  622  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_NODE_JS);
     623   -
         /**
    +
         }
     624   -
          * Displays the command line help message to the standard output.
    +
     
     625   -
          */
    +
         /**
     626   -
         public void printHelp() {
    -  627  16
             final HelpFormatter formatter = new HelpFormatter();
    -  628  16
             final Options options = new Options();
    -  629  16
             addStandardOptions(options);
    -  630  16
             if (line != null && line.hasOption(ARGUMENT.ADVANCED_HELP)) {
    -  631  0
                 addAdvancedOptions(options);
    +
          * Returns true if the disableCentral command line argument was specified.
    +  627   +
          *
    +  628   +
          * @return true if the disableCentral command line argument was specified; otherwise false
    +  629   +
          */
    +  630   +
         public boolean isCentralDisabled() {
    +  631  0
             return (line != null) && line.hasOption(ARGUMENT.DISABLE_CENTRAL);
     632   -
             }
    -  633  16
             final String helpMsg = String.format("%n%s"
    +
         }
    +  633   +
     
     634   -
                     + " can be used to identify if there are any known CVE vulnerabilities in libraries utilized by an application. "
    +
         /**
     635   -
                     + "%s will automatically update required data from the Internet, such as the CVE and CPE data files from nvd.nist.gov.%n%n",
    +
          * Returns the url to the nexus server if one was specified.
     636   -
                     Settings.getString("application.name", "DependencyCheck"),
    +
          *
     637   -
                     Settings.getString("application.name", "DependencyCheck"));
    +
          * @return the url to the nexus server; if none was specified this will return null;
     638   -
     
    -  639  16
             formatter.printHelp(Settings.getString("application.name", "DependencyCheck"),
    -  640   -
                     helpMsg,
    -  641   -
                     options,
    +
          */
    +  639   +
         public String getNexusUrl() {
    +  640  0
             if (line == null || !line.hasOption(ARGUMENT.NEXUS_URL)) {
    +  641  0
                 return null;
     642   -
                     "",
    -  643   -
                     true);
    -  644  16
         }
    +
             } else {
    +  643  0
                 return line.getOptionValue(ARGUMENT.NEXUS_URL);
    +  644   +
             }
     645   -
     
    +
         }
     646   -
         /**
    +
     
     647   -
          * Retrieves the file command line parameter(s) specified for the 'scan' argument.
    +
         /**
     648   -
          *
    +
          * Returns true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false is returned.
     649   -
          * @return the file paths specified on the command line for scan
    +
          *
     650   -
          */
    +
          * @return true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false
     651   -
         public String[] getScanFiles() {
    -  652  24
             return line.getOptionValues(ARGUMENT.SCAN);
    -  653   -
         }
    -  654   -
     
    -  655   -
         /**
    -  656   -
          * Retrieves the list of excluded file patterns specified by the 'exclude' argument.
    -  657   -
          *
    -  658   -
          * @return the excluded file patterns
    -  659  
          */
    +  652   +
         public boolean isNexusUsesProxy() {
    +  653   +
             // If they didn't specify whether Nexus needs to use the proxy, we should
    +  654   +
             // still honor the property if it's set.
    +  655  0
             if (line == null || !line.hasOption(ARGUMENT.NEXUS_USES_PROXY)) {
    +  656   +
                 try {
    +  657  0
                     return Settings.getBoolean(Settings.KEYS.ANALYZER_NEXUS_PROXY);
    +  658  0
                 } catch (InvalidSettingException ise) {
    +  659  0
                     return true;
     660   -
         public String[] getExcludeList() {
    -  661  0
             return line.getOptionValues(ARGUMENT.EXCLUDE);
    -  662   -
         }
    +
                 }
    +  661   +
             } else {
    +  662  0
                 return Boolean.parseBoolean(line.getOptionValue(ARGUMENT.NEXUS_USES_PROXY));
     663   -
     
    +
             }
     664   -
         /**
    +
         }
     665   -
          * Returns the directory to write the reports to specified on the command line.
    +
     
     666   -
          *
    +
         /**
     667   -
          * @return the path to the reports directory.
    +
          * Displays the command line help message to the standard output.
     668  
          */
     669   -
         public String getReportDirectory() {
    -  670  8
             return line.getOptionValue(ARGUMENT.OUT, ".");
    -  671   -
         }
    -  672   -
     
    -  673   -
         /**
    -  674   -
          * Returns the path to Mono for .NET Assembly analysis on non-windows systems.
    +
         public void printHelp() {
    +  670  2
             final HelpFormatter formatter = new HelpFormatter();
    +  671  2
             final Options options = new Options();
    +  672  2
             addStandardOptions(options);
    +  673  2
             if (line != null && line.hasOption(ARGUMENT.ADVANCED_HELP)) {
    +  674  0
                 addAdvancedOptions(options);
     675   -
          *
    -  676   -
          * @return the path to Mono
    +
             }
    +  676  2
             final String helpMsg = String.format("%n%s"
     677   -
          */
    +
                     + " can be used to identify if there are any known CVE vulnerabilities in libraries utilized by an application. "
     678   -
         public String getPathToMono() {
    -  679  8
             return line.getOptionValue(ARGUMENT.PATH_TO_MONO);
    +
                     + "%s will automatically update required data from the Internet, such as the CVE and CPE data files from nvd.nist.gov.%n%n",
    +  679   +
                     Settings.getString("application.name", "DependencyCheck"),
     680   -
         }
    +
                     Settings.getString("application.name", "DependencyCheck"));
     681  
     
    -  682   -
         /**
    +  682  2
             formatter.printHelp(Settings.getString("application.name", "DependencyCheck"),
     683   -
          * Returns the output format specified on the command line. Defaults to HTML if no format was specified.
    +
                     helpMsg,
     684   -
          *
    +
                     options,
     685   -
          * @return the output format name.
    +
                     "",
     686   -
          */
    -  687   -
         public String getReportFormat() {
    -  688  8
             return line.getOptionValue(ARGUMENT.OUTPUT_FORMAT, "HTML");
    +
                     true);
    +  687  2
         }
    +  688   +
     
     689   -
         }
    +
         /**
     690   -
     
    +
          * Retrieves the file command line parameter(s) specified for the 'scan' argument.
     691   -
         /**
    +
          *
     692   -
          * Returns the application name specified on the command line.
    +
          * @return the file paths specified on the command line for scan
     693   -
          *
    +
          */
     694   -
          * @return the application name.
    -  695   -
          */
    +
         public String[] getScanFiles() {
    +  695  3
             return line.getOptionValues(ARGUMENT.SCAN);
     696   -
         public String getApplicationName() {
    -  697  0
             return line.getOptionValue(ARGUMENT.APP_NAME);
    +
         }
    +  697   +
     
     698   -
         }
    +
         /**
     699   -
     
    +
          * Retrieves the list of excluded file patterns specified by the 'exclude' argument.
     700   -
         /**
    +
          *
     701   -
          * Returns the base URL for the CVE 1.2 XMl file.
    +
          * @return the excluded file patterns
     702   -
          *
    +
          */
     703   -
          * @return the URL to the CVE 1.2 XML file.
    -  704   -
          */
    +
         public String[] getExcludeList() {
    +  704  0
             return line.getOptionValues(ARGUMENT.EXCLUDE);
     705   -
         public String getBaseCve12Url() {
    -  706  8
             return line.getOptionValue(ARGUMENT.CVE_BASE_12);
    +
         }
    +  706   +
     
     707   -
         }
    +
         /**
     708   -
     
    +
          * Returns the directory to write the reports to specified on the command line.
     709   -
         /**
    +
          *
     710   -
          * Returns the base URL for the CVE 2.0 XMl file.
    +
          * @return the path to the reports directory.
     711   -
          *
    +
          */
     712   -
          * @return the URL to the CVE 2.0 XML file.
    -  713   -
          */
    +
         public String getReportDirectory() {
    +  713  1
             return line.getOptionValue(ARGUMENT.OUT, ".");
     714   -
         public String getBaseCve20Url() {
    -  715  8
             return line.getOptionValue(ARGUMENT.CVE_BASE_20);
    +
         }
    +  715   +
     
     716   -
         }
    +
         /**
     717   -
     
    +
          * Returns the path to Mono for .NET Assembly analysis on non-windows systems.
     718   -
         /**
    +
          *
     719   -
          * Returns the URL for the modified CVE 1.2 XMl file.
    +
          * @return the path to Mono
     720   -
          *
    +
          */
     721   -
          * @return the URL to the modified CVE 1.2 XML file.
    -  722   -
          */
    +
         public String getPathToMono() {
    +  722  1
             return line.getOptionValue(ARGUMENT.PATH_TO_MONO);
     723   -
         public String getModifiedCve12Url() {
    -  724  8
             return line.getOptionValue(ARGUMENT.CVE_MOD_12);
    +
         }
    +  724   +
     
     725   -
         }
    +
         /**
     726   -
     
    +
          * Returns the output format specified on the command line. Defaults to HTML if no format was specified.
     727   -
         /**
    +
          *
     728   -
          * Returns the URL for the modified CVE 2.0 XMl file.
    +
          * @return the output format name.
     729   -
          *
    +
          */
     730   -
          * @return the URL to the modified CVE 2.0 XML file.
    -  731   -
          */
    +
         public String getReportFormat() {
    +  731  1
             return line.getOptionValue(ARGUMENT.OUTPUT_FORMAT, "HTML");
     732   -
         public String getModifiedCve20Url() {
    -  733  8
             return line.getOptionValue(ARGUMENT.CVE_MOD_20);
    +
         }
    +  733   +
     
     734   -
         }
    +
         /**
     735   -
     
    +
          * Returns the application name specified on the command line.
     736   -
         /**
    +
          *
     737   -
          * Returns the connection timeout.
    +
          * @return the application name.
     738   -
          *
    +
          */
     739   -
          * @return the connection timeout
    -  740   -
          */
    -  741   -
         public String getConnectionTimeout() {
    -  742  0
             return line.getOptionValue(ARGUMENT.CONNECTION_TIMEOUT);
    -  743   -
         }
    -  744   -
     
    +
         public String getProjectName() {
    +  740  0
             final String appName = line.getOptionValue(ARGUMENT.APP_NAME);
    +  741  0
             String name = line.getOptionValue(ARGUMENT.PROJECT);
    +  742  0
             if (name == null && appName != null) {
    +  743  0
                 name = appName;
    +  744  0
                 LOGGER.warn("The '" + ARGUMENT.APP_NAME + "' argument should no longer be used; use '" + ARGUMENT.PROJECT + "' instead.");
     745   -
         /**
    -  746   -
          * Returns the proxy server.
    -  747   -
          *
    -  748   -
          * @return the proxy server
    -  749   -
          */
    -  750   -
         @SuppressWarnings("deprecation")
    -  751   -
         public String getProxyServer() {
    -  752   -
     
    -  753  0
             String server = line.getOptionValue(ARGUMENT.PROXY_SERVER);
    -  754  0
             if (server == null) {
    -  755  0
                 server = line.getOptionValue(ARGUMENT.PROXY_URL);
    -  756  0
                 if (server != null) {
    -  757  0
                     LOGGER.warn("An old command line argument 'proxyurl' was detected; use proxyserver instead");
    -  758   -
                 }
    -  759  
             }
    -  760  0
             return server;
    +  746  0
             return name;
    +  747   +
         }
    +  748   +
     
    +  749   +
         /**
    +  750   +
          * Returns the base URL for the CVE 1.2 XMl file.
    +  751   +
          *
    +  752   +
          * @return the URL to the CVE 1.2 XML file.
    +  753   +
          */
    +  754   +
         public String getBaseCve12Url() {
    +  755  1
             return line.getOptionValue(ARGUMENT.CVE_BASE_12);
    +  756   +
         }
    +  757   +
     
    +  758   +
         /**
    +  759   +
          * Returns the base URL for the CVE 2.0 XMl file.
    +  760   +
          *
     761   -
         }
    +
          * @return the URL to the CVE 2.0 XML file.
     762   -
     
    +
          */
     763   -
         /**
    -  764   -
          * Returns the proxy port.
    +
         public String getBaseCve20Url() {
    +  764  1
             return line.getOptionValue(ARGUMENT.CVE_BASE_20);
     765   -
          *
    +
         }
     766   -
          * @return the proxy port
    +
     
     767   -
          */
    +
         /**
     768   -
         public String getProxyPort() {
    -  769  0
             return line.getOptionValue(ARGUMENT.PROXY_PORT);
    +
          * Returns the URL for the modified CVE 1.2 XMl file.
    +  769   +
          *
     770   -
         }
    +
          * @return the URL to the modified CVE 1.2 XML file.
     771   -
     
    +
          */
     772   -
         /**
    -  773   -
          * Returns the proxy username.
    +
         public String getModifiedCve12Url() {
    +  773  1
             return line.getOptionValue(ARGUMENT.CVE_MOD_12);
     774   -
          *
    +
         }
     775   -
          * @return the proxy username
    +
     
     776   -
          */
    +
         /**
     777   -
         public String getProxyUsername() {
    -  778  0
             return line.getOptionValue(ARGUMENT.PROXY_USERNAME);
    +
          * Returns the URL for the modified CVE 2.0 XMl file.
    +  778   +
          *
     779   -
         }
    +
          * @return the URL to the modified CVE 2.0 XML file.
     780   -
     
    +
          */
     781   -
         /**
    -  782   -
          * Returns the proxy password.
    +
         public String getModifiedCve20Url() {
    +  782  1
             return line.getOptionValue(ARGUMENT.CVE_MOD_20);
     783   -
          *
    +
         }
     784   -
          * @return the proxy password
    +
     
     785   -
          */
    +
         /**
     786   -
         public String getProxyPassword() {
    -  787  0
             return line.getOptionValue(ARGUMENT.PROXY_PASSWORD);
    +
          * Returns the connection timeout.
    +  787   +
          *
     788   -
         }
    +
          * @return the connection timeout
     789   -
     
    +
          */
     790   -
         /**
    -  791   -
          * Get the value of dataDirectory.
    +
         public String getConnectionTimeout() {
    +  791  0
             return line.getOptionValue(ARGUMENT.CONNECTION_TIMEOUT);
     792   -
          *
    -  793   -
          * @return the value of dataDirectory
    -  794   -
          */
    -  795   -
         public String getDataDirectory() {
    -  796  0
             return line.getOptionValue(ARGUMENT.DATA_DIRECTORY);
    -  797  
         }
    -  798   +  793  
     
    -  799   +  794  
         /**
    -  800   -
          * Returns the properties file specified on the command line.
    -  801   +  795   +
          * Returns the proxy server.
    +  796  
          *
    -  802   -
          * @return the properties file specified on the command line
    -  803   +  797   +
          * @return the proxy server
    +  798  
          */
    -  804   -
         public File getPropertiesFile() {
    -  805  0
             final String path = line.getOptionValue(ARGUMENT.PROP);
    -  806  0
             if (path != null) {
    -  807  0
                 return new File(path);
    +  799   +
         @SuppressWarnings("deprecation")
    +  800   +
         public String getProxyServer() {
    +  801   +
     
    +  802  0
             String server = line.getOptionValue(ARGUMENT.PROXY_SERVER);
    +  803  0
             if (server == null) {
    +  804  0
                 server = line.getOptionValue(ARGUMENT.PROXY_URL);
    +  805  0
                 if (server != null) {
    +  806  0
                     LOGGER.warn("An old command line argument 'proxyurl' was detected; use proxyserver instead");
    +  807   +
                 }
     808  
             }
    -  809  0
             return null;
    +  809  0
             return server;
     810  
         }
     811   @@ -1457,16 +1453,16 @@  812  
         /**
     813   -
          * Returns the path to the verbose log file.
    +
          * Returns the proxy port.
     814  
          *
     815   -
          * @return the path to the verbose log file
    +
          * @return the proxy port
     816  
          */
     817   -
         public String getVerboseLog() {
    -  818  0
             return line.getOptionValue(ARGUMENT.VERBOSE_LOG);
    +
         public String getProxyPort() {
    +  818  0
             return line.getOptionValue(ARGUMENT.PROXY_PORT);
     819  
         }
     820   @@ -1474,16 +1470,16 @@  821  
         /**
     822   -
          * Returns the path to the suppression file.
    +
          * Returns the proxy username.
     823  
          *
     824   -
          * @return the path to the suppression file
    +
          * @return the proxy username
     825  
          */
     826   -
         public String getSuppressionFile() {
    -  827  0
             return line.getOptionValue(ARGUMENT.SUPPRESSION_FILE);
    +
         public String getProxyUsername() {
    +  827  0
             return line.getOptionValue(ARGUMENT.PROXY_USERNAME);
     828  
         }
     829   @@ -1491,56 +1487,55 @@  830  
         /**
     831   -
          * <p>
    +
          * Returns the proxy password.
     832   -
          * Prints the manifest information to standard output.</p>
    +
          *
     833   -
          * <ul><li>Implementation-Title: ${pom.name}</li>
    +
          * @return the proxy password
     834   -
          * <li>Implementation-Version: ${pom.version}</li></ul>
    +
          */
     835   -
          */
    -  836   -
         public void printVersionInfo() {
    -  837  8
             final String version = String.format("%s version %s",
    -  838   -
                     Settings.getString(Settings.KEYS.APPLICATION_VAME, "dependency-check"),
    -  839   -
                     Settings.getString(Settings.KEYS.APPLICATION_VERSION, "Unknown"));
    -  840  8
             System.out.println(version);
    -  841  8
         }
    -  842   -
     
    -  843   -
         /**
    -  844   -
          * Checks if the auto update feature has been disabled. If it has been disabled via the command line this will return false.
    -  845   -
          *
    -  846   -
          * @return <code>true</code> if auto-update is allowed; otherwise <code>false</code>
    -  847   -
          */
    -  848   -
         public boolean isAutoUpdate() {
    -  849  0
             return (line == null) || !line.hasOption(ARGUMENT.DISABLE_AUTO_UPDATE);
    -  850   +
         public String getProxyPassword() {
    +  836  0
             return line.getOptionValue(ARGUMENT.PROXY_PASSWORD);
    +  837  
         }
    -  851   +  838  
     
    -  852   +  839  
         /**
    -  853   -
          * Checks if the update only flag has been set.
    -  854   +  840   +
          * Get the value of dataDirectory.
    +  841  
          *
    -  855   -
          * @return <code>true</code> if the update only flag has been set; otherwise <code>false</code>.
    -  856   +  842   +
          * @return the value of dataDirectory
    +  843  
          */
    +  844   +
         public String getDataDirectory() {
    +  845  0
             return line.getOptionValue(ARGUMENT.DATA_DIRECTORY);
    +  846   +
         }
    +  847   +
     
    +  848   +
         /**
    +  849   +
          * Returns the properties file specified on the command line.
    +  850   +
          *
    +  851   +
          * @return the properties file specified on the command line
    +  852   +
          */
    +  853   +
         public File getPropertiesFile() {
    +  854  0
             final String path = line.getOptionValue(ARGUMENT.PROP);
    +  855  0
             if (path != null) {
    +  856  0
                 return new File(path);
     857   -
         public boolean isUpdateOnly() {
    -  858  0
             return (line == null) || line.hasOption(ARGUMENT.UPDATE_ONLY);
    +
             }
    +  858  0
             return null;
     859  
         }
     860   @@ -1548,16 +1543,16 @@  861  
         /**
     862   -
          * Returns the database driver name if specified; otherwise null is returned.
    +
          * Returns the path to the verbose log file.
     863  
          *
     864   -
          * @return the database driver name if specified; otherwise null is returned
    +
          * @return the path to the verbose log file
     865  
          */
     866   -
         public String getDatabaseDriverName() {
    -  867  0
             return line.getOptionValue(ARGUMENT.DB_DRIVER);
    +
         public String getVerboseLog() {
    +  867  0
             return line.getOptionValue(ARGUMENT.VERBOSE_LOG);
     868  
         }
     869   @@ -1565,16 +1560,16 @@  870  
         /**
     871   -
          * Returns the database driver path if specified; otherwise null is returned.
    +
          * Returns the path to the suppression file.
     872  
          *
     873   -
          * @return the database driver name if specified; otherwise null is returned
    +
          * @return the path to the suppression file
     874  
          */
     875   -
         public String getDatabaseDriverPath() {
    -  876  0
             return line.getOptionValue(ARGUMENT.DB_DRIVER_PATH);
    +
         public String getSuppressionFile() {
    +  876  0
             return line.getOptionValue(ARGUMENT.SUPPRESSION_FILE);
     877  
         }
     878   @@ -1582,542 +1577,702 @@  879  
         /**
     880   -
          * Returns the database connection string if specified; otherwise null is returned.
    +
          * <p>
     881   -
          *
    +
          * Prints the manifest information to standard output.</p>
     882   -
          * @return the database connection string if specified; otherwise null is returned
    +
          * <ul><li>Implementation-Title: ${pom.name}</li>
     883   -
          */
    +
          * <li>Implementation-Version: ${pom.version}</li></ul>
     884   -
         public String getConnectionString() {
    -  885  0
             return line.getOptionValue(ARGUMENT.CONNECTION_STRING);
    -  886   -
         }
    +
          */
    +  885   +
         public void printVersionInfo() {
    +  886  1
             final String version = String.format("%s version %s",
     887   -
     
    +
                     Settings.getString(Settings.KEYS.APPLICATION_VAME, "dependency-check"),
     888   -
         /**
    -  889   -
          * Returns the database database user name if specified; otherwise null is returned.
    -  890   -
          *
    +
                     Settings.getString(Settings.KEYS.APPLICATION_VERSION, "Unknown"));
    +  889  1
             System.out.println(version);
    +  890  1
         }
     891   -
          * @return the database database user name if specified; otherwise null is returned
    +
     
     892   -
          */
    +
         /**
     893   -
         public String getDatabaseUser() {
    -  894  0
             return line.getOptionValue(ARGUMENT.DB_NAME);
    +
          * Checks if the auto update feature has been disabled. If it has been disabled via the command line this will return false.
    +  894   +
          *
     895   -
         }
    +
          * @return <code>true</code> if auto-update is allowed; otherwise <code>false</code>
     896   -
     
    +
          */
     897   -
         /**
    -  898   -
          * Returns the database database password if specified; otherwise null is returned.
    +
         public boolean isAutoUpdate() {
    +  898  0
             return line != null && !line.hasOption(ARGUMENT.DISABLE_AUTO_UPDATE);
     899   -
          *
    +
         }
     900   -
          * @return the database database password if specified; otherwise null is returned
    +
     
     901   -
          */
    +
         /**
     902   -
         public String getDatabasePassword() {
    -  903  0
             return line.getOptionValue(ARGUMENT.DB_PASSWORD);
    -  904   -
         }
    -  905   -
     
    -  906   -
         /**
    -  907   -
          * Returns the additional Extensions if specified; otherwise null is returned.
    -  908   +
          * Checks if the update only flag has been set.
    +  903  
          *
    -  909   -
          * @return the additional Extensions; otherwise null is returned
    -  910   +  904   +
          * @return <code>true</code> if the update only flag has been set; otherwise <code>false</code>.
    +  905  
          */
    -  911   -
         public String getAdditionalZipExtensions() {
    -  912  0
             return line.getOptionValue(ARGUMENT.ADDITIONAL_ZIP_EXTENSIONS);
    -  913   +  906   +
         public boolean isUpdateOnly() {
    +  907  0
             return line != null && line.hasOption(ARGUMENT.UPDATE_ONLY);
    +  908  
         }
    -  914   +  909  
     
    -  915   +  910  
         /**
    -  916   -
          * A collection of static final strings that represent the possible command line arguments.
    -  917   +  911   +
          * Checks if the purge NVD flag has been set.
    +  912   +
          *
    +  913   +
          * @return <code>true</code> if the purge nvd flag has been set; otherwise <code>false</code>.
    +  914  
          */
    -  918  72
         public static class ARGUMENT {
    -  919   +  915   +
         public boolean isPurge() {
    +  916  0
             return line != null && line.hasOption(ARGUMENT.PURGE_NVD);
    +  917   +
         }
    +  918  
     
    +  919   +
         /**
     920   -
             /**
    +
          * Returns the database driver name if specified; otherwise null is returned.
     921   -
              * The long CLI argument name specifying the directory/file to scan.
    +
          *
     922   -
              */
    +
          * @return the database driver name if specified; otherwise null is returned
     923   -
             public static final String SCAN = "scan";
    +
          */
     924   -
             /**
    -  925   -
              * The short CLI argument name specifying the directory/file to scan.
    +
         public String getDatabaseDriverName() {
    +  925  0
             return line.getOptionValue(ARGUMENT.DB_DRIVER);
     926   -
              */
    +
         }
     927   -
             public static final String SCAN_SHORT = "s";
    +
     
     928   -
             /**
    +
         /**
     929   -
              * The long CLI argument name specifying that the CPE/CVE/etc. data should not be automatically updated.
    +
          * Returns the database driver path if specified; otherwise null is returned.
     930   -
              */
    +
          *
     931   -
             public static final String DISABLE_AUTO_UPDATE = "noupdate";
    +
          * @return the database driver name if specified; otherwise null is returned
     932   -
             /**
    +
          */
     933   -
              * The short CLI argument name specifying that the CPE/CVE/etc. data should not be automatically updated.
    -  934   -
              */
    +
         public String getDatabaseDriverPath() {
    +  934  0
             return line.getOptionValue(ARGUMENT.DB_DRIVER_PATH);
     935   -
             public static final String DISABLE_AUTO_UPDATE_SHORT = "n";
    +
         }
     936   -
             /**
    +
     
     937   -
              * The long CLI argument name specifying that only the update phase should be executed; no scan should be run.
    +
         /**
     938   -
              */
    +
          * Returns the database connection string if specified; otherwise null is returned.
     939   -
             public static final String UPDATE_ONLY = "updateonly";
    +
          *
     940   -
             /**
    +
          * @return the database connection string if specified; otherwise null is returned
     941   -
              * The long CLI argument name specifying the directory to write the reports to.
    +
          */
     942   -
              */
    -  943   -
             public static final String OUT = "out";
    +
         public String getConnectionString() {
    +  943  0
             return line.getOptionValue(ARGUMENT.CONNECTION_STRING);
     944   -
             /**
    +
         }
     945   -
              * The short CLI argument name specifying the directory to write the reports to.
    +
     
     946   -
              */
    +
         /**
     947   -
             public static final String OUT_SHORT = "o";
    +
          * Returns the database database user name if specified; otherwise null is returned.
     948   -
             /**
    +
          *
     949   -
              * The long CLI argument name specifying the output format to write the reports to.
    +
          * @return the database database user name if specified; otherwise null is returned
     950   -
              */
    +
          */
     951   -
             public static final String OUTPUT_FORMAT = "format";
    -  952   -
             /**
    +
         public String getDatabaseUser() {
    +  952  0
             return line.getOptionValue(ARGUMENT.DB_NAME);
     953   -
              * The short CLI argument name specifying the output format to write the reports to.
    +
         }
     954   -
              */
    +
     
     955   -
             public static final String OUTPUT_FORMAT_SHORT = "f";
    +
         /**
     956   -
             /**
    +
          * Returns the database database password if specified; otherwise null is returned.
     957   -
              * The long CLI argument name specifying the name of the application to be scanned.
    +
          *
     958   -
              */
    +
          * @return the database database password if specified; otherwise null is returned
     959   -
             public static final String APP_NAME = "app";
    +
          */
     960   -
             /**
    -  961   -
              * The short CLI argument name specifying the name of the application to be scanned.
    +
         public String getDatabasePassword() {
    +  961  0
             return line.getOptionValue(ARGUMENT.DB_PASSWORD);
     962   -
              */
    +
         }
     963   -
             public static final String APP_NAME_SHORT = "a";
    +
     
     964   -
             /**
    +
         /**
     965   -
              * The long CLI argument name asking for help.
    +
          * Returns the additional Extensions if specified; otherwise null is returned.
     966   -
              */
    +
          *
     967   -
             public static final String HELP = "help";
    +
          * @return the additional Extensions; otherwise null is returned
     968   -
             /**
    +
          */
     969   -
              * The long CLI argument name asking for advanced help.
    -  970   -
              */
    +
         public String getAdditionalZipExtensions() {
    +  970  0
             return line.getOptionValue(ARGUMENT.ADDITIONAL_ZIP_EXTENSIONS);
     971   -
             public static final String ADVANCED_HELP = "advancedHelp";
    +
         }
     972   -
             /**
    +
     
     973   -
              * The short CLI argument name asking for help.
    +
         /**
     974   -
              */
    +
          * A collection of static final strings that represent the possible command line arguments.
     975   -
             public static final String HELP_SHORT = "h";
    -  976   -
             /**
    +
          */
    +  976  9
         public static class ARGUMENT {
     977   -
              * The long CLI argument name asking for the version.
    +
     
     978   -
              */
    +
             /**
     979   -
             public static final String VERSION_SHORT = "v";
    +
              * The long CLI argument name specifying the directory/file to scan.
     980   -
             /**
    +
              */
     981   -
              * The short CLI argument name asking for the version.
    +
             public static final String SCAN = "scan";
     982   -
              */
    +
             /**
     983   -
             public static final String VERSION = "version";
    +
              * The short CLI argument name specifying the directory/file to scan.
     984   -
             /**
    +
              */
     985   -
              * The CLI argument name indicating the proxy port.
    +
             public static final String SCAN_SHORT = "s";
     986   -
              */
    +
             /**
     987   -
             public static final String PROXY_PORT = "proxyport";
    +
              * The long CLI argument name specifying that the CPE/CVE/etc. data should not be automatically updated.
     988   -
             /**
    -  989   -
              * The CLI argument name indicating the proxy server.
    -  990  
              */
    -  991   -
             public static final String PROXY_SERVER = "proxyserver";
    -  992   +  989   +
             public static final String DISABLE_AUTO_UPDATE = "noupdate";
    +  990  
             /**
    +  991   +
              * The short CLI argument name specifying that the CPE/CVE/etc. data should not be automatically updated.
    +  992   +
              */
     993   -
              * The CLI argument name indicating the proxy url.
    +
             public static final String DISABLE_AUTO_UPDATE_SHORT = "n";
     994   -
              *
    +
             /**
     995   -
              * @deprecated use {@link #PROXY_SERVER} instead
    +
              * The long CLI argument name specifying that only the update phase should be executed; no scan should be run.
     996  
              */
     997   -
             @Deprecated
    +
             public static final String UPDATE_ONLY = "updateonly";
     998   -
             public static final String PROXY_URL = "proxyurl";
    +
             /**
     999   -
             /**
    +
              * The long CLI argument name specifying that only the update phase should be executed; no scan should be run.
     1000   -
              * The CLI argument name indicating the proxy username.
    +
              */
     1001   -
              */
    +
             public static final String PURGE_NVD = "purge";
     1002   -
             public static final String PROXY_USERNAME = "proxyuser";
    +
             /**
     1003   -
             /**
    +
              * The long CLI argument name specifying the directory to write the reports to.
     1004   -
              * The CLI argument name indicating the proxy password.
    +
              */
     1005   -
              */
    +
             public static final String OUT = "out";
     1006   -
             public static final String PROXY_PASSWORD = "proxypass";
    +
             /**
     1007   -
             /**
    +
              * The short CLI argument name specifying the directory to write the reports to.
     1008   -
              * The short CLI argument name indicating the connection timeout.
    +
              */
     1009   -
              */
    +
             public static final String OUT_SHORT = "o";
     1010   -
             public static final String CONNECTION_TIMEOUT_SHORT = "c";
    +
             /**
     1011   -
             /**
    +
              * The long CLI argument name specifying the output format to write the reports to.
     1012   -
              * The CLI argument name indicating the connection timeout.
    +
              */
     1013   -
              */
    +
             public static final String OUTPUT_FORMAT = "format";
     1014   -
             public static final String CONNECTION_TIMEOUT = "connectiontimeout";
    +
             /**
     1015   -
             /**
    +
              * The short CLI argument name specifying the output format to write the reports to.
     1016   -
              * The short CLI argument name for setting the location of an additional properties file.
    +
              */
     1017   -
              */
    +
             public static final String OUTPUT_FORMAT_SHORT = "f";
     1018   -
             public static final String PROP_SHORT = "P";
    +
             /**
     1019   -
             /**
    +
              * The long CLI argument name specifying the name of the project to be scanned.
     1020   -
              * The CLI argument name for setting the location of an additional properties file.
    +
              */
     1021   -
              */
    +
             public static final String PROJECT = "project";
     1022   -
             public static final String PROP = "propertyfile";
    +
             /**
     1023   -
             /**
    +
              * The long CLI argument name specifying the name of the application to be scanned.
     1024   -
              * The CLI argument name for setting the location of the data directory.
    +
              *
     1025   -
              */
    +
              * @deprecated project should be used instead
     1026   -
             public static final String DATA_DIRECTORY = "data";
    -  1027   -
             /**
    -  1028   -
              * The CLI argument name for setting the URL for the CVE Data Files.
    -  1029  
              */
    -  1030   -
             public static final String CVE_MOD_12 = "cveUrl12Modified";
    -  1031   +  1027   +
             @Deprecated
    +  1028   +
             public static final String APP_NAME = "app";
    +  1029  
             /**
    +  1030   +
              * The short CLI argument name specifying the name of the application to be scanned.
    +  1031   +
              *
     1032   -
              * The CLI argument name for setting the URL for the CVE Data Files.
    +
              * @deprecated project should be used instead
     1033  
              */
     1034   -
             public static final String CVE_MOD_20 = "cveUrl20Modified";
    +
             @Deprecated
     1035   -
             /**
    +
             public static final String APP_NAME_SHORT = "a";
     1036   -
              * The CLI argument name for setting the URL for the CVE Data Files.
    +
             /**
     1037   -
              */
    +
              * The long CLI argument name asking for help.
     1038   -
             public static final String CVE_BASE_12 = "cveUrl12Base";
    +
              */
     1039   -
             /**
    +
             public static final String HELP = "help";
     1040   -
              * The CLI argument name for setting the URL for the CVE Data Files.
    +
             /**
     1041   -
              */
    +
              * The long CLI argument name asking for advanced help.
     1042   -
             public static final String CVE_BASE_20 = "cveUrl20Base";
    +
              */
     1043   -
             /**
    +
             public static final String ADVANCED_HELP = "advancedHelp";
     1044   -
              * The short CLI argument name for setting the location of the data directory.
    +
             /**
     1045   -
              */
    +
              * The short CLI argument name asking for help.
     1046   -
             public static final String DATA_DIRECTORY_SHORT = "d";
    +
              */
     1047   -
             /**
    +
             public static final String HELP_SHORT = "h";
     1048   -
              * The CLI argument name for setting the location of the data directory.
    -  1049   -
              */
    -  1050   -
             public static final String VERBOSE_LOG = "log";
    -  1051  
             /**
    -  1052   -
              * The short CLI argument name for setting the location of the data directory.
    -  1053   +  1049   +
              * The long CLI argument name asking for the version.
    +  1050  
              */
    +  1051   +
             public static final String VERSION_SHORT = "v";
    +  1052   +
             /**
    +  1053   +
              * The short CLI argument name asking for the version.
     1054   -
             public static final String VERBOSE_LOG_SHORT = "l";
    +
              */
     1055   -
     
    +
             public static final String VERSION = "version";
     1056  
             /**
     1057   -
              * The CLI argument name for setting the depth of symbolic links that will be followed.
    +
              * The CLI argument name indicating the proxy port.
     1058  
              */
     1059   -
             public static final String SYM_LINK_DEPTH = "symLink";
    +
             public static final String PROXY_PORT = "proxyport";
     1060  
             /**
     1061   -
              * The CLI argument name for setting the location of the suppression file.
    +
              * The CLI argument name indicating the proxy server.
     1062  
              */
     1063   -
             public static final String SUPPRESSION_FILE = "suppression";
    +
             public static final String PROXY_SERVER = "proxyserver";
     1064  
             /**
     1065   -
              * Disables the Jar Analyzer.
    +
              * The CLI argument name indicating the proxy url.
     1066   -
              */
    +
              *
     1067   -
             public static final String DISABLE_JAR = "disableJar";
    +
              * @deprecated use {@link #PROXY_SERVER} instead
     1068   -
             /**
    +
              */
     1069   -
              * Disables the Archive Analyzer.
    +
             @Deprecated
     1070   -
              */
    +
             public static final String PROXY_URL = "proxyurl";
     1071   -
             public static final String DISABLE_ARCHIVE = "disableArchive";
    +
             /**
     1072   -
             /**
    +
              * The CLI argument name indicating the proxy username.
     1073   -
              * Disables the Python Distribution Analyzer.
    +
              */
     1074   -
              */
    +
             public static final String PROXY_USERNAME = "proxyuser";
     1075   -
             public static final String DISABLE_PY_DIST = "disablePyDist";
    +
             /**
     1076   -
             /**
    +
              * The CLI argument name indicating the proxy password.
     1077   -
              * Disables the Python Package Analyzer.
    +
              */
     1078   -
              */
    +
             public static final String PROXY_PASSWORD = "proxypass";
     1079   -
             public static final String DISABLE_PY_PKG = "disablePyPkg";
    +
             /**
     1080   -
             /**
    +
              * The short CLI argument name indicating the connection timeout.
     1081   -
              * Disables the Autoconf Analyzer.
    +
              */
     1082   -
              */
    +
             public static final String CONNECTION_TIMEOUT_SHORT = "c";
     1083   -
             public static final String DISABLE_AUTOCONF = "disableAutoconf";
    +
             /**
     1084   -
             /**
    +
              * The CLI argument name indicating the connection timeout.
     1085   -
              * Disables the Cmake Analyzer.
    +
              */
     1086   -
              */
    +
             public static final String CONNECTION_TIMEOUT = "connectiontimeout";
     1087   -
             public static final String DISABLE_CMAKE = "disableCmake";
    +
             /**
     1088   -
             /**
    +
              * The short CLI argument name for setting the location of an additional properties file.
     1089   -
              * Disables the Assembly Analyzer.
    +
              */
     1090   -
              */
    +
             public static final String PROP_SHORT = "P";
     1091   -
             public static final String DISABLE_ASSEMBLY = "disableAssembly";
    +
             /**
     1092   -
             /**
    +
              * The CLI argument name for setting the location of an additional properties file.
     1093   -
              * Disables the Nuspec Analyzer.
    +
              */
     1094   -
              */
    +
             public static final String PROP = "propertyfile";
     1095   -
             public static final String DISABLE_NUSPEC = "disableNuspec";
    +
             /**
     1096   -
             /**
    +
              * The CLI argument name for setting the location of the data directory.
     1097   -
              * Disables the Central Analyzer.
    +
              */
     1098   -
              */
    +
             public static final String DATA_DIRECTORY = "data";
     1099   -
             public static final String DISABLE_CENTRAL = "disableCentral";
    +
             /**
     1100   -
             /**
    +
              * The CLI argument name for setting the URL for the CVE Data Files.
     1101   -
              * Disables the Nexus Analyzer.
    +
              */
     1102   -
              */
    +
             public static final String CVE_MOD_12 = "cveUrl12Modified";
     1103   -
             public static final String DISABLE_NEXUS = "disableNexus";
    +
             /**
     1104   -
             /**
    +
              * The CLI argument name for setting the URL for the CVE Data Files.
     1105   -
              * Disables the OpenSSL Analyzer.
    +
              */
     1106   -
              */
    +
             public static final String CVE_MOD_20 = "cveUrl20Modified";
     1107   -
             public static final String DISABLE_OPENSSL = "disableOpenSSL";
    +
             /**
     1108   -
             /**
    +
              * The CLI argument name for setting the URL for the CVE Data Files.
     1109   -
              * The URL of the nexus server.
    +
              */
     1110   -
              */
    +
             public static final String CVE_BASE_12 = "cveUrl12Base";
     1111   -
             public static final String NEXUS_URL = "nexus";
    +
             /**
     1112   -
             /**
    +
              * The CLI argument name for setting the URL for the CVE Data Files.
     1113   -
              * Whether or not the defined proxy should be used when connecting to Nexus.
    +
              */
     1114   -
              */
    +
             public static final String CVE_BASE_20 = "cveUrl20Base";
     1115   -
             public static final String NEXUS_USES_PROXY = "nexusUsesProxy";
    +
             /**
     1116   -
             /**
    +
              * The short CLI argument name for setting the location of the data directory.
     1117   -
              * The CLI argument name for setting the connection string.
    +
              */
     1118   -
              */
    +
             public static final String DATA_DIRECTORY_SHORT = "d";
     1119   -
             public static final String CONNECTION_STRING = "connectionString";
    +
             /**
     1120   -
             /**
    +
              * The CLI argument name for setting the location of the data directory.
     1121   -
              * The CLI argument name for setting the database user name.
    +
              */
     1122   -
              */
    +
             public static final String VERBOSE_LOG = "log";
     1123   -
             public static final String DB_NAME = "dbUser";
    -  1124  
             /**
    +  1124   +
              * The short CLI argument name for setting the location of the data directory.
     1125   -
              * The CLI argument name for setting the database password.
    -  1126  
              */
    +  1126   +
             public static final String VERBOSE_LOG_SHORT = "l";
     1127   -
             public static final String DB_PASSWORD = "dbPassword";
    +
     
     1128  
             /**
     1129   -
              * The CLI argument name for setting the database driver name.
    +
              * The CLI argument name for setting the depth of symbolic links that will be followed.
     1130  
              */
     1131   -
             public static final String DB_DRIVER = "dbDriverName";
    +
             public static final String SYM_LINK_DEPTH = "symLink";
     1132  
             /**
     1133   -
              * The CLI argument name for setting the path to the database driver; in case it is not on the class path.
    +
              * The CLI argument name for setting the location of the suppression file.
     1134  
              */
     1135   -
             public static final String DB_DRIVER_PATH = "dbDriverPath";
    +
             public static final String SUPPRESSION_FILE = "suppression";
     1136  
             /**
     1137   -
              * The CLI argument name for setting the path to mono for .NET Assembly analysis on non-windows systems.
    +
              * Disables the Jar Analyzer.
     1138  
              */
     1139   -
             public static final String PATH_TO_MONO = "mono";
    +
             public static final String DISABLE_JAR = "disableJar";
     1140  
             /**
     1141   -
              * The CLI argument name for setting extra extensions.
    +
              * Disables the Archive Analyzer.
     1142  
              */
     1143   -
             public static final String ADDITIONAL_ZIP_EXTENSIONS = "zipExtensions";
    +
             public static final String DISABLE_ARCHIVE = "disableArchive";
     1144  
             /**
     1145   -
              * Exclude path argument.
    +
              * Disables the Python Distribution Analyzer.
     1146  
              */
     1147   -
             public static final String EXCLUDE = "exclude";
    +
             public static final String DISABLE_PY_DIST = "disablePyDist";
     1148   -
         }
    +
             /**
     1149   +
              * Disables the Python Package Analyzer.
    +  1150   +
              */
    +  1151   +
             public static final String DISABLE_PY_PKG = "disablePyPkg";
    +  1152   +
             /**
    +  1153   +
              * Disables the Python Package Analyzer.
    +  1154   +
              */
    +  1155   +
             public static final String DISABLE_COMPOSER = "disableComposer";
    +  1156   +
             /**
    +  1157   +
              * Disables the Ruby Gemspec Analyzer.
    +  1158   +
              */
    +  1159   +
             public static final String DISABLE_RUBYGEMS = "disableRubygems";
    +  1160   +
             /**
    +  1161   +
              * Disables the Autoconf Analyzer.
    +  1162   +
              */
    +  1163   +
             public static final String DISABLE_AUTOCONF = "disableAutoconf";
    +  1164   +
             /**
    +  1165   +
              * Disables the Cmake Analyzer.
    +  1166   +
              */
    +  1167   +
             public static final String DISABLE_CMAKE = "disableCmake";
    +  1168   +
             /**
    +  1169   +
              * Disables the Assembly Analyzer.
    +  1170   +
              */
    +  1171   +
             public static final String DISABLE_ASSEMBLY = "disableAssembly";
    +  1172   +
             /**
    +  1173   +
              * Disables the Nuspec Analyzer.
    +  1174   +
              */
    +  1175   +
             public static final String DISABLE_NUSPEC = "disableNuspec";
    +  1176   +
             /**
    +  1177   +
              * Disables the Central Analyzer.
    +  1178   +
              */
    +  1179   +
             public static final String DISABLE_CENTRAL = "disableCentral";
    +  1180   +
             /**
    +  1181   +
              * Disables the Nexus Analyzer.
    +  1182   +
              */
    +  1183   +
             public static final String DISABLE_NEXUS = "disableNexus";
    +  1184   +
             /**
    +  1185   +
              * Disables the OpenSSL Analyzer.
    +  1186   +
              */
    +  1187   +
             public static final String DISABLE_OPENSSL = "disableOpenSSL";
    +  1188   +
             /**
    +  1189   +
              * Disables the Node.js Package Analyzer.
    +  1190   +
              */
    +  1191   +
             public static final String DISABLE_NODE_JS = "disableNodeJS";
    +  1192   +
             /**
    +  1193   +
              * The URL of the nexus server.
    +  1194   +
              */
    +  1195   +
             public static final String NEXUS_URL = "nexus";
    +  1196   +
             /**
    +  1197   +
              * Whether or not the defined proxy should be used when connecting to Nexus.
    +  1198   +
              */
    +  1199   +
             public static final String NEXUS_USES_PROXY = "nexusUsesProxy";
    +  1200   +
             /**
    +  1201   +
              * The CLI argument name for setting the connection string.
    +  1202   +
              */
    +  1203   +
             public static final String CONNECTION_STRING = "connectionString";
    +  1204   +
             /**
    +  1205   +
              * The CLI argument name for setting the database user name.
    +  1206   +
              */
    +  1207   +
             public static final String DB_NAME = "dbUser";
    +  1208   +
             /**
    +  1209   +
              * The CLI argument name for setting the database password.
    +  1210   +
              */
    +  1211   +
             public static final String DB_PASSWORD = "dbPassword";
    +  1212   +
             /**
    +  1213   +
              * The CLI argument name for setting the database driver name.
    +  1214   +
              */
    +  1215   +
             public static final String DB_DRIVER = "dbDriverName";
    +  1216   +
             /**
    +  1217   +
              * The CLI argument name for setting the path to the database driver; in case it is not on the class path.
    +  1218   +
              */
    +  1219   +
             public static final String DB_DRIVER_PATH = "dbDriverPath";
    +  1220   +
             /**
    +  1221   +
              * The CLI argument name for setting the path to mono for .NET Assembly analysis on non-windows systems.
    +  1222   +
              */
    +  1223   +
             public static final String PATH_TO_MONO = "mono";
    +  1224   +
             /**
    +  1225   +
              * The CLI argument name for setting extra extensions.
    +  1226   +
              */
    +  1227   +
             public static final String ADDITIONAL_ZIP_EXTENSIONS = "zipExtensions";
    +  1228   +
             /**
    +  1229   +
              * Exclude path argument.
    +  1230   +
              */
    +  1231   +
             public static final String EXCLUDE = "exclude";
    +  1232   +
         }
    +  1233  
     }
    - + diff --git a/dependency-check-cli/cobertura/org.owasp.dependencycheck.InvalidScanPathException.html b/dependency-check-cli/cobertura/org.owasp.dependencycheck.InvalidScanPathException.html index 01095cc33..406c1b954 100644 --- a/dependency-check-cli/cobertura/org.owasp.dependencycheck.InvalidScanPathException.html +++ b/dependency-check-cli/cobertura/org.owasp.dependencycheck.InvalidScanPathException.html @@ -72,67 +72,77 @@  27  
         /**
     28   -
          * Creates a new InvalidScanPathException.
    +
          * The serial version UID for serialization.
     29  
          */
     30   -
         public InvalidScanPathException() {
    -  31  0
             super();
    -  32  0
         }
    +
         private static final long serialVersionUID = 1L;
    +  31   +
     
    +  32   +
         /**
     33   -
     
    +
          * Creates a new InvalidScanPathException.
     34   -
         /**
    +
          */
     35   -
          * Creates a new InvalidScanPathException.
    -  36   -
          *
    -  37   -
          * @param msg a message for the exception
    +
         public InvalidScanPathException() {
    +  36  0
             super();
    +  37  0
         }
     38   -
          */
    +
     
     39   -
         public InvalidScanPathException(String msg) {
    -  40  0
             super(msg);
    -  41  0
         }
    +
         /**
    +  40   +
          * Creates a new InvalidScanPathException.
    +  41   +
          *
     42   -
     
    -  43   -
         /**
    -  44   -
          * Creates a new InvalidScanPathException.
    -  45   -
          *
    -  46   -
          * @param ex the cause of the exception
    -  47   -
          */
    -  48   -
         public InvalidScanPathException(Throwable ex) {
    -  49  0
             super(ex);
    -  50  0
         }
    -  51   -
     
    -  52   -
         /**
    -  53   -
          * Creates a new InvalidScanPathException.
    -  54   -
          *
    -  55  
          * @param msg a message for the exception
    -  56   -
          * @param ex the cause of the exception
    -  57   +  43  
          */
    +  44   +
         public InvalidScanPathException(String msg) {
    +  45  0
             super(msg);
    +  46  0
         }
    +  47   +
     
    +  48   +
         /**
    +  49   +
          * Creates a new InvalidScanPathException.
    +  50   +
          *
    +  51   +
          * @param ex the cause of the exception
    +  52   +
          */
    +  53   +
         public InvalidScanPathException(Throwable ex) {
    +  54  0
             super(ex);
    +  55  0
         }
    +  56   +
     
    +  57   +
         /**
     58   -
         public InvalidScanPathException(String msg, Throwable ex) {
    -  59  0
             super(msg, ex);
    -  60  0
         }
    +
          * Creates a new InvalidScanPathException.
    +  59   +
          *
    +  60   +
          * @param msg a message for the exception
     61   +
          * @param ex the cause of the exception
    +  62   +
          */
    +  63   +
         public InvalidScanPathException(String msg, Throwable ex) {
    +  64  0
             super(msg, ex);
    +  65  0
         }
    +  66  
     }
    - + diff --git a/dependency-check-cli/css/apache-maven-fluido-1.4.min.css b/dependency-check-cli/css/apache-maven-fluido-1.4.min.css new file mode 100644 index 000000000..54a006744 --- /dev/null +++ b/dependency-check-cli/css/apache-maven-fluido-1.4.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eeeeee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #dddddd #eee #eeeeee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eeeeee #eee #dddddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}.clear{clear:both;visibility:hidden}.clear hr{display:none}.section p,.section p,.section dt,.section dt{margin-right:7px;margin-left:7px}#ohloh{margin-bottom:10px}#poweredBy{text-align:center}a.externalLink{padding-right:18px}a.newWindow{background:url('../images/window-new.png') right center no-repeat;padding-right:18px}a.externalLink[href^=http]{background:url('../images/internet-web-browser.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".asc"]{background:url('../images/accessories-text-editor.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".jpg"],a.externalLink[href$=".jpeg"],a.externalLink[href$=".gif"],a.externalLink[href$=".png"]{background:url('../images/image-x-generic.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".tar.gz"],a.externalLink[href$=".zip"]{background:url('../images/package-x-generic.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".md5"],a.externalLink[href$=".sha1"]{background:url('../images/document-properties.png') right center no-repeat;padding-right:18px}a.externalLink[href^=https]{background:url('../images/application-certificate.png') right center no-repeat;padding-right:18px}a.externalLink[href^=file]{background:url('../images/drive-harddisk.png') right center no-repeat;padding-right:18px}a.externalLink[href^=ftp]{background:url('../images/network-server.png') right center no-repeat;padding-right:18px}a.externalLink[href^=mailto]{background:url('../images/contact-new.png') right center no-repeat;padding-right:18px}li.none{list-style:none}.search-query{background-image:url(http://www.google.com/cse/intl/en/images/google_custom_search_watermark.gif);background-attachment:initial;background-origin:initial;background-clip:initial;background-color:#fff;background-position:0 50%;background-repeat:no-repeat no-repeat;width:95%}body.topBarEnabled{padding-top:60px}body.topBarDisabled{padding-top:20px}.builtBy{display:block}img.builtBy{margin:10px auto}#search-form{margin-left:9px;margin-right:9px}.hero-unit h2{font-size:60px}tt{padding:0 3px 2px;font-family:Monaco,Andale Mono,Courier New,monospace;font-size:.9em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#fee9cc;color:rgba(0,0,0,0.75);padding:1px 3px}li{color:#404040}table.zebra-striped{background-color:#FFF}.footer{background-color:#EEE}.sidebar-nav{padding-left:0;padding-right:0}.sidebar-nav .icon-chevron-right,.sidebar-nav .icon-chevron-down{margin-top:2px;margin-right:-6px;float:right;opacity:.25}li.pull-right{margin-left:3px;margin-right:3px}.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0;padding-left:15px}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/dependency-check-cli/dependency-analysis.html b/dependency-check-cli/dependency-analysis.html new file mode 100644 index 000000000..ea33e7284 --- /dev/null +++ b/dependency-check-cli/dependency-analysis.html @@ -0,0 +1,368 @@ + + + + + + + + + dependency-check-cli – Dependencies Report + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +
    +

    Dependency Analysis

    +
    +

    Used and declared dependencies

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GroupIdArtifactIdVersionScopeClassifierTypeOptional
    commons-clicommons-cli1.3.1compilejarfalse
    org.owaspdependency-check-core1.3.1compilejarfalse
    org.owaspdependency-check-utils1.3.1compilejarfalse
    org.slf4jslf4j-api1.7.12compilejarfalse
    ch.qos.logbacklogback-core1.1.3compilejarfalse
    ch.qos.logbacklogback-classic1.1.3compilejarfalse
    org.apache.antant1.9.6compilejarfalse
    junitjunit4.12testjarfalse

    +
    +

    Used but undeclared dependencies

    +

    None


    +
    +

    Unused but declared dependencies

    + + + + + + + + + + + + + + + + + + + + + + + + +
    GroupIdArtifactIdVersionScopeClassifierTypeOptional
    org.hamcresthamcrest-core1.3testjarfalse
    com.google.code.findbugsannotations3.0.0providedjarfalse

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-cli/dependency-updates-report.html b/dependency-check-cli/dependency-updates-report.html index 37b672753..48e4dd6dc 100644 --- a/dependency-check-cli/dependency-updates-report.html +++ b/dependency-check-cli/dependency-updates-report.html @@ -1,21 +1,21 @@ - + - dependency-check-cli - Dependency Updates Report - + dependency-check-cli – Dependency Updates Report + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Overview

    +

    Overview

    This report summarizes newer versions that may be available for your project's various dependencies.

    - + @@ -253,17 +253,17 @@ - + - +
    # of dependencies using the latest version available22
    27
    # of dependencies where the next version available is smaller than an incremental version update
    # of dependencies where the next version available is an incremental version update5
    0
    # of dependencies where the next version available is a minor version update6
    5
    # of dependencies where the next version available is a major version update 0
    -

    Dependency Management

    +

    Dependency Management

    @@ -326,28 +326,28 @@ - + - + - + - + - + - + @@ -363,18 +363,6 @@ - - - - - - - - - - - - @@ -385,35 +373,47 @@ - - + + - + - + + + + + + + + + + + + + - - - - + + + + - + - - + + @@ -567,6 +567,18 @@ + + + + + + + + + + + + @@ -577,31 +589,31 @@ - - + + - + - - + + - - + + - + - - + + - + @@ -613,33 +625,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -649,7 +637,7 @@ - + @@ -662,9 +650,9 @@
    Status1.4.177
    com.sun.mail mailapi1.5.21.5.4 jar 1.5.3
    commons-cli commons-cli1.21.3.1 jar 1.3
    commons-langcommons-lang2.6jar
    junit junit 4.12
    org.apache.ant ant1.9.51.9.6 jar 1.9.6
    org.apache.antant-testutil1.9.6jar
    org.apache.antant-testutil1.9.5org.apache.commonscommons-compress1.10 jar 1.9.6
    org.apache.commonscommons-compress1.9commons-lang33.4 jar
    org.glassfishjavax.json1.0.4jar
    org.hamcrest hamcrest-core 1.3
    org.jmockit jmockit1.161.19 test jar 1.17-beta11.17
    org.jsoup jsoup1.7.21.8.3 jar 1.7.31.8.1
    org.slf4j slf4j-api
    org.slf4jslf4j-ext1.7.12jar
    org.slf4jslf4j-jdk141.7.12jar
    org.slf4j slf4j-simple 1.7.12
    Status Group Id Artifact IdNext Minor Next Major
    -

    Dependencies

    +

    Dependencies

    - + @@ -676,11 +664,23 @@ - + - + + + + + + + + + + + + + @@ -689,18 +689,6 @@ - - - - - - - - - - - - @@ -713,34 +701,34 @@
    Status Group Id Artifact IdNext Incremental Next Minor Next Major
    org.owasp dependency-check-core1.3.01.3.1compilejar
    org.owaspdependency-check-utils1.3.1 compile jar
    org.owaspdependency-check-utils1.3.0compilejar
    Status Group Id Artifact IdNext Minor Next Major
    -

    Dependency Updates

    +

    Dependency Updates

    -

    ch.qos.logback:logback-classic

    +

    ch.qos.logback:logback-classic

    - + - + - + - + - + - + - +
    Status  No newer versions available.
    Group Id ch.qos.logback
    Artifact Id logback-classic
    Current Version 1.1.3
    Scope
    Classifier
    Type jar
    -

    ch.qos.logback:logback-core

    +

    ch.qos.logback:logback-core

    @@ -764,7 +752,7 @@
    StatusType jar
    -

    com.google.code.findbugs:annotations

    +

    com.google.code.findbugs:annotations

    @@ -788,7 +776,7 @@
    StatusType jar
    -

    com.h2database:h2

    +

    com.h2database:h2

    @@ -813,13 +801,13 @@ -
    Statusjar
    Newer versions1.4.177 Next Minor
    1.4.178
    1.4.179
    1.4.180
    1.4.181
    1.4.182
    1.4.183
    1.4.184
    1.4.185
    1.4.186
    1.4.187 Latest Minor
    +1.4.177 Next Minor
    1.4.178
    1.4.179
    1.4.180
    1.4.181
    1.4.182
    1.4.183
    1.4.184
    1.4.185
    1.4.186
    1.4.187
    1.4.188
    1.4.189 Latest Minor
    -

    com.sun.mail:mailapi

    +

    com.sun.mail:mailapi

    - + @@ -828,7 +816,7 @@ - + @@ -837,16 +825,13 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id com.sun.mail
    mailapi
    Current Version1.5.2
    1.5.4
    Scope
    Typejar
    Newer versions1.5.3 Next Incremental
    1.5.4 Latest Incremental
    +jar
    -

    commons-cli:commons-cli

    +

    commons-cli:commons-cli

    - + @@ -855,7 +840,7 @@ - + @@ -864,12 +849,9 @@ - - - -
    Status There is at least one newer minor version available. Minor updates are sometimes passive.
     No newer versions available.
    Group Id commons-cli
    commons-cli
    Current Version1.2
    1.3.1
    Scope
    Typejar
    Newer versions1.3 Next Minor
    1.3.1 Latest Minor
    +jar
    -

    commons-io:commons-io

    +

    commons-io:commons-io

    @@ -893,31 +875,7 @@
    StatusType jar
    -

    commons-lang:commons-lang

    - - - - - - - - - - - - - - - - - - - - - -
    Status No newer versions available.
    Group Idcommons-lang
    Artifact Idcommons-lang
    Current Version2.6
    Scope
    Classifier
    Typejar
    -
    -

    junit:junit

    +

    junit:junit

    @@ -941,11 +899,11 @@
    StatusType jar
    -

    org.apache.ant:ant

    +

    org.apache.ant:ant

    - + @@ -954,7 +912,7 @@ - + @@ -963,16 +921,13 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.apache.ant
    ant
    Current Version1.9.5
    1.9.6
    Scope
    Typejar
    Newer versions1.9.6 Next Incremental
    +jar
    -

    org.apache.ant:ant-testutil

    +

    org.apache.ant:ant-testutil

    - + @@ -981,7 +936,7 @@ - + @@ -990,12 +945,9 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.apache.ant
    ant-testutil
    Current Version1.9.5
    1.9.6
    Scope
    Typejar
    Newer versions1.9.6 Next Incremental
    +jar
    -

    org.apache.commons:commons-compress

    +

    org.apache.commons:commons-compress

    @@ -1008,7 +960,7 @@ - + @@ -1019,7 +971,31 @@
    Statuscommons-compress
    Current Version1.9
    1.10
    Scope
    Type jar
    -

    org.apache.lucene:lucene-analyzers-common

    +

    org.apache.commons:commons-lang3

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.commons
    Artifact Idcommons-lang3
    Current Version3.4
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.lucene:lucene-analyzers-common

    @@ -1044,9 +1020,9 @@ -
    Statusjar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1 Latest Major
    +4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    -

    org.apache.lucene:lucene-core

    +

    org.apache.lucene:lucene-core

    @@ -1071,9 +1047,9 @@ -
    Statusjar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1 Latest Major
    +4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    -

    org.apache.lucene:lucene-queryparser

    +

    org.apache.lucene:lucene-queryparser

    @@ -1098,9 +1074,9 @@ -
    Statusjar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1 Latest Major
    +4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    -

    org.apache.lucene:lucene-test-framework

    +

    org.apache.lucene:lucene-test-framework

    @@ -1125,9 +1101,9 @@ -
    Statusjar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1 Latest Major
    +4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    -

    org.apache.maven:maven-core

    +

    org.apache.maven:maven-core

    @@ -1151,7 +1127,7 @@
    StatusType jar
    -

    org.apache.maven:maven-plugin-api

    +

    org.apache.maven:maven-plugin-api

    @@ -1175,7 +1151,7 @@
    StatusType jar
    -

    org.apache.maven:maven-settings

    +

    org.apache.maven:maven-settings

    @@ -1199,7 +1175,7 @@
    StatusType jar
    -

    org.apache.maven.plugin-testing:maven-plugin-testing-harness

    +

    org.apache.maven.plugin-testing:maven-plugin-testing-harness

    @@ -1223,7 +1199,7 @@
    StatusType jar
    -

    org.apache.maven.plugin-tools:maven-plugin-annotations

    +

    org.apache.maven.plugin-tools:maven-plugin-annotations

    @@ -1247,7 +1223,7 @@
    StatusType jar
    -

    org.apache.maven.plugins:maven-site-plugin

    +

    org.apache.maven.plugins:maven-site-plugin

    @@ -1271,7 +1247,7 @@
    StatusType jar
    -

    org.apache.maven.reporting:maven-reporting-api

    +

    org.apache.maven.reporting:maven-reporting-api

    @@ -1295,7 +1271,7 @@
    StatusType jar
    -

    org.apache.velocity:velocity

    +

    org.apache.velocity:velocity

    @@ -1319,7 +1295,31 @@
    StatusType jar
    -

    org.hamcrest:hamcrest-core

    +

    org.glassfish:javax.json

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.glassfish
    Artifact Idjavax.json
    Current Version1.0.4
    Scope
    Classifier
    Typejar
    +
    +

    org.hamcrest:hamcrest-core

    @@ -1343,11 +1343,11 @@
    StatusType jar
    -

    org.jmockit:jmockit

    +

    org.jmockit:jmockit

    - + @@ -1356,7 +1356,7 @@ - + @@ -1365,16 +1365,13 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.jmockit
    jmockit
    Current Version1.16
    1.19
    Scope test
    Typejar
    Newer versions1.17-beta1 Next Incremental
    1.17-beta2 Latest Incremental
    1.17 Next Minor
    +jar
    -

    org.jsoup:jsoup

    +

    org.jsoup:jsoup

    - + @@ -1383,7 +1380,7 @@ - + @@ -1392,12 +1389,9 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.jsoup
    jsoup
    Current Version1.7.2
    1.8.3
    Scope
    Typejar
    Newer versions1.7.3 Next Incremental
    1.8.1 Next Minor
    1.8.2 Latest Minor
    +jar
    -

    org.owasp:dependency-check-core

    +

    org.owasp:dependency-check-core

    @@ -1410,7 +1404,7 @@ - + @@ -1421,7 +1415,7 @@
    Statusdependency-check-core
    Current Version1.3.0
    1.3.1
    Scope compile
    Type jar
    -

    org.owasp:dependency-check-utils

    +

    org.owasp:dependency-check-utils

    @@ -1434,7 +1428,7 @@ - + @@ -1445,7 +1439,7 @@
    Statusdependency-check-utils
    Current Version1.3.0
    1.3.1
    Scope compile
    Type jar
    -

    org.slf4j:slf4j-api

    +

    org.slf4j:slf4j-api

    @@ -1469,55 +1463,7 @@
    StatusType jar
    -

    org.slf4j:slf4j-ext

    - - - - - - - - - - - - - - - - - - - - - -
    Status No newer versions available.
    Group Idorg.slf4j
    Artifact Idslf4j-ext
    Current Version1.7.12
    Scope
    Classifier
    Typejar
    -
    -

    org.slf4j:slf4j-jdk14

    - - - - - - - - - - - - - - - - - - - - - -
    Status No newer versions available.
    Group Idorg.slf4j
    Artifact Idslf4j-jdk14
    Current Version1.7.12
    Scope
    Classifier
    Typejar
    -
    -

    org.slf4j:slf4j-simple

    +

    org.slf4j:slf4j-simple

    @@ -1549,15 +1495,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-cli/findbugs.html b/dependency-check-cli/findbugs.html index 7f6913b82..16716e6a6 100644 --- a/dependency-check-cli/findbugs.html +++ b/dependency-check-cli/findbugs.html @@ -1,21 +1,21 @@ - + - dependency-check-cli - FindBugs Bug Detector Report - + dependency-check-cli – FindBugs Bug Detector Report + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    FindBugs Bug Detector Report

    -

    The following document contains the results of FindBugs Report

    -

    FindBugs Version is 2.0.2

    +

    FindBugs Bug Detector Report

    +

    The following document contains the results of FindBugs

    +

    FindBugs Version is 3.0.1

    Threshold is medium

    Effort is min

    -

    Summary

    +

    Summary

    Status
    @@ -258,7 +258,7 @@
    Classes0 0
    -

    Files

    +

    Files

    @@ -272,15 +272,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-cli/fonts/glyphicons-halflings-regular.eot b/dependency-check-cli/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..637452ea5404ac01670c10db5276e73114d16178 GIT binary patch literal 35283 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 literal 0 HcmV?d00001 diff --git a/dependency-check-cli/fonts/glyphicons-halflings-regular.svg b/dependency-check-cli/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 000000000..446948874 --- /dev/null +++ b/dependency-check-cli/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dependency-check-cli/fonts/glyphicons-halflings-regular.ttf b/dependency-check-cli/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..282401576351ef7d0eb7313e74a251694b6d78bc GIT binary patch literal 55016 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

    ;Iyg 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 DH|yT| literal 0 HcmV?d00001 diff --git a/dependency-check-cli/fonts/glyphicons-halflings-regular.woff b/dependency-check-cli/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..f824ac15a0ac59d8c236f346f3bd429542cdf8b9 GIT binary patch literal 41793 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 literal 33442 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 - + - dependency-check-cli - About - + dependency-check-cli – About + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@

  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +

    About

    OWASP dependency-check-cli is an command line tool that uses dependency-check-core to detect publicly disclosed vulnerabilities associated with the scanned project dependencies. The tool will generate a report listing the dependency, any identified Common Platform Enumeration (CPE) identifiers, and the associated Common Vulnerability and Exposure (CVE) entries.

    Installation & Usage

    -

    Download the dependency-check command line tool here. Extract the zip file to a location on your computer and put the ‘bin’ directory into the path environment variable. On *nix systems you will likely need to make the shell script executable:

    +

    Download the dependency-check command line tool here. Extract the zip file to a location on your computer and put the ‘bin’ directory into the path environment variable. On *nix systems you will likely need to make the shell script executable:

    -
    $ chmod +777 dependency-check.sh
    -
    -

    To scan a folder on the system you can run:

    -
    -
    -

    Windows

    - -
    -
    dependency-check.bat --app "My App Name" --scan "c:\java\application\lib"
    +
    $ chmod +777 dependency-check.sh
     
    -

    *nix

    +
    +

    Homebrew

    -
    dependency-check.sh --app "My App Name" --scan "/java/application/lib"
    -
    +
    $ brew install dependency-check
    +
    +

    This puts an executable dependency-check script in the /bin directory of your homebrew installation.

    +

    To scan a folder on the system you can run:

    +
    +

    Windows

    + +
    +
    dependency-check.bat --app "My App Name" --scan "c:\java\application\lib"
    +
    +
    +

    *nix

    + +
    +
    dependency-check.sh --app "My App Name" --scan "/java/application/lib"
    +

    To view the command line arguments, see the arguments page, or you can run:

    -

    Windows

    +

    Windows

    -
    dependency-check.bat --help
    -
    -
    -

    *nix

    - -
    -
    dependency-check.sh --help
    +
    dependency-check.bat --help
     
    +
    +

    *nix

    + +
    +
    dependency-check.sh --help
    +
    @@ -196,15 +203,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-cli/integration.html b/dependency-check-cli/integration.html new file mode 100644 index 000000000..f81f0fca1 --- /dev/null +++ b/dependency-check-cli/integration.html @@ -0,0 +1,236 @@ + + + + + + + + + dependency-check-cli – Continuous Integration + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +
    +

    Overview

    +

    This project uses Continuous Integration System.

    +
    +

    Access

    +

    The following is a link to the continuous integration system used by the project:

    +
    +
    +

    Notifiers

    +

    No notifiers are defined. Please check back at a later date.

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-cli/issue-tracking.html b/dependency-check-cli/issue-tracking.html index 0e6325db6..92d147fd3 100644 --- a/dependency-check-cli/issue-tracking.html +++ b/dependency-check-cli/issue-tracking.html @@ -1,21 +1,21 @@ - + - dependency-check-cli - Issue Tracking - + dependency-check-cli – Issue Tracking + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Overview

    +

    Overview

    This project uses github to manage its issues.

    -

    Issue Tracking

    +

    Issue Tracking

    Issues, bugs, and feature requests should be submitted to the following issue tracking system for this project.

    -
    +
    @@ -213,15 +219,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-cli/js/apache-maven-fluido-1.4.min.js b/dependency-check-cli/js/apache-maven-fluido-1.4.min.js new file mode 100644 index 000000000..0537c09d6 --- /dev/null +++ b/dependency-check-cli/js/apache-maven-fluido-1.4.min.js @@ -0,0 +1,25 @@ +/*! + * jQuery JavaScript Library v1.11.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-17T15:27Z + */ +(function(b,a){if(typeof module==="object"&&typeof module.exports==="object"){module.exports=b.document?a(b,true):function(c){if(!c.document){throw new Error("jQuery requires a window with a document")}return a(c)}}else{a(b)}}(typeof window!=="undefined"?window:this,function(a5,av){var aP=[];var P=aP.slice;var az=aP.concat;var x=aP.push;var bU=aP.indexOf;var ac={};var y=ac.toString;var K=ac.hasOwnProperty;var D={};var ai="1.11.2",bI=function(e,i){return new bI.fn.init(e,i)},E=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bS=/^-ms-/,aW=/-([\da-z])/gi,O=function(e,i){return i.toUpperCase()};bI.fn=bI.prototype={jquery:ai,constructor:bI,selector:"",length:0,toArray:function(){return P.call(this)},get:function(e){return e!=null?(e<0?this[e+this.length]:this[e]):P.call(this)},pushStack:function(e){var i=bI.merge(this.constructor(),e);i.prevObject=this;i.context=this.context;return i},each:function(i,e){return bI.each(this,i,e)},map:function(e){return this.pushStack(bI.map(this,function(b7,b6){return e.call(b7,b6,b7)}))},slice:function(){return this.pushStack(P.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(b7){var e=this.length,b6=+b7+(b7<0?e:0);return this.pushStack(b6>=0&&b6=0},isEmptyObject:function(i){var e;for(e in i){return false}return true},isPlainObject:function(b7){var i;if(!b7||bI.type(b7)!=="object"||b7.nodeType||bI.isWindow(b7)){return false}try{if(b7.constructor&&!K.call(b7,"constructor")&&!K.call(b7.constructor.prototype,"isPrototypeOf")){return false}}catch(b6){return false}if(D.ownLast){for(i in b7){return K.call(b7,i)}}for(i in b7){}return i===undefined||K.call(b7,i)},type:function(e){if(e==null){return e+""}return typeof e==="object"||typeof e==="function"?ac[y.call(e)]||"object":typeof e},globalEval:function(e){if(e&&bI.trim(e)){(a5.execScript||function(i){a5["eval"].call(a5,i)})(e)}},camelCase:function(e){return e.replace(bS,"ms-").replace(aW,O)},nodeName:function(i,e){return i.nodeName&&i.nodeName.toLowerCase()===e.toLowerCase()},each:function(ca,cb,b6){var b9,b7=0,b8=ca.length,e=ad(ca);if(b6){if(e){for(;b70&&(i-1) in b6}var m= +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function(de){var cy,dh,cn,cH,cK,ci,cW,dg,dm,cI,cX,cZ,cC,co,c8,c3,df,ce,cF,da="sizzle"+1*new Date(),cJ=de.document,di=0,c4=0,b9=cA(),c9=cA(),cG=cA(),cE=function(i,e){if(i===e){cX=true}return 0},cQ=1<<31,cO=({}).hasOwnProperty,dc=[],dd=dc.pop,cM=dc.push,b7=dc.push,cm=dc.slice,cd=function(dq,dp){var dn=0,e=dq.length;for(;dn+~]|"+cp+")"+cp+"*"),ct=new RegExp("="+cp+"*([^\\]'\"]*?)"+cp+"*\\]","g"),cS=new RegExp(ck),cU=new RegExp("^"+cL+"$"),c2={ID:new RegExp("^#("+b6+")"),CLASS:new RegExp("^\\.("+b6+")"),TAG:new RegExp("^("+b6.replace("w","w*")+")"),ATTR:new RegExp("^"+c6),PSEUDO:new RegExp("^"+ck),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+cp+"*(even|odd|(([+-]|)(\\d*)n|)"+cp+"*(?:([+-]|)"+cp+"*(\\d+)|))"+cp+"*\\)|)","i"),bool:new RegExp("^(?:"+b8+")$","i"),needsContext:new RegExp("^"+cp+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+cp+"*((?:-\\d)?\\d*)"+cp+"*\\)|)(?=[^-]|$)","i")},cc=/^(?:input|select|textarea|button)$/i,cl=/^h\d$/i,cP=/^[^{]+\{\s*\[native \w/,cR=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,c1=/[+~]/,cN=/'|\\/g,cs=new RegExp("\\\\([\\da-f]{1,6}"+cp+"?|("+cp+")|.)","ig"),c5=function(e,dp,i){var dn="0x"+dp-65536;return dn!==dn||i?dp:dn<0?String.fromCharCode(dn+65536):String.fromCharCode(dn>>10|55296,dn&1023|56320)},dl=function(){cZ()};try{b7.apply((dc=cm.call(cJ.childNodes)),cJ.childNodes);dc[cJ.childNodes.length].nodeType}catch(cD){b7={apply:dc.length?function(i,e){cM.apply(i,cm.call(e))}:function(dq,dp){var e=dq.length,dn=0;while((dq[e++]=dp[dn++])){}dq.length=e-1}}}function cw(dv,dn,dz,dB){var dA,ds,dt,dx,dy,dr,dq,e,dp,dw;if((dn?dn.ownerDocument||dn:cJ)!==cC){cZ(dn)}dn=dn||cC;dz=dz||[];dx=dn.nodeType;if(typeof dv!=="string"||!dv||dx!==1&&dx!==9&&dx!==11){return dz}if(!dB&&c8){if(dx!==11&&(dA=cR.exec(dv))){if((dt=dA[1])){if(dx===9){ds=dn.getElementById(dt);if(ds&&ds.parentNode){if(ds.id===dt){dz.push(ds);return dz}}else{return dz}}else{if(dn.ownerDocument&&(ds=dn.ownerDocument.getElementById(dt))&&cF(dn,ds)&&ds.id===dt){dz.push(ds);return dz}}}else{if(dA[2]){b7.apply(dz,dn.getElementsByTagName(dv));return dz}else{if((dt=dA[3])&&dh.getElementsByClassName){b7.apply(dz,dn.getElementsByClassName(dt));return dz}}}}if(dh.qsa&&(!c3||!c3.test(dv))){e=dq=da;dp=dn;dw=dx!==1&&dv;if(dx===1&&dn.nodeName.toLowerCase()!=="object"){dr=ci(dv);if((dq=dn.getAttribute("id"))){e=dq.replace(cN,"\\$&")}else{dn.setAttribute("id",e)}e="[id='"+e+"'] ";dy=dr.length;while(dy--){dr[dy]=e+ch(dr[dy])}dp=c1.test(dv)&&cT(dn.parentNode)||dn;dw=dr.join(",")}if(dw){try{b7.apply(dz,dp.querySelectorAll(dw));return dz}catch(du){}finally{if(!dq){dn.removeAttribute("id")}}}}}return dg(dv.replace(cr,"$1"),dn,dz,dB)}function cA(){var i=[];function e(dn,dp){if(i.push(dn+" ")>cn.cacheLength){delete e[i.shift()]}return(e[dn+" "]=dp)}return e}function cj(e){e[da]=true;return e}function cf(i){var dp=cC.createElement("div");try{return !!i(dp)}catch(dn){return false}finally{if(dp.parentNode){dp.parentNode.removeChild(dp)}dp=null}}function dj(dn,dq){var e=dn.split("|"),dp=dn.length;while(dp--){cn.attrHandle[e[dp]]=dq}}function ca(i,e){var dp=e&&i,dn=dp&&i.nodeType===1&&e.nodeType===1&&(~e.sourceIndex||cQ)-(~i.sourceIndex||cQ);if(dn){return dn}if(dp){while((dp=dp.nextSibling)){if(dp===e){return -1}}}return i?1:-1}function cx(e){return function(dn){var i=dn.nodeName.toLowerCase();return i==="input"&&dn.type===e}}function cb(e){return function(dn){var i=dn.nodeName.toLowerCase();return(i==="input"||i==="button")&&dn.type===e}}function c7(e){return cj(function(i){i=+i;return cj(function(dn,ds){var dq,dp=e([],dn.length,i),dr=dp.length;while(dr--){if(dn[(dq=dp[dr])]){dn[dq]=!(ds[dq]=dn[dq])}}})})}function cT(e){return e&&typeof e.getElementsByTagName!=="undefined"&&e}dh=cw.support={};cK=cw.isXML=function(e){var i=e&&(e.ownerDocument||e).documentElement;return i?i.nodeName!=="HTML":false};cZ=cw.setDocument=function(dn){var e,i,dp=dn?dn.ownerDocument||dn:cJ;if(dp===cC||dp.nodeType!==9||!dp.documentElement){return cC}cC=dp;co=dp.documentElement;i=dp.defaultView;if(i&&i!==i.top){if(i.addEventListener){i.addEventListener("unload",dl,false)}else{if(i.attachEvent){i.attachEvent("onunload",dl)}}}c8=!cK(dp);dh.attributes=cf(function(dq){dq.className="i";return !dq.getAttribute("className")});dh.getElementsByTagName=cf(function(dq){dq.appendChild(dp.createComment(""));return !dq.getElementsByTagName("*").length});dh.getElementsByClassName=cP.test(dp.getElementsByClassName);dh.getById=cf(function(dq){co.appendChild(dq).id=da;return !dp.getElementsByName||!dp.getElementsByName(da).length});if(dh.getById){cn.find.ID=function(ds,dr){if(typeof dr.getElementById!=="undefined"&&c8){var dq=dr.getElementById(ds);return dq&&dq.parentNode?[dq]:[]}};cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(ds){return ds.getAttribute("id")===dq}}}else{delete cn.find.ID;cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(dt){var ds=typeof dt.getAttributeNode!=="undefined"&&dt.getAttributeNode("id");return ds&&ds.value===dq}}}cn.find.TAG=dh.getElementsByTagName?function(dq,dr){if(typeof dr.getElementsByTagName!=="undefined"){return dr.getElementsByTagName(dq)}else{if(dh.qsa){return dr.querySelectorAll(dq)}}}:function(dq,du){var dv,dt=[],ds=0,dr=du.getElementsByTagName(dq);if(dq==="*"){while((dv=dr[ds++])){if(dv.nodeType===1){dt.push(dv)}}return dt}return dr};cn.find.CLASS=dh.getElementsByClassName&&function(dr,dq){if(c8){return dq.getElementsByClassName(dr)}};df=[];c3=[];if((dh.qsa=cP.test(dp.querySelectorAll))){cf(function(dq){co.appendChild(dq).innerHTML="";if(dq.querySelectorAll("[msallowcapture^='']").length){c3.push("[*^$]="+cp+"*(?:''|\"\")")}if(!dq.querySelectorAll("[selected]").length){c3.push("\\["+cp+"*(?:value|"+b8+")")}if(!dq.querySelectorAll("[id~="+da+"-]").length){c3.push("~=")}if(!dq.querySelectorAll(":checked").length){c3.push(":checked")}if(!dq.querySelectorAll("a#"+da+"+*").length){c3.push(".#.+[+~]")}});cf(function(dr){var dq=dp.createElement("input");dq.setAttribute("type","hidden");dr.appendChild(dq).setAttribute("name","D");if(dr.querySelectorAll("[name=d]").length){c3.push("name"+cp+"*[*^$|!~]?=")}if(!dr.querySelectorAll(":enabled").length){c3.push(":enabled",":disabled")}dr.querySelectorAll("*,:x");c3.push(",.*:")})}if((dh.matchesSelector=cP.test((ce=co.matches||co.webkitMatchesSelector||co.mozMatchesSelector||co.oMatchesSelector||co.msMatchesSelector)))){cf(function(dq){dh.disconnectedMatch=ce.call(dq,"div");ce.call(dq,"[s!='']:x");df.push("!=",ck)})}c3=c3.length&&new RegExp(c3.join("|"));df=df.length&&new RegExp(df.join("|"));e=cP.test(co.compareDocumentPosition);cF=e||cP.test(co.contains)?function(dr,dq){var dt=dr.nodeType===9?dr.documentElement:dr,ds=dq&&dq.parentNode;return dr===ds||!!(ds&&ds.nodeType===1&&(dt.contains?dt.contains(ds):dr.compareDocumentPosition&&dr.compareDocumentPosition(ds)&16))}:function(dr,dq){if(dq){while((dq=dq.parentNode)){if(dq===dr){return true}}}return false};cE=e?function(dr,dq){if(dr===dq){cX=true;return 0}var ds=!dr.compareDocumentPosition-!dq.compareDocumentPosition;if(ds){return ds}ds=(dr.ownerDocument||dr)===(dq.ownerDocument||dq)?dr.compareDocumentPosition(dq):1;if(ds&1||(!dh.sortDetached&&dq.compareDocumentPosition(dr)===ds)){if(dr===dp||dr.ownerDocument===cJ&&cF(cJ,dr)){return -1}if(dq===dp||dq.ownerDocument===cJ&&cF(cJ,dq)){return 1}return cI?(cd(cI,dr)-cd(cI,dq)):0}return ds&4?-1:1}:function(dr,dq){if(dr===dq){cX=true;return 0}var dx,du=0,dw=dr.parentNode,dt=dq.parentNode,ds=[dr],dv=[dq];if(!dw||!dt){return dr===dp?-1:dq===dp?1:dw?-1:dt?1:cI?(cd(cI,dr)-cd(cI,dq)):0}else{if(dw===dt){return ca(dr,dq)}}dx=dr;while((dx=dx.parentNode)){ds.unshift(dx)}dx=dq;while((dx=dx.parentNode)){dv.unshift(dx)}while(ds[du]===dv[du]){du++}return du?ca(ds[du],dv[du]):ds[du]===cJ?-1:dv[du]===cJ?1:0};return dp};cw.matches=function(i,e){return cw(i,null,null,e)};cw.matchesSelector=function(dn,dq){if((dn.ownerDocument||dn)!==cC){cZ(dn)}dq=dq.replace(ct,"='$1']");if(dh.matchesSelector&&c8&&(!df||!df.test(dq))&&(!c3||!c3.test(dq))){try{var i=ce.call(dn,dq);if(i||dh.disconnectedMatch||dn.document&&dn.document.nodeType!==11){return i}}catch(dp){}}return cw(dq,cC,null,[dn]).length>0};cw.contains=function(e,i){if((e.ownerDocument||e)!==cC){cZ(e)}return cF(e,i)};cw.attr=function(dn,e){if((dn.ownerDocument||dn)!==cC){cZ(dn)}var i=cn.attrHandle[e.toLowerCase()],dp=i&&cO.call(cn.attrHandle,e.toLowerCase())?i(dn,e,!c8):undefined;return dp!==undefined?dp:dh.attributes||!c8?dn.getAttribute(e):(dp=dn.getAttributeNode(e))&&dp.specified?dp.value:null};cw.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};cw.uniqueSort=function(dp){var dq,dr=[],e=0,dn=0;cX=!dh.detectDuplicates;cI=!dh.sortStable&&dp.slice(0);dp.sort(cE);if(cX){while((dq=dp[dn++])){if(dq===dp[dn]){e=dr.push(dn)}}while(e--){dp.splice(dr[e],1)}}cI=null;return dp};cH=cw.getText=function(dr){var dq,dn="",dp=0,e=dr.nodeType;if(!e){while((dq=dr[dp++])){dn+=cH(dq)}}else{if(e===1||e===9||e===11){if(typeof dr.textContent==="string"){return dr.textContent}else{for(dr=dr.firstChild;dr;dr=dr.nextSibling){dn+=cH(dr)}}}else{if(e===3||e===4){return dr.nodeValue}}}return dn};cn=cw.selectors={cacheLength:50,createPseudo:cj,match:c2,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){e[1]=e[1].replace(cs,c5);e[3]=(e[3]||e[4]||e[5]||"").replace(cs,c5);if(e[2]==="~="){e[3]=" "+e[3]+" "}return e.slice(0,4)},CHILD:function(e){e[1]=e[1].toLowerCase();if(e[1].slice(0,3)==="nth"){if(!e[3]){cw.error(e[0])}e[4]=+(e[4]?e[5]+(e[6]||1):2*(e[3]==="even"||e[3]==="odd"));e[5]=+((e[7]+e[8])||e[3]==="odd")}else{if(e[3]){cw.error(e[0])}}return e},PSEUDO:function(i){var e,dn=!i[6]&&i[2];if(c2.CHILD.test(i[0])){return null}if(i[3]){i[2]=i[4]||i[5]||""}else{if(dn&&cS.test(dn)&&(e=ci(dn,true))&&(e=dn.indexOf(")",dn.length-e)-dn.length)){i[0]=i[0].slice(0,e);i[2]=dn.slice(0,e)}}return i.slice(0,3)}},filter:{TAG:function(i){var e=i.replace(cs,c5).toLowerCase();return i==="*"?function(){return true}:function(dn){return dn.nodeName&&dn.nodeName.toLowerCase()===e}},CLASS:function(e){var i=b9[e+" "];return i||(i=new RegExp("(^|"+cp+")"+e+"("+cp+"|$)"))&&b9(e,function(dn){return i.test(typeof dn.className==="string"&&dn.className||typeof dn.getAttribute!=="undefined"&&dn.getAttribute("class")||"")})},ATTR:function(dn,i,e){return function(dq){var dp=cw.attr(dq,dn);if(dp==null){return i==="!="}if(!i){return true}dp+="";return i==="="?dp===e:i==="!="?dp!==e:i==="^="?e&&dp.indexOf(e)===0:i==="*="?e&&dp.indexOf(e)>-1:i==="$="?e&&dp.slice(-e.length)===e:i==="~="?(" "+dp.replace(cu," ")+" ").indexOf(e)>-1:i==="|="?dp===e||dp.slice(0,e.length+1)===e+"-":false}},CHILD:function(i,dq,dp,dr,dn){var dt=i.slice(0,3)!=="nth",e=i.slice(-4)!=="last",ds=dq==="of-type";return dr===1&&dn===0?function(du){return !!du.parentNode}:function(dA,dy,dD){var du,dG,dB,dF,dC,dx,dz=dt!==e?"nextSibling":"previousSibling",dE=dA.parentNode,dw=ds&&dA.nodeName.toLowerCase(),dv=!dD&&!ds;if(dE){if(dt){while(dz){dB=dA;while((dB=dB[dz])){if(ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1){return false}}dx=dz=i==="only"&&!dx&&"nextSibling"}return true}dx=[e?dE.firstChild:dE.lastChild];if(e&&dv){dG=dE[da]||(dE[da]={});du=dG[i]||[];dC=du[0]===di&&du[1];dF=du[0]===di&&du[2];dB=dC&&dE.childNodes[dC];while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if(dB.nodeType===1&&++dF&&dB===dA){dG[i]=[di,dC,dF];break}}}else{if(dv&&(du=(dA[da]||(dA[da]={}))[i])&&du[0]===di){dF=du[1]}else{while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if((ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1)&&++dF){if(dv){(dB[da]||(dB[da]={}))[i]=[di,dF]}if(dB===dA){break}}}}}dF-=dn;return dF===dr||(dF%dr===0&&dF/dr>=0)}}},PSEUDO:function(dp,dn){var e,i=cn.pseudos[dp]||cn.setFilters[dp.toLowerCase()]||cw.error("unsupported pseudo: "+dp);if(i[da]){return i(dn)}if(i.length>1){e=[dp,dp,"",dn];return cn.setFilters.hasOwnProperty(dp.toLowerCase())?cj(function(ds,du){var dr,dq=i(ds,dn),dt=dq.length;while(dt--){dr=cd(ds,dq[dt]);ds[dr]=!(du[dr]=dq[dt])}}):function(dq){return i(dq,0,e)}}return i}},pseudos:{not:cj(function(e){var i=[],dn=[],dp=cW(e.replace(cr,"$1"));return dp[da]?cj(function(dr,dw,du,ds){var dv,dq=dp(dr,null,ds,[]),dt=dr.length;while(dt--){if((dv=dq[dt])){dr[dt]=!(dw[dt]=dv)}}}):function(ds,dr,dq){i[0]=ds;dp(i,null,dq,dn);i[0]=null;return !dn.pop()}}),has:cj(function(e){return function(i){return cw(e,i).length>0}}),contains:cj(function(e){e=e.replace(cs,c5);return function(i){return(i.textContent||i.innerText||cH(i)).indexOf(e)>-1}}),lang:cj(function(e){if(!cU.test(e||"")){cw.error("unsupported lang: "+e)}e=e.replace(cs,c5).toLowerCase();return function(dn){var i;do{if((i=c8?dn.lang:dn.getAttribute("xml:lang")||dn.getAttribute("lang"))){i=i.toLowerCase();return i===e||i.indexOf(e+"-")===0}}while((dn=dn.parentNode)&&dn.nodeType===1);return false}}),target:function(e){var i=de.location&&de.location.hash;return i&&i.slice(1)===e.id},root:function(e){return e===co},focus:function(e){return e===cC.activeElement&&(!cC.hasFocus||cC.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===false},disabled:function(e){return e.disabled===true},checked:function(e){var i=e.nodeName.toLowerCase();return(i==="input"&&!!e.checked)||(i==="option"&&!!e.selected)},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling){if(e.nodeType<6){return false}}return true},parent:function(e){return !cn.pseudos.empty(e)},header:function(e){return cl.test(e.nodeName)},input:function(e){return cc.test(e.nodeName)},button:function(i){var e=i.nodeName.toLowerCase();return e==="input"&&i.type==="button"||e==="button"},text:function(i){var e;return i.nodeName.toLowerCase()==="input"&&i.type==="text"&&((e=i.getAttribute("type"))==null||e.toLowerCase()==="text")},first:c7(function(){return[0]}),last:c7(function(e,i){return[i-1]}),eq:c7(function(e,dn,i){return[i<0?i+dn:i]}),even:c7(function(e,dp){var dn=0;for(;dn=0;){e.push(dn)}return e}),gt:c7(function(e,dq,dp){var dn=dp<0?dp+dq:dp;for(;++dn1?function(dr,dq,dn){var dp=e.length;while(dp--){if(!e[dp](dr,dq,dn)){return false}}return true}:e[0]}function cz(dn,dr,dq){var dp=0,e=dr.length;for(;dp-1){dC[dE]=!(dz[dE]=dw)}}}}else{dy=c0(dy===dz?dy.splice(dt,dy.length):dy);if(dr){dr(null,dz,dy,dB)}else{b7.apply(dz,dy)}}})}function db(dt){var dn,dr,dp,ds=dt.length,dw=cn.relative[dt[0].type],dx=dw||cn.relative[" "],dq=dw?1:0,du=cq(function(i){return i===dn},dx,true),dv=cq(function(i){return cd(dn,i)>-1},dx,true),e=[function(dA,dz,dy){var i=(!dw&&(dy||dz!==dm))||((dn=dz).nodeType?du(dA,dz,dy):dv(dA,dz,dy));dn=null;return i}];for(;dq1&&dk(e),dq>1&&ch(dt.slice(0,dq-1).concat({value:dt[dq-2].type===" "?"*":""})).replace(cr,"$1"),dr,dq0,dq=dp.length>0,i=function(dA,du,dz,dy,dD){var dv,dw,dB,dF=0,dx="0",dr=dA&&[],dG=[],dE=dm,dt=dA||dq&&cn.find.TAG("*",dD),ds=(di+=dE==null?1:Math.random()||0.1),dC=dt.length;if(dD){dm=du!==cC&&du}for(;dx!==dC&&(dv=dt[dx])!=null;dx++){if(dq&&dv){dw=0;while((dB=dp[dw++])){if(dB(dv,du,dz)){dy.push(dv);break}}if(dD){di=ds}}if(e){if((dv=!dB&&dv)){dF--}if(dA){dr.push(dv)}}}dF+=dx;if(e&&dx!==dF){dw=0;while((dB=dn[dw++])){dB(dr,dG,du,dz)}if(dA){if(dF>0){while(dx--){if(!(dr[dx]||dG[dx])){dG[dx]=dd.call(dy)}}}dG=c0(dG)}b7.apply(dy,dG);if(dD&&!dA&&dG.length>0&&(dF+dn.length)>1){cw.uniqueSort(dy)}}if(dD){di=ds;dm=dE}return dr};return e?cj(i):i}cW=cw.compile=function(e,dp){var dq,dn=[],ds=[],dr=cG[e+" "];if(!dr){if(!dp){dp=ci(e)}dq=dp.length;while(dq--){dr=db(dp[dq]);if(dr[da]){dn.push(dr)}else{ds.push(dr)}}dr=cG(e,cY(ds,dn));dr.selector=e}return dr};dg=cw.select=function(dp,e,dq,dt){var dr,dw,dn,dx,du,dv=typeof dp==="function"&&dp,ds=!dt&&ci((dp=dv.selector||dp));dq=dq||[];if(ds.length===1){dw=ds[0]=ds[0].slice(0);if(dw.length>2&&(dn=dw[0]).type==="ID"&&dh.getById&&e.nodeType===9&&c8&&cn.relative[dw[1].type]){e=(cn.find.ID(dn.matches[0].replace(cs,c5),e)||[])[0];if(!e){return dq}else{if(dv){e=e.parentNode}}dp=dp.slice(dw.shift().value.length)}dr=c2.needsContext.test(dp)?0:dw.length;while(dr--){dn=dw[dr];if(cn.relative[(dx=dn.type)]){break}if((du=cn.find[dx])){if((dt=du(dn.matches[0].replace(cs,c5),c1.test(dw[0].type)&&cT(e.parentNode)||e))){dw.splice(dr,1);dp=dt.length&&ch(dw);if(!dp){b7.apply(dq,dt);return dq}break}}}}(dv||cW(dp,ds))(dt,e,!c8,dq,c1.test(dp)&&cT(e.parentNode)||e);return dq};dh.sortStable=da.split("").sort(cE).join("")===da;dh.detectDuplicates=!!cX;cZ();dh.sortDetached=cf(function(e){return e.compareDocumentPosition(cC.createElement("div"))&1});if(!cf(function(e){e.innerHTML="";return e.firstChild.getAttribute("href")==="#"})){dj("type|href|height|width",function(i,e,dn){if(!dn){return i.getAttribute(e,e.toLowerCase()==="type"?1:2)}})}if(!dh.attributes||!cf(function(e){e.innerHTML="";e.firstChild.setAttribute("value","");return e.firstChild.getAttribute("value")===""})){dj("value",function(i,e,dn){if(!dn&&i.nodeName.toLowerCase()==="input"){return i.defaultValue}})}if(!cf(function(e){return e.getAttribute("disabled")==null})){dj(b8,function(i,e,dp){var dn;if(!dp){return i[e]===true?e.toLowerCase():(dn=i.getAttributeNode(e))&&dn.specified?dn.value:null}})}return cw})(a5);bI.find=m;bI.expr=m.selectors;bI.expr[":"]=bI.expr.pseudos;bI.unique=m.uniqueSort;bI.text=m.getText;bI.isXMLDoc=m.isXML;bI.contains=m.contains;var A=bI.expr.match.needsContext;var a=(/^<(\w+)\s*\/?>(?:<\/\1>|)$/);var aL=/^.[^:#\[\.,]*$/;function aR(b6,e,i){if(bI.isFunction(e)){return bI.grep(b6,function(b8,b7){return !!e.call(b8,b7,b8)!==i})}if(e.nodeType){return bI.grep(b6,function(b7){return(b7===e)!==i})}if(typeof e==="string"){if(aL.test(e)){return bI.filter(e,b6,i)}e=bI.filter(e,b6)}return bI.grep(b6,function(b7){return(bI.inArray(b7,e)>=0)!==i})}bI.filter=function(b7,e,b6){var i=e[0];if(b6){b7=":not("+b7+")"}return e.length===1&&i.nodeType===1?bI.find.matchesSelector(i,b7)?[i]:[]:bI.find.matches(b7,bI.grep(e,function(b8){return b8.nodeType===1}))};bI.fn.extend({find:function(b6){var b9,b8=[],b7=this,e=b7.length;if(typeof b6!=="string"){return this.pushStack(bI(b6).filter(function(){for(b9=0;b91?bI.unique(b8):b8);b8.selector=this.selector?this.selector+" "+b6:b6;return b8},filter:function(e){return this.pushStack(aR(this,e||[],false))},not:function(e){return this.pushStack(aR(this,e||[],true))},is:function(e){return !!aR(this,typeof e==="string"&&A.test(e)?bI(e):e||[],false).length}});var z,n=a5.document,bt=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,bV=bI.fn.init=function(e,b6){var i,b7;if(!e){return this}if(typeof e==="string"){if(e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3){i=[null,e,null]}else{i=bt.exec(e)}if(i&&(i[1]||!b6)){if(i[1]){b6=b6 instanceof bI?b6[0]:b6;bI.merge(this,bI.parseHTML(i[1],b6&&b6.nodeType?b6.ownerDocument||b6:n,true));if(a.test(i[1])&&bI.isPlainObject(b6)){for(i in b6){if(bI.isFunction(this[i])){this[i](b6[i])}else{this.attr(i,b6[i])}}}return this}else{b7=n.getElementById(i[2]);if(b7&&b7.parentNode){if(b7.id!==i[2]){return z.find(e)}this.length=1;this[0]=b7}this.context=n;this.selector=e;return this}}else{if(!b6||b6.jquery){return(b6||z).find(e)}else{return this.constructor(b6).find(e)}}}else{if(e.nodeType){this.context=this[0]=e;this.length=1;return this}else{if(bI.isFunction(e)){return typeof z.ready!=="undefined"?z.ready(e):e(bI)}}}if(e.selector!==undefined){this.selector=e.selector;this.context=e.context}return bI.makeArray(e,this)};bV.prototype=bI.fn;z=bI(n);var bv=/^(?:parents|prev(?:Until|All))/,bz={children:true,contents:true,next:true,prev:true};bI.extend({dir:function(b6,i,b8){var e=[],b7=b6[i];while(b7&&b7.nodeType!==9&&(b8===undefined||b7.nodeType!==1||!bI(b7).is(b8))){if(b7.nodeType===1){e.push(b7)}b7=b7[i]}return e},sibling:function(b6,i){var e=[];for(;b6;b6=b6.nextSibling){if(b6.nodeType===1&&b6!==i){e.push(b6)}}return e}});bI.fn.extend({has:function(b8){var b7,b6=bI(b8,this),e=b6.length;return this.filter(function(){for(b7=0;b7-1:ca.nodeType===1&&bI.find.matchesSelector(ca,b9))){e.push(ca);break}}}return this.pushStack(e.length>1?bI.unique(e):e)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.first().prevAll().length:-1}if(typeof e==="string"){return bI.inArray(this[0],bI(e))}return bI.inArray(e.jquery?e[0]:e,this)},add:function(e,i){return this.pushStack(bI.unique(bI.merge(this.get(),bI(e,i))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}});function aY(i,e){do{i=i[e]}while(i&&i.nodeType!==1);return i}bI.each({parent:function(i){var e=i.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return bI.dir(e,"parentNode")},parentsUntil:function(b6,e,b7){return bI.dir(b6,"parentNode",b7)},next:function(e){return aY(e,"nextSibling")},prev:function(e){return aY(e,"previousSibling")},nextAll:function(e){return bI.dir(e,"nextSibling")},prevAll:function(e){return bI.dir(e,"previousSibling")},nextUntil:function(b6,e,b7){return bI.dir(b6,"nextSibling",b7)},prevUntil:function(b6,e,b7){return bI.dir(b6,"previousSibling",b7)},siblings:function(e){return bI.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return bI.sibling(e.firstChild)},contents:function(e){return bI.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:bI.merge([],e.childNodes)}},function(e,i){bI.fn[e]=function(b8,b6){var b7=bI.map(this,i,b8);if(e.slice(-5)!=="Until"){b6=b8}if(b6&&typeof b6==="string"){b7=bI.filter(b6,b7)}if(this.length>1){if(!bz[e]){b7=bI.unique(b7)}if(bv.test(e)){b7=b7.reverse()}}return this.pushStack(b7)}});var aF=(/\S+/g);var b2={};function af(i){var e=b2[i]={};bI.each(i.match(aF)||[],function(b7,b6){e[b6]=true});return e}bI.Callbacks=function(ce){ce=typeof ce==="string"?(b2[ce]||af(ce)):bI.extend({},ce);var b8,b7,e,b9,ca,b6,cb=[],cc=!ce.once&&[],i=function(cf){b7=ce.memory&&cf;e=true;ca=b6||0;b6=0;b9=cb.length;b8=true;for(;cb&&ca-1){cb.splice(cg,1);if(b8){if(cg<=b9){b9--}if(cg<=ca){ca--}}}})}return this},has:function(cf){return cf?bI.inArray(cf,cb)>-1:!!(cb&&cb.length)},empty:function(){cb=[];b9=0;return this},disable:function(){cb=cc=b7=undefined;return this},disabled:function(){return !cb},lock:function(){cc=undefined;if(!b7){cd.disable()}return this},locked:function(){return !cc},fireWith:function(cg,cf){if(cb&&(!e||cc)){cf=cf||[];cf=[cg,cf.slice?cf.slice():cf];if(b8){cc.push(cf)}else{i(cf)}}return this},fire:function(){cd.fireWith(this,arguments);return this},fired:function(){return !!e}};return cd};bI.extend({Deferred:function(b6){var i=[["resolve","done",bI.Callbacks("once memory"),"resolved"],["reject","fail",bI.Callbacks("once memory"),"rejected"],["notify","progress",bI.Callbacks("memory")]],b7="pending",b8={state:function(){return b7},always:function(){e.done(arguments).fail(arguments);return this},then:function(){var b9=arguments;return bI.Deferred(function(ca){bI.each(i,function(cc,cb){var cd=bI.isFunction(b9[cc])&&b9[cc];e[cb[1]](function(){var ce=cd&&cd.apply(this,arguments);if(ce&&bI.isFunction(ce.promise)){ce.promise().done(ca.resolve).fail(ca.reject).progress(ca.notify)}else{ca[cb[0]+"With"](this===b8?ca.promise():this,cd?[ce]:arguments)}})});b9=null}).promise()},promise:function(b9){return b9!=null?bI.extend(b9,b8):b8}},e={};b8.pipe=b8.then;bI.each(i,function(ca,b9){var cc=b9[2],cb=b9[3];b8[b9[1]]=cc.add;if(cb){cc.add(function(){b7=cb},i[ca^1][2].disable,i[2][2].lock)}e[b9[0]]=function(){e[b9[0]+"With"](this===e?b8:this,arguments);return this};e[b9[0]+"With"]=cc.fireWith});b8.promise(e);if(b6){b6.call(e,e)}return e},when:function(b9){var b7=0,cb=P.call(arguments),e=cb.length,b6=e!==1||(b9&&bI.isFunction(b9.promise))?e:0,ce=b6===1?b9:bI.Deferred(),b8=function(cg,ch,cf){return function(i){ch[cg]=this;cf[cg]=arguments.length>1?P.call(arguments):i;if(cf===cd){ce.notifyWith(ch,cf)}else{if(!(--b6)){ce.resolveWith(ch,cf)}}}},cd,ca,cc;if(e>1){cd=new Array(e);ca=new Array(e);cc=new Array(e);for(;b70){return}ak.resolveWith(n,[bI]);if(bI.fn.triggerHandler){bI(n).triggerHandler("ready");bI(n).off("ready")}}});function bm(){if(n.addEventListener){n.removeEventListener("DOMContentLoaded",bZ,false);a5.removeEventListener("load",bZ,false)}else{n.detachEvent("onreadystatechange",bZ);a5.detachEvent("onload",bZ)}}function bZ(){if(n.addEventListener||event.type==="load"||n.readyState==="complete"){bm();bI.ready()}}bI.ready.promise=function(b8){if(!ak){ak=bI.Deferred();if(n.readyState==="complete"){setTimeout(bI.ready)}else{if(n.addEventListener){n.addEventListener("DOMContentLoaded",bZ,false);a5.addEventListener("load",bZ,false)}else{n.attachEvent("onreadystatechange",bZ);a5.attachEvent("onload",bZ);var b7=false;try{b7=a5.frameElement==null&&n.documentElement}catch(b6){}if(b7&&b7.doScroll){(function i(){if(!bI.isReady){try{b7.doScroll("left")}catch(b9){return setTimeout(i,50)}bm();bI.ready()}})()}}}}return ak.promise(b8)};var aC=typeof undefined;var bh;for(bh in bI(D)){break}D.ownLast=bh!=="0";D.inlineBlockNeedsLayout=false;bI(function(){var b6,b7,e,i;e=n.getElementsByTagName("body")[0];if(!e||!e.style){return}b7=n.createElement("div");i=n.createElement("div");i.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";e.appendChild(i).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";D.inlineBlockNeedsLayout=b6=b7.offsetWidth===3;if(b6){e.style.zoom=1}}e.removeChild(i)});(function(){var b6=n.createElement("div");if(D.deleteExpando==null){D.deleteExpando=true;try{delete b6.test}catch(i){D.deleteExpando=false}}b6=null})();bI.acceptData=function(b6){var i=bI.noData[(b6.nodeName+" ").toLowerCase()],e=+b6.nodeType||1;return e!==1&&e!==9?false:!i||i!==true&&b6.getAttribute("classid")===i};var by=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,aQ=/([A-Z])/g;function bA(b7,b6,b8){if(b8===undefined&&b7.nodeType===1){var i="data-"+b6.replace(aQ,"-$1").toLowerCase();b8=b7.getAttribute(i);if(typeof b8==="string"){try{b8=b8==="true"?true:b8==="false"?false:b8==="null"?null:+b8+""===b8?+b8:by.test(b8)?bI.parseJSON(b8):b8}catch(b9){}bI.data(b7,b6,b8)}else{b8=undefined}}return b8}function Q(i){var e;for(e in i){if(e==="data"&&bI.isEmptyObject(i[e])){continue}if(e!=="toJSON"){return false}}return true}function bc(b7,i,b9,b8){if(!bI.acceptData(b7)){return}var cb,ca,cc=bI.expando,cd=b7.nodeType,e=cd?bI.cache:b7,b6=cd?b7[cc]:b7[cc]&&cc;if((!b6||!e[b6]||(!b8&&!e[b6].data))&&b9===undefined&&typeof i==="string"){return}if(!b6){if(cd){b6=b7[cc]=aP.pop()||bI.guid++}else{b6=cc}}if(!e[b6]){e[b6]=cd?{}:{toJSON:bI.noop}}if(typeof i==="object"||typeof i==="function"){if(b8){e[b6]=bI.extend(e[b6],i)}else{e[b6].data=bI.extend(e[b6].data,i)}}ca=e[b6];if(!b8){if(!ca.data){ca.data={}}ca=ca.data}if(b9!==undefined){ca[bI.camelCase(i)]=b9}if(typeof i==="string"){cb=ca[i];if(cb==null){cb=ca[bI.camelCase(i)]}}else{cb=ca}return cb}function ab(b9,b7,e){if(!bI.acceptData(b9)){return}var cb,b8,ca=b9.nodeType,b6=ca?bI.cache:b9,cc=ca?b9[bI.expando]:bI.expando;if(!b6[cc]){return}if(b7){cb=e?b6[cc]:b6[cc].data;if(cb){if(!bI.isArray(b7)){if(b7 in cb){b7=[b7]}else{b7=bI.camelCase(b7);if(b7 in cb){b7=[b7]}else{b7=b7.split(" ")}}}else{b7=b7.concat(bI.map(b7,bI.camelCase))}b8=b7.length;while(b8--){delete cb[b7[b8]]}if(e?!Q(cb):!bI.isEmptyObject(cb)){return}}}if(!e){delete b6[cc].data;if(!Q(b6[cc])){return}}if(ca){bI.cleanData([b9],true)}else{if(D.deleteExpando||b6!=b6.window){delete b6[cc]}else{b6[cc]=null}}}bI.extend({cache:{},noData:{"applet ":true,"embed ":true,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){e=e.nodeType?bI.cache[e[bI.expando]]:e[bI.expando];return !!e&&!Q(e)},data:function(i,e,b6){return bc(i,e,b6)},removeData:function(i,e){return ab(i,e)},_data:function(i,e,b6){return bc(i,e,b6,true)},_removeData:function(i,e){return ab(i,e,true)}});bI.fn.extend({data:function(b8,cb){var b7,b6,ca,b9=this[0],e=b9&&b9.attributes;if(b8===undefined){if(this.length){ca=bI.data(b9);if(b9.nodeType===1&&!bI._data(b9,"parsedAttrs")){b7=e.length;while(b7--){if(e[b7]){b6=e[b7].name;if(b6.indexOf("data-")===0){b6=bI.camelCase(b6.slice(5));bA(b9,b6,ca[b6])}}}bI._data(b9,"parsedAttrs",true)}}return ca}if(typeof b8==="object"){return this.each(function(){bI.data(this,b8)})}return arguments.length>1?this.each(function(){bI.data(this,b8,cb)}):b9?bA(b9,b8,bI.data(b9,b8)):undefined},removeData:function(e){return this.each(function(){bI.removeData(this,e)})}});bI.extend({queue:function(b6,i,b7){var e;if(b6){i=(i||"fx")+"queue";e=bI._data(b6,i);if(b7){if(!e||bI.isArray(b7)){e=bI._data(b6,i,bI.makeArray(b7))}else{e.push(b7)}}return e||[]}},dequeue:function(b9,b8){b8=b8||"fx";var i=bI.queue(b9,b8),ca=i.length,b7=i.shift(),e=bI._queueHooks(b9,b8),b6=function(){bI.dequeue(b9,b8)};if(b7==="inprogress"){b7=i.shift();ca--}if(b7){if(b8==="fx"){i.unshift("inprogress")}delete e.stop;b7.call(b9,b6,e)}if(!ca&&e){e.empty.fire()}},_queueHooks:function(b6,i){var e=i+"queueHooks";return bI._data(b6,e)||bI._data(b6,e,{empty:bI.Callbacks("once memory").add(function(){bI._removeData(b6,i+"queue");bI._removeData(b6,e)})})}});bI.fn.extend({queue:function(e,i){var b6=2;if(typeof e!=="string"){i=e;e="fx";b6--}if(arguments.length
    Class
    a";D.leadingWhitespace=b8.firstChild.nodeType===3;D.tbody=!b8.getElementsByTagName("tbody").length;D.htmlSerialize=!!b8.getElementsByTagName("link").length;D.html5Clone=n.createElement("nav").cloneNode(true).outerHTML!=="<:nav>";i.type="checkbox";i.checked=true;b6.appendChild(i);D.appendChecked=i.checked;b8.innerHTML="";D.noCloneChecked=!!b8.cloneNode(true).lastChild.defaultValue;b6.appendChild(b8);b8.innerHTML="";D.checkClone=b8.cloneNode(true).cloneNode(true).lastChild.checked;D.noCloneEvent=true;if(b8.attachEvent){b8.attachEvent("onclick",function(){D.noCloneEvent=false});b8.cloneNode(true).click()}if(D.deleteExpando==null){D.deleteExpando=true;try{delete b8.test}catch(b7){D.deleteExpando=false}}})();(function(){var b6,e,b7=n.createElement("div");for(b6 in {submit:true,change:true,focusin:true}){e="on"+b6;if(!(D[b6+"Bubbles"]=e in a5)){b7.setAttribute(e,"t");D[b6+"Bubbles"]=b7.attributes[e].expando===false}}b7=null})();var bG=/^(?:input|select|textarea)$/i,a6=/^key/,bM=/^(?:mouse|pointer|contextmenu)|click/,bC=/^(?:focusinfocus|focusoutblur)$/,bx=/^([^.]*)(?:\.(.+)|)$/;function U(){return true}function Z(){return false}function am(){try{return n.activeElement}catch(e){}}bI.event={global:{},add:function(b8,cd,ci,ca,b9){var cb,cj,ck,b6,cf,cc,ch,b7,cg,e,i,ce=bI._data(b8);if(!ce){return}if(ci.handler){b6=ci;ci=b6.handler;b9=b6.selector}if(!ci.guid){ci.guid=bI.guid++}if(!(cj=ce.events)){cj=ce.events={}}if(!(cc=ce.handle)){cc=ce.handle=function(cl){return typeof bI!==aC&&(!cl||bI.event.triggered!==cl.type)?bI.event.dispatch.apply(cc.elem,arguments):undefined};cc.elem=b8}cd=(cd||"").match(aF)||[""];ck=cd.length;while(ck--){cb=bx.exec(cd[ck])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){continue}cf=bI.event.special[cg]||{};cg=(b9?cf.delegateType:cf.bindType)||cg;cf=bI.event.special[cg]||{};ch=bI.extend({type:cg,origType:i,data:ca,handler:ci,guid:ci.guid,selector:b9,needsContext:b9&&bI.expr.match.needsContext.test(b9),namespace:e.join(".")},b6);if(!(b7=cj[cg])){b7=cj[cg]=[];b7.delegateCount=0;if(!cf.setup||cf.setup.call(b8,ca,e,cc)===false){if(b8.addEventListener){b8.addEventListener(cg,cc,false)}else{if(b8.attachEvent){b8.attachEvent("on"+cg,cc)}}}}if(cf.add){cf.add.call(b8,ch);if(!ch.handler.guid){ch.handler.guid=ci.guid}}if(b9){b7.splice(b7.delegateCount++,0,ch)}else{b7.push(ch)}bI.event.global[cg]=true}b8=null},remove:function(b7,cd,ck,b8,cc){var ca,ch,cb,b9,cj,ci,cf,b6,cg,e,i,ce=bI.hasData(b7)&&bI._data(b7);if(!ce||!(ci=ce.events)){return}cd=(cd||"").match(aF)||[""];cj=cd.length;while(cj--){cb=bx.exec(cd[cj])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){for(cg in ci){bI.event.remove(b7,cg+cd[cj],ck,b8,true)}continue}cf=bI.event.special[cg]||{};cg=(b8?cf.delegateType:cf.bindType)||cg;b6=ci[cg]||[];cb=cb[2]&&new RegExp("(^|\\.)"+e.join("\\.(?:.*\\.|)")+"(\\.|$)");b9=ca=b6.length;while(ca--){ch=b6[ca];if((cc||i===ch.origType)&&(!ck||ck.guid===ch.guid)&&(!cb||cb.test(ch.namespace))&&(!b8||b8===ch.selector||b8==="**"&&ch.selector)){b6.splice(ca,1);if(ch.selector){b6.delegateCount--}if(cf.remove){cf.remove.call(b7,ch)}}}if(b9&&!b6.length){if(!cf.teardown||cf.teardown.call(b7,e,ce.handle)===false){bI.removeEvent(b7,cg,ce.handle)}delete ci[cg]}}if(bI.isEmptyObject(ci)){delete ce.handle;bI._removeData(b7,"events")}},trigger:function(b6,cd,b9,ck){var ce,b8,ci,cj,cg,cc,cb,ca=[b9||n],ch=K.call(b6,"type")?b6.type:b6,b7=K.call(b6,"namespace")?b6.namespace.split("."):[];ci=cc=b9=b9||n;if(b9.nodeType===3||b9.nodeType===8){return}if(bC.test(ch+bI.event.triggered)){return}if(ch.indexOf(".")>=0){b7=ch.split(".");ch=b7.shift();b7.sort()}b8=ch.indexOf(":")<0&&"on"+ch;b6=b6[bI.expando]?b6:new bI.Event(ch,typeof b6==="object"&&b6);b6.isTrigger=ck?2:3;b6.namespace=b7.join(".");b6.namespace_re=b6.namespace?new RegExp("(^|\\.)"+b7.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;b6.result=undefined;if(!b6.target){b6.target=b9}cd=cd==null?[b6]:bI.makeArray(cd,[b6]);cg=bI.event.special[ch]||{};if(!ck&&cg.trigger&&cg.trigger.apply(b9,cd)===false){return}if(!ck&&!cg.noBubble&&!bI.isWindow(b9)){cj=cg.delegateType||ch;if(!bC.test(cj+ch)){ci=ci.parentNode}for(;ci;ci=ci.parentNode){ca.push(ci);cc=ci}if(cc===(b9.ownerDocument||n)){ca.push(cc.defaultView||cc.parentWindow||a5)}}cb=0;while((ci=ca[cb++])&&!b6.isPropagationStopped()){b6.type=cb>1?cj:cg.bindType||ch;ce=(bI._data(ci,"events")||{})[b6.type]&&bI._data(ci,"handle");if(ce){ce.apply(ci,cd)}ce=b8&&ci[b8];if(ce&&ce.apply&&bI.acceptData(ci)){b6.result=ce.apply(ci,cd);if(b6.result===false){b6.preventDefault()}}}b6.type=ch;if(!ck&&!b6.isDefaultPrevented()){if((!cg._default||cg._default.apply(ca.pop(),cd)===false)&&bI.acceptData(b9)){if(b8&&b9[ch]&&!bI.isWindow(b9)){cc=b9[b8];if(cc){b9[b8]=null}bI.event.triggered=ch;try{b9[ch]()}catch(cf){}bI.event.triggered=undefined;if(cc){b9[b8]=cc}}}}return b6.result},dispatch:function(e){e=bI.event.fix(e);var b9,ca,ce,b6,b8,cd=[],cc=P.call(arguments),b7=(bI._data(this,"events")||{})[e.type]||[],cb=bI.event.special[e.type]||{};cc[0]=e;e.delegateTarget=this;if(cb.preDispatch&&cb.preDispatch.call(this,e)===false){return}cd=bI.event.handlers.call(this,e,b7);b9=0;while((b6=cd[b9++])&&!e.isPropagationStopped()){e.currentTarget=b6.elem;b8=0;while((ce=b6.handlers[b8++])&&!e.isImmediatePropagationStopped()){if(!e.namespace_re||e.namespace_re.test(ce.namespace)){e.handleObj=ce;e.data=ce.data;ca=((bI.event.special[ce.origType]||{}).handle||ce.handler).apply(b6.elem,cc);if(ca!==undefined){if((e.result=ca)===false){e.preventDefault();e.stopPropagation()}}}}}if(cb.postDispatch){cb.postDispatch.call(this,e)}return e.result},handlers:function(e,b7){var b6,cc,ca,b9,cb=[],b8=b7.delegateCount,cd=e.target;if(b8&&cd.nodeType&&(!e.button||e.type!=="click")){for(;cd!=this;cd=cd.parentNode||this){if(cd.nodeType===1&&(cd.disabled!==true||e.type!=="click")){ca=[];for(b9=0;b9=0:bI.find(b6,this,null,[cd]).length}if(ca[b6]){ca.push(cc)}}if(ca.length){cb.push({elem:cd,handlers:ca})}}}}if(b8]","i"),b5=/^\s+/,aH=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,o=/<([\w:]+)/,b0=/\s*$/g,W={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:D.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},aT=B(n),k=aT.appendChild(n.createElement("div"));W.optgroup=W.option;W.tbody=W.tfoot=W.colgroup=W.caption=W.thead;W.th=W.td;function l(b8,e){var b6,b9,b7=0,ca=typeof b8.getElementsByTagName!==aC?b8.getElementsByTagName(e||"*"):typeof b8.querySelectorAll!==aC?b8.querySelectorAll(e||"*"):undefined;if(!ca){for(ca=[],b6=b8.childNodes||b8;(b9=b6[b7])!=null;b7++){if(!e||bI.nodeName(b9,e)){ca.push(b9)}else{bI.merge(ca,l(b9,e))}}}return e===undefined||e&&bI.nodeName(b8,e)?bI.merge([b8],ca):ca}function bY(e){if(aM.test(e.type)){e.defaultChecked=e.checked}}function a3(i,e){return bI.nodeName(i,"table")&&bI.nodeName(e.nodeType!==11?e:e.firstChild,"tr")?i.getElementsByTagName("tbody")[0]||i.appendChild(i.ownerDocument.createElement("tbody")):i}function u(e){e.type=(bI.find.attr(e,"type")!==null)+"/"+e.type;return e}function bf(i){var e=ar.exec(i.type);if(e){i.type=e[1]}else{i.removeAttribute("type")}return i}function bu(e,b7){var b8,b6=0;for(;(b8=e[b6])!=null;b6++){bI._data(b8,"globalEval",!b7||bI._data(b7[b6],"globalEval"))}}function at(cc,b6){if(b6.nodeType!==1||!bI.hasData(cc)){return}var b9,b8,e,cb=bI._data(cc),ca=bI._data(b6,cb),b7=cb.events;if(b7){delete ca.handle;ca.events={};for(b9 in b7){for(b8=0,e=b7[b9].length;b8")){cd=b6.cloneNode(true)}else{k.innerHTML=b6.outerHTML;k.removeChild(cd=k.firstChild)}if((!D.noCloneEvent||!D.noCloneChecked)&&(b6.nodeType===1||b6.nodeType===11)&&!bI.isXMLDoc(b6)){ca=l(cd);cb=l(b6);for(b9=0;(b7=cb[b9])!=null;++b9){if(ca[b9]){T(b7,ca[b9])}}}if(b8){if(e){cb=cb||l(b6);ca=ca||l(cd);for(b9=0;(b7=cb[b9])!=null;b9++){at(b7,ca[b9])}}else{at(b6,cd)}}ca=l(cd,"script");if(ca.length>0){bu(ca,!cc&&l(b6,"script"))}ca=cb=b7=null;return cd},buildFragment:function(b6,b8,cd,ci){var ce,ca,cc,ch,cj,cg,b7,cb=b6.length,b9=B(b8),e=[],cf=0;for(;cf")+b7[2];ce=b7[0];while(ce--){ch=ch.lastChild}if(!D.leadingWhitespace&&b5.test(ca)){e.push(b8.createTextNode(b5.exec(ca)[0]))}if(!D.tbody){ca=cj==="table"&&!b0.test(ca)?ch.firstChild:b7[1]===""&&!b0.test(ca)?ch:0;ce=ca&&ca.childNodes.length;while(ce--){if(bI.nodeName((cg=ca.childNodes[ce]),"tbody")&&!cg.childNodes.length){ca.removeChild(cg)}}}bI.merge(e,ch.childNodes);ch.textContent="";while(ch.firstChild){ch.removeChild(ch.firstChild)}ch=b9.lastChild}}}}if(ch){b9.removeChild(ch)}if(!D.appendChecked){bI.grep(l(e,"input"),bY)}cf=0;while((ca=e[cf++])){if(ci&&bI.inArray(ca,ci)!==-1){continue}cc=bI.contains(ca.ownerDocument,ca);ch=l(b9.appendChild(ca),"script");if(cc){bu(ch)}if(cd){ce=0;while((ca=ch[ce++])){if(bB.test(ca.type||"")){cd.push(ca)}}}}ch=null;return b9},cleanData:function(b6,ce){var b8,cd,b7,b9,ca=0,cf=bI.expando,e=bI.cache,cb=D.deleteExpando,cc=bI.event.special;for(;(b8=b6[ca])!=null;ca++){if(ce||bI.acceptData(b8)){b7=b8[cf];b9=b7&&e[b7];if(b9){if(b9.events){for(cd in b9.events){if(cc[cd]){bI.event.remove(b8,cd)}else{bI.removeEvent(b8,cd,b9.handle)}}}if(e[b7]){delete e[b7];if(cb){delete b8[cf]}else{if(typeof b8.removeAttribute!==aC){b8.removeAttribute(cf)}else{b8[cf]=null}}aP.push(b7)}}}}}});bI.fn.extend({text:function(e){return aB(this,function(i){return i===undefined?bI.text(this):this.empty().append((this[0]&&this[0].ownerDocument||n).createTextNode(i))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.insertBefore(e,i.firstChild)}})},before:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this)}})},after:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this.nextSibling)}})},remove:function(e,b9){var b8,b6=e?bI.filter(e,this):this,b7=0;for(;(b8=b6[b7])!=null;b7++){if(!b9&&b8.nodeType===1){bI.cleanData(l(b8))}if(b8.parentNode){if(b9&&bI.contains(b8.ownerDocument,b8)){bu(l(b8,"script"))}b8.parentNode.removeChild(b8)}}return this},empty:function(){var b6,e=0;for(;(b6=this[e])!=null;e++){if(b6.nodeType===1){bI.cleanData(l(b6,false))}while(b6.firstChild){b6.removeChild(b6.firstChild)}if(b6.options&&bI.nodeName(b6,"select")){b6.options.length=0}}return this},clone:function(i,e){i=i==null?false:i;e=e==null?i:e;return this.map(function(){return bI.clone(this,i,e)})},html:function(e){return aB(this,function(b9){var b8=this[0]||{},b7=0,b6=this.length;if(b9===undefined){return b8.nodeType===1?b8.innerHTML.replace(aD,""):undefined}if(typeof b9==="string"&&!an.test(b9)&&(D.htmlSerialize||!M.test(b9))&&(D.leadingWhitespace||!b5.test(b9))&&!W[(o.exec(b9)||["",""])[1].toLowerCase()]){b9=b9.replace(aH,"<$1>");try{for(;b71&&typeof ce==="string"&&!D.checkClone&&bW.test(ce))){return this.each(function(cj){var i=cf.eq(cj);if(b6){cd[0]=ce.call(this,cj,i.html())}i.domManip(cd,ci)})}if(b8){cc=bI.buildFragment(cd,this[0].ownerDocument,false,this);cb=cc.firstChild;if(cc.childNodes.length===1){cc=cb}if(cb){b9=bI.map(l(cc,"script"),u);e=b9.length;for(;ca")).appendTo(i.documentElement);i=(aI[0].contentWindow||aI[0].contentDocument).document;i.write();i.close();e=a4(b6,i);aI.detach()}bl[b6]=e}return e}(function(){var e;D.shrinkWrapBlocks=function(){if(e!=null){return e}e=false;var b7,i,b6;i=n.getElementsByTagName("body")[0];if(!i||!i.style){return}b7=n.createElement("div");b6=n.createElement("div");b6.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";i.appendChild(b6).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1";b7.appendChild(n.createElement("div")).style.width="5px";e=b7.offsetWidth!==3}i.removeChild(b6);return e}})();var aZ=(/^margin/);var Y=new RegExp("^("+aE+")(?!px)[a-z%]+$","i");var bq,G,bo=/^(top|right|bottom|left)$/;if(a5.getComputedStyle){bq=function(e){if(e.ownerDocument.defaultView.opener){return e.ownerDocument.defaultView.getComputedStyle(e,null)}return a5.getComputedStyle(e,null)};G=function(cb,i,ca){var b8,b7,b9,e,b6=cb.style;ca=ca||bq(cb);e=ca?ca.getPropertyValue(i)||ca[i]:undefined;if(ca){if(e===""&&!bI.contains(cb.ownerDocument,cb)){e=bI.style(cb,i)}if(Y.test(e)&&aZ.test(i)){b8=b6.width;b7=b6.minWidth;b9=b6.maxWidth;b6.minWidth=b6.maxWidth=b6.width=e;e=ca.width;b6.width=b8;b6.minWidth=b7;b6.maxWidth=b9}}return e===undefined?e:e+""}}else{if(n.documentElement.currentStyle){bq=function(e){return e.currentStyle};G=function(ca,b7,b9){var cb,i,e,b6,b8=ca.style;b9=b9||bq(ca);b6=b9?b9[b7]:undefined;if(b6==null&&b8&&b8[b7]){b6=b8[b7]}if(Y.test(b6)&&!bo.test(b7)){cb=b8.left;i=ca.runtimeStyle;e=i&&i.left;if(e){i.left=ca.currentStyle.left}b8.left=b7==="fontSize"?"1em":b6;b6=b8.pixelLeft+"px";b8.left=cb;if(e){i.left=e}}return b6===undefined?b6:b6+""||"auto"}}}function a7(e,i){return{get:function(){var b6=e();if(b6==null){return}if(b6){delete this.get;return}return(this.get=i).apply(this,arguments)}}}(function(){var cb,b9,b7,ca,b6,b8,i;cb=n.createElement("div");cb.innerHTML="
    a";b7=cb.getElementsByTagName("a")[0];b9=b7&&b7.style;if(!b9){return}b9.cssText="float:left;opacity:.5";D.opacity=b9.opacity==="0.5";D.cssFloat=!!b9.cssFloat;cb.style.backgroundClip="content-box";cb.cloneNode(true).style.backgroundClip="";D.clearCloneStyle=cb.style.backgroundClip==="content-box";D.boxSizing=b9.boxSizing===""||b9.MozBoxSizing===""||b9.WebkitBoxSizing==="";bI.extend(D,{reliableHiddenOffsets:function(){if(b8==null){e()}return b8},boxSizingReliable:function(){if(b6==null){e()}return b6},pixelPosition:function(){if(ca==null){e()}return ca},reliableMarginRight:function(){if(i==null){e()}return i}});function e(){var cf,cc,cd,ce;cc=n.getElementsByTagName("body")[0];if(!cc||!cc.style){return}cf=n.createElement("div");cd=n.createElement("div");cd.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";cc.appendChild(cd).appendChild(cf);cf.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute";ca=b6=false;i=true;if(a5.getComputedStyle){ca=(a5.getComputedStyle(cf,null)||{}).top!=="1%";b6=(a5.getComputedStyle(cf,null)||{width:"4px"}).width==="4px";ce=cf.appendChild(n.createElement("div"));ce.style.cssText=cf.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0";ce.style.marginRight=ce.style.width="0";cf.style.width="1px";i=!parseFloat((a5.getComputedStyle(ce,null)||{}).marginRight);cf.removeChild(ce)}cf.innerHTML="
    t
    ";ce=cf.getElementsByTagName("td");ce[0].style.cssText="margin:0;border:0;padding:0;display:none";b8=ce[0].offsetHeight===0;if(b8){ce[0].style.display="";ce[1].style.display="none";b8=ce[0].offsetHeight===0}cc.removeChild(cd)}})();bI.swap=function(b9,b8,ca,b7){var b6,i,e={};for(i in b8){e[i]=b9.style[i];b9.style[i]=b8[i]}b6=ca.apply(b9,b7||[]);for(i in b8){b9.style[i]=e[i]}return b6};var bj=/alpha\([^)]*\)/i,aU=/opacity\s*=\s*([^)]*)/,H=/^(none|table(?!-c[ea]).+)/,bb=new RegExp("^("+aE+")(.*)$","i"),V=new RegExp("^([+-])=("+aE+")","i"),be={position:"absolute",visibility:"hidden",display:"block"},bD={letterSpacing:"0",fontWeight:"400"},aw=["Webkit","O","Moz","ms"];function c(b8,b6){if(b6 in b8){return b6}var b9=b6.charAt(0).toUpperCase()+b6.slice(1),e=b6,b7=aw.length;while(b7--){b6=aw[b7]+b9;if(b6 in b8){return b6}}return e}function s(ca,e){var cb,b8,b9,i=[],b6=0,b7=ca.length;for(;b6=1||b9==="")&&bI.trim(b6.replace(bj,""))===""&&b7.removeAttribute){b7.removeAttribute("filter");if(b9===""||i&&!i.filter){return}}b7.filter=bj.test(b6)?b6.replace(bj,e):b6+" "+e}}}bI.cssHooks.marginRight=a7(D.reliableMarginRight,function(i,e){if(e){return bI.swap(i,{display:"inline-block"},G,[i,"marginRight"])}});bI.each({margin:"",padding:"",border:"Width"},function(e,i){bI.cssHooks[e+i]={expand:function(b8){var b7=0,b6={},b9=typeof b8==="string"?b8.split(" "):[b8];for(;b7<4;b7++){b6[e+bT[b7]+i]=b9[b7]||b9[b7-2]||b9[0]}return b6}};if(!aZ.test(e)){bI.cssHooks[e+i].set=aN}});bI.fn.extend({css:function(e,i){return aB(this,function(ca,b7,cb){var b9,b6,cc={},b8=0;if(bI.isArray(b7)){b9=bq(ca);b6=b7.length;for(;b81)},show:function(){return s(this,true)},hide:function(){return s(this)},toggle:function(e){if(typeof e==="boolean"){return e?this.show():this.hide()}return this.each(function(){if(S(this)){bI(this).show()}else{bI(this).hide()}})}});function J(b6,i,b8,e,b7){return new J.prototype.init(b6,i,b8,e,b7)}bI.Tween=J;J.prototype={constructor:J,init:function(b7,i,b9,e,b8,b6){this.elem=b7;this.prop=b9;this.easing=b8||"swing";this.options=i;this.start=this.now=this.cur();this.end=e;this.unit=b6||(bI.cssNumber[b9]?"":"px")},cur:function(){var e=J.propHooks[this.prop];return e&&e.get?e.get(this):J.propHooks._default.get(this)},run:function(b6){var i,e=J.propHooks[this.prop];if(this.options.duration){this.pos=i=bI.easing[this.easing](b6,this.options.duration*b6,0,1,this.options.duration)}else{this.pos=i=b6}this.now=(this.end-this.start)*i+this.start;if(this.options.step){this.options.step.call(this.elem,this.now,this)}if(e&&e.set){e.set(this)}else{J.propHooks._default.set(this)}return this}};J.prototype.init.prototype=J.prototype;J.propHooks={_default:{get:function(i){var e;if(i.elem[i.prop]!=null&&(!i.elem.style||i.elem.style[i.prop]==null)){return i.elem[i.prop]}e=bI.css(i.elem,i.prop,"");return !e||e==="auto"?0:e},set:function(e){if(bI.fx.step[e.prop]){bI.fx.step[e.prop](e)}else{if(e.elem.style&&(e.elem.style[bI.cssProps[e.prop]]!=null||bI.cssHooks[e.prop])){bI.style(e.elem,e.prop,e.now+e.unit)}else{e.elem[e.prop]=e.now}}}}};J.propHooks.scrollTop=J.propHooks.scrollLeft={set:function(e){if(e.elem.nodeType&&e.elem.parentNode){e.elem[e.prop]=e.now}}};bI.easing={linear:function(e){return e},swing:function(e){return 0.5-Math.cos(e*Math.PI)/2}};bI.fx=J.prototype.init;bI.fx.step={};var N,ae,bR=/^(?:toggle|show|hide)$/,bJ=new RegExp("^(?:([+-])=|)("+aE+")([a-z%]*)$","i"),bP=/queueHooks$/,aG=[h],a2={"*":[function(e,ca){var cc=this.createTween(e,ca),b8=cc.cur(),b7=bJ.exec(ca),cb=b7&&b7[3]||(bI.cssNumber[e]?"":"px"),i=(bI.cssNumber[e]||cb!=="px"&&+b8)&&bJ.exec(bI.css(cc.elem,e)),b6=1,b9=20;if(i&&i[3]!==cb){cb=cb||i[3];b7=b7||[];i=+b8||1;do{b6=b6||".5";i=i/b6;bI.style(cc.elem,e,i+cb)}while(b6!==(b6=cc.cur()/b8)&&b6!==1&&--b9)}if(b7){i=cc.start=+i||+b8||0;cc.unit=cb;cc.end=b7[1]?i+(b7[1]+1)*b7[2]:+b7[2]}return cc}]};function bn(){setTimeout(function(){N=undefined});return(N=bI.now())}function bH(b7,b9){var b8,e={height:b7},b6=0;b9=b9?1:0;for(;b6<4;b6+=2-b9){b8=bT[b6];e["margin"+b8]=e["padding"+b8]=b7}if(b9){e.opacity=e.width=b7}return e}function bd(b8,ca,b7){var i,b9=(a2[ca]||[]).concat(a2["*"]),e=0,b6=b9.length;for(;e
    a";i=b8.getElementsByTagName("a")[0];e=n.createElement("select");b7=e.appendChild(n.createElement("option"));b6=b8.getElementsByTagName("input")[0];i.style.cssText="top:1px";D.getSetAttribute=b8.className!=="t";D.style=/top/.test(i.getAttribute("style"));D.hrefNormalized=i.getAttribute("href")==="/a";D.checkOn=!!b6.value;D.optSelected=b7.selected;D.enctype=!!n.createElement("form").enctype;e.disabled=true;D.optDisabled=!b7.disabled;b6=n.createElement("input");b6.setAttribute("value","");D.input=b6.getAttribute("value")==="";b6.value="t";b6.setAttribute("type","radio");D.radioValue=b6.value==="t"})();var al=/\r/g;bI.fn.extend({val:function(b7){var e,i,b8,b6=this[0];if(!arguments.length){if(b6){e=bI.valHooks[b6.type]||bI.valHooks[b6.nodeName.toLowerCase()];if(e&&"get" in e&&(i=e.get(b6,"value"))!==undefined){return i}i=b6.value;return typeof i==="string"?i.replace(al,""):i==null?"":i}return}b8=bI.isFunction(b7);return this.each(function(b9){var ca;if(this.nodeType!==1){return}if(b8){ca=b7.call(this,b9,bI(this).val())}else{ca=b7}if(ca==null){ca=""}else{if(typeof ca==="number"){ca+=""}else{if(bI.isArray(ca)){ca=bI.map(ca,function(cb){return cb==null?"":cb+""})}}}e=bI.valHooks[this.type]||bI.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,ca,"value")===undefined){this.value=ca}})}});bI.extend({valHooks:{option:{get:function(e){var i=bI.find.attr(e,"value");return i!=null?i:bI.trim(bI.text(e))}},select:{get:function(e){var cb,b7,cd=e.options,b9=e.selectedIndex,b8=e.type==="select-one"||b9<0,cc=b8?null:[],ca=b8?b9+1:cd.length,b6=b9<0?ca:b8?b9:0;for(;b6=0){try{b9.selected=cc=true}catch(b6){b9.scrollHeight}}else{b9.selected=false}}if(!cc){ca.selectedIndex=-1}return b7}}}});bI.each(["radio","checkbox"],function(){bI.valHooks[this]={set:function(e,i){if(bI.isArray(i)){return(e.checked=bI.inArray(bI(e).val(),i)>=0)}}};if(!D.checkOn){bI.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value}}});var ba,b3,bO=bI.expr.attrHandle,aq=/^(?:checked|selected)$/i,bN=D.getSetAttribute,bF=D.input;bI.fn.extend({attr:function(e,i){return aB(this,bI.attr,e,i,arguments.length>1)},removeAttr:function(e){return this.each(function(){bI.removeAttr(this,e)})}});bI.extend({attr:function(b8,b7,b9){var e,b6,i=b8.nodeType;if(!b8||i===3||i===8||i===2){return}if(typeof b8.getAttribute===aC){return bI.prop(b8,b7,b9)}if(i!==1||!bI.isXMLDoc(b8)){b7=b7.toLowerCase();e=bI.attrHooks[b7]||(bI.expr.match.bool.test(b7)?b3:ba)}if(b9!==undefined){if(b9===null){bI.removeAttr(b8,b7)}else{if(e&&"set" in e&&(b6=e.set(b8,b9,b7))!==undefined){return b6}else{b8.setAttribute(b7,b9+"");return b9}}}else{if(e&&"get" in e&&(b6=e.get(b8,b7))!==null){return b6}else{b6=bI.find.attr(b8,b7);return b6==null?undefined:b6}}},removeAttr:function(b7,b9){var e,b8,b6=0,ca=b9&&b9.match(aF);if(ca&&b7.nodeType===1){while((e=ca[b6++])){b8=bI.propFix[e]||e;if(bI.expr.match.bool.test(e)){if(bF&&bN||!aq.test(e)){b7[b8]=false}else{b7[bI.camelCase("default-"+e)]=b7[b8]=false}}else{bI.attr(b7,e,"")}b7.removeAttribute(bN?e:b8)}}},attrHooks:{type:{set:function(e,i){if(!D.radioValue&&i==="radio"&&bI.nodeName(e,"input")){var b6=e.value;e.setAttribute("type",i);if(b6){e.value=b6}return i}}}}});b3={set:function(i,b6,e){if(b6===false){bI.removeAttr(i,e)}else{if(bF&&bN||!aq.test(e)){i.setAttribute(!bN&&bI.propFix[e]||e,e)}else{i[bI.camelCase("default-"+e)]=i[e]=true}}return e}};bI.each(bI.expr.match.bool.source.match(/\w+/g),function(b7,b6){var e=bO[b6]||bI.find.attr;bO[b6]=bF&&bN||!aq.test(b6)?function(b9,b8,cb){var i,ca;if(!cb){ca=bO[b8];bO[b8]=i;i=e(b9,b8,cb)!=null?b8.toLowerCase():null;bO[b8]=ca}return i}:function(b8,i,b9){if(!b9){return b8[bI.camelCase("default-"+i)]?i.toLowerCase():null}}});if(!bF||!bN){bI.attrHooks.value={set:function(i,b6,e){if(bI.nodeName(i,"input")){i.defaultValue=b6}else{return ba&&ba.set(i,b6,e)}}}}if(!bN){ba={set:function(b6,b7,i){var e=b6.getAttributeNode(i);if(!e){b6.setAttributeNode((e=b6.ownerDocument.createAttribute(i)))}e.value=b7+="";if(i==="value"||b7===b6.getAttribute(i)){return b7}}};bO.id=bO.name=bO.coords=function(b6,i,b7){var e;if(!b7){return(e=b6.getAttributeNode(i))&&e.value!==""?e.value:null}};bI.valHooks.button={get:function(b6,i){var e=b6.getAttributeNode(i);if(e&&e.specified){return e.value}},set:ba.set};bI.attrHooks.contenteditable={set:function(i,b6,e){ba.set(i,b6===""?false:b6,e)}};bI.each(["width","height"],function(b6,e){bI.attrHooks[e]={set:function(i,b7){if(b7===""){i.setAttribute(e,"auto");return b7}}}})}if(!D.style){bI.attrHooks.style={get:function(e){return e.style.cssText||undefined},set:function(e,i){return(e.style.cssText=i+"")}}}var aJ=/^(?:input|select|textarea|button|object)$/i,F=/^(?:a|area)$/i;bI.fn.extend({prop:function(e,i){return aB(this,bI.prop,e,i,arguments.length>1)},removeProp:function(e){e=bI.propFix[e]||e;return this.each(function(){try{this[e]=undefined;delete this[e]}catch(i){}})}});bI.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(b9,b7,ca){var b6,e,b8,i=b9.nodeType;if(!b9||i===3||i===8||i===2){return}b8=i!==1||!bI.isXMLDoc(b9);if(b8){b7=bI.propFix[b7]||b7;e=bI.propHooks[b7]}if(ca!==undefined){return e&&"set" in e&&(b6=e.set(b9,ca,b7))!==undefined?b6:(b9[b7]=ca)}else{return e&&"get" in e&&(b6=e.get(b9,b7))!==null?b6:b9[b7]}},propHooks:{tabIndex:{get:function(i){var e=bI.find.attr(i,"tabindex");return e?parseInt(e,10):aJ.test(i.nodeName)||F.test(i.nodeName)&&i.href?0:-1}}}});if(!D.hrefNormalized){bI.each(["href","src"],function(b6,e){bI.propHooks[e]={get:function(i){return i.getAttribute(e,4)}}})}if(!D.optSelected){bI.propHooks.selected={get:function(i){var e=i.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}}}bI.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){bI.propFix[this.toLowerCase()]=this});if(!D.enctype){bI.propFix.enctype="encoding"}var bL=/[\t\r\n\f]/g;bI.fn.extend({addClass:function(cd){var b7,b6,ce,cb,b8,e,b9=0,ca=this.length,cc=typeof cd==="string"&&cd;if(bI.isFunction(cd)){return this.each(function(i){bI(this).addClass(cd.call(this,i,this.className))})}if(cc){b7=(cd||"").match(aF)||[];for(;b9=0){ce=ce.replace(" "+cb+" "," ")}}e=cd?bI.trim(ce):"";if(b6.className!==e){b6.className=e}}}}return this},toggleClass:function(b6,e){var i=typeof b6;if(typeof e==="boolean"&&i==="string"){return e?this.addClass(b6):this.removeClass(b6)}if(bI.isFunction(b6)){return this.each(function(b7){bI(this).toggleClass(b6.call(this,b7,this.className,e),e)})}return this.each(function(){if(i==="string"){var b9,b8=0,b7=bI(this),ca=b6.match(aF)||[];while((b9=ca[b8++])){if(b7.hasClass(b9)){b7.removeClass(b9)}else{b7.addClass(b9)}}}else{if(i===aC||i==="boolean"){if(this.className){bI._data(this,"__className__",this.className)}this.className=this.className||b6===false?"":bI._data(this,"__className__")||""}}})},hasClass:function(e){var b8=" "+e+" ",b7=0,b6=this.length;for(;b7=0){return true}}return false}});bI.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(b6,e){bI.fn[e]=function(b7,i){return arguments.length>0?this.on(e,null,b7,i):this.trigger(e)}});bI.fn.extend({hover:function(e,i){return this.mouseenter(e).mouseleave(i||e)},bind:function(e,b6,i){return this.on(e,null,b6,i)},unbind:function(e,i){return this.off(e,null,i)},delegate:function(e,i,b7,b6){return this.on(i,e,b7,b6)},undelegate:function(e,i,b6){return arguments.length===1?this.off(e,"**"):this.off(i,e||"**",b6)}});var bp=bI.now();var bQ=(/\?/);var a1=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;bI.parseJSON=function(e){if(a5.JSON&&a5.JSON.parse){return a5.JSON.parse(e+"")}var b7,b6=null,i=bI.trim(e+"");return i&&!bI.trim(i.replace(a1,function(ca,b8,b9,cb){if(b7&&b8){b6=0}if(b6===0){return ca}b7=b9||b8;b6+=!cb-!b9;return""}))?(Function("return "+i))():bI.error("Invalid JSON: "+e)};bI.parseXML=function(b7){var i,b6;if(!b7||typeof b7!=="string"){return null}try{if(a5.DOMParser){b6=new DOMParser();i=b6.parseFromString(b7,"text/xml")}else{i=new ActiveXObject("Microsoft.XMLDOM");i.async="false";i.loadXML(b7)}}catch(b8){i=undefined}if(!i||!i.documentElement||i.getElementsByTagName("parsererror").length){bI.error("Invalid XML: "+b7)}return i};var b4,aa,ap=/#.*$/,R=/([?&])_=[^&]*/,ah=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,C=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,r=/^(?:GET|HEAD)$/,aK=/^\/\//,aV=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,w={},a9={},aX="*/".concat("*");try{aa=location.href}catch(bi){aa=n.createElement("a");aa.href="";aa=aa.href}b4=aV.exec(aa.toLowerCase())||[];function bK(e){return function(b9,ca){if(typeof b9!=="string"){ca=b9;b9="*"}var b6,b7=0,b8=b9.toLowerCase().match(aF)||[];if(bI.isFunction(ca)){while((b6=b8[b7++])){if(b6.charAt(0)==="+"){b6=b6.slice(1)||"*";(e[b6]=e[b6]||[]).unshift(ca)}else{(e[b6]=e[b6]||[]).push(ca)}}}}}function p(e,b6,ca,b7){var i={},b8=(e===a9);function b9(cb){var cc;i[cb]=true;bI.each(e[cb]||[],function(ce,cd){var cf=cd(b6,ca,b7);if(typeof cf==="string"&&!b8&&!i[cf]){b6.dataTypes.unshift(cf);b9(cf);return false}else{if(b8){return !(cc=cf)}}});return cc}return b9(b6.dataTypes[0])||!i["*"]&&b9("*")}function t(b6,b7){var e,i,b8=bI.ajaxSettings.flatOptions||{};for(i in b7){if(b7[i]!==undefined){(b8[i]?b6:(e||(e={})))[i]=b7[i]}}if(e){bI.extend(true,b6,e)}return b6}function g(cc,cb,b8){var e,b7,b6,b9,i=cc.contents,ca=cc.dataTypes;while(ca[0]==="*"){ca.shift();if(b7===undefined){b7=cc.mimeType||cb.getResponseHeader("Content-Type")}}if(b7){for(b9 in i){if(i[b9]&&i[b9].test(b7)){ca.unshift(b9);break}}}if(ca[0] in b8){b6=ca[0]}else{for(b9 in b8){if(!ca[0]||cc.converters[b9+" "+ca[0]]){b6=b9;break}if(!e){e=b9}}b6=b6||e}if(b6){if(b6!==ca[0]){ca.unshift(b6)}return b8[b6]}}function ag(cg,b8,cd,b6){var i,cb,ce,b9,b7,cf={},cc=cg.dataTypes.slice();if(cc[1]){for(ce in cg.converters){cf[ce.toLowerCase()]=cg.converters[ce]}}cb=cc.shift();while(cb){if(cg.responseFields[cb]){cd[cg.responseFields[cb]]=b8}if(!b7&&b6&&cg.dataFilter){b8=cg.dataFilter(b8,cg.dataType)}b7=cb;cb=cc.shift();if(cb){if(cb==="*"){cb=b7}else{if(b7!=="*"&&b7!==cb){ce=cf[b7+" "+cb]||cf["* "+cb];if(!ce){for(i in cf){b9=i.split(" ");if(b9[1]===cb){ce=cf[b7+" "+b9[0]]||cf["* "+b9[0]];if(ce){if(ce===true){ce=cf[i]}else{if(cf[i]!==true){cb=b9[0];cc.unshift(b9[1])}}break}}}}if(ce!==true){if(ce&&cg["throws"]){b8=ce(b8)}else{try{b8=ce(b8)}catch(ca){return{state:"parsererror",error:ce?ca:"No conversion from "+b7+" to "+cb}}}}}}}}return{state:"success",data:b8}}bI.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:aa,type:"GET",isLocal:C.test(b4[1]),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":aX,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":bI.parseJSON,"text xml":bI.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(i,e){return e?t(t(i,bI.ajaxSettings),e):t(bI.ajaxSettings,i)},ajaxPrefilter:bK(w),ajaxTransport:bK(a9),ajax:function(ca,b7){if(typeof ca==="object"){b7=ca;ca=undefined}b7=b7||{};var cj,cl,cb,cq,cf,b6,cm,b8,ce=bI.ajaxSetup({},b7),cs=ce.context||ce,ch=ce.context&&(cs.nodeType||cs.jquery)?bI(cs):bI.event,cr=bI.Deferred(),co=bI.Callbacks("once memory"),cc=ce.statusCode||{},ci={},cp={},b9=0,cd="canceled",ck={readyState:0,getResponseHeader:function(i){var e;if(b9===2){if(!b8){b8={};while((e=ah.exec(cq))){b8[e[1].toLowerCase()]=e[2]}}e=b8[i.toLowerCase()]}return e==null?null:e},getAllResponseHeaders:function(){return b9===2?cq:null},setRequestHeader:function(i,ct){var e=i.toLowerCase();if(!b9){i=cp[e]=cp[e]||i;ci[i]=ct}return this},overrideMimeType:function(e){if(!b9){ce.mimeType=e}return this},statusCode:function(i){var e;if(i){if(b9<2){for(e in i){cc[e]=[cc[e],i[e]]}}else{ck.always(i[ck.status])}}return this},abort:function(i){var e=i||cd;if(cm){cm.abort(e)}cg(0,e);return this}};cr.promise(ck).complete=co.add;ck.success=ck.done;ck.error=ck.fail;ce.url=((ca||ce.url||aa)+"").replace(ap,"").replace(aK,b4[1]+"//");ce.type=b7.method||b7.type||ce.method||ce.type;ce.dataTypes=bI.trim(ce.dataType||"*").toLowerCase().match(aF)||[""];if(ce.crossDomain==null){cj=aV.exec(ce.url.toLowerCase());ce.crossDomain=!!(cj&&(cj[1]!==b4[1]||cj[2]!==b4[2]||(cj[3]||(cj[1]==="http:"?"80":"443"))!==(b4[3]||(b4[1]==="http:"?"80":"443"))))}if(ce.data&&ce.processData&&typeof ce.data!=="string"){ce.data=bI.param(ce.data,ce.traditional)}p(w,ce,b7,ck);if(b9===2){return ck}b6=bI.event&&ce.global;if(b6&&bI.active++===0){bI.event.trigger("ajaxStart")}ce.type=ce.type.toUpperCase();ce.hasContent=!r.test(ce.type);cb=ce.url;if(!ce.hasContent){if(ce.data){cb=(ce.url+=(bQ.test(cb)?"&":"?")+ce.data);delete ce.data}if(ce.cache===false){ce.url=R.test(cb)?cb.replace(R,"$1_="+bp++):cb+(bQ.test(cb)?"&":"?")+"_="+bp++}}if(ce.ifModified){if(bI.lastModified[cb]){ck.setRequestHeader("If-Modified-Since",bI.lastModified[cb])}if(bI.etag[cb]){ck.setRequestHeader("If-None-Match",bI.etag[cb])}}if(ce.data&&ce.hasContent&&ce.contentType!==false||b7.contentType){ck.setRequestHeader("Content-Type",ce.contentType)}ck.setRequestHeader("Accept",ce.dataTypes[0]&&ce.accepts[ce.dataTypes[0]]?ce.accepts[ce.dataTypes[0]]+(ce.dataTypes[0]!=="*"?", "+aX+"; q=0.01":""):ce.accepts["*"]);for(cl in ce.headers){ck.setRequestHeader(cl,ce.headers[cl])}if(ce.beforeSend&&(ce.beforeSend.call(cs,ck,ce)===false||b9===2)){return ck.abort()}cd="abort";for(cl in {success:1,error:1,complete:1}){ck[cl](ce[cl])}cm=p(a9,ce,b7,ck);if(!cm){cg(-1,"No Transport")}else{ck.readyState=1;if(b6){ch.trigger("ajaxSend",[ck,ce])}if(ce.async&&ce.timeout>0){cf=setTimeout(function(){ck.abort("timeout")},ce.timeout)}try{b9=1;cm.send(ci,cg)}catch(cn){if(b9<2){cg(-1,cn)}else{throw cn}}}function cg(cw,i,cx,cu){var e,cA,cy,cv,cz,ct=i;if(b9===2){return}b9=2;if(cf){clearTimeout(cf)}cm=undefined;cq=cu||"";ck.readyState=cw>0?4:0;e=cw>=200&&cw<300||cw===304;if(cx){cv=g(ce,ck,cx)}cv=ag(ce,cv,ck,e);if(e){if(ce.ifModified){cz=ck.getResponseHeader("Last-Modified");if(cz){bI.lastModified[cb]=cz}cz=ck.getResponseHeader("etag");if(cz){bI.etag[cb]=cz}}if(cw===204||ce.type==="HEAD"){ct="nocontent"}else{if(cw===304){ct="notmodified"}else{ct=cv.state;cA=cv.data;cy=cv.error;e=!cy}}}else{cy=ct;if(cw||!ct){ct="error";if(cw<0){cw=0}}}ck.status=cw;ck.statusText=(i||ct)+"";if(e){cr.resolveWith(cs,[cA,ct,ck])}else{cr.rejectWith(cs,[ck,ct,cy])}ck.statusCode(cc);cc=undefined;if(b6){ch.trigger(e?"ajaxSuccess":"ajaxError",[ck,ce,e?cA:cy])}co.fireWith(cs,[ck,ct]);if(b6){ch.trigger("ajaxComplete",[ck,ce]);if(!(--bI.active)){bI.event.trigger("ajaxStop")}}}return ck},getJSON:function(e,i,b6){return bI.get(e,i,b6,"json")},getScript:function(e,i){return bI.get(e,undefined,i,"script")}});bI.each(["get","post"],function(e,b6){bI[b6]=function(i,b8,b9,b7){if(bI.isFunction(b8)){b7=b7||b9;b9=b8;b8=undefined}return bI.ajax({url:i,type:b6,dataType:b7,data:b8,success:b9})}});bI._evalUrl=function(e){return bI.ajax({url:e,type:"GET",dataType:"script",async:false,global:false,"throws":true})};bI.fn.extend({wrapAll:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapAll(e.call(this,b6))})}if(this[0]){var i=bI(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){i.insertBefore(this[0])}i.map(function(){var b6=this;while(b6.firstChild&&b6.firstChild.nodeType===1){b6=b6.firstChild}return b6}).append(this)}return this},wrapInner:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapInner(e.call(this,b6))})}return this.each(function(){var i=bI(this),b6=i.contents();if(b6.length){b6.wrapAll(e)}else{i.append(e)}})},wrap:function(e){var i=bI.isFunction(e);return this.each(function(b6){bI(this).wrapAll(i?e.call(this,b6):e)})},unwrap:function(){return this.parent().each(function(){if(!bI.nodeName(this,"body")){bI(this).replaceWith(this.childNodes)}}).end()}});bI.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||(!D.reliableHiddenOffsets()&&((e.style&&e.style.display)||bI.css(e,"display"))==="none")};bI.expr.filters.visible=function(e){return !bI.expr.filters.hidden(e)};var bw=/%20/g,aS=/\[\]$/,X=/\r?\n/g,b=/^(?:submit|button|image|reset|file)$/i,au=/^(?:input|select|textarea|keygen)/i;function j(b6,b8,i,b7){var e;if(bI.isArray(b8)){bI.each(b8,function(ca,b9){if(i||aS.test(b6)){b7(b6,b9)}else{j(b6+"["+(typeof b9==="object"?ca:"")+"]",b9,i,b7)}})}else{if(!i&&bI.type(b8)==="object"){for(e in b8){j(b6+"["+e+"]",b8[e],i,b7)}}else{b7(b6,b8)}}}bI.param=function(e,b6){var b7,i=[],b8=function(b9,ca){ca=bI.isFunction(ca)?ca():(ca==null?"":ca);i[i.length]=encodeURIComponent(b9)+"="+encodeURIComponent(ca)};if(b6===undefined){b6=bI.ajaxSettings&&bI.ajaxSettings.traditional}if(bI.isArray(e)||(e.jquery&&!bI.isPlainObject(e))){bI.each(e,function(){b8(this.name,this.value)})}else{for(b7 in e){j(b7,e[b7],b6,b8)}}return i.join("&").replace(bw,"+")};bI.fn.extend({serialize:function(){return bI.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=bI.prop(this,"elements");return e?bI.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!bI(this).is(":disabled")&&au.test(this.nodeName)&&!b.test(e)&&(this.checked||!aM.test(e))}).map(function(e,b6){var b7=bI(this).val();return b7==null?null:bI.isArray(b7)?bI.map(b7,function(i){return{name:b6.name,value:i.replace(X,"\r\n")}}):{name:b6.name,value:b7.replace(X,"\r\n")}}).get()}});bI.ajaxSettings.xhr=a5.ActiveXObject!==undefined?function(){return !this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&bE()||bg()}:bE;var aA=0,aj={},ay=bI.ajaxSettings.xhr();if(a5.attachEvent){a5.attachEvent("onunload",function(){for(var e in aj){aj[e](undefined,true)}})}D.cors=!!ay&&("withCredentials" in ay);ay=D.ajax=!!ay;if(ay){bI.ajaxTransport(function(e){if(!e.crossDomain||D.cors){var i;return{send:function(b9,b6){var b7,b8=e.xhr(),ca=++aA;b8.open(e.type,e.url,e.async,e.username,e.password);if(e.xhrFields){for(b7 in e.xhrFields){b8[b7]=e.xhrFields[b7]}}if(e.mimeType&&b8.overrideMimeType){b8.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!b9["X-Requested-With"]){b9["X-Requested-With"]="XMLHttpRequest"}for(b7 in b9){if(b9[b7]!==undefined){b8.setRequestHeader(b7,b9[b7]+"")}}b8.send((e.hasContent&&e.data)||null);i=function(cd,cc){var cb,cg,ce;if(i&&(cc||b8.readyState===4)){delete aj[ca];i=undefined;b8.onreadystatechange=bI.noop;if(cc){if(b8.readyState!==4){b8.abort()}}else{ce={};cb=b8.status;if(typeof b8.responseText==="string"){ce.text=b8.responseText}try{cg=b8.statusText}catch(cf){cg=""}if(!cb&&e.isLocal&&!e.crossDomain){cb=ce.text?200:404}else{if(cb===1223){cb=204}}}}if(ce){b6(cb,cg,ce,b8.getAllResponseHeaders())}};if(!e.async){i()}else{if(b8.readyState===4){setTimeout(i)}else{b8.onreadystatechange=aj[ca]=i}}},abort:function(){if(i){i(undefined,true)}}}}})}function bE(){try{return new a5.XMLHttpRequest()}catch(i){}}function bg(){try{return new a5.ActiveXObject("Microsoft.XMLHTTP")}catch(i){}}bI.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){bI.globalEval(e);return e}}});bI.ajaxPrefilter("script",function(e){if(e.cache===undefined){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});bI.ajaxTransport("script",function(b6){if(b6.crossDomain){var e,i=n.head||bI("head")[0]||n.documentElement;return{send:function(b7,b8){e=n.createElement("script");e.async=true;if(b6.scriptCharset){e.charset=b6.scriptCharset}e.src=b6.url;e.onload=e.onreadystatechange=function(ca,b9){if(b9||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(e.parentNode){e.parentNode.removeChild(e)}e=null;if(!b9){b8(200,"success")}}};i.insertBefore(e,i.firstChild)},abort:function(){if(e){e.onload(undefined,true)}}}}});var bs=[],a8=/(=)\?(?=&|$)|\?\?/;bI.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=bs.pop()||(bI.expando+"_"+(bp++));this[e]=true;return e}});bI.ajaxPrefilter("json jsonp",function(b7,e,b8){var ca,i,b6,b9=b7.jsonp!==false&&(a8.test(b7.url)?"url":typeof b7.data==="string"&&!(b7.contentType||"").indexOf("application/x-www-form-urlencoded")&&a8.test(b7.data)&&"data");if(b9||b7.dataTypes[0]==="jsonp"){ca=b7.jsonpCallback=bI.isFunction(b7.jsonpCallback)?b7.jsonpCallback():b7.jsonpCallback;if(b9){b7[b9]=b7[b9].replace(a8,"$1"+ca)}else{if(b7.jsonp!==false){b7.url+=(bQ.test(b7.url)?"&":"?")+b7.jsonp+"="+ca}}b7.converters["script json"]=function(){if(!b6){bI.error(ca+" was not called")}return b6[0]};b7.dataTypes[0]="json";i=a5[ca];a5[ca]=function(){b6=arguments};b8.always(function(){a5[ca]=i;if(b7[ca]){b7.jsonpCallback=e.jsonpCallback;bs.push(ca)}if(b6&&bI.isFunction(i)){i(b6[0])}b6=i=undefined});return"script"}});bI.parseHTML=function(b8,b6,b7){if(!b8||typeof b8!=="string"){return null}if(typeof b6==="boolean"){b7=b6;b6=false}b6=b6||n;var i=a.exec(b8),e=!b7&&[];if(i){return[b6.createElement(i[1])]}i=bI.buildFragment([b8],b6,e);if(e&&e.length){bI(e).remove()}return bI.merge([],i.childNodes)};var b1=bI.fn.load;bI.fn.load=function(b7,ca,cb){if(typeof b7!=="string"&&b1){return b1.apply(this,arguments)}var e,b6,b8,i=this,b9=b7.indexOf(" ");if(b9>=0){e=bI.trim(b7.slice(b9,b7.length));b7=b7.slice(0,b9)}if(bI.isFunction(ca)){cb=ca;ca=undefined}else{if(ca&&typeof ca==="object"){b8="POST"}}if(i.length>0){bI.ajax({url:b7,type:b8,dataType:"html",data:ca}).done(function(cc){b6=arguments;i.html(e?bI("
    ").append(bI.parseHTML(cc)).find(e):cc)}).complete(cb&&function(cd,cc){i.each(cb,b6||[cd.responseText,cc,cd])})}return this};bI.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,b6){bI.fn[b6]=function(i){return this.on(b6,i)}});bI.expr.filters.animated=function(e){return bI.grep(bI.timers,function(i){return e===i.elem}).length};var bX=a5.document.documentElement;function br(e){return bI.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}bI.offset={setOffset:function(b7,ch,cb){var cd,ca,e,b8,b6,cf,cg,cc=bI.css(b7,"position"),b9=bI(b7),ce={};if(cc==="static"){b7.style.position="relative"}b6=b9.offset();e=bI.css(b7,"top");cf=bI.css(b7,"left");cg=(cc==="absolute"||cc==="fixed")&&bI.inArray("auto",[e,cf])>-1;if(cg){cd=b9.position();b8=cd.top;ca=cd.left}else{b8=parseFloat(e)||0;ca=parseFloat(cf)||0}if(bI.isFunction(ch)){ch=ch.call(b7,cb,b6)}if(ch.top!=null){ce.top=(ch.top-b6.top)+b8}if(ch.left!=null){ce.left=(ch.left-b6.left)+ca}if("using" in ch){ch.using.call(b7,ce)}else{b9.css(ce)}}};bI.fn.extend({offset:function(i){if(arguments.length){return i===undefined?this:this.each(function(ca){bI.offset.setOffset(this,i,ca)})}var e,b9,b7={top:0,left:0},b6=this[0],b8=b6&&b6.ownerDocument;if(!b8){return}e=b8.documentElement;if(!bI.contains(e,b6)){return b7}if(typeof b6.getBoundingClientRect!==aC){b7=b6.getBoundingClientRect()}b9=br(b8);return{top:b7.top+(b9.pageYOffset||e.scrollTop)-(e.clientTop||0),left:b7.left+(b9.pageXOffset||e.scrollLeft)-(e.clientLeft||0)}},position:function(){if(!this[0]){return}var b6,b7,e={top:0,left:0},i=this[0];if(bI.css(i,"position")==="fixed"){b7=i.getBoundingClientRect()}else{b6=this.offsetParent();b7=this.offset();if(!bI.nodeName(b6[0],"html")){e=b6.offset()}e.top+=bI.css(b6[0],"borderTopWidth",true);e.left+=bI.css(b6[0],"borderLeftWidth",true)}return{top:b7.top-e.top-bI.css(i,"marginTop",true),left:b7.left-e.left-bI.css(i,"marginLeft",true)}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||bX;while(e&&(!bI.nodeName(e,"html")&&bI.css(e,"position")==="static")){e=e.offsetParent}return e||bX})}});bI.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b6,i){var e=/Y/.test(i);bI.fn[b6]=function(b7){return aB(this,function(b8,cb,ca){var b9=br(b8);if(ca===undefined){return b9?(i in b9)?b9[i]:b9.document.documentElement[cb]:b8[cb]}if(b9){b9.scrollTo(!e?ca:bI(b9).scrollLeft(),e?ca:bI(b9).scrollTop())}else{b8[cb]=ca}},b6,b7,arguments.length,null)}});bI.each(["top","left"],function(e,b6){bI.cssHooks[b6]=a7(D.pixelPosition,function(b7,i){if(i){i=G(b7,b6);return Y.test(i)?bI(b7).position()[b6]+"px":i}})});bI.each({Height:"height",Width:"width"},function(e,i){bI.each({padding:"inner"+e,content:i,"":"outer"+e},function(b6,b7){bI.fn[b7]=function(cb,ca){var b9=arguments.length&&(b6||typeof cb!=="boolean"),b8=b6||(cb===true||ca===true?"margin":"border");return aB(this,function(cd,cc,ce){var cf;if(bI.isWindow(cd)){return cd.document.documentElement["client"+e]}if(cd.nodeType===9){cf=cd.documentElement;return Math.max(cd.body["scroll"+e],cf["scroll"+e],cd.body["offset"+e],cf["offset"+e],cf["client"+e])}return ce===undefined?bI.css(cd,cc,b8):bI.style(cd,cc,ce,b8)},i,b9?cb:undefined,b9,null)}})});bI.fn.size=function(){return this.length};bI.fn.andSelf=bI.fn.addBack;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return bI})}var bk=a5.jQuery,I=a5.$;bI.noConflict=function(e){if(a5.$===bI){a5.$=I}if(e&&a5.jQuery===bI){a5.jQuery=bk}return bI};if(typeof av===aC){a5.jQuery=a5.$=bI}return bI}));!function(a){a(function(){a.support.transition=(function(){var b=(function(){var e=document.createElement("bootstrap"),d={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in d){if(e.style[c]!==undefined){return d[c]}}}());return b&&{end:b}})()})}(window.jQuery);!function(d){var c='[data-dismiss="alert"]',b=function(e){d(e).on("click",c,this.close)};b.prototype.close=function(j){var i=d(this),g=i.attr("data-target"),h;if(!g){g=i.attr("href");g=g&&g.replace(/.*(?=#[^\s]*$)/,"")}h=d(g);j&&j.preventDefault();h.length||(h=i.hasClass("alert")?i:i.parent());h.trigger(j=d.Event("close"));if(j.isDefaultPrevented()){return}h.removeClass("in");function f(){h.trigger("closed").remove()}d.support.transition&&h.hasClass("fade")?h.on(d.support.transition.end,f):f()};var a=d.fn.alert;d.fn.alert=function(e){return this.each(function(){var g=d(this),f=g.data("alert");if(!f){g.data("alert",(f=new b(this)))}if(typeof e=="string"){f[e].call(g)}})};d.fn.alert.Constructor=b;d.fn.alert.noConflict=function(){d.fn.alert=a;return this};d(document).on("click.alert.data-api",c,b.prototype.close)}(window.jQuery);!function(c){var b=function(e,d){this.$element=c(e);this.options=c.extend({},c.fn.button.defaults,d)};b.prototype.setState=function(g){var i="disabled",e=this.$element,f=e.data(),h=e.is("input")?"val":"html";g=g+"Text";f.resetText||e.data("resetText",e[h]());e[h](f[g]||this.options[g]);setTimeout(function(){g=="loadingText"?e.addClass(i).attr(i,i):e.removeClass(i).removeAttr(i)},0)};b.prototype.toggle=function(){var d=this.$element.closest('[data-toggle="buttons-radio"]');d&&d.find(".active").removeClass("active");this.$element.toggleClass("active")};var a=c.fn.button;c.fn.button=function(d){return this.each(function(){var g=c(this),f=g.data("button"),e=typeof d=="object"&&d;if(!f){g.data("button",(f=new b(this,e)))}if(d=="toggle"){f.toggle()}else{if(d){f.setState(d)}}})};c.fn.button.defaults={loadingText:"loading..."};c.fn.button.Constructor=b;c.fn.button.noConflict=function(){c.fn.button=a;return this};c(document).on("click.button.data-api","[data-toggle^=button]",function(f){var d=c(f.target);if(!d.hasClass("btn")){d=d.closest(".btn")}d.button("toggle")})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.$indicators=this.$element.find(".carousel-indicators");this.options=d;this.options.pause=="hover"&&this.$element.on("mouseenter",b.proxy(this.pause,this)).on("mouseleave",b.proxy(this.cycle,this))};c.prototype={cycle:function(d){if(!d){this.paused=false}if(this.interval){clearInterval(this.interval)}this.options.interval&&!this.paused&&(this.interval=setInterval(b.proxy(this.next,this),this.options.interval));return this},getActiveIndex:function(){this.$active=this.$element.find(".item.active");this.$items=this.$active.parent().children();return this.$items.index(this.$active)},to:function(f){var d=this.getActiveIndex(),e=this;if(f>(this.$items.length-1)||f<0){return}if(this.sliding){return this.$element.one("slid",function(){e.to(f)})}if(d==f){return this.pause().cycle()}return this.slide(f>d?"next":"prev",b(this.$items[f]))},pause:function(d){if(!d){this.paused=true}if(this.$element.find(".next, .prev").length&&b.support.transition.end){this.$element.trigger(b.support.transition.end);this.cycle(true)}clearInterval(this.interval);this.interval=null;return this},next:function(){if(this.sliding){return}return this.slide("next")},prev:function(){if(this.sliding){return}return this.slide("prev")},slide:function(k,f){var m=this.$element.find(".item.active"),d=f||m[k](),j=this.interval,l=k=="next"?"left":"right",g=k=="next"?"first":"last",h=this,i;this.sliding=true;j&&this.pause();d=d.length?d:this.$element.find(".item")[g]();i=b.Event("slide",{relatedTarget:d[0],direction:l});if(d.hasClass("active")){return}if(this.$indicators.length){this.$indicators.find(".active").removeClass("active");this.$element.one("slid",function(){var e=b(h.$indicators.children()[h.getActiveIndex()]);e&&e.addClass("active")})}if(b.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(i);if(i.isDefaultPrevented()){return}d.addClass(k);d[0].offsetWidth;m.addClass(l);d.addClass(l);this.$element.one(b.support.transition.end,function(){d.removeClass([k,l].join(" ")).addClass("active");m.removeClass(["active",l].join(" "));h.sliding=false;setTimeout(function(){h.$element.trigger("slid")},0)})}else{this.$element.trigger(i);if(i.isDefaultPrevented()){return}m.removeClass("active");d.addClass("active");this.sliding=false;this.$element.trigger("slid")}j&&this.cycle();return this}};var a=b.fn.carousel;b.fn.carousel=function(d){return this.each(function(){var h=b(this),g=h.data("carousel"),e=b.extend({},b.fn.carousel.defaults,typeof d=="object"&&d),f=typeof d=="string"?d:e.slide;if(!g){h.data("carousel",(g=new c(this,e)))}if(typeof d=="number"){g.to(d)}else{if(f){g[f]()}else{if(e.interval){g.pause().cycle()}}}})};b.fn.carousel.defaults={interval:5000,pause:"hover"};b.fn.carousel.Constructor=c;b.fn.carousel.noConflict=function(){b.fn.carousel=a;return this};b(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(j){var i=b(this),f,d=b(i.attr("data-target")||(f=i.attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")),g=b.extend({},d.data(),i.data()),h;d.carousel(g);if(h=i.attr("data-slide-to")){d.data("carousel").pause().to(h).cycle()}j.preventDefault()})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.options=b.extend({},b.fn.collapse.defaults,d);if(this.options.parent){this.$parent=b(this.options.parent)}this.options.toggle&&this.toggle()};c.prototype={constructor:c,dimension:function(){var d=this.$element.hasClass("width");return d?"width":"height"},show:function(){var g,d,f,e;if(this.transitioning||this.$element.hasClass("in")){return}g=this.dimension();d=b.camelCase(["scroll",g].join("-"));f=this.$parent&&this.$parent.find("> .accordion-group > .in");if(f&&f.length){e=f.data("collapse");if(e&&e.transitioning){return}f.collapse("hide");e||f.data("collapse",null)}this.$element[g](0);this.transition("addClass",b.Event("show"),"shown");b.support.transition&&this.$element[g](this.$element[0][d])},hide:function(){var d;if(this.transitioning||!this.$element.hasClass("in")){return}d=this.dimension();this.reset(this.$element[d]());this.transition("removeClass",b.Event("hide"),"hidden");this.$element[d](0)},reset:function(d){var e=this.dimension();this.$element.removeClass("collapse")[e](d||"auto")[0].offsetWidth;this.$element[d!==null?"addClass":"removeClass"]("collapse");return this},transition:function(h,e,f){var g=this,d=function(){if(e.type=="show"){g.reset()}g.transitioning=0;g.$element.trigger(f)};this.$element.trigger(e);if(e.isDefaultPrevented()){return}this.transitioning=1;this.$element[h]("in");b.support.transition&&this.$element.hasClass("collapse")?this.$element.one(b.support.transition.end,d):d()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var a=b.fn.collapse;b.fn.collapse=function(d){return this.each(function(){var g=b(this),f=g.data("collapse"),e=b.extend({},b.fn.collapse.defaults,g.data(),typeof d=="object"&&d);if(!f){g.data("collapse",(f=new c(this,e)))}if(typeof d=="string"){f[d]()}})};b.fn.collapse.defaults={toggle:true};b.fn.collapse.Constructor=c;b.fn.collapse.noConflict=function(){b.fn.collapse=a;return this};b(document).on("click.collapse.data-api","[data-toggle=collapse]",function(i){var h=b(this),d,g=h.attr("data-target")||i.preventDefault()||(d=h.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=b(g).data("collapse")?"toggle":h.data();h[b(g).hasClass("in")?"addClass":"removeClass"]("collapsed");b(g).collapse(f)})}(window.jQuery);!function(f){var b="[data-toggle=dropdown]",a=function(h){var g=f(h).on("click.dropdown.data-api",this.toggle);f("html").on("click.dropdown.data-api",function(){g.parent().removeClass("open")})};a.prototype={constructor:a,toggle:function(j){var i=f(this),h,g;if(i.is(".disabled, :disabled")){return}h=e(i);g=h.hasClass("open");d();if(!g){if("ontouchstart" in document.documentElement){f(' diff --git a/dependency-check-cli/project-summary.html b/dependency-check-cli/project-summary.html index 90a9aaae7..cc0ca8bbe 100644 --- a/dependency-check-cli/project-summary.html +++ b/dependency-check-cli/project-summary.html @@ -1,21 +1,21 @@ - + - dependency-check-cli - Project Summary - + dependency-check-cli – Project Summary + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Project Summary

    +

    Project Summary

    -

    Project Information

    +

    Project Information

    @@ -214,7 +221,7 @@
    FieldHomepage https://github.com/jeremylong/DependencyCheck.git/dependency-check-cli
    -

    Project Organization

    +

    Project Organization

    @@ -226,7 +233,7 @@
    FieldURL http://www.owasp.org
    -

    Build Information

    +

    Build Information

    @@ -239,12 +246,12 @@ - + - +
    Fielddependency-check-cli
    Version1.3.0
    1.3.1
    Type jar
    JDK RevJava Version 1.6
    @@ -255,15 +262,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-cli/source-repository.html b/dependency-check-cli/source-repository.html index d02333aeb..10bd79c21 100644 --- a/dependency-check-cli/source-repository.html +++ b/dependency-check-cli/source-repository.html @@ -1,21 +1,21 @@ - + - dependency-check-cli - Source Repository - + dependency-check-cli – Source Repository + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Overview

    -

    This project uses GIT to manage its source code. Instructions on GIT use can be found at http://git-scm.com/documentation.

    +

    Overview

    +

    This project uses Git to manage its source code. Instructions on Git use can be found at http://git-scm.com/documentation.

    -

    Web Access

    -

    The following is a link to the online source repository.

    -
    +

    Web Browser Access

    +

    The following is a link to a browsable version of the source repository:

    +
    -

    Anonymous access

    -

    The source can be checked out anonymously from GIT with this command (See http://git-scm.com/docs/git-clone):

    -
    -
    $ git clone git@github.com:jeremylong/DependencyCheck.git/dependency-check-cli
    +

    Anonymous Access

    +

    The source can be checked out anonymously from Git with this command (See http://git-scm.com/docs/git-clone):

    +
    $ git clone git@github.com:jeremylong/DependencyCheck.git
    -

    Developer access

    -

    Only project developers can access the GIT tree via this method (See http://git-scm.com/docs/git-clone).

    -
    -
    $ git clone git@github.com:jeremylong/DependencyCheck.git/dependency-check-cli
    +

    Developer Access

    +

    Only project developers can access the Git tree via this method (See http://git-scm.com/docs/git-clone).

    +
    $ git clone git@github.com:jeremylong/DependencyCheck.git
    -

    Access from behind a firewall

    +

    Access from Behind a Firewall

    Refer to the documentation of the SCM used for more information about access behind a firewall.

    @@ -226,15 +230,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-cli/surefire-report.html b/dependency-check-cli/surefire-report.html index c8bcaf972..1df721792 100644 --- a/dependency-check-cli/surefire-report.html +++ b/dependency-check-cli/surefire-report.html @@ -1,21 +1,21 @@ - + - dependency-check-cli - Surefire Report - + dependency-check-cli – Surefire Report + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Surefire Report

    +

    Surefire Report

    -

    Summary

    +

    Summary

    [Summary] [Package List] [Test Cases]


    @@ -274,10 +274,10 @@ function toggleDisplay(elementId) { -
    0 0 100%0.522

    +0.343

    Note: failures are anticipated and checked for with assertions while errors are unanticipated.


    -

    Package List

    +

    Package List

    [Summary] [Package List] [Test Cases]


    @@ -295,10 +295,10 @@ function toggleDisplay(elementId) { -
    0 0 100%0.522

    +0.343

    Note: package statistics are not computed recursively, they only sum up all of its testsuites numbers.

    -

    org.owasp.dependencycheck

    +

    org.owasp.dependencycheck

    @@ -317,7 +317,7 @@ function toggleDisplay(elementId) { - + @@ -328,30 +328,30 @@ function toggleDisplay(elementId) {
    0 0 100%0.491
    0.312
    CliParserTest100% 0.031

    -

    Test Cases

    +

    Test Cases

    [Summary] [Package List] [Test Cases]

    -

    AppTest

    +

    AppTest

    - + -
    testEnsureCanonicalPath20.49
    0.312
    testEnsureCanonicalPath0.001
    +0
    -

    CliParserTest

    +

    CliParserTest

    - + - + @@ -363,11 +363,11 @@ function toggleDisplay(elementId) { - + - + @@ -379,7 +379,7 @@ function toggleDisplay(elementId) { -
    testParse_printHelp0.027
    0.031
    testParse_printVersionInfo0.001
    0
    testParse_help
    testParse0.001
    0
    testParse_unknown0.001
    0
    testParse_version
    testParse_scan_withFileExists0.001

    +0

    @@ -389,15 +389,14 @@ function toggleDisplay(elementId) {
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-cli/taglist.html b/dependency-check-cli/taglist.html index 23041b7dc..d6a6ebe0e 100644 --- a/dependency-check-cli/taglist.html +++ b/dependency-check-cli/taglist.html @@ -1,21 +1,21 @@ - + - dependency-check-cli - Tag List report - + dependency-check-cli – Tag List report + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Tag List Report

    +

    Tag List Report

    The following document contains the listing of user tags found in the code. Below is the summary of the occurrences per tag.

    @@ -260,15 +260,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-cli/team-list.html b/dependency-check-cli/team-list.html index b8eb29632..5da9bc47e 100644 --- a/dependency-check-cli/team-list.html +++ b/dependency-check-cli/team-list.html @@ -1,21 +1,21 @@ - + - dependency-check-cli - Team list - + dependency-check-cli – Project Team + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -63,13 +63,13 @@ dependency-check/ -
  • Team list
  • +
  • Project Team
  • -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    The Team

    +

    The Team

    A successful project requires many people to play many roles. Some members write code or documentation, while others are valuable as testers, submitting patches and suggestions.

    The team is comprised of Members and Contributors. Members have direct access to the source of a project and actively evolve the code-base. Contributors improve the project through submission of patches and suggestions to the Members. The number of Contributors to the project is unbounded. Get involved today. All contributions to the project are greatly appreciated.

    -

    Members

    +

    Members

    The following is a list of developers with commit privileges that have directly contributed to the project in one way or another.

    @@ -240,7 +247,7 @@
    https://www.ida.org/ developer
    -

    Contributors

    +

    Contributors

    The following additional people have contributed to this project through the way of suggestions, patches or documentation.

    @@ -252,22 +259,7 @@ -
    Hugo Costa OWASP https://www.owasp.org/logo design
    +logo design
    @@ -277,15 +269,14 @@ window.onLoad = init();
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-cli/xref-test/index.html b/dependency-check-cli/xref-test/index.html index 56eaf87a9..4c5e0e83d 100644 --- a/dependency-check-cli/xref-test/index.html +++ b/dependency-check-cli/xref-test/index.html @@ -4,7 +4,7 @@ - Dependency-Check Command Line 1.3.0 Reference + Dependency-Check Command Line 1.3.1 Reference diff --git a/dependency-check-cli/xref-test/org/owasp/dependencycheck/AppTest.html b/dependency-check-cli/xref-test/org/owasp/dependencycheck/AppTest.html index 8cdc2a417..cd005f3b1 100644 --- a/dependency-check-cli/xref-test/org/owasp/dependencycheck/AppTest.html +++ b/dependency-check-cli/xref-test/org/owasp/dependencycheck/AppTest.html @@ -7,78 +7,80 @@
     1   /*
    -2    * Copyright 2015 OWASP.
    +2    * This file is part of dependency-check-core.
     3    *
     4    * Licensed under the Apache License, Version 2.0 (the "License");
     5    * you may not use this file except in compliance with the License.
     6    * You may obtain a copy of the License at
     7    *
    -8    *      http://www.apache.org/licenses/LICENSE-2.0
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
     9    *
     10   * Unless required by applicable law or agreed to in writing, software
     11   * distributed under the License is distributed on an "AS IS" BASIS,
     12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13   * See the License for the specific language governing permissions and
     14   * limitations under the License.
    -15   */
    -16  package org.owasp.dependencycheck;
    -17  
    -18  import org.junit.After;
    -19  import org.junit.AfterClass;
    -20  import org.junit.Before;
    -21  import org.junit.BeforeClass;
    -22  import org.junit.Test;
    -23  import static org.junit.Assert.*;
    -24  
    -25  /**
    -26   *
    -27   * @author jeremy
    -28   */
    -29  public class AppTest {
    -30  
    -31      public AppTest() {
    -32      }
    -33  
    -34      @BeforeClass
    -35      public static void setUpClass() {
    -36      }
    -37  
    -38      @AfterClass
    -39      public static void tearDownClass() {
    -40      }
    -41  
    -42      @Before
    -43      public void setUp() {
    -44      }
    -45  
    -46      @After
    -47      public void tearDown() {
    -48      }
    -49  
    -50      /**
    -51       * Test of ensureCanonicalPath method, of class App.
    -52       */
    -53      @Test
    -54      public void testEnsureCanonicalPath() {
    -55          String file = "../*.jar";
    -56          App instance = new App();
    -57          String result = instance.ensureCanonicalPath(file);
    -58          assertFalse(result.contains(".."));
    -59          assertTrue(result.endsWith("*.jar"));
    -60      }
    -61  
    -62      /**
    -63       * Test of ensureCanonicalPath method, of class App.
    -64       */
    -65      @Test
    -66      public void testEnsureCanonicalPath2() {
    -67          String file = "../some/skip/../path/file.txt";
    -68          App instance = new App();
    -69          String expResult = "/some/path/file.txt";
    -70          String result = instance.ensureCanonicalPath(file);
    -71          assertTrue("result=" + result, result.endsWith(expResult));
    -72      }
    -73  }
    +15   *
    +16   * Copyright (c) 2015 The OWASP Foundatio. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck;
    +19  
    +20  import org.junit.After;
    +21  import org.junit.AfterClass;
    +22  import org.junit.Before;
    +23  import org.junit.BeforeClass;
    +24  import org.junit.Test;
    +25  import static org.junit.Assert.*;
    +26  
    +27  /**
    +28   *
    +29   * @author jeremy
    +30   */
    +31  public class AppTest {
    +32  
    +33      public AppTest() {
    +34      }
    +35  
    +36      @BeforeClass
    +37      public static void setUpClass() {
    +38      }
    +39  
    +40      @AfterClass
    +41      public static void tearDownClass() {
    +42      }
    +43  
    +44      @Before
    +45      public void setUp() {
    +46      }
    +47  
    +48      @After
    +49      public void tearDown() {
    +50      }
    +51  
    +52      /**
    +53       * Test of ensureCanonicalPath method, of class App.
    +54       */
    +55      @Test
    +56      public void testEnsureCanonicalPath() {
    +57          String file = "../*.jar";
    +58          App instance = new App();
    +59          String result = instance.ensureCanonicalPath(file);
    +60          assertFalse(result.contains(".."));
    +61          assertTrue(result.endsWith("*.jar"));
    +62      }
    +63  
    +64      /**
    +65       * Test of ensureCanonicalPath method, of class App.
    +66       */
    +67      @Test
    +68      public void testEnsureCanonicalPath2() {
    +69          String file = "../some/skip/../path/file.txt";
    +70          App instance = new App();
    +71          String expResult = "/some/path/file.txt";
    +72          String result = instance.ensureCanonicalPath(file);
    +73          assertTrue("result=" + result, result.endsWith(expResult));
    +74      }
    +75  }
     

    diff --git a/dependency-check-cli/xref-test/org/owasp/dependencycheck/package-frame.html b/dependency-check-cli/xref-test/org/owasp/dependencycheck/package-frame.html index 345d098d7..c43920d1c 100644 --- a/dependency-check-cli/xref-test/org/owasp/dependencycheck/package-frame.html +++ b/dependency-check-cli/xref-test/org/owasp/dependencycheck/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Command Line 1.3.0 Reference Package org.owasp.dependencycheck + Dependency-Check Command Line 1.3.1 Reference Package org.owasp.dependencycheck diff --git a/dependency-check-cli/xref-test/org/owasp/dependencycheck/package-summary.html b/dependency-check-cli/xref-test/org/owasp/dependencycheck/package-summary.html index 4739ef5a5..b01dc5397 100644 --- a/dependency-check-cli/xref-test/org/owasp/dependencycheck/package-summary.html +++ b/dependency-check-cli/xref-test/org/owasp/dependencycheck/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Command Line 1.3.0 Reference Package org.owasp.dependencycheck + Dependency-Check Command Line 1.3.1 Reference Package org.owasp.dependencycheck diff --git a/dependency-check-cli/xref-test/overview-frame.html b/dependency-check-cli/xref-test/overview-frame.html index fb39eca17..781dad3e5 100644 --- a/dependency-check-cli/xref-test/overview-frame.html +++ b/dependency-check-cli/xref-test/overview-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Command Line 1.3.0 Reference + Dependency-Check Command Line 1.3.1 Reference diff --git a/dependency-check-cli/xref-test/overview-summary.html b/dependency-check-cli/xref-test/overview-summary.html index 0c575d8cf..2560b61d1 100644 --- a/dependency-check-cli/xref-test/overview-summary.html +++ b/dependency-check-cli/xref-test/overview-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Command Line 1.3.0 Reference + Dependency-Check Command Line 1.3.1 Reference @@ -24,7 +24,7 @@ -

    Dependency-Check Command Line 1.3.0 Reference

    +

    Dependency-Check Command Line 1.3.1 Reference

    diff --git a/dependency-check-cli/xref/index.html b/dependency-check-cli/xref/index.html index 56eaf87a9..4c5e0e83d 100644 --- a/dependency-check-cli/xref/index.html +++ b/dependency-check-cli/xref/index.html @@ -4,7 +4,7 @@ - Dependency-Check Command Line 1.3.0 Reference + Dependency-Check Command Line 1.3.1 Reference diff --git a/dependency-check-cli/xref/org/owasp/dependencycheck/App.html b/dependency-check-cli/xref/org/owasp/dependencycheck/App.html index 91299d2d8..95406627f 100644 --- a/dependency-check-cli/xref/org/owasp/dependencycheck/App.html +++ b/dependency-check-cli/xref/org/owasp/dependencycheck/App.html @@ -39,7 +39,7 @@ 31import org.owasp.dependencycheck.data.nvdcve.DatabaseException; 32import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties; 33import org.owasp.dependencycheck.dependency.Dependency; -34import org.owasp.dependencycheck.org.apache.tools.ant.DirectoryScanner; +34import org.apache.tools.ant.DirectoryScanner; 35import org.owasp.dependencycheck.reporting.ReportGenerator; 36import org.owasp.dependencycheck.utils.Settings; 37import org.slf4j.Logger; @@ -98,365 +98,380 @@ 90 prepareLogger(cli.getVerboseLog()); 91 } 92 -93if (cli.isGetVersion()) { -94 cli.printVersionInfo(); -95 } elseif (cli.isUpdateOnly()) { -96 populateSettings(cli); -97 runUpdateOnly(); -98 } elseif (cli.isRunScan()) { -99 populateSettings(cli); -100try { -101 runScan(cli.getReportDirectory(), cli.getReportFormat(), cli.getApplicationName(), cli.getScanFiles(), -102 cli.getExcludeList(), cli.getSymLinkDepth()); -103 } catch (InvalidScanPathException ex) { -104 LOGGER.error("An invalid scan path was detected; unable to scan '//*' paths"); -105 } -106 } else { -107 cli.printHelp(); -108 } -109 } -110 -111/** -112 * Scans the specified directories and writes the dependency reports to the reportDirectory. -113 * -114 * @param reportDirectory the path to the directory where the reports will be written -115 * @param outputFormat the output format of the report -116 * @param applicationName the application name for the report -117 * @param files the files/directories to scan -118 * @param excludes the patterns for files/directories to exclude -119 * @param symLinkDepth the depth that symbolic links will be followed -120 * -121 * @throws InvalidScanPathException thrown if the path to scan starts with "//" -122 */ -123privatevoid runScan(String reportDirectory, String outputFormat, String applicationName, String[] files, -124 String[] excludes, int symLinkDepth) throws InvalidScanPathException { -125 Engine engine = null; -126try { -127 engine = new Engine(); -128final List<String> antStylePaths = new ArrayList<String>(); -129for (String file : files) { -130final String antPath = ensureCanonicalPath(file); -131 antStylePaths.add(antPath); -132 } -133 -134final Set<File> paths = new HashSet<File>(); -135for (String file : antStylePaths) { -136 LOGGER.debug("Scanning {}", file); -137final DirectoryScanner scanner = new DirectoryScanner(); -138 String include = file.replace('\\', '/'); -139 File baseDir; -140 -141if (include.startsWith("//")) { -142thrownewInvalidScanPathException("Unable to scan paths specified by //"); -143 } else { -144finalint pos = getLastFileSeparator(include); -145final String tmpBase = include.substring(0, pos); -146final String tmpInclude = include.substring(pos + 1); -147if (tmpInclude.indexOf('*') >= 0 || tmpInclude.indexOf('?') >= 0 -148 || (new File(include)).isFile()) { -149 baseDir = new File(tmpBase); -150 include = tmpInclude; -151 } else { -152 baseDir = new File(tmpBase, tmpInclude); -153 include = "**/*"; -154 } -155 } -156//LOGGER.debug("baseDir: {}", baseDir); -157//LOGGER.debug("include: {}", include); -158 scanner.setBasedir(baseDir); -159 scanner.setIncludes(include); -160 scanner.setMaxLevelsOfSymlinks(symLinkDepth); -161if (symLinkDepth <= 0) { -162 scanner.setFollowSymlinks(false); -163 } -164if (excludes != null && excludes.length > 0) { -165 scanner.addExcludes(excludes); -166 } -167 scanner.scan(); -168if (scanner.getIncludedFilesCount() > 0) { -169for (String s : scanner.getIncludedFiles()) { -170final File f = new File(baseDir, s); -171 LOGGER.debug("Found file {}", f.toString()); -172 paths.add(f); -173 } -174 } -175 } -176 engine.scan(paths); -177 -178 engine.analyzeDependencies(); -179final List<Dependency> dependencies = engine.getDependencies(); -180 DatabaseProperties prop = null; -181 CveDB cve = null; -182try { -183 cve = new CveDB(); -184 cve.open(); -185 prop = cve.getDatabaseProperties(); -186 } catch (DatabaseException ex) { -187 LOGGER.debug("Unable to retrieve DB Properties", ex); -188 } finally { -189if (cve != null) { -190 cve.close(); -191 } -192 } -193final ReportGenerator report = new ReportGenerator(applicationName, dependencies, engine.getAnalyzers(), prop); -194try { -195 report.generateReports(reportDirectory, outputFormat); -196 } catch (IOException ex) { -197 LOGGER.error("There was an IO error while attempting to generate the report."); -198 LOGGER.debug("", ex); -199 } catch (Throwable ex) { -200 LOGGER.error("There was an error while attempting to generate the report."); -201 LOGGER.debug("", ex); -202 } -203 } catch (DatabaseException ex) { -204 LOGGER.error("Unable to connect to the dependency-check database; analysis has stopped"); -205 LOGGER.debug("", ex); -206 } finally { -207if (engine != null) { -208 engine.cleanup(); -209 } -210 } -211 } -212 -213/** -214 * Only executes the update phase of dependency-check. -215 */ -216privatevoid runUpdateOnly() { -217 Engine engine = null; -218try { -219 engine = new Engine(); -220 engine.doUpdates(); -221 } catch (DatabaseException ex) { -222 LOGGER.error("Unable to connect to the dependency-check database; analysis has stopped"); -223 LOGGER.debug("", ex); -224 } finally { -225if (engine != null) { -226 engine.cleanup(); -227 } -228 } -229 } -230 -231/** -232 * Updates the global Settings. -233 * -234 * @param cli a reference to the CLI Parser that contains the command line arguments used to set the corresponding settings in -235 * the core engine. -236 */ -237privatevoid populateSettings(CliParser cli) { -238 -239finalboolean autoUpdate = cli.isAutoUpdate(); -240final String connectionTimeout = cli.getConnectionTimeout(); -241final String proxyServer = cli.getProxyServer(); -242final String proxyPort = cli.getProxyPort(); -243final String proxyUser = cli.getProxyUsername(); -244final String proxyPass = cli.getProxyPassword(); -245final String dataDirectory = cli.getDataDirectory(); -246final File propertiesFile = cli.getPropertiesFile(); -247final String suppressionFile = cli.getSuppressionFile(); -248finalboolean jarDisabled = cli.isJarDisabled(); -249finalboolean archiveDisabled = cli.isArchiveDisabled(); -250finalboolean pyDistDisabled = cli.isPythonDistributionDisabled(); -251finalboolean cMakeDisabled = cli.isCmakeDisabled(); -252finalboolean pyPkgDisabled = cli.isPythonPackageDisabled(); -253finalboolean autoconfDisabled = cli.isAutoconfDisabled(); -254finalboolean assemblyDisabled = cli.isAssemblyDisabled(); -255finalboolean nuspecDisabled = cli.isNuspecDisabled(); -256finalboolean centralDisabled = cli.isCentralDisabled(); -257finalboolean nexusDisabled = cli.isNexusDisabled(); -258final String nexusUrl = cli.getNexusUrl(); -259final String databaseDriverName = cli.getDatabaseDriverName(); -260final String databaseDriverPath = cli.getDatabaseDriverPath(); -261final String connectionString = cli.getConnectionString(); -262final String databaseUser = cli.getDatabaseUser(); -263final String databasePassword = cli.getDatabasePassword(); -264final String additionalZipExtensions = cli.getAdditionalZipExtensions(); -265final String pathToMono = cli.getPathToMono(); -266final String cveMod12 = cli.getModifiedCve12Url(); -267final String cveMod20 = cli.getModifiedCve20Url(); -268final String cveBase12 = cli.getBaseCve12Url(); -269final String cveBase20 = cli.getBaseCve20Url(); -270 -271if (propertiesFile != null) { -272try { -273 Settings.mergeProperties(propertiesFile); -274 } catch (FileNotFoundException ex) { -275 LOGGER.error("Unable to load properties file '{}'", propertiesFile.getPath()); -276 LOGGER.debug("", ex); -277 } catch (IOException ex) { -278 LOGGER.error("Unable to find properties file '{}'", propertiesFile.getPath()); -279 LOGGER.debug("", ex); -280 } -281 } -282// We have to wait until we've merged the properties before attempting to set whether we use -283// the proxy for Nexus since it could be disabled in the properties, but not explicitly stated -284// on the command line -285finalboolean nexusUsesProxy = cli.isNexusUsesProxy(); -286if (dataDirectory != null) { -287 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDirectory); -288 } elseif (System.getProperty("basedir") != null) { -289final File dataDir = new File(System.getProperty("basedir"), "data"); -290 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath()); -291 } else { -292final File jarPath = new File(App.class.getProtectionDomain().getCodeSource().getLocation().getPath()); -293final File base = jarPath.getParentFile(); -294final String sub = Settings.getString(Settings.KEYS.DATA_DIRECTORY); -295final File dataDir = new File(base, sub); -296 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath()); -297 } -298 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, autoUpdate); -299if (proxyServer != null && !proxyServer.isEmpty()) { -300 Settings.setString(Settings.KEYS.PROXY_SERVER, proxyServer); -301 } -302if (proxyPort != null && !proxyPort.isEmpty()) { -303 Settings.setString(Settings.KEYS.PROXY_PORT, proxyPort); -304 } -305if (proxyUser != null && !proxyUser.isEmpty()) { -306 Settings.setString(Settings.KEYS.PROXY_USERNAME, proxyUser); -307 } -308if (proxyPass != null && !proxyPass.isEmpty()) { -309 Settings.setString(Settings.KEYS.PROXY_PASSWORD, proxyPass); -310 } -311if (connectionTimeout != null && !connectionTimeout.isEmpty()) { -312 Settings.setString(Settings.KEYS.CONNECTION_TIMEOUT, connectionTimeout); +93if (cli.isPurge()) { +94if (cli.getConnectionString() != null) { +95 LOGGER.error("Unable to purge the database when using a non-default connection string"); +96 } else { +97 populateSettings(cli); +98 File db; +99try { +100 db = new File(Settings.getDataDirectory(), "dc.h2.db"); +101if (db.exists()) { +102if (db.delete()) { +103 LOGGER.info("Database file purged; local copy of the NVD has been removed"); +104 } else { +105 LOGGER.error("Unable to delete '{}'; please delete the file manually", db.getAbsolutePath()); +106 } +107 } else { +108 LOGGER.error("Unable to purge database; the database file does not exists: {}", db.getAbsolutePath()); +109 } +110 } catch (IOException ex) { +111 LOGGER.error("Unable to delete the database"); +112 } +113 } +114 } elseif (cli.isGetVersion()) { +115 cli.printVersionInfo(); +116 } elseif (cli.isUpdateOnly()) { +117 populateSettings(cli); +118 runUpdateOnly(); +119 } elseif (cli.isRunScan()) { +120 populateSettings(cli); +121try { +122 runScan(cli.getReportDirectory(), cli.getReportFormat(), cli.getProjectName(), cli.getScanFiles(), +123 cli.getExcludeList(), cli.getSymLinkDepth()); +124 } catch (InvalidScanPathException ex) { +125 LOGGER.error("An invalid scan path was detected; unable to scan '//*' paths"); +126 } +127 } else { +128 cli.printHelp(); +129 } +130 } +131 +132/** +133 * Scans the specified directories and writes the dependency reports to the reportDirectory. +134 * +135 * @param reportDirectory the path to the directory where the reports will be written +136 * @param outputFormat the output format of the report +137 * @param applicationName the application name for the report +138 * @param files the files/directories to scan +139 * @param excludes the patterns for files/directories to exclude +140 * @param symLinkDepth the depth that symbolic links will be followed +141 * +142 * @throws InvalidScanPathException thrown if the path to scan starts with "//" +143 */ +144privatevoid runScan(String reportDirectory, String outputFormat, String applicationName, String[] files, +145 String[] excludes, int symLinkDepth) throws InvalidScanPathException { +146 Engine engine = null; +147try { +148 engine = new Engine(); +149final List<String> antStylePaths = new ArrayList<String>(); +150for (String file : files) { +151final String antPath = ensureCanonicalPath(file); +152 antStylePaths.add(antPath); +153 } +154 +155final Set<File> paths = new HashSet<File>(); +156for (String file : antStylePaths) { +157 LOGGER.debug("Scanning {}", file); +158final DirectoryScanner scanner = new DirectoryScanner(); +159 String include = file.replace('\\', '/'); +160 File baseDir; +161 +162if (include.startsWith("//")) { +163thrownewInvalidScanPathException("Unable to scan paths specified by //"); +164 } else { +165finalint pos = getLastFileSeparator(include); +166final String tmpBase = include.substring(0, pos); +167final String tmpInclude = include.substring(pos + 1); +168if (tmpInclude.indexOf('*') >= 0 || tmpInclude.indexOf('?') >= 0 +169 || (new File(include)).isFile()) { +170 baseDir = new File(tmpBase); +171 include = tmpInclude; +172 } else { +173 baseDir = new File(tmpBase, tmpInclude); +174 include = "**/*"; +175 } +176 } +177//LOGGER.debug("baseDir: {}", baseDir); +178//LOGGER.debug("include: {}", include); +179 scanner.setBasedir(baseDir); +180final String[] includes = {include}; +181 scanner.setIncludes(includes); +182 scanner.setMaxLevelsOfSymlinks(symLinkDepth); +183if (symLinkDepth <= 0) { +184 scanner.setFollowSymlinks(false); +185 } +186if (excludes != null && excludes.length > 0) { +187 scanner.addExcludes(excludes); +188 } +189 scanner.scan(); +190if (scanner.getIncludedFilesCount() > 0) { +191for (String s : scanner.getIncludedFiles()) { +192final File f = new File(baseDir, s); +193 LOGGER.debug("Found file {}", f.toString()); +194 paths.add(f); +195 } +196 } +197 } +198 engine.scan(paths); +199 +200 engine.analyzeDependencies(); +201final List<Dependency> dependencies = engine.getDependencies(); +202 DatabaseProperties prop = null; +203 CveDB cve = null; +204try { +205 cve = new CveDB(); +206 cve.open(); +207 prop = cve.getDatabaseProperties(); +208 } catch (DatabaseException ex) { +209 LOGGER.debug("Unable to retrieve DB Properties", ex); +210 } finally { +211if (cve != null) { +212 cve.close(); +213 } +214 } +215final ReportGenerator report = new ReportGenerator(applicationName, dependencies, engine.getAnalyzers(), prop); +216try { +217 report.generateReports(reportDirectory, outputFormat); +218 } catch (IOException ex) { +219 LOGGER.error("There was an IO error while attempting to generate the report."); +220 LOGGER.debug("", ex); +221 } catch (Throwable ex) { +222 LOGGER.error("There was an error while attempting to generate the report."); +223 LOGGER.debug("", ex); +224 } +225 } catch (DatabaseException ex) { +226 LOGGER.error("Unable to connect to the dependency-check database; analysis has stopped"); +227 LOGGER.debug("", ex); +228 } finally { +229if (engine != null) { +230 engine.cleanup(); +231 } +232 } +233 } +234 +235/** +236 * Only executes the update phase of dependency-check. +237 */ +238privatevoid runUpdateOnly() { +239 Engine engine = null; +240try { +241 engine = new Engine(); +242 engine.doUpdates(); +243 } catch (DatabaseException ex) { +244 LOGGER.error("Unable to connect to the dependency-check database; analysis has stopped"); +245 LOGGER.debug("", ex); +246 } finally { +247if (engine != null) { +248 engine.cleanup(); +249 } +250 } +251 } +252 +253/** +254 * Updates the global Settings. +255 * +256 * @param cli a reference to the CLI Parser that contains the command line arguments used to set the corresponding settings in +257 * the core engine. +258 */ +259privatevoid populateSettings(CliParser cli) { +260 +261finalboolean autoUpdate = cli.isAutoUpdate(); +262final String connectionTimeout = cli.getConnectionTimeout(); +263final String proxyServer = cli.getProxyServer(); +264final String proxyPort = cli.getProxyPort(); +265final String proxyUser = cli.getProxyUsername(); +266final String proxyPass = cli.getProxyPassword(); +267final String dataDirectory = cli.getDataDirectory(); +268final File propertiesFile = cli.getPropertiesFile(); +269final String suppressionFile = cli.getSuppressionFile(); +270final String nexusUrl = cli.getNexusUrl(); +271final String databaseDriverName = cli.getDatabaseDriverName(); +272final String databaseDriverPath = cli.getDatabaseDriverPath(); +273final String connectionString = cli.getConnectionString(); +274final String databaseUser = cli.getDatabaseUser(); +275final String databasePassword = cli.getDatabasePassword(); +276final String additionalZipExtensions = cli.getAdditionalZipExtensions(); +277final String pathToMono = cli.getPathToMono(); +278final String cveMod12 = cli.getModifiedCve12Url(); +279final String cveMod20 = cli.getModifiedCve20Url(); +280final String cveBase12 = cli.getBaseCve12Url(); +281final String cveBase20 = cli.getBaseCve20Url(); +282 +283if (propertiesFile != null) { +284try { +285 Settings.mergeProperties(propertiesFile); +286 } catch (FileNotFoundException ex) { +287 LOGGER.error("Unable to load properties file '{}'", propertiesFile.getPath()); +288 LOGGER.debug("", ex); +289 } catch (IOException ex) { +290 LOGGER.error("Unable to find properties file '{}'", propertiesFile.getPath()); +291 LOGGER.debug("", ex); +292 } +293 } +294// We have to wait until we've merged the properties before attempting to set whether we use +295// the proxy for Nexus since it could be disabled in the properties, but not explicitly stated +296// on the command line +297finalboolean nexusUsesProxy = cli.isNexusUsesProxy(); +298if (dataDirectory != null) { +299 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDirectory); +300 } elseif (System.getProperty("basedir") != null) { +301final File dataDir = new File(System.getProperty("basedir"), "data"); +302 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath()); +303 } else { +304final File jarPath = new File(App.class.getProtectionDomain().getCodeSource().getLocation().getPath()); +305final File base = jarPath.getParentFile(); +306final String sub = Settings.getString(Settings.KEYS.DATA_DIRECTORY); +307final File dataDir = new File(base, sub); +308 Settings.setString(Settings.KEYS.DATA_DIRECTORY, dataDir.getAbsolutePath()); +309 } +310 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, autoUpdate); +311if (proxyServer != null && !proxyServer.isEmpty()) { +312 Settings.setString(Settings.KEYS.PROXY_SERVER, proxyServer); 313 } -314if (suppressionFile != null && !suppressionFile.isEmpty()) { -315 Settings.setString(Settings.KEYS.SUPPRESSION_FILE, suppressionFile); +314if (proxyPort != null && !proxyPort.isEmpty()) { +315 Settings.setString(Settings.KEYS.PROXY_PORT, proxyPort); 316 } -317 -318//File Type Analyzer Settings -319 Settings.setBoolean(Settings.KEYS.ANALYZER_JAR_ENABLED, !jarDisabled); -320 Settings.setBoolean(Settings.KEYS.ANALYZER_ARCHIVE_ENABLED, !archiveDisabled); -321 Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED, !pyDistDisabled); -322 Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_PACKAGE_ENABLED, !pyPkgDisabled); -323 Settings.setBoolean(Settings.KEYS.ANALYZER_AUTOCONF_ENABLED, !autoconfDisabled); -324 Settings.setBoolean(Settings.KEYS.ANALYZER_CMAKE_ENABLED, !cMakeDisabled); -325 Settings.setBoolean(Settings.KEYS.ANALYZER_NUSPEC_ENABLED, !nuspecDisabled); -326 Settings.setBoolean(Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED, !assemblyDisabled); -327 Settings.setBoolean(Settings.KEYS.ANALYZER_OPENSSL_ENABLED, !cli.isOpenSSLDisabled()); -328 -329 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, !centralDisabled); -330 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, !nexusDisabled); -331if (nexusUrl != null && !nexusUrl.isEmpty()) { -332 Settings.setString(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl); -333 } -334 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_PROXY, nexusUsesProxy); -335if (databaseDriverName != null && !databaseDriverName.isEmpty()) { -336 Settings.setString(Settings.KEYS.DB_DRIVER_NAME, databaseDriverName); -337 } -338if (databaseDriverPath != null && !databaseDriverPath.isEmpty()) { -339 Settings.setString(Settings.KEYS.DB_DRIVER_PATH, databaseDriverPath); -340 } -341if (connectionString != null && !connectionString.isEmpty()) { -342 Settings.setString(Settings.KEYS.DB_CONNECTION_STRING, connectionString); -343 } -344if (databaseUser != null && !databaseUser.isEmpty()) { -345 Settings.setString(Settings.KEYS.DB_USER, databaseUser); -346 } -347if (databasePassword != null && !databasePassword.isEmpty()) { -348 Settings.setString(Settings.KEYS.DB_PASSWORD, databasePassword); -349 } -350if (additionalZipExtensions != null && !additionalZipExtensions.isEmpty()) { -351 Settings.setString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS, additionalZipExtensions); +317if (proxyUser != null && !proxyUser.isEmpty()) { +318 Settings.setString(Settings.KEYS.PROXY_USERNAME, proxyUser); +319 } +320if (proxyPass != null && !proxyPass.isEmpty()) { +321 Settings.setString(Settings.KEYS.PROXY_PASSWORD, proxyPass); +322 } +323if (connectionTimeout != null && !connectionTimeout.isEmpty()) { +324 Settings.setString(Settings.KEYS.CONNECTION_TIMEOUT, connectionTimeout); +325 } +326if (suppressionFile != null && !suppressionFile.isEmpty()) { +327 Settings.setString(Settings.KEYS.SUPPRESSION_FILE, suppressionFile); +328 } +329 +330//File Type Analyzer Settings +331 Settings.setBoolean(Settings.KEYS.ANALYZER_JAR_ENABLED, !cli.isJarDisabled()); +332 Settings.setBoolean(Settings.KEYS.ANALYZER_ARCHIVE_ENABLED, !cli.isArchiveDisabled()); +333 Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED, !cli.isPythonDistributionDisabled()); +334 Settings.setBoolean(Settings.KEYS.ANALYZER_PYTHON_PACKAGE_ENABLED, !cli.isPythonPackageDisabled()); +335 Settings.setBoolean(Settings.KEYS.ANALYZER_AUTOCONF_ENABLED, !cli.isAutoconfDisabled()); +336 Settings.setBoolean(Settings.KEYS.ANALYZER_CMAKE_ENABLED, !cli.isCmakeDisabled()); +337 Settings.setBoolean(Settings.KEYS.ANALYZER_NUSPEC_ENABLED, !cli.isNuspecDisabled()); +338 Settings.setBoolean(Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED, !cli.isAssemblyDisabled()); +339 Settings.setBoolean(Settings.KEYS.ANALYZER_OPENSSL_ENABLED, !cli.isOpenSSLDisabled()); +340 Settings.setBoolean(Settings.KEYS.ANALYZER_COMPOSER_LOCK_ENABLED, !cli.isComposerDisabled()); +341 Settings.setBoolean(Settings.KEYS.ANALYZER_NODE_PACKAGE_ENABLED, !cli.isNodeJsDisabled()); +342 Settings.setBoolean(Settings.KEYS.ANALYZER_RUBY_GEMSPEC_ENABLED, !cli.isRubyGemspecDisabled()); +343 +344 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, !cli.isCentralDisabled()); +345 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, !cli.isNexusDisabled()); +346if (nexusUrl != null && !nexusUrl.isEmpty()) { +347 Settings.setString(Settings.KEYS.ANALYZER_NEXUS_URL, nexusUrl); +348 } +349 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_PROXY, nexusUsesProxy); +350if (databaseDriverName != null && !databaseDriverName.isEmpty()) { +351 Settings.setString(Settings.KEYS.DB_DRIVER_NAME, databaseDriverName); 352 } -353if (pathToMono != null && !pathToMono.isEmpty()) { -354 Settings.setString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH, pathToMono); +353if (databaseDriverPath != null && !databaseDriverPath.isEmpty()) { +354 Settings.setString(Settings.KEYS.DB_DRIVER_PATH, databaseDriverPath); 355 } -356if (cveBase12 != null && !cveBase12.isEmpty()) { -357 Settings.setString(Settings.KEYS.CVE_SCHEMA_1_2, cveBase12); -358 Settings.setString(Settings.KEYS.CVE_SCHEMA_2_0, cveBase20); -359 Settings.setString(Settings.KEYS.CVE_MODIFIED_12_URL, cveMod12); -360 Settings.setString(Settings.KEYS.CVE_MODIFIED_20_URL, cveMod20); +356if (connectionString != null && !connectionString.isEmpty()) { +357 Settings.setString(Settings.KEYS.DB_CONNECTION_STRING, connectionString); +358 } +359if (databaseUser != null && !databaseUser.isEmpty()) { +360 Settings.setString(Settings.KEYS.DB_USER, databaseUser); 361 } -362 } -363 -364/** -365 * Creates a file appender and adds it to logback. -366 * -367 * @param verboseLog the path to the verbose log file -368 */ -369privatevoid prepareLogger(String verboseLog) { -370final StaticLoggerBinder loggerBinder = StaticLoggerBinder.getSingleton(); -371final LoggerContext context = (LoggerContext) loggerBinder.getLoggerFactory(); -372 -373final PatternLayoutEncoder encoder = new PatternLayoutEncoder(); -374 encoder.setPattern("%d %C:%L%n%-5level - %msg%n"); -375 encoder.setContext(context); -376 encoder.start(); -377final FileAppender fa = new FileAppender(); -378 fa.setAppend(true); -379 fa.setEncoder(encoder); -380 fa.setContext(context); -381 fa.setFile(verboseLog); -382final File f = new File(verboseLog); -383 String name = f.getName(); -384finalint i = name.lastIndexOf('.'); -385if (i > 1) { -386 name = name.substring(0, i); -387 } -388 fa.setName(name); -389 fa.start(); -390final ch.qos.logback.classic.Logger rootLogger = context.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME); -391 rootLogger.addAppender(fa); -392 } -393 -394/** -395 * Takes a path and resolves it to be a canonical & absolute path. The caveats are that this method will take an Ant style -396 * file selector path (../someDir/**\/*.jar) and convert it to an absolute/canonical path (at least to the left of the first * -397 * or ?). -398 * -399 * @param path the path to canonicalize -400 * @return the canonical path -401 */ -402protected String ensureCanonicalPath(String path) { -403 String basePath = null; -404 String wildCards = null; -405final String file = path.replace('\\', '/'); -406if (file.contains("*") || file.contains("?")) { -407 -408int pos = getLastFileSeparator(file); -409if (pos < 0) { -410return file; -411 } -412 pos += 1; -413 basePath = file.substring(0, pos); -414 wildCards = file.substring(pos); -415 } else { -416 basePath = file; -417 } -418 -419 File f = new File(basePath); -420try { -421 f = f.getCanonicalFile(); -422if (wildCards != null) { -423 f = new File(f, wildCards); -424 } -425 } catch (IOException ex) { -426 LOGGER.warn("Invalid path '{}' was provided.", path); -427 LOGGER.debug("Invalid path provided", ex); -428 } -429return f.getAbsolutePath().replace('\\', '/'); -430 } -431 -432/** -433 * Returns the position of the last file separator. -434 * -435 * @param file a file path -436 * @return the position of the last file separator -437 */ -438privateint getLastFileSeparator(String file) { -439if (file.contains("*") || file.contains("?")) { -440int p1 = file.indexOf('*'); -441int p2 = file.indexOf('?'); -442 p1 = p1 > 0 ? p1 : file.length(); -443 p2 = p2 > 0 ? p2 : file.length(); -444int pos = p1 < p2 ? p1 : p2; -445 pos = file.lastIndexOf('/', pos); -446return pos; -447 } else { -448return file.lastIndexOf('/'); -449 } -450 } -451 } +362if (databasePassword != null && !databasePassword.isEmpty()) { +363 Settings.setString(Settings.KEYS.DB_PASSWORD, databasePassword); +364 } +365if (additionalZipExtensions != null && !additionalZipExtensions.isEmpty()) { +366 Settings.setString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS, additionalZipExtensions); +367 } +368if (pathToMono != null && !pathToMono.isEmpty()) { +369 Settings.setString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH, pathToMono); +370 } +371if (cveBase12 != null && !cveBase12.isEmpty()) { +372 Settings.setString(Settings.KEYS.CVE_SCHEMA_1_2, cveBase12); +373 Settings.setString(Settings.KEYS.CVE_SCHEMA_2_0, cveBase20); +374 Settings.setString(Settings.KEYS.CVE_MODIFIED_12_URL, cveMod12); +375 Settings.setString(Settings.KEYS.CVE_MODIFIED_20_URL, cveMod20); +376 } +377 } +378 +379/** +380 * Creates a file appender and adds it to logback. +381 * +382 * @param verboseLog the path to the verbose log file +383 */ +384privatevoid prepareLogger(String verboseLog) { +385final StaticLoggerBinder loggerBinder = StaticLoggerBinder.getSingleton(); +386final LoggerContext context = (LoggerContext) loggerBinder.getLoggerFactory(); +387 +388final PatternLayoutEncoder encoder = new PatternLayoutEncoder(); +389 encoder.setPattern("%d %C:%L%n%-5level - %msg%n"); +390 encoder.setContext(context); +391 encoder.start(); +392final FileAppender fa = new FileAppender(); +393 fa.setAppend(true); +394 fa.setEncoder(encoder); +395 fa.setContext(context); +396 fa.setFile(verboseLog); +397final File f = new File(verboseLog); +398 String name = f.getName(); +399finalint i = name.lastIndexOf('.'); +400if (i > 1) { +401 name = name.substring(0, i); +402 } +403 fa.setName(name); +404 fa.start(); +405final ch.qos.logback.classic.Logger rootLogger = context.getLogger(ch.qos.logback.classic.Logger.ROOT_LOGGER_NAME); +406 rootLogger.addAppender(fa); +407 } +408 +409/** +410 * Takes a path and resolves it to be a canonical &amp; absolute path. The caveats are that this method will take an Ant style +411 * file selector path (../someDir/**\/*.jar) and convert it to an absolute/canonical path (at least to the left of the first * +412 * or ?). +413 * +414 * @param path the path to canonicalize +415 * @return the canonical path +416 */ +417protected String ensureCanonicalPath(String path) { +418 String basePath = null; +419 String wildCards = null; +420final String file = path.replace('\\', '/'); +421if (file.contains("*") || file.contains("?")) { +422 +423int pos = getLastFileSeparator(file); +424if (pos < 0) { +425return file; +426 } +427 pos += 1; +428 basePath = file.substring(0, pos); +429 wildCards = file.substring(pos); +430 } else { +431 basePath = file; +432 } +433 +434 File f = new File(basePath); +435try { +436 f = f.getCanonicalFile(); +437if (wildCards != null) { +438 f = new File(f, wildCards); +439 } +440 } catch (IOException ex) { +441 LOGGER.warn("Invalid path '{}' was provided.", path); +442 LOGGER.debug("Invalid path provided", ex); +443 } +444return f.getAbsolutePath().replace('\\', '/'); +445 } +446 +447/** +448 * Returns the position of the last file separator. +449 * +450 * @param file a file path +451 * @return the position of the last file separator +452 */ +453privateint getLastFileSeparator(String file) { +454if (file.contains("*") || file.contains("?")) { +455int p1 = file.indexOf('*'); +456int p2 = file.indexOf('?'); +457 p1 = p1 > 0 ? p1 : file.length(); +458 p2 = p2 > 0 ? p2 : file.length(); +459int pos = p1 < p2 ? p1 : p2; +460 pos = file.lastIndexOf('/', pos); +461return pos; +462 } else { +463return file.lastIndexOf('/'); +464 } +465 } +466 }
    diff --git a/dependency-check-cli/xref/org/owasp/dependencycheck/CliParser.html b/dependency-check-cli/xref/org/owasp/dependencycheck/CliParser.html index 4c6363dc6..aeaf079ee 100644 --- a/dependency-check-cli/xref/org/owasp/dependencycheck/CliParser.html +++ b/dependency-check-cli/xref/org/owasp/dependencycheck/CliParser.html @@ -30,1131 +30,1215 @@ 2223import org.apache.commons.cli.CommandLine; 24import org.apache.commons.cli.CommandLineParser; -25import org.apache.commons.cli.HelpFormatter; -26import org.apache.commons.cli.Option; -27import org.apache.commons.cli.OptionBuilder; +25import org.apache.commons.cli.DefaultParser; +26import org.apache.commons.cli.HelpFormatter; +27import org.apache.commons.cli.Option; 28import org.apache.commons.cli.OptionGroup; 29import org.apache.commons.cli.Options; 30import org.apache.commons.cli.ParseException; -31import org.apache.commons.cli.PosixParser; -32import org.owasp.dependencycheck.reporting.ReportGenerator.Format; -33import org.owasp.dependencycheck.utils.InvalidSettingException; -34import org.owasp.dependencycheck.utils.Settings; -35import org.slf4j.Logger; -36import org.slf4j.LoggerFactory; -37 -38/** -39 * A utility to parse command line arguments for the DependencyCheck. -40 * -41 * @author Jeremy Long -42 */ -43publicfinalclassCliParser { -44 -45/** -46 * The logger. -47 */ -48privatestaticfinal Logger LOGGER = LoggerFactory.getLogger(CliParser.class); -49/** -50 * The command line. -51 */ -52private CommandLine line; -53/** -54 * Indicates whether the arguments are valid. -55 */ -56privateboolean isValid = true; -57 -58/** -59 * Parses the arguments passed in and captures the results for later use. -60 * -61 * @param args the command line arguments -62 * @throws FileNotFoundException is thrown when a 'file' argument does not point to a file that exists. -63 * @throws ParseException is thrown when a Parse Exception occurs. -64 */ -65publicvoid parse(String[] args) throws FileNotFoundException, ParseException { -66 line = parseArgs(args); -67 -68if (line != null) { -69 validateArgs(); -70 } -71 } -72 -73/** -74 * Parses the command line arguments. -75 * -76 * @param args the command line arguments -77 * @return the results of parsing the command line arguments -78 * @throws ParseException if the arguments are invalid -79 */ -80private CommandLine parseArgs(String[] args) throws ParseException { -81final CommandLineParser parser = new PosixParser(); -82final Options options = createCommandLineOptions(); -83return parser.parse(options, args); -84 } -85 -86/** -87 * Validates that the command line arguments are valid. -88 * -89 * @throws FileNotFoundException if there is a file specified by either the SCAN or CPE command line arguments that does not -90 * exist. -91 * @throws ParseException is thrown if there is an exception parsing the command line. -92 */ -93privatevoid validateArgs() throws FileNotFoundException, ParseException { -94if (isRunScan()) { -95 validatePathExists(getScanFiles(), ARGUMENT.SCAN); -96 validatePathExists(getReportDirectory(), ARGUMENT.OUT); -97if (getPathToMono() != null) { -98 validatePathExists(getPathToMono(), ARGUMENT.PATH_TO_MONO); -99 } -100if (!line.hasOption(ARGUMENT.APP_NAME)) { -101thrownew ParseException("Missing 'app' argument; the scan cannot be run without the an application name."); -102 } -103if (line.hasOption(ARGUMENT.OUTPUT_FORMAT)) { -104final String format = line.getOptionValue(ARGUMENT.OUTPUT_FORMAT); -105try { -106 Format.valueOf(format); -107 } catch (IllegalArgumentException ex) { -108final String msg = String.format("An invalid 'format' of '%s' was specified. " -109 + "Supported output formats are XML, HTML, VULN, or ALL", format); -110thrownew ParseException(msg); -111 } -112 } -113if ((getBaseCve12Url() != null || getBaseCve20Url() != null || getModifiedCve12Url() != null || getModifiedCve20Url() != null) -114 && (getBaseCve12Url() == null || getBaseCve20Url() == null || getModifiedCve12Url() == null || getModifiedCve20Url() == null)) { -115final String msg = "If one of the CVE URLs is specified they must all be specified; please add the missing CVE URL."; -116thrownew ParseException(msg); -117 } -118if (line.hasOption((ARGUMENT.SYM_LINK_DEPTH))) { -119try { -120finalint i = Integer.parseInt(line.getOptionValue(ARGUMENT.SYM_LINK_DEPTH)); -121if (i < 0) { -122thrownew ParseException("Symbolic Link Depth (symLink) must be greater than zero."); -123 } -124 } catch (NumberFormatException ex) { -125thrownew ParseException("Symbolic Link Depth (symLink) is not a number."); -126 } -127 } -128 } -129 } -130 -131/** -132 * Validates whether or not the path(s) points at a file that exists; if the path(s) does not point to an existing file a -133 * FileNotFoundException is thrown. -134 * -135 * @param paths the paths to validate if they exists -136 * @param optType the option being validated (e.g. scan, out, etc.) -137 * @throws FileNotFoundException is thrown if one of the paths being validated does not exist. -138 */ -139privatevoid validatePathExists(String[] paths, String optType) throws FileNotFoundException { -140for (String path : paths) { -141 validatePathExists(path, optType); -142 } -143 } -144 -145/** -146 * Validates whether or not the path points at a file that exists; if the path does not point to an existing file a -147 * FileNotFoundException is thrown. -148 * -149 * @param path the paths to validate if they exists -150 * @param argumentName the argument being validated (e.g. scan, out, etc.) -151 * @throws FileNotFoundException is thrown if the path being validated does not exist. -152 */ -153privatevoid validatePathExists(String path, String argumentName) throws FileNotFoundException { -154if (path == null) { -155 isValid = false; -156final String msg = String.format("Invalid '%s' argument: null", argumentName); -157thrownew FileNotFoundException(msg); -158 } elseif (!path.contains("*") && !path.contains("?")) { -159 File f = new File(path); -160if ("o".equalsIgnoreCase(argumentName.substring(0, 1)) && !"ALL".equalsIgnoreCase(this.getReportFormat())) { -161final String checkPath = path.toLowerCase(); -162if (checkPath.endsWith(".html") || checkPath.endsWith(".xml") || checkPath.endsWith(".htm")) { -163if (f.getParentFile() == null) { -164 f = new File(".", path); -165 } -166if (!f.getParentFile().isDirectory()) { -167 isValid = false; -168final String msg = String.format("Invalid '%s' argument: '%s'", argumentName, path); -169thrownew FileNotFoundException(msg); -170 } -171 } -172 } else { -173if (!f.exists()) { -174 isValid = false; -175final String msg = String.format("Invalid '%s' argument: '%s'", argumentName, path); -176thrownew FileNotFoundException(msg); -177 } -178 } -179 } elseif (path.startsWith("//") || path.startsWith("\\\\")) { -180 isValid = false; -181final String msg = String.format("Invalid '%s' argument: '%s'%nUnable to scan paths that start with '//'.", argumentName, path); -182thrownew FileNotFoundException(msg); -183 } -184 } -185 -186/** -187 * Generates an Options collection that is used to parse the command line and to display the help message. -188 * -189 * @return the command line options used for parsing the command line -190 */ -191 @SuppressWarnings("static-access") -192private Options createCommandLineOptions() { -193final Options options = new Options(); -194 addStandardOptions(options); -195 addAdvancedOptions(options); -196 addDeprecatedOptions(options); -197return options; -198 } -199 -200/** -201 * Adds the standard command line options to the given options collection. -202 * -203 * @param options a collection of command line arguments -204 * @throws IllegalArgumentException thrown if there is an exception -205 */ -206 @SuppressWarnings("static-access") -207privatevoid addStandardOptions(final Options options) throws IllegalArgumentException { -208final Option help = new Option(ARGUMENT.HELP_SHORT, ARGUMENT.HELP, false, -209"Print this message."); -210 -211final Option advancedHelp = OptionBuilder.withLongOpt(ARGUMENT.ADVANCED_HELP) -212 .withDescription("Print the advanced help message.").create(); -213 -214final Option version = new Option(ARGUMENT.VERSION_SHORT, ARGUMENT.VERSION, -215 false, "Print the version information."); -216 -217final Option noUpdate = new Option(ARGUMENT.DISABLE_AUTO_UPDATE_SHORT, ARGUMENT.DISABLE_AUTO_UPDATE, -218 false, "Disables the automatic updating of the CPE data."); -219 -220final Option appName = OptionBuilder.withArgName("name").hasArg().withLongOpt(ARGUMENT.APP_NAME) -221 .withDescription("The name of the application being scanned. This is a required argument.") -222 .create(ARGUMENT.APP_NAME_SHORT); -223 -224final Option path = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.SCAN) -225 .withDescription("The path to scan - this option can be specified multiple times. Ant style" -226 + " paths are supported (e.g. path/**/*.jar).") -227 .create(ARGUMENT.SCAN_SHORT); -228 -229final Option excludes = OptionBuilder.withArgName("pattern").hasArg().withLongOpt(ARGUMENT.EXCLUDE) -230 .withDescription("Specify and exclusion pattern. This option can be specified multiple times" -231 + " and it accepts Ant style excludsions.") -232 .create(); -233 -234final Option props = OptionBuilder.withArgName("file").hasArg().withLongOpt(ARGUMENT.PROP) -235 .withDescription("A property file to load.") -236 .create(ARGUMENT.PROP_SHORT); -237 -238final Option out = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.OUT) -239 .withDescription("The folder to write reports to. This defaults to the current directory. " -240 + "It is possible to set this to a specific file name if the format argument is not set to ALL.") -241 .create(ARGUMENT.OUT_SHORT); -242 -243final Option outputFormat = OptionBuilder.withArgName("format").hasArg().withLongOpt(ARGUMENT.OUTPUT_FORMAT) -244 .withDescription("The output format to write to (XML, HTML, VULN, ALL). The default is HTML.") -245 .create(ARGUMENT.OUTPUT_FORMAT_SHORT); -246 -247final Option verboseLog = OptionBuilder.withArgName("file").hasArg().withLongOpt(ARGUMENT.VERBOSE_LOG) -248 .withDescription("The file path to write verbose logging information.") -249 .create(ARGUMENT.VERBOSE_LOG_SHORT); -250 -251final Option symLinkDepth = OptionBuilder.withArgName("depth").hasArg().withLongOpt(ARGUMENT.SYM_LINK_DEPTH) -252 .withDescription("Sets how deep nested symbolic links will be followed; 0 indicates symbolic links will not be followed.") -253 .create(); -254 -255final Option suppressionFile = OptionBuilder.withArgName("file").hasArg().withLongOpt(ARGUMENT.SUPPRESSION_FILE) -256 .withDescription("The file path to the suppression XML file.") -257 .create(); -258 -259//This is an option group because it can be specified more then once. -260final OptionGroup og = new OptionGroup(); -261 og.addOption(path); -262 -263final OptionGroup exog = new OptionGroup(); -264 exog.addOption(excludes); -265 -266 options.addOptionGroup(og) -267 .addOptionGroup(exog) +31import org.owasp.dependencycheck.reporting.ReportGenerator.Format; +32import org.owasp.dependencycheck.utils.InvalidSettingException; +33import org.owasp.dependencycheck.utils.Settings; +34import org.slf4j.Logger; +35import org.slf4j.LoggerFactory; +36 +37/** +38 * A utility to parse command line arguments for the DependencyCheck. +39 * +40 * @author Jeremy Long +41 */ +42publicfinalclassCliParser { +43 +44/** +45 * The logger. +46 */ +47privatestaticfinal Logger LOGGER = LoggerFactory.getLogger(CliParser.class); +48/** +49 * The command line. +50 */ +51private CommandLine line; +52/** +53 * Indicates whether the arguments are valid. +54 */ +55privateboolean isValid = true; +56 +57/** +58 * Parses the arguments passed in and captures the results for later use. +59 * +60 * @param args the command line arguments +61 * @throws FileNotFoundException is thrown when a 'file' argument does not point to a file that exists. +62 * @throws ParseException is thrown when a Parse Exception occurs. +63 */ +64publicvoid parse(String[] args) throws FileNotFoundException, ParseException { +65 line = parseArgs(args); +66 +67if (line != null) { +68 validateArgs(); +69 } +70 } +71 +72/** +73 * Parses the command line arguments. +74 * +75 * @param args the command line arguments +76 * @return the results of parsing the command line arguments +77 * @throws ParseException if the arguments are invalid +78 */ +79private CommandLine parseArgs(String[] args) throws ParseException { +80final CommandLineParser parser = new DefaultParser(); +81final Options options = createCommandLineOptions(); +82return parser.parse(options, args); +83 } +84 +85/** +86 * Validates that the command line arguments are valid. +87 * +88 * @throws FileNotFoundException if there is a file specified by either the SCAN or CPE command line arguments that does not +89 * exist. +90 * @throws ParseException is thrown if there is an exception parsing the command line. +91 */ +92privatevoid validateArgs() throws FileNotFoundException, ParseException { +93if (isRunScan()) { +94 validatePathExists(getScanFiles(), ARGUMENT.SCAN); +95 validatePathExists(getReportDirectory(), ARGUMENT.OUT); +96if (getPathToMono() != null) { +97 validatePathExists(getPathToMono(), ARGUMENT.PATH_TO_MONO); +98 } +99if (!line.hasOption(ARGUMENT.APP_NAME) && !line.hasOption(ARGUMENT.PROJECT)) { +100thrownew ParseException("Missing '" + ARGUMENT.PROJECT + "' argument; the scan cannot be run without the an project name."); +101 } +102if (line.hasOption(ARGUMENT.OUTPUT_FORMAT)) { +103final String format = line.getOptionValue(ARGUMENT.OUTPUT_FORMAT); +104try { +105 Format.valueOf(format); +106 } catch (IllegalArgumentException ex) { +107final String msg = String.format("An invalid 'format' of '%s' was specified. " +108 + "Supported output formats are XML, HTML, VULN, or ALL", format); +109thrownew ParseException(msg); +110 } +111 } +112if ((getBaseCve12Url() != null || getBaseCve20Url() != null || getModifiedCve12Url() != null || getModifiedCve20Url() != null) +113 && (getBaseCve12Url() == null || getBaseCve20Url() == null || getModifiedCve12Url() == null || getModifiedCve20Url() == null)) { +114final String msg = "If one of the CVE URLs is specified they must all be specified; please add the missing CVE URL."; +115thrownew ParseException(msg); +116 } +117if (line.hasOption((ARGUMENT.SYM_LINK_DEPTH))) { +118try { +119finalint i = Integer.parseInt(line.getOptionValue(ARGUMENT.SYM_LINK_DEPTH)); +120if (i < 0) { +121thrownew ParseException("Symbolic Link Depth (symLink) must be greater than zero."); +122 } +123 } catch (NumberFormatException ex) { +124thrownew ParseException("Symbolic Link Depth (symLink) is not a number."); +125 } +126 } +127 } +128 } +129 +130/** +131 * Validates whether or not the path(s) points at a file that exists; if the path(s) does not point to an existing file a +132 * FileNotFoundException is thrown. +133 * +134 * @param paths the paths to validate if they exists +135 * @param optType the option being validated (e.g. scan, out, etc.) +136 * @throws FileNotFoundException is thrown if one of the paths being validated does not exist. +137 */ +138privatevoid validatePathExists(String[] paths, String optType) throws FileNotFoundException { +139for (String path : paths) { +140 validatePathExists(path, optType); +141 } +142 } +143 +144/** +145 * Validates whether or not the path points at a file that exists; if the path does not point to an existing file a +146 * FileNotFoundException is thrown. +147 * +148 * @param path the paths to validate if they exists +149 * @param argumentName the argument being validated (e.g. scan, out, etc.) +150 * @throws FileNotFoundException is thrown if the path being validated does not exist. +151 */ +152privatevoid validatePathExists(String path, String argumentName) throws FileNotFoundException { +153if (path == null) { +154 isValid = false; +155final String msg = String.format("Invalid '%s' argument: null", argumentName); +156thrownew FileNotFoundException(msg); +157 } elseif (!path.contains("*") && !path.contains("?")) { +158 File f = new File(path); +159if ("o".equalsIgnoreCase(argumentName.substring(0, 1)) && !"ALL".equalsIgnoreCase(this.getReportFormat())) { +160final String checkPath = path.toLowerCase(); +161if (checkPath.endsWith(".html") || checkPath.endsWith(".xml") || checkPath.endsWith(".htm")) { +162if (f.getParentFile() == null) { +163 f = new File(".", path); +164 } +165if (!f.getParentFile().isDirectory()) { +166 isValid = false; +167final String msg = String.format("Invalid '%s' argument: '%s'", argumentName, path); +168thrownew FileNotFoundException(msg); +169 } +170 } +171 } else { +172if (!f.exists()) { +173 isValid = false; +174final String msg = String.format("Invalid '%s' argument: '%s'", argumentName, path); +175thrownew FileNotFoundException(msg); +176 } +177 } +178 } elseif (path.startsWith("//") || path.startsWith("\\\\")) { +179 isValid = false; +180final String msg = String.format("Invalid '%s' argument: '%s'%nUnable to scan paths that start with '//'.", argumentName, path); +181thrownew FileNotFoundException(msg); +182 } +183 } +184 +185/** +186 * Generates an Options collection that is used to parse the command line and to display the help message. +187 * +188 * @return the command line options used for parsing the command line +189 */ +190 @SuppressWarnings("static-access") +191private Options createCommandLineOptions() { +192final Options options = new Options(); +193 addStandardOptions(options); +194 addAdvancedOptions(options); +195 addDeprecatedOptions(options); +196return options; +197 } +198 +199/** +200 * Adds the standard command line options to the given options collection. +201 * +202 * @param options a collection of command line arguments +203 * @throws IllegalArgumentException thrown if there is an exception +204 */ +205 @SuppressWarnings("static-access") +206privatevoid addStandardOptions(final Options options) throws IllegalArgumentException { +207final Option help = new Option(ARGUMENT.HELP_SHORT, ARGUMENT.HELP, false, +208"Print this message."); +209 +210final Option advancedHelp = Option.builder().longOpt(ARGUMENT.ADVANCED_HELP) +211 .desc("Print the advanced help message.").build(); +212 +213final Option version = new Option(ARGUMENT.VERSION_SHORT, ARGUMENT.VERSION, +214 false, "Print the version information."); +215 +216final Option noUpdate = new Option(ARGUMENT.DISABLE_AUTO_UPDATE_SHORT, ARGUMENT.DISABLE_AUTO_UPDATE, +217 false, "Disables the automatic updating of the CPE data."); +218 +219final Option projectName = Option.builder().hasArg().argName("name").longOpt(ARGUMENT.PROJECT) +220 .desc("The name of the project being scanned. This is a required argument.") +221 .build(); +222 +223final Option path = Option.builder(ARGUMENT.SCAN_SHORT).argName("path").hasArg().longOpt(ARGUMENT.SCAN) +224 .desc("The path to scan - this option can be specified multiple times. Ant style" +225 + " paths are supported (e.g. path/**/*.jar).") +226 .build(); +227 +228final Option excludes = Option.builder().argName("pattern").hasArg().longOpt(ARGUMENT.EXCLUDE) +229 .desc("Specify and exclusion pattern. This option can be specified multiple times" +230 + " and it accepts Ant style excludsions.") +231 .build(); +232 +233final Option props = Option.builder(ARGUMENT.PROP_SHORT).argName("file").hasArg().longOpt(ARGUMENT.PROP) +234 .desc("A property file to load.") +235 .build(); +236 +237final Option out = Option.builder(ARGUMENT.OUT_SHORT).argName("path").hasArg().longOpt(ARGUMENT.OUT) +238 .desc("The folder to write reports to. This defaults to the current directory. " +239 + "It is possible to set this to a specific file name if the format argument is not set to ALL.") +240 .build(); +241 +242final Option outputFormat = Option.builder(ARGUMENT.OUTPUT_FORMAT_SHORT).argName("format").hasArg().longOpt(ARGUMENT.OUTPUT_FORMAT) +243 .desc("The output format to write to (XML, HTML, VULN, ALL). The default is HTML.") +244 .build(); +245 +246final Option verboseLog = Option.builder(ARGUMENT.VERBOSE_LOG_SHORT).argName("file").hasArg().longOpt(ARGUMENT.VERBOSE_LOG) +247 .desc("The file path to write verbose logging information.") +248 .build(); +249 +250final Option symLinkDepth = Option.builder().argName("depth").hasArg().longOpt(ARGUMENT.SYM_LINK_DEPTH) +251 .desc("Sets how deep nested symbolic links will be followed; 0 indicates symbolic links will not be followed.") +252 .build(); +253 +254final Option suppressionFile = Option.builder().argName("file").hasArg().longOpt(ARGUMENT.SUPPRESSION_FILE) +255 .desc("The file path to the suppression XML file.") +256 .build(); +257 +258//This is an option group because it can be specified more then once. +259final OptionGroup og = new OptionGroup(); +260 og.addOption(path); +261 +262final OptionGroup exog = new OptionGroup(); +263 exog.addOption(excludes); +264 +265 options.addOptionGroup(og) +266 .addOptionGroup(exog) +267 .addOption(projectName) 268 .addOption(out) 269 .addOption(outputFormat) -270 .addOption(appName) -271 .addOption(version) -272 .addOption(help) -273 .addOption(advancedHelp) -274 .addOption(noUpdate) -275 .addOption(symLinkDepth) -276 .addOption(props) -277 .addOption(verboseLog) -278 .addOption(suppressionFile); -279 } -280 -281/** -282 * Adds the advanced command line options to the given options collection. These are split out for purposes of being able to -283 * display two different help messages. -284 * -285 * @param options a collection of command line arguments -286 * @throws IllegalArgumentException thrown if there is an exception -287 */ -288 @SuppressWarnings("static-access") -289privatevoid addAdvancedOptions(final Options options) throws IllegalArgumentException { -290 -291final Option cve12Base = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.CVE_BASE_12) -292 .withDescription("Base URL for each year’s CVE 1.2, the %d will be replaced with the year. ") -293 .create(); -294 -295final Option cve20Base = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.CVE_BASE_20) -296 .withDescription("Base URL for each year’s CVE 2.0, the %d will be replaced with the year.") -297 .create(); -298 -299final Option cve12Modified = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.CVE_MOD_12) -300 .withDescription("URL for the modified CVE 1.2.") -301 .create(); -302 -303final Option cve20Modified = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.CVE_MOD_20) -304 .withDescription("URL for the modified CVE 2.0.") -305 .create(); -306 -307final Option updateOnly = OptionBuilder.withLongOpt(ARGUMENT.UPDATE_ONLY) -308 .withDescription("Only update the local NVD data cache; no scan will be executed.").create(); -309 -310final Option data = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.DATA_DIRECTORY) -311 .withDescription("The location of the H2 Database file. This option should generally not be set.") -312 .create(ARGUMENT.DATA_DIRECTORY_SHORT); -313 -314final Option nexusUrl = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.NEXUS_URL) -315 .withDescription("The url to the Nexus Server's REST API Endpoint (http://domain/nexus/service/local). " -316 + "If not set the Nexus Analyzer will be disabled.").create(); -317 -318final Option nexusUsesProxy = OptionBuilder.withArgName("true/false").hasArg().withLongOpt(ARGUMENT.NEXUS_USES_PROXY) -319 .withDescription("Whether or not the configured proxy should be used when connecting to Nexus.") -320 .create(); -321 -322final Option additionalZipExtensions = OptionBuilder.withArgName("extensions").hasArg() -323 .withLongOpt(ARGUMENT.ADDITIONAL_ZIP_EXTENSIONS) -324 .withDescription("A comma separated list of additional extensions to be scanned as ZIP files " -325 + "(ZIP, EAR, WAR are already treated as zip files)").create(); -326 -327final Option pathToMono = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.PATH_TO_MONO) -328 .withDescription("The path to Mono for .NET Assembly analysis on non-windows systems.") -329 .create(); -330 -331final Option connectionTimeout = OptionBuilder.withArgName("timeout").hasArg().withLongOpt(ARGUMENT.CONNECTION_TIMEOUT) -332 .withDescription("The connection timeout (in milliseconds) to use when downloading resources.") -333 .create(ARGUMENT.CONNECTION_TIMEOUT_SHORT); -334 -335final Option proxyServer = OptionBuilder.withArgName("server").hasArg().withLongOpt(ARGUMENT.PROXY_SERVER) -336 .withDescription("The proxy server to use when downloading resources.").create(); -337 -338final Option proxyPort = OptionBuilder.withArgName("port").hasArg().withLongOpt(ARGUMENT.PROXY_PORT) -339 .withDescription("The proxy port to use when downloading resources.").create(); -340 -341final Option proxyUsername = OptionBuilder.withArgName("user").hasArg().withLongOpt(ARGUMENT.PROXY_USERNAME) -342 .withDescription("The proxy username to use when downloading resources.").create(); -343 -344final Option proxyPassword = OptionBuilder.withArgName("pass").hasArg().withLongOpt(ARGUMENT.PROXY_PASSWORD) -345 .withDescription("The proxy password to use when downloading resources.").create(); -346 -347final Option connectionString = OptionBuilder.withArgName("connStr").hasArg().withLongOpt(ARGUMENT.CONNECTION_STRING) -348 .withDescription("The connection string to the database.").create(); -349 -350final Option dbUser = OptionBuilder.withArgName("user").hasArg().withLongOpt(ARGUMENT.DB_NAME) -351 .withDescription("The username used to connect to the database.").create(); -352 -353final Option dbPassword = OptionBuilder.withArgName("password").hasArg().withLongOpt(ARGUMENT.DB_PASSWORD) -354 .withDescription("The password for connecting to the database.").create(); -355 -356final Option dbDriver = OptionBuilder.withArgName("driver").hasArg().withLongOpt(ARGUMENT.DB_DRIVER) -357 .withDescription("The database driver name.").create(); -358 -359final Option dbDriverPath = OptionBuilder.withArgName("path").hasArg().withLongOpt(ARGUMENT.DB_DRIVER_PATH) -360 .withDescription("The path to the database driver; note, this does not need to be set unless the JAR is outside of the classpath.") -361 .create(); -362 -363final Option disableJarAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_JAR) -364 .withDescription("Disable the Jar Analyzer.").create(); -365 -366final Option disableArchiveAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_ARCHIVE) -367 .withDescription("Disable the Archive Analyzer.").create(); -368 -369final Option disableNuspecAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_NUSPEC) -370 .withDescription("Disable the Nuspec Analyzer.").create(); -371 -372final Option disableAssemblyAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_ASSEMBLY) -373 .withDescription("Disable the .NET Assembly Analyzer.").create(); -374 -375final Option disablePythonDistributionAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_PY_DIST) -376 .withDescription("Disable the Python Distribution Analyzer.").create(); -377 -378final Option disablePythonPackageAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_PY_PKG) -379 .withDescription("Disable the Python Package Analyzer.").create(); -380 -381final Option disableAutoconfAnalyzer = OptionBuilder -382 .withLongOpt(ARGUMENT.DISABLE_AUTOCONF) -383 .withDescription("Disable the Autoconf Analyzer.").create(); -384 -385final Option disableOpenSSLAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_OPENSSL) -386 .withDescription("Disable the OpenSSL Analyzer.").create(); -387final Option disableCmakeAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_CMAKE). -388 withDescription("Disable the Cmake Analyzer.").create(); -389 -390final Option disableCentralAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_CENTRAL) -391 .withDescription("Disable the Central Analyzer. If this analyzer is disabled it is likely you also want to disable " -392 + "the Nexus Analyzer.").create(); -393 -394final Option disableNexusAnalyzer = OptionBuilder.withLongOpt(ARGUMENT.DISABLE_NEXUS) -395 .withDescription("Disable the Nexus Analyzer.").create(); -396 -397 options.addOption(updateOnly) -398 .addOption(cve12Base) -399 .addOption(cve20Base) -400 .addOption(cve12Modified) -401 .addOption(cve20Modified) -402 .addOption(proxyPort) -403 .addOption(proxyServer) -404 .addOption(proxyUsername) -405 .addOption(proxyPassword) -406 .addOption(connectionTimeout) -407 .addOption(connectionString) -408 .addOption(dbUser) -409 .addOption(data) -410 .addOption(dbPassword) -411 .addOption(dbDriver) -412 .addOption(dbDriverPath) -413 .addOption(disableJarAnalyzer) -414 .addOption(disableArchiveAnalyzer) -415 .addOption(disableAssemblyAnalyzer) -416 .addOption(disablePythonDistributionAnalyzer) -417 .addOption(disableCmakeAnalyzer) -418 .addOption(disablePythonPackageAnalyzer) -419 .addOption(disableAutoconfAnalyzer) -420 .addOption(disableOpenSSLAnalyzer) -421 .addOption(disableNuspecAnalyzer) -422 .addOption(disableCentralAnalyzer) -423 .addOption(disableNexusAnalyzer) -424 .addOption(nexusUrl) -425 .addOption(nexusUsesProxy) -426 .addOption(additionalZipExtensions) -427 .addOption(pathToMono); -428 } -429 -430/** -431 * Adds the deprecated command line options to the given options collection. These are split out for purposes of not including -432 * them in the help message. We need to add the deprecated options so as not to break existing scripts. -433 * -434 * @param options a collection of command line arguments -435 * @throws IllegalArgumentException thrown if there is an exception -436 */ -437 @SuppressWarnings({"static-access", "deprecation"}) -438privatevoid addDeprecatedOptions(final Options options) throws IllegalArgumentException { -439 -440final Option proxyServer = OptionBuilder.withArgName("url").hasArg().withLongOpt(ARGUMENT.PROXY_URL) -441 .withDescription("The proxy url argument is deprecated, use proxyserver instead.") -442 .create(); -443 -444 options.addOption(proxyServer); -445 } -446 -447/** -448 * Determines if the 'version' command line argument was passed in. -449 * -450 * @return whether or not the 'version' command line argument was passed in -451 */ -452publicboolean isGetVersion() { -453return (line != null) && line.hasOption(ARGUMENT.VERSION); -454 } -455 -456/** -457 * Determines if the 'help' command line argument was passed in. -458 * -459 * @return whether or not the 'help' command line argument was passed in -460 */ -461publicboolean isGetHelp() { -462return (line != null) && line.hasOption(ARGUMENT.HELP); -463 } -464 -465/** -466 * Determines if the 'scan' command line argument was passed in. -467 * -468 * @return whether or not the 'scan' command line argument was passed in -469 */ -470publicboolean isRunScan() { -471return (line != null) && isValid && line.hasOption(ARGUMENT.SCAN); -472 } -473 -474/** -475 * Returns the symbolic link depth (how deeply symbolic links will be followed). -476 * -477 * @return the symbolic link depth -478 */ -479publicint getSymLinkDepth() { -480int value = 0; -481try { -482 value = Integer.parseInt(line.getOptionValue(ARGUMENT.SYM_LINK_DEPTH, "0")); -483if (value < 0) { -484 value = 0; -485 } -486 } catch (NumberFormatException ex) { -487 LOGGER.debug("Symbolic link was not a number"); -488 } -489return value; -490 } -491 -492/** -493 * Returns true if the disableJar command line argument was specified. -494 * -495 * @return true if the disableJar command line argument was specified; otherwise false -496 */ -497publicboolean isJarDisabled() { -498return (line != null) && line.hasOption(ARGUMENT.DISABLE_JAR); -499 } -500 -501/** -502 * Returns true if the disableArchive command line argument was specified. -503 * -504 * @return true if the disableArchive command line argument was specified; otherwise false -505 */ -506publicboolean isArchiveDisabled() { -507return (line != null) && line.hasOption(ARGUMENT.DISABLE_ARCHIVE); -508 } -509 -510/** -511 * Returns true if the disableNuspec command line argument was specified. -512 * -513 * @return true if the disableNuspec command line argument was specified; otherwise false -514 */ -515publicboolean isNuspecDisabled() { -516return (line != null) && line.hasOption(ARGUMENT.DISABLE_NUSPEC); -517 } -518 -519/** -520 * Returns true if the disableAssembly command line argument was specified. -521 * -522 * @return true if the disableAssembly command line argument was specified; otherwise false -523 */ -524publicboolean isAssemblyDisabled() { -525return (line != null) && line.hasOption(ARGUMENT.DISABLE_ASSEMBLY); -526 } -527 -528/** -529 * Returns true if the disablePyDist command line argument was specified. -530 * -531 * @return true if the disablePyDist command line argument was specified; otherwise false -532 */ -533publicboolean isPythonDistributionDisabled() { -534return (line != null) && line.hasOption(ARGUMENT.DISABLE_PY_DIST); -535 } -536 -537/** -538 * Returns true if the disablePyPkg command line argument was specified. -539 * -540 * @return true if the disablePyPkg command line argument was specified; otherwise false -541 */ -542publicboolean isPythonPackageDisabled() { -543return (line != null) && line.hasOption(ARGUMENT.DISABLE_PY_PKG); -544 } -545 -546/** -547 * Returns true if the disableCmake command line argument was specified. -548 * -549 * @return true if the disableCmake command line argument was specified; otherwise false -550 */ -551publicboolean isCmakeDisabled() { -552return (line != null) && line.hasOption(ARGUMENT.DISABLE_CMAKE); -553 } -554 -555/** -556 * Returns true if the disableAutoconf command line argument was specified. -557 * -558 * @return true if the disableAutoconf command line argument was specified; otherwise false -559 */ -560publicboolean isAutoconfDisabled() { -561return (line != null) && line.hasOption(ARGUMENT.DISABLE_AUTOCONF); -562 } -563 -564/** -565 * Returns true if the disableNexus command line argument was specified. -566 * -567 * @return true if the disableNexus command line argument was specified; otherwise false -568 */ -569publicboolean isNexusDisabled() { -570return (line != null) && line.hasOption(ARGUMENT.DISABLE_NEXUS); -571 } -572 -573/** -574 * Returns true if the disableOpenSSL command line argument was specified. -575 * -576 * @return true if the disableOpenSSL command line argument was specified; otherwise false -577 */ -578publicboolean isOpenSSLDisabled() { -579return (line != null) && line.hasOption(ARGUMENT.DISABLE_OPENSSL); -580 } -581 -582/** -583 * Returns true if the disableCentral command line argument was specified. -584 * -585 * @return true if the disableCentral command line argument was specified; otherwise false -586 */ -587publicboolean isCentralDisabled() { -588return (line != null) && line.hasOption(ARGUMENT.DISABLE_CENTRAL); -589 } -590 -591/** -592 * Returns the url to the nexus server if one was specified. -593 * -594 * @return the url to the nexus server; if none was specified this will return null; -595 */ -596public String getNexusUrl() { -597if (line == null || !line.hasOption(ARGUMENT.NEXUS_URL)) { -598returnnull; -599 } else { -600return line.getOptionValue(ARGUMENT.NEXUS_URL); -601 } -602 } -603 -604/** -605 * Returns true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false is returned. -606 * -607 * @return true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false -608 */ -609publicboolean isNexusUsesProxy() { -610// If they didn't specify whether Nexus needs to use the proxy, we should -611// still honor the property if it's set. -612if (line == null || !line.hasOption(ARGUMENT.NEXUS_USES_PROXY)) { -613try { -614return Settings.getBoolean(Settings.KEYS.ANALYZER_NEXUS_PROXY); -615 } catch (InvalidSettingException ise) { -616returntrue; -617 } -618 } else { -619return Boolean.parseBoolean(line.getOptionValue(ARGUMENT.NEXUS_USES_PROXY)); -620 } -621 } -622 -623/** -624 * Displays the command line help message to the standard output. -625 */ -626publicvoid printHelp() { -627final HelpFormatter formatter = new HelpFormatter(); -628final Options options = new Options(); -629 addStandardOptions(options); -630if (line != null && line.hasOption(ARGUMENT.ADVANCED_HELP)) { -631 addAdvancedOptions(options); -632 } -633final String helpMsg = String.format("%n%s" -634 + " can be used to identify if there are any known CVE vulnerabilities in libraries utilized by an application. " -635 + "%s will automatically update required data from the Internet, such as the CVE and CPE data files from nvd.nist.gov.%n%n", -636 Settings.getString("application.name", "DependencyCheck"), -637 Settings.getString("application.name", "DependencyCheck")); -638 -639 formatter.printHelp(Settings.getString("application.name", "DependencyCheck"), -640 helpMsg, -641 options, -642"", -643true); -644 } -645 -646/** -647 * Retrieves the file command line parameter(s) specified for the 'scan' argument. -648 * -649 * @return the file paths specified on the command line for scan -650 */ -651public String[] getScanFiles() { -652return line.getOptionValues(ARGUMENT.SCAN); -653 } -654 -655/** -656 * Retrieves the list of excluded file patterns specified by the 'exclude' argument. -657 * -658 * @return the excluded file patterns -659 */ -660public String[] getExcludeList() { -661return line.getOptionValues(ARGUMENT.EXCLUDE); -662 } -663 -664/** -665 * Returns the directory to write the reports to specified on the command line. -666 * -667 * @return the path to the reports directory. +270 .addOption(version) +271 .addOption(help) +272 .addOption(advancedHelp) +273 .addOption(noUpdate) +274 .addOption(symLinkDepth) +275 .addOption(props) +276 .addOption(verboseLog) +277 .addOption(suppressionFile); +278 } +279 +280/** +281 * Adds the advanced command line options to the given options collection. These are split out for purposes of being able to +282 * display two different help messages. +283 * +284 * @param options a collection of command line arguments +285 * @throws IllegalArgumentException thrown if there is an exception +286 */ +287 @SuppressWarnings("static-access") +288privatevoid addAdvancedOptions(final Options options) throws IllegalArgumentException { +289 +290final Option cve12Base = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.CVE_BASE_12) +291 .desc("Base URL for each year’s CVE 1.2, the %d will be replaced with the year. ") +292 .build(); +293 +294final Option cve20Base = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.CVE_BASE_20) +295 .desc("Base URL for each year’s CVE 2.0, the %d will be replaced with the year.") +296 .build(); +297 +298final Option cve12Modified = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.CVE_MOD_12) +299 .desc("URL for the modified CVE 1.2.") +300 .build(); +301 +302final Option cve20Modified = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.CVE_MOD_20) +303 .desc("URL for the modified CVE 2.0.") +304 .build(); +305 +306final Option updateOnly = Option.builder().longOpt(ARGUMENT.UPDATE_ONLY) +307 .desc("Only update the local NVD data cache; no scan will be executed.").build(); +308 +309final Option data = Option.builder(ARGUMENT.DATA_DIRECTORY_SHORT).argName("path").hasArg().longOpt(ARGUMENT.DATA_DIRECTORY) +310 .desc("The location of the H2 Database file. This option should generally not be set.") +311 .build(); +312 +313final Option nexusUrl = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.NEXUS_URL) +314 .desc("The url to the Nexus Server's REST API Endpoint (http://domain/nexus/service/local). " +315 + "If not set the Nexus Analyzer will be disabled.").build(); +316 +317final Option nexusUsesProxy = Option.builder().argName("true/false").hasArg().longOpt(ARGUMENT.NEXUS_USES_PROXY) +318 .desc("Whether or not the configured proxy should be used when connecting to Nexus.") +319 .build(); +320 +321final Option additionalZipExtensions = Option.builder().argName("extensions").hasArg() +322 .longOpt(ARGUMENT.ADDITIONAL_ZIP_EXTENSIONS) +323 .desc("A comma separated list of additional extensions to be scanned as ZIP files " +324 + "(ZIP, EAR, WAR are already treated as zip files)").build(); +325 +326final Option pathToMono = Option.builder().argName("path").hasArg().longOpt(ARGUMENT.PATH_TO_MONO) +327 .desc("The path to Mono for .NET Assembly analysis on non-windows systems.") +328 .build(); +329 +330final Option connectionTimeout = Option.builder(ARGUMENT.CONNECTION_TIMEOUT_SHORT).argName("timeout").hasArg() +331 .longOpt(ARGUMENT.CONNECTION_TIMEOUT).desc("The connection timeout (in milliseconds) to use when downloading resources.") +332 .build(); +333 +334final Option proxyServer = Option.builder().argName("server").hasArg().longOpt(ARGUMENT.PROXY_SERVER) +335 .desc("The proxy server to use when downloading resources.").build(); +336 +337final Option proxyPort = Option.builder().argName("port").hasArg().longOpt(ARGUMENT.PROXY_PORT) +338 .desc("The proxy port to use when downloading resources.").build(); +339 +340final Option proxyUsername = Option.builder().argName("user").hasArg().longOpt(ARGUMENT.PROXY_USERNAME) +341 .desc("The proxy username to use when downloading resources.").build(); +342 +343final Option proxyPassword = Option.builder().argName("pass").hasArg().longOpt(ARGUMENT.PROXY_PASSWORD) +344 .desc("The proxy password to use when downloading resources.").build(); +345 +346final Option connectionString = Option.builder().argName("connStr").hasArg().longOpt(ARGUMENT.CONNECTION_STRING) +347 .desc("The connection string to the database.").build(); +348 +349final Option dbUser = Option.builder().argName("user").hasArg().longOpt(ARGUMENT.DB_NAME) +350 .desc("The username used to connect to the database.").build(); +351 +352final Option dbPassword = Option.builder().argName("password").hasArg().longOpt(ARGUMENT.DB_PASSWORD) +353 .desc("The password for connecting to the database.").build(); +354 +355final Option dbDriver = Option.builder().argName("driver").hasArg().longOpt(ARGUMENT.DB_DRIVER) +356 .desc("The database driver name.").build(); +357 +358final Option dbDriverPath = Option.builder().argName("path").hasArg().longOpt(ARGUMENT.DB_DRIVER_PATH) +359 .desc("The path to the database driver; note, this does not need to be set unless the JAR is outside of the classpath.") +360 .build(); +361 +362final Option disableJarAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_JAR) +363 .desc("Disable the Jar Analyzer.").build(); +364 +365final Option disableArchiveAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_ARCHIVE) +366 .desc("Disable the Archive Analyzer.").build(); +367 +368final Option disableNuspecAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_NUSPEC) +369 .desc("Disable the Nuspec Analyzer.").build(); +370 +371final Option disableAssemblyAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_ASSEMBLY) +372 .desc("Disable the .NET Assembly Analyzer.").build(); +373 +374final Option disablePythonDistributionAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_PY_DIST) +375 .desc("Disable the Python Distribution Analyzer.").build(); +376 +377final Option disablePythonPackageAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_PY_PKG) +378 .desc("Disable the Python Package Analyzer.").build(); +379 +380final Option disableComposerAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_COMPOSER) +381 .desc("Disable the PHP Composer Analyzer.").build(); +382 +383final Option disableAutoconfAnalyzer = Option.builder() +384 .longOpt(ARGUMENT.DISABLE_AUTOCONF) +385 .desc("Disable the Autoconf Analyzer.").build(); +386 +387final Option disableOpenSSLAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_OPENSSL) +388 .desc("Disable the OpenSSL Analyzer.").build(); +389final Option disableCmakeAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_CMAKE) +390 .desc("Disable the Cmake Analyzer.").build(); +391 +392final Option disableCentralAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_CENTRAL) +393 .desc("Disable the Central Analyzer. If this analyzer is disabled it is likely you also want to disable " +394 + "the Nexus Analyzer.").build(); +395 +396final Option disableNexusAnalyzer = Option.builder().longOpt(ARGUMENT.DISABLE_NEXUS) +397 .desc("Disable the Nexus Analyzer.").build(); +398 +399final Option purge = Option.builder().longOpt(ARGUMENT.PURGE_NVD) +400 .desc("Purges the local NVD data cache") +401 .build(); +402 +403 options.addOption(updateOnly) +404 .addOption(cve12Base) +405 .addOption(cve20Base) +406 .addOption(cve12Modified) +407 .addOption(cve20Modified) +408 .addOption(proxyPort) +409 .addOption(proxyServer) +410 .addOption(proxyUsername) +411 .addOption(proxyPassword) +412 .addOption(connectionTimeout) +413 .addOption(connectionString) +414 .addOption(dbUser) +415 .addOption(data) +416 .addOption(dbPassword) +417 .addOption(dbDriver) +418 .addOption(dbDriverPath) +419 .addOption(disableJarAnalyzer) +420 .addOption(disableArchiveAnalyzer) +421 .addOption(disableAssemblyAnalyzer) +422 .addOption(disablePythonDistributionAnalyzer) +423 .addOption(disableCmakeAnalyzer) +424 .addOption(disablePythonPackageAnalyzer) +425 .addOption(Option.builder().longOpt(ARGUMENT.DISABLE_RUBYGEMS) +426 .desc("Disable the Ruby Gemspec Analyzer.").build()) +427 .addOption(disableAutoconfAnalyzer) +428 .addOption(disableComposerAnalyzer) +429 .addOption(disableOpenSSLAnalyzer) +430 .addOption(disableNuspecAnalyzer) +431 .addOption(disableCentralAnalyzer) +432 .addOption(disableNexusAnalyzer) +433 .addOption(Option.builder().longOpt(ARGUMENT.DISABLE_NODE_JS) +434 .desc("Disable the Node.js Package Analyzer.").build()) +435 .addOption(nexusUrl) +436 .addOption(nexusUsesProxy) +437 .addOption(additionalZipExtensions) +438 .addOption(pathToMono) +439 .addOption(purge); +440 } +441 +442/** +443 * Adds the deprecated command line options to the given options collection. These are split out for purposes of not including +444 * them in the help message. We need to add the deprecated options so as not to break existing scripts. +445 * +446 * @param options a collection of command line arguments +447 * @throws IllegalArgumentException thrown if there is an exception +448 */ +449 @SuppressWarnings({"static-access", "deprecation"}) +450privatevoid addDeprecatedOptions(final Options options) throws IllegalArgumentException { +451 +452final Option proxyServer = Option.builder().argName("url").hasArg().longOpt(ARGUMENT.PROXY_URL) +453 .desc("The proxy url argument is deprecated, use proxyserver instead.") +454 .build(); +455final Option appName = Option.builder(ARGUMENT.APP_NAME_SHORT).argName("name").hasArg().longOpt(ARGUMENT.APP_NAME) +456 .desc("The name of the project being scanned.") +457 .build(); +458 +459 options.addOption(proxyServer); +460 options.addOption(appName); +461 } +462 +463/** +464 * Determines if the 'version' command line argument was passed in. +465 * +466 * @return whether or not the 'version' command line argument was passed in +467 */ +468publicboolean isGetVersion() { +469return (line != null) && line.hasOption(ARGUMENT.VERSION); +470 } +471 +472/** +473 * Determines if the 'help' command line argument was passed in. +474 * +475 * @return whether or not the 'help' command line argument was passed in +476 */ +477publicboolean isGetHelp() { +478return (line != null) && line.hasOption(ARGUMENT.HELP); +479 } +480 +481/** +482 * Determines if the 'scan' command line argument was passed in. +483 * +484 * @return whether or not the 'scan' command line argument was passed in +485 */ +486publicboolean isRunScan() { +487return (line != null) && isValid && line.hasOption(ARGUMENT.SCAN); +488 } +489 +490/** +491 * Returns the symbolic link depth (how deeply symbolic links will be followed). +492 * +493 * @return the symbolic link depth +494 */ +495publicint getSymLinkDepth() { +496int value = 0; +497try { +498 value = Integer.parseInt(line.getOptionValue(ARGUMENT.SYM_LINK_DEPTH, "0")); +499if (value < 0) { +500 value = 0; +501 } +502 } catch (NumberFormatException ex) { +503 LOGGER.debug("Symbolic link was not a number"); +504 } +505return value; +506 } +507 +508/** +509 * Returns true if the disableJar command line argument was specified. +510 * +511 * @return true if the disableJar command line argument was specified; otherwise false +512 */ +513publicboolean isJarDisabled() { +514return (line != null) && line.hasOption(ARGUMENT.DISABLE_JAR); +515 } +516 +517/** +518 * Returns true if the disableArchive command line argument was specified. +519 * +520 * @return true if the disableArchive command line argument was specified; otherwise false +521 */ +522publicboolean isArchiveDisabled() { +523return (line != null) && line.hasOption(ARGUMENT.DISABLE_ARCHIVE); +524 } +525 +526/** +527 * Returns true if the disableNuspec command line argument was specified. +528 * +529 * @return true if the disableNuspec command line argument was specified; otherwise false +530 */ +531publicboolean isNuspecDisabled() { +532return (line != null) && line.hasOption(ARGUMENT.DISABLE_NUSPEC); +533 } +534 +535/** +536 * Returns true if the disableAssembly command line argument was specified. +537 * +538 * @return true if the disableAssembly command line argument was specified; otherwise false +539 */ +540publicboolean isAssemblyDisabled() { +541return (line != null) && line.hasOption(ARGUMENT.DISABLE_ASSEMBLY); +542 } +543 +544/** +545 * Returns true if the disablePyDist command line argument was specified. +546 * +547 * @return true if the disablePyDist command line argument was specified; otherwise false +548 */ +549publicboolean isPythonDistributionDisabled() { +550return (line != null) && line.hasOption(ARGUMENT.DISABLE_PY_DIST); +551 } +552 +553/** +554 * Returns true if the disablePyPkg command line argument was specified. +555 * +556 * @return true if the disablePyPkg command line argument was specified; otherwise false +557 */ +558publicboolean isPythonPackageDisabled() { +559return (line != null) && line.hasOption(ARGUMENT.DISABLE_PY_PKG); +560 } +561 +562/** +563 * Returns whether the Ruby gemspec analyzer is disabled. +564 * +565 * @return true if the {@link ARGUMENT#DISABLE_RUBYGEMS} command line argument was specified; otherwise false +566 */ +567publicboolean isRubyGemspecDisabled() { +568return (null != line) && line.hasOption(ARGUMENT.DISABLE_RUBYGEMS); +569 } +570 +571/** +572 * Returns true if the disableCmake command line argument was specified. +573 * +574 * @return true if the disableCmake command line argument was specified; otherwise false +575 */ +576publicboolean isCmakeDisabled() { +577return (line != null) && line.hasOption(ARGUMENT.DISABLE_CMAKE); +578 } +579 +580/** +581 * Returns true if the disableAutoconf command line argument was specified. +582 * +583 * @return true if the disableAutoconf command line argument was specified; otherwise false +584 */ +585publicboolean isAutoconfDisabled() { +586return (line != null) && line.hasOption(ARGUMENT.DISABLE_AUTOCONF); +587 } +588 +589/** +590 * Returns true if the disableComposer command line argument was specified. +591 * +592 * @return true if the disableComposer command line argument was specified; otherwise false +593 */ +594publicboolean isComposerDisabled() { +595return (line != null) && line.hasOption(ARGUMENT.DISABLE_COMPOSER); +596 } +597 +598/** +599 * Returns true if the disableNexus command line argument was specified. +600 * +601 * @return true if the disableNexus command line argument was specified; otherwise false +602 */ +603publicboolean isNexusDisabled() { +604return (line != null) && line.hasOption(ARGUMENT.DISABLE_NEXUS); +605 } +606 +607/** +608 * Returns true if the disableOpenSSL command line argument was specified. +609 * +610 * @return true if the disableOpenSSL command line argument was specified; otherwise false +611 */ +612publicboolean isOpenSSLDisabled() { +613return (line != null) && line.hasOption(ARGUMENT.DISABLE_OPENSSL); +614 } +615 +616/** +617 * Returns true if the disableNodeJS command line argument was specified. +618 * +619 * @return true if the disableNodeJS command line argument was specified; otherwise false +620 */ +621publicboolean isNodeJsDisabled() { +622return (line != null) && line.hasOption(ARGUMENT.DISABLE_NODE_JS); +623 } +624 +625/** +626 * Returns true if the disableCentral command line argument was specified. +627 * +628 * @return true if the disableCentral command line argument was specified; otherwise false +629 */ +630publicboolean isCentralDisabled() { +631return (line != null) && line.hasOption(ARGUMENT.DISABLE_CENTRAL); +632 } +633 +634/** +635 * Returns the url to the nexus server if one was specified. +636 * +637 * @return the url to the nexus server; if none was specified this will return null; +638 */ +639public String getNexusUrl() { +640if (line == null || !line.hasOption(ARGUMENT.NEXUS_URL)) { +641returnnull; +642 } else { +643return line.getOptionValue(ARGUMENT.NEXUS_URL); +644 } +645 } +646 +647/** +648 * Returns true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false is returned. +649 * +650 * @return true if the Nexus Analyzer should use the configured proxy to connect to Nexus; otherwise false +651 */ +652publicboolean isNexusUsesProxy() { +653// If they didn't specify whether Nexus needs to use the proxy, we should +654// still honor the property if it's set. +655if (line == null || !line.hasOption(ARGUMENT.NEXUS_USES_PROXY)) { +656try { +657return Settings.getBoolean(Settings.KEYS.ANALYZER_NEXUS_PROXY); +658 } catch (InvalidSettingException ise) { +659returntrue; +660 } +661 } else { +662return Boolean.parseBoolean(line.getOptionValue(ARGUMENT.NEXUS_USES_PROXY)); +663 } +664 } +665 +666/** +667 * Displays the command line help message to the standard output.668 */ -669public String getReportDirectory() { -670return line.getOptionValue(ARGUMENT.OUT, "."); -671 } -672 -673/** -674 * Returns the path to Mono for .NET Assembly analysis on non-windows systems. -675 * -676 * @return the path to Mono -677 */ -678public String getPathToMono() { -679return line.getOptionValue(ARGUMENT.PATH_TO_MONO); -680 } +669publicvoid printHelp() { +670final HelpFormatter formatter = new HelpFormatter(); +671final Options options = new Options(); +672 addStandardOptions(options); +673if (line != null && line.hasOption(ARGUMENT.ADVANCED_HELP)) { +674 addAdvancedOptions(options); +675 } +676final String helpMsg = String.format("%n%s" +677 + " can be used to identify if there are any known CVE vulnerabilities in libraries utilized by an application. " +678 + "%s will automatically update required data from the Internet, such as the CVE and CPE data files from nvd.nist.gov.%n%n", +679 Settings.getString("application.name", "DependencyCheck"), +680 Settings.getString("application.name", "DependencyCheck")); 681 -682/** -683 * Returns the output format specified on the command line. Defaults to HTML if no format was specified. -684 * -685 * @return the output format name. -686 */ -687public String getReportFormat() { -688return line.getOptionValue(ARGUMENT.OUTPUT_FORMAT, "HTML"); -689 } -690 -691/** -692 * Returns the application name specified on the command line. -693 * -694 * @return the application name. -695 */ -696public String getApplicationName() { -697return line.getOptionValue(ARGUMENT.APP_NAME); -698 } -699 -700/** -701 * Returns the base URL for the CVE 1.2 XMl file. -702 * -703 * @return the URL to the CVE 1.2 XML file. -704 */ -705public String getBaseCve12Url() { -706return line.getOptionValue(ARGUMENT.CVE_BASE_12); -707 } -708 -709/** -710 * Returns the base URL for the CVE 2.0 XMl file. -711 * -712 * @return the URL to the CVE 2.0 XML file. -713 */ -714public String getBaseCve20Url() { -715return line.getOptionValue(ARGUMENT.CVE_BASE_20); -716 } -717 -718/** -719 * Returns the URL for the modified CVE 1.2 XMl file. -720 * -721 * @return the URL to the modified CVE 1.2 XML file. -722 */ -723public String getModifiedCve12Url() { -724return line.getOptionValue(ARGUMENT.CVE_MOD_12); -725 } -726 -727/** -728 * Returns the URL for the modified CVE 2.0 XMl file. -729 * -730 * @return the URL to the modified CVE 2.0 XML file. -731 */ -732public String getModifiedCve20Url() { -733return line.getOptionValue(ARGUMENT.CVE_MOD_20); -734 } -735 -736/** -737 * Returns the connection timeout. -738 * -739 * @return the connection timeout -740 */ -741public String getConnectionTimeout() { -742return line.getOptionValue(ARGUMENT.CONNECTION_TIMEOUT); -743 } -744 -745/** -746 * Returns the proxy server. -747 * -748 * @return the proxy server -749 */ -750 @SuppressWarnings("deprecation") -751public String getProxyServer() { -752 -753 String server = line.getOptionValue(ARGUMENT.PROXY_SERVER); -754if (server == null) { -755 server = line.getOptionValue(ARGUMENT.PROXY_URL); -756if (server != null) { -757 LOGGER.warn("An old command line argument 'proxyurl' was detected; use proxyserver instead"); -758 } -759 } -760return server; -761 } -762 -763/** -764 * Returns the proxy port. -765 * -766 * @return the proxy port -767 */ -768public String getProxyPort() { -769return line.getOptionValue(ARGUMENT.PROXY_PORT); -770 } -771 -772/** -773 * Returns the proxy username. -774 * -775 * @return the proxy username -776 */ -777public String getProxyUsername() { -778return line.getOptionValue(ARGUMENT.PROXY_USERNAME); -779 } -780 -781/** -782 * Returns the proxy password. -783 * -784 * @return the proxy password -785 */ -786public String getProxyPassword() { -787return line.getOptionValue(ARGUMENT.PROXY_PASSWORD); -788 } -789 -790/** -791 * Get the value of dataDirectory. -792 * -793 * @return the value of dataDirectory -794 */ -795public String getDataDirectory() { -796return line.getOptionValue(ARGUMENT.DATA_DIRECTORY); -797 } -798 -799/** -800 * Returns the properties file specified on the command line. -801 * -802 * @return the properties file specified on the command line -803 */ -804public File getPropertiesFile() { -805final String path = line.getOptionValue(ARGUMENT.PROP); -806if (path != null) { -807returnnew File(path); +682 formatter.printHelp(Settings.getString("application.name", "DependencyCheck"), +683 helpMsg, +684 options, +685"", +686true); +687 } +688 +689/** +690 * Retrieves the file command line parameter(s) specified for the 'scan' argument. +691 * +692 * @return the file paths specified on the command line for scan +693 */ +694public String[] getScanFiles() { +695return line.getOptionValues(ARGUMENT.SCAN); +696 } +697 +698/** +699 * Retrieves the list of excluded file patterns specified by the 'exclude' argument. +700 * +701 * @return the excluded file patterns +702 */ +703public String[] getExcludeList() { +704return line.getOptionValues(ARGUMENT.EXCLUDE); +705 } +706 +707/** +708 * Returns the directory to write the reports to specified on the command line. +709 * +710 * @return the path to the reports directory. +711 */ +712public String getReportDirectory() { +713return line.getOptionValue(ARGUMENT.OUT, "."); +714 } +715 +716/** +717 * Returns the path to Mono for .NET Assembly analysis on non-windows systems. +718 * +719 * @return the path to Mono +720 */ +721public String getPathToMono() { +722return line.getOptionValue(ARGUMENT.PATH_TO_MONO); +723 } +724 +725/** +726 * Returns the output format specified on the command line. Defaults to HTML if no format was specified. +727 * +728 * @return the output format name. +729 */ +730public String getReportFormat() { +731return line.getOptionValue(ARGUMENT.OUTPUT_FORMAT, "HTML"); +732 } +733 +734/** +735 * Returns the application name specified on the command line. +736 * +737 * @return the application name. +738 */ +739public String getProjectName() { +740final String appName = line.getOptionValue(ARGUMENT.APP_NAME); +741 String name = line.getOptionValue(ARGUMENT.PROJECT); +742if (name == null && appName != null) { +743 name = appName; +744 LOGGER.warn("The '" + ARGUMENT.APP_NAME + "' argument should no longer be used; use '" + ARGUMENT.PROJECT + "' instead."); +745 } +746return name; +747 } +748 +749/** +750 * Returns the base URL for the CVE 1.2 XMl file. +751 * +752 * @return the URL to the CVE 1.2 XML file. +753 */ +754public String getBaseCve12Url() { +755return line.getOptionValue(ARGUMENT.CVE_BASE_12); +756 } +757 +758/** +759 * Returns the base URL for the CVE 2.0 XMl file. +760 * +761 * @return the URL to the CVE 2.0 XML file. +762 */ +763public String getBaseCve20Url() { +764return line.getOptionValue(ARGUMENT.CVE_BASE_20); +765 } +766 +767/** +768 * Returns the URL for the modified CVE 1.2 XMl file. +769 * +770 * @return the URL to the modified CVE 1.2 XML file. +771 */ +772public String getModifiedCve12Url() { +773return line.getOptionValue(ARGUMENT.CVE_MOD_12); +774 } +775 +776/** +777 * Returns the URL for the modified CVE 2.0 XMl file. +778 * +779 * @return the URL to the modified CVE 2.0 XML file. +780 */ +781public String getModifiedCve20Url() { +782return line.getOptionValue(ARGUMENT.CVE_MOD_20); +783 } +784 +785/** +786 * Returns the connection timeout. +787 * +788 * @return the connection timeout +789 */ +790public String getConnectionTimeout() { +791return line.getOptionValue(ARGUMENT.CONNECTION_TIMEOUT); +792 } +793 +794/** +795 * Returns the proxy server. +796 * +797 * @return the proxy server +798 */ +799 @SuppressWarnings("deprecation") +800public String getProxyServer() { +801 +802 String server = line.getOptionValue(ARGUMENT.PROXY_SERVER); +803if (server == null) { +804 server = line.getOptionValue(ARGUMENT.PROXY_URL); +805if (server != null) { +806 LOGGER.warn("An old command line argument 'proxyurl' was detected; use proxyserver instead"); +807 } 808 } -809returnnull; +809return server; 810 } 811812/** -813 * Returns the path to the verbose log file. +813 * Returns the proxy port.814 * -815 * @return the path to the verbose log file +815 * @return the proxy port816 */ -817public String getVerboseLog() { -818return line.getOptionValue(ARGUMENT.VERBOSE_LOG); +817public String getProxyPort() { +818return line.getOptionValue(ARGUMENT.PROXY_PORT); 819 } 820821/** -822 * Returns the path to the suppression file. +822 * Returns the proxy username.823 * -824 * @return the path to the suppression file +824 * @return the proxy username825 */ -826public String getSuppressionFile() { -827return line.getOptionValue(ARGUMENT.SUPPRESSION_FILE); +826public String getProxyUsername() { +827return line.getOptionValue(ARGUMENT.PROXY_USERNAME); 828 } 829830/** -831 * <p> -832 * Prints the manifest information to standard output.</p> -833 * <ul><li>Implementation-Title: ${pom.name}</li> -834 * <li>Implementation-Version: ${pom.version}</li></ul> -835 */ -836publicvoid printVersionInfo() { -837final String version = String.format("%s version %s", -838 Settings.getString(Settings.KEYS.APPLICATION_VAME, "dependency-check"), -839 Settings.getString(Settings.KEYS.APPLICATION_VERSION, "Unknown")); -840 System.out.println(version); -841 } -842 -843/** -844 * Checks if the auto update feature has been disabled. If it has been disabled via the command line this will return false. -845 * -846 * @return <code>true</code> if auto-update is allowed; otherwise <code>false</code> -847 */ -848publicboolean isAutoUpdate() { -849return (line == null) || !line.hasOption(ARGUMENT.DISABLE_AUTO_UPDATE); -850 } -851 -852/** -853 * Checks if the update only flag has been set. -854 * -855 * @return <code>true</code> if the update only flag has been set; otherwise <code>false</code>. -856 */ -857publicboolean isUpdateOnly() { -858return (line == null) || line.hasOption(ARGUMENT.UPDATE_ONLY); +831 * Returns the proxy password. +832 * +833 * @return the proxy password +834 */ +835public String getProxyPassword() { +836return line.getOptionValue(ARGUMENT.PROXY_PASSWORD); +837 } +838 +839/** +840 * Get the value of dataDirectory. +841 * +842 * @return the value of dataDirectory +843 */ +844public String getDataDirectory() { +845return line.getOptionValue(ARGUMENT.DATA_DIRECTORY); +846 } +847 +848/** +849 * Returns the properties file specified on the command line. +850 * +851 * @return the properties file specified on the command line +852 */ +853public File getPropertiesFile() { +854final String path = line.getOptionValue(ARGUMENT.PROP); +855if (path != null) { +856returnnew File(path); +857 } +858returnnull; 859 } 860861/** -862 * Returns the database driver name if specified; otherwise null is returned. +862 * Returns the path to the verbose log file.863 * -864 * @return the database driver name if specified; otherwise null is returned +864 * @return the path to the verbose log file865 */ -866public String getDatabaseDriverName() { -867return line.getOptionValue(ARGUMENT.DB_DRIVER); +866public String getVerboseLog() { +867return line.getOptionValue(ARGUMENT.VERBOSE_LOG); 868 } 869870/** -871 * Returns the database driver path if specified; otherwise null is returned. +871 * Returns the path to the suppression file.872 * -873 * @return the database driver name if specified; otherwise null is returned +873 * @return the path to the suppression file874 */ -875public String getDatabaseDriverPath() { -876return line.getOptionValue(ARGUMENT.DB_DRIVER_PATH); +875public String getSuppressionFile() { +876return line.getOptionValue(ARGUMENT.SUPPRESSION_FILE); 877 } 878879/** -880 * Returns the database connection string if specified; otherwise null is returned. -881 * -882 * @return the database connection string if specified; otherwise null is returned -883 */ -884public String getConnectionString() { -885return line.getOptionValue(ARGUMENT.CONNECTION_STRING); -886 } -887 -888/** -889 * Returns the database database user name if specified; otherwise null is returned. -890 * -891 * @return the database database user name if specified; otherwise null is returned -892 */ -893public String getDatabaseUser() { -894return line.getOptionValue(ARGUMENT.DB_NAME); -895 } -896 -897/** -898 * Returns the database database password if specified; otherwise null is returned. -899 * -900 * @return the database database password if specified; otherwise null is returned -901 */ -902public String getDatabasePassword() { -903return line.getOptionValue(ARGUMENT.DB_PASSWORD); -904 } -905 -906/** -907 * Returns the additional Extensions if specified; otherwise null is returned. -908 * -909 * @return the additional Extensions; otherwise null is returned -910 */ -911public String getAdditionalZipExtensions() { -912return line.getOptionValue(ARGUMENT.ADDITIONAL_ZIP_EXTENSIONS); -913 } -914 -915/** -916 * A collection of static final strings that represent the possible command line arguments. -917 */ -918publicstaticclassARGUMENT { -919 -920/** -921 * The long CLI argument name specifying the directory/file to scan. -922 */ -923publicstaticfinal String SCAN = "scan"; -924/** -925 * The short CLI argument name specifying the directory/file to scan. -926 */ -927publicstaticfinal String SCAN_SHORT = "s"; -928/** -929 * The long CLI argument name specifying that the CPE/CVE/etc. data should not be automatically updated. -930 */ -931publicstaticfinal String DISABLE_AUTO_UPDATE = "noupdate"; -932/** -933 * The short CLI argument name specifying that the CPE/CVE/etc. data should not be automatically updated. -934 */ -935publicstaticfinal String DISABLE_AUTO_UPDATE_SHORT = "n"; -936/** -937 * The long CLI argument name specifying that only the update phase should be executed; no scan should be run. -938 */ -939publicstaticfinal String UPDATE_ONLY = "updateonly"; -940/** -941 * The long CLI argument name specifying the directory to write the reports to. -942 */ -943publicstaticfinal String OUT = "out"; -944/** -945 * The short CLI argument name specifying the directory to write the reports to. -946 */ -947publicstaticfinal String OUT_SHORT = "o"; -948/** -949 * The long CLI argument name specifying the output format to write the reports to. -950 */ -951publicstaticfinal String OUTPUT_FORMAT = "format"; -952/** -953 * The short CLI argument name specifying the output format to write the reports to. -954 */ -955publicstaticfinal String OUTPUT_FORMAT_SHORT = "f"; -956/** -957 * The long CLI argument name specifying the name of the application to be scanned. -958 */ -959publicstaticfinal String APP_NAME = "app"; -960/** -961 * The short CLI argument name specifying the name of the application to be scanned. -962 */ -963publicstaticfinal String APP_NAME_SHORT = "a"; -964/** -965 * The long CLI argument name asking for help. -966 */ -967publicstaticfinal String HELP = "help"; -968/** -969 * The long CLI argument name asking for advanced help. -970 */ -971publicstaticfinal String ADVANCED_HELP = "advancedHelp"; -972/** -973 * The short CLI argument name asking for help. -974 */ -975publicstaticfinal String HELP_SHORT = "h"; -976/** -977 * The long CLI argument name asking for the version. -978 */ -979publicstaticfinal String VERSION_SHORT = "v"; -980/** -981 * The short CLI argument name asking for the version. -982 */ -983publicstaticfinal String VERSION = "version"; -984/** -985 * The CLI argument name indicating the proxy port. -986 */ -987publicstaticfinal String PROXY_PORT = "proxyport"; -988/** -989 * The CLI argument name indicating the proxy server. -990 */ -991publicstaticfinal String PROXY_SERVER = "proxyserver"; -992/** -993 * The CLI argument name indicating the proxy url. -994 * -995 * @deprecated use {@link #PROXY_SERVER} instead +880 * <p> +881 * Prints the manifest information to standard output.</p> +882 * <ul><li>Implementation-Title: ${pom.name}</li> +883 * <li>Implementation-Version: ${pom.version}</li></ul> +884 */ +885publicvoid printVersionInfo() { +886final String version = String.format("%s version %s", +887 Settings.getString(Settings.KEYS.APPLICATION_VAME, "dependency-check"), +888 Settings.getString(Settings.KEYS.APPLICATION_VERSION, "Unknown")); +889 System.out.println(version); +890 } +891 +892/** +893 * Checks if the auto update feature has been disabled. If it has been disabled via the command line this will return false. +894 * +895 * @return <code>true</code> if auto-update is allowed; otherwise <code>false</code> +896 */ +897publicboolean isAutoUpdate() { +898return line != null && !line.hasOption(ARGUMENT.DISABLE_AUTO_UPDATE); +899 } +900 +901/** +902 * Checks if the update only flag has been set. +903 * +904 * @return <code>true</code> if the update only flag has been set; otherwise <code>false</code>. +905 */ +906publicboolean isUpdateOnly() { +907return line != null && line.hasOption(ARGUMENT.UPDATE_ONLY); +908 } +909 +910/** +911 * Checks if the purge NVD flag has been set. +912 * +913 * @return <code>true</code> if the purge nvd flag has been set; otherwise <code>false</code>. +914 */ +915publicboolean isPurge() { +916return line != null && line.hasOption(ARGUMENT.PURGE_NVD); +917 } +918 +919/** +920 * Returns the database driver name if specified; otherwise null is returned. +921 * +922 * @return the database driver name if specified; otherwise null is returned +923 */ +924public String getDatabaseDriverName() { +925return line.getOptionValue(ARGUMENT.DB_DRIVER); +926 } +927 +928/** +929 * Returns the database driver path if specified; otherwise null is returned. +930 * +931 * @return the database driver name if specified; otherwise null is returned +932 */ +933public String getDatabaseDriverPath() { +934return line.getOptionValue(ARGUMENT.DB_DRIVER_PATH); +935 } +936 +937/** +938 * Returns the database connection string if specified; otherwise null is returned. +939 * +940 * @return the database connection string if specified; otherwise null is returned +941 */ +942public String getConnectionString() { +943return line.getOptionValue(ARGUMENT.CONNECTION_STRING); +944 } +945 +946/** +947 * Returns the database database user name if specified; otherwise null is returned. +948 * +949 * @return the database database user name if specified; otherwise null is returned +950 */ +951public String getDatabaseUser() { +952return line.getOptionValue(ARGUMENT.DB_NAME); +953 } +954 +955/** +956 * Returns the database database password if specified; otherwise null is returned. +957 * +958 * @return the database database password if specified; otherwise null is returned +959 */ +960public String getDatabasePassword() { +961return line.getOptionValue(ARGUMENT.DB_PASSWORD); +962 } +963 +964/** +965 * Returns the additional Extensions if specified; otherwise null is returned. +966 * +967 * @return the additional Extensions; otherwise null is returned +968 */ +969public String getAdditionalZipExtensions() { +970return line.getOptionValue(ARGUMENT.ADDITIONAL_ZIP_EXTENSIONS); +971 } +972 +973/** +974 * A collection of static final strings that represent the possible command line arguments. +975 */ +976publicstaticclassARGUMENT { +977 +978/** +979 * The long CLI argument name specifying the directory/file to scan. +980 */ +981publicstaticfinal String SCAN = "scan"; +982/** +983 * The short CLI argument name specifying the directory/file to scan. +984 */ +985publicstaticfinal String SCAN_SHORT = "s"; +986/** +987 * The long CLI argument name specifying that the CPE/CVE/etc. data should not be automatically updated. +988 */ +989publicstaticfinal String DISABLE_AUTO_UPDATE = "noupdate"; +990/** +991 * The short CLI argument name specifying that the CPE/CVE/etc. data should not be automatically updated. +992 */ +993publicstaticfinal String DISABLE_AUTO_UPDATE_SHORT = "n"; +994/** +995 * The long CLI argument name specifying that only the update phase should be executed; no scan should be run.996 */ -997 @Deprecated -998publicstaticfinal String PROXY_URL = "proxyurl"; -999/** -1000 * The CLI argument name indicating the proxy username. -1001 */ -1002publicstaticfinal String PROXY_USERNAME = "proxyuser"; -1003/** -1004 * The CLI argument name indicating the proxy password. -1005 */ -1006publicstaticfinal String PROXY_PASSWORD = "proxypass"; -1007/** -1008 * The short CLI argument name indicating the connection timeout. -1009 */ -1010publicstaticfinal String CONNECTION_TIMEOUT_SHORT = "c"; -1011/** -1012 * The CLI argument name indicating the connection timeout. -1013 */ -1014publicstaticfinal String CONNECTION_TIMEOUT = "connectiontimeout"; -1015/** -1016 * The short CLI argument name for setting the location of an additional properties file. -1017 */ -1018publicstaticfinal String PROP_SHORT = "P"; -1019/** -1020 * The CLI argument name for setting the location of an additional properties file. -1021 */ -1022publicstaticfinal String PROP = "propertyfile"; -1023/** -1024 * The CLI argument name for setting the location of the data directory. -1025 */ -1026publicstaticfinal String DATA_DIRECTORY = "data"; -1027/** -1028 * The CLI argument name for setting the URL for the CVE Data Files. -1029 */ -1030publicstaticfinal String CVE_MOD_12 = "cveUrl12Modified"; -1031/** -1032 * The CLI argument name for setting the URL for the CVE Data Files. +997publicstaticfinal String UPDATE_ONLY = "updateonly"; +998/** +999 * The long CLI argument name specifying that only the update phase should be executed; no scan should be run. +1000 */ +1001publicstaticfinal String PURGE_NVD = "purge"; +1002/** +1003 * The long CLI argument name specifying the directory to write the reports to. +1004 */ +1005publicstaticfinal String OUT = "out"; +1006/** +1007 * The short CLI argument name specifying the directory to write the reports to. +1008 */ +1009publicstaticfinal String OUT_SHORT = "o"; +1010/** +1011 * The long CLI argument name specifying the output format to write the reports to. +1012 */ +1013publicstaticfinal String OUTPUT_FORMAT = "format"; +1014/** +1015 * The short CLI argument name specifying the output format to write the reports to. +1016 */ +1017publicstaticfinal String OUTPUT_FORMAT_SHORT = "f"; +1018/** +1019 * The long CLI argument name specifying the name of the project to be scanned. +1020 */ +1021publicstaticfinal String PROJECT = "project"; +1022/** +1023 * The long CLI argument name specifying the name of the application to be scanned. +1024 * +1025 * @deprecated project should be used instead +1026 */ +1027 @Deprecated +1028publicstaticfinal String APP_NAME = "app"; +1029/** +1030 * The short CLI argument name specifying the name of the application to be scanned. +1031 * +1032 * @deprecated project should be used instead1033 */ -1034publicstaticfinal String CVE_MOD_20 = "cveUrl20Modified"; -1035/** -1036 * The CLI argument name for setting the URL for the CVE Data Files. -1037 */ -1038publicstaticfinal String CVE_BASE_12 = "cveUrl12Base"; -1039/** -1040 * The CLI argument name for setting the URL for the CVE Data Files. -1041 */ -1042publicstaticfinal String CVE_BASE_20 = "cveUrl20Base"; -1043/** -1044 * The short CLI argument name for setting the location of the data directory. -1045 */ -1046publicstaticfinal String DATA_DIRECTORY_SHORT = "d"; -1047/** -1048 * The CLI argument name for setting the location of the data directory. -1049 */ -1050publicstaticfinal String VERBOSE_LOG = "log"; -1051/** -1052 * The short CLI argument name for setting the location of the data directory. -1053 */ -1054publicstaticfinal String VERBOSE_LOG_SHORT = "l"; -1055 +1034 @Deprecated +1035publicstaticfinal String APP_NAME_SHORT = "a"; +1036/** +1037 * The long CLI argument name asking for help. +1038 */ +1039publicstaticfinal String HELP = "help"; +1040/** +1041 * The long CLI argument name asking for advanced help. +1042 */ +1043publicstaticfinal String ADVANCED_HELP = "advancedHelp"; +1044/** +1045 * The short CLI argument name asking for help. +1046 */ +1047publicstaticfinal String HELP_SHORT = "h"; +1048/** +1049 * The long CLI argument name asking for the version. +1050 */ +1051publicstaticfinal String VERSION_SHORT = "v"; +1052/** +1053 * The short CLI argument name asking for the version. +1054 */ +1055publicstaticfinal String VERSION = "version"; 1056/** -1057 * The CLI argument name for setting the depth of symbolic links that will be followed. +1057 * The CLI argument name indicating the proxy port.1058 */ -1059publicstaticfinal String SYM_LINK_DEPTH = "symLink"; +1059publicstaticfinal String PROXY_PORT = "proxyport"; 1060/** -1061 * The CLI argument name for setting the location of the suppression file. +1061 * The CLI argument name indicating the proxy server.1062 */ -1063publicstaticfinal String SUPPRESSION_FILE = "suppression"; +1063publicstaticfinal String PROXY_SERVER = "proxyserver"; 1064/** -1065 * Disables the Jar Analyzer. -1066 */ -1067publicstaticfinal String DISABLE_JAR = "disableJar"; -1068/** -1069 * Disables the Archive Analyzer. -1070 */ -1071publicstaticfinal String DISABLE_ARCHIVE = "disableArchive"; -1072/** -1073 * Disables the Python Distribution Analyzer. -1074 */ -1075publicstaticfinal String DISABLE_PY_DIST = "disablePyDist"; -1076/** -1077 * Disables the Python Package Analyzer. -1078 */ -1079publicstaticfinal String DISABLE_PY_PKG = "disablePyPkg"; -1080/** -1081 * Disables the Autoconf Analyzer. -1082 */ -1083publicstaticfinal String DISABLE_AUTOCONF = "disableAutoconf"; -1084/** -1085 * Disables the Cmake Analyzer. -1086 */ -1087publicstaticfinal String DISABLE_CMAKE = "disableCmake"; -1088/** -1089 * Disables the Assembly Analyzer. -1090 */ -1091publicstaticfinal String DISABLE_ASSEMBLY = "disableAssembly"; -1092/** -1093 * Disables the Nuspec Analyzer. -1094 */ -1095publicstaticfinal String DISABLE_NUSPEC = "disableNuspec"; -1096/** -1097 * Disables the Central Analyzer. -1098 */ -1099publicstaticfinal String DISABLE_CENTRAL = "disableCentral"; -1100/** -1101 * Disables the Nexus Analyzer. -1102 */ -1103publicstaticfinal String DISABLE_NEXUS = "disableNexus"; -1104/** -1105 * Disables the OpenSSL Analyzer. -1106 */ -1107publicstaticfinal String DISABLE_OPENSSL = "disableOpenSSL"; -1108/** -1109 * The URL of the nexus server. -1110 */ -1111publicstaticfinal String NEXUS_URL = "nexus"; -1112/** -1113 * Whether or not the defined proxy should be used when connecting to Nexus. -1114 */ -1115publicstaticfinal String NEXUS_USES_PROXY = "nexusUsesProxy"; -1116/** -1117 * The CLI argument name for setting the connection string. -1118 */ -1119publicstaticfinal String CONNECTION_STRING = "connectionString"; -1120/** -1121 * The CLI argument name for setting the database user name. -1122 */ -1123publicstaticfinal String DB_NAME = "dbUser"; -1124/** -1125 * The CLI argument name for setting the database password. -1126 */ -1127publicstaticfinal String DB_PASSWORD = "dbPassword"; +1065 * The CLI argument name indicating the proxy url. +1066 * +1067 * @deprecated use {@link #PROXY_SERVER} instead +1068 */ +1069 @Deprecated +1070publicstaticfinal String PROXY_URL = "proxyurl"; +1071/** +1072 * The CLI argument name indicating the proxy username. +1073 */ +1074publicstaticfinal String PROXY_USERNAME = "proxyuser"; +1075/** +1076 * The CLI argument name indicating the proxy password. +1077 */ +1078publicstaticfinal String PROXY_PASSWORD = "proxypass"; +1079/** +1080 * The short CLI argument name indicating the connection timeout. +1081 */ +1082publicstaticfinal String CONNECTION_TIMEOUT_SHORT = "c"; +1083/** +1084 * The CLI argument name indicating the connection timeout. +1085 */ +1086publicstaticfinal String CONNECTION_TIMEOUT = "connectiontimeout"; +1087/** +1088 * The short CLI argument name for setting the location of an additional properties file. +1089 */ +1090publicstaticfinal String PROP_SHORT = "P"; +1091/** +1092 * The CLI argument name for setting the location of an additional properties file. +1093 */ +1094publicstaticfinal String PROP = "propertyfile"; +1095/** +1096 * The CLI argument name for setting the location of the data directory. +1097 */ +1098publicstaticfinal String DATA_DIRECTORY = "data"; +1099/** +1100 * The CLI argument name for setting the URL for the CVE Data Files. +1101 */ +1102publicstaticfinal String CVE_MOD_12 = "cveUrl12Modified"; +1103/** +1104 * The CLI argument name for setting the URL for the CVE Data Files. +1105 */ +1106publicstaticfinal String CVE_MOD_20 = "cveUrl20Modified"; +1107/** +1108 * The CLI argument name for setting the URL for the CVE Data Files. +1109 */ +1110publicstaticfinal String CVE_BASE_12 = "cveUrl12Base"; +1111/** +1112 * The CLI argument name for setting the URL for the CVE Data Files. +1113 */ +1114publicstaticfinal String CVE_BASE_20 = "cveUrl20Base"; +1115/** +1116 * The short CLI argument name for setting the location of the data directory. +1117 */ +1118publicstaticfinal String DATA_DIRECTORY_SHORT = "d"; +1119/** +1120 * The CLI argument name for setting the location of the data directory. +1121 */ +1122publicstaticfinal String VERBOSE_LOG = "log"; +1123/** +1124 * The short CLI argument name for setting the location of the data directory. +1125 */ +1126publicstaticfinal String VERBOSE_LOG_SHORT = "l"; +11271128/** -1129 * The CLI argument name for setting the database driver name. +1129 * The CLI argument name for setting the depth of symbolic links that will be followed.1130 */ -1131publicstaticfinal String DB_DRIVER = "dbDriverName"; +1131publicstaticfinal String SYM_LINK_DEPTH = "symLink"; 1132/** -1133 * The CLI argument name for setting the path to the database driver; in case it is not on the class path. +1133 * The CLI argument name for setting the location of the suppression file.1134 */ -1135publicstaticfinal String DB_DRIVER_PATH = "dbDriverPath"; +1135publicstaticfinal String SUPPRESSION_FILE = "suppression"; 1136/** -1137 * The CLI argument name for setting the path to mono for .NET Assembly analysis on non-windows systems. +1137 * Disables the Jar Analyzer.1138 */ -1139publicstaticfinal String PATH_TO_MONO = "mono"; +1139publicstaticfinal String DISABLE_JAR = "disableJar"; 1140/** -1141 * The CLI argument name for setting extra extensions. +1141 * Disables the Archive Analyzer.1142 */ -1143publicstaticfinal String ADDITIONAL_ZIP_EXTENSIONS = "zipExtensions"; +1143publicstaticfinal String DISABLE_ARCHIVE = "disableArchive"; 1144/** -1145 * Exclude path argument. +1145 * Disables the Python Distribution Analyzer.1146 */ -1147publicstaticfinal String EXCLUDE = "exclude"; -1148 } -1149 } +1147publicstaticfinal String DISABLE_PY_DIST = "disablePyDist"; +1148/** +1149 * Disables the Python Package Analyzer. +1150 */ +1151publicstaticfinal String DISABLE_PY_PKG = "disablePyPkg"; +1152/** +1153 * Disables the Python Package Analyzer. +1154 */ +1155publicstaticfinal String DISABLE_COMPOSER = "disableComposer"; +1156/** +1157 * Disables the Ruby Gemspec Analyzer. +1158 */ +1159publicstaticfinal String DISABLE_RUBYGEMS = "disableRubygems"; +1160/** +1161 * Disables the Autoconf Analyzer. +1162 */ +1163publicstaticfinal String DISABLE_AUTOCONF = "disableAutoconf"; +1164/** +1165 * Disables the Cmake Analyzer. +1166 */ +1167publicstaticfinal String DISABLE_CMAKE = "disableCmake"; +1168/** +1169 * Disables the Assembly Analyzer. +1170 */ +1171publicstaticfinal String DISABLE_ASSEMBLY = "disableAssembly"; +1172/** +1173 * Disables the Nuspec Analyzer. +1174 */ +1175publicstaticfinal String DISABLE_NUSPEC = "disableNuspec"; +1176/** +1177 * Disables the Central Analyzer. +1178 */ +1179publicstaticfinal String DISABLE_CENTRAL = "disableCentral"; +1180/** +1181 * Disables the Nexus Analyzer. +1182 */ +1183publicstaticfinal String DISABLE_NEXUS = "disableNexus"; +1184/** +1185 * Disables the OpenSSL Analyzer. +1186 */ +1187publicstaticfinal String DISABLE_OPENSSL = "disableOpenSSL"; +1188/** +1189 * Disables the Node.js Package Analyzer. +1190 */ +1191publicstaticfinal String DISABLE_NODE_JS = "disableNodeJS"; +1192/** +1193 * The URL of the nexus server. +1194 */ +1195publicstaticfinal String NEXUS_URL = "nexus"; +1196/** +1197 * Whether or not the defined proxy should be used when connecting to Nexus. +1198 */ +1199publicstaticfinal String NEXUS_USES_PROXY = "nexusUsesProxy"; +1200/** +1201 * The CLI argument name for setting the connection string. +1202 */ +1203publicstaticfinal String CONNECTION_STRING = "connectionString"; +1204/** +1205 * The CLI argument name for setting the database user name. +1206 */ +1207publicstaticfinal String DB_NAME = "dbUser"; +1208/** +1209 * The CLI argument name for setting the database password. +1210 */ +1211publicstaticfinal String DB_PASSWORD = "dbPassword"; +1212/** +1213 * The CLI argument name for setting the database driver name. +1214 */ +1215publicstaticfinal String DB_DRIVER = "dbDriverName"; +1216/** +1217 * The CLI argument name for setting the path to the database driver; in case it is not on the class path. +1218 */ +1219publicstaticfinal String DB_DRIVER_PATH = "dbDriverPath"; +1220/** +1221 * The CLI argument name for setting the path to mono for .NET Assembly analysis on non-windows systems. +1222 */ +1223publicstaticfinal String PATH_TO_MONO = "mono"; +1224/** +1225 * The CLI argument name for setting extra extensions. +1226 */ +1227publicstaticfinal String ADDITIONAL_ZIP_EXTENSIONS = "zipExtensions"; +1228/** +1229 * Exclude path argument. +1230 */ +1231publicstaticfinal String EXCLUDE = "exclude"; +1232 } +1233 }
    diff --git a/dependency-check-cli/xref/org/owasp/dependencycheck/InvalidScanPathException.html b/dependency-check-cli/xref/org/owasp/dependencycheck/InvalidScanPathException.html index 6f0a5367b..fe9582c50 100644 --- a/dependency-check-cli/xref/org/owasp/dependencycheck/InvalidScanPathException.html +++ b/dependency-check-cli/xref/org/owasp/dependencycheck/InvalidScanPathException.html @@ -33,40 +33,45 @@ 25classInvalidScanPathExceptionextends Exception { 2627/** -28 * Creates a new InvalidScanPathException. +28 * The serial version UID for serialization.29 */ -30publicInvalidScanPathException() { -31super(); -32 } -33 -34/** -35 * Creates a new InvalidScanPathException. -36 * -37 * @param msg a message for the exception -38 */ -39publicInvalidScanPathException(String msg) { -40super(msg); -41 } -42 -43/** -44 * Creates a new InvalidScanPathException. -45 * -46 * @param ex the cause of the exception -47 */ -48publicInvalidScanPathException(Throwable ex) { -49super(ex); -50 } -51 -52/** -53 * Creates a new InvalidScanPathException. -54 * -55 * @param msg a message for the exception -56 * @param ex the cause of the exception -57 */ -58publicInvalidScanPathException(String msg, Throwable ex) { -59super(msg, ex); -60 } -61 } +30privatestaticfinallong serialVersionUID = 1L; +31 +32/** +33 * Creates a new InvalidScanPathException. +34 */ +35publicInvalidScanPathException() { +36super(); +37 } +38 +39/** +40 * Creates a new InvalidScanPathException. +41 * +42 * @param msg a message for the exception +43 */ +44publicInvalidScanPathException(String msg) { +45super(msg); +46 } +47 +48/** +49 * Creates a new InvalidScanPathException. +50 * +51 * @param ex the cause of the exception +52 */ +53publicInvalidScanPathException(Throwable ex) { +54super(ex); +55 } +56 +57/** +58 * Creates a new InvalidScanPathException. +59 * +60 * @param msg a message for the exception +61 * @param ex the cause of the exception +62 */ +63publicInvalidScanPathException(String msg, Throwable ex) { +64super(msg, ex); +65 } +66 }
    diff --git a/dependency-check-cli/xref/org/owasp/dependencycheck/package-frame.html b/dependency-check-cli/xref/org/owasp/dependencycheck/package-frame.html index aa8c2df17..ff54436b0 100644 --- a/dependency-check-cli/xref/org/owasp/dependencycheck/package-frame.html +++ b/dependency-check-cli/xref/org/owasp/dependencycheck/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Command Line 1.3.0 Reference Package org.owasp.dependencycheck + Dependency-Check Command Line 1.3.1 Reference Package org.owasp.dependencycheck diff --git a/dependency-check-cli/xref/org/owasp/dependencycheck/package-summary.html b/dependency-check-cli/xref/org/owasp/dependencycheck/package-summary.html index 0a0f41b78..379fc30af 100644 --- a/dependency-check-cli/xref/org/owasp/dependencycheck/package-summary.html +++ b/dependency-check-cli/xref/org/owasp/dependencycheck/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Command Line 1.3.0 Reference Package org.owasp.dependencycheck + Dependency-Check Command Line 1.3.1 Reference Package org.owasp.dependencycheck diff --git a/dependency-check-cli/xref/overview-frame.html b/dependency-check-cli/xref/overview-frame.html index fb39eca17..781dad3e5 100644 --- a/dependency-check-cli/xref/overview-frame.html +++ b/dependency-check-cli/xref/overview-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Command Line 1.3.0 Reference + Dependency-Check Command Line 1.3.1 Reference diff --git a/dependency-check-cli/xref/overview-summary.html b/dependency-check-cli/xref/overview-summary.html index 0c575d8cf..2560b61d1 100644 --- a/dependency-check-cli/xref/overview-summary.html +++ b/dependency-check-cli/xref/overview-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Command Line 1.3.0 Reference + Dependency-Check Command Line 1.3.1 Reference @@ -24,7 +24,7 @@ -

    Dependency-Check Command Line 1.3.0 Reference

    +

    Dependency-Check Command Line 1.3.1 Reference

    diff --git a/dependency-check-core/apidocs/allclasses-frame.html b/dependency-check-core/apidocs/allclasses-frame.html index 29024d026..e5f0a0ae9 100644 --- a/dependency-check-core/apidocs/allclasses-frame.html +++ b/dependency-check-core/apidocs/allclasses-frame.html @@ -2,10 +2,10 @@ - + -All Classes (Dependency-Check Core 1.3.0 API) - +All Classes (Dependency-Check Core 1.3.1 API) + @@ -30,11 +30,16 @@
  • CentralAnalyzer
  • CentralSearch
  • CMakeAnalyzer
  • +
  • ComposerDependency
  • +
  • ComposerException
  • +
  • ComposerLockAnalyzer
  • +
  • ComposerLockParser
  • Confidence
  • ConnectionFactory
  • Cpe
  • CPEAnalyzer
  • CPEHandler
  • +
  • CPEHandler.Element
  • CpeMemoryIndex
  • CpeSuppressionAnalyzer
  • CpeUpdater
  • @@ -81,6 +86,7 @@
  • NexusAnalyzer
  • NexusSearch
  • NoDataException
  • +
  • NodePackageAnalyzer
  • NonClosingStream
  • NugetPackage
  • NuspecAnalyzer
  • @@ -106,6 +112,7 @@
  • Reference
  • ReportGenerator
  • ReportGenerator.Format
  • +
  • RubyGemspecAnalyzer
  • ScanAgentException
  • SearchFieldAnalyzer
  • SuppressionErrorHandler
  • diff --git a/dependency-check-core/apidocs/allclasses-noframe.html b/dependency-check-core/apidocs/allclasses-noframe.html index bad68e5d6..e48903c97 100644 --- a/dependency-check-core/apidocs/allclasses-noframe.html +++ b/dependency-check-core/apidocs/allclasses-noframe.html @@ -2,10 +2,10 @@ - + -All Classes (Dependency-Check Core 1.3.0 API) - +All Classes (Dependency-Check Core 1.3.1 API) + @@ -30,11 +30,16 @@
  • CentralAnalyzer
  • CentralSearch
  • CMakeAnalyzer
  • +
  • ComposerDependency
  • +
  • ComposerException
  • +
  • ComposerLockAnalyzer
  • +
  • ComposerLockParser
  • Confidence
  • ConnectionFactory
  • Cpe
  • CPEAnalyzer
  • CPEHandler
  • +
  • CPEHandler.Element
  • CpeMemoryIndex
  • CpeSuppressionAnalyzer
  • CpeUpdater
  • @@ -81,6 +86,7 @@
  • NexusAnalyzer
  • NexusSearch
  • NoDataException
  • +
  • NodePackageAnalyzer
  • NonClosingStream
  • NugetPackage
  • NuspecAnalyzer
  • @@ -106,6 +112,7 @@
  • Reference
  • ReportGenerator
  • ReportGenerator.Format
  • +
  • RubyGemspecAnalyzer
  • ScanAgentException
  • SearchFieldAnalyzer
  • SuppressionErrorHandler
  • diff --git a/dependency-check-core/apidocs/constant-values.html b/dependency-check-core/apidocs/constant-values.html index c35f1884b..44b729972 100644 --- a/dependency-check-core/apidocs/constant-values.html +++ b/dependency-check-core/apidocs/constant-values.html @@ -2,16 +2,16 @@ - + -Constant Field Values (Dependency-Check Core 1.3.0 API) - +Constant Field Values (Dependency-Check Core 1.3.1 API) + @@ -113,6 +113,25 @@
    +
  • + + + + + + + + + + + + + + +
    org.owasp.dependencycheck.analyzer.NodePackageAnalyzer 
    Modifier and TypeConstant FieldValue
    + +public static final StringPACKAGE_JSON"package.json"
    +
    • diff --git a/dependency-check-core/apidocs/deprecated-list.html b/dependency-check-core/apidocs/deprecated-list.html index 6f66dbb01..d681bb28b 100644 --- a/dependency-check-core/apidocs/deprecated-list.html +++ b/dependency-check-core/apidocs/deprecated-list.html @@ -2,16 +2,16 @@ - + -Deprecated List (Dependency-Check Core 1.3.0 API) - +Deprecated List (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/help-doc.html b/dependency-check-core/apidocs/help-doc.html index 2e8de79af..f95ca34f9 100644 --- a/dependency-check-core/apidocs/help-doc.html +++ b/dependency-check-core/apidocs/help-doc.html @@ -2,16 +2,16 @@ - + -API Help (Dependency-Check Core 1.3.0 API) - +API Help (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/index-all.html b/dependency-check-core/apidocs/index-all.html index c97893a4e..345b7bc84 100644 --- a/dependency-check-core/apidocs/index-all.html +++ b/dependency-check-core/apidocs/index-all.html @@ -2,16 +2,16 @@ - + -Index (Dependency-Check Core 1.3.0 API) - +Index (Dependency-Check Core 1.3.1 API) + @@ -122,7 +122,7 @@
      addCpe(String, String, String) - Method in class org.owasp.dependencycheck.data.nvdcve.CveDB
      -
      Merges CPE entries into the database.
      +
      This method is only referenced in unused code and will likely break on MySQL if ever used due to the MERGE statement.
      addCpe(PropertyType) - Method in class org.owasp.dependencycheck.suppression.SuppressionRule
      @@ -327,6 +327,10 @@
      Analyzes python packages and adds evidence to the dependency.
      +
      analyzeFileType(Dependency, Engine) - Method in class org.owasp.dependencycheck.analyzer.ComposerLockAnalyzer
      +
      +
      Entry point for the analyzer.
      +
      analyzeFileType(Dependency, Engine) - Method in class org.owasp.dependencycheck.analyzer.JarAnalyzer
      Loads a specified JAR file and collects information from the manifest and checksums to identify the correct CPE @@ -336,6 +340,8 @@
      Performs the analysis.
      +
      analyzeFileType(Dependency, Engine) - Method in class org.owasp.dependencycheck.analyzer.NodePackageAnalyzer
      +
       
      analyzeFileType(Dependency, Engine) - Method in class org.owasp.dependencycheck.analyzer.NuspecAnalyzer
      Performs the analysis.
      @@ -350,6 +356,8 @@
      Analyzes python packages and adds evidence to the dependency.
      +
      analyzeFileType(Dependency, Engine) - Method in class org.owasp.dependencycheck.analyzer.RubyGemspecAnalyzer
      +
       
      analyzePackageNames(List<JarAnalyzer.ClassNameInformation>, Dependency, boolean) - Method in class org.owasp.dependencycheck.analyzer.JarAnalyzer
      Analyzes the path information of the classes contained within the JarAnalyzer to try and determine possible vendor or @@ -515,8 +523,7 @@
      clear() - Method in class org.owasp.dependencycheck.data.lucene.TokenPairConcatenatingFilter
      - Resets the Filter and clears any internal state data that may have been left-over from previous uses of the - Filter.
      + Resets the Filter and clears any internal state data that may have been left-over from previous uses of the Filter.
      clear() - Method in class org.owasp.dependencycheck.data.update.nvd.UpdateableNvdCve
      @@ -627,6 +634,44 @@
      compareTo(DependencyVersion) - Method in class org.owasp.dependencycheck.utils.DependencyVersion
       
      +
      ComposerDependency - Class in org.owasp.dependencycheck.data.composer
      +
      +
      Reperesents a dependency (GAV, right now) from a Composer dependency.
      +
      +
      ComposerDependency(String, String, String) - Constructor for class org.owasp.dependencycheck.data.composer.ComposerDependency
      +
      +
      Create a ComposerDependency from group, project, and version.
      +
      +
      ComposerException - Exception in org.owasp.dependencycheck.data.composer
      +
      +
      Represents an exception when handling a composer.json or composer.lock file.
      +
      +
      ComposerException() - Constructor for exception org.owasp.dependencycheck.data.composer.ComposerException
      +
      +
      Creates a ComposerException with default message.
      +
      +
      ComposerException(String) - Constructor for exception org.owasp.dependencycheck.data.composer.ComposerException
      +
      +
      Creates a ComposerException with the specified message.
      +
      +
      ComposerException(String, Throwable) - Constructor for exception org.owasp.dependencycheck.data.composer.ComposerException
      +
      +
      Creates a Composer exception with the specified message and cause.
      +
      +
      ComposerLockAnalyzer - Class in org.owasp.dependencycheck.analyzer
      +
      +
      Used to analyze a composer.lock file for a composer PHP app.
      +
      +
      ComposerLockAnalyzer() - Constructor for class org.owasp.dependencycheck.analyzer.ComposerLockAnalyzer
      +
       
      +
      ComposerLockParser - Class in org.owasp.dependencycheck.data.composer
      +
      +
      Parses a Composer.lock file from an input stream.
      +
      +
      ComposerLockParser(InputStream) - Constructor for class org.owasp.dependencycheck.data.composer.ComposerLockParser
      +
      +
      Createas a ComposerLockParser from a JsonReader and an InputStream.
      +
      Confidence - Enum in org.owasp.dependencycheck.dependency
      A confidence enumeration.
      @@ -716,7 +761,7 @@
       
      CpeUpdater - Class in org.owasp.dependencycheck.data.update
      -
      The CpeUpdater is designed to download the CPE data file from NIST and import the data into the database.
      +
      This class is currently unused and if enabled will likely not work on MySQL as the MERGE statement is used.
      CpeUpdater() - Constructor for class org.owasp.dependencycheck.data.update.CpeUpdater
       
      @@ -844,7 +889,7 @@
      deleteUnusedCpe() - Method in class org.owasp.dependencycheck.data.nvdcve.CveDB
      -
      Deletes unused dictionary entries from the database.
      +
      This method is only referenced in unused code.
      Dependency - Class in org.owasp.dependencycheck.dependency
      @@ -993,8 +1038,14 @@
      A node type in the NVD CVE Schema 2.0
      +
      equals(Object) - Method in class org.owasp.dependencycheck.data.composer.ComposerDependency
      +
       
      equals(Object) - Method in class org.owasp.dependencycheck.data.cpe.IndexEntry
       
      +
      equals(Object) - Method in class org.owasp.dependencycheck.data.lucene.TokenPairConcatenatingFilter
      +
      +
      Standard equals implementation.
      +
      equals(Object) - Method in class org.owasp.dependencycheck.data.nuget.NugetPackage
       
      equals(Object) - Method in class org.owasp.dependencycheck.dependency.Dependency
      @@ -1236,6 +1287,10 @@
      Tell that we are used for information collection.
      +
      getAnalysisPhase() - Method in class org.owasp.dependencycheck.analyzer.ComposerLockAnalyzer
      +
      +
      Returns the phase this analyzer should run under.
      +
      getAnalysisPhase() - Method in class org.owasp.dependencycheck.analyzer.CPEAnalyzer
      Returns the analysis phase that this analyzer should run in.
      @@ -1268,6 +1323,10 @@
      Returns the analysis phase under which the analyzer runs.
      +
      getAnalysisPhase() - Method in class org.owasp.dependencycheck.analyzer.NodePackageAnalyzer
      +
      +
      Returns the phase that the analyzer is intended to run in.
      +
      getAnalysisPhase() - Method in class org.owasp.dependencycheck.analyzer.NuspecAnalyzer
      Returns the analysis phase under which the analyzer runs.
      @@ -1288,6 +1347,10 @@
      Tell that we are used for information collection.
      +
      getAnalysisPhase() - Method in class org.owasp.dependencycheck.analyzer.RubyGemspecAnalyzer
      +
      +
      Returns the phase that the analyzer is intended to run in.
      +
      getAnalysisPhase() - Method in class org.owasp.dependencycheck.analyzer.VulnerabilitySuppressionAnalyzer
      Returns the phase that the analyzer is intended to run in.
      @@ -1315,6 +1378,10 @@
      getAnalyzerEnabledSettingKey() - Method in class org.owasp.dependencycheck.analyzer.CMakeAnalyzer
       
      +
      getAnalyzerEnabledSettingKey() - Method in class org.owasp.dependencycheck.analyzer.ComposerLockAnalyzer
      +
      +
      Gets the key to determine whether the analyzer is enabled.
      +
      getAnalyzerEnabledSettingKey() - Method in class org.owasp.dependencycheck.analyzer.JarAnalyzer
      Returns the key used in the properties file to reference the analyzer's enabled property.
      @@ -1323,6 +1390,10 @@
      Returns the key used in the properties file to reference the analyzer's enabled property.
      +
      getAnalyzerEnabledSettingKey() - Method in class org.owasp.dependencycheck.analyzer.NodePackageAnalyzer
      +
      +
      Returns the key used in the properties file to reference the analyzer's enabled property.
      +
      getAnalyzerEnabledSettingKey() - Method in class org.owasp.dependencycheck.analyzer.NuspecAnalyzer
      Returns the key used in the properties file to reference the analyzer's enabled property.
      @@ -1335,6 +1406,10 @@
      getAnalyzerEnabledSettingKey() - Method in class org.owasp.dependencycheck.analyzer.PythonPackageAnalyzer
       
      +
      getAnalyzerEnabledSettingKey() - Method in class org.owasp.dependencycheck.analyzer.RubyGemspecAnalyzer
      +
      +
      Returns the key used in the properties file to reference the analyzer's enabled property.
      +
      getAnalyzers() - Method in class org.owasp.dependencycheck.analyzer.AnalyzerService
      Returns an Iterator for all instances of the Analyzer interface.
      @@ -1522,6 +1597,10 @@
      Returns a list of pre-determined dependencies.
      +
      getDependencies() - Method in class org.owasp.dependencycheck.data.composer.ComposerLockParser
      +
      +
      Gets the list of dependencies.
      +
      getDependencies() - Method in class org.owasp.dependencycheck.Engine
      Get the dependencies identified.
      @@ -1613,6 +1692,10 @@
      Returns the set of supported file extensions.
      +
      getFileFilter() - Method in class org.owasp.dependencycheck.analyzer.ComposerLockAnalyzer
      +
      +
      Returns the FileFilter
      +
      getFileFilter() - Method in class org.owasp.dependencycheck.analyzer.JarAnalyzer
      Returns the FileFilter.
      @@ -1621,6 +1704,10 @@
      Returns the FileFilter
      +
      getFileFilter() - Method in class org.owasp.dependencycheck.analyzer.NodePackageAnalyzer
      +
      +
      Returns the FileFilter
      +
      getFileFilter() - Method in class org.owasp.dependencycheck.analyzer.NuspecAnalyzer
      Returns the FileFilter
      @@ -1637,6 +1724,8 @@
      Returns the FileFilter
      +
      getFileFilter() - Method in class org.owasp.dependencycheck.analyzer.RubyGemspecAnalyzer
      +
       
      getFileName() - Method in class org.owasp.dependencycheck.dependency.Dependency
      Returns the file name of the dependency.
      @@ -1670,6 +1759,10 @@
      Returns the generated integer primary key for a newly inserted row.
      +
      getGroup() - Method in class org.owasp.dependencycheck.data.composer.ComposerDependency
      +
      +
      Get the group.
      +
      getGroupId() - Method in class org.owasp.dependencycheck.data.nexus.MavenArtifact
      Gets the groupId.
      @@ -1758,6 +1851,10 @@
      Returns the name of the CMake analyzer.
      +
      getName() - Method in class org.owasp.dependencycheck.analyzer.ComposerLockAnalyzer
      +
      +
      Returns the analyzer's name.
      +
      getName() - Method in class org.owasp.dependencycheck.analyzer.CPEAnalyzer
      Returns the name of this analyzer.
      @@ -1794,6 +1891,10 @@
      Returns the analyzer's name.
      +
      getName() - Method in class org.owasp.dependencycheck.analyzer.NodePackageAnalyzer
      +
      +
      Returns the name of the analyzer.
      +
      getName() - Method in class org.owasp.dependencycheck.analyzer.NuspecAnalyzer
      Returns the analyzer's name.
      @@ -1814,6 +1915,10 @@
      Returns the name of the Python Package Analyzer.
      +
      getName() - Method in class org.owasp.dependencycheck.analyzer.RubyGemspecAnalyzer
      +
      +
      Returns the name of the analyzer.
      +
      getName() - Method in class org.owasp.dependencycheck.analyzer.VulnerabilitySuppressionAnalyzer
      Returns the name of the analyzer.
      @@ -1922,6 +2027,10 @@
      Gets the Product Evidence.
      +
      getProject() - Method in class org.owasp.dependencycheck.data.composer.ComposerDependency
      +
      +
      Get the project.
      +
      getProjectReferences() - Method in class org.owasp.dependencycheck.dependency.Dependency
      Get the value of projectReferences.
      @@ -2126,6 +2235,10 @@
      Returns the entire list of vendor/product combinations.
      +
      getVersion() - Method in class org.owasp.dependencycheck.data.composer.ComposerDependency
      +
      +
      Get the version.
      +
      getVersion() - Method in class org.owasp.dependencycheck.data.nexus.MavenArtifact
      Gets the version.
      @@ -2213,8 +2326,14 @@
      Returns whether or not this suppression rule as GAV entries.
      +
      hashCode() - Method in class org.owasp.dependencycheck.data.composer.ComposerDependency
      +
       
      hashCode() - Method in class org.owasp.dependencycheck.data.cpe.IndexEntry
       
      +
      hashCode() - Method in class org.owasp.dependencycheck.data.lucene.TokenPairConcatenatingFilter
      +
      +
      Standard hash code implementation.
      +
      hashCode() - Method in class org.owasp.dependencycheck.data.nuget.NugetPackage
       
      hashCode() - Method in class org.owasp.dependencycheck.dependency.Dependency
      @@ -2303,8 +2422,8 @@
      incrementToken() - Method in class org.owasp.dependencycheck.data.lucene.TokenPairConcatenatingFilter
      -
      Increments the underlying TokenStream and sets CharTermAttributes to construct an expanded set of tokens by - concatenating tokens with the previous token.
      +
      Increments the underlying TokenStream and sets CharTermAttributes to construct an expanded set of tokens by concatenating + tokens with the previous token.
      incrementToken() - Method in class org.owasp.dependencycheck.data.lucene.UrlTokenizingFilter
      @@ -2401,6 +2520,10 @@
      No-op initializer implementation.
      +
      initializeFileTypeAnalyzer() - Method in class org.owasp.dependencycheck.analyzer.ComposerLockAnalyzer
      +
      +
      Initializes the analyzer
      +
      initializeFileTypeAnalyzer() - Method in class org.owasp.dependencycheck.analyzer.JarAnalyzer
      Initializes the JarAnalyzer.
      @@ -2409,6 +2532,8 @@
      Initializes the analyzer once before any analysis is performed.
      +
      initializeFileTypeAnalyzer() - Method in class org.owasp.dependencycheck.analyzer.NodePackageAnalyzer
      +
       
      initializeFileTypeAnalyzer() - Method in class org.owasp.dependencycheck.analyzer.NuspecAnalyzer
      Initializes the analyzer once before any analysis is performed.
      @@ -2425,6 +2550,8 @@
      No-op initializer implementation.
      +
      initializeFileTypeAnalyzer() - Method in class org.owasp.dependencycheck.analyzer.RubyGemspecAnalyzer
      +
       
      interpolateString(String, Properties) - Static method in class org.owasp.dependencycheck.xml.pom.Model
      @@ -2885,6 +3012,13 @@
      Creates a new NoDataException.
      +
      NodePackageAnalyzer - Class in org.owasp.dependencycheck.analyzer
      +
      +
      Used to analyze Node Package Manager (npm) package.json files, and collect information that can be used to determine the + associated CPE.
      +
      +
      NodePackageAnalyzer() - Constructor for class org.owasp.dependencycheck.analyzer.NodePackageAnalyzer
      +
       
      NonClosingStream - Class in org.owasp.dependencycheck.utils
      NonClosingStream is a stream filter which prevents another class that processes the stream from closing it.
      @@ -3053,6 +3187,10 @@ These are used to abstract Maven Central searching away from OWASP Dependency Check so they can be reused elsewhere.
      +
      org.owasp.dependencycheck.data.composer - package org.owasp.dependencycheck.data.composer
      +
      +
      Model elements for PHP Composer files
      +
      org.owasp.dependencycheck.data.cpe - package org.owasp.dependencycheck.data.cpe
      Contains classes for working with the CPE Lucene Index.
      @@ -3134,6 +3272,10 @@

      P

      +
      PACKAGE_JSON - Static variable in class org.owasp.dependencycheck.analyzer.NodePackageAnalyzer
      +
      +
      The file name to scan.
      +
      Pair<L,R> - Class in org.owasp.dependencycheck.utils
      A generic pair of elements.
      @@ -3245,6 +3387,10 @@
      Do a preflight request to see if the repository is actually working.
      +
      process() - Method in class org.owasp.dependencycheck.data.composer.ComposerLockParser
      +
      +
      Process the input stream to create the list of dependencies.
      +
      process(Dependency) - Method in class org.owasp.dependencycheck.suppression.SuppressionRule
      Processes a given dependency to determine if any CPE, CVE, CWE, or CVSS scores should be suppressed.
      @@ -3346,6 +3492,12 @@
      Resets the analyzers state.
      +
      RubyGemspecAnalyzer - Class in org.owasp.dependencycheck.analyzer
      +
      +
      Used to analyze Ruby Gem specifications and collect information that can be used to determine the associated CPE.
      +
      +
      RubyGemspecAnalyzer() - Constructor for class org.owasp.dependencycheck.analyzer.RubyGemspecAnalyzer
      +
       
      diff --git a/dependency-check-core/apidocs/index.html b/dependency-check-core/apidocs/index.html index 781e7bdb3..4621be547 100644 --- a/dependency-check-core/apidocs/index.html +++ b/dependency-check-core/apidocs/index.html @@ -2,9 +2,9 @@ - + -Dependency-Check Core 1.3.0 API +Dependency-Check Core 1.3.1 API diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/DependencyCheckScanAgent.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/DependencyCheckScanAgent.html index 5febd6c19..ea6df07a4 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/DependencyCheckScanAgent.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/DependencyCheckScanAgent.html @@ -2,16 +2,16 @@ - + -DependencyCheckScanAgent (Dependency-Check Core 1.3.0 API) - +DependencyCheckScanAgent (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/class-use/DependencyCheckScanAgent.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/class-use/DependencyCheckScanAgent.html index 8c20bc6df..a9249fb73 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/class-use/DependencyCheckScanAgent.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/class-use/DependencyCheckScanAgent.html @@ -2,16 +2,16 @@ - + -Uses of Class org.owasp.dependencycheck.agent.DependencyCheckScanAgent (Dependency-Check Core 1.3.0 API) - +Uses of Class org.owasp.dependencycheck.agent.DependencyCheckScanAgent (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-frame.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-frame.html index fd27b1631..f2683b5b9 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-frame.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-frame.html @@ -2,10 +2,10 @@ - + -org.owasp.dependencycheck.agent (Dependency-Check Core 1.3.0 API) - +org.owasp.dependencycheck.agent (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-summary.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-summary.html index b74cabb3e..b86f4b2dc 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-summary.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-summary.html @@ -2,16 +2,16 @@ - + -org.owasp.dependencycheck.agent (Dependency-Check Core 1.3.0 API) - +org.owasp.dependencycheck.agent (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-tree.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-tree.html index 9e6458e6a..9460d529e 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-tree.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-tree.html @@ -2,16 +2,16 @@ - + -org.owasp.dependencycheck.agent Class Hierarchy (Dependency-Check Core 1.3.0 API) - +org.owasp.dependencycheck.agent Class Hierarchy (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-use.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-use.html index b860a7172..d760473ff 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-use.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/agent/package-use.html @@ -2,16 +2,16 @@ - + -Uses of Package org.owasp.dependencycheck.agent (Dependency-Check Core 1.3.0 API) - +Uses of Package org.owasp.dependencycheck.agent (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AbstractAnalyzer.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AbstractAnalyzer.html index b0394d9e4..d5a3a74d3 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AbstractAnalyzer.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AbstractAnalyzer.html @@ -2,16 +2,16 @@ - + -AbstractAnalyzer (Dependency-Check Core 1.3.0 API) - +AbstractAnalyzer (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AbstractFileTypeAnalyzer.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AbstractFileTypeAnalyzer.html index f69609a24..74593d685 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AbstractFileTypeAnalyzer.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AbstractFileTypeAnalyzer.html @@ -2,16 +2,16 @@ - + -AbstractFileTypeAnalyzer (Dependency-Check Core 1.3.0 API) - +AbstractFileTypeAnalyzer (Dependency-Check Core 1.3.1 API) + @@ -106,7 +106,7 @@
      Direct Known Subclasses:
      -
      ArchiveAnalyzer, AssemblyAnalyzer, AutoconfAnalyzer, CentralAnalyzer, CMakeAnalyzer, JarAnalyzer, NexusAnalyzer, NuspecAnalyzer, OpenSSLAnalyzer, PythonDistributionAnalyzer, PythonPackageAnalyzer
      +
      ArchiveAnalyzer, AssemblyAnalyzer, AutoconfAnalyzer, CentralAnalyzer, CMakeAnalyzer, ComposerLockAnalyzer, JarAnalyzer, NexusAnalyzer, NodePackageAnalyzer, NuspecAnalyzer, OpenSSLAnalyzer, PythonDistributionAnalyzer, PythonPackageAnalyzer, RubyGemspecAnalyzer


      diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AbstractSuppressionAnalyzer.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AbstractSuppressionAnalyzer.html index 88e362adf..446d79b8f 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AbstractSuppressionAnalyzer.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AbstractSuppressionAnalyzer.html @@ -2,16 +2,16 @@ - + -AbstractSuppressionAnalyzer (Dependency-Check Core 1.3.0 API) - +AbstractSuppressionAnalyzer (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AnalysisPhase.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AnalysisPhase.html index 87fb5484f..a5bbef4c3 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AnalysisPhase.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AnalysisPhase.html @@ -2,16 +2,16 @@ - + -AnalysisPhase (Dependency-Check Core 1.3.0 API) - +AnalysisPhase (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/Analyzer.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/Analyzer.html index 77ef88162..415d6e538 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/Analyzer.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/Analyzer.html @@ -2,16 +2,16 @@ - + -Analyzer (Dependency-Check Core 1.3.0 API) - +Analyzer (Dependency-Check Core 1.3.1 API) + @@ -93,7 +93,7 @@
      All Known Implementing Classes:
      -
      AbstractAnalyzer, AbstractFileTypeAnalyzer, AbstractSuppressionAnalyzer, ArchiveAnalyzer, AssemblyAnalyzer, AutoconfAnalyzer, CentralAnalyzer, CMakeAnalyzer, CPEAnalyzer, CpeSuppressionAnalyzer, DependencyBundlingAnalyzer, FalsePositiveAnalyzer, FileNameAnalyzer, HintAnalyzer, JarAnalyzer, NexusAnalyzer, NuspecAnalyzer, NvdCveAnalyzer, OpenSSLAnalyzer, PythonDistributionAnalyzer, PythonPackageAnalyzer, VulnerabilitySuppressionAnalyzer
      +
      AbstractAnalyzer, AbstractFileTypeAnalyzer, AbstractSuppressionAnalyzer, ArchiveAnalyzer, AssemblyAnalyzer, AutoconfAnalyzer, CentralAnalyzer, CMakeAnalyzer, ComposerLockAnalyzer, CPEAnalyzer, CpeSuppressionAnalyzer, DependencyBundlingAnalyzer, FalsePositiveAnalyzer, FileNameAnalyzer, HintAnalyzer, JarAnalyzer, NexusAnalyzer, NodePackageAnalyzer, NuspecAnalyzer, NvdCveAnalyzer, OpenSSLAnalyzer, PythonDistributionAnalyzer, PythonPackageAnalyzer, RubyGemspecAnalyzer, VulnerabilitySuppressionAnalyzer


      diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AnalyzerService.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AnalyzerService.html index e6b299338..0095c2c05 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AnalyzerService.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AnalyzerService.html @@ -2,16 +2,16 @@ - + -AnalyzerService (Dependency-Check Core 1.3.0 API) - +AnalyzerService (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/ArchiveAnalyzer.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/ArchiveAnalyzer.html index f546080cd..c9e9c06bc 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/ArchiveAnalyzer.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/ArchiveAnalyzer.html @@ -2,16 +2,16 @@ - + -ArchiveAnalyzer (Dependency-Check Core 1.3.0 API) - +ArchiveAnalyzer (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AssemblyAnalyzer.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AssemblyAnalyzer.html index 54e21f6f5..2288112ad 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AssemblyAnalyzer.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AssemblyAnalyzer.html @@ -2,16 +2,16 @@ - + -AssemblyAnalyzer (Dependency-Check Core 1.3.0 API) - +AssemblyAnalyzer (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AutoconfAnalyzer.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AutoconfAnalyzer.html index 5db6ecab2..c1a4bfd13 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AutoconfAnalyzer.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/AutoconfAnalyzer.html @@ -2,16 +2,16 @@ - + -AutoconfAnalyzer (Dependency-Check Core 1.3.0 API) - +AutoconfAnalyzer (Dependency-Check Core 1.3.1 API) + diff --git a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/CMakeAnalyzer.html b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/CMakeAnalyzer.html index 5c0d411bd..004b57da6 100644 --- a/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/CMakeAnalyzer.html +++ b/dependency-check-core/apidocs/org/owasp/dependencycheck/analyzer/CMakeAnalyzer.html @@ -2,16 +2,16 @@ - + -CMakeAnalyzer (Dependency-Check Core 1.3.0 API) - +CMakeAnalyzer (Dependency-Check Core 1.3.1 API) + @@ -38,7 +38,7 @@
      -

      org/owasp/dependencycheck/analyzer/CMakeAnalyzer.java

      +

      org/owasp/dependencycheck/analyzer/CMakeAnalyzer.java

      - + + + - + + + - + - + + + - + - + + + - + - + + + -
      ViolationSeverityCategoryRule Message Line
      Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.65
      65
      Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.70
      70
      Errors ErrorjavadocJavadocMethod Missing a Javadoc comment.175
      175
      Errors ErrorcodingParameterAssignment Assignment of parameter 'dependency' is not allowed.194
      +193
      -

      org/owasp/dependencycheck/analyzer/OpenSSLAnalyzer.java

      +

      org/owasp/dependencycheck/analyzer/OpenSSLAnalyzer.java

      - + + + - + + + - + - + + + - + - + + + - + - + + + - + - + + + - + - + + + - + - + + + - + - + + + - + - + + + - + - + + + - + - + + + -
      ViolationSeverityCategoryRule Message Line
      Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.41
      41
      Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.51
      51
      Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.54
      54
      Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.55
      55
      Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.56
      56
      Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.57
      57
      Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.58
      58
      Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.59
      59
      Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.60
      60
      Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.61
      61
      Errors ErrorjavadocJavadocVariable Missing a Javadoc comment.62
      +62
      -

      org/owasp/dependencycheck/data/nvdcve/CveDB.java

      +

      org/owasp/dependencycheck/analyzer/RubyGemspecAnalyzer.java

      - + + + - - -
      ViolationSeverityCategoryRule Message Line
      ErrorsVariable 'ids' should be declared final.493
      + Error +javadoc +JavadocVariable +Missing a Javadoc comment. +52 + + Error +javadoc +JavadocVariable +Missing a Javadoc comment. +55 + + Error +javadoc +JavadocVariable +Missing a Javadoc comment. +56 + + Error +javadoc +JavadocMethod +Missing a Javadoc comment. +139 + + Error +javadoc +JavadocMethod +Missing a Javadoc comment. +149
      -

      org/owasp/dependencycheck/dependency/Dependency.java

      +

      org/owasp/dependencycheck/dependency/Dependency.java

      - + + + - + + + - - - - -
      ViolationSeverityCategoryRule Message Line
      Errors ErrorsizesMethodCount Total number of methods is 54 (max allowed is 40).44
      ErrorsArray should contain trailing comma.739
      +45 @@ -390,15 +469,14 @@
      -

      Copyright © 2012–2015 +

      Copyright © 2012–2015 OWASP. All rights reserved.

      -
      +
      -
      diff --git a/dependency-check-core/checkstyle.rss b/dependency-check-core/checkstyle.rss index 6da76edc9..84569fdfd 100644 --- a/dependency-check-core/checkstyle.rss +++ b/dependency-check-core/checkstyle.rss @@ -25,8 +25,8 @@ under the License. en-us ©2012 - 2015 OWASP - File: 197, - Errors: 21, + <title>File: 165, + Errors: 24, Warnings: 0, Infos: 0 @@ -57,6 +57,34 @@ under the License. 0 + + + + org/owasp/dependencycheck/data/lucene/package-info.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/update/package-info.java + + + 0 + + + 0 + + + 0 + @@ -71,6 +99,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/data/update/exception/InvalidDataException.java + + + 0 + + + 0 + + + 0 + @@ -85,6 +127,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/analyzer/JarAnalyzer.java + + + 0 + + + 0 + + + 0 + @@ -116,7 +172,7 @@ under the License. - org/owasp/dependencycheck/data/update/CachedWebDataSource.java + org/owasp/dependencycheck/data/composer/package-info.java 0 @@ -130,7 +186,21 @@ under the License. - dependency-check-ant/target/generated-classes/cobertura/cobertura.properties + org/owasp/dependencycheck/agent/package-info.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/update/CachedWebDataSource.java 0 @@ -155,6 +225,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/data/lucene/AbstractTokenizingFilter.java + + + 0 + + + 0 + + + 0 + @@ -167,7 +251,7 @@ under the License. 0 - 2 + 1 @@ -186,7 +270,21 @@ under the License. - dependency-check-ant/target/generated-classes/cobertura/task.properties + org/owasp/dependencycheck/analyzer/PythonPackageAnalyzer.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/analyzer/CPEAnalyzer.java 0 @@ -225,6 +323,48 @@ under the License. 0 + + + + org/owasp/dependencycheck/data/nvdcve/DatabaseProperties.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/analyzer/NodePackageAnalyzer.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/analyzer/ComposerLockAnalyzer.java + + + 0 + + + 0 + + + 0 + @@ -239,6 +379,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/xml/pom/Model.java + + + 0 + + + 0 + + + 0 + @@ -281,6 +435,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/utils/package-info.java + + + 0 + + + 0 + + + 0 + @@ -298,7 +466,21 @@ under the License. - dependency-check-ant/target/classes/task.properties + org/owasp/dependencycheck/analyzer/NuspecAnalyzer.java + + + 0 + + + 0 + + + 0 + + + + + dependency-check-core/target/test-classes/dependencycheck.properties 0 @@ -323,20 +505,6 @@ under the License. 0 - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin.properties - - - 0 - - - 0 - - - 0 - @@ -365,6 +533,62 @@ under the License. 0 + + + + dependency-check-core/src/test/resources/test.properties + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/update/nvd/NvdCveInfo.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/reporting/ReportGenerator.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/analyzer/AutoconfAnalyzer.java + + + 0 + + + 0 + + + 0 + @@ -382,7 +606,21 @@ under the License. - dependency-check-ant/target/generated-classes/cobertura/taskdefs.properties + org/owasp/dependencycheck/data/composer/ComposerLockParser.java + + + 0 + + + 0 + + + 0 + + + + + data/dbStatements.properties 0 @@ -407,6 +645,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/data/central/package-info.java + + + 0 + + + 0 + + + 0 + @@ -438,7 +690,35 @@ under the License. - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_ru.properties + org/owasp/dependencycheck/reporting/package-info.java + + + 0 + + + 0 + + + 0 + + + + + dependency-check-core/target/maven-archiver/pom.properties + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/suppression/PropertyType.java 0 @@ -466,7 +746,7 @@ under the License. - org/owasp/dependencycheck/suppression/PropertyType.java + org/owasp/dependencycheck/analyzer/Analyzer.java 0 @@ -519,1308 +799,6 @@ under the License. 0 - - - - org/owasp/dependencycheck/suppression/package-info.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-cli/target/maven-archiver/pom.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/dependency/VulnerabilityComparator.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/update/exception/package-info.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/dependency/Identifier.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-core/src/main/resources/dependencycheck.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/analyzer/NexusAnalyzer.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/nvdcve/DriverLoader.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/lucene/TokenPairConcatenatingFilter.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-utils/src/test/resources/dependencycheck.properties - - - 0 - - - 0 - - - 0 - - - - - dependency-check-core/src/test/resources/dependencycheck.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/lucene/FieldAnalyzer.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_it.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/dependency/Confidence.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/update/cpe/Cpe.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/analyzer/AssemblyAnalyzer.java - - - 0 - - - 0 - - - 2 - - - - - org/owasp/dependencycheck/dependency/Evidence.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/analyzer/package-info.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/dependency/Reference.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/nvdcve/package-info.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/update/exception/UpdateException.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/package-info.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-gradle/.gradle/2.3/taskArtifacts/cache.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/update/nvd/package-info.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-utils/src/test/resources/test.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/analyzer/OpenSSLAnalyzer.java - - - 0 - - - 0 - - - 11 - - - - - dependency-check-maven/target/generated-classes/cobertura/cobertura.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/cwe/CweHandler.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/lucene/LuceneUtils.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_gl.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/utils/Filter.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/cwe/CweDB.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_hu.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/xml/pom/PomUtils.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/update/nvd/ProcessTask.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/analyzer/ArchiveAnalyzer.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/utils/ExtractionUtil.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/update/CpeUpdater.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/src/test/resources/mojo.properties - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_ko.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/nvdcve/CveDB.java - - - 0 - - - 0 - - - 1 - - - - - org/owasp/dependencycheck/reporting/VelocityLoggerRedirect.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-cli/target/generated-classes/cobertura/cobertura.properties - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_de.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/update/nvd/UpdateableNvdCve.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/nuget/NuspecParseException.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/cpe/package-info.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/suppression/SuppressionParseException.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-core/target/generated-classes/cobertura/dependencycheck.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/analyzer/AbstractSuppressionAnalyzer.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/lucene/SearchFieldAnalyzer.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/analyzer/exception/ArchiveExtractionException.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_sv.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/exception/NoDataException.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_da.properties - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_zh_CN.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/xml/pom/PomHandler.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/nvdcve/DriverShim.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/dependency/Vulnerability.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_pt_BR.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/nuget/NugetPackage.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-core/target/classes/dependencycheck.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/update/NvdCveUpdater.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/update/package-info.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/lucene/package-info.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/update/exception/InvalidDataException.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/generated-classes/cobertura/mojo.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/analyzer/JarAnalyzer.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/agent/package-info.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/lucene/AbstractTokenizingFilter.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_nl.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/analyzer/PythonPackageAnalyzer.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/analyzer/CPEAnalyzer.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-archiver/pom.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/nvdcve/DatabaseProperties.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-help.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/xml/pom/Model.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_ca.properties - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_sk.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/utils/package-info.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/analyzer/NuspecAnalyzer.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-core/target/test-classes/dependencycheck.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/update/nvd/NvdCveInfo.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-core/src/test/resources/test.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/reporting/ReportGenerator.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/analyzer/AutoconfAnalyzer.java - - - 0 - - - 0 - - - 0 - - - - - data/dbStatements.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/data/central/package-info.java - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/reporting/package-info.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-core/target/maven-archiver/pom.properties - - - 0 - - - 0 - - - 0 - - - - - org/owasp/dependencycheck/analyzer/Analyzer.java - - - 0 - - - 0 - - - 0 - - - - - dependency-check-ant/target/maven-archiver/pom.properties - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_en.properties - - - 0 - - - 0 - - - 0 - @@ -1877,6 +855,48 @@ under the License. 0 + + + + org/owasp/dependencycheck/suppression/package-info.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/analyzer/RubyGemspecAnalyzer.java + + + 0 + + + 0 + + + 5 + + + + + org/owasp/dependencycheck/dependency/VulnerabilityComparator.java + + + 0 + + + 0 + + + 0 + @@ -1905,6 +925,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/data/update/exception/package-info.java + + + 0 + + + 0 + + + 0 + @@ -1919,6 +953,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/dependency/Identifier.java + + + 0 + + + 0 + + + 0 + @@ -1936,7 +984,7 @@ under the License. - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_tr.properties + dependency-check-core/src/main/resources/dependencycheck.properties 0 @@ -1975,6 +1023,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/analyzer/NexusAnalyzer.java + + + 0 + + + 0 + + + 0 + @@ -1989,6 +1051,48 @@ under the License. 0 + + + + org/owasp/dependencycheck/data/nvdcve/DriverLoader.java + + + 0 + + + 0 + + + 0 + + + + + dependency-check-utils/src/test/resources/dependencycheck.properties + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/lucene/TokenPairConcatenatingFilter.java + + + 0 + + + 0 + + + 0 + @@ -2003,6 +1107,34 @@ under the License. 0 + + + + dependency-check-core/src/test/resources/dependencycheck.properties + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/lucene/FieldAnalyzer.java + + + 0 + + + 0 + + + 0 + @@ -2017,6 +1149,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/dependency/Confidence.java + + + 0 + + + 0 + + + 0 + @@ -2034,7 +1180,7 @@ under the License. - dependency-check-ant/target/classes/taskdefs.properties + org/owasp/dependencycheck/data/update/cpe/Cpe.java 0 @@ -2048,7 +1194,7 @@ under the License. - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_ja.properties + org/owasp/dependencycheck/analyzer/AssemblyAnalyzer.java 0 @@ -2057,21 +1203,7 @@ under the License. 0 - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_pt.properties - - - 0 - - - 0 - - - 0 + 2 @@ -2101,20 +1233,6 @@ under the License. 0 - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_zh_TW.properties - - - 0 - - - 0 - - - 0 - @@ -2129,6 +1247,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/dependency/Evidence.java + + + 0 + + + 0 + + + 0 + @@ -2143,6 +1275,34 @@ under the License. 0 + + + + org/owasp/dependencycheck/analyzer/package-info.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/dependency/Reference.java + + + 0 + + + 0 + + + 0 + @@ -2174,7 +1334,63 @@ under the License. - dependency-check-ant/src/main/resources/taskdefs.properties + org/owasp/dependencycheck/data/composer/ComposerDependency.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/nvdcve/package-info.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/update/exception/UpdateException.java + + + 0 + + + 0 + + + 0 + + + + + dependency-check-gradle/.gradle/2.3/taskArtifacts/cache.properties + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/package-info.java 0 @@ -2199,6 +1415,34 @@ under the License. 0 + + + + org/owasp/dependencycheck/data/update/nvd/package-info.java + + + 0 + + + 0 + + + 0 + + + + + dependency-check-utils/src/test/resources/test.properties + + + 0 + + + 0 + + + 0 + @@ -2227,6 +1471,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/analyzer/OpenSSLAnalyzer.java + + + 0 + + + 0 + + + 11 + @@ -2241,6 +1499,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/data/cwe/CweHandler.java + + + 0 + + + 0 + + + 0 + @@ -2255,6 +1527,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/data/lucene/LuceneUtils.java + + + 0 + + + 0 + + + 0 + @@ -2269,34 +1555,6 @@ under the License. 0 - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_fr.properties - - - 0 - - - 0 - - - 0 - - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_pl.properties - - - 0 - - - 0 - - - 0 - @@ -2328,7 +1586,7 @@ under the License. - org/owasp/dependencycheck/data/update/nvd/NvdCve12Handler.java + org/owasp/dependencycheck/utils/Filter.java 0 @@ -2356,7 +1614,35 @@ under the License. - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_cs.properties + org/owasp/dependencycheck/data/update/nvd/NvdCve12Handler.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/cwe/CweDB.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/xml/pom/PomUtils.java 0 @@ -2381,6 +1667,34 @@ under the License. 0 + + + + org/owasp/dependencycheck/analyzer/ArchiveAnalyzer.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/update/nvd/ProcessTask.java + + + 0 + + + 0 + + + 0 + @@ -2395,6 +1709,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/utils/ExtractionUtil.java + + + 0 + + + 0 + + + 0 + @@ -2437,6 +1765,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/data/update/CpeUpdater.java + + + 0 + + + 0 + + + 0 + @@ -2451,6 +1793,20 @@ under the License. 0 + + + + dependency-check-maven/src/test/resources/mojo.properties + + + 0 + + + 0 + + + 0 + @@ -2493,6 +1849,20 @@ under the License. 0 + + + + org/owasp/dependencycheck/data/nvdcve/CveDB.java + + + 0 + + + 0 + + + 0 + @@ -2521,6 +1891,34 @@ under the License. 0 + + + + org/owasp/dependencycheck/reporting/VelocityLoggerRedirect.java + + + 0 + + + 0 + + + 0 + + + + + dependency-check-ant/src/main/resources/dependency-check-taskdefs.properties + + + 0 + + + 0 + + + 0 + @@ -2538,7 +1936,77 @@ under the License. - dependency-check-maven/target/test-classes/mojo.properties + org/owasp/dependencycheck/data/composer/ComposerException.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/update/nvd/UpdateableNvdCve.java + + + 0 + + + 0 + + + 0 + + + + + dependency-check-core/target/generated-classes/cobertura/dependencycheck.properties + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/suppression/SuppressionParseException.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/cpe/package-info.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/nuget/NuspecParseException.java 0 @@ -2563,6 +2031,48 @@ under the License. 0 + + + + org/owasp/dependencycheck/analyzer/AbstractSuppressionAnalyzer.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/lucene/SearchFieldAnalyzer.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/analyzer/exception/ArchiveExtractionException.java + + + 0 + + + 0 + + + 0 + @@ -2591,6 +2101,20 @@ under the License. 1 + + + + org/owasp/dependencycheck/exception/NoDataException.java + + + 0 + + + 0 + + + 0 + @@ -2650,7 +2174,21 @@ under the License. - dependency-check-maven/target/classes/mojo.properties + org/owasp/dependencycheck/xml/pom/PomHandler.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/nvdcve/DriverShim.java 0 @@ -2678,7 +2216,7 @@ under the License. - org/owasp/dependencycheck/analyzer/AnalyzerService.java + dependency-check-core/target/test-classes/test.properties 0 @@ -2692,7 +2230,21 @@ under the License. - dependency-check-core/target/test-classes/test.properties + org/owasp/dependencycheck/dependency/Vulnerability.java + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/analyzer/AnalyzerService.java 0 @@ -2717,20 +2269,6 @@ under the License. 0 - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_es.properties - - - 0 - - - 0 - - - 0 - @@ -2745,20 +2283,6 @@ under the License. 0 - - - - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_no.properties - - - 0 - - - 0 - - - 0 - @@ -2790,7 +2314,35 @@ under the License. - dependency-check-maven/target/maven-plugin-plugin-sources/org.apache.maven.plugins/maven-site-plugin/3.4/sources/site-plugin_lt.properties + org/owasp/dependencycheck/data/nuget/NugetPackage.java + + + 0 + + + 0 + + + 0 + + + + + dependency-check-core/target/classes/dependencycheck.properties + + + 0 + + + 0 + + + 0 + + + + + org/owasp/dependencycheck/data/update/NvdCveUpdater.java 0 diff --git a/dependency-check-core/cobertura/frame-packages.html b/dependency-check-core/cobertura/frame-packages.html index e74b254bc..84a4bc7d3 100644 --- a/dependency-check-core/cobertura/frame-packages.html +++ b/dependency-check-core/cobertura/frame-packages.html @@ -28,6 +28,9 @@ org.owasp.dependencycheck.data.central +org.owasp.dependencycheck.data.composer + + org.owasp.dependencycheck.data.cpe diff --git a/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.analyzer.html b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.analyzer.html index 7536cdf1a..9c9ad2e37 100644 --- a/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.analyzer.html +++ b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.analyzer.html @@ -33,7 +33,7 @@ org.owasp.dependencycheck.analyzer AnalyzerService (100%) -ArchiveAnalyzer (31%) +ArchiveAnalyzer (37%) AssemblyAnalyzer (67%) @@ -51,13 +51,16 @@ org.owasp.dependencycheck.analyzer CentralAnalyzer (27%) +ComposerLockAnalyzer (83%) + + CpeSuppressionAnalyzer (90%) DependencyBundlingAnalyzer (42%) -FalsePositiveAnalyzer (49%) +FalsePositiveAnalyzer (48%) FileNameAnalyzer (85%) @@ -66,15 +69,18 @@ org.owasp.dependencycheck.analyzer FileTypeAnalyzer (N/A) -HintAnalyzer (75%) +HintAnalyzer (73%) -JarAnalyzer (63%) +JarAnalyzer (64%) NexusAnalyzer (20%) +NodePackageAnalyzer (86%) + + NuspecAnalyzer (22%) @@ -87,7 +93,10 @@ org.owasp.dependencycheck.analyzer PythonDistributionAnalyzer (86%) -PythonPackageAnalyzer (90%) +PythonPackageAnalyzer (92%) + + +RubyGemspecAnalyzer (92%) VulnerabilitySuppressionAnalyzer (90%) diff --git a/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.composer.html b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.composer.html new file mode 100644 index 000000000..76f609132 --- /dev/null +++ b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.composer.html @@ -0,0 +1,29 @@ + + + + +Coverage Report Classes + + + +
      +org.owasp.dependencycheck.data.composer +
      +
       
      +
      Classes
      + + + + + + + + + + + + +
      ComposerDependency (72%)
      ComposerException (33%)
      ComposerLockParser (89%)
      + + diff --git a/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.lucene.html b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.lucene.html index 822986e99..d6db3e5cd 100644 --- a/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.lucene.html +++ b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.lucene.html @@ -33,7 +33,7 @@ org.owasp.dependencycheck.data.lucene SearchFieldAnalyzer (100%) -TokenPairConcatenatingFilter (100%) +TokenPairConcatenatingFilter (60%) UrlTokenizingFilter (80%) diff --git a/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.update.html b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.update.html index d6da87dd1..18d1823a2 100644 --- a/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.update.html +++ b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.update.html @@ -24,7 +24,7 @@ org.owasp.dependencycheck.data.update CpeUpdater (0%) -EngineVersionCheck (51%) +EngineVersionCheck (47%) NvdCveUpdater (0%) diff --git a/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.update.nvd.html b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.update.nvd.html index 5c6fa6cbe..fad80f7f1 100644 --- a/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.update.nvd.html +++ b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.data.update.nvd.html @@ -15,7 +15,7 @@ org.owasp.dependencycheck.data.update.nvd - + diff --git a/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.dependency.html b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.dependency.html index eb9536c82..1f0399f6b 100644 --- a/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.dependency.html +++ b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.dependency.html @@ -18,10 +18,10 @@ org.owasp.dependencycheck.dependency - + - + diff --git a/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.utils.html b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.utils.html index eea473fbe..e838ce520 100644 --- a/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.utils.html +++ b/dependency-check-core/cobertura/frame-sourcefiles-org.owasp.dependencycheck.utils.html @@ -27,7 +27,7 @@ org.owasp.dependencycheck.utils - + diff --git a/dependency-check-core/cobertura/frame-sourcefiles.html b/dependency-check-core/cobertura/frame-sourcefiles.html index 90db9b0d0..e31650923 100644 --- a/dependency-check-core/cobertura/frame-sourcefiles.html +++ b/dependency-check-core/cobertura/frame-sourcefiles.html @@ -42,7 +42,7 @@ All Packages - + @@ -75,6 +75,18 @@ All Packages + + + + + + + + + + + + @@ -117,7 +129,7 @@ All Packages - + @@ -135,7 +147,7 @@ All Packages - + @@ -150,22 +162,22 @@ All Packages - + - + - + - + @@ -186,7 +198,7 @@ All Packages - + @@ -201,7 +213,7 @@ All Packages - + @@ -225,6 +237,9 @@ All Packages + + + @@ -282,7 +297,7 @@ All Packages - + @@ -291,6 +306,9 @@ All Packages + + + @@ -312,7 +330,7 @@ All Packages - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.agent.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.agent.html index 81e6d2460..ce1cfb934 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.agent.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.agent.html @@ -37,6 +37,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.analyzer.exception.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.analyzer.exception.html index 4db04b09d..ba01c2725 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.analyzer.exception.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.analyzer.exception.html @@ -39,6 +39,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.analyzer.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.analyzer.html index 16f8fa09d..4e273acd7 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.analyzer.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.analyzer.html @@ -16,7 +16,7 @@
      DownloadTask (59%)DownloadTask (53%)
      NvdCve12Handler (93%)Confidence (100%)
      Dependency (66%)Dependency (67%)
      Evidence (67%)Evidence (64%)
      EvidenceCollection (73%)DependencyVersionUtil (89%)
      ExtractionUtil (34%)ExtractionUtil (30%)
      FileFilterBuilder (96%)AnalyzerService (100%)
      ArchiveAnalyzer (31%)ArchiveAnalyzer (37%)
      ArchiveExtractionException (0%)CentralSearch (85%)
      ComposerDependency (72%)
      ComposerException (33%)
      ComposerLockAnalyzer (83%)
      ComposerLockParser (89%)
      Confidence (100%)
      DateUtil (50%)
      Dependency (66%)Dependency (67%)
      DependencyBundlingAnalyzer (42%)DependencyVersionUtil (89%)
      DownloadTask (59%)DownloadTask (53%)
      DriverLoadException (33%)Engine (52%)
      EngineVersionCheck (51%)EngineVersionCheck (47%)
      EscapeTool (0%)
      Evidence (67%)Evidence (64%)
      EvidenceCollection (73%)
      ExtractionUtil (34%)ExtractionUtil (30%)
      FalsePositiveAnalyzer (49%)FalsePositiveAnalyzer (48%)
      FieldAnalyzer (100%)Filter (92%)
      HintAnalyzer (75%)HintAnalyzer (73%)
      Identifier (36%)InvalidDataException (0%)
      JarAnalyzer (63%)JarAnalyzer (64%)
      License (37%)NoDataException (0%)
      NodePackageAnalyzer (86%)
      NonClosingStream (0%)
      PythonDistributionAnalyzer (86%)
      PythonPackageAnalyzer (90%)PythonPackageAnalyzer (92%)
      Reference (38%)ReportGenerator (0%)
      RubyGemspecAnalyzer (92%)
      ScanAgentException (0%)
      SuppressionRule (75%)
      TokenPairConcatenatingFilter (100%)TokenPairConcatenatingFilter (60%)
      UpdateException (0%)
      - +
      Package # Classes Line Coverage Branch Coverage Complexity
      org.owasp.dependencycheck.analyzer29
      62%
      1343/2157
      44%
      571/1292
      4.58
      org.owasp.dependencycheck.analyzer32
      64%
      1462/2264
      44%
      594/1322
      4.279
      org.owasp.dependencycheck.analyzer.exception2
      12%
      2/16
      N/A
      1
      @@ -41,37 +41,41 @@ packageTable.sort(0); AnalyzerService
      100%
      4/4
      N/A
      1 - ArchiveAnalyzer
      31%
      67/211
      22%
      20/90
      7.25 + ArchiveAnalyzer
      37%
      72/193
      25%
      22/88
      5.125 - AssemblyAnalyzer
      67%
      86/127
      50%
      25/50
      6.875 + AssemblyAnalyzer
      67%
      85/126
      50%
      25/50
      6.875 AutoconfAnalyzer
      92%
      62/67
      76%
      26/34
      3.111 CMakeAnalyzer
      93%
      59/63
      80%
      8/10
      2 - CPEAnalyzer
      80%
      178/221
      73%
      97/132
      4.571 + CPEAnalyzer
      80%
      179/222
      73%
      97/132
      4.571 CPEAnalyzer$IdentifierConfidence
      100%
      4/4
      N/A
      4.571 CPEAnalyzer$IdentifierMatch
      38%
      15/39
      16%
      4/24
      4.571 CentralAnalyzer
      27%
      18/66
      13%
      4/30
      3.625 + ComposerLockAnalyzer
      83%
      31/37
      75%
      3/4
      1.833 + CpeSuppressionAnalyzer
      90%
      9/10
      66%
      4/6
      2.333 DependencyBundlingAnalyzer
      42%
      63/148
      31%
      51/160
      7.5 - FalsePositiveAnalyzer
      49%
      88/177
      25%
      58/230
      10.385 + FalsePositiveAnalyzer
      48%
      85/174
      25%
      58/230
      10.385 FileNameAnalyzer
      85%
      18/21
      50%
      5/10
      2.667 FileTypeAnalyzer
      N/A
      N/A
      1 - HintAnalyzer
      75%
      30/40
      58%
      14/24
      5 + HintAnalyzer
      73%
      36/49
      56%
      17/30
      6 - JarAnalyzer
      62%
      301/481
      49%
      164/332
      7.129 - JarAnalyzer$ClassNameInformation
      80%
      17/21
      80%
      8/10
      7.129 + JarAnalyzer
      63%
      301/475
      49%
      164/330
      7.097 + JarAnalyzer$ClassNameInformation
      80%
      17/21
      80%
      8/10
      7.097 NexusAnalyzer
      20%
      14/67
      4%
      1/24
      3.375 + NodePackageAnalyzer
      86%
      43/50
      64%
      9/14
      2.429 + NuspecAnalyzer
      22%
      8/35
      0%
      0/6
      2.667 NvdCveAnalyzer
      68%
      24/35
      50%
      6/12
      2.125 @@ -80,7 +84,9 @@ packageTable.sort(0); PythonDistributionAnalyzer
      86%
      80/92
      65%
      30/46
      3.308 - PythonPackageAnalyzer
      90%
      63/70
      77%
      14/18
      2.091 + PythonPackageAnalyzer
      92%
      61/66
      77%
      14/18
      2 + + RubyGemspecAnalyzer
      92%
      39/42
      60%
      6/10
      1.875 VulnerabilitySuppressionAnalyzer
      90%
      9/10
      66%
      4/6
      2.333 @@ -91,6 +97,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.central.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.central.html index 728bbbc1f..0f95062a8 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.central.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.central.html @@ -37,6 +37,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.composer.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.composer.html new file mode 100644 index 000000000..311f5eff2 --- /dev/null +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.composer.html @@ -0,0 +1,46 @@ + + + + +Coverage Report + + + + + + + +
      Coverage Report - org.owasp.dependencycheck.data.composer
      +
       
      + + + + + +
      Package # Classes Line Coverage Branch Coverage Complexity
      org.owasp.dependencycheck.data.composer3
      79%
      53/67
      45%
      19/42
      3.417
      + +
       
      + + + + + + + + + + +
      Classes in this Package Line Coverage Branch Coverage Complexity
      ComposerDependency
      72%
      16/22
      35%
      10/28
      3.333
      ComposerException
      33%
      2/6
      N/A
      1
      ComposerLockParser
      89%
      35/39
      64%
      9/14
      6
      + + + + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.cpe.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.cpe.html index 39cf8b007..8a5e7710a 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.cpe.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.cpe.html @@ -43,6 +43,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.cwe.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.cwe.html index 0084c08b1..cb3830085 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.cwe.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.cwe.html @@ -39,6 +39,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.lucene.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.lucene.html index 0f449e04b..d5f2c1bf9 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.lucene.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.lucene.html @@ -16,7 +16,7 @@ - +
      Package # Classes Line Coverage Branch Coverage Complexity
      org.owasp.dependencycheck.data.lucene8
      90%
      98/108
      92%
      35/38
      2.696
      org.owasp.dependencycheck.data.lucene8
      78%
      97/124
      53%
      35/66
      3.28
      - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.nexus.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.nexus.html index 8171a42dd..f03420f75 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.nexus.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.nexus.html @@ -39,6 +39,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.nuget.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.nuget.html index 5b2b829e5..b19a448c3 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.nuget.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.nuget.html @@ -43,6 +43,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.nvdcve.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.nvdcve.html index 813d9d869..8fcb08ffb 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.nvdcve.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.nvdcve.html @@ -52,6 +52,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.cpe.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.cpe.html index 387220680..c9eb949dd 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.cpe.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.cpe.html @@ -40,6 +40,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.exception.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.exception.html index 167f092f3..2d6508c07 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.exception.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.exception.html @@ -39,6 +39,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.html index ab372796c..8ca254197 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.html @@ -16,10 +16,10 @@ - + - +
      Package # Classes Line Coverage Branch Coverage Complexity
      org.owasp.dependencycheck.data.update6
      18%
      57/313
      15%
      16/106
      5.435
      org.owasp.dependencycheck.data.update6
      17%
      54/313
      14%
      15/106
      5.435
      org.owasp.dependencycheck.data.update.cpe3
      0%
      0/66
      0%
      0/18
      1.5
      org.owasp.dependencycheck.data.update.exception2
      0%
      0/12
      N/A
      1
      org.owasp.dependencycheck.data.update.nvd8
      69%
      272/393
      71%
      116/162
      2.547
      org.owasp.dependencycheck.data.update.nvd8
      67%
      267/395
      70%
      115/162
      2.547
      - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.nvd.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.nvd.html index fe812e49a..7de27f1c3 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.nvd.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.data.update.nvd.html @@ -16,7 +16,7 @@ - +
      Package # Classes Line Coverage Branch Coverage Complexity
      org.owasp.dependencycheck.data.update.nvd8
      69%
      272/393
      71%
      116/162
      2.547
      org.owasp.dependencycheck.data.update.nvd8
      67%
      267/395
      70%
      115/162
      2.547
      - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.dependency.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.dependency.html index 5f218756d..63e41688f 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.dependency.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.dependency.html @@ -16,7 +16,7 @@ - +
      Package # Classes Line Coverage Branch Coverage Complexity
      org.owasp.dependencycheck.dependency14
      64%
      379/585
      46%
      149/318
      2.072
      org.owasp.dependencycheck.dependency14
      64%
      373/577
      51%
      148/286
      1.989
      - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.exception.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.exception.html index f42c9768b..ce08476f6 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.exception.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.exception.html @@ -39,6 +39,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.html index d4d12835b..bbd6d065a 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.html @@ -16,26 +16,27 @@ - + - + + - + - + - - + + - + - +
      Package # Classes Line Coverage Branch Coverage Complexity
      org.owasp.dependencycheck1
      52%
      102/194
      54%
      37/68
      3.167
      org.owasp.dependencycheck1
      52%
      102/195
      54%
      37/68
      3.167
      org.owasp.dependencycheck.agent1
      0%
      0/244
      0%
      0/112
      1.847
      org.owasp.dependencycheck.analyzer29
      62%
      1343/2157
      44%
      571/1292
      4.58
      org.owasp.dependencycheck.analyzer32
      64%
      1462/2264
      44%
      594/1322
      4.279
      org.owasp.dependencycheck.analyzer.exception2
      12%
      2/16
      N/A
      1
      org.owasp.dependencycheck.data.central1
      85%
      51/60
      83%
      20/24
      10
      org.owasp.dependencycheck.data.composer3
      79%
      53/67
      45%
      19/42
      3.417
      org.owasp.dependencycheck.data.cpe4
      65%
      94/144
      37%
      21/56
      2.452
      org.owasp.dependencycheck.data.cwe2
      39%
      13/33
      25%
      2/8
      2.8
      org.owasp.dependencycheck.data.lucene8
      90%
      98/108
      92%
      35/38
      2.696
      org.owasp.dependencycheck.data.lucene8
      78%
      97/124
      53%
      35/66
      3.28
      org.owasp.dependencycheck.data.nexus2
      22%
      22/98
      10%
      3/30
      2.444
      org.owasp.dependencycheck.data.nuget4
      70%
      41/58
      15%
      6/40
      2.238
      org.owasp.dependencycheck.data.nvdcve9
      40%
      297/738
      45%
      91/200
      3.969
      org.owasp.dependencycheck.data.update6
      18%
      57/313
      15%
      16/106
      5.435
      org.owasp.dependencycheck.data.update6
      17%
      54/313
      14%
      15/106
      5.435
      org.owasp.dependencycheck.data.update.cpe3
      0%
      0/66
      0%
      0/18
      1.5
      org.owasp.dependencycheck.data.update.exception2
      0%
      0/12
      N/A
      1
      org.owasp.dependencycheck.data.update.nvd8
      69%
      272/393
      71%
      116/162
      2.547
      org.owasp.dependencycheck.dependency14
      64%
      379/585
      46%
      149/318
      2.072
      org.owasp.dependencycheck.data.update.nvd8
      67%
      267/395
      70%
      115/162
      2.547
      org.owasp.dependencycheck.dependency14
      64%
      373/577
      51%
      148/286
      1.989
      org.owasp.dependencycheck.exception2
      0%
      0/16
      N/A
      1
      org.owasp.dependencycheck.reporting4
      0%
      0/152
      0%
      0/76
      4.467
      org.owasp.dependencycheck.reporting4
      0%
      0/158
      0%
      0/88
      5.067
      org.owasp.dependencycheck.suppression6
      72%
      222/307
      62%
      112/178
      3.073
      org.owasp.dependencycheck.utils12
      64%
      237/370
      61%
      116/188
      3.632
      org.owasp.dependencycheck.utils12
      63%
      229/361
      60%
      113/186
      3.661
      org.owasp.dependencycheck.xml.pom6
      61%
      137/223
      54%
      40/74
      2.511
      @@ -48,7 +49,7 @@ packageTable.sort(0); - +
      Classes in this Package Line Coverage Branch Coverage Complexity
      Engine
      52%
      102/194
      54%
      37/68
      3.167
      Engine
      52%
      102/195
      54%
      37/68
      3.167
      @@ -57,6 +58,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.reporting.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.reporting.html index eadc89077..d4adb1fae 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.reporting.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.reporting.html @@ -16,7 +16,7 @@ - +
      Package # Classes Line Coverage Branch Coverage Complexity
      org.owasp.dependencycheck.reporting4
      0%
      0/152
      0%
      0/76
      4.467
      org.owasp.dependencycheck.reporting4
      0%
      0/158
      0%
      0/88
      5.067
      - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.suppression.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.suppression.html index f41566eab..55f0fbf68 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.suppression.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.suppression.html @@ -47,6 +47,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.utils.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.utils.html index 161404dd1..4473753a3 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.utils.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.utils.html @@ -16,7 +16,7 @@ - +
      Package # Classes Line Coverage Branch Coverage Complexity
      org.owasp.dependencycheck.utils12
      64%
      237/370
      61%
      116/188
      3.632
      org.owasp.dependencycheck.utils12
      63%
      229/361
      60%
      113/186
      3.661
      - + diff --git a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.xml.pom.html b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.xml.pom.html index 0b1f782e4..d463fa9f0 100644 --- a/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.xml.pom.html +++ b/dependency-check-core/cobertura/frame-summary-org.owasp.dependencycheck.xml.pom.html @@ -47,6 +47,6 @@ var classTable = new SortableTable(document.getElementById("classResults"), ["String", "Percentage", "Percentage", "FormattedNumber"]); classTable.sort(0); - + diff --git a/dependency-check-core/cobertura/frame-summary.html b/dependency-check-core/cobertura/frame-summary.html index 3c0cf48c5..2ba3c6dca 100644 --- a/dependency-check-core/cobertura/frame-summary.html +++ b/dependency-check-core/cobertura/frame-summary.html @@ -16,27 +16,28 @@ - - + + - + + - + - + - - + + - + - +
      Package # Classes Line Coverage Branch Coverage Complexity
      All Packages126
      53%
      3367/6287
      44%
      1335/2988
      3.116
      org.owasp.dependencycheck1
      52%
      102/194
      54%
      37/68
      3.167
      All Packages132
      54%
      3516/6469
      44%
      1371/3066
      3.09
      org.owasp.dependencycheck1
      52%
      102/195
      54%
      37/68
      3.167
      org.owasp.dependencycheck.agent1
      0%
      0/244
      0%
      0/112
      1.847
      org.owasp.dependencycheck.analyzer29
      62%
      1343/2157
      44%
      571/1292
      4.58
      org.owasp.dependencycheck.analyzer32
      64%
      1462/2264
      44%
      594/1322
      4.279
      org.owasp.dependencycheck.analyzer.exception2
      12%
      2/16
      N/A
      1
      org.owasp.dependencycheck.data.central1
      85%
      51/60
      83%
      20/24
      10
      org.owasp.dependencycheck.data.composer3
      79%
      53/67
      45%
      19/42
      3.417
      org.owasp.dependencycheck.data.cpe4
      65%
      94/144
      37%
      21/56
      2.452
      org.owasp.dependencycheck.data.cwe2
      39%
      13/33
      25%
      2/8
      2.8
      org.owasp.dependencycheck.data.lucene8
      90%
      98/108
      92%
      35/38
      2.696
      org.owasp.dependencycheck.data.lucene8
      78%
      97/124
      53%
      35/66
      3.28
      org.owasp.dependencycheck.data.nexus2
      22%
      22/98
      10%
      3/30
      2.444
      org.owasp.dependencycheck.data.nuget4
      70%
      41/58
      15%
      6/40
      2.238
      org.owasp.dependencycheck.data.nvdcve9
      40%
      297/738
      45%
      91/200
      3.969
      org.owasp.dependencycheck.data.update6
      18%
      57/313
      15%
      16/106
      5.435
      org.owasp.dependencycheck.data.update6
      17%
      54/313
      14%
      15/106
      5.435
      org.owasp.dependencycheck.data.update.cpe3
      0%
      0/66
      0%
      0/18
      1.5
      org.owasp.dependencycheck.data.update.exception2
      0%
      0/12
      N/A
      1
      org.owasp.dependencycheck.data.update.nvd8
      69%
      272/393
      71%
      116/162
      2.547
      org.owasp.dependencycheck.dependency14
      64%
      379/585
      46%
      149/318
      2.072
      org.owasp.dependencycheck.data.update.nvd8
      67%
      267/395
      70%
      115/162
      2.547
      org.owasp.dependencycheck.dependency14
      64%
      373/577
      51%
      148/286
      1.989
      org.owasp.dependencycheck.exception2
      0%
      0/16
      N/A
      1
      org.owasp.dependencycheck.reporting4
      0%
      0/152
      0%
      0/76
      4.467
      org.owasp.dependencycheck.reporting4
      0%
      0/158
      0%
      0/88
      5.067
      org.owasp.dependencycheck.suppression6
      72%
      222/307
      62%
      112/178
      3.073
      org.owasp.dependencycheck.utils12
      64%
      237/370
      61%
      116/188
      3.632
      org.owasp.dependencycheck.utils12
      63%
      229/361
      60%
      113/186
      3.661
      org.owasp.dependencycheck.xml.pom6
      61%
      137/223
      54%
      40/74
      2.511
      @@ -45,6 +46,6 @@ var packageTable = new SortableTable(document.getElementById("packageResults"), ["String", "Number", "Percentage", "Percentage", "FormattedNumber"]); packageTable.sort(0); - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.Engine.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.Engine.html index 561bf9353..b0bb5bdca 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.Engine.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.Engine.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      Engine
      52%
      102/194
      54%
      37/68
      3.167
      Engine
      52%
      102/195
      54%
      37/68
      3.167
       
      @@ -106,767 +106,772 @@  44  
       import java.util.List;
       45   -
       import java.util.Set;
      +
       import java.util.Map;
       46   -
       
      +
       import java.util.Set;
       47   -
       /**
      +
       
       48   -
        * Scans files, directories, etc. for Dependencies. Analyzers are loaded and used to process the files found by the scan, if a
      +
       /**
       49   -
        * file is encountered and an Analyzer is associated with the file type then the file is turned into a dependency.
      +
        * Scans files, directories, etc. for Dependencies. Analyzers are loaded and used to process the files found by the scan, if a
       50   -
        *
      +
        * file is encountered and an Analyzer is associated with the file type then the file is turned into a dependency.
       51   -
        * @author Jeremy Long
      +
        *
       52   -
        */
      +
        * @author Jeremy Long
       53   -
       public class Engine implements FileFilter {
      +
        */
       54   -
       
      +
       public class Engine implements FileFilter {
       55   -
           /**
      +
       
       56   -
            * The list of dependencies.
      +
           /**
       57   +
            * The list of dependencies.
      +  58  
            */
      -  58  16
           private List<Dependency> dependencies = new ArrayList<Dependency>();
      -  59   -
           /**
      +  59  3
           private List<Dependency> dependencies = new ArrayList<Dependency>();
       60   -
            * A Map of analyzers grouped by Analysis phase.
      +
           /**
       61   -
            */
      -  62  16
           private EnumMap<AnalysisPhase, List<Analyzer>> analyzers = new EnumMap<AnalysisPhase, List<Analyzer>>(AnalysisPhase.class);
      -  63   -
       
      -  64   -
           /**
      -  65  
            * A Map of analyzers grouped by Analysis phase.
      +  62   +
            */
      +  63  3
           private Map<AnalysisPhase, List<Analyzer>> analyzers = new EnumMap<AnalysisPhase, List<Analyzer>>(AnalysisPhase.class);
      +  64   +
       
      +  65   +
           /**
       66   +
            * A Map of analyzers grouped by Analysis phase.
      +  67  
            */
      -  67  16
           private Set<FileTypeAnalyzer> fileTypeAnalyzers = new HashSet<FileTypeAnalyzer>();
      -  68   -
       
      +  68  3
           private Set<FileTypeAnalyzer> fileTypeAnalyzers = new HashSet<FileTypeAnalyzer>();
       69   -
           /**
      +
       
       70   -
            * The ClassLoader to use when dynamically loading Analyzer and Update services.
      +
           /**
       71   +
            * The ClassLoader to use when dynamically loading Analyzer and Update services.
      +  72  
            */
      -  72  16
           private ClassLoader serviceClassLoader = Thread.currentThread().getContextClassLoader();
      -  73   -
           /**
      +  73  3
           private ClassLoader serviceClassLoader = Thread.currentThread().getContextClassLoader();
       74   -
            * The Logger for use throughout the class.
      +
           /**
       75   +
            * The Logger for use throughout the class.
      +  76  
            */
      -  76  8
           private static final Logger LOGGER = LoggerFactory.getLogger(Engine.class);
      -  77   -
       
      +  77  1
           private static final Logger LOGGER = LoggerFactory.getLogger(Engine.class);
       78   -
           /**
      +
       
       79   -
            * Creates a new Engine.
      +
           /**
       80   -
            *
      -  81   -
            * @throws DatabaseException thrown if there is an error connecting to the database
      -  82   -
            */
      -  83  16
           public Engine() throws DatabaseException {
      -  84  16
               initializeEngine();
      -  85  16
           }
      -  86   -
       
      -  87   -
           /**
      -  88  
            * Creates a new Engine.
      +  81   +
            *
      +  82   +
            * @throws DatabaseException thrown if there is an error connecting to the database
      +  83   +
            */
      +  84  3
           public Engine() throws DatabaseException {
      +  85  3
               initializeEngine();
      +  86  3
           }
      +  87   +
       
      +  88   +
           /**
       89   -
            *
      +
            * Creates a new Engine.
       90   -
            * @param serviceClassLoader a reference the class loader being used
      +
            *
       91   -
            * @throws DatabaseException thrown if there is an error connecting to the database
      +
            * @param serviceClassLoader a reference the class loader being used
       92   -
            */
      -  93  0
           public Engine(ClassLoader serviceClassLoader) throws DatabaseException {
      -  94  0
               this.serviceClassLoader = serviceClassLoader;
      -  95  0
               initializeEngine();
      -  96  0
           }
      -  97   -
       
      -  98   -
           /**
      -  99   -
            * Creates a new Engine using the specified classloader to dynamically load Analyzer and Update services.
      -  100   -
            *
      -  101  
            * @throws DatabaseException thrown if there is an error connecting to the database
      +  93   +
            */
      +  94  0
           public Engine(ClassLoader serviceClassLoader) throws DatabaseException {
      +  95  0
               this.serviceClassLoader = serviceClassLoader;
      +  96  0
               initializeEngine();
      +  97  0
           }
      +  98   +
       
      +  99   +
           /**
      +  100   +
            * Creates a new Engine using the specified classloader to dynamically load Analyzer and Update services.
      +  101   +
            *
       102   -
            */
      +
            * @throws DatabaseException thrown if there is an error connecting to the database
       103   +
            */
      +  104  
           protected final void initializeEngine() throws DatabaseException {
      -  104  16
               ConnectionFactory.initialize();
      -  105  16
               loadAnalyzers();
      -  106  16
           }
      -  107   -
       
      +  105  3
               ConnectionFactory.initialize();
      +  106  3
               loadAnalyzers();
      +  107  3
           }
       108   -
           /**
      +
       
       109   -
            * Properly cleans up resources allocated during analysis.
      +
           /**
       110   -
            */
      +
            * Properly cleans up resources allocated during analysis.
       111   +
            */
      +  112  
           public void cleanup() {
      -  112  0
               ConnectionFactory.cleanup();
      -  113  0
           }
      -  114   -
       
      +  113  0
               ConnectionFactory.cleanup();
      +  114  0
           }
       115   -
           /**
      +
       
       116   -
            * Loads the analyzers specified in the configuration file (or system properties).
      +
           /**
       117   -
            */
      +
            * Loads the analyzers specified in the configuration file (or system properties).
       118   +
            */
      +  119  
           private void loadAnalyzers() {
      -  119  16
               if (!analyzers.isEmpty()) {
      -  120  0
                   return;
      -  121   -
               }
      -  122  160
               for (AnalysisPhase phase : AnalysisPhase.values()) {
      -  123  144
                   analyzers.put(phase, new ArrayList<Analyzer>());
      -  124   +  120  3
               if (!analyzers.isEmpty()) {
      +  121  0
                   return;
      +  122  
               }
      +  123  30
               for (AnalysisPhase phase : AnalysisPhase.values()) {
      +  124  27
                   analyzers.put(phase, new ArrayList<Analyzer>());
       125   +
               }
      +  126  
       
      -  126  16
               final AnalyzerService service = new AnalyzerService(serviceClassLoader);
      -  127  16
               final Iterator<Analyzer> iterator = service.getAnalyzers();
      -  128  320
               while (iterator.hasNext()) {
      -  129  304
                   final Analyzer a = iterator.next();
      -  130  304
                   analyzers.get(a.getAnalysisPhase()).add(a);
      -  131  304
                   if (a instanceof FileTypeAnalyzer) {
      -  132  176
                       this.fileTypeAnalyzers.add((FileTypeAnalyzer) a);
      -  133   +  127  3
               final AnalyzerService service = new AnalyzerService(serviceClassLoader);
      +  128  3
               final Iterator<Analyzer> iterator = service.getAnalyzers();
      +  129  69
               while (iterator.hasNext()) {
      +  130  66
                   final Analyzer a = iterator.next();
      +  131  66
                   analyzers.get(a.getAnalysisPhase()).add(a);
      +  132  66
                   if (a instanceof FileTypeAnalyzer) {
      +  133  42
                       this.fileTypeAnalyzers.add((FileTypeAnalyzer) a);
      +  134  
                   }
      -  134  304
               }
      -  135  16
           }
      -  136   -
       
      +  135  66
               }
      +  136  3
           }
       137   -
           /**
      +
       
       138   -
            * Get the List of the analyzers for a specific phase of analysis.
      +
           /**
       139   -
            *
      +
            * Get the List of the analyzers for a specific phase of analysis.
       140   -
            * @param phase the phase to get the configured analyzers.
      +
            *
       141   -
            * @return the analyzers loaded
      +
            * @param phase the phase to get the configured analyzers.
       142   -
            */
      +
            * @return the analyzers loaded
       143   +
            */
      +  144  
           public List<Analyzer> getAnalyzers(AnalysisPhase phase) {
      -  144  0
               return analyzers.get(phase);
      -  145   -
           }
      +  145  0
               return analyzers.get(phase);
       146   -
       
      +
           }
       147   -
           /**
      +
       
       148   -
            * Get the dependencies identified.
      +
           /**
       149   -
            *
      +
            * Get the dependencies identified.
       150   -
            * @return the dependencies identified
      +
            *
       151   -
            */
      +
            * @return the dependencies identified
       152   +
            */
      +  153  
           public List<Dependency> getDependencies() {
      -  153  120
               return dependencies;
      -  154   -
           }
      +  154  45
               return dependencies;
       155   -
       
      +
           }
       156   -
           /**
      +
       
       157   -
            * Sets the dependencies.
      +
           /**
       158   -
            *
      +
            * Sets the dependencies.
       159   -
            * @param dependencies the dependencies
      +
            *
       160   -
            */
      +
            * @param dependencies the dependencies
       161   +
            */
      +  162  
           public void setDependencies(List<Dependency> dependencies) {
      -  162  0
               this.dependencies = dependencies;
      -  163  0
           }
      -  164   -
       
      +  163  0
               this.dependencies = dependencies;
      +  164  0
           }
       165   -
           /**
      +
       
       166   -
            * Scans an array of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies
      +
           /**
       167   -
            * identified are added to the dependency collection.
      -  168   -
            *
      -  169   -
            * @param paths an array of paths to files or directories to be analyzed
      -  170   -
            * @return the list of dependencies scanned
      -  171   -
            * @since v0.3.2.5
      -  172   -
            */
      -  173   -
           public List<Dependency> scan(String[] paths) {
      -  174  0
               final List<Dependency> deps = new ArrayList<Dependency>();
      -  175  0
               for (String path : paths) {
      -  176  0
                   final File file = new File(path);
      -  177  0
                   final List<Dependency> d = scan(file);
      -  178  0
                   if (d != null) {
      -  179  0
                       deps.addAll(d);
      -  180   -
                   }
      -  181   -
               }
      -  182  0
               return deps;
      -  183   -
           }
      -  184   -
       
      -  185   -
           /**
      -  186   -
            * Scans a given file or directory. If a directory is specified, it will be scanned recursively. Any dependencies identified
      -  187   -
            * are added to the dependency collection.
      -  188   -
            *
      -  189   -
            * @param path the path to a file or directory to be analyzed
      -  190   -
            * @return the list of dependencies scanned
      -  191   -
            */
      -  192   -
           public List<Dependency> scan(String path) {
      -  193  0
               final File file = new File(path);
      -  194  0
               return scan(file);
      -  195   -
           }
      -  196   -
       
      -  197   -
           /**
      -  198  
            * Scans an array of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies
      -  199   +  168  
            * identified are added to the dependency collection.
      -  200   +  169  
            *
      -  201   -
            * @param files an array of paths to files or directories to be analyzed.
      -  202   -
            * @return the list of dependencies
      -  203   +  170   +
            * @param paths an array of paths to files or directories to be analyzed
      +  171   +
            * @return the list of dependencies scanned
      +  172  
            * @since v0.3.2.5
      -  204   +  173  
            */
      -  205   -
           public List<Dependency> scan(File[] files) {
      -  206  0
               final List<Dependency> deps = new ArrayList<Dependency>();
      -  207  0
               for (File file : files) {
      -  208  0
                   final List<Dependency> d = scan(file);
      -  209  0
                   if (d != null) {
      -  210  0
                       deps.addAll(d);
      -  211   +  174   +
           public List<Dependency> scan(String[] paths) {
      +  175  0
               final List<Dependency> deps = new ArrayList<Dependency>();
      +  176  0
               for (String path : paths) {
      +  177  0
                   final File file = new File(path);
      +  178  0
                   final List<Dependency> d = scan(file);
      +  179  0
                   if (d != null) {
      +  180  0
                       deps.addAll(d);
      +  181  
                   }
      -  212   +  182  
               }
      -  213  0
               return deps;
      -  214   +  183  0
               return deps;
      +  184  
           }
      -  215   +  185  
       
      -  216   +  186  
           /**
      -  217   -
            * Scans a list of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies
      -  218   -
            * identified are added to the dependency collection.
      -  219   -
            *
      -  220   -
            * @param files a set of paths to files or directories to be analyzed
      -  221   -
            * @return the list of dependencies scanned
      -  222   -
            * @since v0.3.2.5
      -  223   -
            */
      -  224   -
           public List<Dependency> scan(Set<File> files) {
      -  225  0
               final List<Dependency> deps = new ArrayList<Dependency>();
      -  226  0
               for (File file : files) {
      -  227  0
                   final List<Dependency> d = scan(file);
      -  228  0
                   if (d != null) {
      -  229  0
                       deps.addAll(d);
      -  230   -
                   }
      -  231  0
               }
      -  232  0
               return deps;
      -  233   -
           }
      -  234   -
       
      -  235   -
           /**
      -  236   -
            * Scans a list of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies
      -  237   -
            * identified are added to the dependency collection.
      -  238   -
            *
      -  239   -
            * @param files a set of paths to files or directories to be analyzed
      -  240   -
            * @return the list of dependencies scanned
      -  241   -
            * @since v0.3.2.5
      -  242   -
            */
      -  243   -
           public List<Dependency> scan(List<File> files) {
      -  244  0
               final List<Dependency> deps = new ArrayList<Dependency>();
      -  245  0
               for (File file : files) {
      -  246  0
                   final List<Dependency> d = scan(file);
      -  247  0
                   if (d != null) {
      -  248  0
                       deps.addAll(d);
      -  249   -
                   }
      -  250  0
               }
      -  251  0
               return deps;
      -  252   -
           }
      -  253   -
       
      -  254   -
           /**
      -  255   +  187  
            * Scans a given file or directory. If a directory is specified, it will be scanned recursively. Any dependencies identified
      -  256   +  188  
            * are added to the dependency collection.
      -  257   +  189  
            *
      -  258   -
            * @param file the path to a file or directory to be analyzed
      -  259   +  190   +
            * @param path the path to a file or directory to be analyzed
      +  191  
            * @return the list of dependencies scanned
      +  192   +
            */
      +  193   +
           public List<Dependency> scan(String path) {
      +  194  0
               final File file = new File(path);
      +  195  0
               return scan(file);
      +  196   +
           }
      +  197   +
       
      +  198   +
           /**
      +  199   +
            * Scans an array of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies
      +  200   +
            * identified are added to the dependency collection.
      +  201   +
            *
      +  202   +
            * @param files an array of paths to files or directories to be analyzed.
      +  203   +
            * @return the list of dependencies
      +  204   +
            * @since v0.3.2.5
      +  205   +
            */
      +  206   +
           public List<Dependency> scan(File[] files) {
      +  207  0
               final List<Dependency> deps = new ArrayList<Dependency>();
      +  208  0
               for (File file : files) {
      +  209  0
                   final List<Dependency> d = scan(file);
      +  210  0
                   if (d != null) {
      +  211  0
                       deps.addAll(d);
      +  212   +
                   }
      +  213   +
               }
      +  214  0
               return deps;
      +  215   +
           }
      +  216   +
       
      +  217   +
           /**
      +  218   +
            * Scans a list of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies
      +  219   +
            * identified are added to the dependency collection.
      +  220   +
            *
      +  221   +
            * @param files a set of paths to files or directories to be analyzed
      +  222   +
            * @return the list of dependencies scanned
      +  223   +
            * @since v0.3.2.5
      +  224   +
            */
      +  225   +
           public List<Dependency> scan(Set<File> files) {
      +  226  0
               final List<Dependency> deps = new ArrayList<Dependency>();
      +  227  0
               for (File file : files) {
      +  228  0
                   final List<Dependency> d = scan(file);
      +  229  0
                   if (d != null) {
      +  230  0
                       deps.addAll(d);
      +  231   +
                   }
      +  232  0
               }
      +  233  0
               return deps;
      +  234   +
           }
      +  235   +
       
      +  236   +
           /**
      +  237   +
            * Scans a list of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies
      +  238   +
            * identified are added to the dependency collection.
      +  239   +
            *
      +  240   +
            * @param files a set of paths to files or directories to be analyzed
      +  241   +
            * @return the list of dependencies scanned
      +  242   +
            * @since v0.3.2.5
      +  243   +
            */
      +  244   +
           public List<Dependency> scan(List<File> files) {
      +  245  0
               final List<Dependency> deps = new ArrayList<Dependency>();
      +  246  0
               for (File file : files) {
      +  247  0
                   final List<Dependency> d = scan(file);
      +  248  0
                   if (d != null) {
      +  249  0
                       deps.addAll(d);
      +  250   +
                   }
      +  251  0
               }
      +  252  0
               return deps;
      +  253   +
           }
      +  254   +
       
      +  255   +
           /**
      +  256   +
            * Scans a given file or directory. If a directory is specified, it will be scanned recursively. Any dependencies identified
      +  257   +
            * are added to the dependency collection.
      +  258   +
            *
      +  259   +
            * @param file the path to a file or directory to be analyzed
       260   -
            * @since v0.3.2.4
      +
            * @return the list of dependencies scanned
       261   -
            */
      +
            * @since v0.3.2.4
       262   +
            */
      +  263  
           public List<Dependency> scan(File file) {
      -  263  32
               if (file.exists()) {
      -  264  32
                   if (file.isDirectory()) {
      -  265  16
                       return scanDirectory(file);
      -  266   +  264  4
               if (file.exists()) {
      +  265  4
                   if (file.isDirectory()) {
      +  266  2
                       return scanDirectory(file);
      +  267  
                   } else {
      -  267  16
                       final Dependency d = scanFile(file);
      -  268  16
                       if (d != null) {
      -  269  16
                           final List<Dependency> deps = new ArrayList<Dependency>();
      -  270  16
                           deps.add(d);
      -  271  16
                           return deps;
      -  272   -
                       }
      +  268  2
                       final Dependency d = scanFile(file);
      +  269  2
                       if (d != null) {
      +  270  2
                           final List<Dependency> deps = new ArrayList<Dependency>();
      +  271  2
                           deps.add(d);
      +  272  2
                           return deps;
       273   -
                   }
      -  274   -
               }
      -  275  0
               return null;
      -  276   -
           }
      -  277   -
       
      -  278   -
           /**
      -  279   -
            * Recursively scans files and directories. Any dependencies identified are added to the dependency collection.
      -  280   -
            *
      -  281   -
            * @param dir the directory to scan
      -  282   -
            * @return the list of Dependency objects scanned
      -  283   -
            */
      -  284   -
           protected List<Dependency> scanDirectory(File dir) {
      -  285  304
               final File[] files = dir.listFiles();
      -  286  304
               final List<Dependency> deps = new ArrayList<Dependency>();
      -  287  304
               if (files != null) {
      -  288  592
                   for (File f : files) {
      -  289  288
                       if (f.isDirectory()) {
      -  290  288
                           final List<Dependency> d = scanDirectory(f);
      -  291  288
                           if (d != null) {
      -  292  288
                               deps.addAll(d);
      -  293   -
                           }
      -  294  288
                       } else {
      -  295  0
                           final Dependency d = scanFile(f);
      -  296  0
                           deps.add(d);
      -  297  
                       }
      +  274   +
                   }
      +  275   +
               }
      +  276  0
               return null;
      +  277   +
           }
      +  278   +
       
      +  279   +
           /**
      +  280   +
            * Recursively scans files and directories. Any dependencies identified are added to the dependency collection.
      +  281   +
            *
      +  282   +
            * @param dir the directory to scan
      +  283   +
            * @return the list of Dependency objects scanned
      +  284   +
            */
      +  285   +
           protected List<Dependency> scanDirectory(File dir) {
      +  286  38
               final File[] files = dir.listFiles();
      +  287  38
               final List<Dependency> deps = new ArrayList<Dependency>();
      +  288  38
               if (files != null) {
      +  289  74
                   for (File f : files) {
      +  290  36
                       if (f.isDirectory()) {
      +  291  36
                           final List<Dependency> d = scanDirectory(f);
      +  292  36
                           if (d != null) {
      +  293  36
                               deps.addAll(d);
      +  294   +
                           }
      +  295  36
                       } else {
      +  296  0
                           final Dependency d = scanFile(f);
      +  297  0
                           deps.add(d);
       298   -
                   }
      +
                       }
       299   +
                   }
      +  300  
               }
      -  300  304
               return deps;
      -  301   -
           }
      +  301  38
               return deps;
       302   -
       
      +
           }
       303   -
           /**
      +
       
       304   -
            * Scans a specified file. If a dependency is identified it is added to the dependency collection.
      +
           /**
       305   -
            *
      +
            * Scans a specified file. If a dependency is identified it is added to the dependency collection.
       306   -
            * @param file The file to scan
      +
            *
       307   -
            * @return the scanned dependency
      +
            * @param file The file to scan
       308   -
            */
      +
            * @return the scanned dependency
       309   +
            */
      +  310  
           protected Dependency scanFile(File file) {
      -  310  16
               Dependency dependency = null;
      -  311  16
               if (file.isFile()) {
      -  312  16
                   if (accept(file)) {
      -  313  16
                       dependency = new Dependency(file);
      -  314  16
                       dependencies.add(dependency);
      -  315   -
                   }
      +  311  2
               Dependency dependency = null;
      +  312  2
               if (file.isFile()) {
      +  313  2
                   if (accept(file)) {
      +  314  2
                       dependency = new Dependency(file);
      +  315  2
                       dependencies.add(dependency);
       316   -
               } else {
      -  317  0
                   LOGGER.debug("Path passed to scanFile(File) is not a file: {}. Skipping the file.", file);
      -  318   -
               }
      -  319  16
               return dependency;
      -  320   -
           }
      -  321   -
       
      -  322   -
           /**
      -  323   -
            * Runs the analyzers against all of the dependencies. Since the mutable dependencies list is exposed via
      -  324   -
            * {@link #getDependencies()}, this method iterates over a copy of the dependencies list. Thus, the potential for
      -  325   -
            * {@link java.util.ConcurrentModificationException}s is avoided, and analyzers may safely add or remove entries from the
      -  326   -
            * dependencies list.
      -  327   -
            */
      -  328   -
           public void analyzeDependencies() {
      -  329  8
               boolean autoUpdate = true;
      -  330   -
               try {
      -  331  8
                   autoUpdate = Settings.getBoolean(Settings.KEYS.AUTO_UPDATE);
      -  332  0
               } catch (InvalidSettingException ex) {
      -  333  0
                   LOGGER.debug("Invalid setting for auto-update; using true.");
      -  334  8
               }
      -  335  8
               if (autoUpdate) {
      -  336  0
                   doUpdates();
      -  337   -
               }
      -  338   -
       
      -  339   -
               //need to ensure that data exists
      -  340   -
               try {
      -  341  8
                   ensureDataExists();
      -  342  0
               } catch (NoDataException ex) {
      -  343  0
                   LOGGER.error("{}\n\nUnable to continue dependency-check analysis.", ex.getMessage());
      -  344  0
                   LOGGER.debug("", ex);
      -  345  0
                   return;
      -  346  0
               } catch (DatabaseException ex) {
      -  347  0
                   LOGGER.error("{}\n\nUnable to continue dependency-check analysis.", ex.getMessage());
      -  348  0
                   LOGGER.debug("", ex);
      -  349  0
                   return;
      -  350   -
       
      -  351  8
               }
      -  352   -
       
      -  353  8
               LOGGER.debug("\n----------------------------------------------------\nBEGIN ANALYSIS\n----------------------------------------------------");
      -  354  8
               LOGGER.info("Analysis Starting");
      -  355   -
       
      -  356   -
               // analysis phases
      -  357  80
               for (AnalysisPhase phase : AnalysisPhase.values()) {
      -  358  72
                   final List<Analyzer> analyzerList = analyzers.get(phase);
      -  359   -
       
      -  360  72
                   for (Analyzer a : analyzerList) {
      -  361  152
                       a = initializeAnalyzer(a);
      -  362   -
       
      -  363   -
                       /* need to create a copy of the collection because some of the
      -  364   -
                        * analyzers may modify it. This prevents ConcurrentModificationExceptions.
      -  365   -
                        * This is okay for adds/deletes because it happens per analyzer.
      -  366   -
                        */
      -  367  152
                       LOGGER.debug("Begin Analyzer '{}'", a.getName());
      -  368  152
                       final Set<Dependency> dependencySet = new HashSet<Dependency>();
      -  369  152
                       dependencySet.addAll(dependencies);
      -  370  152
                       for (Dependency d : dependencySet) {
      -  371  304
                           boolean shouldAnalyze = true;
      -  372  304
                           if (a instanceof FileTypeAnalyzer) {
      -  373  176
                               final FileTypeAnalyzer fAnalyzer = (FileTypeAnalyzer) a;
      -  374  176
                               shouldAnalyze = fAnalyzer.accept(d.getActualFile());
      -  375   -
                           }
      -  376  304
                           if (shouldAnalyze) {
      -  377  160
                               LOGGER.debug("Begin Analysis of '{}'", d.getActualFilePath());
      -  378   -
                               try {
      -  379  160
                                   a.analyze(d, this);
      -  380  0
                               } catch (AnalysisException ex) {
      -  381  0
                                   LOGGER.warn("An error occurred while analyzing '{}'.", d.getActualFilePath());
      -  382  0
                                   LOGGER.debug("", ex);
      -  383  0
                               } catch (Throwable ex) {
      -  384   -
                                   //final AnalysisException ax = new AnalysisException(axMsg, ex);
      -  385  0
                                   LOGGER.warn("An unexpected error occurred during analysis of '{}'", d.getActualFilePath());
      -  386  0
                                   LOGGER.debug("", ex);
      -  387  160
                               }
      -  388   -
                           }
      -  389  304
                       }
      -  390  152
                   }
      -  391   -
               }
      -  392  80
               for (AnalysisPhase phase : AnalysisPhase.values()) {
      -  393  72
                   final List<Analyzer> analyzerList = analyzers.get(phase);
      -  394   -
       
      -  395  72
                   for (Analyzer a : analyzerList) {
      -  396  152
                       closeAnalyzer(a);
      -  397  152
                   }
      -  398   -
               }
      -  399   -
       
      -  400  8
               LOGGER.debug("\n----------------------------------------------------\nEND ANALYSIS\n----------------------------------------------------");
      -  401  8
               LOGGER.info("Analysis Complete");
      -  402  8
           }
      -  403   -
       
      -  404   -
           /**
      -  405   -
            * Initializes the given analyzer.
      -  406   -
            *
      -  407   -
            * @param analyzer the analyzer to initialize
      -  408   -
            * @return the initialized analyzer
      -  409   -
            */
      -  410   -
           protected Analyzer initializeAnalyzer(Analyzer analyzer) {
      -  411   -
               try {
      -  412  152
                   LOGGER.debug("Initializing {}", analyzer.getName());
      -  413  152
                   analyzer.initialize();
      -  414  0
               } catch (Throwable ex) {
      -  415  0
                   LOGGER.error("Exception occurred initializing {}.", analyzer.getName());
      -  416  0
                   LOGGER.debug("", ex);
      -  417   -
                   try {
      -  418  0
                       analyzer.close();
      -  419  0
                   } catch (Throwable ex1) {
      -  420  0
                       LOGGER.trace("", ex1);
      -  421  0
                   }
      -  422  152
               }
      -  423  152
               return analyzer;
      -  424   -
           }
      -  425   -
       
      -  426   -
           /**
      -  427   -
            * Closes the given analyzer.
      -  428   -
            *
      -  429   -
            * @param analyzer the analyzer to close
      -  430   -
            */
      -  431   -
           protected void closeAnalyzer(Analyzer analyzer) {
      -  432  152
               LOGGER.debug("Closing Analyzer '{}'", analyzer.getName());
      -  433   -
               try {
      -  434  152
                   analyzer.close();
      -  435  0
               } catch (Throwable ex) {
      -  436  0
                   LOGGER.trace("", ex);
      -  437  152
               }
      -  438  152
           }
      -  439   -
       
      -  440   -
           /**
      -  441   -
            * Cycles through the cached web data sources and calls update on all of them.
      -  442   -
            */
      -  443   -
           public void doUpdates() {
      -  444  0
               LOGGER.info("Checking for updates");
      -  445  0
               final UpdateService service = new UpdateService(serviceClassLoader);
      -  446  0
               final Iterator<CachedWebDataSource> iterator = service.getDataSources();
      -  447  0
               while (iterator.hasNext()) {
      -  448  0
                   final CachedWebDataSource source = iterator.next();
      -  449   -
                   try {
      -  450  0
                       source.update();
      -  451  0
                   } catch (UpdateException ex) {
      -  452  0
                       LOGGER.warn(
      -  453   -
                               "Unable to update Cached Web DataSource, using local data instead. Results may not include recent vulnerabilities.");
      -  454  0
                       LOGGER.debug("Unable to update details for {}", source.getClass().getName(), ex);
      -  455  0
                   }
      -  456  0
               }
      -  457  0
               LOGGER.info("Check for updates complete");
      -  458  0
           }
      -  459   -
       
      -  460   -
           /**
      -  461   -
            * Returns a full list of all of the analyzers. This is useful for reporting which analyzers where used.
      -  462   -
            *
      -  463   -
            * @return a list of Analyzers
      -  464   -
            */
      -  465   -
           public List<Analyzer> getAnalyzers() {
      -  466  0
               final List<Analyzer> ret = new ArrayList<Analyzer>();
      -  467  0
               for (AnalysisPhase phase : AnalysisPhase.values()) {
      -  468  0
                   final List<Analyzer> analyzerList = analyzers.get(phase);
      -  469  0
                   ret.addAll(analyzerList);
      -  470   -
               }
      -  471  0
               return ret;
      -  472   -
           }
      -  473   -
       
      -  474   -
           /**
      -  475   -
            * Checks all analyzers to see if an extension is supported.
      -  476   -
            *
      -  477   -
            * @param file a file extension
      -  478   -
            * @return true or false depending on whether or not the file extension is supported
      -  479   -
            */
      -  480   -
           public boolean accept(File file) {
      -  481  6808
               if (file == null) {
      -  482  0
                   return false;
      -  483   -
               }
      -  484  6808
               boolean scan = false;
      -  485  6808
               for (FileTypeAnalyzer a : this.fileTypeAnalyzers) {
      -  486   -
                   /* note, we can't break early on this loop as the analyzers need to know if
      -  487   -
                    they have files to work on prior to initialization */
      -  488  74888
                   scan |= a.accept(file);
      -  489  74888
               }
      -  490  6808
               return scan;
      -  491   -
           }
      -  492   -
       
      -  493   -
           /**
      -  494   -
            * Returns the set of file type analyzers.
      -  495   -
            *
      -  496   -
            * @return the set of file type analyzers
      -  497   -
            */
      -  498   -
           public Set<FileTypeAnalyzer> getFileTypeAnalyzers() {
      -  499  0
               return this.fileTypeAnalyzers;
      -  500   -
           }
      -  501   -
       
      -  502   -
           /**
      -  503   -
            * Checks the CPE Index to ensure documents exists. If none exist a NoDataException is thrown.
      -  504   -
            *
      -  505   -
            * @throws NoDataException thrown if no data exists in the CPE Index
      -  506   -
            * @throws DatabaseException thrown if there is an exception opening the database
      -  507   -
            */
      -  508   -
           private void ensureDataExists() throws NoDataException, DatabaseException {
      -  509  8
               final CveDB cve = new CveDB();
      -  510   -
               try {
      -  511  8
                   cve.open();
      -  512  8
                   if (!cve.dataExists()) {
      -  513  0
                       throw new NoDataException("No documents exist");
      -  514  
                   }
      -  515  0
               } catch (DatabaseException ex) {
      -  516  0
                   throw new NoDataException(ex.getMessage(), ex);
      +  317   +
               } else {
      +  318  0
                   LOGGER.debug("Path passed to scanFile(File) is not a file: {}. Skipping the file.", file);
      +  319   +
               }
      +  320  2
               return dependency;
      +  321   +
           }
      +  322   +
       
      +  323   +
           /**
      +  324   +
            * Runs the analyzers against all of the dependencies. Since the mutable dependencies list is exposed via
      +  325   +
            * {@link #getDependencies()}, this method iterates over a copy of the dependencies list. Thus, the potential for
      +  326   +
            * {@link java.util.ConcurrentModificationException}s is avoided, and analyzers may safely add or remove entries from the
      +  327   +
            * dependencies list.
      +  328   +
            */
      +  329   +
           public void analyzeDependencies() {
      +  330  1
               boolean autoUpdate = true;
      +  331   +
               try {
      +  332  1
                   autoUpdate = Settings.getBoolean(Settings.KEYS.AUTO_UPDATE);
      +  333  0
               } catch (InvalidSettingException ex) {
      +  334  0
                   LOGGER.debug("Invalid setting for auto-update; using true.");
      +  335  1
               }
      +  336  1
               if (autoUpdate) {
      +  337  0
                   doUpdates();
      +  338   +
               }
      +  339   +
       
      +  340   +
               //need to ensure that data exists
      +  341   +
               try {
      +  342  1
                   ensureDataExists();
      +  343  0
               } catch (NoDataException ex) {
      +  344  0
                   LOGGER.error("{}\n\nUnable to continue dependency-check analysis.", ex.getMessage());
      +  345  0
                   LOGGER.debug("", ex);
      +  346  0
                   return;
      +  347  0
               } catch (DatabaseException ex) {
      +  348  0
                   LOGGER.error("{}\n\nUnable to continue dependency-check analysis.", ex.getMessage());
      +  349  0
                   LOGGER.debug("", ex);
      +  350  0
                   return;
      +  351   +
       
      +  352  1
               }
      +  353   +
       
      +  354  1
               LOGGER.debug("\n----------------------------------------------------\nBEGIN ANALYSIS\n----------------------------------------------------");
      +  355  1
               LOGGER.info("Analysis Starting");
      +  356  1
               final long analysisStart = System.currentTimeMillis();
      +  357   +
       
      +  358   +
               // analysis phases
      +  359  10
               for (AnalysisPhase phase : AnalysisPhase.values()) {
      +  360  9
                   final List<Analyzer> analyzerList = analyzers.get(phase);
      +  361   +
       
      +  362  9
                   for (Analyzer a : analyzerList) {
      +  363  22
                       a = initializeAnalyzer(a);
      +  364   +
       
      +  365   +
                       /* need to create a copy of the collection because some of the
      +  366   +
                        * analyzers may modify it. This prevents ConcurrentModificationExceptions.
      +  367   +
                        * This is okay for adds/deletes because it happens per analyzer.
      +  368   +
                        */
      +  369  22
                       LOGGER.debug("Begin Analyzer '{}'", a.getName());
      +  370  22
                       final Set<Dependency> dependencySet = new HashSet<Dependency>(dependencies);
      +  371  22
                       for (Dependency d : dependencySet) {
      +  372  44
                           boolean shouldAnalyze = true;
      +  373  44
                           if (a instanceof FileTypeAnalyzer) {
      +  374  28
                               final FileTypeAnalyzer fAnalyzer = (FileTypeAnalyzer) a;
      +  375  28
                               shouldAnalyze = fAnalyzer.accept(d.getActualFile());
      +  376   +
                           }
      +  377  44
                           if (shouldAnalyze) {
      +  378  20
                               LOGGER.debug("Begin Analysis of '{}'", d.getActualFilePath());
      +  379   +
                               try {
      +  380  20
                                   a.analyze(d, this);
      +  381  0
                               } catch (AnalysisException ex) {
      +  382  0
                                   LOGGER.warn("An error occurred while analyzing '{}'.", d.getActualFilePath());
      +  383  0
                                   LOGGER.debug("", ex);
      +  384  0
                               } catch (Throwable ex) {
      +  385   +
                                   //final AnalysisException ax = new AnalysisException(axMsg, ex);
      +  386  0
                                   LOGGER.warn("An unexpected error occurred during analysis of '{}'", d.getActualFilePath());
      +  387  0
                                   LOGGER.debug("", ex);
      +  388  20
                               }
      +  389   +
                           }
      +  390  44
                       }
      +  391  22
                   }
      +  392   +
               }
      +  393  10
               for (AnalysisPhase phase : AnalysisPhase.values()) {
      +  394  9
                   final List<Analyzer> analyzerList = analyzers.get(phase);
      +  395   +
       
      +  396  9
                   for (Analyzer a : analyzerList) {
      +  397  22
                       closeAnalyzer(a);
      +  398  22
                   }
      +  399   +
               }
      +  400   +
       
      +  401  1
               LOGGER.debug("\n----------------------------------------------------\nEND ANALYSIS\n----------------------------------------------------");
      +  402  1
               LOGGER.info("Analysis Complete ({} ms)", System.currentTimeMillis() - analysisStart);
      +  403  1
           }
      +  404   +
       
      +  405   +
           /**
      +  406   +
            * Initializes the given analyzer.
      +  407   +
            *
      +  408   +
            * @param analyzer the analyzer to initialize
      +  409   +
            * @return the initialized analyzer
      +  410   +
            */
      +  411   +
           protected Analyzer initializeAnalyzer(Analyzer analyzer) {
      +  412   +
               try {
      +  413  22
                   LOGGER.debug("Initializing {}", analyzer.getName());
      +  414  22
                   analyzer.initialize();
      +  415  0
               } catch (Throwable ex) {
      +  416  0
                   LOGGER.error("Exception occurred initializing {}.", analyzer.getName());
      +  417  0
                   LOGGER.debug("", ex);
      +  418   +
                   try {
      +  419  0
                       analyzer.close();
      +  420  0
                   } catch (Throwable ex1) {
      +  421  0
                       LOGGER.trace("", ex1);
      +  422  0
                   }
      +  423  22
               }
      +  424  22
               return analyzer;
      +  425   +
           }
      +  426   +
       
      +  427   +
           /**
      +  428   +
            * Closes the given analyzer.
      +  429   +
            *
      +  430   +
            * @param analyzer the analyzer to close
      +  431   +
            */
      +  432   +
           protected void closeAnalyzer(Analyzer analyzer) {
      +  433  22
               LOGGER.debug("Closing Analyzer '{}'", analyzer.getName());
      +  434   +
               try {
      +  435  22
                   analyzer.close();
      +  436  0
               } catch (Throwable ex) {
      +  437  0
                   LOGGER.trace("", ex);
      +  438  22
               }
      +  439  22
           }
      +  440   +
       
      +  441   +
           /**
      +  442   +
            * Cycles through the cached web data sources and calls update on all of them.
      +  443   +
            */
      +  444   +
           public void doUpdates() {
      +  445  0
               LOGGER.info("Checking for updates");
      +  446  0
               final long updateStart = System.currentTimeMillis();
      +  447  0
               final UpdateService service = new UpdateService(serviceClassLoader);
      +  448  0
               final Iterator<CachedWebDataSource> iterator = service.getDataSources();
      +  449  0
               while (iterator.hasNext()) {
      +  450  0
                   final CachedWebDataSource source = iterator.next();
      +  451   +
                   try {
      +  452  0
                       source.update();
      +  453  0
                   } catch (UpdateException ex) {
      +  454  0
                       LOGGER.warn(
      +  455   +
                               "Unable to update Cached Web DataSource, using local data instead. Results may not include recent vulnerabilities.");
      +  456  0
                       LOGGER.debug("Unable to update details for {}", source.getClass().getName(), ex);
      +  457  0
                   }
      +  458  0
               }
      +  459  0
               LOGGER.info("Check for updates complete ({} ms)", System.currentTimeMillis() - updateStart);
      +  460  0
           }
      +  461   +
       
      +  462   +
           /**
      +  463   +
            * Returns a full list of all of the analyzers. This is useful for reporting which analyzers where used.
      +  464   +
            *
      +  465   +
            * @return a list of Analyzers
      +  466   +
            */
      +  467   +
           public List<Analyzer> getAnalyzers() {
      +  468  0
               final List<Analyzer> ret = new ArrayList<Analyzer>();
      +  469  0
               for (AnalysisPhase phase : AnalysisPhase.values()) {
      +  470  0
                   final List<Analyzer> analyzerList = analyzers.get(phase);
      +  471  0
                   ret.addAll(analyzerList);
      +  472   +
               }
      +  473  0
               return ret;
      +  474   +
           }
      +  475   +
       
      +  476   +
           /**
      +  477   +
            * Checks all analyzers to see if an extension is supported.
      +  478   +
            *
      +  479   +
            * @param file a file extension
      +  480   +
            * @return true or false depending on whether or not the file extension is supported
      +  481   +
            */
      +  482   +
           @Override
      +  483   +
           public boolean accept(File file) {
      +  484  851
               if (file == null) {
      +  485  0
                   return false;
      +  486   +
               }
      +  487  851
               boolean scan = false;
      +  488  851
               for (FileTypeAnalyzer a : this.fileTypeAnalyzers) {
      +  489   +
                   /* note, we can't break early on this loop as the analyzers need to know if
      +  490   +
                    they have files to work on prior to initialization */
      +  491  11914
                   scan |= a.accept(file);
      +  492  11914
               }
      +  493  851
               return scan;
      +  494   +
           }
      +  495   +
       
      +  496   +
           /**
      +  497   +
            * Returns the set of file type analyzers.
      +  498   +
            *
      +  499   +
            * @return the set of file type analyzers
      +  500   +
            */
      +  501   +
           public Set<FileTypeAnalyzer> getFileTypeAnalyzers() {
      +  502  0
               return this.fileTypeAnalyzers;
      +  503   +
           }
      +  504   +
       
      +  505   +
           /**
      +  506   +
            * Checks the CPE Index to ensure documents exists. If none exist a NoDataException is thrown.
      +  507   +
            *
      +  508   +
            * @throws NoDataException thrown if no data exists in the CPE Index
      +  509   +
            * @throws DatabaseException thrown if there is an exception opening the database
      +  510   +
            */
      +  511   +
           private void ensureDataExists() throws NoDataException, DatabaseException {
      +  512  1
               final CveDB cve = new CveDB();
      +  513   +
               try {
      +  514  1
                   cve.open();
      +  515  1
                   if (!cve.dataExists()) {
      +  516  0
                       throw new NoDataException("No documents exist");
       517   +
                   }
      +  518  0
               } catch (DatabaseException ex) {
      +  519  0
                   throw new NoDataException(ex.getMessage(), ex);
      +  520  
               } finally {
      -  518  8
                   cve.close();
      -  519  8
               }
      -  520  8
           }
      -  521   +  521  1
                   cve.close();
      +  522  1
               }
      +  523  1
           }
      +  524  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.agent.DependencyCheckScanAgent.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.agent.DependencyCheckScanAgent.html index 61459a528..03b57515b 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.agent.DependencyCheckScanAgent.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.agent.DependencyCheckScanAgent.html @@ -1909,6 +1909,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AbstractAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AbstractAnalyzer.html index a6c7d2fd8..88571e922 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AbstractAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AbstractAnalyzer.html @@ -63,7 +63,7 @@
        * @author Jeremy Long
       23  
        */
      -  24  856
       public abstract class AbstractAnalyzer implements Analyzer {
      +  24  145
       public abstract class AbstractAnalyzer implements Analyzer {
       25  
       
       26   @@ -82,7 +82,7 @@
           public void initialize() throws Exception {
       33  
               //do nothing
      -  34  80
           }
      +  34  10
           }
       35  
       
       36   @@ -101,11 +101,11 @@
           public void close() throws Exception {
       43  
               //do nothing
      -  44  304
           }
      +  44  50
           }
       45  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AbstractFileTypeAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AbstractFileTypeAnalyzer.html index ec490361c..ad27bd7bd 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AbstractFileTypeAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AbstractFileTypeAnalyzer.html @@ -105,9 +105,9 @@
            * Base constructor that all children must call. This checks the configuration to determine if the analyzer is enabled.
       44  
            */
      -  45  560
           public AbstractFileTypeAnalyzer() {
      -  46  560
               reset();
      -  47  560
           }
      +  45  102
           public AbstractFileTypeAnalyzer() {
      +  46  102
               reset();
      +  47  102
           }
       48  
       //</editor-fold>
       49   @@ -120,14 +120,14 @@
            * The logger.
       53  
            */
      -  54  8
           private static final Logger LOGGER = LoggerFactory.getLogger(AbstractFileTypeAnalyzer.class);
      +  54  1
           private static final Logger LOGGER = LoggerFactory.getLogger(AbstractFileTypeAnalyzer.class);
       55  
           /**
       56  
            * Whether the file type analyzer detected any files it needs to analyze.
       57  
            */
      -  58  560
           private boolean filesMatched = false;
      +  58  102
           private boolean filesMatched = false;
       59  
       
       60   @@ -159,8 +159,8 @@
            */
       74  
           protected void setFilesMatched(boolean filesMatched) {
      -  75  208
               this.filesMatched = filesMatched;
      -  76  208
           }
      +  75  35
               this.filesMatched = filesMatched;
      +  76  35
           }
       77  
       
       78   @@ -169,7 +169,7 @@
            * A flag indicating whether or not the analyzer is enabled.
       80  
            */
      -  81  560
           private boolean enabled = true;
      +  81  102
           private boolean enabled = true;
       82  
       
       83   @@ -201,8 +201,8 @@
            */
       97  
           public void setEnabled(boolean enabled) {
      -  98  32
               this.enabled = enabled;
      -  99  32
           }
      +  98  4
               this.enabled = enabled;
      +  99  4
           }
       100  
       //</editor-fold>
       101   @@ -303,14 +303,14 @@
           @Override
       149  
           public final void initialize() throws Exception {
      -  150  368
               if (filesMatched) {
      -  151  264
                   initializeFileTypeAnalyzer();
      +  150  58
               if (filesMatched) {
      +  151  42
                   initializeFileTypeAnalyzer();
       152  
               } else {
      -  153  104
                   enabled = false;
      +  153  16
                   enabled = false;
       154  
               }
      -  155  368
           }
      +  155  58
           }
       156  
       
       157   @@ -323,16 +323,16 @@
           @Override
       161  
           public final void reset() {
      -  162  560
               final String key = getAnalyzerEnabledSettingKey();
      +  162  102
               final String key = getAnalyzerEnabledSettingKey();
       163  
               try {
      -  164  560
                   enabled = Settings.getBoolean(key, true);
      +  164  102
                   enabled = Settings.getBoolean(key, true);
       165  0
               } catch (InvalidSettingException ex) {
       166  0
                   LOGGER.warn("Invalid setting for property '{}'", key);
       167  0
                   LOGGER.debug("", ex);
       168  0
                   LOGGER.warn("{} has been disabled", getName());
      -  169  560
               }
      -  170  560
           }
      +  169  102
               }
      +  170  102
           }
       171  
       
       172   @@ -355,30 +355,30 @@
           @Override
       181  
           public final void analyze(Dependency dependency, Engine engine) throws AnalysisException {
      -  182  200
               if (enabled) {
      -  183  200
                   analyzeFileType(dependency, engine);
      +  182  28
               if (enabled) {
      +  183  28
                   analyzeFileType(dependency, engine);
       184  
               }
      -  185  192
           }
      +  185  27
           }
       186  
       
       187  
           @Override
       188  
           public boolean accept(File pathname) {
      -  189  75232
               final FileFilter filter = getFileFilter();
      -  190  75232
               boolean accepted = false;
      -  191  75232
               if (null == filter) {
      +  189  11967
               final FileFilter filter = getFileFilter();
      +  190  11967
               boolean accepted = false;
      +  191  11967
               if (null == filter) {
       192  0
                   LOGGER.error("The '{}' analyzer is misconfigured and does not have a file filter; it will be disabled", getName());
      -  193  75232
               } else if (enabled) {
      -  194  61472
                   accepted = filter.accept(pathname);
      -  195  61472
                   if (accepted) {
      -  196  224
                       filesMatched = true;
      +  193  11967
               } else if (enabled) {
      +  194  10241
                   accepted = filter.accept(pathname);
      +  195  10241
                   if (accepted) {
      +  196  32
                       filesMatched = true;
       197  
                   }
       198  
               }
      -  199  75232
               return accepted;
      +  199  11967
               return accepted;
       200  
           }
       201   @@ -413,9 +413,9 @@
            */
       216  
           protected static Set<String> newHashSet(String... strings) {
      -  217  40
               final Set<String> set = new HashSet<String>();
      -  218  40
               Collections.addAll(set, strings);
      -  219  40
               return set;
      +  217  5
               final Set<String> set = new HashSet<String>();
      +  218  5
               Collections.addAll(set, strings);
      +  219  5
               return set;
       220  
           }
       221   @@ -426,6 +426,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AbstractSuppressionAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AbstractSuppressionAnalyzer.html index 7f8d06d6a..3e124ed90 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AbstractSuppressionAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AbstractSuppressionAnalyzer.html @@ -101,7 +101,7 @@
        * @author Jeremy Long
       42  
        */
      -  43  80
       public abstract class AbstractSuppressionAnalyzer extends AbstractAnalyzer {
      +  43  12
       public abstract class AbstractSuppressionAnalyzer extends AbstractAnalyzer {
       44  
       
       45   @@ -110,7 +110,7 @@
            * The Logger for use throughout the class
       47  
            */
      -  48  8
           private static final Logger LOGGER = LoggerFactory.getLogger(AbstractSuppressionAnalyzer.class);
      +  48  1
           private static final Logger LOGGER = LoggerFactory.getLogger(AbstractSuppressionAnalyzer.class);
       49  
       
       50   @@ -127,7 +127,7 @@
            */
       56  
           public Set<String> getSupportedExtensions() {
      -  57  8
               return null;
      +  57  1
               return null;
       58  
           }
       59   @@ -148,9 +148,9 @@
           @Override
       67  
           public void initialize() throws Exception {
      -  68  40
               super.initialize();
      -  69  40
               loadSuppressionData();
      -  70  32
           }
      +  68  5
               super.initialize();
      +  69  5
               loadSuppressionData();
      +  70  4
           }
       71  
       
       72   @@ -175,7 +175,7 @@
            */
       82  
           public List<SuppressionRule> getRules() {
      -  83  112
               return rules;
      +  83  14
               return rules;
       84  
           }
       85   @@ -208,46 +208,46 @@
            */
       100  
           private void loadSuppressionData() throws SuppressionParseException {
      -  101  40
               final SuppressionParser parser = new SuppressionParser();
      -  102  40
               File file = null;
      +  101  5
               final SuppressionParser parser = new SuppressionParser();
      +  102  5
               File file = null;
       103  
               try {
      -  104  40
                   rules = parser.parseSuppressionRules(this.getClass().getClassLoader().getResourceAsStream("dependencycheck-base-suppression.xml"));
      +  104  5
                   rules = parser.parseSuppressionRules(this.getClass().getClassLoader().getResourceAsStream("dependencycheck-base-suppression.xml"));
       105  0
               } catch (SuppressionParseException ex) {
       106  0
                   LOGGER.debug("Unable to parse the base suppression data file", ex);
      -  107  40
               }
      -  108  40
               final String suppressionFilePath = Settings.getString(Settings.KEYS.SUPPRESSION_FILE);
      -  109  40
               if (suppressionFilePath == null) {
      -  110  16
                   return;
      +  107  5
               }
      +  108  5
               final String suppressionFilePath = Settings.getString(Settings.KEYS.SUPPRESSION_FILE);
      +  109  5
               if (suppressionFilePath == null) {
      +  110  2
                   return;
       111  
               }
      -  112  24
               boolean deleteTempFile = false;
      +  112  3
               boolean deleteTempFile = false;
       113  
               try {
      -  114  24
                   final Pattern uriRx = Pattern.compile("^(https?|file)\\:.*", Pattern.CASE_INSENSITIVE);
      -  115  24
                   if (uriRx.matcher(suppressionFilePath).matches()) {
      -  116  8
                       deleteTempFile = true;
      -  117  8
                       file = FileUtils.getTempFile("suppression", "xml");
      -  118  8
                       final URL url = new URL(suppressionFilePath);
      +  114  3
                   final Pattern uriRx = Pattern.compile("^(https?|file)\\:.*", Pattern.CASE_INSENSITIVE);
      +  115  3
                   if (uriRx.matcher(suppressionFilePath).matches()) {
      +  116  1
                       deleteTempFile = true;
      +  117  1
                       file = FileUtils.getTempFile("suppression", "xml");
      +  118  1
                       final URL url = new URL(suppressionFilePath);
       119  
                       try {
      -  120  8
                           Downloader.fetchFile(url, file, false);
      +  120  1
                           Downloader.fetchFile(url, file, false);
       121  0
                       } catch (DownloadFailedException ex) {
       122  0
                           Downloader.fetchFile(url, file, true);
      -  123  8
                       }
      -  124  8
                   } else {
      -  125  16
                       file = new File(suppressionFilePath);
      -  126  16
                       if (!file.exists()) {
      -  127  16
                           final InputStream suppressionsFromClasspath = this.getClass().getClassLoader().getResourceAsStream(suppressionFilePath);
      -  128  16
                           if (suppressionsFromClasspath != null) {
      -  129  8
                               deleteTempFile = true;
      -  130  8
                               file = FileUtils.getTempFile("suppression", "xml");
      +  123  1
                       }
      +  124  1
                   } else {
      +  125  2
                       file = new File(suppressionFilePath);
      +  126  2
                       if (!file.exists()) {
      +  127  2
                           final InputStream suppressionsFromClasspath = this.getClass().getClassLoader().getResourceAsStream(suppressionFilePath);
      +  128  2
                           if (suppressionsFromClasspath != null) {
      +  129  1
                               deleteTempFile = true;
      +  130  1
                               file = FileUtils.getTempFile("suppression", "xml");
       131  
                               try {
      -  132  8
                                   org.apache.commons.io.FileUtils.copyInputStreamToFile(suppressionsFromClasspath, file);
      +  132  1
                                   org.apache.commons.io.FileUtils.copyInputStreamToFile(suppressionsFromClasspath, file);
       133  0
                               } catch (IOException ex) {
       134  0
                                   throwSuppressionParseException("Unable to locate suppressions file in classpath", ex);
      -  135  8
                               }
      +  135  1
                               }
       136  
                           }
       137   @@ -256,36 +256,36 @@
                   }
       139  
       
      -  140  24
                   if (file != null) {
      +  140  3
                   if (file != null) {
       141  
                       try {
       142  
                           //rules = parser.parseSuppressionRules(file);
      -  143  24
                           rules.addAll(parser.parseSuppressionRules(file));
      -  144  16
                           LOGGER.debug("{} suppression rules were loaded.", rules.size());
      -  145  8
                       } catch (SuppressionParseException ex) {
      -  146  8
                           LOGGER.warn("Unable to parse suppression xml file '{}'", file.getPath());
      -  147  8
                           LOGGER.warn(ex.getMessage());
      -  148  8
                           LOGGER.debug("", ex);
      -  149  8
                           throw ex;
      -  150  16
                       }
      +  143  3
                           rules.addAll(parser.parseSuppressionRules(file));
      +  144  2
                           LOGGER.debug("{} suppression rules were loaded.", rules.size());
      +  145  1
                       } catch (SuppressionParseException ex) {
      +  146  1
                           LOGGER.warn("Unable to parse suppression xml file '{}'", file.getPath());
      +  147  1
                           LOGGER.warn(ex.getMessage());
      +  148  1
                           LOGGER.debug("", ex);
      +  149  1
                           throw ex;
      +  150  2
                       }
       151  
                   }
       152  0
               } catch (DownloadFailedException ex) {
       153  0
                   throwSuppressionParseException("Unable to fetch the configured suppression file", ex);
       154  0
               } catch (MalformedURLException ex) {
       155  0
                   throwSuppressionParseException("Configured suppression file has an invalid URL", ex);
      -  156  8
               } catch (IOException ex) {
      -  157  8
                   throwSuppressionParseException("Unable to create temp file for suppressions", ex);
      +  156  1
               } catch (IOException ex) {
      +  157  1
                   throwSuppressionParseException("Unable to create temp file for suppressions", ex);
       158  
               } finally {
      -  159  24
                   if (deleteTempFile && file != null) {
      -  160  16
                       FileUtils.delete(file);
      +  159  3
                   if (deleteTempFile && file != null) {
      +  160  2
                       FileUtils.delete(file);
       161  
                   }
       162  
               }
      -  163  16
           }
      +  163  2
           }
       164  
       
       165   @@ -304,15 +304,15 @@
            */
       172  
           private void throwSuppressionParseException(String message, Exception exception) throws SuppressionParseException {
      -  173  8
               LOGGER.warn(message);
      -  174  8
               LOGGER.debug("", exception);
      -  175  8
               throw new SuppressionParseException(message, exception);
      +  173  1
               LOGGER.warn(message);
      +  174  1
               LOGGER.debug("", exception);
      +  175  1
               throw new SuppressionParseException(message, exception);
       176  
           }
       177  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AnalysisPhase.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AnalysisPhase.html index 9323d9b2f..c815dd9ee 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AnalysisPhase.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AnalysisPhase.html @@ -65,7 +65,7 @@
        * @author Jeremy Long
       24  
        */
      -  25  120
       public enum AnalysisPhase {
      +  25  16
       public enum AnalysisPhase {
       26  
       
       27   @@ -74,67 +74,67 @@
            * Initialization phase.
       29  
            */
      -  30  8
           INITIAL,
      +  30  1
           INITIAL,
       31  
           /**
       32  
            * Information collection phase.
       33  
            */
      -  34  8
           INFORMATION_COLLECTION,
      +  34  1
           INFORMATION_COLLECTION,
       35  
           /**
       36  
            * Pre identifier analysis phase.
       37  
            */
      -  38  8
           PRE_IDENTIFIER_ANALYSIS,
      +  38  1
           PRE_IDENTIFIER_ANALYSIS,
       39  
           /**
       40  
            * Identifier analysis phase.
       41  
            */
      -  42  8
           IDENTIFIER_ANALYSIS,
      +  42  1
           IDENTIFIER_ANALYSIS,
       43  
           /**
       44  
            * Post identifier analysis phase.
       45  
            */
      -  46  8
           POST_IDENTIFIER_ANALYSIS,
      +  46  1
           POST_IDENTIFIER_ANALYSIS,
       47  
           /**
       48  
            * Pre finding analysis phase.
       49  
            */
      -  50  8
           PRE_FINDING_ANALYSIS,
      +  50  1
           PRE_FINDING_ANALYSIS,
       51  
           /**
       52  
            * Finding analysis phase.
       53  
            */
      -  54  8
           FINDING_ANALYSIS,
      +  54  1
           FINDING_ANALYSIS,
       55  
           /**
       56  
            * Post analysis phase.
       57  
            */
      -  58  8
           POST_FINDING_ANALYSIS,
      +  58  1
           POST_FINDING_ANALYSIS,
       59  
           /**
       60  
            * The final analysis phase.
       61  
            */
      -  62  8
           FINAL
      +  62  1
           FINAL
       63  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.Analyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.Analyzer.html index 1ee337631..705c1980f 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.Analyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.Analyzer.html @@ -161,6 +161,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AnalyzerService.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AnalyzerService.html index c87636f5b..0693d1497 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AnalyzerService.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AnalyzerService.html @@ -97,9 +97,9 @@
            * @param classLoader the ClassLoader to use when dynamically loading Analyzer and Update services
       40  
            */
      -  41  24
           public AnalyzerService(ClassLoader classLoader) {
      -  42  24
               loader = ServiceLoader.load(Analyzer.class, classLoader);
      -  43  24
           }
      +  41  4
           public AnalyzerService(ClassLoader classLoader) {
      +  42  4
               loader = ServiceLoader.load(Analyzer.class, classLoader);
      +  43  4
           }
       44  
       
       45   @@ -114,13 +114,13 @@
            */
       50  
           public Iterator<Analyzer> getAnalyzers() {
      -  51  24
               return loader.iterator();
      +  51  4
               return loader.iterator();
       52  
           }
       53  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.ArchiveAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.ArchiveAnalyzer.html index e578f229d..956a232c2 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.ArchiveAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.ArchiveAnalyzer.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      ArchiveAnalyzer
      31%
      67/211
      22%
      20/90
      7.25
      ArchiveAnalyzer
      37%
      72/193
      25%
      22/88
      5.125
       
      @@ -58,7 +58,7 @@  20  
       import java.io.BufferedInputStream;
       21   -
       import java.io.BufferedOutputStream;
      +
       import java.io.Closeable;
       22  
       import java.io.File;
       23   @@ -74,117 +74,117 @@  28  
       import java.util.ArrayList;
       29   -
       import java.util.Arrays;
      -  30  
       import java.util.Collections;
      -  31   +  30  
       import java.util.Enumeration;
      -  32   +  31  
       import java.util.HashSet;
      -  33   +  32  
       import java.util.List;
      -  34   +  33  
       import java.util.Set;
      +  34   +
       
       35   -
       
      -  36  
       import org.apache.commons.compress.archivers.ArchiveEntry;
      -  37   +  36  
       import org.apache.commons.compress.archivers.ArchiveInputStream;
      -  38   +  37  
       import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
      -  39   +  38  
       import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
      -  40   +  39  
       import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
      -  41   +  40  
       import org.apache.commons.compress.archivers.zip.ZipFile;
      -  42   +  41  
       import org.apache.commons.compress.compressors.CompressorInputStream;
      +  42   +
       import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
       43   -
       import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
      +
       import org.apache.commons.compress.compressors.bzip2.BZip2Utils;
       44   -
       import org.apache.commons.compress.compressors.gzip.GzipUtils;
      +
       import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
       45   -
       import org.owasp.dependencycheck.Engine;
      +
       import org.apache.commons.compress.compressors.gzip.GzipUtils;
       46   -
       import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
      +
       import org.apache.commons.compress.utils.IOUtils;
       47   -
       import org.owasp.dependencycheck.analyzer.exception.ArchiveExtractionException;
      +
       
       48   -
       import org.owasp.dependencycheck.dependency.Dependency;
      +
       import org.owasp.dependencycheck.Engine;
       49   -
       import org.owasp.dependencycheck.utils.FileFilterBuilder;
      +
       import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
       50   -
       import org.owasp.dependencycheck.utils.FileUtils;
      +
       import org.owasp.dependencycheck.analyzer.exception.ArchiveExtractionException;
       51   -
       import org.owasp.dependencycheck.utils.Settings;
      +
       import org.owasp.dependencycheck.dependency.Dependency;
       52   -
       import org.slf4j.Logger;
      +
       import org.owasp.dependencycheck.utils.FileFilterBuilder;
       53   -
       import org.slf4j.LoggerFactory;
      +
       import org.owasp.dependencycheck.utils.FileUtils;
       54   -
       
      +
       import org.owasp.dependencycheck.utils.Settings;
       55   -
       /**
      -  56   -
        * <p>
      -  57   -
        * An analyzer that extracts files from archives and ensures any supported files contained within the archive are added to the
      -  58   -
        * dependency list.</p>
      -  59   -
        *
      -  60   -
        * @author Jeremy Long
      -  61   -
        */
      -  62  24
       public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
      -  63  
       
      +  56   +
       import org.slf4j.Logger;
      +  57   +
       import org.slf4j.LoggerFactory;
      +  58   +
       
      +  59   +
       /**
      +  60   +
        * <p>
      +  61   +
        * An analyzer that extracts files from archives and ensures any supported files contained within the archive are added to the
      +  62   +
        * dependency list.</p>
      +  63   +
        *
       64   -
           /**
      +
        * @author Jeremy Long
       65   -
            * The logger.
      -  66   -
            */
      -  67  8
           private static final Logger LOGGER = LoggerFactory.getLogger(ArchiveAnalyzer.class);
      +
        */
      +  66  4
       public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer {
      +  67   +
       
       68  
           /**
       69   -
            * The buffer size to use when extracting files from the archive.
      +
            * The logger.
       70  
            */
      -  71   -
           private static final int BUFFER_SIZE = 4096;
      +  71  1
           private static final Logger LOGGER = LoggerFactory.getLogger(ArchiveAnalyzer.class);
       72  
           /**
       73  
            * The count of directories created during analysis. This is used for creating temporary directories.
       74  
            */
      -  75  8
           private static int dirCount = 0;
      +  75  1
           private static int dirCount = 0;
       76  
           /**
       77  
            * The parent directory for the individual directories per archive.
       78  
            */
      -  79  24
           private File tempFileLocation = null;
      +  79  4
           private File tempFileLocation = null;
       80  
           /**
       81  
            * The max scan depth that the analyzer will recursively extract nested archives.
       82  
            */
      -  83  8
           private static final int MAX_SCAN_DEPTH = Settings.getInt("archive.scan.depth", 3);
      +  83  1
           private static final int MAX_SCAN_DEPTH = Settings.getInt("archive.scan.depth", 3);
       84  
           /**
       85  
            * Tracks the current scan/extraction depth for nested archives.
       86  
            */
      -  87  24
           private int scanDepth = 0;
      +  87  4
           private int scanDepth = 0;
       88  
       
       89   @@ -203,23 +203,23 @@
            * The phase that this analyzer is intended to run in.
       96  
            */
      -  97  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INITIAL;
      +  97  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INITIAL;
       98  
           /**
       99  
            * The set of things we can handle with Zip methods
       100  
            */
      -  101  8
           private static final Set<String> ZIPPABLES = newHashSet("zip", "ear", "war", "jar", "sar", "apk", "nupkg");
      +  101  1
           private static final Set<String> ZIPPABLES = newHashSet("zip", "ear", "war", "jar", "sar", "apk", "nupkg");
       102  
           /**
       103  
            * The set of file extensions supported by this analyzer. Note for developers, any additions to this list will need to be
       104   -
            * explicitly handled in extractFiles().
      +
            * explicitly handled in {@link #extractFiles(File, File, Engine)}.
       105  
            */
      -  106  8
           private static final Set<String> EXTENSIONS = newHashSet("tar", "gz", "tgz");
      +  106  1
           private static final Set<String> EXTENSIONS = newHashSet("tar", "gz", "tgz", "bz2", "tbz2");
       107  
       
       108   @@ -228,516 +228,537 @@
            * Detects files with extensions to remove from the engine's collection of dependencies.
       110  
            */
      -  111  8
           private static final FileFilter REMOVE_FROM_ANALYSIS = FileFilterBuilder.newInstance().addExtensions("zip", "tar", "gz", "tgz").build();
      +  111  1
           private static final FileFilter REMOVE_FROM_ANALYSIS = FileFilterBuilder.newInstance().addExtensions("zip", "tar", "gz", "tgz", "bz2", "tbz2")
       112   -
       
      +
                   .build();
       113   +
       
      +  114  
           static {
      -  114  8
               final String additionalZipExt = Settings.getString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS);
      -  115  8
               if (additionalZipExt != null) {
      -  116  0
                   final Set<String> ext = new HashSet<String>(Arrays.asList(additionalZipExt));
      -  117  0
                   ZIPPABLES.addAll(ext);
      -  118   +  115  1
               final String additionalZipExt = Settings.getString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS);
      +  116  1
               if (additionalZipExt != null) {
      +  117  0
                   final Set<String> ext = new HashSet<String>(Collections.singletonList(additionalZipExt));
      +  118  0
                   ZIPPABLES.addAll(ext);
      +  119  
               }
      -  119  8
               EXTENSIONS.addAll(ZIPPABLES);
      -  120   -
           }
      +  120  1
               EXTENSIONS.addAll(ZIPPABLES);
       121   -
       
      +
           }
       122   -
           /**
      +
       
       123   -
            * The file filter used to filter supported files.
      +
           /**
       124   +
            * The file filter used to filter supported files.
      +  125  
            */
      -  125  8
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build();
      -  126   -
       
      +  126  1
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build();
       127   -
           @Override
      +
       
       128   +
           @Override
      +  129  
           protected FileFilter getFileFilter() {
      -  129  6824
               return FILTER;
      -  130   -
           }
      +  130  853
               return FILTER;
       131   -
       
      +
           }
       132   -
           /**
      +
       
       133   -
            * Detects files with .zip extension.
      +
           /**
       134   +
            * Detects files with .zip extension.
      +  135  
            */
      -  135  8
           private static final FileFilter ZIP_FILTER = FileFilterBuilder.newInstance().addExtensions("zip").build();
      -  136   -
       
      +  136  1
           private static final FileFilter ZIP_FILTER = FileFilterBuilder.newInstance().addExtensions("zip").build();
       137   -
           /**
      +
       
       138   -
            * Returns the name of the analyzer.
      +
           /**
       139   -
            *
      +
            * Returns the name of the analyzer.
       140   -
            * @return the name of the analyzer.
      +
            *
       141   -
            */
      +
            * @return the name of the analyzer.
       142   -
           @Override
      +
            */
       143   +
           @Override
      +  144  
           public String getName() {
      -  144  32
               return ANALYZER_NAME;
      -  145   -
           }
      +  145  4
               return ANALYZER_NAME;
       146   -
       
      +
           }
       147   -
           /**
      +
       
       148   -
            * Returns the phase that the analyzer is intended to run in.
      +
           /**
       149   -
            *
      +
            * Returns the phase that the analyzer is intended to run in.
       150   -
            * @return the phase that the analyzer is intended to run in.
      +
            *
       151   -
            */
      +
            * @return the phase that the analyzer is intended to run in.
       152   -
           @Override
      +
            */
       153   +
           @Override
      +  154  
           public AnalysisPhase getAnalysisPhase() {
      -  154  16
               return ANALYSIS_PHASE;
      -  155   -
           }
      +  155  3
               return ANALYSIS_PHASE;
       156   -
           //</editor-fold>
      -  157   -
       
      -  158   -
           /**
      -  159   -
            * Returns the key used in the properties file to reference the analyzer's enabled property.
      -  160   -
            *
      -  161   -
            * @return the analyzer's enabled property setting key
      -  162   -
            */
      -  163   -
           @Override
      -  164   -
           protected String getAnalyzerEnabledSettingKey() {
      -  165  24
               return Settings.KEYS.ANALYZER_ARCHIVE_ENABLED;
      -  166  
           }
      +  157   +
           //</editor-fold>
      +  158   +
       
      +  159   +
           /**
      +  160   +
            * Returns the key used in the properties file to reference the analyzer's enabled property.
      +  161   +
            *
      +  162   +
            * @return the analyzer's enabled property setting key
      +  163   +
            */
      +  164   +
           @Override
      +  165   +
           protected String getAnalyzerEnabledSettingKey() {
      +  166  4
               return Settings.KEYS.ANALYZER_ARCHIVE_ENABLED;
       167   -
       
      +
           }
       168   -
           /**
      +
       
       169   -
            * The initialize method does nothing for this Analyzer.
      +
           /**
       170   -
            *
      +
            * The initialize method does nothing for this Analyzer.
       171   -
            * @throws Exception is thrown if there is an exception deleting or creating temporary files
      +
            *
       172   -
            */
      +
            * @throws Exception is thrown if there is an exception deleting or creating temporary files
       173   -
           @Override
      +
            */
       174   +
           @Override
      +  175  
           public void initializeFileTypeAnalyzer() throws Exception {
      -  175  8
               final File baseDir = Settings.getTempDirectory();
      -  176  8
               tempFileLocation = File.createTempFile("check", "tmp", baseDir);
      -  177  8
               if (!tempFileLocation.delete()) {
      -  178  0
                   final String msg = String.format("Unable to delete temporary file '%s'.", tempFileLocation.getAbsolutePath());
      -  179  0
                   throw new AnalysisException(msg);
      -  180   +  176  1
               final File baseDir = Settings.getTempDirectory();
      +  177  1
               tempFileLocation = File.createTempFile("check", "tmp", baseDir);
      +  178  1
               if (!tempFileLocation.delete()) {
      +  179  0
                   final String msg = String.format("Unable to delete temporary file '%s'.", tempFileLocation.getAbsolutePath());
      +  180  0
                   throw new AnalysisException(msg);
      +  181  
               }
      -  181  8
               if (!tempFileLocation.mkdirs()) {
      -  182  0
                   final String msg = String.format("Unable to create directory '%s'.", tempFileLocation.getAbsolutePath());
      -  183  0
                   throw new AnalysisException(msg);
      -  184   +  182  1
               if (!tempFileLocation.mkdirs()) {
      +  183  0
                   final String msg = String.format("Unable to create directory '%s'.", tempFileLocation.getAbsolutePath());
      +  184  0
                   throw new AnalysisException(msg);
      +  185  
               }
      -  185  8
           }
      -  186   -
       
      +  186  1
           }
       187   -
           /**
      +
       
       188   -
            * The close method deletes any temporary files and directories created during analysis.
      -  189   -
            *
      -  190   -
            * @throws Exception thrown if there is an exception deleting temporary files
      -  191   -
            */
      -  192   -
           @Override
      -  193   -
           public void close() throws Exception {
      -  194  8
               if (tempFileLocation != null && tempFileLocation.exists()) {
      -  195  8
                   LOGGER.debug("Attempting to delete temporary files");
      -  196  8
                   final boolean success = FileUtils.delete(tempFileLocation);
      -  197  8
                   if (!success && tempFileLocation != null && tempFileLocation.exists() && tempFileLocation.list().length > 0) {
      -  198  0
                       LOGGER.warn("Failed to delete some temporary files, see the log for more details");
      -  199   -
                   }
      -  200   -
               }
      -  201  8
           }
      -  202   -
       
      -  203  
           /**
      -  204   -
            * Analyzes a given dependency. If the dependency is an archive, such as a WAR or EAR, the contents are extracted, scanned,
      -  205   -
            * and added to the list of dependencies within the engine.
      -  206   +  189   +
            * The close method deletes any temporary files and directories created during analysis.
      +  190  
            *
      -  207   -
            * @param dependency the dependency to analyze
      -  208   -
            * @param engine the engine scanning
      -  209   -
            * @throws AnalysisException thrown if there is an analysis exception
      -  210   +  191   +
            * @throws Exception thrown if there is an exception deleting temporary files
      +  192  
            */
      -  211   +  193  
           @Override
      -  212   -
           public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
      -  213  16
               final File f = new File(dependency.getActualFilePath());
      -  214  16
               final File tmpDir = getNextTempDirectory();
      -  215  16
               extractFiles(f, tmpDir, engine);
      -  216   -
       
      -  217   -
               //make a copy
      -  218  16
               List<Dependency> dependencies = new ArrayList<Dependency>(engine.getDependencies());
      -  219  16
               engine.scan(tmpDir);
      -  220  16
               List<Dependency> newDependencies = engine.getDependencies();
      -  221  16
               if (dependencies.size() != newDependencies.size()) {
      -  222   -
                   //get the new dependencies
      -  223  0
                   final Set<Dependency> dependencySet = new HashSet<Dependency>();
      -  224  0
                   dependencySet.addAll(newDependencies);
      -  225  0
                   dependencySet.removeAll(dependencies);
      -  226   -
       
      -  227  0
                   for (Dependency d : dependencySet) {
      -  228   -
                       //fix the dependency's display name and path
      -  229  0
                       final String displayPath = String.format("%s%s",
      -  230   -
                               dependency.getFilePath(),
      -  231   -
                               d.getActualFilePath().substring(tmpDir.getAbsolutePath().length()));
      -  232  0
                       final String displayName = String.format("%s: %s",
      -  233   -
                               dependency.getFileName(),
      -  234   -
                               d.getFileName());
      -  235  0
                       d.setFilePath(displayPath);
      -  236  0
                       d.setFileName(displayName);
      -  237   -
       
      -  238   -
                       //TODO - can we get more evidence from the parent? EAR contains module name, etc.
      -  239   -
                       //analyze the dependency (i.e. extract files) if it is a supported type.
      -  240  0
                       if (this.accept(d.getActualFile()) && scanDepth < MAX_SCAN_DEPTH) {
      -  241  0
                           scanDepth += 1;
      -  242  0
                           analyze(d, engine);
      -  243  0
                           scanDepth -= 1;
      -  244   -
                       }
      -  245  0
                   }
      -  246   -
               }
      -  247  16
               if (REMOVE_FROM_ANALYSIS.accept(dependency.getActualFile())) {
      -  248  0
                   if (ZIP_FILTER.accept(dependency.getActualFile()) && isZipFileActuallyJarFile(dependency)) {
      -  249  0
                       final File tdir = getNextTempDirectory();
      -  250  0
                       final String fileName = dependency.getFileName();
      -  251   -
       
      -  252  0
                       LOGGER.info(String.format("The zip file '%s' appears to be a JAR file, making a copy and analyzing it as a JAR.", fileName));
      -  253   -
       
      -  254  0
                       final File tmpLoc = new File(tdir, fileName.substring(0, fileName.length() - 3) + "jar");
      -  255   -
                       try {
      -  256  0
                           org.apache.commons.io.FileUtils.copyFile(tdir, tmpLoc);
      -  257  0
                           dependencies = new ArrayList<Dependency>(engine.getDependencies());
      -  258  0
                           engine.scan(tmpLoc);
      -  259  0
                           newDependencies = engine.getDependencies();
      -  260  0
                           if (dependencies.size() != newDependencies.size()) {
      -  261   -
                               //get the new dependencies
      -  262  0
                               final Set<Dependency> dependencySet = new HashSet<Dependency>();
      -  263  0
                               dependencySet.addAll(newDependencies);
      -  264  0
                               dependencySet.removeAll(dependencies);
      -  265  0
                               if (dependencySet.size() != 1) {
      -  266  0
                                   LOGGER.info("Deep copy of ZIP to JAR file resulted in more then one dependency?");
      -  267   -
                               }
      -  268  0
                               for (Dependency d : dependencySet) {
      -  269   -
                                   //fix the dependency's display name and path
      -  270  0
                                   d.setFilePath(dependency.getFilePath());
      -  271  0
                                   d.setDisplayFileName(dependency.getFileName());
      -  272  0
                               }
      -  273   -
                           }
      -  274  0
                       } catch (IOException ex) {
      -  275  0
                           LOGGER.debug("Unable to perform deep copy on '{}'", dependency.getActualFile().getPath(), ex);
      -  276  0
                       }
      -  277   +  194   +
           public void close() throws Exception {
      +  195  1
               if (tempFileLocation != null && tempFileLocation.exists()) {
      +  196  1
                   LOGGER.debug("Attempting to delete temporary files");
      +  197  1
                   final boolean success = FileUtils.delete(tempFileLocation);
      +  198  1
                   if (!success && tempFileLocation.exists() && tempFileLocation.list().length > 0) {
      +  199  0
                       LOGGER.warn("Failed to delete some temporary files, see the log for more details");
      +  200  
                   }
      -  278  0
                   engine.getDependencies().remove(dependency);
      +  201   +
               }
      +  202  1
           }
      +  203   +
       
      +  204   +
           /**
      +  205   +
            * Analyzes a given dependency. If the dependency is an archive, such as a WAR or EAR, the contents are extracted, scanned,
      +  206   +
            * and added to the list of dependencies within the engine.
      +  207   +
            *
      +  208   +
            * @param dependency the dependency to analyze
      +  209   +
            * @param engine the engine scanning
      +  210   +
            * @throws AnalysisException thrown if there is an analysis exception
      +  211   +
            */
      +  212   +
           @Override
      +  213   +
           public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
      +  214  2
               final File f = new File(dependency.getActualFilePath());
      +  215  2
               final File tmpDir = getNextTempDirectory();
      +  216  2
               extractFiles(f, tmpDir, engine);
      +  217   +
       
      +  218   +
               //make a copy
      +  219  2
               final Set<Dependency> dependencySet = findMoreDependencies(engine, tmpDir);
      +  220  2
               if (!dependencySet.isEmpty()) {
      +  221  0
                   for (Dependency d : dependencySet) {
      +  222   +
                       //fix the dependency's display name and path
      +  223  0
                       final String displayPath = String.format("%s%s",
      +  224   +
                               dependency.getFilePath(),
      +  225   +
                               d.getActualFilePath().substring(tmpDir.getAbsolutePath().length()));
      +  226  0
                       final String displayName = String.format("%s: %s",
      +  227   +
                               dependency.getFileName(),
      +  228   +
                               d.getFileName());
      +  229  0
                       d.setFilePath(displayPath);
      +  230  0
                       d.setFileName(displayName);
      +  231   +
       
      +  232   +
                       //TODO - can we get more evidence from the parent? EAR contains module name, etc.
      +  233   +
                       //analyze the dependency (i.e. extract files) if it is a supported type.
      +  234  0
                       if (this.accept(d.getActualFile()) && scanDepth < MAX_SCAN_DEPTH) {
      +  235  0
                           scanDepth += 1;
      +  236  0
                           analyze(d, engine);
      +  237  0
                           scanDepth -= 1;
      +  238   +
                       }
      +  239  0
                   }
      +  240   +
               }
      +  241  2
               if (REMOVE_FROM_ANALYSIS.accept(dependency.getActualFile())) {
      +  242  0
                   addDisguisedJarsToDependencies(dependency, engine);
      +  243  0
                   engine.getDependencies().remove(dependency);
      +  244   +
               }
      +  245  2
               Collections.sort(engine.getDependencies());
      +  246  2
           }
      +  247   +
       
      +  248   +
           /**
      +  249   +
            * If a zip file was identified as a possible JAR, this method will add the zip to the list of dependencies.
      +  250   +
            *
      +  251   +
            * @param dependency the zip file
      +  252   +
            * @param engine the engine
      +  253   +
            * @throws AnalysisException thrown if there is an issue
      +  254   +
            */
      +  255   +
           private void addDisguisedJarsToDependencies(Dependency dependency, Engine engine) throws AnalysisException {
      +  256  0
               if (ZIP_FILTER.accept(dependency.getActualFile()) && isZipFileActuallyJarFile(dependency)) {
      +  257  0
                   final File tdir = getNextTempDirectory();
      +  258  0
                   final String fileName = dependency.getFileName();
      +  259   +
       
      +  260  0
                   LOGGER.info("The zip file '{}' appears to be a JAR file, making a copy and analyzing it as a JAR.", fileName);
      +  261   +
       
      +  262  0
                   final File tmpLoc = new File(tdir, fileName.substring(0, fileName.length() - 3) + "jar");
      +  263   +
                   try {
      +  264  0
                       org.apache.commons.io.FileUtils.copyFile(tdir, tmpLoc);
      +  265  0
                       final Set<Dependency> dependencySet = findMoreDependencies(engine, tmpLoc);
      +  266  0
                       if (!dependencySet.isEmpty()) {
      +  267  0
                           if (dependencySet.size() != 1) {
      +  268  0
                               LOGGER.info("Deep copy of ZIP to JAR file resulted in more than one dependency?");
      +  269   +
                           }
      +  270  0
                           for (Dependency d : dependencySet) {
      +  271   +
                               //fix the dependency's display name and path
      +  272  0
                               d.setFilePath(dependency.getFilePath());
      +  273  0
                               d.setDisplayFileName(dependency.getFileName());
      +  274  0
                           }
      +  275   +
                       }
      +  276  0
                   } catch (IOException ex) {
      +  277  0
                       LOGGER.debug("Unable to perform deep copy on '{}'", dependency.getActualFile().getPath(), ex);
      +  278  0
                   }
       279  
               }
      -  280  16
               Collections.sort(engine.getDependencies());
      -  281  16
           }
      +  280  0
           }
      +  281   +
           /**
       282   -
       
      +
            * An empty dependency set.
       283   -
           /**
      -  284   -
            * Retrieves the next temporary directory to extract an archive too.
      +
            */
      +  284  1
           private static final Set<Dependency> EMPTY_DEPENDENCY_SET = Collections.emptySet();
       285   -
            *
      +
       
       286   -
            * @return a directory
      +
           /**
       287   -
            * @throws AnalysisException thrown if unable to create temporary directory
      +
            * Scan the given file/folder, and return any new dependencies found.
       288   -
            */
      +
            *
       289   -
           private File getNextTempDirectory() throws AnalysisException {
      -  290  16
               dirCount += 1;
      -  291  16
               final File directory = new File(tempFileLocation, String.valueOf(dirCount));
      +
            * @param engine used to scan
      +  290   +
            * @param file target of scanning
      +  291   +
            * @return any dependencies that weren't known to the engine before
       292   -
               //getting an exception for some directories not being able to be created; might be because the directory already exists?
      -  293  16
               if (directory.exists()) {
      -  294  0
                   return getNextTempDirectory();
      -  295   -
               }
      -  296  16
               if (!directory.mkdirs()) {
      -  297  0
                   final String msg = String.format("Unable to create temp directory '%s'.", directory.getAbsolutePath());
      -  298  0
                   throw new AnalysisException(msg);
      -  299   -
               }
      -  300  16
               return directory;
      -  301   -
           }
      -  302   -
       
      +
            */
      +  293   +
           private static Set<Dependency> findMoreDependencies(Engine engine, File file) {
      +  294  2
               final List<Dependency> before = new ArrayList<Dependency>(engine.getDependencies());
      +  295  2
               engine.scan(file);
      +  296  2
               final List<Dependency> after = engine.getDependencies();
      +  297  2
               final boolean sizeChanged = before.size() != after.size();
      +  298   +
               final Set<Dependency> newDependencies;
      +  299  2
               if (sizeChanged) {
      +  300   +
                   //get the new dependencies
      +  301  0
                   newDependencies = new HashSet<Dependency>(after);
      +  302  0
                   newDependencies.removeAll(before);
       303   -
           /**
      -  304   -
            * Extracts the contents of an archive into the specified directory.
      +
               } else {
      +  304  2
                   newDependencies = EMPTY_DEPENDENCY_SET;
       305   -
            *
      -  306   -
            * @param archive an archive file such as a WAR or EAR
      +
               }
      +  306  2
               return newDependencies;
       307   -
            * @param destination a directory to extract the contents to
      +
           }
       308   -
            * @param engine the scanning engine
      +
       
       309   -
            * @throws AnalysisException thrown if the archive is not found
      +
           /**
       310   -
            */
      +
            * Retrieves the next temporary directory to extract an archive too.
       311   -
           private void extractFiles(File archive, File destination, Engine engine) throws AnalysisException {
      -  312  16
               if (archive == null || destination == null) {
      -  313  0
                   return;
      +
            *
      +  312   +
            * @return a directory
      +  313   +
            * @throws AnalysisException thrown if unable to create temporary directory
       314   -
               }
      +
            */
       315   -
       
      -  316  16
               FileInputStream fis = null;
      -  317   -
               try {
      -  318  16
                   fis = new FileInputStream(archive);
      -  319  0
               } catch (FileNotFoundException ex) {
      -  320  0
                   LOGGER.debug("", ex);
      -  321  0
                   throw new AnalysisException("Archive file was not found.", ex);
      -  322  16
               }
      -  323  16
               final String archiveExt = FileUtils.getFileExtension(archive.getName()).toLowerCase();
      -  324   -
               try {
      -  325  16
                   if (ZIPPABLES.contains(archiveExt)) {
      -  326  16
                       extractArchive(new ZipArchiveInputStream(new BufferedInputStream(fis)), destination, engine);
      -  327  0
                   } else if ("tar".equals(archiveExt)) {
      -  328  0
                       extractArchive(new TarArchiveInputStream(new BufferedInputStream(fis)), destination, engine);
      -  329  0
                   } else if ("gz".equals(archiveExt) || "tgz".equals(archiveExt)) {
      -  330  0
                       final String uncompressedName = GzipUtils.getUncompressedFilename(archive.getName());
      -  331  0
                       final File f = new File(destination, uncompressedName);
      -  332  0
                       if (engine.accept(f)) {
      -  333  0
                           decompressFile(new GzipCompressorInputStream(new BufferedInputStream(fis)), f);
      -  334   -
                       }
      -  335   -
                   }
      -  336  0
               } catch (ArchiveExtractionException ex) {
      -  337  0
                   LOGGER.warn("Exception extracting archive '{}'.", archive.getName());
      -  338  0
                   LOGGER.debug("", ex);
      -  339  0
               } catch (IOException ex) {
      -  340  0
                   LOGGER.warn("Exception reading archive '{}'.", archive.getName());
      -  341  0
                   LOGGER.debug("", ex);
      -  342   -
               } finally {
      -  343  0
                   try {
      -  344  16
                       fis.close();
      -  345  0
                   } catch (IOException ex) {
      -  346  0
                       LOGGER.debug("", ex);
      -  347  16
                   }
      -  348  0
               }
      -  349  16
           }
      -  350   -
       
      -  351   -
           /**
      -  352   -
            * Extracts files from an archive.
      -  353   -
            *
      -  354   -
            * @param input the archive to extract files from
      -  355   -
            * @param destination the location to write the files too
      -  356   -
            * @param engine the dependency-check engine
      -  357   -
            * @throws ArchiveExtractionException thrown if there is an exception extracting files from the archive
      -  358   -
            */
      -  359   -
           private void extractArchive(ArchiveInputStream input, File destination, Engine engine) throws ArchiveExtractionException {
      -  360   -
               ArchiveEntry entry;
      -  361   -
               try {
      -  362  7096
                   while ((entry = input.getNextEntry()) != null) {
      -  363  7080
                       if (entry.isDirectory()) {
      -  364  288
                           final File d = new File(destination, entry.getName());
      -  365  288
                           if (!d.exists()) {
      -  366  288
                               if (!d.mkdirs()) {
      -  367  0
                                   final String msg = String.format("Unable to create directory '%s'.", d.getAbsolutePath());
      -  368  0
                                   throw new AnalysisException(msg);
      -  369   -
                               }
      -  370   -
                           }
      -  371  288
                       } else {
      -  372  6792
                           final File file = new File(destination, entry.getName());
      -  373  6792
                           if (engine.accept(file)) {
      -  374  0
                               LOGGER.debug("Extracting '{}'", file.getPath());
      -  375  0
                               BufferedOutputStream bos = null;
      -  376  0
                               FileOutputStream fos = null;
      -  377   -
                               try {
      -  378  0
                                   final File parent = file.getParentFile();
      -  379  0
                                   if (!parent.isDirectory()) {
      -  380  0
                                       if (!parent.mkdirs()) {
      -  381  0
                                           final String msg = String.format("Unable to build directory '%s'.", parent.getAbsolutePath());
      -  382  0
                                           throw new AnalysisException(msg);
      -  383   -
                                       }
      -  384   -
                                   }
      -  385  0
                                   fos = new FileOutputStream(file);
      -  386  0
                                   bos = new BufferedOutputStream(fos, BUFFER_SIZE);
      -  387   -
                                   int count;
      -  388  0
                                   final byte[] data = new byte[BUFFER_SIZE];
      -  389  0
                                   while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) {
      -  390  0
                                       bos.write(data, 0, count);
      -  391   -
                                   }
      -  392  0
                                   bos.flush();
      -  393  0
                               } catch (FileNotFoundException ex) {
      -  394  0
                                   LOGGER.debug("", ex);
      -  395  0
                                   final String msg = String.format("Unable to find file '%s'.", file.getName());
      -  396  0
                                   throw new AnalysisException(msg, ex);
      -  397  0
                               } catch (IOException ex) {
      -  398  0
                                   LOGGER.debug("", ex);
      -  399  0
                                   final String msg = String.format("IO Exception while parsing file '%s'.", file.getName());
      -  400  0
                                   throw new AnalysisException(msg, ex);
      -  401   -
                               } finally {
      -  402  0
                                   if (bos != null) {
      -  403   -
                                       try {
      -  404  0
                                           bos.close();
      -  405  0
                                       } catch (IOException ex) {
      -  406  0
                                           LOGGER.trace("", ex);
      -  407  0
                                       }
      -  408   -
                                   }
      -  409  0
                                   if (fos != null) {
      -  410   -
                                       try {
      -  411  0
                                           fos.close();
      -  412  0
                                       } catch (IOException ex) {
      -  413  0
                                           LOGGER.trace("", ex);
      -  414  0
                                       }
      -  415   -
                                   }
      -  416   -
                               }
      -  417   -
                           }
      -  418  6792
                       }
      -  419   -
                   }
      -  420  0
               } catch (IOException ex) {
      -  421  0
                   throw new ArchiveExtractionException(ex);
      -  422  0
               } catch (Throwable ex) {
      -  423  0
                   throw new ArchiveExtractionException(ex);
      -  424   -
               } finally {
      -  425  16
                   if (input != null) {
      -  426   -
                       try {
      -  427  16
                           input.close();
      -  428  0
                       } catch (IOException ex) {
      -  429  0
                           LOGGER.trace("", ex);
      -  430  16
                       }
      -  431   -
                   }
      -  432   +
           private File getNextTempDirectory() throws AnalysisException {
      +  316  2
               dirCount += 1;
      +  317  2
               final File directory = new File(tempFileLocation, String.valueOf(dirCount));
      +  318   +
               //getting an exception for some directories not being able to be created; might be because the directory already exists?
      +  319  2
               if (directory.exists()) {
      +  320  0
                   return getNextTempDirectory();
      +  321  
               }
      -  433  16
           }
      -  434   +  322  2
               if (!directory.mkdirs()) {
      +  323  0
                   final String msg = String.format("Unable to create temp directory '%s'.", directory.getAbsolutePath());
      +  324  0
                   throw new AnalysisException(msg);
      +  325   +
               }
      +  326  2
               return directory;
      +  327   +
           }
      +  328  
       
      -  435   +  329  
           /**
      -  436   -
            * Decompresses a file.
      -  437   +  330   +
            * Extracts the contents of an archive into the specified directory.
      +  331  
            *
      -  438   -
            * @param inputStream the compressed file
      -  439   -
            * @param outputFile the location to write the decompressed file
      -  440   -
            * @throws ArchiveExtractionException thrown if there is an exception decompressing the file
      -  441   +  332   +
            * @param archive an archive file such as a WAR or EAR
      +  333   +
            * @param destination a directory to extract the contents to
      +  334   +
            * @param engine the scanning engine
      +  335   +
            * @throws AnalysisException thrown if the archive is not found
      +  336  
            */
      -  442   -
           private void decompressFile(CompressorInputStream inputStream, File outputFile) throws ArchiveExtractionException {
      -  443  0
               LOGGER.debug("Decompressing '{}'", outputFile.getPath());
      -  444  0
               FileOutputStream out = null;
      -  445   +  337   +
           private void extractFiles(File archive, File destination, Engine engine) throws AnalysisException {
      +  338  2
               if (archive != null && destination != null) {
      +  339   +
                   FileInputStream fis;
      +  340   +
                   try {
      +  341  2
                       fis = new FileInputStream(archive);
      +  342  0
                   } catch (FileNotFoundException ex) {
      +  343  0
                       LOGGER.debug("", ex);
      +  344  0
                       throw new AnalysisException("Archive file was not found.", ex);
      +  345  2
                   }
      +  346  2
                   final String archiveExt = FileUtils.getFileExtension(archive.getName()).toLowerCase();
      +  347   +
                   try {
      +  348  2
                       if (ZIPPABLES.contains(archiveExt)) {
      +  349  2
                           extractArchive(new ZipArchiveInputStream(new BufferedInputStream(fis)), destination, engine);
      +  350  0
                       } else if ("tar".equals(archiveExt)) {
      +  351  0
                           extractArchive(new TarArchiveInputStream(new BufferedInputStream(fis)), destination, engine);
      +  352  0
                       } else if ("gz".equals(archiveExt) || "tgz".equals(archiveExt)) {
      +  353  0
                           final String uncompressedName = GzipUtils.getUncompressedFilename(archive.getName());
      +  354  0
                           final File f = new File(destination, uncompressedName);
      +  355  0
                           if (engine.accept(f)) {
      +  356  0
                               decompressFile(new GzipCompressorInputStream(new BufferedInputStream(fis)), f);
      +  357   +
                           }
      +  358  0
                       } else if ("bz2".equals(archiveExt) || "tbz2".equals(archiveExt)) {
      +  359  0
                           final String uncompressedName = BZip2Utils.getUncompressedFilename(archive.getName());
      +  360  0
                           final File f = new File(destination, uncompressedName);
      +  361  0
                           if (engine.accept(f)) {
      +  362  0
                               decompressFile(new BZip2CompressorInputStream(new BufferedInputStream(fis)), f);
      +  363   +
                           }
      +  364   +
                       }
      +  365  0
                   } catch (ArchiveExtractionException ex) {
      +  366  0
                       LOGGER.warn("Exception extracting archive '{}'.", archive.getName());
      +  367  0
                       LOGGER.debug("", ex);
      +  368  0
                   } catch (IOException ex) {
      +  369  0
                       LOGGER.warn("Exception reading archive '{}'.", archive.getName());
      +  370  0
                       LOGGER.debug("", ex);
      +  371   +
                   } finally {
      +  372  2
                       close(fis);
      +  373  2
                   }
      +  374   +
               }
      +  375  2
           }
      +  376   +
       
      +  377   +
           /**
      +  378   +
            * Extracts files from an archive.
      +  379   +
            *
      +  380   +
            * @param input the archive to extract files from
      +  381   +
            * @param destination the location to write the files too
      +  382   +
            * @param engine the dependency-check engine
      +  383   +
            * @throws ArchiveExtractionException thrown if there is an exception extracting files from the archive
      +  384   +
            */
      +  385   +
           private void extractArchive(ArchiveInputStream input, File destination, Engine engine) throws ArchiveExtractionException {
      +  386   +
               ArchiveEntry entry;
      +  387  
               try {
      -  446  0
                   out = new FileOutputStream(outputFile);
      -  447  0
                   final byte[] buffer = new byte[BUFFER_SIZE];
      -  448  0
                   int n = 0;
      -  449  0
                   while (-1 != (n = inputStream.read(buffer))) {
      -  450  0
                       out.write(buffer, 0, n);
      -  451   +  388  887
                   while ((entry = input.getNextEntry()) != null) {
      +  389  885
                       final File file = new File(destination, entry.getName());
      +  390  885
                       if (entry.isDirectory()) {
      +  391  36
                           if (!file.exists() && !file.mkdirs()) {
      +  392  0
                               final String msg = String.format("Unable to create directory '%s'.", file.getAbsolutePath());
      +  393  0
                               throw new AnalysisException(msg);
      +  394   +
                           }
      +  395  849
                       } else if (engine.accept(file)) {
      +  396  0
                           extractAcceptedFile(input, file);
      +  397   +
                       }
      +  398  885
                   }
      +  399  0
               } catch (Throwable ex) {
      +  400  0
                   throw new ArchiveExtractionException(ex);
      +  401   +
               } finally {
      +  402  2
                   close(input);
      +  403  2
               }
      +  404  2
           }
      +  405   +
       
      +  406   +
           /**
      +  407   +
            * Extracts a file from an archive.
      +  408   +
            *
      +  409   +
            * @param input the archives input stream
      +  410   +
            * @param file the file to extract
      +  411   +
            * @throws AnalysisException thrown if there is an error
      +  412   +
            */
      +  413   +
           private static void extractAcceptedFile(ArchiveInputStream input, File file) throws AnalysisException {
      +  414  0
               LOGGER.debug("Extracting '{}'", file.getPath());
      +  415  0
               FileOutputStream fos = null;
      +  416   +
               try {
      +  417  0
                   final File parent = file.getParentFile();
      +  418  0
                   if (!parent.isDirectory()) {
      +  419  0
                       if (!parent.mkdirs()) {
      +  420  0
                           final String msg = String.format("Unable to build directory '%s'.", parent.getAbsolutePath());
      +  421  0
                           throw new AnalysisException(msg);
      +  422   +
                       }
      +  423  
                   }
      +  424  0
                   fos = new FileOutputStream(file);
      +  425  0
                   IOUtils.copy(input, fos);
      +  426  0
               } catch (FileNotFoundException ex) {
      +  427  0
                   LOGGER.debug("", ex);
      +  428  0
                   final String msg = String.format("Unable to find file '%s'.", file.getName());
      +  429  0
                   throw new AnalysisException(msg, ex);
      +  430  0
               } catch (IOException ex) {
      +  431  0
                   LOGGER.debug("", ex);
      +  432  0
                   final String msg = String.format("IO Exception while parsing file '%s'.", file.getName());
      +  433  0
                   throw new AnalysisException(msg, ex);
      +  434   +
               } finally {
      +  435  0
                   close(fos);
      +  436  0
               }
      +  437  0
           }
      +  438   +
       
      +  439   +
           /**
      +  440   +
            * Decompresses a file.
      +  441   +
            *
      +  442   +
            * @param inputStream the compressed file
      +  443   +
            * @param outputFile the location to write the decompressed file
      +  444   +
            * @throws ArchiveExtractionException thrown if there is an exception decompressing the file
      +  445   +
            */
      +  446   +
           private void decompressFile(CompressorInputStream inputStream, File outputFile) throws ArchiveExtractionException {
      +  447  0
               LOGGER.debug("Decompressing '{}'", outputFile.getPath());
      +  448  0
               FileOutputStream out = null;
      +  449   +
               try {
      +  450  0
                   out = new FileOutputStream(outputFile);
      +  451  0
                   IOUtils.copy(inputStream, out);
       452  0
               } catch (FileNotFoundException ex) {
       453  0
                   LOGGER.debug("", ex);
       454  0
                   throw new ArchiveExtractionException(ex);
      @@ -746,72 +767,87 @@  457  0
                   throw new ArchiveExtractionException(ex);
       458  
               } finally {
      -  459  0
                   if (out != null) {
      -  460   -
                       try {
      -  461  0
                           out.close();
      -  462  0
                       } catch (IOException ex) {
      -  463  0
                           LOGGER.trace("", ex);
      -  464  0
                       }
      -  465   -
                   }
      -  466   -
               }
      -  467  0
           }
      -  468   +  459  0
                   close(out);
      +  460  0
               }
      +  461  0
           }
      +  462  
       
      -  469   +  463  
           /**
      -  470   -
            * Attempts to determine if a zip file is actually a JAR file.
      -  471   +  464   +
            * Close the given {@link Closeable} instance, ignoring nulls, and logging any thrown {@link IOException}.
      +  465  
            *
      -  472   -
            * @param dependency the dependency to check
      -  473   -
            * @return true if the dependency appears to be a JAR file; otherwise false
      -  474   +  466   +
            * @param closeable to be closed
      +  467  
            */
      +  468   +
           private static void close(Closeable closeable) {
      +  469  4
               if (null != closeable) {
      +  470   +
                   try {
      +  471  4
                       closeable.close();
      +  472  0
                   } catch (IOException ex) {
      +  473  0
                       LOGGER.trace("", ex);
      +  474  4
                   }
       475   -
           private boolean isZipFileActuallyJarFile(Dependency dependency) {
      -  476  0
               boolean isJar = false;
      -  477  0
               ZipFile zip = null;
      -  478   -
               try {
      -  479  0
                   zip = new ZipFile(dependency.getActualFilePath());
      -  480  0
                   if (zip.getEntry("META-INF/MANIFEST.MF") != null
      -  481   -
                           || zip.getEntry("META-INF/maven") != null) {
      -  482  0
                       final Enumeration<ZipArchiveEntry> entries = zip.getEntries();
      -  483  0
                       while (entries.hasMoreElements()) {
      -  484  0
                           final ZipArchiveEntry entry = entries.nextElement();
      -  485  0
                           if (!entry.isDirectory()) {
      -  486  0
                               final String name = entry.getName().toLowerCase();
      -  487  0
                               if (name.endsWith(".class")) {
      -  488  0
                                   isJar = true;
      -  489  0
                                   break;
      -  490   -
                               }
      -  491   -
                           }
      -  492  0
                       }
      -  493   -
                   }
      -  494  0
               } catch (IOException ex) {
      -  495  0
                   LOGGER.debug("Unable to unzip zip file '{}'", dependency.getFilePath(), ex);
      -  496   -
               } finally {
      -  497  0
                   ZipFile.closeQuietly(zip);
      -  498  0
               }
      -  499   +
               }
      +  476  4
           }
      +  477  
       
      -  500  0
               return isJar;
      -  501   -
           }
      +  478   +
           /**
      +  479   +
            * Attempts to determine if a zip file is actually a JAR file.
      +  480   +
            *
      +  481   +
            * @param dependency the dependency to check
      +  482   +
            * @return true if the dependency appears to be a JAR file; otherwise false
      +  483   +
            */
      +  484   +
           private boolean isZipFileActuallyJarFile(Dependency dependency) {
      +  485  0
               boolean isJar = false;
      +  486  0
               ZipFile zip = null;
      +  487   +
               try {
      +  488  0
                   zip = new ZipFile(dependency.getActualFilePath());
      +  489  0
                   if (zip.getEntry("META-INF/MANIFEST.MF") != null
      +  490   +
                           || zip.getEntry("META-INF/maven") != null) {
      +  491  0
                       final Enumeration<ZipArchiveEntry> entries = zip.getEntries();
      +  492  0
                       while (entries.hasMoreElements()) {
      +  493  0
                           final ZipArchiveEntry entry = entries.nextElement();
      +  494  0
                           if (!entry.isDirectory()) {
      +  495  0
                               final String name = entry.getName().toLowerCase();
      +  496  0
                               if (name.endsWith(".class")) {
      +  497  0
                                   isJar = true;
      +  498  0
                                   break;
      +  499   +
                               }
      +  500   +
                           }
      +  501  0
                       }
       502   +
                   }
      +  503  0
               } catch (IOException ex) {
      +  504  0
                   LOGGER.debug("Unable to unzip zip file '{}'", dependency.getFilePath(), ex);
      +  505   +
               } finally {
      +  506  0
                   ZipFile.closeQuietly(zip);
      +  507  0
               }
      +  508   +
       
      +  509  0
               return isJar;
      +  510   +
           }
      +  511  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AssemblyAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AssemblyAnalyzer.html index 6652ed1f5..c1537cea3 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AssemblyAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AssemblyAnalyzer.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      AssemblyAnalyzer
      67%
      86/127
      50%
      25/50
      6.875
      AssemblyAnalyzer
      67%
      85/126
      50%
      25/50
      6.875
       
      @@ -56,526 +56,513 @@  19  
       
       20   -
       import ch.qos.cal10n.IMessageConveyor;
      -  21   -
       import ch.qos.cal10n.MessageConveyor;
      -  22  
       import java.io.BufferedReader;
      -  23   +  21  
       import java.io.File;
      -  24   +  22  
       import java.io.FileFilter;
      -  25   +  23  
       import java.io.FileOutputStream;
      -  26   +  24  
       import java.io.IOException;
      -  27   +  25  
       import java.io.InputStream;
      -  28   +  26  
       import java.io.InputStreamReader;
      -  29   +  27  
       import org.owasp.dependencycheck.Engine;
      -  30   +  28  
       import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
      -  31   +  29  
       import org.owasp.dependencycheck.dependency.Confidence;
      -  32   +  30  
       import org.owasp.dependencycheck.dependency.Dependency;
      -  33   +  31  
       import org.owasp.dependencycheck.dependency.Evidence;
      -  34   +  32  
       import org.owasp.dependencycheck.utils.FileFilterBuilder;
      -  35   +  33  
       import org.owasp.dependencycheck.utils.Settings;
      -  36   +  34  
       import org.slf4j.Logger;
      -  37   +  35  
       import org.slf4j.LoggerFactory;
      -  38   +  36  
       import org.w3c.dom.Document;
      -  39   +  37  
       import org.xml.sax.SAXException;
      -  40   +  38  
       
      -  41   +  39  
       import javax.xml.parsers.DocumentBuilder;
      -  42   +  40  
       import javax.xml.parsers.DocumentBuilderFactory;
      -  43   +  41  
       import javax.xml.xpath.XPath;
      -  44   +  42  
       import javax.xml.xpath.XPathExpressionException;
      -  45   +  43  
       import javax.xml.xpath.XPathFactory;
      -  46   +  44  
       import java.util.ArrayList;
      -  47   +  45  
       import java.util.List;
      -  48   -
       import java.util.Locale;
      -  49   +  46  
       
      -  50   +  47  
       /**
      -  51   +  48  
        * Analyzer for getting company, product, and version information from a .NET assembly.
      -  52   +  49  
        *
      -  53   +  50  
        * @author colezlaw
      -  54   +  51  
        *
      -  55   +  52  
        */
      -  56  64
       public class AssemblyAnalyzer extends AbstractFileTypeAnalyzer {
      -  57   +  53  9
       public class AssemblyAnalyzer extends AbstractFileTypeAnalyzer {
      +  54  
       
      -  58   +  55  
           /**
      -  59   +  56  
            * The analyzer name
      -  60   +  57  
            */
      -  61   +  58  
           private static final String ANALYZER_NAME = "Assembly Analyzer";
      -  62   +  59  
           /**
      -  63   +  60  
            * The analysis phase
      +  61   +
            */
      +  62  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
      +  63   +
           /**
       64   -
            */
      -  65  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
      -  66   -
           /**
      -  67  
            * The list of supported extensions
      +  65   +
            */
      +  66  1
           private static final String[] SUPPORTED_EXTENSIONS = {"dll", "exe"};
      +  67   +
           /**
       68   -
            */
      -  69  8
           private static final String[] SUPPORTED_EXTENSIONS = {"dll", "exe"};
      -  70   -
           /**
      -  71  
            * The temp value for GrokAssembly.exe
      +  69   +
            */
      +  70  9
           private File grokAssemblyExe = null;
      +  71   +
           /**
       72   -
            */
      -  73  64
           private File grokAssemblyExe = null;
      -  74   -
           /**
      -  75  
            * The DocumentBuilder for parsing the XML
      -  76   +  73  
            */
      -  77   +  74  
           private DocumentBuilder builder;
      -  78   +  75  
           /**
      -  79   -
            * Message Conveyer
      -  80   -
            */
      -  81  8
           private static final IMessageConveyor MESSAGE_CONVERYOR = new MessageConveyor(Locale.getDefault());
      -  82   -
           /**
      -  83   +  76  
            * Logger
      +  77   +
            */
      +  78  1
           private static final Logger LOGGER = LoggerFactory.getLogger(AssemblyAnalyzer.class);
      +  79   +
       
      +  80   +
           /**
      +  81   +
            * Builds the beginnings of a List for ProcessBuilder
      +  82   +
            *
      +  83   +
            * @return the list of arguments to begin populating the ProcessBuilder
       84  
            */
      -  85  8
           private static final Logger LOGGER = LoggerFactory.getLogger(AssemblyAnalyzer.class);
      -  86   -
       
      -  87   -
           /**
      -  88   -
            * Builds the beginnings of a List for ProcessBuilder
      -  89   -
            *
      -  90   -
            * @return the list of arguments to begin populating the ProcessBuilder
      -  91   -
            */
      -  92   +  85  
           private List<String> buildArgumentList() {
      -  93   +  86  
               // Use file.separator as a wild guess as to whether this is Windows
      -  94  64
               final List<String> args = new ArrayList<String>();
      -  95  64
               if (!"\\".equals(System.getProperty("file.separator"))) {
      -  96  0
                   if (Settings.getString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH) != null) {
      -  97  0
                       args.add(Settings.getString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH));
      -  98   +  87  8
               final List<String> args = new ArrayList<String>();
      +  88  8
               if (!"\\".equals(System.getProperty("file.separator"))) {
      +  89  0
                   if (Settings.getString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH) != null) {
      +  90  0
                       args.add(Settings.getString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH));
      +  91  
                   } else {
      -  99  0
                       args.add("mono");
      -  100   +  92  0
                       args.add("mono");
      +  93  
                   }
      -  101   +  94  
               }
      -  102  64
               args.add(grokAssemblyExe.getPath());
      -  103   +  95  8
               args.add(grokAssemblyExe.getPath());
      +  96  
       
      -  104  64
               return args;
      -  105   +  97  8
               return args;
      +  98  
           }
      -  106   +  99  
       
      -  107   +  100  
           /**
      -  108   +  101  
            * Performs the analysis on a single Dependency.
      -  109   +  102  
            *
      -  110   +  103  
            * @param dependency the dependency to analyze
      -  111   +  104  
            * @param engine the engine to perform the analysis under
      -  112   +  105  
            * @throws AnalysisException if anything goes sideways
      -  113   +  106  
            */
      -  114   +  107  
           @Override
      -  115   +  108  
           public void analyzeFileType(Dependency dependency, Engine engine)
      -  116   +  109  
                   throws AnalysisException {
      -  117  24
               if (grokAssemblyExe == null) {
      -  118  0
                   LOGGER.warn("GrokAssembly didn't get deployed");
      -  119  0
                   return;
      +  110  3
               if (grokAssemblyExe == null) {
      +  111  0
                   LOGGER.warn("GrokAssembly didn't get deployed");
      +  112  0
                   return;
      +  113   +
               }
      +  114   +
       
      +  115  3
               final List<String> args = buildArgumentList();
      +  116  3
               args.add(dependency.getActualFilePath());
      +  117  3
               final ProcessBuilder pb = new ProcessBuilder(args);
      +  118  3
               BufferedReader rdr = null;
      +  119  3
               Document doc = null;
       120   -
               }
      -  121   -
       
      -  122  24
               final List<String> args = buildArgumentList();
      -  123  24
               args.add(dependency.getActualFilePath());
      -  124  24
               final ProcessBuilder pb = new ProcessBuilder(args);
      -  125  24
               BufferedReader rdr = null;
      -  126  24
               Document doc = null;
      -  127  
               try {
      -  128  24
                   final Process proc = pb.start();
      -  129   +  121  3
                   final Process proc = pb.start();
      +  122  
                   // Try evacuating the error stream
      -  130  24
                   rdr = new BufferedReader(new InputStreamReader(proc.getErrorStream(), "UTF-8"));
      -  131  24
                   String line = null;
      -  132   +  123  3
                   rdr = new BufferedReader(new InputStreamReader(proc.getErrorStream(), "UTF-8"));
      +  124  3
                   String line = null;
      +  125  
                   // CHECKSTYLE:OFF
      -  133  24
                   while (rdr.ready() && (line = rdr.readLine()) != null) {
      -  134  0
                       LOGGER.warn("Error from GrokAssembly: {}", line);
      -  135   +  126  3
                   while (rdr.ready() && (line = rdr.readLine()) != null) {
      +  127  0
                       LOGGER.warn("Error from GrokAssembly: {}", line);
      +  128  
                   }
      -  136   +  129  
                   // CHECKSTYLE:ON
      -  137  24
                   int rc = 0;
      -  138  24
                   doc = builder.parse(proc.getInputStream());
      -  139   +  130  3
                   int rc = 0;
      +  131  3
                   doc = builder.parse(proc.getInputStream());
      +  132  
       
      -  140   +  133  
                   try {
      -  141  24
                       rc = proc.waitFor();
      -  142  0
                   } catch (InterruptedException ie) {
      -  143   +  134  3
                       rc = proc.waitFor();
      +  135  0
                   } catch (InterruptedException ie) {
      +  136  
                       return;
      -  144  24
                   }
      -  145  24
                   if (rc == 3) {
      -  146  0
                       LOGGER.debug("{} is not a .NET assembly or executable and as such cannot be analyzed by dependency-check",
      -  147   +  137  3
                   }
      +  138  3
                   if (rc == 3) {
      +  139  0
                       LOGGER.debug("{} is not a .NET assembly or executable and as such cannot be analyzed by dependency-check",
      +  140  
                               dependency.getActualFilePath());
      -  148   +  141  
                       return;
      -  149  24
                   } else if (rc != 0) {
      -  150  8
                       LOGGER.warn("Return code {} from GrokAssembly", rc);
      -  151   +  142  3
                   } else if (rc != 0) {
      +  143  1
                       LOGGER.warn("Return code {} from GrokAssembly", rc);
      +  144  
                   }
      -  152   +  145  
       
      -  153  24
                   final XPath xpath = XPathFactory.newInstance().newXPath();
      -  154   +  146  3
                   final XPath xpath = XPathFactory.newInstance().newXPath();
      +  147  
       
      -  155   +  148  
                   // First, see if there was an error
      -  156  24
                   final String error = xpath.evaluate("/assembly/error", doc);
      -  157  24
                   if (error != null && !"".equals(error)) {
      -  158  8
                       throw new AnalysisException(error);
      -  159   +  149  3
                   final String error = xpath.evaluate("/assembly/error", doc);
      +  150  3
                   if (error != null && !error.isEmpty()) {
      +  151  1
                       throw new AnalysisException(error);
      +  152  
                   }
      -  160   +  153  
       
      -  161  16
                   final String version = xpath.evaluate("/assembly/version", doc);
      -  162  16
                   if (version != null) {
      -  163  16
                       dependency.getVersionEvidence().addEvidence(new Evidence("grokassembly", "version",
      -  164   +  154  2
                   final String version = xpath.evaluate("/assembly/version", doc);
      +  155  2
                   if (version != null) {
      +  156  2
                       dependency.getVersionEvidence().addEvidence(new Evidence("grokassembly", "version",
      +  157  
                               version, Confidence.HIGHEST));
      -  165   +  158  
                   }
      -  166   +  159  
       
      -  167  16
                   final String vendor = xpath.evaluate("/assembly/company", doc);
      -  168  16
                   if (vendor != null) {
      -  169  16
                       dependency.getVendorEvidence().addEvidence(new Evidence("grokassembly", "vendor",
      -  170   +  160  2
                   final String vendor = xpath.evaluate("/assembly/company", doc);
      +  161  2
                   if (vendor != null) {
      +  162  2
                       dependency.getVendorEvidence().addEvidence(new Evidence("grokassembly", "vendor",
      +  163  
                               vendor, Confidence.HIGH));
      -  171   +  164  
                   }
      -  172   +  165  
       
      -  173  16
                   final String product = xpath.evaluate("/assembly/product", doc);
      -  174  16
                   if (product != null) {
      -  175  16
                       dependency.getProductEvidence().addEvidence(new Evidence("grokassembly", "product",
      -  176   +  166  2
                   final String product = xpath.evaluate("/assembly/product", doc);
      +  167  2
                   if (product != null) {
      +  168  2
                       dependency.getProductEvidence().addEvidence(new Evidence("grokassembly", "product",
      +  169  
                               product, Confidence.HIGH));
      +  170   +
                   }
      +  171   +
       
      +  172  0
               } catch (IOException ioe) {
      +  173  0
                   throw new AnalysisException(ioe);
      +  174  0
               } catch (SAXException saxe) {
      +  175  0
                   throw new AnalysisException("Couldn't parse GrokAssembly result", saxe);
      +  176  0
               } catch (XPathExpressionException xpe) {
       177   -
                   }
      -  178   -
       
      -  179  0
               } catch (IOException ioe) {
      -  180  0
                   throw new AnalysisException(ioe);
      -  181  0
               } catch (SAXException saxe) {
      -  182  0
                   throw new AnalysisException("Couldn't parse GrokAssembly result", saxe);
      -  183  0
               } catch (XPathExpressionException xpe) {
      -  184  
                   // This shouldn't happen
      -  185  0
                   throw new AnalysisException(xpe);
      -  186   +  178  0
                   throw new AnalysisException(xpe);
      +  179  
               } finally {
      -  187  24
                   if (rdr != null) {
      -  188   +  180  3
                   if (rdr != null) {
      +  181  
                       try {
      -  189  24
                           rdr.close();
      -  190  0
                       } catch (IOException ex) {
      -  191  0
                           LOGGER.debug("ignore", ex);
      -  192  32
                       }
      -  193   +  182  3
                           rdr.close();
      +  183  0
                       } catch (IOException ex) {
      +  184  0
                           LOGGER.debug("ignore", ex);
      +  185  4
                       }
      +  186  
                   }
      -  194   +  187  
               }
      -  195  16
           }
      -  196   +  188  2
           }
      +  189  
       
      -  197   +  190  
           /**
      -  198   +  191  
            * Initialize the analyzer. In this case, extract GrokAssembly.exe to a temporary location.
      -  199   +  192  
            *
      -  200   +  193  
            * @throws Exception if anything goes wrong
      -  201   +  194  
            */
      -  202   +  195  
           @Override
      -  203   +  196  
           public void initializeFileTypeAnalyzer() throws Exception {
      -  204  40
               final File tempFile = File.createTempFile("GKA", ".exe", Settings.getTempDirectory());
      -  205  40
               FileOutputStream fos = null;
      -  206  40
               InputStream is = null;
      -  207   +  197  5
               final File tempFile = File.createTempFile("GKA", ".exe", Settings.getTempDirectory());
      +  198  5
               FileOutputStream fos = null;
      +  199  5
               InputStream is = null;
      +  200  
               try {
      -  208  40
                   fos = new FileOutputStream(tempFile);
      -  209  40
                   is = AssemblyAnalyzer.class.getClassLoader().getResourceAsStream("GrokAssembly.exe");
      -  210  40
                   final byte[] buff = new byte[4096];
      -  211  40
                   int bread = -1;
      -  212  120
                   while ((bread = is.read(buff)) >= 0) {
      -  213  80
                       fos.write(buff, 0, bread);
      -  214   +  201  5
                   fos = new FileOutputStream(tempFile);
      +  202  5
                   is = AssemblyAnalyzer.class.getClassLoader().getResourceAsStream("GrokAssembly.exe");
      +  203  5
                   final byte[] buff = new byte[4096];
      +  204  5
                   int bread = -1;
      +  205  15
                   while ((bread = is.read(buff)) >= 0) {
      +  206  10
                       fos.write(buff, 0, bread);
      +  207  
                   }
      -  215  40
                   grokAssemblyExe = tempFile;
      -  216   +  208  5
                   grokAssemblyExe = tempFile;
      +  209  
                   // Set the temp file to get deleted when we're done
      -  217  40
                   grokAssemblyExe.deleteOnExit();
      -  218  40
                   LOGGER.debug("Extracted GrokAssembly.exe to {}", grokAssemblyExe.getPath());
      -  219  0
               } catch (IOException ioe) {
      -  220  0
                   this.setEnabled(false);
      -  221  0
                   LOGGER.warn("Could not extract GrokAssembly.exe: {}", ioe.getMessage());
      -  222  0
                   throw new AnalysisException("Could not extract GrokAssembly.exe", ioe);
      -  223   +  210  5
                   grokAssemblyExe.deleteOnExit();
      +  211  5
                   LOGGER.debug("Extracted GrokAssembly.exe to {}", grokAssemblyExe.getPath());
      +  212  0
               } catch (IOException ioe) {
      +  213  0
                   this.setEnabled(false);
      +  214  0
                   LOGGER.warn("Could not extract GrokAssembly.exe: {}", ioe.getMessage());
      +  215  0
                   throw new AnalysisException("Could not extract GrokAssembly.exe", ioe);
      +  216  
               } finally {
      -  224  40
                   if (fos != null) {
      +  217  5
                   if (fos != null) {
      +  218   +
                       try {
      +  219  5
                           fos.close();
      +  220  0
                       } catch (Throwable e) {
      +  221  0
                           LOGGER.debug("Error closing output stream");
      +  222  5
                       }
      +  223   +
                   }
      +  224  5
                   if (is != null) {
       225  
                       try {
      -  226  40
                           fos.close();
      +  226  5
                           is.close();
       227  0
                       } catch (Throwable e) {
      -  228  0
                           LOGGER.debug("Error closing output stream");
      -  229  40
                       }
      +  228  0
                           LOGGER.debug("Error closing input stream");
      +  229  5
                       }
       230  
                   }
      -  231  40
                   if (is != null) {
      +  231   +
               }
       232   -
                       try {
      -  233  40
                           is.close();
      -  234  0
                       } catch (Throwable e) {
      -  235  0
                           LOGGER.debug("Error closing input stream");
      -  236  40
                       }
      -  237   -
                   }
      -  238   -
               }
      -  239  
       
      -  240   +  233  
               // Now, need to see if GrokAssembly actually runs from this location.
      -  241  40
               final List<String> args = buildArgumentList();
      -  242  40
               BufferedReader rdr = null;
      -  243   +  234  5
               final List<String> args = buildArgumentList();
      +  235  5
               BufferedReader rdr = null;
      +  236  
               try {
      -  244  40
                   final ProcessBuilder pb = new ProcessBuilder(args);
      -  245  40
                   final Process p = pb.start();
      -  246   +  237  5
                   final ProcessBuilder pb = new ProcessBuilder(args);
      +  238  5
                   final Process p = pb.start();
      +  239  
                   // Try evacuating the error stream
      -  247  40
                   rdr = new BufferedReader(new InputStreamReader(p.getErrorStream(), "UTF-8"));
      -  248   +  240  5
                   rdr = new BufferedReader(new InputStreamReader(p.getErrorStream(), "UTF-8"));
      +  241  
                   // CHECKSTYLE:OFF
      -  249  40
                   while (rdr.ready() && rdr.readLine() != null) {
      -  250   +  242  5
                   while (rdr.ready() && rdr.readLine() != null) {
      +  243  
                       // We expect this to complain
      -  251   +  244  
                   }
      -  252   +  245  
                   // CHECKSTYLE:ON
      -  253  40
                   final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(p.getInputStream());
      -  254  40
                   final XPath xpath = XPathFactory.newInstance().newXPath();
      -  255  40
                   final String error = xpath.evaluate("/assembly/error", doc);
      -  256  40
                   if (p.waitFor() != 1 || error == null || "".equals(error)) {
      -  257  0
                       LOGGER.warn("An error occurred with the .NET AssemblyAnalyzer, please see the log for more details.");
      -  258  0
                       LOGGER.debug("GrokAssembly.exe is not working properly");
      -  259  0
                       grokAssemblyExe = null;
      -  260  0
                       this.setEnabled(false);
      -  261  0
                       throw new AnalysisException("Could not execute .NET AssemblyAnalyzer");
      -  262   +  246  5
                   final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(p.getInputStream());
      +  247  5
                   final XPath xpath = XPathFactory.newInstance().newXPath();
      +  248  5
                   final String error = xpath.evaluate("/assembly/error", doc);
      +  249  5
                   if (p.waitFor() != 1 || error == null || error.isEmpty()) {
      +  250  0
                       LOGGER.warn("An error occurred with the .NET AssemblyAnalyzer, please see the log for more details.");
      +  251  0
                       LOGGER.debug("GrokAssembly.exe is not working properly");
      +  252  0
                       grokAssemblyExe = null;
      +  253  0
                       this.setEnabled(false);
      +  254  0
                       throw new AnalysisException("Could not execute .NET AssemblyAnalyzer");
      +  255  
                   }
      -  263  0
               } catch (Throwable e) {
      -  264  0
                   if (e instanceof AnalysisException) {
      -  265  0
                       throw (AnalysisException) e;
      -  266   +  256  0
               } catch (Throwable e) {
      +  257  0
                   if (e instanceof AnalysisException) {
      +  258  0
                       throw (AnalysisException) e;
      +  259  
                   } else {
      -  267  0
                       LOGGER.warn("An error occurred with the .NET AssemblyAnalyzer;\n"
      -  268   +  260  0
                       LOGGER.warn("An error occurred with the .NET AssemblyAnalyzer;\n"
      +  261  
                               + "this can be ignored unless you are scanning .NET DLLs. Please see the log for more details.");
      -  269  0
                       LOGGER.debug("Could not execute GrokAssembly {}", e.getMessage());
      -  270  0
                       this.setEnabled(false);
      -  271  0
                       throw new AnalysisException("An error occured with the .NET AssemblyAnalyzer", e);
      -  272   +  262  0
                       LOGGER.debug("Could not execute GrokAssembly {}", e.getMessage());
      +  263  0
                       this.setEnabled(false);
      +  264  0
                       throw new AnalysisException("An error occured with the .NET AssemblyAnalyzer", e);
      +  265  
                   }
      -  273   +  266  
               } finally {
      -  274  40
                   if (rdr != null) {
      -  275   +  267  5
                   if (rdr != null) {
      +  268  
                       try {
      -  276  40
                           rdr.close();
      -  277  0
                       } catch (IOException ex) {
      -  278  0
                           LOGGER.trace("ignore", ex);
      -  279  40
                       }
      -  280   +  269  5
                           rdr.close();
      +  270  0
                       } catch (IOException ex) {
      +  271  0
                           LOGGER.trace("ignore", ex);
      +  272  5
                       }
      +  273  
                   }
      -  281   +  274  
               }
      -  282  40
               builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
      -  283  40
           }
      -  284   +  275  5
               builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
      +  276  5
           }
      +  277  
       
      -  285   +  278  
           /**
      -  286   +  279  
            * Removes resources used from the local file system.
      -  287   +  280  
            *
      -  288   +  281  
            * @throws Exception thrown if there is a problem closing the analyzer
      -  289   +  282  
            */
      -  290   +  283  
           @Override
      -  291   +  284  
           public void close() throws Exception {
      -  292  48
               super.close();
      -  293   +  285  6
               super.close();
      +  286  
               try {
      -  294  48
                   if (grokAssemblyExe != null && !grokAssemblyExe.delete()) {
      -  295  0
                       grokAssemblyExe.deleteOnExit();
      -  296   +  287  6
                   if (grokAssemblyExe != null && !grokAssemblyExe.delete()) {
      +  288  0
                       grokAssemblyExe.deleteOnExit();
      +  289  
                   }
      -  297  0
               } catch (SecurityException se) {
      -  298  0
                   LOGGER.debug("Can't delete temporary GrokAssembly.exe");
      -  299  48
               }
      -  300  48
           }
      -  301   +  290  0
               } catch (SecurityException se) {
      +  291  0
                   LOGGER.debug("Can't delete temporary GrokAssembly.exe");
      +  292  6
               }
      +  293  6
           }
      +  294  
       
      -  302   +  295  
           /**
      -  303   +  296  
            * The File Filter used to filter supported extensions.
      -  304   +  297  
            */
      -  305  8
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(
      -  306   +  298  1
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(
      +  299  
                   SUPPORTED_EXTENSIONS).build();
      -  307   +  300  
       
      -  308   +  301  
           @Override
      -  309   +  302  
           protected FileFilter getFileFilter() {
      -  310  6864
               return FILTER;
      -  311   +  303  858
               return FILTER;
      +  304  
           }
      -  312   +  305  
       
      -  313   +  306  
           /**
      -  314   +  307  
            * Gets this analyzer's name.
      -  315   +  308  
            *
      -  316   +  309  
            * @return the analyzer name
      -  317   +  310  
            */
      -  318   +  311  
           @Override
      -  319   +  312  
           public String getName() {
      -  320  40
               return ANALYZER_NAME;
      -  321   +  313  5
               return ANALYZER_NAME;
      +  314  
           }
      -  322   +  315  
       
      -  323   +  316  
           /**
      -  324   +  317  
            * Returns the phase this analyzer runs under.
      -  325   +  318  
            *
      -  326   +  319  
            * @return the phase this runs under
      -  327   +  320  
            */
      -  328   +  321  
           @Override
      -  329   +  322  
           public AnalysisPhase getAnalysisPhase() {
      -  330  16
               return ANALYSIS_PHASE;
      -  331   +  323  3
               return ANALYSIS_PHASE;
      +  324  
           }
      -  332   +  325  
       
      -  333   +  326  
           /**
      -  334   +  327  
            * Returns the key used in the properties file to reference the analyzer's enabled property.
      -  335   +  328  
            *
      -  336   +  329  
            * @return the analyzer's enabled property setting key
      -  337   +  330  
            */
      -  338   +  331  
           @Override
      -  339   +  332  
           protected String getAnalyzerEnabledSettingKey() {
      -  340  64
               return Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED;
      -  341   +  333  9
               return Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED;
      +  334  
           }
      -  342   +  335  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AutoconfAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AutoconfAnalyzer.html index c7c7e0d00..91efeb77e 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AutoconfAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.AutoconfAnalyzer.html @@ -105,7 +105,7 @@
        * @see <a href="https://www.gnu.org/software/autoconf/">Autoconf - GNU Project - Free Software Foundation (FSF)</a>
       44  
        */
      -  45  72
       public class AutoconfAnalyzer extends AbstractFileTypeAnalyzer {
      +  45  10
       public class AutoconfAnalyzer extends AbstractFileTypeAnalyzer {
       46  
       
       47   @@ -154,7 +154,7 @@
            * The phase that this analyzer is intended to run in.
       69  
            */
      -  70  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
      +  70  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
       71  
       
       72   @@ -163,7 +163,7 @@
            * The set of file extensions supported by this analyzer.
       74  
            */
      -  75  8
           private static final String[] EXTENSIONS = {"ac", "in"};
      +  75  1
           private static final String[] EXTENSIONS = {"ac", "in"};
       76  
       
       77   @@ -172,7 +172,7 @@
            * Matches AC_INIT variables in the output configure script.
       79  
            */
      -  80  8
           private static final Pattern PACKAGE_VAR = Pattern.compile(
      +  80  1
           private static final Pattern PACKAGE_VAR = Pattern.compile(
       81  
                   "PACKAGE_(.+?)='(.*?)'", Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
       82   @@ -191,8 +191,8 @@
           static {
       89  
               // each instance of param or sep_param has a capture group
      -  90  8
               final String param = "\\[{0,2}(.+?)\\]{0,2}";
      -  91  8
               final String sepParam = "\\s*,\\s*" + param;
      +  90  1
               final String param = "\\[{0,2}(.+?)\\]{0,2}";
      +  91  1
               final String sepParam = "\\s*,\\s*" + param;
       92  
               // Group 1: Package
       93   @@ -209,7 +209,7 @@
               // Group 7: optional
       99  
               // Group 8: URL (if it exists)
      -  100  8
               AC_INIT_PATTERN = Pattern.compile(String.format(
      +  100  1
               AC_INIT_PATTERN = Pattern.compile(String.format(
       101  
                       "AC_INIT\\(%s%s(%s)?(%s)?(%s)?\\s*\\)", param, sepParam,
       102   @@ -226,7 +226,7 @@
            * The file filter used to determine which files this analyzer supports.
       108  
            */
      -  109  8
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addFilenames(CONFIGURE).addExtensions(
      +  109  1
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addFilenames(CONFIGURE).addExtensions(
       110  
                   EXTENSIONS).build();
       111   @@ -245,7 +245,7 @@
           @Override
       118  
           protected FileFilter getFileFilter() {
      -  119  6848
               return FILTER;
      +  119  856
               return FILTER;
       120  
           }
       121   @@ -264,7 +264,7 @@
           @Override
       128  
           public String getName() {
      -  129  40
               return ANALYZER_NAME;
      +  129  5
               return ANALYZER_NAME;
       130  
           }
       131   @@ -283,7 +283,7 @@
           @Override
       138  
           public AnalysisPhase getAnalysisPhase() {
      -  139  16
               return ANALYSIS_PHASE;
      +  139  3
               return ANALYSIS_PHASE;
       140  
           }
       141   @@ -302,7 +302,7 @@
           @Override
       148  
           protected String getAnalyzerEnabledSettingKey() {
      -  149  72
               return Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED;
      +  149  10
               return Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED;
       150  
           }
       151   @@ -313,42 +313,42 @@
           protected void analyzeFileType(Dependency dependency, Engine engine)
       154  
                   throws AnalysisException {
      -  155  32
               final File actualFile = dependency.getActualFile();
      -  156  32
               final String name = actualFile.getName();
      -  157  32
               if (name.startsWith(CONFIGURE)) {
      -  158  32
                   final File parent = actualFile.getParentFile();
      -  159  32
                   final String parentName = parent.getName();
      -  160  32
                   dependency.setDisplayFileName(parentName + "/" + name);
      -  161  32
                   final boolean isOutputScript = CONFIGURE.equals(name);
      -  162  32
                   if (isOutputScript || CONFIGURE_AC.equals(name)
      +  155  4
               final File actualFile = dependency.getActualFile();
      +  156  4
               final String name = actualFile.getName();
      +  157  4
               if (name.startsWith(CONFIGURE)) {
      +  158  4
                   final File parent = actualFile.getParentFile();
      +  159  4
                   final String parentName = parent.getName();
      +  160  4
                   dependency.setDisplayFileName(parentName + "/" + name);
      +  161  4
                   final boolean isOutputScript = CONFIGURE.equals(name);
      +  162  4
                   if (isOutputScript || CONFIGURE_AC.equals(name)
       163  
                           || CONFIGURE_IN.equals(name)) {
      -  164  32
                       final String contents = getFileContents(actualFile);
      -  165  32
                       if (!contents.isEmpty()) {
      -  166  32
                           if (isOutputScript) {
      -  167  16
                               extractConfigureScriptEvidence(dependency, name,
      +  164  4
                       final String contents = getFileContents(actualFile);
      +  165  4
                       if (!contents.isEmpty()) {
      +  166  4
                           if (isOutputScript) {
      +  167  2
                               extractConfigureScriptEvidence(dependency, name,
       168  
                                       contents);
       169  
                           } else {
      -  170  16
                               gatherEvidence(dependency, name, contents);
      +  170  2
                               gatherEvidence(dependency, name, contents);
       171  
                           }
       172  
                       }
       173  
                   }
      -  174  32
               } else {
      +  174  4
               } else {
       175  
                   // copy, alter and set in case some other thread is iterating over
      -  176  0
                   final List<Dependency> deps = new ArrayList<Dependency>(
      +  176  0
                   final List<Dependency> dependencies = new ArrayList<Dependency>(
       177  
                           engine.getDependencies());
      -  178  0
                   deps.remove(dependency);
      -  179  0
                   engine.setDependencies(deps);
      +  178  0
                   dependencies.remove(dependency);
      +  179  0
                   engine.setDependencies(dependencies);
       180  
               }
      -  181  32
           }
      +  181  4
           }
       182  
       
       183   @@ -369,33 +369,33 @@
           private void extractConfigureScriptEvidence(Dependency dependency,
       191  
                   final String name, final String contents) {
      -  192  16
               final Matcher matcher = PACKAGE_VAR.matcher(contents);
      -  193  160
               while (matcher.find()) {
      -  194  144
                   final String variable = matcher.group(1);
      -  195  144
                   final String value = matcher.group(2);
      -  196  144
                   if (!value.isEmpty()) {
      -  197  112
                       if (variable.endsWith("NAME")) {
      -  198  32
                           dependency.getProductEvidence().addEvidence(name, variable,
      +  192  2
               final Matcher matcher = PACKAGE_VAR.matcher(contents);
      +  193  20
               while (matcher.find()) {
      +  194  18
                   final String variable = matcher.group(1);
      +  195  18
                   final String value = matcher.group(2);
      +  196  18
                   if (!value.isEmpty()) {
      +  197  14
                       if (variable.endsWith("NAME")) {
      +  198  4
                           dependency.getProductEvidence().addEvidence(name, variable,
       199  
                                   value, Confidence.HIGHEST);
      -  200  80
                       } else if ("VERSION".equals(variable)) {
      -  201  16
                           dependency.getVersionEvidence().addEvidence(name, variable,
      +  200  10
                       } else if ("VERSION".equals(variable)) {
      +  201  2
                           dependency.getVersionEvidence().addEvidence(name, variable,
       202  
                                   value, Confidence.HIGHEST);
      -  203  64
                       } else if ("BUGREPORT".equals(variable)) {
      -  204  8
                           dependency.getVendorEvidence().addEvidence(name, variable,
      +  203  8
                       } else if ("BUGREPORT".equals(variable)) {
      +  204  1
                           dependency.getVendorEvidence().addEvidence(name, variable,
       205  
                                   value, Confidence.HIGH);
      -  206  56
                       } else if ("URL".equals(variable)) {
      -  207  8
                           dependency.getVendorEvidence().addEvidence(name, variable,
      +  206  7
                       } else if ("URL".equals(variable)) {
      +  207  1
                           dependency.getVendorEvidence().addEvidence(name, variable,
       208  
                                   value, Confidence.HIGH);
       209  
                       }
       210  
                   }
      -  211  144
               }
      -  212  16
           }
      +  211  18
               }
      +  212  2
           }
       213  
       
       214   @@ -416,16 +416,16 @@
           private String getFileContents(final File actualFile)
       222  
                   throws AnalysisException {
      -  223  32
               String contents = "";
      +  223  4
               String contents = "";
       224  
               try {
      -  225  32
                   contents = FileUtils.readFileToString(actualFile).trim();
      +  225  4
                   contents = FileUtils.readFileToString(actualFile).trim();
       226  0
               } catch (IOException e) {
       227  0
                   throw new AnalysisException(
       228   -
                           "Problem occured while reading dependency file.", e);
      -  229  32
               }
      -  230  32
               return contents;
      +
                           "Problem occurred while reading dependency file.", e);
      +  229  4
               }
      +  230  4
               return contents;
       231  
           }
       232   @@ -448,36 +448,36 @@
           private void gatherEvidence(Dependency dependency, final String name,
       241  
                   String contents) {
      -  242  16
               final Matcher matcher = AC_INIT_PATTERN.matcher(contents);
      -  243  16
               if (matcher.find()) {
      -  244  16
                   final EvidenceCollection productEvidence = dependency
      +  242  2
               final Matcher matcher = AC_INIT_PATTERN.matcher(contents);
      +  243  2
               if (matcher.find()) {
      +  244  2
                   final EvidenceCollection productEvidence = dependency
       245  
                           .getProductEvidence();
      -  246  16
                   productEvidence.addEvidence(name, "Package", matcher.group(1),
      +  246  2
                   productEvidence.addEvidence(name, "Package", matcher.group(1),
       247  
                           Confidence.HIGHEST);
      -  248  16
                   dependency.getVersionEvidence().addEvidence(name,
      +  248  2
                   dependency.getVersionEvidence().addEvidence(name,
       249  
                           "Package Version", matcher.group(2), Confidence.HIGHEST);
      -  250  16
                   final EvidenceCollection vendorEvidence = dependency
      +  250  2
                   final EvidenceCollection vendorEvidence = dependency
       251  
                           .getVendorEvidence();
      -  252  16
                   if (null != matcher.group(3)) {
      -  253  16
                       vendorEvidence.addEvidence(name, "Bug report address",
      +  252  2
                   if (null != matcher.group(3)) {
      +  253  2
                       vendorEvidence.addEvidence(name, "Bug report address",
       254  
                               matcher.group(4), Confidence.HIGH);
       255  
                   }
      -  256  16
                   if (null != matcher.group(5)) {
      -  257  8
                       productEvidence.addEvidence(name, "Tarname", matcher.group(6),
      +  256  2
                   if (null != matcher.group(5)) {
      +  257  1
                       productEvidence.addEvidence(name, "Tarname", matcher.group(6),
       258  
                               Confidence.HIGH);
       259  
                   }
      -  260  16
                   if (null != matcher.group(7)) {
      -  261  8
                       final String url = matcher.group(8);
      -  262  8
                       if (UrlStringUtils.isUrl(url)) {
      -  263  8
                           vendorEvidence.addEvidence(name, "URL", url,
      +  260  2
                   if (null != matcher.group(7)) {
      +  261  1
                       final String url = matcher.group(8);
      +  262  1
                       if (UrlStringUtils.isUrl(url)) {
      +  263  1
                           vendorEvidence.addEvidence(name, "URL", url,
       264  
                                   Confidence.HIGH);
       265   @@ -486,7 +486,7 @@
                   }
       267  
               }
      -  268  16
           }
      +  268  2
           }
       269  
       
       270   @@ -505,11 +505,11 @@
           protected void initializeFileTypeAnalyzer() throws Exception {
       277  
               // No initialization needed.
      -  278  48
           }
      +  278  6
           }
       279  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CMakeAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CMakeAnalyzer.html index 4d5cf9311..c92364949 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CMakeAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CMakeAnalyzer.html @@ -58,7 +58,7 @@  20  
       import org.apache.commons.io.FileUtils;
       21   -
       import org.apache.commons.lang.StringUtils;
      +
       import org.apache.commons.lang3.StringUtils;
       22  
       import org.owasp.dependencycheck.Engine;
       23   @@ -119,7 +119,7 @@
        * @author Dale Visser <dvisser@ida.org>
       51  
        */
      -  52  64
       public class CMakeAnalyzer extends AbstractFileTypeAnalyzer {
      +  52  9
       public class CMakeAnalyzer extends AbstractFileTypeAnalyzer {
       53  
       
       54   @@ -128,7 +128,7 @@
            * The logger.
       56  
            */
      -  57  8
           private static final Logger LOGGER = LoggerFactory.getLogger(CMakeAnalyzer.class);
      +  57  1
           private static final Logger LOGGER = LoggerFactory.getLogger(CMakeAnalyzer.class);
       58  
       
       59   @@ -143,7 +143,7 @@
                   | Pattern.CASE_INSENSITIVE | Pattern.MULTILINE;
       64  
       
      -  65  8
           private static final Pattern PROJECT = Pattern.compile(
      +  65  1
           private static final Pattern PROJECT = Pattern.compile(
       66  
                   "^ *project *\\([ \\n]*(\\w+)[ \\n]*.*?\\)", REGEX_OPTIONS);
       67   @@ -152,7 +152,7 @@
           // Group 1: Product
       69  
           // Group 2: Version
      -  70  8
           private static final Pattern SET_VERSION = Pattern
      +  70  1
           private static final Pattern SET_VERSION = Pattern
       71  
                   .compile(
       72   @@ -167,7 +167,7 @@
            * Detects files that can be analyzed.
       77  
            */
      -  78  8
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(".cmake")
      +  78  1
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(".cmake")
       79  
                   .addFilenames("CMakeLists.txt").build();
       80   @@ -178,18 +178,18 @@
            * A reference to SHA1 message digest.
       83  
            */
      -  84  8
           private static MessageDigest sha1 = null;
      +  84  1
           private static MessageDigest sha1 = null;
       85  
       
       86  
           static {
       87  
               try {
      -  88  8
                   sha1 = MessageDigest.getInstance("SHA1");
      +  88  1
                   sha1 = MessageDigest.getInstance("SHA1");
       89  0
               } catch (NoSuchAlgorithmException e) {
       90  0
                   LOGGER.error(e.getMessage());
      -  91  8
               }
      -  92  8
           }
      +  91  1
               }
      +  92  1
           }
       93  
       
       94   @@ -208,7 +208,7 @@
           @Override
       101  
           public String getName() {
      -  102  40
               return "CMake Analyzer";
      +  102  5
               return "CMake Analyzer";
       103  
           }
       104   @@ -227,7 +227,7 @@
           @Override
       111  
           public AnalysisPhase getAnalysisPhase() {
      -  112  16
               return AnalysisPhase.INFORMATION_COLLECTION;
      +  112  3
               return AnalysisPhase.INFORMATION_COLLECTION;
       113  
           }
       114   @@ -246,7 +246,7 @@
           @Override
       121  
           protected FileFilter getFileFilter() {
      -  122  6840
               return FILTER;
      +  122  855
               return FILTER;
       123  
           }
       124   @@ -267,7 +267,7 @@
           protected void initializeFileTypeAnalyzer() throws Exception {
       132  
               // Nothing to do here.
      -  133  40
           }
      +  133  5
           }
       134  
       
       135   @@ -290,104 +290,102 @@
           protected void analyzeFileType(Dependency dependency, Engine engine)
       144  
                   throws AnalysisException {
      -  145  24
               final File file = dependency.getActualFile();
      -  146  24
               final String parentName = file.getParentFile().getName();
      -  147  24
               final String name = file.getName();
      -  148  24
               dependency.setDisplayFileName(String.format("%s%c%s", parentName, File.separatorChar, name));
      +  145  3
               final File file = dependency.getActualFile();
      +  146  3
               final String parentName = file.getParentFile().getName();
      +  147  3
               final String name = file.getName();
      +  148  3
               dependency.setDisplayFileName(String.format("%s%c%s", parentName, File.separatorChar, name));
       149  
               String contents;
       150  
               try {
      -  151  24
                   contents = FileUtils.readFileToString(file).trim();
      +  151  3
                   contents = FileUtils.readFileToString(file).trim();
       152  0
               } catch (IOException e) {
       153  0
                   throw new AnalysisException(
       154  
                           "Problem occurred while reading dependency file.", e);
      -  155  24
               }
      +  155  3
               }
       156  
       
      -  157  24
               if (StringUtils.isNotBlank(contents)) {
      -  158  24
                   final Matcher m = PROJECT.matcher(contents);
      -  159  24
                   int count = 0;
      -  160  40
                   while (m.find()) {
      -  161  16
                       count++;
      -  162  16
                       LOGGER.debug(String.format(
      +  157  3
               if (StringUtils.isNotBlank(contents)) {
      +  158  3
                   final Matcher m = PROJECT.matcher(contents);
      +  159  3
                   int count = 0;
      +  160  5
                   while (m.find()) {
      +  161  2
                       count++;
      +  162  2
                       LOGGER.debug(String.format(
       163  
                               "Found project command match with %d groups: %s",
       164  
                               m.groupCount(), m.group(0)));
      -  165  16
                       final String group = m.group(1);
      -  166  16
                       LOGGER.debug("Group 1: " + group);
      -  167  16
                       dependency.getProductEvidence().addEvidence(name, "Project",
      +  165  2
                       final String group = m.group(1);
      +  166  2
                       LOGGER.debug("Group 1: " + group);
      +  167  2
                       dependency.getProductEvidence().addEvidence(name, "Project",
       168  
                               group, Confidence.HIGH);
      -  169  16
                   }
      -  170  24
                   LOGGER.debug(String.format("Found %d matches.", count));
      -  171  24
                   analyzeSetVersionCommand(dependency, engine, contents);
      +  169  2
                   }
      +  170  3
                   LOGGER.debug("Found {} matches.", count);
      +  171  3
                   analyzeSetVersionCommand(dependency, engine, contents);
       172  
               }
      -  173  24
           }
      +  173  3
           }
       174  
       
       175  
           private void analyzeSetVersionCommand(Dependency dependency, Engine engine, String contents) {
      -  176  24
               final Dependency orig = dependency;
      -  177  24
               final Matcher m = SET_VERSION.matcher(contents);
      -  178  24
               int count = 0;
      -  179  64
               while (m.find()) {
      -  180  40
                   count++;
      -  181  40
                   LOGGER.debug(String.format(
      +  176  3
               final Dependency orig = dependency;
      +  177  3
               final Matcher m = SET_VERSION.matcher(contents);
      +  178  3
               int count = 0;
      +  179  8
               while (m.find()) {
      +  180  5
                   count++;
      +  181  5
                   LOGGER.debug("Found project command match with {} groups: {}",
       182   -
                           "Found project command match with %d groups: %s",
      -  183   -
                           m.groupCount(), m.group(0)));
      -  184  40
                   String product = m.group(1);
      -  185  40
                   final String version = m.group(2);
      -  186  40
                   LOGGER.debug("Group 1: " + product);
      -  187  40
                   LOGGER.debug("Group 2: " + version);
      -  188  40
                   final String aliasPrefix = "ALIASOF_";
      -  189  40
                   if (product.startsWith(aliasPrefix)) {
      -  190  40
                       product = product.replaceFirst(aliasPrefix, "");
      -  191   +
                           m.groupCount(), m.group(0));
      +  183  5
                   String product = m.group(1);
      +  184  5
                   final String version = m.group(2);
      +  185  5
                   LOGGER.debug("Group 1: " + product);
      +  186  5
                   LOGGER.debug("Group 2: " + version);
      +  187  5
                   final String aliasPrefix = "ALIASOF_";
      +  188  5
                   if (product.startsWith(aliasPrefix)) {
      +  189  5
                       product = product.replaceFirst(aliasPrefix, "");
      +  190  
                   }
      -  192  40
                   if (count > 1) {
      -  193   +  191  5
                   if (count > 1) {
      +  192  
                       //TODO - refactor so we do not assign to the parameter (checkstyle)
      -  194  32
                       dependency = new Dependency(orig.getActualFile());
      -  195  32
                       dependency.setDisplayFileName(String.format("%s:%s", orig.getDisplayFileName(), product));
      -  196  32
                       final String filePath = String.format("%s:%s", orig.getFilePath(), product);
      -  197  32
                       dependency.setFilePath(filePath);
      +  193  4
                       dependency = new Dependency(orig.getActualFile());
      +  194  4
                       dependency.setDisplayFileName(String.format("%s:%s", orig.getDisplayFileName(), product));
      +  195  4
                       final String filePath = String.format("%s:%s", orig.getFilePath(), product);
      +  196  4
                       dependency.setFilePath(filePath);
      +  197   +
       
       198   -
       
      -  199  
                       // prevents coalescing into the dependency provided by engine
      -  200  32
                       dependency.setSha1sum(Checksum.getHex(sha1.digest(filePath.getBytes())));
      -  201  32
                       engine.getDependencies().add(dependency);
      -  202   +  199  4
                       dependency.setSha1sum(Checksum.getHex(sha1.digest(filePath.getBytes())));
      +  200  4
                       engine.getDependencies().add(dependency);
      +  201  
                   }
      -  203  40
                   final String source = dependency.getDisplayFileName();
      -  204  40
                   dependency.getProductEvidence().addEvidence(source, "Product",
      -  205   +  202  5
                   final String source = dependency.getDisplayFileName();
      +  203  5
                   dependency.getProductEvidence().addEvidence(source, "Product",
      +  204  
                           product, Confidence.MEDIUM);
      -  206  40
                   dependency.getVersionEvidence().addEvidence(source, "Version",
      -  207   +  205  5
                   dependency.getVersionEvidence().addEvidence(source, "Version",
      +  206  
                           version, Confidence.MEDIUM);
      -  208  40
               }
      -  209  24
               LOGGER.debug(String.format("Found %d matches.", count));
      -  210  24
           }
      -  211   +  207  5
               }
      +  208  3
               LOGGER.debug(String.format("Found %d matches.", count));
      +  209  3
           }
      +  210  
       
      -  212   +  211  
           @Override
      -  213   +  212  
           protected String getAnalyzerEnabledSettingKey() {
      -  214  64
               return Settings.KEYS.ANALYZER_CMAKE_ENABLED;
      -  215   +  213  9
               return Settings.KEYS.ANALYZER_CMAKE_ENABLED;
      +  214  
           }
      -  216   +  215  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CPEAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CPEAnalyzer.html index d5e2b8707..b5406a311 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CPEAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CPEAnalyzer.html @@ -12,7 +12,7 @@
       
      - + @@ -135,7 +135,7 @@ - + @@ -144,7 +144,7 @@ - + @@ -227,7 +227,7 @@ - + @@ -246,7 +246,7 @@ - + @@ -265,8 +265,8 @@ - - + + @@ -285,1005 +285,1006 @@ - - - - - - + + + + - - - - - - - - + + + + + + + + + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + + + + + + + + - - - - - - - + + + + + - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - + + - - - - - - + + + + + + - - - + + + - - - + + + - - - - - - - + + + + + + + - - - - + + + + - - + + - - - + + + - - - - + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - + + - + - - - - - - - - - - - - - - - + + + - - - - - - - - + + - - - + + + - - - - - + + - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Classes in this File Line Coverage Branch Coverage Complexity
      CPEAnalyzer
      80%
      178/221
      73%
      97/132
      4.571
      CPEAnalyzer
      80%
      179/222
      73%
      97/132
      4.571
      CPEAnalyzer$IdentifierConfidence
      100%
      4/4
      N/A
      4.571
      CPEAnalyzer$IdentifierMatch
      38%
      15/39
      16%
      4/24
      4.571
        * @author Jeremy Long
       58  
        */
       59  24
       public class CPEAnalyzer implements Analyzer {
       59  4
       public class CPEAnalyzer implements Analyzer {
       60  
       
       61  
            * The Logger.
       63  
            */
       64  8
           private static final Logger LOGGER = LoggerFactory.getLogger(CPEAnalyzer.class);
       64  1
           private static final Logger LOGGER = LoggerFactory.getLogger(CPEAnalyzer.class);
       65  
           /**
       66  
           @Override
       105  
           public String getName() {
       106  32
               return "CPE Analyzer";
       106  4
               return "CPE Analyzer";
       107  
           }
       108  
           @Override
       115  
           public AnalysisPhase getAnalysisPhase() {
       116  16
               return AnalysisPhase.IDENTIFIER_ANALYSIS;
       116  3
               return AnalysisPhase.IDENTIFIER_ANALYSIS;
       117  
           }
       118  
           @Override
       125  
           public void initialize() throws Exception {
       126  8
               this.open();
       127  8
           }
       126  1
               this.open();
       127  1
           }
       128  
       
       129  
            */
       136  
           public void open() throws IOException, DatabaseException {
       137  8
               LOGGER.debug("Opening the CVE Database");
       138  8
               cve = new CveDB();
       139  8
               cve.open();
       140  8
               LOGGER.debug("Creating the Lucene CPE Index");
       141  8
               cpe = CpeMemoryIndex.getInstance();
       142  
       137  1
               cve = new CveDB();
       138  1
               cve.open();
       139  1
               cpe = CpeMemoryIndex.getInstance();
       140  
               try {
       143  8
                   cpe.open(cve);
       144  0
               } catch (IndexException ex) {
       145  0
                   LOGGER.debug("IndexException", ex);
       146  0
                   throw new DatabaseException(ex);
       147  8
               }
       148  8
           }
       149  
       
       141  1
                   LOGGER.info("Creating the CPE Index");
       142  1
                   final long creationStart = System.currentTimeMillis();
       143  1
                   cpe.open(cve);
       144  1
                   LOGGER.info("CPE Index Created ({} ms)", System.currentTimeMillis() - creationStart);
       145  0
               } catch (IndexException ex) {
       146  0
                   LOGGER.debug("IndexException", ex);
       147  0
                   throw new DatabaseException(ex);
       148  1
               }
       149  1
           }
       150  
           /**
       
       151  
            * Closes the data sources.
           /**
       152  
            */
            * Closes the data sources.
       153  
           @Override
            */
       154  
           public void close() {
       155  8
               if (cpe != null) {
       156  8
                   cpe.close();
       157  8
                   cpe = null;
       158  
               }
       159  8
               if (cve != null) {
       160  8
                   cve.close();
       161  8
                   cve = null;
       162  
               }
       163  8
           }
       164  
       
       165  
           public boolean isOpen() {
       166  0
               return cpe != null && cpe.isOpen();
       167  
           }
       168  
       
       169  
           /**
       170  
            * Searches the data store of CPE entries, trying to identify the CPE for the given dependency based on the evidence contained
       171  
            * within. The dependency passed in is updated with any identified CPE values.
       172  
            *
       173  
            * @param dependency the dependency to search for CPE entries on.
       174  
            * @throws CorruptIndexException is thrown when the Lucene index is corrupt.
       175  
            * @throws IOException is thrown when an IOException occurs.
       176  
            * @throws ParseException is thrown when the Lucene query cannot be parsed.
       177  
            */
       178  
           protected void determineCPE(Dependency dependency) throws CorruptIndexException, IOException, ParseException {
       179  
               //TODO test dojo-war against this. we shold get dojo-toolkit:dojo-toolkit AND dojo-toolkit:toolkit
       180  16
               String vendors = "";
       181  16
               String products = "";
       182  56
               for (Confidence confidence : Confidence.values()) {
       183  48
                   if (dependency.getVendorEvidence().contains(confidence)) {
       184  40
                       vendors = addEvidenceWithoutDuplicateTerms(vendors, dependency.getVendorEvidence(), confidence);
       185  40
                       LOGGER.debug("vendor search: {}", vendors);
       186  
                   }
       187  48
                   if (dependency.getProductEvidence().contains(confidence)) {
       188  40
                       products = addEvidenceWithoutDuplicateTerms(products, dependency.getProductEvidence(), confidence);
       189  40
                       LOGGER.debug("product search: {}", products);
       190  
                   }
       191  48
                   if (!vendors.isEmpty() && !products.isEmpty()) {
       192  48
                       final List<IndexEntry> entries = searchCPE(vendors, products, dependency.getProductEvidence().getWeighting(),
       193  
                               dependency.getVendorEvidence().getWeighting());
       194  48
                       if (entries == null) {
       195  0
                           continue;
       196  
                       }
       197  48
                       boolean identifierAdded = false;
       198  48
                       for (IndexEntry e : entries) {
       199  344
                           LOGGER.debug("Verifying entry: {}", e);
       200  344
                           if (verifyEntry(e, dependency)) {
       201  24
                               final String vendor = e.getVendor();
       202  24
                               final String product = e.getProduct();
       203  24
                               LOGGER.debug("identified vendor/product: {}/{}", vendor, product);
       204  24
                               identifierAdded |= determineIdentifiers(dependency, vendor, product, confidence);
       205  
                           }
       206  344
                       }
       207  48
                       if (identifierAdded) {
       208  8
                           break;
       209  
                       }
       210  
                   }
       211  
               }
       212  16
           }
       213  
       
       214  
           /**
       215  
            * Returns the text created by concatenating the text and the values from the EvidenceCollection (filtered for a specific
       216  
            * confidence). This attempts to prevent duplicate terms from being added.<br/<br/> Note, if the evidence is longer then 200
       217  
            * characters it will be truncated.
       218  
            *
       219  
            * @param text the base text.
       220  
            * @param ec an EvidenceCollection
       221  
            * @param confidenceFilter a Confidence level to filter the evidence by.
       222  
            * @return the new evidence text
       223  
            */
       224  
           private String addEvidenceWithoutDuplicateTerms(final String text, final EvidenceCollection ec, Confidence confidenceFilter) {
       225  80
               final String txt = (text == null) ? "" : text;
       226  80
               final StringBuilder sb = new StringBuilder(txt.length() + (20 * ec.size()));
       227  80
               sb.append(' ').append(txt).append(' ');
       228  80
               for (Evidence e : ec.iterator(confidenceFilter)) {
       229  328
                   String value = e.getValue();
       230  
       
       231  
                   //hack to get around the fact that lucene does a really good job of recognizing domains and not
       232  
                   // splitting them. TODO - put together a better lucene analyzer specific to the domain.
       233  328
                   if (value.startsWith("http://")) {
       234  16
                       value = value.substring(7).replaceAll("\\.", " ");
       235  
                   }
       236  328
                   if (value.startsWith("https://")) {
       237  0
                       value = value.substring(8).replaceAll("\\.", " ");
       238  
                   }
       239  328
                   if (sb.indexOf(" " + value + " ") < 0) {
       240  296
                       sb.append(value).append(' ');
       241  
                   }
       242  328
               }
       243  80
               return sb.toString().trim();
       244  
           }
       245  
       
       246  
           /**
       247  
            * <p>
       248  
            * Searches the Lucene CPE index to identify possible CPE entries associated with the supplied vendor, product, and
       249  
            * version.</p>
       250  
            *
       251  
            * <p>
       252  
            * If either the vendorWeightings or productWeightings lists have been populated this data is used to add weighting factors to
       253  
            * the search.</p>
       254  
            *
       255  
            * @param vendor the text used to search the vendor field
       256  
            * @param product the text used to search the product field
       257  
            * @param vendorWeightings a list of strings to use to add weighting factors to the vendor field
       258  
            * @param productWeightings Adds a list of strings that will be used to add weighting factors to the product search
       259  
            * @return a list of possible CPE values
       260  
            */
       261  
           protected List<IndexEntry> searchCPE(String vendor, String product,
       262  
                   Set<String> vendorWeightings, Set<String> productWeightings) {
       263  
       
       264  48
               final List<IndexEntry> ret = new ArrayList<IndexEntry>(MAX_QUERY_RESULTS);
       265  
       
       266  48
               final String searchString = buildSearch(vendor, product, vendorWeightings, productWeightings);
       267  48
               if (searchString == null) {
       268  0
                   return ret;
       269  
               }
       270  
               try {
       271  48
                   final TopDocs docs = cpe.search(searchString, MAX_QUERY_RESULTS);
       272  1248
                   for (ScoreDoc d : docs.scoreDocs) {
       273  1200
                       if (d.score >= 0.08) {
       274  344
                           final Document doc = cpe.getDocument(d.doc);
       275  344
                           final IndexEntry entry = new IndexEntry();
       276  344
                           entry.setVendor(doc.get(Fields.VENDOR));
       277  344
                           entry.setProduct(doc.get(Fields.PRODUCT));
       278  344
                           entry.setSearchScore(d.score);
       279  344
                           if (!ret.contains(entry)) {
       280  344
                               ret.add(entry);
       281  
                           }
       282  
                       }
       283  
                   }
       284  48
                   return ret;
       285  0
               } catch (ParseException ex) {
       286  0
                   LOGGER.warn("An error occured querying the CPE data. See the log for more details.");
       287  0
                   LOGGER.info("Unable to parse: {}", searchString, ex);
       288  0
               } catch (IOException ex) {
       289  0
                   LOGGER.warn("An error occured reading CPE data. See the log for more details.");
       290  0
                   LOGGER.info("IO Error with search string: {}", searchString, ex);
       291  0
               }
       292  0
               return null;
       293  
           }
       294  
       
       295  
           /**
       296  
            * <p>
       297  
            * Builds a Lucene search string by properly escaping data and constructing a valid search query.</p>
       298  
            *
       299  
            * <p>
       300  
            * If either the possibleVendor or possibleProducts lists have been populated this data is used to add weighting factors to
       301  
            * the search string generated.</p>
       302  
            *
       303  
            * @param vendor text to search the vendor field
       304  
            * @param product text to search the product field
       305  
            * @param vendorWeighting a list of strings to apply to the vendor to boost the terms weight
       306  
            * @param productWeightings a list of strings to apply to the product to boost the terms weight
       307  
            * @return the Lucene query
       308  
            */
       309  
           protected String buildSearch(String vendor, String product,
       310  
                   Set<String> vendorWeighting, Set<String> productWeightings) {
       311  48
               final String v = vendor; //.replaceAll("[^\\w\\d]", " ");
       312  48
               final String p = product; //.replaceAll("[^\\w\\d]", " ");
       313  48
               final StringBuilder sb = new StringBuilder(v.length() + p.length()
       314  
                       + Fields.PRODUCT.length() + Fields.VENDOR.length() + STRING_BUILDER_BUFFER);
       315  
       
       316  48
               if (!appendWeightedSearch(sb, Fields.PRODUCT, p, productWeightings)) {
       317  0
                   return null;
       318  
               }
       319  48
               sb.append(" AND ");
       320  48
               if (!appendWeightedSearch(sb, Fields.VENDOR, v, vendorWeighting)) {
       321  0
                   return null;
       322  
               }
       323  48
               return sb.toString();
       324  
           }
       325  
       
       326  
           /**
       327  
            * This method constructs a Lucene query for a given field. The searchText is split into separate words and if the word is
       328  
            * within the list of weighted words then an additional weighting is applied to the term as it is appended into the query.
       329  
            *
       330  
            * @param sb a StringBuilder that the query text will be appended to.
       331  
            * @param field the field within the Lucene index that the query is searching.
       332  
            * @param searchText text used to construct the query.
       333  
            * @param weightedText a list of terms that will be considered higher importance when searching.
       334  
            * @return if the append was successful.
       335  
            */
       336  
           private boolean appendWeightedSearch(StringBuilder sb, String field, String searchText, Set<String> weightedText) {
       337  96
               sb.append(" ").append(field).append(":( ");
       338  
       
       339  96
               final String cleanText = cleanseText(searchText);
       340  
       
       341  96
               if ("".equals(cleanText)) {
       342  0
                   return false;
       343  
               }
       344  
       
       345  96
               if (weightedText == null || weightedText.isEmpty()) {
       346  0
                   LuceneUtils.appendEscapedLuceneQuery(sb, cleanText);
       347  
               } else {
       348  96
                   final StringTokenizer tokens = new StringTokenizer(cleanText);
       349  1232
                   while (tokens.hasMoreElements()) {
       350  1136
                       final String word = tokens.nextToken();
       351  1136
                       String temp = null;
       352  1136
                       for (String weighted : weightedText) {
       353  2640
                           final String weightedStr = cleanseText(weighted);
       354  2640
                           if (equalsIgnoreCaseAndNonAlpha(word, weightedStr)) {
       355  176
                               temp = LuceneUtils.escapeLuceneQuery(word) + WEIGHTING_BOOST;
       356  176
                               if (!word.equalsIgnoreCase(weightedStr)) {
       357  0
                                   temp += " " + LuceneUtils.escapeLuceneQuery(weightedStr) + WEIGHTING_BOOST;
       358  
                               }
       359  
                           }
       360  2640
                       }
       361  1136
                       if (temp == null) {
       362  960
                           temp = LuceneUtils.escapeLuceneQuery(word);
       363  
                       }
       364  1136
                       sb.append(" ").append(temp);
       365  1136
                   }
       366  
               }
       367  96
               sb.append(" ) ");
       368  96
               return true;
       369  
           }
       370  
       
       371  
           /**
       372  
            * Removes characters from the input text that are not used within the CPE index.
       373  
            *
       374  
            * @param text is the text to remove the characters from.
       375  
            * @return the text having removed some characters.
       376  
            */
       377  
           private String cleanseText(String text) {
       378  2736
               return text.replaceAll(CLEANSE_CHARACTER_RX, " ");
       379  
           }
       380  
       
       381  
           /**
       382  
            * Compares two strings after lower casing them and removing the non-alpha characters.
       383  
            *
       384  
            * @param l string one to compare.
       385  
            * @param r string two to compare.
       386  
            * @return whether or not the two strings are similar.
       387  
            */
       388  
           private boolean equalsIgnoreCaseAndNonAlpha(String l, String r) {
       389  2640
               if (l == null || r == null) {
       390  0
                   return false;
       391  
               }
       392  
       
       393  2640
               final String left = l.replaceAll(CLEANSE_NONALPHA_RX, "");
       394  2640
               final String right = r.replaceAll(CLEANSE_NONALPHA_RX, "");
       395  2640
               return left.equalsIgnoreCase(right);
       396  
           }
       397  
       
       398  
           /**
       399  
            * Ensures that the CPE Identified matches the dependency. This validates that the product, vendor, and version information
       400  
            * for the CPE are contained within the dependencies evidence.
       401  
            *
       402  
            * @param entry a CPE entry.
       403  
            * @param dependency the dependency that the CPE entries could be for.
       404  
            * @return whether or not the entry is valid.
       405  
            */
       406  
           private boolean verifyEntry(final IndexEntry entry, final Dependency dependency) {
       407  344
               boolean isValid = false;
       408  
       
       409  
               //TODO - does this nullify some of the fuzzy matching that happens in the lucene search?
       410  
               // for instance CPE some-component and in the evidence we have SomeComponent.
       411  344
               if (collectionContainsString(dependency.getProductEvidence(), entry.getProduct())
       412  
                       && collectionContainsString(dependency.getVendorEvidence(), entry.getVendor())) {
       413  
                   //&& collectionContainsVersion(dependency.getVersionEvidence(), entry.getVersion())
       414  24
                   isValid = true;
       415  
               }
       416  344
               return isValid;
       417  
           }
       418  
       
       419  
           /**
       420  
            * Used to determine if the EvidenceCollection contains a specific string.
       421  
            *
       422  
            * @param ec an EvidenceCollection
       423  
            * @param text the text to search for
       424  
            * @return whether or not the EvidenceCollection contains the string
       425  
            */
       426  
           private boolean collectionContainsString(EvidenceCollection ec, String text) {
       427  
               //TODO - likely need to change the split... not sure if this will work for CPE with special chars
       428  376
               if (text == null) {
       429  0
                   return false;
       430  
               }
       431  376
               final String[] words = text.split("[\\s_-]");
       432  376
               final List<String> list = new ArrayList<String>();
       433  376
               String tempWord = null;
       434  1360
               for (String word : words) {
       435  
                   /*
       436  
                    single letter words should be concatenated with the next word.
       437  
                    so { "m", "core", "sample" } -> { "mcore", "sample" }
       438  
                    */
       439  984
                   if (tempWord != null) {
       440  40
                       list.add(tempWord + word);
       441  40
                       tempWord = null;
       442  944
                   } else if (word.length() <= 2) {
       443  40
                       tempWord = word;
       444  
                   } else {
       445  904
                       list.add(word);
       446  
                   }
       447  
               }
       448  376
               if (tempWord != null) {
       449  0
                   if (!list.isEmpty()) {
       450  0
                       final String tmp = list.get(list.size() - 1) + tempWord;
       451  0
                       list.add(tmp);
       452  0
                   } else {
       453  0
                       list.add(tempWord);
       454  
                   }
       455  
               }
       456  376
               if (list.isEmpty()) {
       457  0
                   return false;
       458  
               }
       459  376
               boolean contains = true;
       460  376
               for (String word : list) {
       461  944
                   contains &= ec.containsUsedString(word);
       462  944
               }
       463  376
               return contains;
       464  
           }
       465  
       
       466  
           /**
       467  
            * Analyzes a dependency and attempts to determine if there are any CPE identifiers for this dependency.
       468  
            *
       469  
            * @param dependency The Dependency to analyze.
       470  
            * @param engine The analysis engine
       471  
            * @throws AnalysisException is thrown if there is an issue analyzing the dependency.
       472  
            */
       473  
           @Override
       474  
           public void analyze(Dependency dependency, Engine engine) throws AnalysisException {
       475  
               try {
       476  16
                   determineCPE(dependency);
       477  0
               } catch (CorruptIndexException ex) {
       478  0
                   throw new AnalysisException("CPE Index is corrupt.", ex);
       479  0
               } catch (IOException ex) {
       480  0
                   throw new AnalysisException("Failure opening the CPE Index.", ex);
       481  0
               } catch (ParseException ex) {
       482  0
                   throw new AnalysisException("Unable to parse the generated Lucene query for this dependency.", ex);
       483  16
               }
       484  16
           }
       485  
       155  
           public void close() {
       156  1
               if (cpe != null) {
       157  1
                   cpe.close();
       158  1
                   cpe = null;
       159  
               }
       160  1
               if (cve != null) {
       161  1
                   cve.close();
       162  1
                   cve = null;
       163  
               }
       164  1
           }
       165  
       
       486  
       166  
           public boolean isOpen() {
       167  0
               return cpe != null && cpe.isOpen();
       168  
           }
       169  
       
       170  
           /**
       487  
            * Retrieves a list of CPE values from the CveDB based on the vendor and product passed in. The list is then validated to find
       488  
            * only CPEs that are valid for the given dependency. It is possible that the CPE identified is a best effort "guess" based on
       489  
            * the vendor, product, and version information.
       490  
       171  
            * Searches the data store of CPE entries, trying to identify the CPE for the given dependency based on the evidence contained
       172  
            * within. The dependency passed in is updated with any identified CPE values.
       173  
            *
       491  
            * @param dependency the Dependency being analyzed
       492  
            * @param vendor the vendor for the CPE being analyzed
       493  
            * @param product the product for the CPE being analyzed
       494  
            * @param currentConfidence the current confidence being used during analysis
       495  
            * @return <code>true</code> if an identifier was added to the dependency; otherwise <code>false</code>
       496  
            * @throws UnsupportedEncodingException is thrown if UTF-8 is not supported
       497  
       174  
            * @param dependency the dependency to search for CPE entries on.
       175  
            * @throws CorruptIndexException is thrown when the Lucene index is corrupt.
       176  
            * @throws IOException is thrown when an IOException occurs.
       177  
            * @throws ParseException is thrown when the Lucene query cannot be parsed.
       178  
            */
       498  
           protected boolean determineIdentifiers(Dependency dependency, String vendor, String product,
       499  
                   Confidence currentConfidence) throws UnsupportedEncodingException {
       500  24
               final Set<VulnerableSoftware> cpes = cve.getCPEs(vendor, product);
       501  24
               DependencyVersion bestGuess = new DependencyVersion("-");
       502  24
               Confidence bestGuessConf = null;
       503  24
               boolean hasBroadMatch = false;
       504  24
               final List<IdentifierMatch> collected = new ArrayList<IdentifierMatch>();
       505  120
               for (Confidence conf : Confidence.values()) {
       506  
       //            if (conf.compareTo(currentConfidence) > 0) {
       507  
       //                break;
       508  
       //            }
       509  96
                   for (Evidence evidence : dependency.getVersionEvidence().iterator(conf)) {
       510  96
                       final DependencyVersion evVer = DependencyVersionUtil.parseVersion(evidence.getValue());
       511  96
                       if (evVer == null) {
       512  0
                           continue;
       513  
       179  
           protected void determineCPE(Dependency dependency) throws CorruptIndexException, IOException, ParseException {
       180  
               //TODO test dojo-war against this. we shold get dojo-toolkit:dojo-toolkit AND dojo-toolkit:toolkit
       181  2
               String vendors = "";
       182  2
               String products = "";
       183  7
               for (Confidence confidence : Confidence.values()) {
       184  6
                   if (dependency.getVendorEvidence().contains(confidence)) {
       185  5
                       vendors = addEvidenceWithoutDuplicateTerms(vendors, dependency.getVendorEvidence(), confidence);
       186  5
                       LOGGER.debug("vendor search: {}", vendors);
       187  
                   }
       188  6
                   if (dependency.getProductEvidence().contains(confidence)) {
       189  5
                       products = addEvidenceWithoutDuplicateTerms(products, dependency.getProductEvidence(), confidence);
       190  5
                       LOGGER.debug("product search: {}", products);
       191  
                   }
       192  6
                   if (!vendors.isEmpty() && !products.isEmpty()) {
       193  6
                       final List<IndexEntry> entries = searchCPE(vendors, products, dependency.getProductEvidence().getWeighting(),
       194  
                               dependency.getVendorEvidence().getWeighting());
       195  6
                       if (entries == null) {
       196  0
                           continue;
       197  
                       }
       514  96
                       for (VulnerableSoftware vs : cpes) {
       515  
                           DependencyVersion dbVer;
       516  3488
                           if (vs.getUpdate() != null && !vs.getUpdate().isEmpty()) {
       517  1024
                               dbVer = DependencyVersionUtil.parseVersion(vs.getVersion() + "." + vs.getUpdate());
       518  
                           } else {
       519  2464
                               dbVer = DependencyVersionUtil.parseVersion(vs.getVersion());
       520  
       198  6
                       boolean identifierAdded = false;
       199  6
                       for (IndexEntry e : entries) {
       200  43
                           LOGGER.debug("Verifying entry: {}", e);
       201  43
                           if (verifyEntry(e, dependency)) {
       202  3
                               final String vendor = e.getVendor();
       203  3
                               final String product = e.getProduct();
       204  3
                               LOGGER.debug("identified vendor/product: {}/{}", vendor, product);
       205  3
                               identifierAdded |= determineIdentifiers(dependency, vendor, product, confidence);
       206  
                           }
       521  3488
                           if (dbVer == null) { //special case, no version specified - everything is vulnerable
       522  0
                               hasBroadMatch = true;
       523  0
                               final String url = String.format(NVD_SEARCH_URL, URLEncoder.encode(vs.getName(), "UTF-8"));
       524  0
                               final IdentifierMatch match = new IdentifierMatch("cpe", vs.getName(), url, IdentifierConfidence.BROAD_MATCH, conf);
       525  0
                               collected.add(match);
       526  0
                           } else if (evVer.equals(dbVer)) { //yeah! exact match
       527  64
                               final String url = String.format(NVD_SEARCH_URL, URLEncoder.encode(vs.getName(), "UTF-8"));
       528  64
                               final IdentifierMatch match = new IdentifierMatch("cpe", vs.getName(), url, IdentifierConfidence.EXACT_MATCH, conf);
       529  64
                               collected.add(match);
       530  64
                           } else {
       531  
                               //TODO the following isn't quite right is it? need to think about this guessing game a bit more.
       532  3424
                               if (evVer.getVersionParts().size() <= dbVer.getVersionParts().size()
       533  
                                       && evVer.matchesAtLeastThreeLevels(dbVer)) {
       534  512
                                   if (bestGuessConf == null || bestGuessConf.compareTo(conf) > 0) {
       535  16
                                       if (bestGuess.getVersionParts().size() < dbVer.getVersionParts().size()) {
       536  16
                                           bestGuess = dbVer;
       537  16
                                           bestGuessConf = conf;
       538  
                                       }
       539  
                                   }
       540  
       207  43
                       }
       208  6
                       if (identifierAdded) {
       209  1
                           break;
       210  
                       }
       211  
                   }
       212  
               }
       213  2
           }
       214  
       
       215  
           /**
       216  
            * Returns the text created by concatenating the text and the values from the EvidenceCollection (filtered for a specific
       217  
            * confidence). This attempts to prevent duplicate terms from being added.<br/<br/> Note, if the evidence is longer then 200
       218  
            * characters it will be truncated.
       219  
            *
       220  
            * @param text the base text.
       221  
            * @param ec an EvidenceCollection
       222  
            * @param confidenceFilter a Confidence level to filter the evidence by.
       223  
            * @return the new evidence text
       224  
            */
       225  
           private String addEvidenceWithoutDuplicateTerms(final String text, final EvidenceCollection ec, Confidence confidenceFilter) {
       226  10
               final String txt = (text == null) ? "" : text;
       227  10
               final StringBuilder sb = new StringBuilder(txt.length() + (20 * ec.size()));
       228  10
               sb.append(' ').append(txt).append(' ');
       229  10
               for (Evidence e : ec.iterator(confidenceFilter)) {
       230  41
                   String value = e.getValue();
       231  
       
       232  
                   //hack to get around the fact that lucene does a really good job of recognizing domains and not
       233  
                   // splitting them. TODO - put together a better lucene analyzer specific to the domain.
       234  41
                   if (value.startsWith("http://")) {
       235  2
                       value = value.substring(7).replaceAll("\\.", " ");
       236  
                   }
       237  41
                   if (value.startsWith("https://")) {
       238  0
                       value = value.substring(8).replaceAll("\\.", " ");
       239  
                   }
       240  41
                   if (sb.indexOf(" " + value + " ") < 0) {
       241  37
                       sb.append(value).append(' ');
       242  
                   }
       243  41
               }
       244  10
               return sb.toString().trim();
       245  
           }
       246  
       
       247  
           /**
       248  
            * <p>
       249  
            * Searches the Lucene CPE index to identify possible CPE entries associated with the supplied vendor, product, and
       250  
            * version.</p>
       251  
            *
       252  
            * <p>
       253  
            * If either the vendorWeightings or productWeightings lists have been populated this data is used to add weighting factors to
       254  
            * the search.</p>
       255  
            *
       256  
            * @param vendor the text used to search the vendor field
       257  
            * @param product the text used to search the product field
       258  
            * @param vendorWeightings a list of strings to use to add weighting factors to the vendor field
       259  
            * @param productWeightings Adds a list of strings that will be used to add weighting factors to the product search
       260  
            * @return a list of possible CPE values
       261  
            */
       262  
           protected List<IndexEntry> searchCPE(String vendor, String product,
       263  
                   Set<String> vendorWeightings, Set<String> productWeightings) {
       264  
       
       265  6
               final List<IndexEntry> ret = new ArrayList<IndexEntry>(MAX_QUERY_RESULTS);
       266  
       
       267  6
               final String searchString = buildSearch(vendor, product, vendorWeightings, productWeightings);
       268  6
               if (searchString == null) {
       269  0
                   return ret;
       270  
               }
       271  
               try {
       272  6
                   final TopDocs docs = cpe.search(searchString, MAX_QUERY_RESULTS);
       273  156
                   for (ScoreDoc d : docs.scoreDocs) {
       274  150
                       if (d.score >= 0.08) {
       275  43
                           final Document doc = cpe.getDocument(d.doc);
       276  43
                           final IndexEntry entry = new IndexEntry();
       277  43
                           entry.setVendor(doc.get(Fields.VENDOR));
       278  43
                           entry.setProduct(doc.get(Fields.PRODUCT));
       279  43
                           entry.setSearchScore(d.score);
       280  43
                           if (!ret.contains(entry)) {
       281  43
                               ret.add(entry);
       282  
                           }
       283  
                       }
       284  
                   }
       285  6
                   return ret;
       286  0
               } catch (ParseException ex) {
       287  0
                   LOGGER.warn("An error occured querying the CPE data. See the log for more details.");
       288  0
                   LOGGER.info("Unable to parse: {}", searchString, ex);
       289  0
               } catch (IOException ex) {
       290  0
                   LOGGER.warn("An error occured reading CPE data. See the log for more details.");
       291  0
                   LOGGER.info("IO Error with search string: {}", searchString, ex);
       292  0
               }
       293  0
               return null;
       294  
           }
       295  
       
       296  
           /**
       297  
            * <p>
       298  
            * Builds a Lucene search string by properly escaping data and constructing a valid search query.</p>
       299  
            *
       300  
            * <p>
       301  
            * If either the possibleVendor or possibleProducts lists have been populated this data is used to add weighting factors to
       302  
            * the search string generated.</p>
       303  
            *
       304  
            * @param vendor text to search the vendor field
       305  
            * @param product text to search the product field
       306  
            * @param vendorWeighting a list of strings to apply to the vendor to boost the terms weight
       307  
            * @param productWeightings a list of strings to apply to the product to boost the terms weight
       308  
            * @return the Lucene query
       309  
            */
       310  
           protected String buildSearch(String vendor, String product,
       311  
                   Set<String> vendorWeighting, Set<String> productWeightings) {
       312  6
               final String v = vendor; //.replaceAll("[^\\w\\d]", " ");
       313  6
               final String p = product; //.replaceAll("[^\\w\\d]", " ");
       314  6
               final StringBuilder sb = new StringBuilder(v.length() + p.length()
       315  
                       + Fields.PRODUCT.length() + Fields.VENDOR.length() + STRING_BUILDER_BUFFER);
       316  
       
       317  6
               if (!appendWeightedSearch(sb, Fields.PRODUCT, p, productWeightings)) {
       318  0
                   return null;
       319  
               }
       320  6
               sb.append(" AND ");
       321  6
               if (!appendWeightedSearch(sb, Fields.VENDOR, v, vendorWeighting)) {
       322  0
                   return null;
       323  
               }
       324  6
               return sb.toString();
       325  
           }
       326  
       
       327  
           /**
       328  
            * This method constructs a Lucene query for a given field. The searchText is split into separate words and if the word is
       329  
            * within the list of weighted words then an additional weighting is applied to the term as it is appended into the query.
       330  
            *
       331  
            * @param sb a StringBuilder that the query text will be appended to.
       332  
            * @param field the field within the Lucene index that the query is searching.
       333  
            * @param searchText text used to construct the query.
       334  
            * @param weightedText a list of terms that will be considered higher importance when searching.
       335  
            * @return if the append was successful.
       336  
            */
       337  
           private boolean appendWeightedSearch(StringBuilder sb, String field, String searchText, Set<String> weightedText) {
       338  12
               sb.append(" ").append(field).append(":( ");
       339  
       
       340  12
               final String cleanText = cleanseText(searchText);
       341  
       
       342  12
               if (cleanText.isEmpty()) {
       343  0
                   return false;
       344  
               }
       345  
       
       346  12
               if (weightedText == null || weightedText.isEmpty()) {
       347  0
                   LuceneUtils.appendEscapedLuceneQuery(sb, cleanText);
       348  
               } else {
       349  12
                   final StringTokenizer tokens = new StringTokenizer(cleanText);
       350  154
                   while (tokens.hasMoreElements()) {
       351  142
                       final String word = tokens.nextToken();
       352  142
                       String temp = null;
       353  142
                       for (String weighted : weightedText) {
       354  330
                           final String weightedStr = cleanseText(weighted);
       355  330
                           if (equalsIgnoreCaseAndNonAlpha(word, weightedStr)) {
       356  22
                               temp = LuceneUtils.escapeLuceneQuery(word) + WEIGHTING_BOOST;
       357  22
                               if (!word.equalsIgnoreCase(weightedStr)) {
       358  0
                                   temp += " " + LuceneUtils.escapeLuceneQuery(weightedStr) + WEIGHTING_BOOST;
       359  
                               }
       360  
                           }
       361  330
                       }
       362  142
                       if (temp == null) {
       363  120
                           temp = LuceneUtils.escapeLuceneQuery(word);
       364  
                       }
       365  142
                       sb.append(" ").append(temp);
       366  142
                   }
       367  
               }
       368  12
               sb.append(" ) ");
       369  12
               return true;
       370  
           }
       371  
       
       372  
           /**
       373  
            * Removes characters from the input text that are not used within the CPE index.
       374  
            *
       375  
            * @param text is the text to remove the characters from.
       376  
            * @return the text having removed some characters.
       377  
            */
       378  
           private String cleanseText(String text) {
       379  342
               return text.replaceAll(CLEANSE_CHARACTER_RX, " ");
       380  
           }
       381  
       
       382  
           /**
       383  
            * Compares two strings after lower casing them and removing the non-alpha characters.
       384  
            *
       385  
            * @param l string one to compare.
       386  
            * @param r string two to compare.
       387  
            * @return whether or not the two strings are similar.
       388  
            */
       389  
           private boolean equalsIgnoreCaseAndNonAlpha(String l, String r) {
       390  330
               if (l == null || r == null) {
       391  0
                   return false;
       392  
               }
       393  
       
       394  330
               final String left = l.replaceAll(CLEANSE_NONALPHA_RX, "");
       395  330
               final String right = r.replaceAll(CLEANSE_NONALPHA_RX, "");
       396  330
               return left.equalsIgnoreCase(right);
       397  
           }
       398  
       
       399  
           /**
       400  
            * Ensures that the CPE Identified matches the dependency. This validates that the product, vendor, and version information
       401  
            * for the CPE are contained within the dependencies evidence.
       402  
            *
       403  
            * @param entry a CPE entry.
       404  
            * @param dependency the dependency that the CPE entries could be for.
       405  
            * @return whether or not the entry is valid.
       406  
            */
       407  
           private boolean verifyEntry(final IndexEntry entry, final Dependency dependency) {
       408  43
               boolean isValid = false;
       409  
       
       410  
               //TODO - does this nullify some of the fuzzy matching that happens in the lucene search?
       411  
               // for instance CPE some-component and in the evidence we have SomeComponent.
       412  43
               if (collectionContainsString(dependency.getProductEvidence(), entry.getProduct())
       413  
                       && collectionContainsString(dependency.getVendorEvidence(), entry.getVendor())) {
       414  
                   //&& collectionContainsVersion(dependency.getVersionEvidence(), entry.getVersion())
       415  3
                   isValid = true;
       416  
               }
       417  43
               return isValid;
       418  
           }
       419  
       
       420  
           /**
       421  
            * Used to determine if the EvidenceCollection contains a specific string.
       422  
            *
       423  
            * @param ec an EvidenceCollection
       424  
            * @param text the text to search for
       425  
            * @return whether or not the EvidenceCollection contains the string
       426  
            */
       427  
           private boolean collectionContainsString(EvidenceCollection ec, String text) {
       428  
               //TODO - likely need to change the split... not sure if this will work for CPE with special chars
       429  47
               if (text == null) {
       430  0
                   return false;
       431  
               }
       432  47
               final String[] words = text.split("[\\s_-]");
       433  47
               final List<String> list = new ArrayList<String>();
       434  47
               String tempWord = null;
       435  170
               for (String word : words) {
       436  
                   /*
       437  
                    single letter words should be concatenated with the next word.
       438  
                    so { "m", "core", "sample" } -> { "mcore", "sample" }
       439  
                    */
       440  123
                   if (tempWord != null) {
       441  5
                       list.add(tempWord + word);
       442  5
                       tempWord = null;
       443  118
                   } else if (word.length() <= 2) {
       444  5
                       tempWord = word;
       445  
                   } else {
       446  113
                       list.add(word);
       447  
                   }
       448  
               }
       449  47
               if (tempWord != null) {
       450  0
                   if (!list.isEmpty()) {
       451  0
                       final String tmp = list.get(list.size() - 1) + tempWord;
       452  0
                       list.add(tmp);
       453  0
                   } else {
       454  0
                       list.add(tempWord);
       455  
                   }
       456  
               }
       457  47
               if (list.isEmpty()) {
       458  0
                   return false;
       459  
               }
       460  47
               boolean contains = true;
       461  47
               for (String word : list) {
       462  118
                   contains &= ec.containsUsedString(word);
       463  118
               }
       464  47
               return contains;
       465  
           }
       466  
       
       467  
           /**
       468  
            * Analyzes a dependency and attempts to determine if there are any CPE identifiers for this dependency.
       469  
            *
       470  
            * @param dependency The Dependency to analyze.
       471  
            * @param engine The analysis engine
       472  
            * @throws AnalysisException is thrown if there is an issue analyzing the dependency.
       473  
            */
       474  
           @Override
       475  
           public void analyze(Dependency dependency, Engine engine) throws AnalysisException {
       476  
               try {
       477  2
                   determineCPE(dependency);
       478  0
               } catch (CorruptIndexException ex) {
       479  0
                   throw new AnalysisException("CPE Index is corrupt.", ex);
       480  0
               } catch (IOException ex) {
       481  0
                   throw new AnalysisException("Failure opening the CPE Index.", ex);
       482  0
               } catch (ParseException ex) {
       483  0
                   throw new AnalysisException("Unable to parse the generated Lucene query for this dependency.", ex);
       484  2
               }
       485  2
           }
       486  
       
       487  
           /**
       488  
            * Retrieves a list of CPE values from the CveDB based on the vendor and product passed in. The list is then validated to find
       489  
            * only CPEs that are valid for the given dependency. It is possible that the CPE identified is a best effort "guess" based on
       490  
            * the vendor, product, and version information.
       491  
            *
       492  
            * @param dependency the Dependency being analyzed
       493  
            * @param vendor the vendor for the CPE being analyzed
       494  
            * @param product the product for the CPE being analyzed
       495  
            * @param currentConfidence the current confidence being used during analysis
       496  
            * @return <code>true</code> if an identifier was added to the dependency; otherwise <code>false</code>
       497  
            * @throws UnsupportedEncodingException is thrown if UTF-8 is not supported
       498  
            */
       499  
           protected boolean determineIdentifiers(Dependency dependency, String vendor, String product,
       500  
                   Confidence currentConfidence) throws UnsupportedEncodingException {
       501  3
               final Set<VulnerableSoftware> cpes = cve.getCPEs(vendor, product);
       502  3
               DependencyVersion bestGuess = new DependencyVersion("-");
       503  3
               Confidence bestGuessConf = null;
       504  3
               boolean hasBroadMatch = false;
       505  3
               final List<IdentifierMatch> collected = new ArrayList<IdentifierMatch>();
       506  15
               for (Confidence conf : Confidence.values()) {
       507  
       //            if (conf.compareTo(currentConfidence) > 0) {
       508  
       //                break;
       509  
       //            }
       510  12
                   for (Evidence evidence : dependency.getVersionEvidence().iterator(conf)) {
       511  12
                       final DependencyVersion evVer = DependencyVersionUtil.parseVersion(evidence.getValue());
       512  12
                       if (evVer == null) {
       513  0
                           continue;
       514  
                       }
       515  12
                       for (VulnerableSoftware vs : cpes) {
       516  
                           DependencyVersion dbVer;
       517  436
                           if (vs.getUpdate() != null && !vs.getUpdate().isEmpty()) {
       518  128
                               dbVer = DependencyVersionUtil.parseVersion(vs.getVersion() + "." + vs.getUpdate());
       519  
                           } else {
       520  308
                               dbVer = DependencyVersionUtil.parseVersion(vs.getVersion());
       521  
                           }
       522  436
                           if (dbVer == null) { //special case, no version specified - everything is vulnerable
       523  0
                               hasBroadMatch = true;
       524  0
                               final String url = String.format(NVD_SEARCH_URL, URLEncoder.encode(vs.getName(), "UTF-8"));
       525  0
                               final IdentifierMatch match = new IdentifierMatch("cpe", vs.getName(), url, IdentifierConfidence.BROAD_MATCH, conf);
       526  0
                               collected.add(match);
       527  0
                           } else if (evVer.equals(dbVer)) { //yeah! exact match
       528  8
                               final String url = String.format(NVD_SEARCH_URL, URLEncoder.encode(vs.getName(), "UTF-8"));
       529  8
                               final IdentifierMatch match = new IdentifierMatch("cpe", vs.getName(), url, IdentifierConfidence.EXACT_MATCH, conf);
       530  8
                               collected.add(match);
       531  8
                           } else {
       532  
                               //TODO the following isn't quite right is it? need to think about this guessing game a bit more.
       533  428
                               if (evVer.getVersionParts().size() <= dbVer.getVersionParts().size()
       534  
                                       && evVer.matchesAtLeastThreeLevels(dbVer)) {
       535  64
                                   if (bestGuessConf == null || bestGuessConf.compareTo(conf) > 0) {
       536  2
                                       if (bestGuess.getVersionParts().size() < dbVer.getVersionParts().size()) {
       537  2
                                           bestGuess = dbVer;
       538  2
                                           bestGuessConf = conf;
       539  
                                       }
       540  
                                   }
       541  
                               }
       542  
                           }
       542  3488
                       }
       543  96
                       if (bestGuessConf == null || bestGuessConf.compareTo(conf) > 0) {
       544  8
                           if (bestGuess.getVersionParts().size() < evVer.getVersionParts().size()) {
       545  8
                               bestGuess = evVer;
       546  8
                               bestGuessConf = conf;
       547  
                           }
       543  436
                       }
       544  12
                       if (bestGuessConf == null || bestGuessConf.compareTo(conf) > 0) {
       545  1
                           if (bestGuess.getVersionParts().size() < evVer.getVersionParts().size()) {
       546  1
                               bestGuess = evVer;
       547  1
                               bestGuessConf = conf;
       548  
                           }
       549  
                       }
       549  96
                   }
       550  
       550  12
                   }
       551  
               }
       551  24
               final String cpeName = String.format("cpe:/a:%s:%s:%s", vendor, product, bestGuess.toString());
       552  24
               String url = null;
       553  24
               if (hasBroadMatch) { //if we have a broad match we can add the URL to the best guess.
       554  0
                   final String cpeUrlName = String.format("cpe:/a:%s:%s", vendor, product);
       555  0
                   url = String.format(NVD_SEARCH_URL, URLEncoder.encode(cpeUrlName, "UTF-8"));
       556  
       552  3
               final String cpeName = String.format("cpe:/a:%s:%s:%s", vendor, product, bestGuess.toString());
       553  3
               String url = null;
       554  3
               if (hasBroadMatch) { //if we have a broad match we can add the URL to the best guess.
       555  0
                   final String cpeUrlName = String.format("cpe:/a:%s:%s", vendor, product);
       556  0
                   url = String.format(NVD_SEARCH_URL, URLEncoder.encode(cpeUrlName, "UTF-8"));
       557  
               }
       557  24
               if (bestGuessConf == null) {
       558  0
                   bestGuessConf = Confidence.LOW;
       559  
       558  3
               if (bestGuessConf == null) {
       559  0
                   bestGuessConf = Confidence.LOW;
       560  
               }
       560  24
               final IdentifierMatch match = new IdentifierMatch("cpe", cpeName, url, IdentifierConfidence.BEST_GUESS, bestGuessConf);
       561  24
               collected.add(match);
       562  
       561  3
               final IdentifierMatch match = new IdentifierMatch("cpe", cpeName, url, IdentifierConfidence.BEST_GUESS, bestGuessConf);
       562  3
               collected.add(match);
       563  
       
       563  24
               Collections.sort(collected);
       564  24
               final IdentifierConfidence bestIdentifierQuality = collected.get(0).getConfidence();
       565  24
               final Confidence bestEvidenceQuality = collected.get(0).getEvidenceConfidence();
       566  24
               boolean identifierAdded = false;
       567  24
               for (IdentifierMatch m : collected) {
       568  88
                   if (bestIdentifierQuality.equals(m.getConfidence())
       569  
       564  3
               Collections.sort(collected);
       565  3
               final IdentifierConfidence bestIdentifierQuality = collected.get(0).getConfidence();
       566  3
               final Confidence bestEvidenceQuality = collected.get(0).getEvidenceConfidence();
       567  3
               boolean identifierAdded = false;
       568  3
               for (IdentifierMatch m : collected) {
       569  11
                   if (bestIdentifierQuality.equals(m.getConfidence())
       570  
                           && bestEvidenceQuality.equals(m.getEvidenceConfidence())) {
       570  24
                       final Identifier i = m.getIdentifier();
       571  24
                       if (bestIdentifierQuality == IdentifierConfidence.BEST_GUESS) {
       572  8
                           i.setConfidence(Confidence.LOW);
       573  
       571  3
                       final Identifier i = m.getIdentifier();
       572  3
                       if (bestIdentifierQuality == IdentifierConfidence.BEST_GUESS) {
       573  1
                           i.setConfidence(Confidence.LOW);
       574  
                       } else {
       574  16
                           i.setConfidence(bestEvidenceQuality);
       575  
       575  2
                           i.setConfidence(bestEvidenceQuality);
       576  
                       }
       576  24
                       dependency.addIdentifier(i);
       577  24
                       identifierAdded = true;
       578  
       577  3
                       dependency.addIdentifier(i);
       578  3
                       identifierAdded = true;
       579  
                   }
       579  88
               }
       580  24
               return identifierAdded;
       581  
           }
       580  11
               }
       581  3
               return identifierAdded;
       582  
       
           }
       583  
           /**
       
       584  
            * The confidence whether the identifier is an exact match, or a best guess.
       585  
            */
       586  32
           private enum IdentifierConfidence {
       587  
       
       588  
               /**
       589  
                * An exact match for the CPE.
       590  
                */
       591  8
               EXACT_MATCH,
       592  
               /**
       593  
                * A best guess for the CPE.
       594  
                */
       595  8
               BEST_GUESS,
       596  
               /**
       597  
                * The entire vendor/product group must be added (without a guess at version) because there is a CVE with a VS that only
       598  
                * specifies vendor/product.
       599  
                */
       600  8
               BROAD_MATCH
       601  
           }
       602  
       
       603  
           /**
       604  
            * A simple object to hold an identifier and carry information about the confidence in the identifier.
       605  
       585  
            * The confidence whether the identifier is an exact match, or a best guess.
       586  
            */
       606  64
           private static class IdentifierMatch implements Comparable<IdentifierMatch> {
       607  
       587  4
           private enum IdentifierConfidence {
       588  
       
       608  
       589  
               /**
       609  
                * Constructs an IdentifierMatch.
       610  
                *
       611  
                * @param type the type of identifier (such as CPE)
       612  
                * @param value the value of the identifier
       613  
                * @param url the URL of the identifier
       614  
                * @param identifierConfidence the confidence in the identifier: best guess or exact match
       615  
                * @param evidenceConfidence the confidence of the evidence used to find the identifier
       616  
       590  
                * An exact match for the CPE.
       591  
                */
       617  88
               IdentifierMatch(String type, String value, String url, IdentifierConfidence identifierConfidence, Confidence evidenceConfidence) {
       618  88
                   this.identifier = new Identifier(type, value, url);
       619  88
                   this.confidence = identifierConfidence;
       620  88
                   this.evidenceConfidence = evidenceConfidence;
       621  88
               }
       622  
               //<editor-fold defaultstate="collapsed" desc="Property implementations: evidenceConfidence, confidence, identifier">
       623  
       592  1
               EXACT_MATCH,
       593  
               /**
       624  
                * The confidence in the evidence used to identify this match.
       625  
       594  
                * A best guess for the CPE.
       595  
                */
       626  
               private Confidence evidenceConfidence;
       627  
       
       628  
       596  1
               BEST_GUESS,
       597  
               /**
       629  
                * Get the value of evidenceConfidence
       630  
                *
       631  
                * @return the value of evidenceConfidence
       632  
       598  
                * The entire vendor/product group must be added (without a guess at version) because there is a CVE with a VS that only
       599  
                * specifies vendor/product.
       600  
                */
       633  
               public Confidence getEvidenceConfidence() {
       634  96
                   return evidenceConfidence;
       635  
               }
       636  
       
       637  
               /**
       638  
                * Set the value of evidenceConfidence
       639  
                *
       640  
                * @param evidenceConfidence new value of evidenceConfidence
       641  
                */
       642  
               public void setEvidenceConfidence(Confidence evidenceConfidence) {
       643  0
                   this.evidenceConfidence = evidenceConfidence;
       644  0
               }
       645  
               /**
       646  
                * The confidence whether this is an exact match, or a best guess.
       647  
                */
       648  
               private IdentifierConfidence confidence;
       649  
       
       650  
               /**
       651  
                * Get the value of confidence.
       652  
                *
       653  
                * @return the value of confidence
       654  
                */
       655  
               public IdentifierConfidence getConfidence() {
       656  112
                   return confidence;
       657  
               }
       658  
       
       659  
               /**
       660  
                * Set the value of confidence.
       661  
                *
       662  
                * @param confidence new value of confidence
       663  
                */
       664  
               public void setConfidence(IdentifierConfidence confidence) {
       665  0
                   this.confidence = confidence;
       666  0
               }
       667  
               /**
       668  
                * The CPE identifier.
       669  
                */
       670  
               private Identifier identifier;
       671  
       
       672  
               /**
       673  
                * Get the value of identifier.
       674  
                *
       675  
                * @return the value of identifier
       676  
                */
       677  
               public Identifier getIdentifier() {
       678  24
                   return identifier;
       679  
               }
       680  
       
       681  
               /**
       682  
                * Set the value of identifier.
       683  
                *
       684  
                * @param identifier new value of identifier
       685  
                */
       686  
               public void setIdentifier(Identifier identifier) {
       687  0
                   this.identifier = identifier;
       688  0
               }
       689  
               //</editor-fold>
       690  
               //<editor-fold defaultstate="collapsed" desc="Standard implementations of toString, hashCode, and equals">
       691  
       
       692  
               /**
       693  
                * Standard toString() implementation.
       694  
                *
       695  
                * @return the string representation of the object
       696  
                */
       697  
               @Override
       698  
               public String toString() {
       699  0
                   return "IdentifierMatch{" + "evidenceConfidence=" + evidenceConfidence
       700  
                           + ", confidence=" + confidence + ", identifier=" + identifier + '}';
       701  
               }
       702  
       
       703  
               /**
       704  
                * Standard hashCode() implementation.
       705  
                *
       706  
                * @return the hashCode
       707  
                */
       708  
               @Override
       709  
               public int hashCode() {
       710  0
                   int hash = 5;
       711  0
                   hash = 97 * hash + (this.evidenceConfidence != null ? this.evidenceConfidence.hashCode() : 0);
       712  0
                   hash = 97 * hash + (this.confidence != null ? this.confidence.hashCode() : 0);
       713  0
                   hash = 97 * hash + (this.identifier != null ? this.identifier.hashCode() : 0);
       714  0
                   return hash;
       715  
               }
       716  
       
       717  
               /**
       718  
                * Standard equals implementation.
       719  
                *
       720  
                * @param obj the object to compare
       721  
                * @return true if the objects are equal, otherwise false
       722  
                */
       723  
               @Override
       724  
               public boolean equals(Object obj) {
       725  0
                   if (obj == null) {
       726  0
                       return false;
       727  
                   }
       728  0
                   if (getClass() != obj.getClass()) {
       729  0
                       return false;
       730  
                   }
       731  0
                   final IdentifierMatch other = (IdentifierMatch) obj;
       732  0
                   if (this.evidenceConfidence != other.evidenceConfidence) {
       733  0
                       return false;
       734  
                   }
       735  0
                   if (this.confidence != other.confidence) {
       736  0
                       return false;
       737  
                   }
       738  0
                   if (this.identifier != other.identifier && (this.identifier == null || !this.identifier.equals(other.identifier))) {
       739  0
                       return false;
       740  
                   }
       741  0
                   return true;
       742  
               }
       743  
               //</editor-fold>
       744  
       
       745  
               /**
       746  
                * Standard implementation of compareTo that compares identifier confidence, evidence confidence, and then the identifier.
       747  
                *
       748  
                * @param o the IdentifierMatch to compare to
       749  
                * @return the natural ordering of IdentifierMatch
       750  
                */
       751  
               @Override
       752  
               public int compareTo(IdentifierMatch o) {
       753  64
                   int conf = this.confidence.compareTo(o.confidence);
       754  64
                   if (conf == 0) {
       755  48
                       conf = this.evidenceConfidence.compareTo(o.evidenceConfidence);
       756  48
                       if (conf == 0) {
       757  16
                           conf = identifier.compareTo(o.identifier);
       758  
                       }
       759  
                   }
       760  64
                   return conf;
       761  
               }
       762  
       601  1
               BROAD_MATCH
       602  
           }
       603  
       
       604  
           /**
       605  
            * A simple object to hold an identifier and carry information about the confidence in the identifier.
       606  
            */
       607  8
           private static class IdentifierMatch implements Comparable<IdentifierMatch> {
       608  
       
       609  
               /**
       610  
                * Constructs an IdentifierMatch.
       611  
                *
       612  
                * @param type the type of identifier (such as CPE)
       613  
                * @param value the value of the identifier
       614  
                * @param url the URL of the identifier
       615  
                * @param identifierConfidence the confidence in the identifier: best guess or exact match
       616  
                * @param evidenceConfidence the confidence of the evidence used to find the identifier
       617  
                */
       618  11
               IdentifierMatch(String type, String value, String url, IdentifierConfidence identifierConfidence, Confidence evidenceConfidence) {
       619  11
                   this.identifier = new Identifier(type, value, url);
       620  11
                   this.confidence = identifierConfidence;
       621  11
                   this.evidenceConfidence = evidenceConfidence;
       622  11
               }
       623  
               //<editor-fold defaultstate="collapsed" desc="Property implementations: evidenceConfidence, confidence, identifier">
       624  
               /**
       625  
                * The confidence in the evidence used to identify this match.
       626  
                */
       627  
               private Confidence evidenceConfidence;
       628  
       
       629  
               /**
       630  
                * Get the value of evidenceConfidence
       631  
                *
       632  
                * @return the value of evidenceConfidence
       633  
                */
       634  
               public Confidence getEvidenceConfidence() {
       635  12
                   return evidenceConfidence;
       636  
               }
       637  
       
       638  
               /**
       639  
                * Set the value of evidenceConfidence
       640  
                *
       641  
                * @param evidenceConfidence new value of evidenceConfidence
       642  
                */
       643  
               public void setEvidenceConfidence(Confidence evidenceConfidence) {
       644  0
                   this.evidenceConfidence = evidenceConfidence;
       645  0
               }
       646  
               /**
       647  
                * The confidence whether this is an exact match, or a best guess.
       648  
                */
       649  
               private IdentifierConfidence confidence;
       650  
       
       651  
               /**
       652  
                * Get the value of confidence.
       653  
                *
       654  
                * @return the value of confidence
       655  
                */
       656  
               public IdentifierConfidence getConfidence() {
       657  14
                   return confidence;
       658  
               }
       659  
       
       660  
               /**
       661  
                * Set the value of confidence.
       662  
                *
       663  
                * @param confidence new value of confidence
       664  
                */
       665  
               public void setConfidence(IdentifierConfidence confidence) {
       666  0
                   this.confidence = confidence;
       667  0
               }
       668  
               /**
       669  
                * The CPE identifier.
       670  
                */
       671  
               private Identifier identifier;
       672  
       
       673  
               /**
       674  
                * Get the value of identifier.
       675  
                *
       676  
                * @return the value of identifier
       677  
                */
       678  
               public Identifier getIdentifier() {
       679  3
                   return identifier;
       680  
               }
       681  
       
       682  
               /**
       683  
                * Set the value of identifier.
       684  
                *
       685  
                * @param identifier new value of identifier
       686  
                */
       687  
               public void setIdentifier(Identifier identifier) {
       688  0
                   this.identifier = identifier;
       689  0
               }
       690  
               //</editor-fold>
       691  
               //<editor-fold defaultstate="collapsed" desc="Standard implementations of toString, hashCode, and equals">
       692  
       
       693  
               /**
       694  
                * Standard toString() implementation.
       695  
                *
       696  
                * @return the string representation of the object
       697  
                */
       698  
               @Override
       699  
               public String toString() {
       700  0
                   return "IdentifierMatch{" + "evidenceConfidence=" + evidenceConfidence
       701  
                           + ", confidence=" + confidence + ", identifier=" + identifier + '}';
       702  
               }
       703  
       
       704  
               /**
       705  
                * Standard hashCode() implementation.
       706  
                *
       707  
                * @return the hashCode
       708  
                */
       709  
               @Override
       710  
               public int hashCode() {
       711  0
                   int hash = 5;
       712  0
                   hash = 97 * hash + (this.evidenceConfidence != null ? this.evidenceConfidence.hashCode() : 0);
       713  0
                   hash = 97 * hash + (this.confidence != null ? this.confidence.hashCode() : 0);
       714  0
                   hash = 97 * hash + (this.identifier != null ? this.identifier.hashCode() : 0);
       715  0
                   return hash;
       716  
               }
       717  
       
       718  
               /**
       719  
                * Standard equals implementation.
       720  
                *
       721  
                * @param obj the object to compare
       722  
                * @return true if the objects are equal, otherwise false
       723  
                */
       724  
               @Override
       725  
               public boolean equals(Object obj) {
       726  0
                   if (obj == null) {
       727  0
                       return false;
       728  
                   }
       729  0
                   if (getClass() != obj.getClass()) {
       730  0
                       return false;
       731  
                   }
       732  0
                   final IdentifierMatch other = (IdentifierMatch) obj;
       733  0
                   if (this.evidenceConfidence != other.evidenceConfidence) {
       734  0
                       return false;
       735  
                   }
       736  0
                   if (this.confidence != other.confidence) {
       737  0
                       return false;
       738  
                   }
       739  0
                   if (this.identifier != other.identifier && (this.identifier == null || !this.identifier.equals(other.identifier))) {
       740  0
                       return false;
       741  
                   }
       742  0
                   return true;
       743  
               }
       744  
               //</editor-fold>
       745  
       
       746  
               /**
       747  
                * Standard implementation of compareTo that compares identifier confidence, evidence confidence, and then the identifier.
       748  
                *
       749  
                * @param o the IdentifierMatch to compare to
       750  
                * @return the natural ordering of IdentifierMatch
       751  
                */
       752  
               @Override
       753  
               public int compareTo(IdentifierMatch o) {
       754  8
                   int conf = this.confidence.compareTo(o.confidence);
       755  8
                   if (conf == 0) {
       756  6
                       conf = this.evidenceConfidence.compareTo(o.evidenceConfidence);
       757  6
                       if (conf == 0) {
       758  2
                           conf = identifier.compareTo(o.identifier);
       759  
                       }
       760  
                   }
       761  8
                   return conf;
       762  
               }
       763  
           }
       764  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CentralAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CentralAnalyzer.html index 2e0a465ad..3e5ee81ec 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CentralAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CentralAnalyzer.html @@ -115,7 +115,7 @@
        * @author colezlaw
       49  
        */
      -  50  24
       public class CentralAnalyzer extends AbstractFileTypeAnalyzer {
      +  50  4
       public class CentralAnalyzer extends AbstractFileTypeAnalyzer {
       51  
       
       52   @@ -124,7 +124,7 @@
            * The logger.
       54  
            */
      -  55  8
           private static final Logger LOGGER = LoggerFactory.getLogger(CentralAnalyzer.class);
      +  55  1
           private static final Logger LOGGER = LoggerFactory.getLogger(CentralAnalyzer.class);
       56  
       
       57   @@ -143,7 +143,7 @@
            * The phase in which this analyzer runs.
       64  
            */
      -  65  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
      +  65  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
       66  
       
       67   @@ -162,7 +162,7 @@
            * The analyzer should be disabled if there are errors, so this is a flag to determine if such an error has occurred.
       74  
            */
      -  75  24
           private boolean errorFlag = false;
      +  75  4
           private boolean errorFlag = false;
       76  
       
       77   @@ -179,7 +179,7 @@
            * Field indicating if the analyzer is enabled.
       83  
            */
      -  84  24
           private final boolean enabled = checkEnabled();
      +  84  4
           private final boolean enabled = checkEnabled();
       85  
       
       86   @@ -213,17 +213,17 @@
            */
       101  
           private boolean checkEnabled() {
      -  102  24
               boolean retval = false;
      +  102  4
               boolean retval = false;
       103  
       
       104  
               try {
      -  105  24
                   if (Settings.getBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED)) {
      -  106  16
                       if (!Settings.getBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED)
      +  105  4
                   if (Settings.getBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED)) {
      +  106  3
                       if (!Settings.getBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED)
       107  
                               || NexusAnalyzer.DEFAULT_URL.equals(Settings.getString(Settings.KEYS.ANALYZER_NEXUS_URL))) {
      -  108  16
                           LOGGER.debug("Enabling the Central analyzer");
      -  109  16
                           retval = true;
      +  108  3
                           LOGGER.debug("Enabling the Central analyzer");
      +  109  3
                           retval = true;
       110  
                       } else {
       111  0
                           LOGGER.info("Nexus analyzer is enabled, disabling the Central Analyzer");
      @@ -231,13 +231,13 @@
                       }
       113  
                   } else {
      -  114  8
                       LOGGER.info("Central analyzer disabled");
      +  114  1
                       LOGGER.info("Central analyzer disabled");
       115  
                   }
       116  0
               } catch (InvalidSettingException ise) {
       117  0
                   LOGGER.warn("Invalid setting. Disabling the Central analyzer");
      -  118  24
               }
      -  119  24
               return retval;
      +  118  4
               }
      +  119  4
               return retval;
       120  
           }
       121   @@ -281,7 +281,7 @@
           @Override
       144  
           public String getName() {
      -  145  32
               return ANALYZER_NAME;
      +  145  4
               return ANALYZER_NAME;
       146  
           }
       147   @@ -300,7 +300,7 @@
           @Override
       154  
           protected String getAnalyzerEnabledSettingKey() {
      -  155  24
               return Settings.KEYS.ANALYZER_CENTRAL_ENABLED;
      +  155  4
               return Settings.KEYS.ANALYZER_CENTRAL_ENABLED;
       156  
           }
       157   @@ -319,7 +319,7 @@
           @Override
       164  
           public AnalysisPhase getAnalysisPhase() {
      -  165  16
               return ANALYSIS_PHASE;
      +  165  3
               return ANALYSIS_PHASE;
       166  
           }
       167   @@ -330,14 +330,14 @@
            * The file filter used to determine which files this analyzer supports.
       170  
            */
      -  171  8
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(SUPPORTED_EXTENSIONS).build();
      +  171  1
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(SUPPORTED_EXTENSIONS).build();
       172  
       
       173  
           @Override
       174  
           protected FileFilter getFileFilter() {
      -  175  6824
               return FILTER;
      +  175  853
               return FILTER;
       176  
           }
       177   @@ -429,6 +429,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.ComposerLockAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.ComposerLockAnalyzer.html new file mode 100644 index 000000000..a19e8c4cb --- /dev/null +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.ComposerLockAnalyzer.html @@ -0,0 +1,311 @@ + + + + +Coverage Report + + + + +
      Coverage Report - org.owasp.dependencycheck.analyzer.ComposerLockAnalyzer
      +
       
      + + + + +
      Classes in this File Line Coverage Branch Coverage Complexity
      ComposerLockAnalyzer
      83%
      31/37
      75%
      3/4
      1.833
      +
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       1  
       /*
       2  
        * This file is part of dependency-check-core.
       3  
        *
       4  
        * Licensed under the Apache License, Version 2.0 (the "License");
       5  
        * you may not use this file except in compliance with the License.
       6  
        * You may obtain a copy of the License at
       7  
        *
       8  
        *     http://www.apache.org/licenses/LICENSE-2.0
       9  
        *
       10  
        * Unless required by applicable law or agreed to in writing, software
       11  
        * distributed under the License is distributed on an "AS IS" BASIS,
       12  
        * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       13  
        * See the License for the specific language governing permissions and
       14  
        * limitations under the License.
       15  
        *
       16  
        * Copyright (c) 2015 The OWASP Foundation. All Rights Reserved.
       17  
        */
       18  
       package org.owasp.dependencycheck.analyzer;
       19  
       
       20  
       import org.owasp.dependencycheck.Engine;
       21  
       import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
       22  
       import org.owasp.dependencycheck.data.composer.ComposerDependency;
       23  
       import org.owasp.dependencycheck.data.composer.ComposerException;
       24  
       import org.owasp.dependencycheck.data.composer.ComposerLockParser;
       25  
       import org.owasp.dependencycheck.dependency.Confidence;
       26  
       import org.owasp.dependencycheck.dependency.Dependency;
       27  
       import org.owasp.dependencycheck.utils.Checksum;
       28  
       import org.owasp.dependencycheck.utils.FileFilterBuilder;
       29  
       import org.owasp.dependencycheck.utils.Settings;
       30  
       import org.slf4j.Logger;
       31  
       import org.slf4j.LoggerFactory;
       32  
       
       33  
       import java.io.FileFilter;
       34  
       import java.io.FileInputStream;
       35  
       import java.io.FileNotFoundException;
       36  
       import java.nio.charset.Charset;
       37  
       import java.security.MessageDigest;
       38  
       
       39  
       /**
       40  
        * Used to analyze a composer.lock file for a composer PHP app.
       41  
        *
       42  
        * @author colezlaw
       43  
        */
       44  7
       public class ComposerLockAnalyzer extends AbstractFileTypeAnalyzer {
       45  
       
       46  
           /**
       47  
            * The logger
       48  
            */
       49  1
           private static final Logger LOGGER = LoggerFactory.getLogger(ComposerLockAnalyzer.class);
       50  
       
       51  
           /**
       52  
            * The analyzer name
       53  
            */
       54  
           private static final String ANALYZER_NAME = "Composer.lock analyzer";
       55  
       
       56  
           /**
       57  
            * composer.json
       58  
            */
       59  
           private static final String COMPOSER_LOCK = "composer.lock";
       60  
       
       61  
           /**
       62  
            * The FileFilter
       63  
            */
       64  1
           private static final FileFilter FILE_FILTER = FileFilterBuilder.newInstance().addFilenames(COMPOSER_LOCK).build();
       65  
       
       66  
           /**
       67  
            * Returns the FileFilter
       68  
            *
       69  
            * @return the FileFilter
       70  
            */
       71  
           @Override
       72  
           protected FileFilter getFileFilter() {
       73  854
               return FILE_FILTER;
       74  
           }
       75  
       
       76  
           /**
       77  
            * Initializes the analyzer
       78  
            *
       79  
            * @throws Exception
       80  
            */
       81  
           @Override
       82  
           protected void initializeFileTypeAnalyzer() throws Exception {
       83  3
               sha1 = MessageDigest.getInstance("SHA1");
       84  3
           }
       85  
       
       86  
           /**
       87  
            * The MessageDigest for calculating a new digest for the new dependencies added
       88  
            */
       89  7
           private MessageDigest sha1 = null;
       90  
       
       91  
           /**
       92  
            * Entry point for the analyzer.
       93  
            *
       94  
            * @param dependency the dependency to analyze
       95  
            * @param engine the engine scanning
       96  
            * @throws AnalysisException if there's a failure during analysis
       97  
            */
       98  
           @Override
       99  
           protected void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
       100  1
               FileInputStream fis = null;
       101  
               try {
       102  1
                   fis = new FileInputStream(dependency.getActualFile());
       103  1
                   final ComposerLockParser clp = new ComposerLockParser(fis);
       104  1
                   LOGGER.info("Checking composer.lock file {}", dependency.getActualFilePath());
       105  1
                   clp.process();
       106  1
                   for (ComposerDependency dep : clp.getDependencies()) {
       107  30
                       final Dependency d = new Dependency(dependency.getActualFile());
       108  30
                       d.setDisplayFileName(String.format("%s:%s/%s", dependency.getDisplayFileName(), dep.getGroup(), dep.getProject()));
       109  30
                       final String filePath = String.format("%s:%s/%s", dependency.getFilePath(), dep.getGroup(), dep.getProject());
       110  30
                       d.setFilePath(filePath);
       111  30
                       d.setSha1sum(Checksum.getHex(sha1.digest(filePath.getBytes(Charset.defaultCharset()))));
       112  30
                       d.getVendorEvidence().addEvidence(COMPOSER_LOCK, "vendor", dep.getGroup(), Confidence.HIGHEST);
       113  30
                       d.getProductEvidence().addEvidence(COMPOSER_LOCK, "product", dep.getProject(), Confidence.HIGHEST);
       114  30
                       d.getVersionEvidence().addEvidence(COMPOSER_LOCK, "version", dep.getVersion(), Confidence.HIGHEST);
       115  30
                       LOGGER.info("Adding dependency {}", d);
       116  30
                       engine.getDependencies().add(d);
       117  30
                   }
       118  0
               } catch (FileNotFoundException fnfe) {
       119  0
                   LOGGER.warn("Error opening dependency {}", dependency.getActualFilePath());
       120  0
               } catch (ComposerException ce) {
       121  0
                   LOGGER.warn("Error parsing composer.json {}", dependency.getActualFilePath(), ce);
       122  
               } finally {
       123  1
                   if (fis != null) {
       124  
                       try {
       125  1
                           fis.close();
       126  0
                       } catch (Exception e) {
       127  0
                           LOGGER.debug("Unable to close file", e);
       128  1
                       }
       129  
                   }
       130  
               }
       131  1
           }
       132  
       
       133  
           /**
       134  
            * Gets the key to determine whether the analyzer is enabled.
       135  
            *
       136  
            * @return the key specifying whether the analyzer is enabled
       137  
            */
       138  
           @Override
       139  
           protected String getAnalyzerEnabledSettingKey() {
       140  7
               return Settings.KEYS.ANALYZER_COMPOSER_LOCK_ENABLED;
       141  
           }
       142  
       
       143  
           /**
       144  
            * Returns the analyzer's name.
       145  
            *
       146  
            * @return the analyzer's name
       147  
            */
       148  
           @Override
       149  
           public String getName() {
       150  5
               return ANALYZER_NAME;
       151  
           }
       152  
       
       153  
           /**
       154  
            * Returns the phase this analyzer should run under.
       155  
            *
       156  
            * @return the analysis phase
       157  
            */
       158  
           @Override
       159  
           public AnalysisPhase getAnalysisPhase() {
       160  3
               return AnalysisPhase.INFORMATION_COLLECTION;
       161  
           }
       162  
       }
      + + + + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CpeSuppressionAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CpeSuppressionAnalyzer.html index 82b8c18c2..ac78298c1 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CpeSuppressionAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.CpeSuppressionAnalyzer.html @@ -77,7 +77,7 @@
        * @author Jeremy Long
       30  
        */
      -  31  24
       public class CpeSuppressionAnalyzer extends AbstractSuppressionAnalyzer {
      +  31  4
       public class CpeSuppressionAnalyzer extends AbstractSuppressionAnalyzer {
       32  
       
       33   @@ -96,7 +96,7 @@
            * The phase that this analyzer is intended to run in.
       40  
            */
      -  41  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.POST_IDENTIFIER_ANALYSIS;
      +  41  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.POST_IDENTIFIER_ANALYSIS;
       42  
       
       43   @@ -113,7 +113,7 @@
           @Override
       49  
           public String getName() {
      -  50  32
               return ANALYZER_NAME;
      +  50  4
               return ANALYZER_NAME;
       51  
           }
       52   @@ -132,7 +132,7 @@
           @Override
       59  
           public AnalysisPhase getAnalysisPhase() {
      -  60  16
               return ANALYSIS_PHASE;
      +  60  3
               return ANALYSIS_PHASE;
       61  
           }
       62   @@ -145,20 +145,20 @@
           public void analyze(final Dependency dependency, final Engine engine) throws AnalysisException {
       66  
       
      -  67  16
               if (getRules() == null || getRules().size() <= 0) {
      +  67  2
               if (getRules() == null || getRules().size() <= 0) {
       68  0
                   return;
       69  
               }
       70  
       
      -  71  16
               for (final SuppressionRule rule : getRules()) {
      -  72  304
                   rule.process(dependency);
      -  73  304
               }
      -  74  16
           }
      +  71  2
               for (final SuppressionRule rule : getRules()) {
      +  72  40
                   rule.process(dependency);
      +  73  40
               }
      +  74  2
           }
       75  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.DependencyBundlingAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.DependencyBundlingAnalyzer.html index c22cc38a7..16361e26a 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.DependencyBundlingAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.DependencyBundlingAnalyzer.html @@ -107,7 +107,7 @@
        * @author Jeremy Long
       45  
        */
      -  46  56
       public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Analyzer {
      +  46  8
       public class DependencyBundlingAnalyzer extends AbstractAnalyzer implements Analyzer {
       47  
       
       48   @@ -116,7 +116,7 @@
            * The Logger.
       50  
            */
      -  51  8
           private static final Logger LOGGER = LoggerFactory.getLogger(DependencyBundlingAnalyzer.class);
      +  51  1
           private static final Logger LOGGER = LoggerFactory.getLogger(DependencyBundlingAnalyzer.class);
       52  
       
       53   @@ -127,14 +127,14 @@
            * A pattern for obtaining the first part of a filename.
       56  
            */
      -  57  8
           private static final Pattern STARTING_TEXT_PATTERN = Pattern.compile("^[a-zA-Z0-9]*");
      +  57  1
           private static final Pattern STARTING_TEXT_PATTERN = Pattern.compile("^[a-zA-Z0-9]*");
       58  
           /**
       59  
            * a flag indicating if this analyzer has run. This analyzer only runs once.
       60  
            */
      -  61  56
           private boolean analyzed = false;
      +  61  8
           private boolean analyzed = false;
       62  
           //</editor-fold>
       63   @@ -153,7 +153,7 @@
            * The phase that this analyzer is intended to run in.
       70  
            */
      -  71  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.PRE_FINDING_ANALYSIS;
      +  71  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.PRE_FINDING_ANALYSIS;
       72  
       
       73   @@ -167,566 +167,570 @@  77  
            */
       78   -
           public String getName() {
      -  79  40
               return ANALYZER_NAME;
      -  80   -
           }
      -  81   -
       
      -  82   -
           /**
      -  83   -
            * Returns the phase that the analyzer is intended to run in.
      -  84   -
            *
      -  85   -
            * @return the phase that the analyzer is intended to run in.
      -  86   -
            */
      -  87   -
           public AnalysisPhase getAnalysisPhase() {
      -  88  24
               return ANALYSIS_PHASE;
      -  89   -
           }
      -  90   -
           //</editor-fold>
      -  91   -
       
      -  92   -
           /**
      -  93   -
            * Analyzes a set of dependencies. If they have been found to have the same base path and the same set of identifiers they are
      -  94   -
            * likely related. The related dependencies are bundled into a single reportable item.
      -  95   -
            *
      -  96   -
            * @param ignore this analyzer ignores the dependency being analyzed
      -  97   -
            * @param engine the engine that is scanning the dependencies
      -  98   -
            * @throws AnalysisException is thrown if there is an error reading the JAR file.
      -  99   -
            */
      -  100  
           @Override
      +  79   +
           public String getName() {
      +  80  5
               return ANALYZER_NAME;
      +  81   +
           }
      +  82   +
       
      +  83   +
           /**
      +  84   +
            * Returns the phase that the analyzer is intended to run in.
      +  85   +
            *
      +  86   +
            * @return the phase that the analyzer is intended to run in.
      +  87   +
            */
      +  88   +
           @Override
      +  89   +
           public AnalysisPhase getAnalysisPhase() {
      +  90  4
               return ANALYSIS_PHASE;
      +  91   +
           }
      +  92   +
           //</editor-fold>
      +  93   +
       
      +  94   +
           /**
      +  95   +
            * Analyzes a set of dependencies. If they have been found to have the same base path and the same set of identifiers they are
      +  96   +
            * likely related. The related dependencies are bundled into a single reportable item.
      +  97   +
            *
      +  98   +
            * @param ignore this analyzer ignores the dependency being analyzed
      +  99   +
            * @param engine the engine that is scanning the dependencies
      +  100   +
            * @throws AnalysisException is thrown if there is an error reading the JAR file.
       101   +
            */
      +  102   +
           @Override
      +  103  
           public void analyze(Dependency ignore, Engine engine) throws AnalysisException {
      -  102  16
               if (!analyzed) {
      -  103  8
                   analyzed = true;
      -  104  8
                   final Set<Dependency> dependenciesToRemove = new HashSet<Dependency>();
      -  105  8
                   final ListIterator<Dependency> mainIterator = engine.getDependencies().listIterator();
      -  106   +  104  2
               if (!analyzed) {
      +  105  1
                   analyzed = true;
      +  106  1
                   final Set<Dependency> dependenciesToRemove = new HashSet<Dependency>();
      +  107  1
                   final ListIterator<Dependency> mainIterator = engine.getDependencies().listIterator();
      +  108  
                   //for (Dependency nextDependency : engine.getDependencies()) {
      -  107  24
                   while (mainIterator.hasNext()) {
      -  108  16
                       final Dependency dependency = mainIterator.next();
      -  109  16
                       if (mainIterator.hasNext() && !dependenciesToRemove.contains(dependency)) {
      -  110  8
                           final ListIterator<Dependency> subIterator = engine.getDependencies().listIterator(mainIterator.nextIndex());
      -  111  16
                           while (subIterator.hasNext()) {
      -  112  8
                               final Dependency nextDependency = subIterator.next();
      -  113  8
                               if (hashesMatch(dependency, nextDependency) && !containedInWar(dependency.getFilePath())
      -  114   +  109  3
                   while (mainIterator.hasNext()) {
      +  110  2
                       final Dependency dependency = mainIterator.next();
      +  111  2
                       if (mainIterator.hasNext() && !dependenciesToRemove.contains(dependency)) {
      +  112  1
                           final ListIterator<Dependency> subIterator = engine.getDependencies().listIterator(mainIterator.nextIndex());
      +  113  2
                           while (subIterator.hasNext()) {
      +  114  1
                               final Dependency nextDependency = subIterator.next();
      +  115  1
                               if (hashesMatch(dependency, nextDependency) && !containedInWar(dependency.getFilePath())
      +  116  
                                       && !containedInWar(nextDependency.getFilePath())) {
      -  115  0
                                   if (firstPathIsShortest(dependency.getFilePath(), nextDependency.getFilePath())) {
      -  116  0
                                       mergeDependencies(dependency, nextDependency, dependenciesToRemove);
      -  117   +  117  0
                                   if (firstPathIsShortest(dependency.getFilePath(), nextDependency.getFilePath())) {
      +  118  0
                                       mergeDependencies(dependency, nextDependency, dependenciesToRemove);
      +  119  
                                   } else {
      -  118  0
                                       mergeDependencies(nextDependency, dependency, dependenciesToRemove);
      -  119  0
                                       break; //since we merged into the next dependency - skip forward to the next in mainIterator
      -  120   +  120  0
                                       mergeDependencies(nextDependency, dependency, dependenciesToRemove);
      +  121  0
                                       break; //since we merged into the next dependency - skip forward to the next in mainIterator
      +  122  
                                   }
      -  121  8
                               } else if (isShadedJar(dependency, nextDependency)) {
      -  122  0
                                   if (dependency.getFileName().toLowerCase().endsWith("pom.xml")) {
      -  123  0
                                       mergeDependencies(nextDependency, dependency, dependenciesToRemove);
      -  124  0
                                       nextDependency.getRelatedDependencies().remove(dependency);
      -  125  0
                                       break;
      -  126   +  123  1
                               } else if (isShadedJar(dependency, nextDependency)) {
      +  124  0
                                   if (dependency.getFileName().toLowerCase().endsWith("pom.xml")) {
      +  125  0
                                       mergeDependencies(nextDependency, dependency, dependenciesToRemove);
      +  126  0
                                       nextDependency.getRelatedDependencies().remove(dependency);
      +  127  0
                                       break;
      +  128  
                                   } else {
      -  127  0
                                       mergeDependencies(dependency, nextDependency, dependenciesToRemove);
      -  128  0
                                       dependency.getRelatedDependencies().remove(nextDependency);
      -  129   -
                                   }
      -  130  8
                               } else if (cpeIdentifiersMatch(dependency, nextDependency)
      +  129  0
                                       mergeDependencies(dependency, nextDependency, dependenciesToRemove);
      +  130  0
                                       dependency.getRelatedDependencies().remove(nextDependency);
       131   -
                                       && hasSameBasePath(dependency, nextDependency)
      -  132   -
                                       && fileNameMatch(dependency, nextDependency)) {
      -  133  0
                                   if (isCore(dependency, nextDependency)) {
      -  134  0
                                       mergeDependencies(dependency, nextDependency, dependenciesToRemove);
      -  135   -
                                   } else {
      -  136  0
                                       mergeDependencies(nextDependency, dependency, dependenciesToRemove);
      -  137  0
                                       break; //since we merged into the next dependency - skip forward to the next in mainIterator
      -  138  
                                   }
      -  139   -
                               }
      -  140  8
                           }
      +  132  1
                               } else if (cpeIdentifiersMatch(dependency, nextDependency)
      +  133   +
                                       && hasSameBasePath(dependency, nextDependency)
      +  134   +
                                       && fileNameMatch(dependency, nextDependency)) {
      +  135  0
                                   if (isCore(dependency, nextDependency)) {
      +  136  0
                                       mergeDependencies(dependency, nextDependency, dependenciesToRemove);
      +  137   +
                                   } else {
      +  138  0
                                       mergeDependencies(nextDependency, dependency, dependenciesToRemove);
      +  139  0
                                       break; //since we merged into the next dependency - skip forward to the next in mainIterator
      +  140   +
                                   }
       141   -
                       }
      -  142  16
                   }
      +
                               }
      +  142  1
                           }
       143   -
                   //removing dependencies here as ensuring correctness and avoiding ConcurrentUpdateExceptions
      -  144   -
                   // was difficult because of the inner iterator.
      -  145  8
                   engine.getDependencies().removeAll(dependenciesToRemove);
      -  146   -
               }
      -  147  16
           }
      -  148   -
       
      -  149   -
           /**
      -  150   -
            * Adds the relatedDependency to the dependency's related dependencies.
      -  151   -
            *
      -  152   -
            * @param dependency the main dependency
      -  153   -
            * @param relatedDependency a collection of dependencies to be removed from the main analysis loop, this is the source of
      -  154   -
            * dependencies to remove
      -  155   -
            * @param dependenciesToRemove a collection of dependencies that will be removed from the main analysis loop, this function
      -  156   -
            * adds to this collection
      -  157   -
            */
      -  158   -
           private void mergeDependencies(final Dependency dependency, final Dependency relatedDependency, final Set<Dependency> dependenciesToRemove) {
      -  159  0
               dependency.addRelatedDependency(relatedDependency);
      -  160  0
               final Iterator<Dependency> i = relatedDependency.getRelatedDependencies().iterator();
      -  161  0
               while (i.hasNext()) {
      -  162  0
                   dependency.addRelatedDependency(i.next());
      -  163  0
                   i.remove();
      -  164   -
               }
      -  165  0
               if (dependency.getSha1sum().equals(relatedDependency.getSha1sum())) {
      -  166  0
                   dependency.addAllProjectReferences(relatedDependency.getProjectReferences());
      -  167   -
               }
      -  168  0
               dependenciesToRemove.add(relatedDependency);
      -  169  0
           }
      -  170   -
       
      -  171   -
           /**
      -  172   -
            * Attempts to trim a maven repo to a common base path. This is typically [drive]\[repo_location]\repository\[path1]\[path2].
      -  173   -
            *
      -  174   -
            * @param path the path to trim
      -  175   -
            * @return a string representing the base path.
      -  176   -
            */
      -  177   -
           private String getBaseRepoPath(final String path) {
      -  178  0
               int pos = path.indexOf("repository" + File.separator) + 11;
      -  179  0
               if (pos < 0) {
      -  180  0
                   return path;
      -  181   -
               }
      -  182  0
               int tmp = path.indexOf(File.separator, pos);
      -  183  0
               if (tmp <= 0) {
      -  184  0
                   return path;
      -  185   -
               }
      -  186  0
               if (tmp > 0) {
      -  187  0
                   pos = tmp + 1;
      -  188   -
               }
      -  189  0
               tmp = path.indexOf(File.separator, pos);
      -  190  0
               if (tmp > 0) {
      -  191  0
                   pos = tmp + 1;
      -  192   -
               }
      -  193  0
               return path.substring(0, pos);
      -  194   -
           }
      -  195   -
       
      -  196   -
           /**
      -  197   -
            * Returns true if the file names (and version if it exists) of the two dependencies are sufficiently similar.
      -  198   -
            *
      -  199   -
            * @param dependency1 a dependency2 to compare
      -  200   -
            * @param dependency2 a dependency2 to compare
      -  201   -
            * @return true if the identifiers in the two supplied dependencies are equal
      -  202   -
            */
      -  203   -
           private boolean fileNameMatch(Dependency dependency1, Dependency dependency2) {
      -  204  0
               if (dependency1 == null || dependency1.getFileName() == null
      -  205   -
                       || dependency2 == null || dependency2.getFileName() == null) {
      -  206  0
                   return false;
      -  207   -
               }
      -  208  0
               final String fileName1 = dependency1.getActualFile().getName();
      -  209  0
               final String fileName2 = dependency2.getActualFile().getName();
      -  210   -
       
      -  211   -
               //version check
      -  212  0
               final DependencyVersion version1 = DependencyVersionUtil.parseVersion(fileName1);
      -  213  0
               final DependencyVersion version2 = DependencyVersionUtil.parseVersion(fileName2);
      -  214  0
               if (version1 != null && version2 != null) {
      -  215  0
                   if (!version1.equals(version2)) {
      -  216  0
                       return false;
      -  217   -
                   }
      -  218   -
               }
      -  219   -
       
      -  220   -
               //filename check
      -  221  0
               final Matcher match1 = STARTING_TEXT_PATTERN.matcher(fileName1);
      -  222  0
               final Matcher match2 = STARTING_TEXT_PATTERN.matcher(fileName2);
      -  223  0
               if (match1.find() && match2.find()) {
      -  224  0
                   return match1.group().equals(match2.group());
      -  225   -
               }
      -  226   -
       
      -  227  0
               return false;
      -  228   -
           }
      -  229   -
       
      -  230   -
           /**
      -  231   -
            * Returns true if the CPE identifiers in the two supplied dependencies are equal.
      -  232   -
            *
      -  233   -
            * @param dependency1 a dependency2 to compare
      -  234   -
            * @param dependency2 a dependency2 to compare
      -  235   -
            * @return true if the identifiers in the two supplied dependencies are equal
      -  236   -
            */
      -  237   -
           private boolean cpeIdentifiersMatch(Dependency dependency1, Dependency dependency2) {
      -  238  8
               if (dependency1 == null || dependency1.getIdentifiers() == null
      -  239   -
                       || dependency2 == null || dependency2.getIdentifiers() == null) {
      -  240  0
                   return false;
      -  241   -
               }
      -  242  8
               boolean matches = false;
      -  243  8
               int cpeCount1 = 0;
      -  244  8
               int cpeCount2 = 0;
      -  245  8
               for (Identifier i : dependency1.getIdentifiers()) {
      -  246  0
                   if ("cpe".equals(i.getType())) {
      -  247  0
                       cpeCount1 += 1;
      -  248   -
                   }
      -  249  0
               }
      -  250  8
               for (Identifier i : dependency2.getIdentifiers()) {
      -  251  24
                   if ("cpe".equals(i.getType())) {
      -  252  24
                       cpeCount2 += 1;
      -  253   -
                   }
      -  254  24
               }
      -  255  8
               if (cpeCount1 > 0 && cpeCount1 == cpeCount2) {
      -  256  0
                   for (Identifier i : dependency1.getIdentifiers()) {
      -  257  0
                       if ("cpe".equals(i.getType())) {
      -  258  0
                           matches |= dependency2.getIdentifiers().contains(i);
      -  259  0
                           if (!matches) {
      -  260  0
                               break;
      -  261   -
                           }
      -  262  
                       }
      -  263  0
                   }
      +  144  2
                   }
      +  145   +
                   //removing dependencies here as ensuring correctness and avoiding ConcurrentUpdateExceptions
      +  146   +
                   // was difficult because of the inner iterator.
      +  147  1
                   engine.getDependencies().removeAll(dependenciesToRemove);
      +  148   +
               }
      +  149  2
           }
      +  150   +
       
      +  151   +
           /**
      +  152   +
            * Adds the relatedDependency to the dependency's related dependencies.
      +  153   +
            *
      +  154   +
            * @param dependency the main dependency
      +  155   +
            * @param relatedDependency a collection of dependencies to be removed from the main analysis loop, this is the source of
      +  156   +
            * dependencies to remove
      +  157   +
            * @param dependenciesToRemove a collection of dependencies that will be removed from the main analysis loop, this function
      +  158   +
            * adds to this collection
      +  159   +
            */
      +  160   +
           private void mergeDependencies(final Dependency dependency, final Dependency relatedDependency, final Set<Dependency> dependenciesToRemove) {
      +  161  0
               dependency.addRelatedDependency(relatedDependency);
      +  162  0
               final Iterator<Dependency> i = relatedDependency.getRelatedDependencies().iterator();
      +  163  0
               while (i.hasNext()) {
      +  164  0
                   dependency.addRelatedDependency(i.next());
      +  165  0
                   i.remove();
      +  166   +
               }
      +  167  0
               if (dependency.getSha1sum().equals(relatedDependency.getSha1sum())) {
      +  168  0
                   dependency.addAllProjectReferences(relatedDependency.getProjectReferences());
      +  169   +
               }
      +  170  0
               dependenciesToRemove.add(relatedDependency);
      +  171  0
           }
      +  172   +
       
      +  173   +
           /**
      +  174   +
            * Attempts to trim a maven repo to a common base path. This is typically [drive]\[repo_location]\repository\[path1]\[path2].
      +  175   +
            *
      +  176   +
            * @param path the path to trim
      +  177   +
            * @return a string representing the base path.
      +  178   +
            */
      +  179   +
           private String getBaseRepoPath(final String path) {
      +  180  0
               int pos = path.indexOf("repository" + File.separator) + 11;
      +  181  0
               if (pos < 0) {
      +  182  0
                   return path;
      +  183   +
               }
      +  184  0
               int tmp = path.indexOf(File.separator, pos);
      +  185  0
               if (tmp <= 0) {
      +  186  0
                   return path;
      +  187   +
               }
      +  188  0
               if (tmp > 0) {
      +  189  0
                   pos = tmp + 1;
      +  190   +
               }
      +  191  0
               tmp = path.indexOf(File.separator, pos);
      +  192  0
               if (tmp > 0) {
      +  193  0
                   pos = tmp + 1;
      +  194   +
               }
      +  195  0
               return path.substring(0, pos);
      +  196   +
           }
      +  197   +
       
      +  198   +
           /**
      +  199   +
            * Returns true if the file names (and version if it exists) of the two dependencies are sufficiently similar.
      +  200   +
            *
      +  201   +
            * @param dependency1 a dependency2 to compare
      +  202   +
            * @param dependency2 a dependency2 to compare
      +  203   +
            * @return true if the identifiers in the two supplied dependencies are equal
      +  204   +
            */
      +  205   +
           private boolean fileNameMatch(Dependency dependency1, Dependency dependency2) {
      +  206  0
               if (dependency1 == null || dependency1.getFileName() == null
      +  207   +
                       || dependency2 == null || dependency2.getFileName() == null) {
      +  208  0
                   return false;
      +  209   +
               }
      +  210  0
               final String fileName1 = dependency1.getActualFile().getName();
      +  211  0
               final String fileName2 = dependency2.getActualFile().getName();
      +  212   +
       
      +  213   +
               //version check
      +  214  0
               final DependencyVersion version1 = DependencyVersionUtil.parseVersion(fileName1);
      +  215  0
               final DependencyVersion version2 = DependencyVersionUtil.parseVersion(fileName2);
      +  216  0
               if (version1 != null && version2 != null) {
      +  217  0
                   if (!version1.equals(version2)) {
      +  218  0
                       return false;
      +  219   +
                   }
      +  220   +
               }
      +  221   +
       
      +  222   +
               //filename check
      +  223  0
               final Matcher match1 = STARTING_TEXT_PATTERN.matcher(fileName1);
      +  224  0
               final Matcher match2 = STARTING_TEXT_PATTERN.matcher(fileName2);
      +  225  0
               if (match1.find() && match2.find()) {
      +  226  0
                   return match1.group().equals(match2.group());
      +  227   +
               }
      +  228   +
       
      +  229  0
               return false;
      +  230   +
           }
      +  231   +
       
      +  232   +
           /**
      +  233   +
            * Returns true if the CPE identifiers in the two supplied dependencies are equal.
      +  234   +
            *
      +  235   +
            * @param dependency1 a dependency2 to compare
      +  236   +
            * @param dependency2 a dependency2 to compare
      +  237   +
            * @return true if the identifiers in the two supplied dependencies are equal
      +  238   +
            */
      +  239   +
           private boolean cpeIdentifiersMatch(Dependency dependency1, Dependency dependency2) {
      +  240  1
               if (dependency1 == null || dependency1.getIdentifiers() == null
      +  241   +
                       || dependency2 == null || dependency2.getIdentifiers() == null) {
      +  242  0
                   return false;
      +  243   +
               }
      +  244  1
               boolean matches = false;
      +  245  1
               int cpeCount1 = 0;
      +  246  1
               int cpeCount2 = 0;
      +  247  1
               for (Identifier i : dependency1.getIdentifiers()) {
      +  248  0
                   if ("cpe".equals(i.getType())) {
      +  249  0
                       cpeCount1 += 1;
      +  250   +
                   }
      +  251  0
               }
      +  252  1
               for (Identifier i : dependency2.getIdentifiers()) {
      +  253  3
                   if ("cpe".equals(i.getType())) {
      +  254  3
                       cpeCount2 += 1;
      +  255   +
                   }
      +  256  3
               }
      +  257  1
               if (cpeCount1 > 0 && cpeCount1 == cpeCount2) {
      +  258  0
                   for (Identifier i : dependency1.getIdentifiers()) {
      +  259  0
                       if ("cpe".equals(i.getType())) {
      +  260  0
                           matches |= dependency2.getIdentifiers().contains(i);
      +  261  0
                           if (!matches) {
      +  262  0
                               break;
      +  263   +
                           }
       264   +
                       }
      +  265  0
                   }
      +  266  
               }
      -  265  8
               LOGGER.debug("IdentifiersMatch={} ({}, {})", matches, dependency1.getFileName(), dependency2.getFileName());
      -  266  8
               return matches;
      -  267   -
           }
      -  268   -
       
      +  267  1
               LOGGER.debug("IdentifiersMatch={} ({}, {})", matches, dependency1.getFileName(), dependency2.getFileName());
      +  268  1
               return matches;
       269   -
           /**
      +
           }
       270   -
            * Determines if the two dependencies have the same base path.
      +
       
       271   -
            *
      +
           /**
       272   -
            * @param dependency1 a Dependency object
      +
            * Determines if the two dependencies have the same base path.
       273   -
            * @param dependency2 a Dependency object
      +
            *
       274   -
            * @return true if the base paths of the dependencies are identical
      +
            * @param dependency1 a Dependency object
       275   -
            */
      +
            * @param dependency2 a Dependency object
       276   +
            * @return true if the base paths of the dependencies are identical
      +  277   +
            */
      +  278  
           private boolean hasSameBasePath(Dependency dependency1, Dependency dependency2) {
      -  277  0
               if (dependency1 == null || dependency2 == null) {
      -  278  0
                   return false;
      -  279   +  279  0
               if (dependency1 == null || dependency2 == null) {
      +  280  0
                   return false;
      +  281  
               }
      -  280  0
               final File lFile = new File(dependency1.getFilePath());
      -  281  0
               String left = lFile.getParent();
      -  282  0
               final File rFile = new File(dependency2.getFilePath());
      -  283  0
               String right = rFile.getParent();
      -  284  0
               if (left == null) {
      -  285  0
                   return right == null;
      -  286   +  282  0
               final File lFile = new File(dependency1.getFilePath());
      +  283  0
               String left = lFile.getParent();
      +  284  0
               final File rFile = new File(dependency2.getFilePath());
      +  285  0
               String right = rFile.getParent();
      +  286  0
               if (left == null) {
      +  287  0
                   return right == null;
      +  288  
               }
      -  287  0
               if (left.equalsIgnoreCase(right)) {
      -  288  0
                   return true;
      -  289   +  289  0
               if (left.equalsIgnoreCase(right)) {
      +  290  0
                   return true;
      +  291  
               }
      -  290  0
               if (left.matches(".*[/\\\\]repository[/\\\\].*") && right.matches(".*[/\\\\]repository[/\\\\].*")) {
      -  291  0
                   left = getBaseRepoPath(left);
      -  292  0
                   right = getBaseRepoPath(right);
      -  293   +  292  0
               if (left.matches(".*[/\\\\]repository[/\\\\].*") && right.matches(".*[/\\\\]repository[/\\\\].*")) {
      +  293  0
                   left = getBaseRepoPath(left);
      +  294  0
                   right = getBaseRepoPath(right);
      +  295  
               }
      -  294  0
               if (left.equalsIgnoreCase(right)) {
      -  295  0
                   return true;
      -  296   +  296  0
               if (left.equalsIgnoreCase(right)) {
      +  297  0
                   return true;
      +  298  
               }
      -  297   +  299  
               //new code
      -  298  0
               for (Dependency child : dependency2.getRelatedDependencies()) {
      -  299  0
                   if (hasSameBasePath(dependency1, child)) {
      -  300  0
                       return true;
      -  301   +  300  0
               for (Dependency child : dependency2.getRelatedDependencies()) {
      +  301  0
                   if (hasSameBasePath(dependency1, child)) {
      +  302  0
                       return true;
      +  303  
                   }
      -  302  0
               }
      -  303  0
               return false;
      -  304   -
           }
      -  305   -
       
      +  304  0
               }
      +  305  0
               return false;
       306   -
           /**
      +
           }
       307   -
            * This is likely a very broken attempt at determining if the 'left' dependency is the 'core' library in comparison to the
      +
       
       308   -
            * 'right' library.
      +
           /**
       309   -
            *
      +
            * This is likely a very broken attempt at determining if the 'left' dependency is the 'core' library in comparison to the
       310   -
            * @param left the dependency to test
      +
            * 'right' library.
       311   -
            * @param right the dependency to test against
      +
            *
       312   -
            * @return a boolean indicating whether or not the left dependency should be considered the "core" version.
      +
            * @param left the dependency to test
       313   -
            */
      +
            * @param right the dependency to test against
       314   +
            * @return a boolean indicating whether or not the left dependency should be considered the "core" version.
      +  315   +
            */
      +  316  
           boolean isCore(Dependency left, Dependency right) {
      -  315  16
               final String leftName = left.getFileName().toLowerCase();
      -  316  16
               final String rightName = right.getFileName().toLowerCase();
      -  317   +  317  2
               final String leftName = left.getFileName().toLowerCase();
      +  318  2
               final String rightName = right.getFileName().toLowerCase();
      +  319  
       
      -  318   -
               final boolean returnVal;
      -  319  16
               if (!rightName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+") && leftName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+")
       320   +
               final boolean returnVal;
      +  321  2
               if (!rightName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+") && leftName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+")
      +  322  
                       || rightName.contains("core") && !leftName.contains("core")
      -  321   +  323  
                       || rightName.contains("kernel") && !leftName.contains("kernel")) {
      -  322  0
                   returnVal = false;
      -  323  16
               } else if (rightName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+") && !leftName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+")
      -  324   +  324  0
                   returnVal = false;
      +  325  2
               } else if (rightName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+") && !leftName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+")
      +  326  
                       || !rightName.contains("core") && leftName.contains("core")
      -  325   -
                       || !rightName.contains("kernel") && leftName.contains("kernel")) {
      -  326  16
                   returnVal = true;
       327   -
       //        } else if (leftName.matches(".*struts2\\-core.*") && rightName.matches(".*xwork\\-core.*")) {
      -  328   -
       //            returnVal = true;
      +
                       || !rightName.contains("kernel") && leftName.contains("kernel")) {
      +  328  2
                   returnVal = true;
       329   -
       //        } else if (rightName.matches(".*struts2\\-core.*") && leftName.matches(".*xwork\\-core.*")) {
      +
       //        } else if (leftName.matches(".*struts2\\-core.*") && rightName.matches(".*xwork\\-core.*")) {
       330   -
       //            returnVal = false;
      +
       //            returnVal = true;
       331   -
               } else {
      +
       //        } else if (rightName.matches(".*struts2\\-core.*") && leftName.matches(".*xwork\\-core.*")) {
       332   -
                   /*
      +
       //            returnVal = false;
       333   -
                    * considered splitting the names up and comparing the components,
      -  334   -
                    * but decided that the file name length should be sufficient as the
      -  335   -
                    * "core" component, if this follows a normal naming protocol should
      -  336   -
                    * be shorter:
      -  337   -
                    * axis2-saaj-1.4.1.jar
      -  338   -
                    * axis2-1.4.1.jar       <-----
      -  339   -
                    * axis2-kernel-1.4.1.jar
      -  340   -
                    */
      -  341  0
                   returnVal = leftName.length() <= rightName.length();
      -  342   -
               }
      -  343  16
               LOGGER.debug("IsCore={} ({}, {})", returnVal, left.getFileName(), right.getFileName());
      -  344  16
               return returnVal;
      -  345   -
           }
      -  346   -
       
      -  347   -
           /**
      -  348   -
            * Compares the SHA1 hashes of two dependencies to determine if they are equal.
      -  349   -
            *
      -  350   -
            * @param dependency1 a dependency object to compare
      -  351   -
            * @param dependency2 a dependency object to compare
      -  352   -
            * @return true if the sha1 hashes of the two dependencies match; otherwise false
      -  353   -
            */
      -  354   -
           private boolean hashesMatch(Dependency dependency1, Dependency dependency2) {
      -  355  8
               if (dependency1 == null || dependency2 == null || dependency1.getSha1sum() == null || dependency2.getSha1sum() == null) {
      -  356  0
                   return false;
      -  357   -
               }
      -  358  8
               return dependency1.getSha1sum().equals(dependency2.getSha1sum());
      -  359   -
           }
      -  360   -
       
      -  361   -
           /**
      -  362   -
            * Determines if the jar is shaded and the created pom.xml identified the same CPE as the jar - if so, the pom.xml dependency
      -  363   -
            * should be removed.
      -  364   -
            *
      -  365   -
            * @param dependency a dependency to check
      -  366   -
            * @param nextDependency another dependency to check
      -  367   -
            * @return true if on of the dependencies is a pom.xml and the identifiers between the two collections match; otherwise false
      -  368   -
            */
      -  369   -
           private boolean isShadedJar(Dependency dependency, Dependency nextDependency) {
      -  370  8
               final String mainName = dependency.getFileName().toLowerCase();
      -  371  8
               final String nextName = nextDependency.getFileName().toLowerCase();
      -  372  8
               if (mainName.endsWith(".jar") && nextName.endsWith("pom.xml")) {
      -  373  0
                   return dependency.getIdentifiers().containsAll(nextDependency.getIdentifiers());
      -  374  8
               } else if (nextName.endsWith(".jar") && mainName.endsWith("pom.xml")) {
      -  375  0
                   return nextDependency.getIdentifiers().containsAll(dependency.getIdentifiers());
      -  376   -
               }
      -  377  8
               return false;
      -  378   -
           }
      -  379   -
       
      -  380   -
           /**
      -  381   -
            * Determines which path is shortest; if path lengths are equal then we use compareTo of the string method to determine if the
      -  382   -
            * first path is smaller.
      -  383   -
            *
      -  384   -
            * @param left the first path to compare
      -  385   -
            * @param right the second path to compare
      -  386   -
            * @return <code>true</code> if the leftPath is the shortest; otherwise <code>false</code>
      -  387   -
            */
      -  388   -
           protected boolean firstPathIsShortest(String left, String right) {
      -  389  40
               final String leftPath = left.replace('\\', '/');
      -  390  40
               final String rightPath = right.replace('\\', '/');
      -  391   -
       
      -  392  40
               final int leftCount = countChar(leftPath, '/');
      -  393  40
               final int rightCount = countChar(rightPath, '/');
      -  394  40
               if (leftCount == rightCount) {
      -  395  24
                   return leftPath.compareTo(rightPath) <= 0;
      -  396  
               } else {
      -  397  16
                   return leftCount < rightCount;
      +  334   +
                   /*
      +  335   +
                    * considered splitting the names up and comparing the components,
      +  336   +
                    * but decided that the file name length should be sufficient as the
      +  337   +
                    * "core" component, if this follows a normal naming protocol should
      +  338   +
                    * be shorter:
      +  339   +
                    * axis2-saaj-1.4.1.jar
      +  340   +
                    * axis2-1.4.1.jar       <-----
      +  341   +
                    * axis2-kernel-1.4.1.jar
      +  342   +
                    */
      +  343  0
                   returnVal = leftName.length() <= rightName.length();
      +  344   +
               }
      +  345  2
               LOGGER.debug("IsCore={} ({}, {})", returnVal, left.getFileName(), right.getFileName());
      +  346  2
               return returnVal;
      +  347   +
           }
      +  348   +
       
      +  349   +
           /**
      +  350   +
            * Compares the SHA1 hashes of two dependencies to determine if they are equal.
      +  351   +
            *
      +  352   +
            * @param dependency1 a dependency object to compare
      +  353   +
            * @param dependency2 a dependency object to compare
      +  354   +
            * @return true if the sha1 hashes of the two dependencies match; otherwise false
      +  355   +
            */
      +  356   +
           private boolean hashesMatch(Dependency dependency1, Dependency dependency2) {
      +  357  1
               if (dependency1 == null || dependency2 == null || dependency1.getSha1sum() == null || dependency2.getSha1sum() == null) {
      +  358  0
                   return false;
      +  359   +
               }
      +  360  1
               return dependency1.getSha1sum().equals(dependency2.getSha1sum());
      +  361   +
           }
      +  362   +
       
      +  363   +
           /**
      +  364   +
            * Determines if the jar is shaded and the created pom.xml identified the same CPE as the jar - if so, the pom.xml dependency
      +  365   +
            * should be removed.
      +  366   +
            *
      +  367   +
            * @param dependency a dependency to check
      +  368   +
            * @param nextDependency another dependency to check
      +  369   +
            * @return true if on of the dependencies is a pom.xml and the identifiers between the two collections match; otherwise false
      +  370   +
            */
      +  371   +
           private boolean isShadedJar(Dependency dependency, Dependency nextDependency) {
      +  372  1
               final String mainName = dependency.getFileName().toLowerCase();
      +  373  1
               final String nextName = nextDependency.getFileName().toLowerCase();
      +  374  1
               if (mainName.endsWith(".jar") && nextName.endsWith("pom.xml")) {
      +  375  0
                   return dependency.getIdentifiers().containsAll(nextDependency.getIdentifiers());
      +  376  1
               } else if (nextName.endsWith(".jar") && mainName.endsWith("pom.xml")) {
      +  377  0
                   return nextDependency.getIdentifiers().containsAll(dependency.getIdentifiers());
      +  378   +
               }
      +  379  1
               return false;
      +  380   +
           }
      +  381   +
       
      +  382   +
           /**
      +  383   +
            * Determines which path is shortest; if path lengths are equal then we use compareTo of the string method to determine if the
      +  384   +
            * first path is smaller.
      +  385   +
            *
      +  386   +
            * @param left the first path to compare
      +  387   +
            * @param right the second path to compare
      +  388   +
            * @return <code>true</code> if the leftPath is the shortest; otherwise <code>false</code>
      +  389   +
            */
      +  390   +
           protected boolean firstPathIsShortest(String left, String right) {
      +  391  5
               final String leftPath = left.replace('\\', '/');
      +  392  5
               final String rightPath = right.replace('\\', '/');
      +  393   +
       
      +  394  5
               final int leftCount = countChar(leftPath, '/');
      +  395  5
               final int rightCount = countChar(rightPath, '/');
      +  396  5
               if (leftCount == rightCount) {
      +  397  3
                   return leftPath.compareTo(rightPath) <= 0;
       398   -
               }
      -  399   -
           }
      +
               } else {
      +  399  2
                   return leftCount < rightCount;
       400   -
       
      -  401   -
           /**
      -  402   -
            * Counts the number of times the character is present in the string.
      -  403   -
            *
      -  404   -
            * @param string the string to count the characters in
      -  405   -
            * @param c the character to count
      -  406   -
            * @return the number of times the character is present in the string
      -  407   -
            */
      -  408   -
           private int countChar(String string, char c) {
      -  409  80
               int count = 0;
      -  410  80
               final int max = string.length();
      -  411  928
               for (int i = 0; i < max; i++) {
      -  412  848
                   if (c == string.charAt(i)) {
      -  413  224
                       count++;
      -  414   -
                   }
      -  415  
               }
      -  416  80
               return count;
      -  417   +  401  
           }
      -  418   +  402  
       
      -  419   +  403  
           /**
      -  420   -
            * Checks if the given file path is contained within a war or ear file.
      -  421   +  404   +
            * Counts the number of times the character is present in the string.
      +  405  
            *
      -  422   -
            * @param filePath the file path to check
      -  423   -
            * @return true if the path contains '.war\' or '.ear\'.
      -  424   +  406   +
            * @param string the string to count the characters in
      +  407   +
            * @param c the character to count
      +  408   +
            * @return the number of times the character is present in the string
      +  409  
            */
      -  425   -
           private boolean containedInWar(String filePath) {
      -  426  0
               return filePath == null ? false : filePath.matches(".*\\.(ear|war)[\\\\/].*");
      -  427   +  410   +
           private int countChar(String string, char c) {
      +  411  10
               int count = 0;
      +  412  10
               final int max = string.length();
      +  413  116
               for (int i = 0; i < max; i++) {
      +  414  106
                   if (c == string.charAt(i)) {
      +  415  28
                       count++;
      +  416   +
                   }
      +  417   +
               }
      +  418  10
               return count;
      +  419  
           }
      -  428   +  420   +
       
      +  421   +
           /**
      +  422   +
            * Checks if the given file path is contained within a war or ear file.
      +  423   +
            *
      +  424   +
            * @param filePath the file path to check
      +  425   +
            * @return true if the path contains '.war\' or '.ear\'.
      +  426   +
            */
      +  427   +
           private boolean containedInWar(String filePath) {
      +  428  0
               return filePath == null ? false : filePath.matches(".*\\.(ear|war)[\\\\/].*");
      +  429   +
           }
      +  430  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.FalsePositiveAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.FalsePositiveAnalyzer.html index 40a8bfad2..92a17a58e 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.FalsePositiveAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.FalsePositiveAnalyzer.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      FalsePositiveAnalyzer
      49%
      88/177
      25%
      58/230
      10.385
      FalsePositiveAnalyzer
      48%
      85/174
      25%
      58/230
      10.385
       
      @@ -105,7 +105,7 @@
        * @author Jeremy Long
       44  
        */
      -  45  48
       public class FalsePositiveAnalyzer extends AbstractAnalyzer {
      +  45  7
       public class FalsePositiveAnalyzer extends AbstractAnalyzer {
       46  
       
       47   @@ -114,7 +114,7 @@
            * The Logger.
       49  
            */
      -  50  8
           private static final Logger LOGGER = LoggerFactory.getLogger(FalsePositiveAnalyzer.class);
      +  50  1
           private static final Logger LOGGER = LoggerFactory.getLogger(FalsePositiveAnalyzer.class);
       51  
       
       52   @@ -123,7 +123,7 @@
            * The file filter used to find DLL and EXE.
       54  
            */
      -  55  8
           private static final FileFilter DLL_EXE_FILTER = FileFilterBuilder.newInstance().addExtensions("dll", "exe").build();
      +  55  1
           private static final FileFilter DLL_EXE_FILTER = FileFilterBuilder.newInstance().addExtensions("dll", "exe").build();
       56  
       
       57   @@ -142,7 +142,7 @@
            * The phase that this analyzer is intended to run in.
       64  
            */
      -  65  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.POST_IDENTIFIER_ANALYSIS;
      +  65  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.POST_IDENTIFIER_ANALYSIS;
       66  
       
       67   @@ -156,660 +156,661 @@  71  
            */
       72   -
           public String getName() {
      -  73  40
               return ANALYZER_NAME;
      -  74   -
           }
      -  75   -
       
      -  76   -
           /**
      -  77   -
            * Returns the phase that the analyzer is intended to run in.
      -  78   -
            *
      -  79   -
            * @return the phase that the analyzer is intended to run in.
      -  80   -
            */
      -  81   -
           public AnalysisPhase getAnalysisPhase() {
      -  82  24
               return ANALYSIS_PHASE;
      -  83   -
           }
      -  84   -
           //</editor-fold>
      -  85   -
       
      -  86   -
           /**
      -  87   -
            * Analyzes the dependencies and removes bad/incorrect CPE associations based on various heuristics.
      -  88   -
            *
      -  89   -
            * @param dependency the dependency to analyze.
      -  90   -
            * @param engine the engine that is scanning the dependencies
      -  91   -
            * @throws AnalysisException is thrown if there is an error reading the JAR file.
      -  92   -
            */
      -  93  
           @Override
      -  94   -
           public void analyze(Dependency dependency, Engine engine) throws AnalysisException {
      -  95  24
               removeJreEntries(dependency);
      -  96  24
               removeBadMatches(dependency);
      -  97  24
               removeBadSpringMatches(dependency);
      -  98  24
               removeWrongVersionMatches(dependency);
      -  99  24
               removeSpuriousCPE(dependency);
      -  100  24
               removeDuplicativeEntriesFromJar(dependency, engine);
      -  101  24
               addFalseNegativeCPEs(dependency);
      -  102  24
           }
      -  103   +  73   +
           public String getName() {
      +  74  5
               return ANALYZER_NAME;
      +  75   +
           }
      +  76  
       
      -  104   +  77  
           /**
      -  105   -
            * Removes inaccurate matches on springframework CPEs.
      -  106   +  78   +
            * Returns the phase that the analyzer is intended to run in.
      +  79  
            *
      -  107   -
            * @param dependency the dependency to test for and remove known inaccurate CPE matches
      -  108   +  80   +
            * @return the phase that the analyzer is intended to run in.
      +  81  
            */
      -  109   -
           private void removeBadSpringMatches(Dependency dependency) {
      -  110  24
               String mustContain = null;
      -  111  24
               for (Identifier i : dependency.getIdentifiers()) {
      -  112  24
                   if ("maven".contains(i.getType())) {
      -  113  0
                       if (i.getValue() != null && i.getValue().startsWith("org.springframework.")) {
      -  114  0
                           final int endPoint = i.getValue().indexOf(":", 19);
      -  115  0
                           if (endPoint >= 0) {
      -  116  0
                               mustContain = i.getValue().substring(19, endPoint).toLowerCase();
      -  117  0
                               break;
      -  118   -
                           }
      -  119   -
                       }
      -  120   -
                   }
      -  121  24
               }
      -  122  24
               if (mustContain != null) {
      -  123  0
                   final Iterator<Identifier> itr = dependency.getIdentifiers().iterator();
      -  124  0
                   while (itr.hasNext()) {
      -  125  0
                       final Identifier i = itr.next();
      -  126  0
                       if ("cpe".contains(i.getType())
      -  127   -
                               && i.getValue() != null
      -  128   -
                               && i.getValue().startsWith("cpe:/a:springsource:")
      -  129   -
                               && !i.getValue().toLowerCase().contains(mustContain)) {
      -  130  0
                           itr.remove();
      -  131   -
                           //dependency.getIdentifiers().remove(i);
      -  132   -
                       }
      -  133  0
                   }
      -  134   -
               }
      -  135  24
           }
      -  136   +  82   +
           @Override
      +  83   +
           public AnalysisPhase getAnalysisPhase() {
      +  84  4
               return ANALYSIS_PHASE;
      +  85   +
           }
      +  86   +
           //</editor-fold>
      +  87  
       
      -  137   +  88  
           /**
      +  89   +
            * Analyzes the dependencies and removes bad/incorrect CPE associations based on various heuristics.
      +  90   +
            *
      +  91   +
            * @param dependency the dependency to analyze.
      +  92   +
            * @param engine the engine that is scanning the dependencies
      +  93   +
            * @throws AnalysisException is thrown if there is an error reading the JAR file.
      +  94   +
            */
      +  95   +
           @Override
      +  96   +
           public void analyze(Dependency dependency, Engine engine) throws AnalysisException {
      +  97  3
               removeJreEntries(dependency);
      +  98  3
               removeBadMatches(dependency);
      +  99  3
               removeBadSpringMatches(dependency);
      +  100  3
               removeWrongVersionMatches(dependency);
      +  101  3
               removeSpuriousCPE(dependency);
      +  102  3
               removeDuplicativeEntriesFromJar(dependency, engine);
      +  103  3
               addFalseNegativeCPEs(dependency);
      +  104  3
           }
      +  105   +
       
      +  106   +
           /**
      +  107   +
            * Removes inaccurate matches on springframework CPEs.
      +  108   +
            *
      +  109   +
            * @param dependency the dependency to test for and remove known inaccurate CPE matches
      +  110   +
            */
      +  111   +
           private void removeBadSpringMatches(Dependency dependency) {
      +  112  3
               String mustContain = null;
      +  113  3
               for (Identifier i : dependency.getIdentifiers()) {
      +  114  3
                   if ("maven".contains(i.getType())) {
      +  115  0
                       if (i.getValue() != null && i.getValue().startsWith("org.springframework.")) {
      +  116  0
                           final int endPoint = i.getValue().indexOf(":", 19);
      +  117  0
                           if (endPoint >= 0) {
      +  118  0
                               mustContain = i.getValue().substring(19, endPoint).toLowerCase();
      +  119  0
                               break;
      +  120   +
                           }
      +  121   +
                       }
      +  122   +
                   }
      +  123  3
               }
      +  124  3
               if (mustContain != null) {
      +  125  0
                   final Iterator<Identifier> itr = dependency.getIdentifiers().iterator();
      +  126  0
                   while (itr.hasNext()) {
      +  127  0
                       final Identifier i = itr.next();
      +  128  0
                       if ("cpe".contains(i.getType())
      +  129   +
                               && i.getValue() != null
      +  130   +
                               && i.getValue().startsWith("cpe:/a:springsource:")
      +  131   +
                               && !i.getValue().toLowerCase().contains(mustContain)) {
      +  132  0
                           itr.remove();
      +  133   +
                           //dependency.getIdentifiers().remove(i);
      +  134   +
                       }
      +  135  0
                   }
      +  136   +
               }
      +  137  3
           }
       138   -
            * <p>
      +
       
       139   -
            * Intended to remove spurious CPE entries. By spurious we mean duplicate, less specific CPE entries.</p>
      +
           /**
       140  
            * <p>
       141   -
            * Example:</p>
      +
            * Intended to remove spurious CPE entries. By spurious we mean duplicate, less specific CPE entries.</p>
       142   -
            * <code>
      -  143   -
            * cpe:/a:some-vendor:some-product
      -  144   -
            * cpe:/a:some-vendor:some-product:1.5
      -  145   -
            * cpe:/a:some-vendor:some-product:1.5.2
      -  146   -
            * </code>
      -  147  
            * <p>
      -  148   -
            * Should be trimmed to:</p>
      -  149   +  143   +
            * Example:</p>
      +  144  
            * <code>
      -  150   +  145   +
            * cpe:/a:some-vendor:some-product
      +  146   +
            * cpe:/a:some-vendor:some-product:1.5
      +  147  
            * cpe:/a:some-vendor:some-product:1.5.2
      -  151   +  148  
            * </code>
      +  149   +
            * <p>
      +  150   +
            * Should be trimmed to:</p>
      +  151   +
            * <code>
       152   -
            *
      +
            * cpe:/a:some-vendor:some-product:1.5.2
       153   -
            * @param dependency the dependency being analyzed
      +
            * </code>
       154   -
            */
      +
            *
       155   -
           @SuppressWarnings("null")
      -  156   -
           private void removeSpuriousCPE(Dependency dependency) {
      -  157  24
               final List<Identifier> ids = new ArrayList<Identifier>();
      -  158  24
               ids.addAll(dependency.getIdentifiers());
      -  159  24
               Collections.sort(ids);
      -  160  24
               final ListIterator<Identifier> mainItr = ids.listIterator();
      -  161  48
               while (mainItr.hasNext()) {
      -  162  24
                   final Identifier currentId = mainItr.next();
      -  163  24
                   final VulnerableSoftware currentCpe = parseCpe(currentId.getType(), currentId.getValue());
      -  164  24
                   if (currentCpe == null) {
      -  165  0
                       continue;
      -  166   -
                   }
      -  167  24
                   final ListIterator<Identifier> subItr = ids.listIterator(mainItr.nextIndex());
      -  168  48
                   while (subItr.hasNext()) {
      -  169  24
                       final Identifier nextId = subItr.next();
      -  170  24
                       final VulnerableSoftware nextCpe = parseCpe(nextId.getType(), nextId.getValue());
      -  171  24
                       if (nextCpe == null) {
      -  172  0
                           continue;
      -  173   -
                       }
      -  174   -
                       //TODO fix the version problem below
      -  175  24
                       if (currentCpe.getVendor().equals(nextCpe.getVendor())) {
      -  176  0
                           if (currentCpe.getProduct().equals(nextCpe.getProduct())) {
      -  177   -
                               // see if one is contained in the other.. remove the contained one from dependency.getIdentifier
      -  178  0
                               final String currentVersion = currentCpe.getVersion();
      -  179  0
                               final String nextVersion = nextCpe.getVersion();
      -  180  0
                               if (currentVersion == null && nextVersion == null) {
      -  181   -
                                   //how did we get here?
      -  182  0
                                   LOGGER.debug("currentVersion and nextVersion are both null?");
      -  183  0
                               } else if (currentVersion == null && nextVersion != null) {
      -  184  0
                                   dependency.getIdentifiers().remove(currentId);
      -  185  0
                               } else if (nextVersion == null && currentVersion != null) {
      -  186  0
                                   dependency.getIdentifiers().remove(nextId);
      -  187  0
                               } else if (currentVersion.length() < nextVersion.length()) {
      -  188  0
                                   if (nextVersion.startsWith(currentVersion) || "-".equals(currentVersion)) {
      -  189  0
                                       dependency.getIdentifiers().remove(currentId);
      -  190   -
                                   }
      -  191   -
                               } else {
      -  192  0
                                   if (currentVersion.startsWith(nextVersion) || "-".equals(nextVersion)) {
      -  193  0
                                       dependency.getIdentifiers().remove(nextId);
      -  194   -
                                   }
      -  195   -
                               }
      -  196   -
                           }
      -  197   -
                       }
      -  198  24
                   }
      -  199  24
               }
      -  200  24
           }
      -  201   -
           /**
      -  202   -
            * Regex to identify core java libraries and a few other commonly misidentified ones.
      -  203   -
            */
      -  204  8
           public static final Pattern CORE_JAVA = Pattern.compile("^cpe:/a:(sun|oracle|ibm):(j2[ems]e|"
      -  205   -
                   + "java(_platform_micro_edition|_runtime_environment|_se|virtual_machine|se_development_kit|fx)?|"
      -  206   -
                   + "jdk|jre|jsse)($|:.*)");
      -  207   -
       
      -  208   -
           /**
      -  209   -
            * Regex to identify core jsf libraries.
      -  210   -
            */
      -  211  8
           public static final Pattern CORE_JAVA_JSF = Pattern.compile("^cpe:/a:(sun|oracle|ibm):jsf($|:.*)");
      -  212   -
           /**
      -  213   -
            * Regex to identify core java library files. This is currently incomplete.
      -  214   -
            */
      -  215  8
           public static final Pattern CORE_FILES = Pattern.compile("(^|/)((alt[-])?rt|jsse|jfxrt|jfr|jce|javaws|deploy|charsets)\\.jar$");
      -  216   -
           /**
      -  217   -
            * Regex to identify core jsf java library files. This is currently incomplete.
      -  218   -
            */
      -  219  8
           public static final Pattern CORE_JSF_FILES = Pattern.compile("(^|/)jsf[-][^/]*\\.jar$");
      -  220   -
       
      -  221   -
           /**
      -  222   -
            * Removes any CPE entries for the JDK/JRE unless the filename ends with rt.jar
      -  223   -
            *
      -  224   -
            * @param dependency the dependency to remove JRE CPEs from
      -  225   -
            */
      -  226   -
           private void removeJreEntries(Dependency dependency) {
      -  227  24
               final Set<Identifier> identifiers = dependency.getIdentifiers();
      -  228  24
               final Iterator<Identifier> itr = identifiers.iterator();
      -  229  56
               while (itr.hasNext()) {
      -  230  32
                   final Identifier i = itr.next();
      -  231  32
                   final Matcher coreCPE = CORE_JAVA.matcher(i.getValue());
      -  232  32
                   final Matcher coreFiles = CORE_FILES.matcher(dependency.getFileName());
      -  233  32
                   if (coreCPE.matches() && !coreFiles.matches()) {
      -  234  0
                       itr.remove();
      -  235   -
                   }
      -  236  32
                   final Matcher coreJsfCPE = CORE_JAVA_JSF.matcher(i.getValue());
      -  237  32
                   final Matcher coreJsfFiles = CORE_JSF_FILES.matcher(dependency.getFileName());
      -  238  32
                   if (coreJsfCPE.matches() && !coreJsfFiles.matches()) {
      -  239  0
                       itr.remove();
      -  240   -
                   }
      -  241  32
               }
      -  242  24
           }
      -  243   -
       
      -  244   -
           /**
      -  245   -
            * Parses a CPE string into an IndexEntry.
      -  246   -
            *
      -  247   -
            * @param type the type of identifier
      -  248   -
            * @param value the cpe identifier to parse
      -  249   -
            * @return an VulnerableSoftware object constructed from the identifier
      -  250   -
            */
      -  251   -
           private VulnerableSoftware parseCpe(String type, String value) {
      -  252  48
               if (!"cpe".equals(type)) {
      -  253  0
                   return null;
      -  254   -
               }
      -  255  48
               final VulnerableSoftware cpe = new VulnerableSoftware();
      -  256   -
               try {
      -  257  48
                   cpe.parseName(value);
      -  258  0
               } catch (UnsupportedEncodingException ex) {
      -  259  0
                   LOGGER.trace("", ex);
      -  260  0
                   return null;
      -  261  48
               }
      -  262  48
               return cpe;
      -  263   -
           }
      -  264   -
       
      -  265   -
           /**
      -  266   -
            * Removes bad CPE matches for a dependency. Unfortunately, right now these are hard-coded patches for specific problems
      -  267   -
            * identified when testing this on a LARGE volume of jar files.
      -  268   -
            *
      -  269   -
            * @param dependency the dependency to analyze
      -  270   -
            */
      -  271   -
           private void removeBadMatches(Dependency dependency) {
      -  272  24
               final Set<Identifier> identifiers = dependency.getIdentifiers();
      -  273  24
               final Iterator<Identifier> itr = identifiers.iterator();
      -  274   -
       
      -  275   -
               /* TODO - can we utilize the pom's groupid and artifactId to filter??? most of
      -  276   -
                * these are due to low quality data.  Other idea would be to say any CPE
      -  277   -
                * found based on LOW confidence evidence should have a different CPE type? (this
      -  278   -
                * might be a better solution then just removing the URL for "best-guess" matches).
      -  279   -
                */
      -  280   -
               //Set<Evidence> groupId = dependency.getVendorEvidence().getEvidence("pom", "groupid");
      -  281   -
               //Set<Evidence> artifactId = dependency.getVendorEvidence().getEvidence("pom", "artifactid");
      -  282  56
               while (itr.hasNext()) {
      -  283  32
                   final Identifier i = itr.next();
      -  284   -
                   //TODO move this startsWith expression to the base suppression file
      -  285  32
                   if ("cpe".equals(i.getType())) {
      -  286  32
                       if ((i.getValue().matches(".*c\\+\\+.*")
      -  287   -
                               || i.getValue().startsWith("cpe:/a:file:file")
      -  288   -
                               || i.getValue().startsWith("cpe:/a:mozilla:mozilla")
      -  289   -
                               || i.getValue().startsWith("cpe:/a:cvs:cvs")
      -  290   -
                               || i.getValue().startsWith("cpe:/a:ftp:ftp")
      -  291   -
                               || i.getValue().startsWith("cpe:/a:tcp:tcp")
      -  292   -
                               || i.getValue().startsWith("cpe:/a:ssh:ssh")
      -  293   -
                               || i.getValue().startsWith("cpe:/a:lookup:lookup"))
      -  294   -
                               && (dependency.getFileName().toLowerCase().endsWith(".jar")
      -  295   -
                               || dependency.getFileName().toLowerCase().endsWith("pom.xml")
      -  296   -
                               || dependency.getFileName().toLowerCase().endsWith(".dll")
      -  297   -
                               || dependency.getFileName().toLowerCase().endsWith(".exe")
      -  298   -
                               || dependency.getFileName().toLowerCase().endsWith(".nuspec")
      -  299   -
                               || dependency.getFileName().toLowerCase().endsWith(".zip")
      -  300   -
                               || dependency.getFileName().toLowerCase().endsWith(".sar")
      -  301   -
                               || dependency.getFileName().toLowerCase().endsWith(".apk")
      -  302   -
                               || dependency.getFileName().toLowerCase().endsWith(".tar")
      -  303   -
                               || dependency.getFileName().toLowerCase().endsWith(".gz")
      -  304   -
                               || dependency.getFileName().toLowerCase().endsWith(".tgz")
      -  305   -
                               || dependency.getFileName().toLowerCase().endsWith(".ear")
      -  306   -
                               || dependency.getFileName().toLowerCase().endsWith(".war"))) {
      -  307  8
                           itr.remove();
      -  308  24
                       } else if ((i.getValue().startsWith("cpe:/a:jquery:jquery")
      -  309   -
                               || i.getValue().startsWith("cpe:/a:prototypejs:prototype")
      -  310   -
                               || i.getValue().startsWith("cpe:/a:yahoo:yui"))
      -  311   -
                               && (dependency.getFileName().toLowerCase().endsWith(".jar")
      -  312   -
                               || dependency.getFileName().toLowerCase().endsWith("pom.xml")
      -  313   -
                               || dependency.getFileName().toLowerCase().endsWith(".dll")
      -  314   -
                               || dependency.getFileName().toLowerCase().endsWith(".exe"))) {
      -  315  0
                           itr.remove();
      -  316  24
                       } else if ((i.getValue().startsWith("cpe:/a:microsoft:excel")
      -  317   -
                               || i.getValue().startsWith("cpe:/a:microsoft:word")
      -  318   -
                               || i.getValue().startsWith("cpe:/a:microsoft:visio")
      -  319   -
                               || i.getValue().startsWith("cpe:/a:microsoft:powerpoint")
      -  320   -
                               || i.getValue().startsWith("cpe:/a:microsoft:office")
      -  321   -
                               || i.getValue().startsWith("cpe:/a:core_ftp:core_ftp"))
      -  322   -
                               && (dependency.getFileName().toLowerCase().endsWith(".jar")
      -  323   -
                               || dependency.getFileName().toLowerCase().endsWith(".ear")
      -  324   -
                               || dependency.getFileName().toLowerCase().endsWith(".war")
      -  325   -
                               || dependency.getFileName().toLowerCase().endsWith("pom.xml"))) {
      -  326  0
                           itr.remove();
      -  327  24
                       } else if (i.getValue().startsWith("cpe:/a:apache:maven")
      -  328   -
                               && !dependency.getFileName().toLowerCase().matches("maven-core-[\\d\\.]+\\.jar")) {
      -  329  0
                           itr.remove();
      -  330  24
                       } else if (i.getValue().startsWith("cpe:/a:m-core:m-core")
      -  331   -
                               && !dependency.getEvidenceUsed().containsUsedString("m-core")) {
      -  332  0
                           itr.remove();
      -  333  24
                       } else if (i.getValue().startsWith("cpe:/a:jboss:jboss")
      -  334   -
                               && !dependency.getFileName().toLowerCase().matches("jboss-?[\\d\\.-]+(GA)?\\.jar")) {
      -  335  0
                           itr.remove();
      -  336   -
                       }
      -  337   -
                   }
      -  338  32
               }
      -  339  24
           }
      -  340   -
       
      -  341   -
           /**
      -  342   -
            * Removes CPE matches for the wrong version of a dependency. Currently, this only covers Axis 1 & 2.
      -  343   -
            *
      -  344   -
            * @param dependency the dependency to analyze
      -  345   -
            */
      -  346   -
           private void removeWrongVersionMatches(Dependency dependency) {
      -  347  24
               final Set<Identifier> identifiers = dependency.getIdentifiers();
      -  348  24
               final Iterator<Identifier> itr = identifiers.iterator();
      -  349   -
       
      -  350  24
               final String fileName = dependency.getFileName();
      -  351  24
               if (fileName != null && fileName.contains("axis2")) {
      -  352  0
                   while (itr.hasNext()) {
      -  353  0
                       final Identifier i = itr.next();
      -  354  0
                       if ("cpe".equals(i.getType())) {
      -  355  0
                           final String cpe = i.getValue();
      -  356  0
                           if (cpe != null && (cpe.startsWith("cpe:/a:apache:axis:") || "cpe:/a:apache:axis".equals(cpe))) {
      -  357  0
                               itr.remove();
      -  358   -
                           }
      -  359   -
                       }
      -  360  0
                   }
      -  361  24
               } else if (fileName != null && fileName.contains("axis")) {
      -  362  0
                   while (itr.hasNext()) {
      -  363  0
                       final Identifier i = itr.next();
      -  364  0
                       if ("cpe".equals(i.getType())) {
      -  365  0
                           final String cpe = i.getValue();
      -  366  0
                           if (cpe != null && (cpe.startsWith("cpe:/a:apache:axis2:") || "cpe:/a:apache:axis2".equals(cpe))) {
      -  367  0
                               itr.remove();
      -  368   -
                           }
      -  369   -
                       }
      -  370  0
                   }
      -  371   -
               }
      -  372  24
           }
      -  373   -
       
      -  374   -
           /**
      -  375   -
            * There are some known CPE entries, specifically regarding sun and oracle products due to the acquisition and changes in
      -  376   -
            * product names, that based on given evidence we can add the related CPE entries to ensure a complete list of CVE entries.
      -  377   -
            *
      -  378  
            * @param dependency the dependency being analyzed
      -  379   +  156  
            */
      -  380   -
           private void addFalseNegativeCPEs(Dependency dependency) {
      -  381   -
               //TODO move this to the hint analyzer
      -  382  24
               final Iterator<Identifier> itr = dependency.getIdentifiers().iterator();
      -  383  48
               while (itr.hasNext()) {
      -  384  24
                   final Identifier i = itr.next();
      -  385  24
                   if ("cpe".equals(i.getType()) && i.getValue() != null
      -  386   -
                           && (i.getValue().startsWith("cpe:/a:oracle:opensso:")
      -  387   -
                           || i.getValue().startsWith("cpe:/a:oracle:opensso_enterprise:")
      -  388   -
                           || i.getValue().startsWith("cpe:/a:sun:opensso_enterprise:")
      -  389   -
                           || i.getValue().startsWith("cpe:/a:sun:opensso:"))) {
      -  390  0
                       final String newCpe = String.format("cpe:/a:sun:opensso_enterprise:%s", i.getValue().substring(22));
      -  391  0
                       final String newCpe2 = String.format("cpe:/a:oracle:opensso_enterprise:%s", i.getValue().substring(22));
      -  392  0
                       final String newCpe3 = String.format("cpe:/a:sun:opensso:%s", i.getValue().substring(22));
      -  393  0
                       final String newCpe4 = String.format("cpe:/a:oracle:opensso:%s", i.getValue().substring(22));
      -  394   -
                       try {
      -  395  0
                           dependency.addIdentifier("cpe",
      -  396   -
                                   newCpe,
      -  397   -
                                   String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe, "UTF-8")));
      -  398  0
                           dependency.addIdentifier("cpe",
      -  399   -
                                   newCpe2,
      -  400   -
                                   String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe2, "UTF-8")));
      -  401  0
                           dependency.addIdentifier("cpe",
      -  402   -
                                   newCpe3,
      -  403   -
                                   String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe3, "UTF-8")));
      -  404  0
                           dependency.addIdentifier("cpe",
      -  405   -
                                   newCpe4,
      -  406   -
                                   String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe4, "UTF-8")));
      -  407  0
                       } catch (UnsupportedEncodingException ex) {
      -  408  0
                           LOGGER.debug("", ex);
      -  409  0
                       }
      -  410   +  157   +
           @SuppressWarnings("null")
      +  158   +
           private void removeSpuriousCPE(Dependency dependency) {
      +  159  3
               final List<Identifier> ids = new ArrayList<Identifier>(dependency.getIdentifiers());
      +  160  3
               Collections.sort(ids);
      +  161  3
               final ListIterator<Identifier> mainItr = ids.listIterator();
      +  162  6
               while (mainItr.hasNext()) {
      +  163  3
                   final Identifier currentId = mainItr.next();
      +  164  3
                   final VulnerableSoftware currentCpe = parseCpe(currentId.getType(), currentId.getValue());
      +  165  3
                   if (currentCpe == null) {
      +  166  0
                       continue;
      +  167  
                   }
      -  411  24
               }
      -  412  24
           }
      -  413   -
       
      -  414   -
           /**
      -  415   -
            * Removes duplicate entries identified that are contained within JAR files. These occasionally crop up due to POM entries or
      -  416   -
            * other types of files (such as DLLs and EXEs) being contained within the JAR.
      -  417   -
            *
      -  418   -
            * @param dependency the dependency that might be a duplicate
      -  419   -
            * @param engine the engine used to scan all dependencies
      -  420   -
            */
      -  421   -
           private void removeDuplicativeEntriesFromJar(Dependency dependency, Engine engine) {
      -  422  24
               if (dependency.getFileName().toLowerCase().endsWith("pom.xml")
      -  423   -
                       || DLL_EXE_FILTER.accept(dependency.getActualFile())) {
      -  424  8
                   String parentPath = dependency.getFilePath().toLowerCase();
      -  425  8
                   if (parentPath.contains(".jar")) {
      -  426  0
                       parentPath = parentPath.substring(0, parentPath.indexOf(".jar") + 4);
      -  427  0
                       final Dependency parent = findDependency(parentPath, engine.getDependencies());
      -  428  0
                       if (parent != null) {
      -  429  0
                           boolean remove = false;
      -  430  0
                           for (Identifier i : dependency.getIdentifiers()) {
      -  431  0
                               if ("cpe".equals(i.getType())) {
      -  432  0
                                   final String trimmedCPE = trimCpeToVendor(i.getValue());
      -  433  0
                                   for (Identifier parentId : parent.getIdentifiers()) {
      -  434  0
                                       if ("cpe".equals(parentId.getType()) && parentId.getValue().startsWith(trimmedCPE)) {
      -  435  0
                                           remove |= true;
      -  436   -
                                       }
      -  437  0
                                   }
      -  438   -
                               }
      -  439  0
                               if (!remove) { //we can escape early
      -  440  0
                                   return;
      -  441   -
                               }
      -  442  0
                           }
      -  443  0
                           if (remove) {
      -  444  0
                               engine.getDependencies().remove(dependency);
      -  445   -
                           }
      -  446   +  168  3
                   final ListIterator<Identifier> subItr = ids.listIterator(mainItr.nextIndex());
      +  169  6
                   while (subItr.hasNext()) {
      +  170  3
                       final Identifier nextId = subItr.next();
      +  171  3
                       final VulnerableSoftware nextCpe = parseCpe(nextId.getType(), nextId.getValue());
      +  172  3
                       if (nextCpe == null) {
      +  173  0
                           continue;
      +  174  
                       }
      +  175   +
                       //TODO fix the version problem below
      +  176  3
                       if (currentCpe.getVendor().equals(nextCpe.getVendor())) {
      +  177  0
                           if (currentCpe.getProduct().equals(nextCpe.getProduct())) {
      +  178   +
                               // see if one is contained in the other.. remove the contained one from dependency.getIdentifier
      +  179  0
                               final String currentVersion = currentCpe.getVersion();
      +  180  0
                               final String nextVersion = nextCpe.getVersion();
      +  181  0
                               if (currentVersion == null && nextVersion == null) {
      +  182   +
                                   //how did we get here?
      +  183  0
                                   LOGGER.debug("currentVersion and nextVersion are both null?");
      +  184  0
                               } else if (currentVersion == null && nextVersion != null) {
      +  185  0
                                   dependency.getIdentifiers().remove(currentId);
      +  186  0
                               } else if (nextVersion == null && currentVersion != null) {
      +  187  0
                                   dependency.getIdentifiers().remove(nextId);
      +  188  0
                               } else if (currentVersion.length() < nextVersion.length()) {
      +  189  0
                                   if (nextVersion.startsWith(currentVersion) || "-".equals(currentVersion)) {
      +  190  0
                                       dependency.getIdentifiers().remove(currentId);
      +  191   +
                                   }
      +  192   +
                               } else {
      +  193  0
                                   if (currentVersion.startsWith(nextVersion) || "-".equals(nextVersion)) {
      +  194  0
                                       dependency.getIdentifiers().remove(nextId);
      +  195   +
                                   }
      +  196   +
                               }
      +  197   +
                           }
      +  198   +
                       }
      +  199  3
                   }
      +  200  3
               }
      +  201  3
           }
      +  202   +
           /**
      +  203   +
            * Regex to identify core java libraries and a few other commonly misidentified ones.
      +  204   +
            */
      +  205  1
           public static final Pattern CORE_JAVA = Pattern.compile("^cpe:/a:(sun|oracle|ibm):(j2[ems]e|"
      +  206   +
                   + "java(_platform_micro_edition|_runtime_environment|_se|virtual_machine|se_development_kit|fx)?|"
      +  207   +
                   + "jdk|jre|jsse)($|:.*)");
      +  208   +
       
      +  209   +
           /**
      +  210   +
            * Regex to identify core jsf libraries.
      +  211   +
            */
      +  212  1
           public static final Pattern CORE_JAVA_JSF = Pattern.compile("^cpe:/a:(sun|oracle|ibm):jsf($|:.*)");
      +  213   +
           /**
      +  214   +
            * Regex to identify core java library files. This is currently incomplete.
      +  215   +
            */
      +  216  1
           public static final Pattern CORE_FILES = Pattern.compile("(^|/)((alt[-])?rt|jsse|jfxrt|jfr|jce|javaws|deploy|charsets)\\.jar$");
      +  217   +
           /**
      +  218   +
            * Regex to identify core jsf java library files. This is currently incomplete.
      +  219   +
            */
      +  220  1
           public static final Pattern CORE_JSF_FILES = Pattern.compile("(^|/)jsf[-][^/]*\\.jar$");
      +  221   +
       
      +  222   +
           /**
      +  223   +
            * Removes any CPE entries for the JDK/JRE unless the filename ends with rt.jar
      +  224   +
            *
      +  225   +
            * @param dependency the dependency to remove JRE CPEs from
      +  226   +
            */
      +  227   +
           private void removeJreEntries(Dependency dependency) {
      +  228  3
               final Set<Identifier> identifiers = dependency.getIdentifiers();
      +  229  3
               final Iterator<Identifier> itr = identifiers.iterator();
      +  230  7
               while (itr.hasNext()) {
      +  231  4
                   final Identifier i = itr.next();
      +  232  4
                   final Matcher coreCPE = CORE_JAVA.matcher(i.getValue());
      +  233  4
                   final Matcher coreFiles = CORE_FILES.matcher(dependency.getFileName());
      +  234  4
                   if (coreCPE.matches() && !coreFiles.matches()) {
      +  235  0
                       itr.remove();
      +  236   +
                   }
      +  237  4
                   final Matcher coreJsfCPE = CORE_JAVA_JSF.matcher(i.getValue());
      +  238  4
                   final Matcher coreJsfFiles = CORE_JSF_FILES.matcher(dependency.getFileName());
      +  239  4
                   if (coreJsfCPE.matches() && !coreJsfFiles.matches()) {
      +  240  0
                       itr.remove();
      +  241   +
                   }
      +  242  4
               }
      +  243  3
           }
      +  244   +
       
      +  245   +
           /**
      +  246   +
            * Parses a CPE string into an IndexEntry.
      +  247   +
            *
      +  248   +
            * @param type the type of identifier
      +  249   +
            * @param value the cpe identifier to parse
      +  250   +
            * @return an VulnerableSoftware object constructed from the identifier
      +  251   +
            */
      +  252   +
           private VulnerableSoftware parseCpe(String type, String value) {
      +  253  6
               if (!"cpe".equals(type)) {
      +  254  0
                   return null;
      +  255   +
               }
      +  256  6
               final VulnerableSoftware cpe = new VulnerableSoftware();
      +  257   +
               try {
      +  258  6
                   cpe.parseName(value);
      +  259  0
               } catch (UnsupportedEncodingException ex) {
      +  260  0
                   LOGGER.trace("", ex);
      +  261  0
                   return null;
      +  262  6
               }
      +  263  6
               return cpe;
      +  264   +
           }
      +  265   +
       
      +  266   +
           /**
      +  267   +
            * Removes bad CPE matches for a dependency. Unfortunately, right now these are hard-coded patches for specific problems
      +  268   +
            * identified when testing this on a LARGE volume of jar files.
      +  269   +
            *
      +  270   +
            * @param dependency the dependency to analyze
      +  271   +
            */
      +  272   +
           private void removeBadMatches(Dependency dependency) {
      +  273  3
               final Set<Identifier> identifiers = dependency.getIdentifiers();
      +  274  3
               final Iterator<Identifier> itr = identifiers.iterator();
      +  275   +
       
      +  276   +
               /* TODO - can we utilize the pom's groupid and artifactId to filter??? most of
      +  277   +
                * these are due to low quality data.  Other idea would be to say any CPE
      +  278   +
                * found based on LOW confidence evidence should have a different CPE type? (this
      +  279   +
                * might be a better solution then just removing the URL for "best-guess" matches).
      +  280   +
                */
      +  281   +
               //Set<Evidence> groupId = dependency.getVendorEvidence().getEvidence("pom", "groupid");
      +  282   +
               //Set<Evidence> artifactId = dependency.getVendorEvidence().getEvidence("pom", "artifactid");
      +  283  7
               while (itr.hasNext()) {
      +  284  4
                   final Identifier i = itr.next();
      +  285   +
                   //TODO move this startsWith expression to the base suppression file
      +  286  4
                   if ("cpe".equals(i.getType())) {
      +  287  4
                       if ((i.getValue().matches(".*c\\+\\+.*")
      +  288   +
                               || i.getValue().startsWith("cpe:/a:file:file")
      +  289   +
                               || i.getValue().startsWith("cpe:/a:mozilla:mozilla")
      +  290   +
                               || i.getValue().startsWith("cpe:/a:cvs:cvs")
      +  291   +
                               || i.getValue().startsWith("cpe:/a:ftp:ftp")
      +  292   +
                               || i.getValue().startsWith("cpe:/a:tcp:tcp")
      +  293   +
                               || i.getValue().startsWith("cpe:/a:ssh:ssh")
      +  294   +
                               || i.getValue().startsWith("cpe:/a:lookup:lookup"))
      +  295   +
                               && (dependency.getFileName().toLowerCase().endsWith(".jar")
      +  296   +
                               || dependency.getFileName().toLowerCase().endsWith("pom.xml")
      +  297   +
                               || dependency.getFileName().toLowerCase().endsWith(".dll")
      +  298   +
                               || dependency.getFileName().toLowerCase().endsWith(".exe")
      +  299   +
                               || dependency.getFileName().toLowerCase().endsWith(".nuspec")
      +  300   +
                               || dependency.getFileName().toLowerCase().endsWith(".zip")
      +  301   +
                               || dependency.getFileName().toLowerCase().endsWith(".sar")
      +  302   +
                               || dependency.getFileName().toLowerCase().endsWith(".apk")
      +  303   +
                               || dependency.getFileName().toLowerCase().endsWith(".tar")
      +  304   +
                               || dependency.getFileName().toLowerCase().endsWith(".gz")
      +  305   +
                               || dependency.getFileName().toLowerCase().endsWith(".tgz")
      +  306   +
                               || dependency.getFileName().toLowerCase().endsWith(".ear")
      +  307   +
                               || dependency.getFileName().toLowerCase().endsWith(".war"))) {
      +  308  1
                           itr.remove();
      +  309  3
                       } else if ((i.getValue().startsWith("cpe:/a:jquery:jquery")
      +  310   +
                               || i.getValue().startsWith("cpe:/a:prototypejs:prototype")
      +  311   +
                               || i.getValue().startsWith("cpe:/a:yahoo:yui"))
      +  312   +
                               && (dependency.getFileName().toLowerCase().endsWith(".jar")
      +  313   +
                               || dependency.getFileName().toLowerCase().endsWith("pom.xml")
      +  314   +
                               || dependency.getFileName().toLowerCase().endsWith(".dll")
      +  315   +
                               || dependency.getFileName().toLowerCase().endsWith(".exe"))) {
      +  316  0
                           itr.remove();
      +  317  3
                       } else if ((i.getValue().startsWith("cpe:/a:microsoft:excel")
      +  318   +
                               || i.getValue().startsWith("cpe:/a:microsoft:word")
      +  319   +
                               || i.getValue().startsWith("cpe:/a:microsoft:visio")
      +  320   +
                               || i.getValue().startsWith("cpe:/a:microsoft:powerpoint")
      +  321   +
                               || i.getValue().startsWith("cpe:/a:microsoft:office")
      +  322   +
                               || i.getValue().startsWith("cpe:/a:core_ftp:core_ftp"))
      +  323   +
                               && (dependency.getFileName().toLowerCase().endsWith(".jar")
      +  324   +
                               || dependency.getFileName().toLowerCase().endsWith(".ear")
      +  325   +
                               || dependency.getFileName().toLowerCase().endsWith(".war")
      +  326   +
                               || dependency.getFileName().toLowerCase().endsWith("pom.xml"))) {
      +  327  0
                           itr.remove();
      +  328  3
                       } else if (i.getValue().startsWith("cpe:/a:apache:maven")
      +  329   +
                               && !dependency.getFileName().toLowerCase().matches("maven-core-[\\d\\.]+\\.jar")) {
      +  330  0
                           itr.remove();
      +  331  3
                       } else if (i.getValue().startsWith("cpe:/a:m-core:m-core")
      +  332   +
                               && !dependency.getEvidenceUsed().containsUsedString("m-core")) {
      +  333  0
                           itr.remove();
      +  334  3
                       } else if (i.getValue().startsWith("cpe:/a:jboss:jboss")
      +  335   +
                               && !dependency.getFileName().toLowerCase().matches("jboss-?[\\d\\.-]+(GA)?\\.jar")) {
      +  336  0
                           itr.remove();
      +  337   +
                       }
      +  338   +
                   }
      +  339  4
               }
      +  340  3
           }
      +  341   +
       
      +  342   +
           /**
      +  343   +
            * Removes CPE matches for the wrong version of a dependency. Currently, this only covers Axis 1 & 2.
      +  344   +
            *
      +  345   +
            * @param dependency the dependency to analyze
      +  346   +
            */
      +  347   +
           private void removeWrongVersionMatches(Dependency dependency) {
      +  348  3
               final Set<Identifier> identifiers = dependency.getIdentifiers();
      +  349  3
               final Iterator<Identifier> itr = identifiers.iterator();
      +  350   +
       
      +  351  3
               final String fileName = dependency.getFileName();
      +  352  3
               if (fileName != null && fileName.contains("axis2")) {
      +  353  0
                   while (itr.hasNext()) {
      +  354  0
                       final Identifier i = itr.next();
      +  355  0
                       if ("cpe".equals(i.getType())) {
      +  356  0
                           final String cpe = i.getValue();
      +  357  0
                           if (cpe != null && (cpe.startsWith("cpe:/a:apache:axis:") || "cpe:/a:apache:axis".equals(cpe))) {
      +  358  0
                               itr.remove();
      +  359   +
                           }
      +  360   +
                       }
      +  361  0
                   }
      +  362  3
               } else if (fileName != null && fileName.contains("axis")) {
      +  363  0
                   while (itr.hasNext()) {
      +  364  0
                       final Identifier i = itr.next();
      +  365  0
                       if ("cpe".equals(i.getType())) {
      +  366  0
                           final String cpe = i.getValue();
      +  367  0
                           if (cpe != null && (cpe.startsWith("cpe:/a:apache:axis2:") || "cpe:/a:apache:axis2".equals(cpe))) {
      +  368  0
                               itr.remove();
      +  369   +
                           }
      +  370   +
                       }
      +  371  0
                   }
      +  372   +
               }
      +  373  3
           }
      +  374   +
       
      +  375   +
           /**
      +  376   +
            * There are some known CPE entries, specifically regarding sun and oracle products due to the acquisition and changes in
      +  377   +
            * product names, that based on given evidence we can add the related CPE entries to ensure a complete list of CVE entries.
      +  378   +
            *
      +  379   +
            * @param dependency the dependency being analyzed
      +  380   +
            */
      +  381   +
           private void addFalseNegativeCPEs(Dependency dependency) {
      +  382   +
               //TODO move this to the hint analyzer
      +  383  3
               for (final Identifier identifier : dependency.getIdentifiers()) {
      +  384  3
                   if ("cpe".equals(identifier.getType()) && identifier.getValue() != null
      +  385   +
                           && (identifier.getValue().startsWith("cpe:/a:oracle:opensso:")
      +  386   +
                           || identifier.getValue().startsWith("cpe:/a:oracle:opensso_enterprise:")
      +  387   +
                           || identifier.getValue().startsWith("cpe:/a:sun:opensso_enterprise:")
      +  388   +
                           || identifier.getValue().startsWith("cpe:/a:sun:opensso:"))) {
      +  389  0
                       final String newCpe = String.format("cpe:/a:sun:opensso_enterprise:%s", identifier.getValue().substring(22));
      +  390  0
                       final String newCpe2 = String.format("cpe:/a:oracle:opensso_enterprise:%s", identifier.getValue().substring(22));
      +  391  0
                       final String newCpe3 = String.format("cpe:/a:sun:opensso:%s", identifier.getValue().substring(22));
      +  392  0
                       final String newCpe4 = String.format("cpe:/a:oracle:opensso:%s", identifier.getValue().substring(22));
      +  393   +
                       try {
      +  394  0
                           dependency.addIdentifier("cpe",
      +  395   +
                                   newCpe,
      +  396   +
                                   String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe, "UTF-8")));
      +  397  0
                           dependency.addIdentifier("cpe",
      +  398   +
                                   newCpe2,
      +  399   +
                                   String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe2, "UTF-8")));
      +  400  0
                           dependency.addIdentifier("cpe",
      +  401   +
                                   newCpe3,
      +  402   +
                                   String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe3, "UTF-8")));
      +  403  0
                           dependency.addIdentifier("cpe",
      +  404   +
                                   newCpe4,
      +  405   +
                                   String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe4, "UTF-8")));
      +  406  0
                       } catch (UnsupportedEncodingException ex) {
      +  407  0
                           LOGGER.debug("", ex);
      +  408  0
                       }
      +  409   +
                   }
      +  410  3
               }
      +  411  3
           }
      +  412   +
       
      +  413   +
           /**
      +  414   +
            * Removes duplicate entries identified that are contained within JAR files. These occasionally crop up due to POM entries or
      +  415   +
            * other types of files (such as DLLs and EXEs) being contained within the JAR.
      +  416   +
            *
      +  417   +
            * @param dependency the dependency that might be a duplicate
      +  418   +
            * @param engine the engine used to scan all dependencies
      +  419   +
            */
      +  420   +
           private void removeDuplicativeEntriesFromJar(Dependency dependency, Engine engine) {
      +  421  3
               if (dependency.getFileName().toLowerCase().endsWith("pom.xml")
      +  422   +
                       || DLL_EXE_FILTER.accept(dependency.getActualFile())) {
      +  423  1
                   String parentPath = dependency.getFilePath().toLowerCase();
      +  424  1
                   if (parentPath.contains(".jar")) {
      +  425  0
                       parentPath = parentPath.substring(0, parentPath.indexOf(".jar") + 4);
      +  426  0
                       final Dependency parent = findDependency(parentPath, engine.getDependencies());
      +  427  0
                       if (parent != null) {
      +  428  0
                           boolean remove = false;
      +  429  0
                           for (Identifier i : dependency.getIdentifiers()) {
      +  430  0
                               if ("cpe".equals(i.getType())) {
      +  431  0
                                   final String trimmedCPE = trimCpeToVendor(i.getValue());
      +  432  0
                                   for (Identifier parentId : parent.getIdentifiers()) {
      +  433  0
                                       if ("cpe".equals(parentId.getType()) && parentId.getValue().startsWith(trimmedCPE)) {
      +  434  0
                                           remove |= true;
      +  435   +
                                       }
      +  436  0
                                   }
      +  437   +
                               }
      +  438  0
                               if (!remove) { //we can escape early
      +  439  0
                                   return;
      +  440   +
                               }
      +  441  0
                           }
      +  442  0
                           if (remove) {
      +  443  0
                               engine.getDependencies().remove(dependency);
      +  444   +
                           }
      +  445   +
                       }
      +  446   +
                   }
       447   -
                   }
      +
       
       448   -
       
      -  449  
               }
      -  450  24
           }
      +  449  3
           }
      +  450   +
       
       451   -
       
      +
           /**
       452   -
           /**
      -  453  
            * Retrieves a given dependency, based on a given path, from a list of dependencies.
      +  453   +
            *
       454   -
            *
      -  455  
            * @param dependencyPath the path of the dependency to return
      -  456   +  455  
            * @param dependencies the collection of dependencies to search
      -  457   +  456  
            * @return the dependency object for the given path, otherwise null
      +  457   +
            */
       458   -
            */
      -  459  
           private Dependency findDependency(String dependencyPath, List<Dependency> dependencies) {
      -  460  0
               for (Dependency d : dependencies) {
      -  461  0
                   if (d.getFilePath().equalsIgnoreCase(dependencyPath)) {
      -  462  0
                       return d;
      -  463   +  459  0
               for (Dependency d : dependencies) {
      +  460  0
                   if (d.getFilePath().equalsIgnoreCase(dependencyPath)) {
      +  461  0
                       return d;
      +  462  
                   }
      -  464  0
               }
      -  465  0
               return null;
      +  463  0
               }
      +  464  0
               return null;
      +  465   +
           }
       466   -
           }
      -  467  
       
      -  468   +  467  
           /**
      -  469   +  468  
            * Takes a full CPE and returns the CPE trimmed to include only vendor and product.
      -  470   +  469  
            *
      -  471   +  470  
            * @param value the CPE value to trim
      -  472   +  471  
            * @return a CPE value that only includes the vendor and product
      -  473   +  472  
            */
      -  474   +  473  
           private String trimCpeToVendor(String value) {
      -  475   +  474  
               //cpe:/a:jruby:jruby:1.0.8
      -  476  0
               final int pos1 = value.indexOf(":", 7); //right of vendor
      -  477  0
               final int pos2 = value.indexOf(":", pos1 + 1); //right of product
      -  478  0
               if (pos2 < 0) {
      -  479  0
                   return value;
      -  480   +  475  0
               final int pos1 = value.indexOf(":", 7); //right of vendor
      +  476  0
               final int pos2 = value.indexOf(":", pos1 + 1); //right of product
      +  477  0
               if (pos2 < 0) {
      +  478  0
                   return value;
      +  479  
               } else {
      -  481  0
                   return value.substring(0, pos2);
      -  482   +  480  0
                   return value.substring(0, pos2);
      +  481  
               }
      -  483   +  482  
           }
      -  484   +  483  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.FileNameAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.FileNameAnalyzer.html index 02f410190..4b71f8ab1 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.FileNameAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.FileNameAnalyzer.html @@ -83,7 +83,7 @@
        * @author Jeremy Long
       33  
        */
      -  34  64
       public class FileNameAnalyzer extends AbstractAnalyzer implements Analyzer {
      +  34  9
       public class FileNameAnalyzer extends AbstractAnalyzer implements Analyzer {
       35  
       
       36   @@ -102,7 +102,7 @@
            * The phase that this analyzer is intended to run in.
       43  
            */
      -  44  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
      +  44  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
       45  
       
       46   @@ -116,118 +116,122 @@  50  
            */
       51   -
           public String getName() {
      -  52  40
               return ANALYZER_NAME;
      -  53   -
           }
      -  54   -
       
      -  55   -
           /**
      -  56   -
            * Returns the phase that the analyzer is intended to run in.
      -  57   -
            *
      -  58   -
            * @return the phase that the analyzer is intended to run in.
      -  59   -
            */
      -  60   -
           public AnalysisPhase getAnalysisPhase() {
      -  61  24
               return ANALYSIS_PHASE;
      -  62   -
           }
      -  63   -
           //</editor-fold>
      -  64   -
       
      -  65   -
           /**
      -  66   -
            * Collects information about the file name.
      -  67   -
            *
      -  68   -
            * @param dependency the dependency to analyze.
      -  69   -
            * @param engine the engine that is scanning the dependencies
      -  70   -
            * @throws AnalysisException is thrown if there is an error reading the JAR file.
      -  71   -
            */
      -  72  
           @Override
      +  52   +
           public String getName() {
      +  53  5
               return ANALYZER_NAME;
      +  54   +
           }
      +  55   +
       
      +  56   +
           /**
      +  57   +
            * Returns the phase that the analyzer is intended to run in.
      +  58   +
            *
      +  59   +
            * @return the phase that the analyzer is intended to run in.
      +  60   +
            */
      +  61   +
           @Override
      +  62   +
           public AnalysisPhase getAnalysisPhase() {
      +  63  4
               return ANALYSIS_PHASE;
      +  64   +
           }
      +  65   +
           //</editor-fold>
      +  66   +
       
      +  67   +
           /**
      +  68   +
            * Collects information about the file name.
      +  69   +
            *
      +  70   +
            * @param dependency the dependency to analyze.
      +  71   +
            * @param engine the engine that is scanning the dependencies
      +  72   +
            * @throws AnalysisException is thrown if there is an error reading the JAR file.
       73   -
           public void analyze(Dependency dependency, Engine engine) throws AnalysisException {
      +
            */
       74   -
       
      +
           @Override
       75   +
           public void analyze(Dependency dependency, Engine engine) throws AnalysisException {
      +  76   +
       
      +  77  
               //strip any path information that may get added by ArchiveAnalyzer, etc.
      -  76  32
               final File f = dependency.getActualFile();
      -  77  32
               String fileName = f.getName();
      -  78   +  78  4
               final File f = dependency.getActualFile();
      +  79  4
               String fileName = f.getName();
      +  80  
       
      -  79   +  81  
               //remove file extension
      -  80  32
               final int pos = fileName.lastIndexOf(".");
      -  81  32
               if (pos > 0) {
      -  82  32
                   fileName = fileName.substring(0, pos);
      -  83   -
               }
      -  84   -
       
      +  82  4
               final int pos = fileName.lastIndexOf(".");
      +  83  4
               if (pos > 0) {
      +  84  4
                   fileName = fileName.substring(0, pos);
       85   -
               //add version evidence
      -  86  32
               final DependencyVersion version = DependencyVersionUtil.parseVersion(fileName);
      -  87  32
               if (version != null) {
      -  88   -
                   // If the version number is just a number like 2 or 23, reduce the confidence
      -  89   -
                   // a shade. This should hopefully correct for cases like log4j.jar or
      -  90   -
                   // struts2-core.jar
      -  91  32
                   if (version.getVersionParts() == null || version.getVersionParts().size() < 2) {
      -  92  0
                       dependency.getVersionEvidence().addEvidence("file", "name",
      -  93   -
                               version.toString(), Confidence.MEDIUM);
      -  94   -
                   } else {
      -  95  32
                       dependency.getVersionEvidence().addEvidence("file", "name",
      -  96   -
                               version.toString(), Confidence.HIGHEST);
      -  97   -
                   }
      -  98  32
                   dependency.getVersionEvidence().addEvidence("file", "name",
      -  99   -
                           fileName, Confidence.MEDIUM);
      -  100  
               }
      -  101   +  86  
       
      +  87   +
               //add version evidence
      +  88  4
               final DependencyVersion version = DependencyVersionUtil.parseVersion(fileName);
      +  89  4
               if (version != null) {
      +  90   +
                   // If the version number is just a number like 2 or 23, reduce the confidence
      +  91   +
                   // a shade. This should hopefully correct for cases like log4j.jar or
      +  92   +
                   // struts2-core.jar
      +  93  4
                   if (version.getVersionParts() == null || version.getVersionParts().size() < 2) {
      +  94  0
                       dependency.getVersionEvidence().addEvidence("file", "name",
      +  95   +
                               version.toString(), Confidence.MEDIUM);
      +  96   +
                   } else {
      +  97  4
                       dependency.getVersionEvidence().addEvidence("file", "name",
      +  98   +
                               version.toString(), Confidence.HIGHEST);
      +  99   +
                   }
      +  100  4
                   dependency.getVersionEvidence().addEvidence("file", "name",
      +  101   +
                           fileName, Confidence.MEDIUM);
       102   +
               }
      +  103   +
       
      +  104  
               //add as vendor and product evidence
      -  103  32
               if (fileName.contains("-")) {
      -  104  32
                   dependency.getProductEvidence().addEvidence("file", "name",
      -  105   -
                           fileName, Confidence.HIGHEST);
      -  106  32
                   dependency.getVendorEvidence().addEvidence("file", "name",
      +  105  4
               if (fileName.contains("-")) {
      +  106  4
                   dependency.getProductEvidence().addEvidence("file", "name",
       107  
                           fileName, Confidence.HIGHEST);
      -  108   -
               } else {
      -  109  0
                   dependency.getProductEvidence().addEvidence("file", "name",
      +  108  4
                   dependency.getVendorEvidence().addEvidence("file", "name",
      +  109   +
                           fileName, Confidence.HIGHEST);
       110   -
                           fileName, Confidence.HIGH);
      -  111  0
                   dependency.getVendorEvidence().addEvidence("file", "name",
      +
               } else {
      +  111  0
                   dependency.getProductEvidence().addEvidence("file", "name",
       112  
                           fileName, Confidence.HIGH);
      -  113   -
               }
      -  114  32
           }
      +  113  0
                   dependency.getVendorEvidence().addEvidence("file", "name",
      +  114   +
                           fileName, Confidence.HIGH);
       115   +
               }
      +  116  4
           }
      +  117  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.FileTypeAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.FileTypeAnalyzer.html index 1f14dae47..0f2c58acc 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.FileTypeAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.FileTypeAnalyzer.html @@ -85,6 +85,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.HintAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.HintAnalyzer.html index 60b513eca..147f10c60 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.HintAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.HintAnalyzer.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      HintAnalyzer
      75%
      30/40
      58%
      14/24
      5
      HintAnalyzer
      73%
      36/49
      56%
      17/30
      6
       
      @@ -83,7 +83,7 @@
        * @author Jeremy Long
       33  
        */
      -  34  48
       public class HintAnalyzer extends AbstractAnalyzer implements Analyzer {
      +  34  7
       public class HintAnalyzer extends AbstractAnalyzer implements Analyzer {
       35  
       
       36   @@ -102,7 +102,7 @@
            * The phase that this analyzer is intended to run in.
       43  
            */
      -  44  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.PRE_IDENTIFIER_ANALYSIS;
      +  44  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.PRE_IDENTIFIER_ANALYSIS;
       45  
       
       46   @@ -119,7 +119,7 @@
           @Override
       52  
           public String getName() {
      -  53  40
               return ANALYZER_NAME;
      +  53  5
               return ANALYZER_NAME;
       54  
           }
       55   @@ -138,7 +138,7 @@
           @Override
       62  
           public AnalysisPhase getAnalysisPhase() {
      -  63  24
               return ANALYSIS_PHASE;
      +  63  4
               return ANALYSIS_PHASE;
       64  
           }
       65   @@ -165,7 +165,7 @@
           @Override
       76  
           public void analyze(Dependency dependency, Engine engine) throws AnalysisException {
      -  77  16
               final Evidence springTest1 = new Evidence("Manifest",
      +  77  2
               final Evidence springTest1 = new Evidence("Manifest",
       78  
                       "Implementation-Title",
       79   @@ -174,7 +174,7 @@
                       Confidence.HIGH);
       81  
       
      -  82  16
               final Evidence springTest2 = new Evidence("Manifest",
      +  82  2
               final Evidence springTest2 = new Evidence("Manifest",
       83  
                       "Implementation-Title",
       84   @@ -183,7 +183,7 @@
                       Confidence.HIGH);
       86  
       
      -  87  16
               final Evidence springTest3 = new Evidence("Manifest",
      +  87  2
               final Evidence springTest3 = new Evidence("Manifest",
       88  
                       "Implementation-Title",
       89   @@ -192,7 +192,7 @@
                       Confidence.HIGH);
       91  
       
      -  92  16
               final Evidence springTest4 = new Evidence("jar",
      +  92  2
               final Evidence springTest4 = new Evidence("jar",
       93  
                       "package name",
       94   @@ -201,7 +201,7 @@
                       Confidence.LOW);
       96  
       
      -  97  16
               final Evidence springSecurityTest1 = new Evidence("Manifest",
      +  97  2
               final Evidence springSecurityTest1 = new Evidence("Manifest",
       98  
                       "Bundle-Name",
       99   @@ -210,7 +210,7 @@
                       Confidence.MEDIUM);
       101  
       
      -  102  16
               final Evidence springSecurityTest2 = new Evidence("pom",
      +  102  2
               final Evidence springSecurityTest2 = new Evidence("pom",
       103  
                       "artifactid",
       104   @@ -219,64 +219,109 @@
                       Confidence.HIGH);
       106  
       
      -  107   -
               //springsource/vware problem
      -  108  16
               final Set<Evidence> product = dependency.getProductEvidence().getEvidence();
      -  109  16
               final Set<Evidence> vendor = dependency.getVendorEvidence().getEvidence();
      +  107  2
               final Evidence symfony = new Evidence("composer.lock",
      +  108   +
                   "vendor",
      +  109   +
                   "symfony",
       110   +
                   Confidence.HIGHEST);
      +  111  
       
      -  111  16
               if (product.contains(springTest1) || product.contains(springTest2) || product.contains(springTest3)
      -  112   -
                       || (dependency.getFileName().contains("spring") && product.contains(springTest4))) {
      -  113  8
                   dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource spring framework", Confidence.HIGH);
      -  114  8
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "SpringSource", Confidence.HIGH);
      -  115  8
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH);
      -  116  8
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "pivotal", Confidence.HIGH);
      -  117   -
               }
      +  112  2
               final Evidence zendframeworkVendor = new Evidence("composer.lock",
      +  113   +
                   "vendor",
      +  114   +
                   "zendframework",
      +  115   +
                   Confidence.HIGHEST);
      +  116   +
       
      +  117  2
               final Evidence zendframeworkProduct = new Evidence("composer.lock",
       118   +
                   "product",
      +  119   +
                   "zendframework",
      +  120   +
                   Confidence.HIGHEST);
      +  121  
       
      -  119  16
               if (vendor.contains(springTest4)) {
      -  120  8
                   dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource_spring_framework", Confidence.HIGH);
      -  121  8
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH);
      -  122  8
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "pivotal", Confidence.HIGH);
      -  123   +  122   +
               //springsource/vware problem
      +  123  2
               final Set<Evidence> product = dependency.getProductEvidence().getEvidence();
      +  124  2
               final Set<Evidence> vendor = dependency.getVendorEvidence().getEvidence();
      +  125   +
       
      +  126  2
               if (product.contains(springTest1) || product.contains(springTest2) || product.contains(springTest3)
      +  127   +
                       || (dependency.getFileName().contains("spring") && product.contains(springTest4))) {
      +  128  1
                   dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource spring framework", Confidence.HIGH);
      +  129  1
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "SpringSource", Confidence.HIGH);
      +  130  1
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH);
      +  131  1
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "pivotal", Confidence.HIGH);
      +  132  
               }
      -  124   +  133  
       
      -  125  16
               if (product.contains(springSecurityTest1) || product.contains(springSecurityTest2)) {
      -  126  0
                   dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource_spring_security", Confidence.HIGH);
      -  127  0
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "SpringSource", Confidence.HIGH);
      -  128  0
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH);
      -  129   +  134  2
               if (vendor.contains(springTest4)) {
      +  135  1
                   dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource_spring_framework", Confidence.HIGH);
      +  136  1
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH);
      +  137  1
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "pivotal", Confidence.HIGH);
      +  138  
               }
      -  130   +  139  
       
      -  131   -
               //sun/oracle problem
      -  132  16
               final Iterator<Evidence> itr = dependency.getVendorEvidence().iterator();
      -  133  16
               final List<Evidence> newEntries = new ArrayList<Evidence>();
      -  134  216
               while (itr.hasNext()) {
      -  135  200
                   final Evidence e = itr.next();
      -  136  200
                   if ("sun".equalsIgnoreCase(e.getValue(false))) {
      -  137  0
                       final Evidence newEvidence = new Evidence(e.getSource() + " (hint)", e.getName(), "oracle", e.getConfidence());
      -  138  0
                       newEntries.add(newEvidence);
      -  139  0
                   } else if ("oracle".equalsIgnoreCase(e.getValue(false))) {
      -  140  0
                       final Evidence newEvidence = new Evidence(e.getSource() + " (hint)", e.getName(), "sun", e.getConfidence());
      -  141  0
                       newEntries.add(newEvidence);
      -  142   -
                   }
      -  143  200
               }
      -  144  16
               for (Evidence e : newEntries) {
      -  145  0
                   dependency.getVendorEvidence().addEvidence(e);
      -  146  0
               }
      -  147   +  140  2
               if (product.contains(springSecurityTest1) || product.contains(springSecurityTest2)) {
      +  141  0
                   dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource_spring_security", Confidence.HIGH);
      +  142  0
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "SpringSource", Confidence.HIGH);
      +  143  0
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH);
      +  144   +
               }
      +  145  
       
      -  148  16
           }
      +  146  2
               if (vendor.contains(symfony)) {
      +  147  0
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "sensiolabs", Confidence.HIGHEST);
      +  148   +
               }
       149   +
       
      +  150  2
               if (vendor.contains(zendframeworkVendor)) {
      +  151  0
                   dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "zend", Confidence.HIGHEST);
      +  152   +
               }
      +  153   +
       
      +  154  2
               if (product.contains(zendframeworkProduct)) {
      +  155  0
                   dependency.getProductEvidence().addEvidence("hint analyzer", "vendor", "zend_framework", Confidence.HIGHEST);
      +  156   +
               }
      +  157   +
       
      +  158   +
               //sun/oracle problem
      +  159  2
               final Iterator<Evidence> itr = dependency.getVendorEvidence().iterator();
      +  160  2
               final List<Evidence> newEntries = new ArrayList<Evidence>();
      +  161  27
               while (itr.hasNext()) {
      +  162  25
                   final Evidence e = itr.next();
      +  163  25
                   if ("sun".equalsIgnoreCase(e.getValue(false))) {
      +  164  0
                       final Evidence newEvidence = new Evidence(e.getSource() + " (hint)", e.getName(), "oracle", e.getConfidence());
      +  165  0
                       newEntries.add(newEvidence);
      +  166  0
                   } else if ("oracle".equalsIgnoreCase(e.getValue(false))) {
      +  167  0
                       final Evidence newEvidence = new Evidence(e.getSource() + " (hint)", e.getName(), "sun", e.getConfidence());
      +  168  0
                       newEntries.add(newEvidence);
      +  169   +
                   }
      +  170  25
               }
      +  171  2
               for (Evidence e : newEntries) {
      +  172  0
                   dependency.getVendorEvidence().addEvidence(e);
      +  173  0
               }
      +  174   +
       
      +  175  2
           }
      +  176  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.JarAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.JarAnalyzer.html index d90657d5c..21bcef9e1 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.JarAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.JarAnalyzer.html @@ -12,8 +12,8 @@
       
      - - + +
      Classes in this File Line Coverage Branch Coverage Complexity
      JarAnalyzer
      62%
      301/481
      49%
      164/332
      7.129
      JarAnalyzer$ClassNameInformation
      80%
      17/21
      80%
      8/10
      7.129
      JarAnalyzer
      63%
      301/475
      49%
      164/330
      7.097
      JarAnalyzer$ClassNameInformation
      80%
      17/21
      80%
      8/10
      7.097
       
      @@ -57,55 +57,55 @@  19  
       
       20   -
       import java.io.BufferedOutputStream;
      -  21  
       import java.io.File;
      -  22   +  21  
       import java.io.FileFilter;
      -  23   +  22  
       import java.io.FileOutputStream;
      -  24   +  23  
       import java.io.IOException;
      -  25   +  24  
       import java.io.InputStream;
      -  26   +  25  
       import java.io.InputStreamReader;
      -  27   +  26  
       import java.io.OutputStream;
      -  28   +  27  
       import java.io.Reader;
      -  29   +  28  
       import java.util.ArrayList;
      -  30   +  29  
       import java.util.Collections;
      -  31   +  30  
       import java.util.Enumeration;
      -  32   +  31  
       import java.util.HashMap;
      -  33   +  32  
       import java.util.List;
      -  34   +  33  
       import java.util.Map;
      -  35   +  34  
       import java.util.Map.Entry;
      -  36   +  35  
       import java.util.Properties;
      -  37   +  36  
       import java.util.Set;
      -  38   +  37  
       import java.util.StringTokenizer;
      -  39   +  38  
       import java.util.jar.Attributes;
      -  40   +  39  
       import java.util.jar.JarEntry;
      -  41   +  40  
       import java.util.jar.JarFile;
      -  42   +  41  
       import java.util.jar.Manifest;
      -  43   +  42  
       import java.util.regex.Pattern;
      -  44   +  43  
       import java.util.zip.ZipEntry;
      +  44   +
       import org.apache.commons.compress.utils.IOUtils;
       45  
       import org.jsoup.Jsoup;
       46   @@ -158,124 +158,124 @@
            * The logger.
       70  
            */
      -  71  8
           private static final Logger LOGGER = LoggerFactory.getLogger(JarAnalyzer.class);
      +  71  1
           private static final Logger LOGGER = LoggerFactory.getLogger(JarAnalyzer.class);
       72  
           /**
       73   -
            * The buffer size to use when extracting files from the archive.
      +
            * The count of directories created during analysis. This is used for creating temporary directories.
       74  
            */
      -  75   -
           private static final int BUFFER_SIZE = 4096;
      +  75  1
           private static int dirCount = 0;
       76  
           /**
       77   -
            * The count of directories created during analysis. This is used for creating temporary directories.
      +
            * The system independent newline character.
       78  
            */
      -  79  8
           private static int dirCount = 0;
      +  79  1
           private static final String NEWLINE = System.getProperty("line.separator");
       80  
           /**
       81   -
            * The system independent newline character.
      +
            * A list of values in the manifest to ignore as they only result in false positives.
       82  
            */
      -  83  8
           private static final String NEWLINE = System.getProperty("line.separator");
      +  83  1
           private static final Set<String> IGNORE_VALUES = newHashSet(
       84   -
           /**
      -  85   -
            * A list of values in the manifest to ignore as they only result in false positives.
      -  86   -
            */
      -  87  8
           private static final Set<String> IGNORE_VALUES = newHashSet(
      -  88  
                   "Sun Java System Application Server");
      -  89   +  85  
           /**
      -  90   +  86  
            * A list of elements in the manifest to ignore.
      -  91   +  87  
            */
      -  92  8
           private static final Set<String> IGNORE_KEYS = newHashSet(
      -  93   +  88  1
           private static final Set<String> IGNORE_KEYS = newHashSet(
      +  89  
                   "built-by",
      -  94   +  90  
                   "created-by",
      -  95   +  91  
                   "builtby",
      -  96   +  92  
                   "createdby",
      -  97   +  93  
                   "build-jdk",
      -  98   +  94  
                   "buildjdk",
      -  99   +  95  
                   "ant-version",
      -  100   +  96  
                   "antversion",
      -  101   +  97  
                   "dynamicimportpackage",
      -  102   +  98  
                   "dynamicimport-package",
      -  103   +  99  
                   "dynamic-importpackage",
      -  104   +  100  
                   "dynamic-import-package",
      -  105   +  101  
                   "import-package",
      -  106   +  102  
                   "ignore-package",
      -  107   +  103  
                   "export-package",
      -  108   +  104  
                   "importpackage",
      -  109   +  105  
                   "ignorepackage",
      -  110   +  106  
                   "exportpackage",
      -  111   +  107  
                   "sealed",
      -  112   +  108  
                   "manifest-version",
      -  113   +  109  
                   "archiver-version",
      -  114   +  110  
                   "manifestversion",
      -  115   +  111  
                   "archiverversion",
      -  116   +  112  
                   "classpath",
      -  117   +  113  
                   "class-path",
      -  118   +  114  
                   "tool",
      -  119   +  115  
                   "bundle-manifestversion",
      -  120   +  116  
                   "bundlemanifestversion",
      -  121   +  117  
                   "bundle-vendor",
      -  122   +  118  
                   "include-resource",
      -  123   +  119  
                   "embed-dependency",
      -  124   +  120  
                   "ipojo-components",
      -  125   +  121  
                   "ipojo-extension",
      -  126   +  122  
                   "eclipse-sourcereferences");
      -  127   +  123  
           /**
      -  128   +  124  
            * Deprecated Jar manifest attribute, that is, nonetheless, useful for analysis.
      -  129   +  125  
            */
      -  130   +  126  
           @SuppressWarnings("deprecation")
      -  131  8
           private static final String IMPLEMENTATION_VENDOR_ID = Attributes.Name.IMPLEMENTATION_VENDOR_ID
      -  132   +  127  1
           private static final String IMPLEMENTATION_VENDOR_ID = Attributes.Name.IMPLEMENTATION_VENDOR_ID
      +  128  
                   .toString();
      +  129   +
           /**
      +  130   +
            * item in some manifest, should be considered medium confidence.
      +  131   +
            */
      +  132   +
           private static final String BUNDLE_VERSION = "Bundle-Version"; //: 2.1.2
       133  
           /**
       134   @@ -283,7 +283,7 @@  135  
            */
       136   -
           private static final String BUNDLE_VERSION = "Bundle-Version"; //: 2.1.2
      +
           private static final String BUNDLE_DESCRIPTION = "Bundle-Description"; //: Apache Struts 2
       137  
           /**
       138   @@ -291,1615 +291,1599 @@  139  
            */
       140   -
           private static final String BUNDLE_DESCRIPTION = "Bundle-Description"; //: Apache Struts 2
      +
           private static final String BUNDLE_NAME = "Bundle-Name"; //: Struts 2 Core
       141  
           /**
       142   -
            * item in some manifest, should be considered medium confidence.
      +
            * A pattern to detect HTML within text.
       143  
            */
      -  144   -
           private static final String BUNDLE_NAME = "Bundle-Name"; //: Struts 2 Core
      +  144  1
           private static final Pattern HTML_DETECTION_PATTERN = Pattern.compile("\\<[a-z]+.*/?\\>", Pattern.CASE_INSENSITIVE);
       145   -
           /**
      +
       
       146   -
            * A pattern to detect HTML within text.
      -  147   -
            */
      -  148  8
           private static final Pattern HTML_DETECTION_PATTERN = Pattern.compile("\\<[a-z]+.*/?\\>", Pattern.CASE_INSENSITIVE);
      -  149   -
       
      -  150  
           //</editor-fold>
      -  151   +  147  
           /**
      -  152   +  148  
            * Constructs a new JarAnalyzer.
      -  153   +  149  
            */
      -  154  48
           public JarAnalyzer() {
      -  155  48
           }
      -  156   +  150  7
           public JarAnalyzer() {
      +  151  7
           }
      +  152  
       
      -  157   +  153  
           //<editor-fold defaultstate="collapsed" desc="All standard implmentation details of Analyzer">
      +  154   +
           /**
      +  155   +
            * The name of the analyzer.
      +  156   +
            */
      +  157   +
           private static final String ANALYZER_NAME = "Jar Analyzer";
       158  
           /**
       159   -
            * The name of the analyzer.
      +
            * The phase that this analyzer is intended to run in.
       160  
            */
      -  161   -
           private static final String ANALYZER_NAME = "Jar Analyzer";
      +  161  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
       162  
           /**
       163   -
            * The phase that this analyzer is intended to run in.
      +
            * The set of file extensions supported by this analyzer.
       164  
            */
      -  165  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
      +  165  1
           private static final String[] EXTENSIONS = {"jar", "war"};
       166   -
           /**
      +
       
       167   -
            * The set of file extensions supported by this analyzer.
      +
           /**
       168   -
            */
      -  169  8
           private static final String[] EXTENSIONS = {"jar", "war"};
      -  170   -
       
      -  171   -
           /**
      -  172  
            * The file filter used to determine which files this analyzer supports.
      +  169   +
            */
      +  170  1
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build();
      +  171   +
       
      +  172   +
           /**
       173   -
            */
      -  174  8
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build();
      -  175   -
       
      -  176   -
           /**
      -  177  
            * Returns the FileFilter.
      -  178   +  174  
            *
      -  179   +  175  
            * @return the FileFilter
      -  180   +  176  
            */
      -  181   +  177  
           @Override
      -  182   +  178  
           protected FileFilter getFileFilter() {
      -  183  6840
               return FILTER;
      -  184   +  179  855
               return FILTER;
      +  180  
           }
      -  185   +  181  
       
      -  186   +  182  
           /**
      -  187   +  183  
            * Returns the name of the analyzer.
      -  188   +  184  
            *
      -  189   +  185  
            * @return the name of the analyzer.
      -  190   +  186  
            */
      -  191   +  187  
           @Override
      -  192   +  188  
           public String getName() {
      -  193  40
               return ANALYZER_NAME;
      -  194   +  189  5
               return ANALYZER_NAME;
      +  190  
           }
      -  195   +  191  
       
      -  196   +  192  
           /**
      -  197   +  193  
            * Returns the phase that the analyzer is intended to run in.
      -  198   +  194  
            *
      -  199   +  195  
            * @return the phase that the analyzer is intended to run in.
      -  200   +  196  
            */
      -  201   +  197   +
           @Override
      +  198  
           public AnalysisPhase getAnalysisPhase() {
      -  202  16
               return ANALYSIS_PHASE;
      -  203   +  199  3
               return ANALYSIS_PHASE;
      +  200  
           }
      -  204   +  201  
           //</editor-fold>
      -  205   +  202  
       
      -  206   +  203  
           /**
      -  207   +  204  
            * Returns the key used in the properties file to reference the analyzer's enabled property.
      -  208   +  205  
            *
      -  209   +  206  
            * @return the analyzer's enabled property setting key
      -  210   +  207  
            */
      -  211   +  208  
           @Override
      -  212   +  209  
           protected String getAnalyzerEnabledSettingKey() {
      -  213  48
               return Settings.KEYS.ANALYZER_JAR_ENABLED;
      +  210  7
               return Settings.KEYS.ANALYZER_JAR_ENABLED;
      +  211   +
           }
      +  212   +
       
      +  213   +
           /**
       214   -
           }
      -  215   -
       
      -  216   -
           /**
      -  217  
            * Loads a specified JAR file and collects information from the manifest and checksums to identify the correct CPE
      -  218   +  215  
            * information.
      -  219   +  216  
            *
      -  220   +  217  
            * @param dependency the dependency to analyze.
      -  221   +  218  
            * @param engine the engine that is scanning the dependencies
      -  222   +  219  
            * @throws AnalysisException is thrown if there is an error reading the JAR file.
      -  223   +  220  
            */
      -  224   +  221  
           @Override
      -  225   +  222  
           public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
      -  226   +  223  
               try {
      -  227  40
                   final List<ClassNameInformation> classNames = collectClassNames(dependency);
      -  228  40
                   final String fileName = dependency.getFileName().toLowerCase();
      -  229  40
                   if (classNames.isEmpty()
      -  230   +  224  5
                   final List<ClassNameInformation> classNames = collectClassNames(dependency);
      +  225  5
                   final String fileName = dependency.getFileName().toLowerCase();
      +  226  5
                   if (classNames.isEmpty()
      +  227  
                           && (fileName.endsWith("-sources.jar")
      -  231   +  228  
                           || fileName.endsWith("-javadoc.jar")
      -  232   +  229  
                           || fileName.endsWith("-src.jar")
      -  233   +  230  
                           || fileName.endsWith("-doc.jar"))) {
      -  234  0
                       engine.getDependencies().remove(dependency);
      -  235   +  231  0
                       engine.getDependencies().remove(dependency);
      +  232  
                   }
      -  236  40
                   final boolean hasManifest = parseManifest(dependency, classNames);
      -  237  40
                   final boolean hasPOM = analyzePOM(dependency, classNames, engine);
      -  238  40
                   final boolean addPackagesAsEvidence = !(hasManifest && hasPOM);
      -  239  40
                   analyzePackageNames(classNames, dependency, addPackagesAsEvidence);
      -  240  0
               } catch (IOException ex) {
      -  241  0
                   throw new AnalysisException("Exception occurred reading the JAR file.", ex);
      -  242  40
               }
      -  243  40
           }
      -  244   +  233  5
                   final boolean hasManifest = parseManifest(dependency, classNames);
      +  234  5
                   final boolean hasPOM = analyzePOM(dependency, classNames, engine);
      +  235  5
                   final boolean addPackagesAsEvidence = !(hasManifest && hasPOM);
      +  236  5
                   analyzePackageNames(classNames, dependency, addPackagesAsEvidence);
      +  237  0
               } catch (IOException ex) {
      +  238  0
                   throw new AnalysisException("Exception occurred reading the JAR file.", ex);
      +  239  5
               }
      +  240  5
           }
      +  241  
       
      -  245   +  242  
           /**
      -  246   +  243  
            * Attempts to find a pom.xml within the JAR file. If found it extracts information and adds it to the evidence. This will
      -  247   +  244  
            * attempt to interpolate the strings contained within the pom.properties if one exists.
      -  248   +  245  
            *
      -  249   +  246  
            * @param dependency the dependency being analyzed
      -  250   +  247  
            * @param classes a collection of class name information
      -  251   +  248  
            * @param engine the analysis engine, used to add additional dependencies
      -  252   +  249  
            * @throws AnalysisException is thrown if there is an exception parsing the pom
      -  253   +  250  
            * @return whether or not evidence was added to the dependency
      -  254   +  251  
            */
      -  255   +  252  
           protected boolean analyzePOM(Dependency dependency, List<ClassNameInformation> classes, Engine engine) throws AnalysisException {
      -  256  40
               boolean foundSomething = false;
      -  257   +  253  5
               boolean foundSomething = false;
      +  254  
               final JarFile jar;
      -  258   +  255  
               try {
      -  259  40
                   jar = new JarFile(dependency.getActualFilePath());
      -  260  0
               } catch (IOException ex) {
      -  261  0
                   LOGGER.warn("Unable to read JarFile '{}'.", dependency.getActualFilePath());
      -  262  0
                   LOGGER.trace("", ex);
      -  263  0
                   return false;
      -  264  40
               }
      -  265   +  256  5
                   jar = new JarFile(dependency.getActualFilePath());
      +  257  0
               } catch (IOException ex) {
      +  258  0
                   LOGGER.warn("Unable to read JarFile '{}'.", dependency.getActualFilePath());
      +  259  0
                   LOGGER.trace("", ex);
      +  260  0
                   return false;
      +  261  5
               }
      +  262  
               List<String> pomEntries;
      -  266   +  263  
               try {
      -  267  40
                   pomEntries = retrievePomListing(jar);
      -  268  0
               } catch (IOException ex) {
      -  269  0
                   LOGGER.warn("Unable to read Jar file entries in '{}'.", dependency.getActualFilePath());
      -  270  0
                   LOGGER.trace("", ex);
      -  271  0
                   return false;
      -  272  40
               }
      -  273  40
               File externalPom = null;
      -  274  40
               if (pomEntries.isEmpty()) {
      -  275  32
                   String pomPath = dependency.getActualFilePath();
      -  276  32
                   pomPath = pomPath.substring(0, pomPath.lastIndexOf('.')) + ".pom";
      -  277  32
                   externalPom = new File(pomPath);
      -  278  32
                   if (externalPom.isFile()) {
      -  279  0
                       pomEntries.add(pomPath);
      -  280   +  264  5
                   pomEntries = retrievePomListing(jar);
      +  265  0
               } catch (IOException ex) {
      +  266  0
                   LOGGER.warn("Unable to read Jar file entries in '{}'.", dependency.getActualFilePath());
      +  267  0
                   LOGGER.trace("", ex);
      +  268  0
                   return false;
      +  269  5
               }
      +  270  5
               File externalPom = null;
      +  271  5
               if (pomEntries.isEmpty()) {
      +  272  4
                   String pomPath = dependency.getActualFilePath();
      +  273  4
                   pomPath = pomPath.substring(0, pomPath.lastIndexOf('.')) + ".pom";
      +  274  4
                   externalPom = new File(pomPath);
      +  275  4
                   if (externalPom.isFile()) {
      +  276  0
                       pomEntries.add(pomPath);
      +  277  
                   } else {
      -  281  32
                       return false;
      -  282   +  278  4
                       return false;
      +  279  
                   }
      -  283   +  280  
               }
      -  284  8
               for (String path : pomEntries) {
      -  285  8
                   LOGGER.debug("Reading pom entry: {}", path);
      -  286  8
                   Properties pomProperties = null;
      +  281  1
               for (String path : pomEntries) {
      +  282  1
                   LOGGER.debug("Reading pom entry: {}", path);
      +  283  1
                   Properties pomProperties = null;
      +  284   +
                   try {
      +  285  1
                       if (externalPom == null) {
      +  286  1
                           pomProperties = retrievePomProperties(path, jar);
       287   -
                   try {
      -  288  8
                       if (externalPom == null) {
      -  289  8
                           pomProperties = retrievePomProperties(path, jar);
      -  290  
                       }
      -  291  0
                   } catch (IOException ex) {
      -  292  0
                       LOGGER.trace("ignore this, failed reading a non-existent pom.properties", ex);
      -  293  8
                   }
      -  294  8
                   Model pom = null;
      -  295   +  288  0
                   } catch (IOException ex) {
      +  289  0
                       LOGGER.trace("ignore this, failed reading a non-existent pom.properties", ex);
      +  290  1
                   }
      +  291  1
                   Model pom = null;
      +  292  
                   try {
      -  296  8
                       if (pomEntries.size() > 1) {
      -  297   +  293  1
                       if (pomEntries.size() > 1) {
      +  294  
                           //extract POM to its own directory and add it as its own dependency
      -  298  0
                           final Dependency newDependency = new Dependency();
      -  299  0
                           pom = extractPom(path, jar, newDependency);
      -  300   +  295  0
                           final Dependency newDependency = new Dependency();
      +  296  0
                           pom = extractPom(path, jar, newDependency);
      +  297  
       
      -  301  0
                           final String displayPath = String.format("%s%s%s",
      -  302   +  298  0
                           final String displayPath = String.format("%s%s%s",
      +  299  
                                   dependency.getFilePath(),
      +  300   +
                                   File.separator,
      +  301   +
                                   path);
      +  302  0
                           final String displayName = String.format("%s%s%s",
       303   -
                                   File.separator,
      -  304   -
                                   path);
      -  305  0
                           final String displayName = String.format("%s%s%s",
      -  306  
                                   dependency.getFileName(),
      -  307   +  304  
                                   File.separator,
      -  308   +  305  
                                   path);
      -  309   +  306  
       
      -  310  0
                           newDependency.setFileName(displayName);
      -  311  0
                           newDependency.setFilePath(displayPath);
      -  312  0
                           pom.processProperties(pomProperties);
      -  313  0
                           setPomEvidence(newDependency, pom, null);
      -  314  0
                           engine.getDependencies().add(newDependency);
      -  315  0
                           Collections.sort(engine.getDependencies());
      -  316  0
                       } else {
      -  317  8
                           if (externalPom == null) {
      -  318  8
                               pom = PomUtils.readPom(path, jar);
      -  319   +  307  0
                           newDependency.setFileName(displayName);
      +  308  0
                           newDependency.setFilePath(displayPath);
      +  309  0
                           pom.processProperties(pomProperties);
      +  310  0
                           setPomEvidence(newDependency, pom, null);
      +  311  0
                           engine.getDependencies().add(newDependency);
      +  312  0
                           Collections.sort(engine.getDependencies());
      +  313  0
                       } else {
      +  314  1
                           if (externalPom == null) {
      +  315  1
                               pom = PomUtils.readPom(path, jar);
      +  316  
                           } else {
      -  320  0
                               pom = PomUtils.readPom(externalPom);
      -  321   +  317  0
                               pom = PomUtils.readPom(externalPom);
      +  318  
                           }
      -  322  8
                           pom.processProperties(pomProperties);
      -  323  8
                           foundSomething |= setPomEvidence(dependency, pom, classes);
      -  324   +  319  1
                           pom.processProperties(pomProperties);
      +  320  1
                           foundSomething |= setPomEvidence(dependency, pom, classes);
      +  321  
                       }
      -  325  0
                   } catch (AnalysisException ex) {
      -  326  0
                       LOGGER.warn("An error occured while analyzing '{}'.", dependency.getActualFilePath());
      -  327  0
                       LOGGER.trace("", ex);
      -  328  8
                   }
      -  329  8
               }
      -  330  8
               return foundSomething;
      +  322  0
                   } catch (AnalysisException ex) {
      +  323  0
                       LOGGER.warn("An error occured while analyzing '{}'.", dependency.getActualFilePath());
      +  324  0
                       LOGGER.trace("", ex);
      +  325  1
                   }
      +  326  1
               }
      +  327  1
               return foundSomething;
      +  328   +
           }
      +  329   +
       
      +  330   +
           /**
       331   -
           }
      -  332   -
       
      -  333   -
           /**
      -  334  
            * Given a path to a pom.xml within a JarFile, this method attempts to load a sibling pom.properties if one exists.
      -  335   +  332  
            *
      -  336   +  333  
            * @param path the path to the pom.xml within the JarFile
      -  337   +  334  
            * @param jar the JarFile to load the pom.properties from
      -  338   +  335  
            * @return a Properties object or null if no pom.properties was found
      -  339   +  336  
            * @throws IOException thrown if there is an exception reading the pom.properties
      -  340   +  337  
            */
      -  341   +  338  
           private Properties retrievePomProperties(String path, final JarFile jar) throws IOException {
      -  342  8
               Properties pomProperties = null;
      -  343  8
               final String propPath = path.substring(0, path.length() - 7) + "pom.properies";
      -  344  8
               final ZipEntry propEntry = jar.getEntry(propPath);
      -  345  8
               if (propEntry != null) {
      -  346  0
                   Reader reader = null;
      -  347   +  339  1
               Properties pomProperties = null;
      +  340  1
               final String propPath = path.substring(0, path.length() - 7) + "pom.properies";
      +  341  1
               final ZipEntry propEntry = jar.getEntry(propPath);
      +  342  1
               if (propEntry != null) {
      +  343  0
                   Reader reader = null;
      +  344  
                   try {
      -  348  0
                       reader = new InputStreamReader(jar.getInputStream(propEntry), "UTF-8");
      -  349  0
                       pomProperties = new Properties();
      -  350  0
                       pomProperties.load(reader);
      -  351  0
                       LOGGER.debug("Read pom.properties: {}", propPath);
      -  352   +  345  0
                       reader = new InputStreamReader(jar.getInputStream(propEntry), "UTF-8");
      +  346  0
                       pomProperties = new Properties();
      +  347  0
                       pomProperties.load(reader);
      +  348  0
                       LOGGER.debug("Read pom.properties: {}", propPath);
      +  349  
                   } finally {
      -  353  0
                       if (reader != null) {
      -  354   +  350  0
                       if (reader != null) {
      +  351  
                           try {
      -  355  0
                               reader.close();
      -  356  0
                           } catch (IOException ex) {
      -  357  0
                               LOGGER.trace("close error", ex);
      -  358  0
                           }
      -  359   +  352  0
                               reader.close();
      +  353  0
                           } catch (IOException ex) {
      +  354  0
                               LOGGER.trace("close error", ex);
      +  355  0
                           }
      +  356  
                       }
      +  357   +
                   }
      +  358   +
               }
      +  359  1
               return pomProperties;
       360   -
                   }
      +
           }
       361   -
               }
      -  362  8
               return pomProperties;
      +
       
      +  362   +
           /**
       363   -
           }
      -  364   -
       
      -  365   -
           /**
      -  366  
            * Searches a JarFile for pom.xml entries and returns a listing of these entries.
      -  367   +  364  
            *
      -  368   +  365  
            * @param jar the JarFile to search
      -  369   +  366  
            * @return a list of pom.xml entries
      -  370   +  367  
            * @throws IOException thrown if there is an exception reading a JarEntry
      -  371   +  368  
            */
      -  372   +  369  
           private List<String> retrievePomListing(final JarFile jar) throws IOException {
      -  373  40
               final List<String> pomEntries = new ArrayList<String>();
      -  374  40
               final Enumeration<JarEntry> entries = jar.entries();
      -  375  14784
               while (entries.hasMoreElements()) {
      -  376  14744
                   final JarEntry entry = entries.nextElement();
      -  377  14744
                   final String entryName = (new File(entry.getName())).getName().toLowerCase();
      -  378  14744
                   if (!entry.isDirectory() && "pom.xml".equals(entryName)) {
      -  379  8
                       LOGGER.trace("POM Entry found: {}", entry.getName());
      -  380  8
                       pomEntries.add(entry.getName());
      +  370  5
               final List<String> pomEntries = new ArrayList<String>();
      +  371  5
               final Enumeration<JarEntry> entries = jar.entries();
      +  372  1848
               while (entries.hasMoreElements()) {
      +  373  1843
                   final JarEntry entry = entries.nextElement();
      +  374  1843
                   final String entryName = (new File(entry.getName())).getName().toLowerCase();
      +  375  1843
                   if (!entry.isDirectory() && "pom.xml".equals(entryName)) {
      +  376  1
                       LOGGER.trace("POM Entry found: {}", entry.getName());
      +  377  1
                       pomEntries.add(entry.getName());
      +  378   +
                   }
      +  379  1843
               }
      +  380  5
               return pomEntries;
       381   -
                   }
      -  382  14744
               }
      -  383  40
               return pomEntries;
      +
           }
      +  382   +
       
      +  383   +
           /**
       384   -
           }
      -  385   -
       
      -  386   -
           /**
      -  387  
            * Retrieves the specified POM from a jar file and converts it to a Model.
      -  388   +  385  
            *
      -  389   +  386  
            * @param path the path to the pom.xml file within the jar file
      -  390   +  387  
            * @param jar the jar file to extract the pom from
      -  391   +  388  
            * @param dependency the dependency being analyzed
      -  392   +  389  
            * @return returns the POM object
      -  393   +  390  
            * @throws AnalysisException is thrown if there is an exception extracting or parsing the POM
      -  394   +  391  
            * {@link org.owasp.dependencycheck.xml.pom.Model} object
      -  395   +  392  
            */
      -  396   +  393  
           private Model extractPom(String path, JarFile jar, Dependency dependency) throws AnalysisException {
      -  397  0
               InputStream input = null;
      -  398  0
               FileOutputStream fos = null;
      -  399  0
               BufferedOutputStream bos = null;
      -  400  0
               final File tmpDir = getNextTempDirectory();
      -  401  0
               final File file = new File(tmpDir, "pom.xml");
      -  402   +  394  0
               InputStream input = null;
      +  395  0
               FileOutputStream fos = null;
      +  396  0
               final File tmpDir = getNextTempDirectory();
      +  397  0
               final File file = new File(tmpDir, "pom.xml");
      +  398  
               try {
      -  403  0
                   final ZipEntry entry = jar.getEntry(path);
      -  404  0
                   input = jar.getInputStream(entry);
      -  405  0
                   fos = new FileOutputStream(file);
      -  406  0
                   bos = new BufferedOutputStream(fos, BUFFER_SIZE);
      +  399  0
                   final ZipEntry entry = jar.getEntry(path);
      +  400  0
                   input = jar.getInputStream(entry);
      +  401  0
                   fos = new FileOutputStream(file);
      +  402  0
                   IOUtils.copy(input, fos);
      +  403  0
                   dependency.setActualFilePath(file.getAbsolutePath());
      +  404  0
               } catch (IOException ex) {
      +  405  0
                   LOGGER.warn("An error occurred reading '{}' from '{}'.", path, dependency.getFilePath());
      +  406  0
                   LOGGER.error("", ex);
       407   -
                   int count;
      -  408  0
                   final byte[] data = new byte[BUFFER_SIZE];
      -  409  0
                   while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) {
      -  410  0
                       bos.write(data, 0, count);
      -  411   -
                   }
      -  412  0
                   bos.flush();
      -  413  0
                   dependency.setActualFilePath(file.getAbsolutePath());
      -  414  0
               } catch (IOException ex) {
      -  415  0
                   LOGGER.warn("An error occurred reading '{}' from '{}'.", path, dependency.getFilePath());
      -  416  0
                   LOGGER.error("", ex);
      -  417  
               } finally {
      -  418  0
                   closeStream(bos);
      -  419  0
                   closeStream(fos);
      -  420  0
                   closeStream(input);
      -  421  0
               }
      -  422  0
               return PomUtils.readPom(file);
      -  423   +  408  0
                   closeStream(fos);
      +  409  0
                   closeStream(input);
      +  410  0
               }
      +  411  0
               return PomUtils.readPom(file);
      +  412  
           }
      -  424   +  413  
       
      -  425   +  414  
           /**
      -  426   +  415  
            * Silently closes an input stream ignoring errors.
      -  427   +  416  
            *
      -  428   +  417  
            * @param stream an input stream to close
      -  429   +  418  
            */
      -  430   +  419  
           private void closeStream(InputStream stream) {
      -  431  0
               if (stream != null) {
      -  432   +  420  0
               if (stream != null) {
      +  421  
                   try {
      -  433  0
                       stream.close();
      -  434  0
                   } catch (IOException ex) {
      -  435  0
                       LOGGER.trace("", ex);
      -  436  0
                   }
      -  437   +  422  0
                       stream.close();
      +  423  0
                   } catch (IOException ex) {
      +  424  0
                       LOGGER.trace("", ex);
      +  425  0
                   }
      +  426  
               }
      -  438  0
           }
      -  439   +  427  0
           }
      +  428  
       
      -  440   +  429  
           /**
      -  441   +  430  
            * Silently closes an output stream ignoring errors.
      -  442   +  431  
            *
      -  443   +  432  
            * @param stream an output stream to close
      -  444   +  433  
            */
      -  445   +  434  
           private void closeStream(OutputStream stream) {
      -  446  0
               if (stream != null) {
      -  447   +  435  0
               if (stream != null) {
      +  436  
                   try {
      -  448  0
                       stream.close();
      -  449  0
                   } catch (IOException ex) {
      -  450  0
                       LOGGER.trace("", ex);
      -  451  0
                   }
      -  452   +  437  0
                       stream.close();
      +  438  0
                   } catch (IOException ex) {
      +  439  0
                       LOGGER.trace("", ex);
      +  440  0
                   }
      +  441  
               }
      -  453  0
           }
      -  454   +  442  0
           }
      +  443  
       
      -  455   +  444  
           /**
      -  456   +  445  
            * Sets evidence from the pom on the supplied dependency.
      -  457   +  446  
            *
      -  458   +  447  
            * @param dependency the dependency to set data on
      -  459   +  448  
            * @param pom the information from the pom
      -  460   +  449  
            * @param classes a collection of ClassNameInformation - containing data about the fully qualified class names within the JAR
      -  461   +  450  
            * file being analyzed
      -  462   +  451  
            * @return true if there was evidence within the pom that we could use; otherwise false
      -  463   +  452  
            */
      -  464   +  453  
           public static boolean setPomEvidence(Dependency dependency, Model pom, List<ClassNameInformation> classes) {
      -  465  8
               boolean foundSomething = false;
      -  466  8
               boolean addAsIdentifier = true;
      -  467  8
               if (pom == null) {
      -  468  0
                   return foundSomething;
      -  469   +  454  1
               boolean foundSomething = false;
      +  455  1
               boolean addAsIdentifier = true;
      +  456  1
               if (pom == null) {
      +  457  0
                   return foundSomething;
      +  458  
               }
      -  470  8
               String groupid = pom.getGroupId();
      -  471  8
               String parentGroupId = pom.getParentGroupId();
      -  472  8
               String artifactid = pom.getArtifactId();
      -  473  8
               String parentArtifactId = pom.getParentArtifactId();
      -  474  8
               String version = pom.getVersion();
      -  475  8
               String parentVersion = pom.getParentVersion();
      -  476   +  459  1
               String groupid = pom.getGroupId();
      +  460  1
               String parentGroupId = pom.getParentGroupId();
      +  461  1
               String artifactid = pom.getArtifactId();
      +  462  1
               String parentArtifactId = pom.getParentArtifactId();
      +  463  1
               String version = pom.getVersion();
      +  464  1
               String parentVersion = pom.getParentVersion();
      +  465  
       
      -  477  8
               if ("org.sonatype.oss".equals(parentGroupId) && "oss-parent".equals(parentArtifactId)) {
      -  478  0
                   parentGroupId = null;
      -  479  0
                   parentArtifactId = null;
      -  480  0
                   parentVersion = null;
      -  481   +  466  1
               if ("org.sonatype.oss".equals(parentGroupId) && "oss-parent".equals(parentArtifactId)) {
      +  467  0
                   parentGroupId = null;
      +  468  0
                   parentArtifactId = null;
      +  469  0
                   parentVersion = null;
      +  470  
               }
      -  482   +  471  
       
      -  483  8
               if ((groupid == null || groupid.isEmpty()) && parentGroupId != null && !parentGroupId.isEmpty()) {
      -  484  0
                   groupid = parentGroupId;
      -  485   +  472  1
               if ((groupid == null || groupid.isEmpty()) && parentGroupId != null && !parentGroupId.isEmpty()) {
      +  473  0
                   groupid = parentGroupId;
      +  474  
               }
      -  486   +  475  
       
      -  487  8
               final String originalGroupID = groupid;
      -  488  8
               if (groupid.startsWith("org.") || groupid.startsWith("com.")) {
      -  489  8
                   groupid = groupid.substring(4);
      -  490   +  476  1
               final String originalGroupID = groupid;
      +  477  1
               if (groupid.startsWith("org.") || groupid.startsWith("com.")) {
      +  478  1
                   groupid = groupid.substring(4);
      +  479  
               }
      -  491   +  480  
       
      -  492  8
               if ((artifactid == null || artifactid.isEmpty()) && parentArtifactId != null && !parentArtifactId.isEmpty()) {
      -  493  0
                   artifactid = parentArtifactId;
      -  494   +  481  1
               if ((artifactid == null || artifactid.isEmpty()) && parentArtifactId != null && !parentArtifactId.isEmpty()) {
      +  482  0
                   artifactid = parentArtifactId;
      +  483  
               }
      -  495   +  484  
       
      -  496  8
               final String originalArtifactID = artifactid;
      -  497  8
               if (artifactid.startsWith("org.") || artifactid.startsWith("com.")) {
      -  498  0
                   artifactid = artifactid.substring(4);
      -  499   +  485  1
               final String originalArtifactID = artifactid;
      +  486  1
               if (artifactid.startsWith("org.") || artifactid.startsWith("com.")) {
      +  487  0
                   artifactid = artifactid.substring(4);
      +  488  
               }
      -  500   +  489  
       
      -  501  8
               if ((version == null || version.isEmpty()) && parentVersion != null && !parentVersion.isEmpty()) {
      -  502  8
                   version = parentVersion;
      -  503   +  490  1
               if ((version == null || version.isEmpty()) && parentVersion != null && !parentVersion.isEmpty()) {
      +  491  1
                   version = parentVersion;
      +  492  
               }
      -  504   +  493  
       
      -  505  8
               if (groupid != null && !groupid.isEmpty()) {
      -  506  8
                   foundSomething = true;
      -  507  8
                   dependency.getVendorEvidence().addEvidence("pom", "groupid", groupid, Confidence.HIGHEST);
      -  508  8
                   dependency.getProductEvidence().addEvidence("pom", "groupid", groupid, Confidence.LOW);
      -  509  8
                   addMatchingValues(classes, groupid, dependency.getVendorEvidence());
      -  510  8
                   addMatchingValues(classes, groupid, dependency.getProductEvidence());
      -  511  8
                   if (parentGroupId != null && !parentGroupId.isEmpty() && !parentGroupId.equals(groupid)) {
      -  512  8
                       dependency.getVendorEvidence().addEvidence("pom", "parent-groupid", parentGroupId, Confidence.MEDIUM);
      -  513  8
                       dependency.getProductEvidence().addEvidence("pom", "parent-groupid", parentGroupId, Confidence.LOW);
      -  514  8
                       addMatchingValues(classes, parentGroupId, dependency.getVendorEvidence());
      -  515  8
                       addMatchingValues(classes, parentGroupId, dependency.getProductEvidence());
      -  516   +  494  1
               if (groupid != null && !groupid.isEmpty()) {
      +  495  1
                   foundSomething = true;
      +  496  1
                   dependency.getVendorEvidence().addEvidence("pom", "groupid", groupid, Confidence.HIGHEST);
      +  497  1
                   dependency.getProductEvidence().addEvidence("pom", "groupid", groupid, Confidence.LOW);
      +  498  1
                   addMatchingValues(classes, groupid, dependency.getVendorEvidence());
      +  499  1
                   addMatchingValues(classes, groupid, dependency.getProductEvidence());
      +  500  1
                   if (parentGroupId != null && !parentGroupId.isEmpty() && !parentGroupId.equals(groupid)) {
      +  501  1
                       dependency.getVendorEvidence().addEvidence("pom", "parent-groupid", parentGroupId, Confidence.MEDIUM);
      +  502  1
                       dependency.getProductEvidence().addEvidence("pom", "parent-groupid", parentGroupId, Confidence.LOW);
      +  503  1
                       addMatchingValues(classes, parentGroupId, dependency.getVendorEvidence());
      +  504  1
                       addMatchingValues(classes, parentGroupId, dependency.getProductEvidence());
      +  505  
                   }
      -  517   +  506  
               } else {
      -  518  0
                   addAsIdentifier = false;
      -  519   +  507  0
                   addAsIdentifier = false;
      +  508  
               }
      -  520   +  509  
       
      -  521  8
               if (artifactid != null && !artifactid.isEmpty()) {
      -  522  8
                   foundSomething = true;
      -  523  8
                   dependency.getProductEvidence().addEvidence("pom", "artifactid", artifactid, Confidence.HIGHEST);
      -  524  8
                   dependency.getVendorEvidence().addEvidence("pom", "artifactid", artifactid, Confidence.LOW);
      -  525  8
                   addMatchingValues(classes, artifactid, dependency.getVendorEvidence());
      -  526  8
                   addMatchingValues(classes, artifactid, dependency.getProductEvidence());
      -  527  8
                   if (parentArtifactId != null && !parentArtifactId.isEmpty() && !parentArtifactId.equals(artifactid)) {
      -  528  8
                       dependency.getProductEvidence().addEvidence("pom", "parent-artifactid", parentArtifactId, Confidence.MEDIUM);
      -  529  8
                       dependency.getVendorEvidence().addEvidence("pom", "parent-artifactid", parentArtifactId, Confidence.LOW);
      -  530  8
                       addMatchingValues(classes, parentArtifactId, dependency.getVendorEvidence());
      -  531  8
                       addMatchingValues(classes, parentArtifactId, dependency.getProductEvidence());
      +  510  1
               if (artifactid != null && !artifactid.isEmpty()) {
      +  511  1
                   foundSomething = true;
      +  512  1
                   dependency.getProductEvidence().addEvidence("pom", "artifactid", artifactid, Confidence.HIGHEST);
      +  513  1
                   dependency.getVendorEvidence().addEvidence("pom", "artifactid", artifactid, Confidence.LOW);
      +  514  1
                   addMatchingValues(classes, artifactid, dependency.getVendorEvidence());
      +  515  1
                   addMatchingValues(classes, artifactid, dependency.getProductEvidence());
      +  516  1
                   if (parentArtifactId != null && !parentArtifactId.isEmpty() && !parentArtifactId.equals(artifactid)) {
      +  517  1
                       dependency.getProductEvidence().addEvidence("pom", "parent-artifactid", parentArtifactId, Confidence.MEDIUM);
      +  518  1
                       dependency.getVendorEvidence().addEvidence("pom", "parent-artifactid", parentArtifactId, Confidence.LOW);
      +  519  1
                       addMatchingValues(classes, parentArtifactId, dependency.getVendorEvidence());
      +  520  1
                       addMatchingValues(classes, parentArtifactId, dependency.getProductEvidence());
      +  521   +
                   }
      +  522   +
               } else {
      +  523  0
                   addAsIdentifier = false;
      +  524   +
               }
      +  525   +
       
      +  526  1
               if (version != null && !version.isEmpty()) {
      +  527  1
                   foundSomething = true;
      +  528  1
                   dependency.getVersionEvidence().addEvidence("pom", "version", version, Confidence.HIGHEST);
      +  529  1
                   if (parentVersion != null && !parentVersion.isEmpty() && !parentVersion.equals(version)) {
      +  530  0
                       dependency.getVersionEvidence().addEvidence("pom", "parent-version", version, Confidence.LOW);
      +  531   +
                   }
       532   -
                   }
      -  533  
               } else {
      -  534  0
                   addAsIdentifier = false;
      +  533  0
                   addAsIdentifier = false;
      +  534   +
               }
       535   -
               }
      -  536  
       
      -  537  8
               if (version != null && !version.isEmpty()) {
      -  538  8
                   foundSomething = true;
      -  539  8
                   dependency.getVersionEvidence().addEvidence("pom", "version", version, Confidence.HIGHEST);
      -  540  8
                   if (parentVersion != null && !parentVersion.isEmpty() && !parentVersion.equals(version)) {
      -  541  0
                       dependency.getVersionEvidence().addEvidence("pom", "parent-version", version, Confidence.LOW);
      -  542   -
                   }
      -  543   -
               } else {
      -  544  0
                   addAsIdentifier = false;
      -  545   +  536  1
               if (addAsIdentifier) {
      +  537  1
                   dependency.addIdentifier("maven", String.format("%s:%s:%s", originalGroupID, originalArtifactID, version), null, Confidence.HIGH);
      +  538  
               }
      -  546   +  539  
       
      -  547  8
               if (addAsIdentifier) {
      -  548  8
                   dependency.addIdentifier("maven", String.format("%s:%s:%s", originalGroupID, originalArtifactID, version), null, Confidence.HIGH);
      -  549   -
               }
      -  550   -
       
      -  551   +  540  
               // org name
      -  552  8
               final String org = pom.getOrganization();
      -  553  8
               if (org != null && !org.isEmpty()) {
      -  554  0
                   dependency.getVendorEvidence().addEvidence("pom", "organization name", org, Confidence.HIGH);
      -  555  0
                   dependency.getProductEvidence().addEvidence("pom", "organization name", org, Confidence.LOW);
      -  556  0
                   addMatchingValues(classes, org, dependency.getVendorEvidence());
      -  557  0
                   addMatchingValues(classes, org, dependency.getProductEvidence());
      -  558   +  541  1
               final String org = pom.getOrganization();
      +  542  1
               if (org != null && !org.isEmpty()) {
      +  543  0
                   dependency.getVendorEvidence().addEvidence("pom", "organization name", org, Confidence.HIGH);
      +  544  0
                   dependency.getProductEvidence().addEvidence("pom", "organization name", org, Confidence.LOW);
      +  545  0
                   addMatchingValues(classes, org, dependency.getVendorEvidence());
      +  546  0
                   addMatchingValues(classes, org, dependency.getProductEvidence());
      +  547  
               }
      -  559   +  548  
               //pom name
      -  560  8
               final String pomName = pom.getName();
      -  561  8
               if (pomName
      -  562   +  549  1
               final String pomName = pom.getName();
      +  550  1
               if (pomName
      +  551  
                       != null && !pomName.isEmpty()) {
      -  563  8
                   foundSomething = true;
      -  564  8
                   dependency.getProductEvidence().addEvidence("pom", "name", pomName, Confidence.HIGH);
      -  565  8
                   dependency.getVendorEvidence().addEvidence("pom", "name", pomName, Confidence.HIGH);
      -  566  8
                   addMatchingValues(classes, pomName, dependency.getVendorEvidence());
      -  567  8
                   addMatchingValues(classes, pomName, dependency.getProductEvidence());
      -  568   +  552  1
                   foundSomething = true;
      +  553  1
                   dependency.getProductEvidence().addEvidence("pom", "name", pomName, Confidence.HIGH);
      +  554  1
                   dependency.getVendorEvidence().addEvidence("pom", "name", pomName, Confidence.HIGH);
      +  555  1
                   addMatchingValues(classes, pomName, dependency.getVendorEvidence());
      +  556  1
                   addMatchingValues(classes, pomName, dependency.getProductEvidence());
      +  557  
               }
      -  569   +  558  
       
      -  570   +  559  
               //Description
      -  571  8
               final String description = pom.getDescription();
      -  572  8
               if (description != null && !description.isEmpty() && !description.startsWith("POM was created by")) {
      -  573  0
                   foundSomething = true;
      -  574  0
                   final String trimmedDescription = addDescription(dependency, description, "pom", "description");
      -  575  0
                   addMatchingValues(classes, trimmedDescription, dependency.getVendorEvidence());
      -  576  0
                   addMatchingValues(classes, trimmedDescription, dependency.getProductEvidence());
      -  577   +  560  1
               final String description = pom.getDescription();
      +  561  1
               if (description != null && !description.isEmpty() && !description.startsWith("POM was created by")) {
      +  562  0
                   foundSomething = true;
      +  563  0
                   final String trimmedDescription = addDescription(dependency, description, "pom", "description");
      +  564  0
                   addMatchingValues(classes, trimmedDescription, dependency.getVendorEvidence());
      +  565  0
                   addMatchingValues(classes, trimmedDescription, dependency.getProductEvidence());
      +  566  
               }
      -  578   +  567  
       
      -  579  8
               extractLicense(pom, dependency);
      -  580  8
               return foundSomething;
      -  581   +  568  1
               extractLicense(pom, dependency);
      +  569  1
               return foundSomething;
      +  570  
           }
      -  582   +  571  
       
      -  583   +  572  
           /**
      -  584   +  573  
            * Analyzes the path information of the classes contained within the JarAnalyzer to try and determine possible vendor or
      -  585   +  574  
            * product names. If any are found they are stored in the packageVendor and packageProduct hashSets.
      -  586   +  575  
            *
      -  587   +  576  
            * @param classNames a list of class names
      -  588   +  577  
            * @param dependency a dependency to analyze
      -  589   +  578  
            * @param addPackagesAsEvidence a flag indicating whether or not package names should be added as evidence.
      -  590   +  579  
            */
      -  591   +  580  
           protected void analyzePackageNames(List<ClassNameInformation> classNames,
      -  592   +  581  
                   Dependency dependency, boolean addPackagesAsEvidence) {
      -  593  40
               final Map<String, Integer> vendorIdentifiers = new HashMap<String, Integer>();
      -  594  40
               final Map<String, Integer> productIdentifiers = new HashMap<String, Integer>();
      -  595  40
               analyzeFullyQualifiedClassNames(classNames, vendorIdentifiers, productIdentifiers);
      -  596   +  582  5
               final Map<String, Integer> vendorIdentifiers = new HashMap<String, Integer>();
      +  583  5
               final Map<String, Integer> productIdentifiers = new HashMap<String, Integer>();
      +  584  5
               analyzeFullyQualifiedClassNames(classNames, vendorIdentifiers, productIdentifiers);
      +  585  
       
      -  597  40
               final int classCount = classNames.size();
      -  598  40
               final EvidenceCollection vendor = dependency.getVendorEvidence();
      -  599  40
               final EvidenceCollection product = dependency.getProductEvidence();
      -  600   +  586  5
               final int classCount = classNames.size();
      +  587  5
               final EvidenceCollection vendor = dependency.getVendorEvidence();
      +  588  5
               final EvidenceCollection product = dependency.getProductEvidence();
      +  589  
       
      -  601  40
               for (Map.Entry<String, Integer> entry : vendorIdentifiers.entrySet()) {
      -  602  384
                   final float ratio = entry.getValue() / (float) classCount;
      -  603  384
                   if (ratio > 0.5) {
      -  604   +  590  5
               for (Map.Entry<String, Integer> entry : vendorIdentifiers.entrySet()) {
      +  591  48
                   final float ratio = entry.getValue() / (float) classCount;
      +  592  48
                   if (ratio > 0.5) {
      +  593  
                       //TODO remove weighting
      -  605  80
                       vendor.addWeighting(entry.getKey());
      -  606  80
                       if (addPackagesAsEvidence && entry.getKey().length() > 1) {
      -  607  64
                           vendor.addEvidence("jar", "package name", entry.getKey(), Confidence.LOW);
      -  608   +  594  10
                       vendor.addWeighting(entry.getKey());
      +  595  10
                       if (addPackagesAsEvidence && entry.getKey().length() > 1) {
      +  596  8
                           vendor.addEvidence("jar", "package name", entry.getKey(), Confidence.LOW);
      +  597  
                       }
      -  609   +  598  
                   }
      -  610  384
               }
      -  611  40
               for (Map.Entry<String, Integer> entry : productIdentifiers.entrySet()) {
      -  612  7880
                   final float ratio = entry.getValue() / (float) classCount;
      -  613  7880
                   if (ratio > 0.5) {
      -  614  40
                       product.addWeighting(entry.getKey());
      -  615  40
                       if (addPackagesAsEvidence && entry.getKey().length() > 1) {
      -  616  32
                           product.addEvidence("jar", "package name", entry.getKey(), Confidence.LOW);
      -  617   +  599  48
               }
      +  600  5
               for (Map.Entry<String, Integer> entry : productIdentifiers.entrySet()) {
      +  601  985
                   final float ratio = entry.getValue() / (float) classCount;
      +  602  985
                   if (ratio > 0.5) {
      +  603  5
                       product.addWeighting(entry.getKey());
      +  604  5
                       if (addPackagesAsEvidence && entry.getKey().length() > 1) {
      +  605  4
                           product.addEvidence("jar", "package name", entry.getKey(), Confidence.LOW);
      +  606  
                       }
      -  618   +  607  
                   }
      -  619  7880
               }
      -  620  40
           }
      -  621   +  608  985
               }
      +  609  5
           }
      +  610  
       
      -  622   +  611  
           /**
      -  623   +  612  
            * <p>
      -  624   +  613  
            * Reads the manifest from the JAR file and collects the entries. Some vendorKey entries are:</p>
      -  625   +  614  
            * <ul><li>Implementation Title</li>
      -  626   +  615  
            * <li>Implementation Version</li> <li>Implementation Vendor</li>
      -  627   +  616  
            * <li>Implementation VendorId</li> <li>Bundle Name</li> <li>Bundle Version</li> <li>Bundle Vendor</li> <li>Bundle
      -  628   +  617  
            * Description</li> <li>Main Class</li> </ul>
      -  629   +  618  
            * However, all but a handful of specific entries are read in.
      -  630   +  619  
            *
      -  631   +  620  
            * @param dependency A reference to the dependency
      -  632   +  621  
            * @param classInformation a collection of class information
      -  633   +  622  
            * @return whether evidence was identified parsing the manifest
      -  634   +  623  
            * @throws IOException if there is an issue reading the JAR file
      -  635   +  624  
            */
      -  636   +  625  
           protected boolean parseManifest(Dependency dependency, List<ClassNameInformation> classInformation) throws IOException {
      -  637  40
               boolean foundSomething = false;
      -  638  40
               JarFile jar = null;
      -  639   +  626  5
               boolean foundSomething = false;
      +  627  5
               JarFile jar = null;
      +  628  
               try {
      -  640  40
                   jar = new JarFile(dependency.getActualFilePath());
      -  641   +  629  5
                   jar = new JarFile(dependency.getActualFilePath());
      +  630  
       
      -  642  40
                   final Manifest manifest = jar.getManifest();
      -  643   +  631  5
                   final Manifest manifest = jar.getManifest();
      +  632  
       
      -  644  40
                   if (manifest == null) {
      -  645   +  633  5
                   if (manifest == null) {
      +  634  
                       //don't log this for javadoc or sources jar files
      -  646  0
                       if (!dependency.getFileName().toLowerCase().endsWith("-sources.jar")
      -  647   +  635  0
                       if (!dependency.getFileName().toLowerCase().endsWith("-sources.jar")
      +  636  
                               && !dependency.getFileName().toLowerCase().endsWith("-javadoc.jar")
      -  648   +  637  
                               && !dependency.getFileName().toLowerCase().endsWith("-src.jar")
      -  649   +  638  
                               && !dependency.getFileName().toLowerCase().endsWith("-doc.jar")) {
      -  650  0
                           LOGGER.debug("Jar file '{}' does not contain a manifest.",
      -  651   +  639  0
                           LOGGER.debug("Jar file '{}' does not contain a manifest.",
      +  640  
                                   dependency.getFileName());
      -  652   +  641  
                       }
      -  653  0
                       return false;
      -  654   +  642  0
                       return false;
      +  643  
                   }
      -  655  40
                   final Attributes atts = manifest.getMainAttributes();
      -  656   +  644  5
                   final Attributes atts = manifest.getMainAttributes();
      +  645  
       
      -  657  40
                   final EvidenceCollection vendorEvidence = dependency.getVendorEvidence();
      -  658  40
                   final EvidenceCollection productEvidence = dependency.getProductEvidence();
      -  659  40
                   final EvidenceCollection versionEvidence = dependency.getVersionEvidence();
      +  646  5
                   final EvidenceCollection vendorEvidence = dependency.getVendorEvidence();
      +  647  5
                   final EvidenceCollection productEvidence = dependency.getProductEvidence();
      +  648  5
                   final EvidenceCollection versionEvidence = dependency.getVersionEvidence();
      +  649   +
       
      +  650  5
                   final String source = "Manifest";
      +  651   +
       
      +  652  5
                   String specificationVersion = null;
      +  653  5
                   boolean hasImplementationVersion = false;
      +  654   +
       
      +  655  5
                   for (Entry<Object, Object> entry : atts.entrySet()) {
      +  656  65
                       String key = entry.getKey().toString();
      +  657  65
                       String value = atts.getValue(key);
      +  658  65
                       if (HTML_DETECTION_PATTERN.matcher(value).find()) {
      +  659  0
                           value = Jsoup.parse(value).text();
       660   -
       
      -  661  40
                   final String source = "Manifest";
      -  662   -
       
      -  663  40
                   String specificationVersion = null;
      -  664  40
                   boolean hasImplementationVersion = false;
      -  665   -
       
      -  666  40
                   for (Entry<Object, Object> entry : atts.entrySet()) {
      -  667  520
                       String key = entry.getKey().toString();
      -  668  520
                       String value = atts.getValue(key);
      -  669  520
                       if (HTML_DETECTION_PATTERN.matcher(value).find()) {
      -  670  0
                           value = Jsoup.parse(value).text();
      -  671  
                       }
      -  672  520
                       if (IGNORE_VALUES.contains(value)) {
      -  673  0
                           continue;
      -  674  520
                       } else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_TITLE.toString())) {
      -  675  8
                           foundSomething = true;
      -  676  8
                           productEvidence.addEvidence(source, key, value, Confidence.HIGH);
      -  677  8
                           addMatchingValues(classInformation, value, productEvidence);
      -  678  512
                       } else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_VERSION.toString())) {
      -  679  16
                           hasImplementationVersion = true;
      -  680  16
                           foundSomething = true;
      -  681  16
                           versionEvidence.addEvidence(source, key, value, Confidence.HIGH);
      -  682  496
                       } else if ("specification-version".equalsIgnoreCase(key)) {
      -  683  8
                           specificationVersion = key;
      -  684  488
                       } else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_VENDOR.toString())) {
      -  685  8
                           foundSomething = true;
      -  686  8
                           vendorEvidence.addEvidence(source, key, value, Confidence.HIGH);
      -  687  8
                           addMatchingValues(classInformation, value, vendorEvidence);
      -  688  480
                       } else if (key.equalsIgnoreCase(IMPLEMENTATION_VENDOR_ID)) {
      -  689  0
                           foundSomething = true;
      -  690  0
                           vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      -  691  0
                           addMatchingValues(classInformation, value, vendorEvidence);
      -  692  480
                       } else if (key.equalsIgnoreCase(BUNDLE_DESCRIPTION)) {
      -  693  16
                           foundSomething = true;
      -  694  16
                           addDescription(dependency, value, "manifest", key);
      -  695   +  661  65
                       if (IGNORE_VALUES.contains(value)) {
      +  662  0
                           continue;
      +  663  65
                       } else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_TITLE.toString())) {
      +  664  1
                           foundSomething = true;
      +  665  1
                           productEvidence.addEvidence(source, key, value, Confidence.HIGH);
      +  666  1
                           addMatchingValues(classInformation, value, productEvidence);
      +  667  64
                       } else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_VERSION.toString())) {
      +  668  2
                           hasImplementationVersion = true;
      +  669  2
                           foundSomething = true;
      +  670  2
                           versionEvidence.addEvidence(source, key, value, Confidence.HIGH);
      +  671  62
                       } else if ("specification-version".equalsIgnoreCase(key)) {
      +  672  1
                           specificationVersion = key;
      +  673  61
                       } else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_VENDOR.toString())) {
      +  674  1
                           foundSomething = true;
      +  675  1
                           vendorEvidence.addEvidence(source, key, value, Confidence.HIGH);
      +  676  1
                           addMatchingValues(classInformation, value, vendorEvidence);
      +  677  60
                       } else if (key.equalsIgnoreCase(IMPLEMENTATION_VENDOR_ID)) {
      +  678  0
                           foundSomething = true;
      +  679  0
                           vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      +  680  0
                           addMatchingValues(classInformation, value, vendorEvidence);
      +  681  60
                       } else if (key.equalsIgnoreCase(BUNDLE_DESCRIPTION)) {
      +  682  2
                           foundSomething = true;
      +  683  2
                           addDescription(dependency, value, "manifest", key);
      +  684  
                           //productEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      -  696  16
                           addMatchingValues(classInformation, value, productEvidence);
      -  697  464
                       } else if (key.equalsIgnoreCase(BUNDLE_NAME)) {
      -  698  24
                           foundSomething = true;
      -  699  24
                           productEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      -  700  24
                           addMatchingValues(classInformation, value, productEvidence);
      -  701   +  685  2
                           addMatchingValues(classInformation, value, productEvidence);
      +  686  58
                       } else if (key.equalsIgnoreCase(BUNDLE_NAME)) {
      +  687  3
                           foundSomething = true;
      +  688  3
                           productEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      +  689  3
                           addMatchingValues(classInformation, value, productEvidence);
      +  690  
       //                //the following caused false positives.
      -  702   +  691  
       //                } else if (key.equalsIgnoreCase(BUNDLE_VENDOR)) {
      +  692   +
       //                    foundSomething = true;
      +  693   +
       //                    vendorEvidence.addEvidence(source, key, value, Confidence.HIGH);
      +  694   +
       //                    addMatchingValues(classInformation, value, vendorEvidence);
      +  695  55
                       } else if (key.equalsIgnoreCase(BUNDLE_VERSION)) {
      +  696  3
                           foundSomething = true;
      +  697  3
                           versionEvidence.addEvidence(source, key, value, Confidence.HIGH);
      +  698  52
                       } else if (key.equalsIgnoreCase(Attributes.Name.MAIN_CLASS.toString())) {
      +  699  2
                           continue;
      +  700   +
                           //skipping main class as if this has important information to add
      +  701   +
                           // it will be added during class name analysis...  if other fields
      +  702   +
                           // have the information from the class name then they will get added...
       703  
       //                    foundSomething = true;
       704   -
       //                    vendorEvidence.addEvidence(source, key, value, Confidence.HIGH);
      -  705   -
       //                    addMatchingValues(classInformation, value, vendorEvidence);
      -  706  440
                       } else if (key.equalsIgnoreCase(BUNDLE_VERSION)) {
      -  707  24
                           foundSomething = true;
      -  708  24
                           versionEvidence.addEvidence(source, key, value, Confidence.HIGH);
      -  709  416
                       } else if (key.equalsIgnoreCase(Attributes.Name.MAIN_CLASS.toString())) {
      -  710  16
                           continue;
      -  711   -
                           //skipping main class as if this has important information to add
      -  712   -
                           // it will be added during class name analysis...  if other fields
      -  713   -
                           // have the information from the class name then they will get added...
      -  714   -
       //                    foundSomething = true;
      -  715  
       //                    productEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      -  716   +  705  
       //                    vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      -  717   +  706  
       //                    addMatchingValues(classInformation, value, vendorEvidence);
      -  718   +  707  
       //                    addMatchingValues(classInformation, value, productEvidence);
      -  719   +  708  
                       } else {
      -  720  400
                           key = key.toLowerCase();
      -  721   +  709  50
                           key = key.toLowerCase();
      +  710  
       
      -  722  400
                           if (!IGNORE_KEYS.contains(key)
      -  723   +  711  50
                           if (!IGNORE_KEYS.contains(key)
      +  712  
                                   && !key.endsWith("jdk")
      -  724   +  713  
                                   && !key.contains("lastmodified")
      -  725   +  714  
                                   && !key.endsWith("package")
      -  726   +  715  
                                   && !key.endsWith("classpath")
      -  727   +  716  
                                   && !key.endsWith("class-path")
      -  728   +  717  
                                   && !key.endsWith("-scm") //todo change this to a regex?
      -  729   +  718  
                                   && !key.startsWith("scm-")
      -  730   +  719  
                                   && !value.trim().startsWith("scm:")
      -  731   +  720  
                                   && !isImportPackage(key, value)
      -  732   +  721  
                                   && !isPackage(key, value)) {
      -  733   +  722  
       
      -  734  104
                               foundSomething = true;
      -  735  104
                               if (key.contains("version")) {
      -  736  0
                                   if (!key.contains("specification")) {
      -  737   +  723  13
                               foundSomething = true;
      +  724  13
                               if (key.contains("version")) {
      +  725  0
                                   if (!key.contains("specification")) {
      +  726  
                                       //versionEvidence.addEvidence(source, key, value, Confidence.LOW);
      -  738   +  727  
                                       //} else {
      -  739  0
                                       versionEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      -  740   +  728  0
                                       versionEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      +  729  
                                   }
      -  741  104
                               } else if ("build-id".equals(key)) {
      -  742  0
                                   int pos = value.indexOf('(');
      -  743  0
                                   if (pos >= 0) {
      -  744  0
                                       value = value.substring(0, pos - 1);
      -  745   +  730  13
                               } else if ("build-id".equals(key)) {
      +  731  0
                                   int pos = value.indexOf('(');
      +  732  0
                                   if (pos >= 0) {
      +  733  0
                                       value = value.substring(0, pos - 1);
      +  734  
                                   }
      -  746  0
                                   pos = value.indexOf('[');
      -  747  0
                                   if (pos >= 0) {
      -  748  0
                                       value = value.substring(0, pos - 1);
      +  735  0
                                   pos = value.indexOf('[');
      +  736  0
                                   if (pos >= 0) {
      +  737  0
                                       value = value.substring(0, pos - 1);
      +  738   +
                                   }
      +  739  0
                                   versionEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      +  740  0
                               } else if (key.contains("title")) {
      +  741  1
                                   productEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      +  742  1
                                   addMatchingValues(classInformation, value, productEvidence);
      +  743  12
                               } else if (key.contains("vendor")) {
      +  744  0
                                   if (key.contains("specification")) {
      +  745  0
                                       vendorEvidence.addEvidence(source, key, value, Confidence.LOW);
      +  746   +
                                   } else {
      +  747  0
                                       vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      +  748  0
                                       addMatchingValues(classInformation, value, vendorEvidence);
       749  
                                   }
      -  750  0
                                   versionEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      -  751  0
                               } else if (key.contains("title")) {
      -  752  8
                                   productEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      -  753  8
                                   addMatchingValues(classInformation, value, productEvidence);
      -  754  96
                               } else if (key.contains("vendor")) {
      -  755  0
                                   if (key.contains("specification")) {
      -  756  0
                                       vendorEvidence.addEvidence(source, key, value, Confidence.LOW);
      +  750  12
                               } else if (key.contains("name")) {
      +  751  3
                                   productEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      +  752  3
                                   vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      +  753  3
                                   addMatchingValues(classInformation, value, vendorEvidence);
      +  754  3
                                   addMatchingValues(classInformation, value, productEvidence);
      +  755  9
                               } else if (key.contains("license")) {
      +  756  2
                                   addLicense(dependency, value);
       757   -
                                   } else {
      -  758  0
                                       vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      -  759  0
                                       addMatchingValues(classInformation, value, vendorEvidence);
      -  760   -
                                   }
      -  761  96
                               } else if (key.contains("name")) {
      -  762  24
                                   productEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      -  763  24
                                   vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM);
      -  764  24
                                   addMatchingValues(classInformation, value, vendorEvidence);
      -  765  24
                                   addMatchingValues(classInformation, value, productEvidence);
      -  766  72
                               } else if (key.contains("license")) {
      -  767  16
                                   addLicense(dependency, value);
      -  768  
                               } else {
      -  769  56
                                   if (key.contains("description")) {
      -  770  0
                                       addDescription(dependency, value, "manifest", key);
      -  771   +  758  7
                                   if (key.contains("description")) {
      +  759  0
                                       addDescription(dependency, value, "manifest", key);
      +  760  
                                   } else {
      -  772  56
                                       productEvidence.addEvidence(source, key, value, Confidence.LOW);
      -  773  56
                                       vendorEvidence.addEvidence(source, key, value, Confidence.LOW);
      -  774  56
                                       addMatchingValues(classInformation, value, vendorEvidence);
      -  775  56
                                       addMatchingValues(classInformation, value, productEvidence);
      -  776  56
                                       if (value.matches(".*\\d.*")) {
      -  777  24
                                           final StringTokenizer tokenizer = new StringTokenizer(value, " ");
      -  778  120
                                           while (tokenizer.hasMoreElements()) {
      -  779  96
                                               final String s = tokenizer.nextToken();
      -  780  96
                                               if (s.matches("^[0-9.]+$")) {
      -  781  8
                                                   versionEvidence.addEvidence(source, key, s, Confidence.LOW);
      -  782   +  761  7
                                       productEvidence.addEvidence(source, key, value, Confidence.LOW);
      +  762  7
                                       vendorEvidence.addEvidence(source, key, value, Confidence.LOW);
      +  763  7
                                       addMatchingValues(classInformation, value, vendorEvidence);
      +  764  7
                                       addMatchingValues(classInformation, value, productEvidence);
      +  765  7
                                       if (value.matches(".*\\d.*")) {
      +  766  3
                                           final StringTokenizer tokenizer = new StringTokenizer(value, " ");
      +  767  15
                                           while (tokenizer.hasMoreElements()) {
      +  768  12
                                               final String s = tokenizer.nextToken();
      +  769  12
                                               if (s.matches("^[0-9.]+$")) {
      +  770  1
                                                   versionEvidence.addEvidence(source, key, s, Confidence.LOW);
      +  771  
                                               }
      -  783  96
                                           }
      -  784   +  772  12
                                           }
      +  773  
                                       }
      -  785   +  774  
                                   }
      -  786   +  775  
                               }
      -  787   +  776  
                           }
      -  788   +  777  
                       }
      -  789  504
                   }
      -  790  40
                   if (specificationVersion != null && !hasImplementationVersion) {
      -  791  0
                       foundSomething = true;
      -  792  0
                       versionEvidence.addEvidence(source, "specificationn-version", specificationVersion, Confidence.HIGH);
      -  793   +  778  63
                   }
      +  779  5
                   if (specificationVersion != null && !hasImplementationVersion) {
      +  780  0
                       foundSomething = true;
      +  781  0
                       versionEvidence.addEvidence(source, "specificationn-version", specificationVersion, Confidence.HIGH);
      +  782  
                   }
      -  794   +  783  
               } finally {
      -  795  40
                   if (jar != null) {
      -  796  40
                       jar.close();
      -  797   +  784  5
                   if (jar != null) {
      +  785  5
                       jar.close();
      +  786  
                   }
      -  798   +  787  
               }
      -  799  40
               return foundSomething;
      -  800   +  788  5
               return foundSomething;
      +  789  
           }
      -  801   +  790  
       
      -  802   +  791  
           /**
      -  803   +  792  
            * Adds a description to the given dependency. If the description contains one of the following strings beyond 100 characters,
      -  804   +  793  
            * then the description used will be trimmed to that position:
      -  805   +  794  
            * <ul><li>"such as"</li><li>"like "</li><li>"will use "</li><li>"* uses "</li></ul>
      -  806   +  795  
            *
      -  807   +  796  
            * @param dependency a dependency
      -  808   +  797  
            * @param description the description
      -  809   +  798  
            * @param source the source of the evidence
      -  810   +  799  
            * @param key the "name" of the evidence
      -  811   +  800  
            * @return if the description is trimmed, the trimmed version is returned; otherwise the original description is returned
      -  812   +  801  
            */
      -  813   +  802  
           public static String addDescription(Dependency dependency, String description, String source, String key) {
      -  814  72
               if (dependency.getDescription() == null) {
      -  815  72
                   dependency.setDescription(description);
      -  816   +  803  9
               if (dependency.getDescription() == null) {
      +  804  9
                   dependency.setDescription(description);
      +  805  
               }
      -  817   +  806  
               String desc;
      -  818  72
               if (HTML_DETECTION_PATTERN.matcher(description).find()) {
      -  819  0
                   desc = Jsoup.parse(description).text();
      -  820   +  807  9
               if (HTML_DETECTION_PATTERN.matcher(description).find()) {
      +  808  0
                   desc = Jsoup.parse(description).text();
      +  809  
               } else {
      -  821  72
                   desc = description;
      -  822   +  810  9
                   desc = description;
      +  811  
               }
      -  823  72
               dependency.setDescription(desc);
      -  824  72
               if (desc.length() > 100) {
      -  825  0
                   desc = desc.replaceAll("\\s\\s+", " ");
      -  826  0
                   final int posSuchAs = desc.toLowerCase().indexOf("such as ", 100);
      -  827  0
                   final int posLike = desc.toLowerCase().indexOf("like ", 100);
      -  828  0
                   final int posWillUse = desc.toLowerCase().indexOf("will use ", 100);
      -  829  0
                   final int posUses = desc.toLowerCase().indexOf(" uses ", 100);
      -  830  0
                   int pos = -1;
      -  831  0
                   pos = Math.max(pos, posSuchAs);
      -  832  0
                   if (pos >= 0 && posLike >= 0) {
      -  833  0
                       pos = Math.min(pos, posLike);
      -  834   +  812  9
               dependency.setDescription(desc);
      +  813  9
               if (desc.length() > 100) {
      +  814  0
                   desc = desc.replaceAll("\\s\\s+", " ");
      +  815  0
                   final int posSuchAs = desc.toLowerCase().indexOf("such as ", 100);
      +  816  0
                   final int posLike = desc.toLowerCase().indexOf("like ", 100);
      +  817  0
                   final int posWillUse = desc.toLowerCase().indexOf("will use ", 100);
      +  818  0
                   final int posUses = desc.toLowerCase().indexOf(" uses ", 100);
      +  819  0
                   int pos = -1;
      +  820  0
                   pos = Math.max(pos, posSuchAs);
      +  821  0
                   if (pos >= 0 && posLike >= 0) {
      +  822  0
                       pos = Math.min(pos, posLike);
      +  823  
                   } else {
      -  835  0
                       pos = Math.max(pos, posLike);
      +  824  0
                       pos = Math.max(pos, posLike);
      +  825   +
                   }
      +  826  0
                   if (pos >= 0 && posWillUse >= 0) {
      +  827  0
                       pos = Math.min(pos, posWillUse);
      +  828   +
                   } else {
      +  829  0
                       pos = Math.max(pos, posWillUse);
      +  830   +
                   }
      +  831  0
                   if (pos >= 0 && posUses >= 0) {
      +  832  0
                       pos = Math.min(pos, posUses);
      +  833   +
                   } else {
      +  834  0
                       pos = Math.max(pos, posUses);
      +  835   +
                   }
       836   -
                   }
      -  837  0
                   if (pos >= 0 && posWillUse >= 0) {
      -  838  0
                       pos = Math.min(pos, posWillUse);
      -  839   -
                   } else {
      -  840  0
                       pos = Math.max(pos, posWillUse);
      -  841   -
                   }
      -  842  0
                   if (pos >= 0 && posUses >= 0) {
      -  843  0
                       pos = Math.min(pos, posUses);
      -  844   -
                   } else {
      -  845  0
                       pos = Math.max(pos, posUses);
      -  846   -
                   }
      -  847  
       
      -  848  0
                   if (pos > 0) {
      -  849  0
                       final StringBuilder sb = new StringBuilder(pos + 3);
      -  850  0
                       sb.append(desc.substring(0, pos));
      -  851  0
                       sb.append("...");
      -  852  0
                       desc = sb.toString();
      -  853   +  837  0
                   if (pos > 0) {
      +  838  0
                       final StringBuilder sb = new StringBuilder(pos + 3);
      +  839  0
                       sb.append(desc.substring(0, pos));
      +  840  0
                       sb.append("...");
      +  841  0
                       desc = sb.toString();
      +  842  
                   }
      -  854  0
                   dependency.getProductEvidence().addEvidence(source, key, desc, Confidence.LOW);
      -  855  0
                   dependency.getVendorEvidence().addEvidence(source, key, desc, Confidence.LOW);
      -  856  0
               } else {
      -  857  72
                   dependency.getProductEvidence().addEvidence(source, key, desc, Confidence.MEDIUM);
      -  858  72
                   dependency.getVendorEvidence().addEvidence(source, key, desc, Confidence.MEDIUM);
      -  859   +  843  0
                   dependency.getProductEvidence().addEvidence(source, key, desc, Confidence.LOW);
      +  844  0
                   dependency.getVendorEvidence().addEvidence(source, key, desc, Confidence.LOW);
      +  845  0
               } else {
      +  846  9
                   dependency.getProductEvidence().addEvidence(source, key, desc, Confidence.MEDIUM);
      +  847  9
                   dependency.getVendorEvidence().addEvidence(source, key, desc, Confidence.MEDIUM);
      +  848  
               }
      -  860  72
               return desc;
      -  861   +  849  9
               return desc;
      +  850  
           }
      -  862   +  851  
       
      -  863   +  852  
           /**
      -  864   +  853  
            * Adds a license to the given dependency.
      -  865   +  854  
            *
      -  866   +  855  
            * @param d a dependency
      -  867   +  856  
            * @param license the license
      +  857   +
            */
      +  858   +
           private void addLicense(Dependency d, String license) {
      +  859  2
               if (d.getLicense() == null) {
      +  860  2
                   d.setLicense(license);
      +  861  0
               } else if (!d.getLicense().contains(license)) {
      +  862  0
                   d.setLicense(d.getLicense() + NEWLINE + license);
      +  863   +
               }
      +  864  2
           }
      +  865   +
       
      +  866   +
           /**
      +  867   +
            * The parent directory for the individual directories per archive.
       868  
            */
      -  869   -
           private void addLicense(Dependency d, String license) {
      -  870  16
               if (d.getLicense() == null) {
      -  871  16
                   d.setLicense(license);
      -  872  0
               } else if (!d.getLicense().contains(license)) {
      -  873  0
                   d.setLicense(d.getLicense() + NEWLINE + license);
      -  874   -
               }
      -  875  16
           }
      -  876   +  869  7
           private File tempFileLocation = null;
      +  870  
       
      -  877   +  871  
           /**
      -  878   -
            * The parent directory for the individual directories per archive.
      -  879   -
            */
      -  880  48
           private File tempFileLocation = null;
      -  881   -
       
      -  882   -
           /**
      -  883   +  872  
            * Initializes the JarAnalyzer.
      -  884   +  873  
            *
      -  885   +  874  
            * @throws Exception is thrown if there is an exception creating a temporary directory
      -  886   +  875  
            */
      -  887   +  876  
           @Override
      -  888   +  877  
           public void initializeFileTypeAnalyzer() throws Exception {
      -  889  8
               final File baseDir = Settings.getTempDirectory();
      -  890  8
               tempFileLocation = File.createTempFile("check", "tmp", baseDir);
      -  891  8
               if (!tempFileLocation.delete()) {
      -  892  0
                   final String msg = String.format("Unable to delete temporary file '%s'.", tempFileLocation.getAbsolutePath());
      -  893  0
                   throw new AnalysisException(msg);
      -  894   +  878  1
               final File baseDir = Settings.getTempDirectory();
      +  879  1
               tempFileLocation = File.createTempFile("check", "tmp", baseDir);
      +  880  1
               if (!tempFileLocation.delete()) {
      +  881  0
                   final String msg = String.format("Unable to delete temporary file '%s'.", tempFileLocation.getAbsolutePath());
      +  882  0
                   throw new AnalysisException(msg);
      +  883  
               }
      -  895  8
               if (!tempFileLocation.mkdirs()) {
      -  896  0
                   final String msg = String.format("Unable to create directory '%s'.", tempFileLocation.getAbsolutePath());
      -  897  0
                   throw new AnalysisException(msg);
      -  898   +  884  1
               if (!tempFileLocation.mkdirs()) {
      +  885  0
                   final String msg = String.format("Unable to create directory '%s'.", tempFileLocation.getAbsolutePath());
      +  886  0
                   throw new AnalysisException(msg);
      +  887  
               }
      -  899  8
           }
      -  900   +  888  1
           }
      +  889  
       
      -  901   +  890  
           /**
      -  902   +  891  
            * Deletes any files extracted from the JAR during analysis.
      -  903   +  892  
            */
      -  904   +  893  
           @Override
      -  905   +  894  
           public void close() {
      -  906  8
               if (tempFileLocation != null && tempFileLocation.exists()) {
      -  907  8
                   LOGGER.debug("Attempting to delete temporary files");
      -  908  8
                   final boolean success = FileUtils.delete(tempFileLocation);
      -  909  8
                   if (!success) {
      -  910  0
                       LOGGER.warn("Failed to delete some temporary files, see the log for more details");
      -  911   +  895  1
               if (tempFileLocation != null && tempFileLocation.exists()) {
      +  896  1
                   LOGGER.debug("Attempting to delete temporary files");
      +  897  1
                   final boolean success = FileUtils.delete(tempFileLocation);
      +  898  1
                   if (!success) {
      +  899  0
                       LOGGER.warn("Failed to delete some temporary files, see the log for more details");
      +  900  
                   }
      -  912   +  901  
               }
      -  913  8
           }
      -  914   +  902  1
           }
      +  903  
       
      -  915   +  904  
           /**
      -  916   +  905  
            * Determines if the key value pair from the manifest is for an "import" type entry for package names.
      -  917   +  906  
            *
      -  918   +  907  
            * @param key the key from the manifest
      -  919   +  908  
            * @param value the value from the manifest
      -  920   +  909  
            * @return true or false depending on if it is believed the entry is an "import" entry
      -  921   +  910  
            */
      -  922   +  911  
           private boolean isImportPackage(String key, String value) {
      -  923  112
               final Pattern packageRx = Pattern.compile("^([a-zA-Z0-9_#\\$\\*\\.]+\\s*[,;]\\s*)+([a-zA-Z0-9_#\\$\\*\\.]+\\s*)?$");
      -  924  112
               final boolean matches = packageRx.matcher(value).matches();
      -  925  112
               return matches && (key.contains("import") || key.contains("include") || value.length() > 10);
      -  926   +  912  14
               final Pattern packageRx = Pattern.compile("^([a-zA-Z0-9_#\\$\\*\\.]+\\s*[,;]\\s*)+([a-zA-Z0-9_#\\$\\*\\.]+\\s*)?$");
      +  913  14
               final boolean matches = packageRx.matcher(value).matches();
      +  914  14
               return matches && (key.contains("import") || key.contains("include") || value.length() > 10);
      +  915  
           }
      -  927   +  916  
       
      -  928   +  917  
           /**
      -  929   +  918  
            * Cycles through an enumeration of JarEntries, contained within the dependency, and returns a list of the class names. This
      -  930   +  919  
            * does not include core Java package names (i.e. java.* or javax.*).
      -  931   +  920  
            *
      -  932   +  921  
            * @param dependency the dependency being analyzed
      -  933   +  922  
            * @return an list of fully qualified class names
      -  934   +  923  
            */
      -  935   +  924  
           private List<ClassNameInformation> collectClassNames(Dependency dependency) {
      -  936  40
               final List<ClassNameInformation> classNames = new ArrayList<ClassNameInformation>();
      -  937  40
               JarFile jar = null;
      -  938   +  925  5
               final List<ClassNameInformation> classNames = new ArrayList<ClassNameInformation>();
      +  926  5
               JarFile jar = null;
      +  927  
               try {
      -  939  40
                   jar = new JarFile(dependency.getActualFilePath());
      -  940  40
                   final Enumeration<JarEntry> entries = jar.entries();
      -  941  14784
                   while (entries.hasMoreElements()) {
      -  942  14744
                       final JarEntry entry = entries.nextElement();
      -  943  14744
                       final String name = entry.getName().toLowerCase();
      -  944   +  928  5
                   jar = new JarFile(dependency.getActualFilePath());
      +  929  5
                   final Enumeration<JarEntry> entries = jar.entries();
      +  930  1848
                   while (entries.hasMoreElements()) {
      +  931  1843
                       final JarEntry entry = entries.nextElement();
      +  932  1843
                       final String name = entry.getName().toLowerCase();
      +  933  
                       //no longer stripping "|com\\.sun" - there are some com.sun jar files with CVEs.
      -  945  14744
                       if (name.endsWith(".class") && !name.matches("^javax?\\..*$")) {
      -  946  12280
                           final ClassNameInformation className = new ClassNameInformation(name.substring(0, name.length() - 6));
      -  947  12280
                           classNames.add(className);
      -  948   +  934  1843
                       if (name.endsWith(".class") && !name.matches("^javax?\\..*$")) {
      +  935  1535
                           final ClassNameInformation className = new ClassNameInformation(name.substring(0, name.length() - 6));
      +  936  1535
                           classNames.add(className);
      +  937  
                       }
      -  949  14744
                   }
      -  950  0
               } catch (IOException ex) {
      -  951  0
                   LOGGER.warn("Unable to open jar file '{}'.", dependency.getFileName());
      -  952  0
                   LOGGER.debug("", ex);
      -  953   +  938  1843
                   }
      +  939  0
               } catch (IOException ex) {
      +  940  0
                   LOGGER.warn("Unable to open jar file '{}'.", dependency.getFileName());
      +  941  0
                   LOGGER.debug("", ex);
      +  942  
               } finally {
      -  954  40
                   if (jar != null) {
      -  955   +  943  5
                   if (jar != null) {
      +  944  
                       try {
      -  956  40
                           jar.close();
      -  957  0
                       } catch (IOException ex) {
      -  958  0
                           LOGGER.trace("", ex);
      -  959  40
                       }
      -  960   +  945  5
                           jar.close();
      +  946  0
                       } catch (IOException ex) {
      +  947  0
                           LOGGER.trace("", ex);
      +  948  5
                       }
      +  949  
                   }
      -  961   +  950  
               }
      -  962  40
               return classNames;
      -  963   +  951  5
               return classNames;
      +  952  
           }
      -  964   +  953  
       
      -  965   +  954  
           /**
      -  966   +  955  
            * Cycles through the list of class names and places the package levels 0-3 into the provided maps for vendor and product.
      -  967   +  956  
            * This is helpful when analyzing vendor/product as many times this is included in the package name.
      -  968   +  957  
            *
      -  969   +  958  
            * @param classNames a list of class names
      -  970   +  959  
            * @param vendor HashMap of possible vendor names from package names (e.g. owasp)
      -  971   +  960  
            * @param product HashMap of possible product names from package names (e.g. dependencycheck)
      -  972   +  961  
            */
      -  973   +  962  
           private void analyzeFullyQualifiedClassNames(List<ClassNameInformation> classNames,
      -  974   +  963  
                   Map<String, Integer> vendor, Map<String, Integer> product) {
      -  975  40
               for (ClassNameInformation entry : classNames) {
      -  976  12280
                   final List<String> list = entry.getPackageStructure();
      -  977  12280
                   addEntry(vendor, list.get(0));
      -  978   +  964  5
               for (ClassNameInformation entry : classNames) {
      +  965  1535
                   final List<String> list = entry.getPackageStructure();
      +  966  1535
                   addEntry(vendor, list.get(0));
      +  967  
       
      -  979  12280
                   if (list.size() == 2) {
      -  980  0
                       addEntry(product, list.get(1));
      -  981   +  968  1535
                   if (list.size() == 2) {
      +  969  0
                       addEntry(product, list.get(1));
      +  970  
                   }
      -  982  12280
                   if (list.size() == 3) {
      -  983  2760
                       addEntry(vendor, list.get(1));
      -  984  2760
                       addEntry(product, list.get(1));
      -  985  2760
                       addEntry(product, list.get(2));
      +  971  1535
                   if (list.size() == 3) {
      +  972  345
                       addEntry(vendor, list.get(1));
      +  973  345
                       addEntry(product, list.get(1));
      +  974  345
                       addEntry(product, list.get(2));
      +  975   +
                   }
      +  976  1535
                   if (list.size() >= 4) {
      +  977  1190
                       addEntry(vendor, list.get(1));
      +  978  1190
                       addEntry(vendor, list.get(2));
      +  979  1190
                       addEntry(product, list.get(1));
      +  980  1190
                       addEntry(product, list.get(2));
      +  981  1190
                       addEntry(product, list.get(3));
      +  982   +
                   }
      +  983  1535
               }
      +  984  5
           }
      +  985   +
       
       986   -
                   }
      -  987  12280
                   if (list.size() >= 4) {
      -  988  9520
                       addEntry(vendor, list.get(1));
      -  989  9520
                       addEntry(vendor, list.get(2));
      -  990  9520
                       addEntry(product, list.get(1));
      -  991  9520
                       addEntry(product, list.get(2));
      -  992  9520
                       addEntry(product, list.get(3));
      -  993   -
                   }
      -  994  12280
               }
      -  995  40
           }
      -  996   -
       
      -  997  
           /**
      -  998   +  987  
            * Adds an entry to the specified collection and sets the Integer (e.g. the count) to 1. If the entry already exists in the
      -  999   +  988  
            * collection then the Integer is incremented by 1.
      -  1000   +  989  
            *
      -  1001   +  990  
            * @param collection a collection of strings and their occurrence count
      -  1002   +  991  
            * @param key the key to add to the collection
      -  1003   +  992  
            */
      -  1004   +  993  
           private void addEntry(Map<String, Integer> collection, String key) {
      -  1005  68160
               if (collection.containsKey(key)) {
      -  1006  59896
                   collection.put(key, collection.get(key) + 1);
      -  1007   +  994  8520
               if (collection.containsKey(key)) {
      +  995  7487
                   collection.put(key, collection.get(key) + 1);
      +  996  
               } else {
      -  1008  8264
                   collection.put(key, 1);
      -  1009   +  997  1033
                   collection.put(key, 1);
      +  998  
               }
      -  1010  68160
           }
      -  1011   +  999  8520
           }
      +  1000  
       
      -  1012   +  1001  
           /**
      -  1013   +  1002  
            * Cycles through the collection of class name information to see if parts of the package names are contained in the provided
      -  1014   +  1003  
            * value. If found, it will be added as the HIGHEST confidence evidence because we have more then one source corroborating the
      -  1015   +  1004  
            * value.
      -  1016   +  1005  
            *
      -  1017   +  1006  
            * @param classes a collection of class name information
      -  1018   +  1007  
            * @param value the value to check to see if it contains a package name
      -  1019   +  1008  
            * @param evidence the evidence collection to add new entries too
      -  1020   +  1009  
            */
      -  1021   +  1010  
           private static void addMatchingValues(List<ClassNameInformation> classes, String value, EvidenceCollection evidence) {
      -  1022  304
               if (value == null || value.isEmpty() || classes == null || classes.isEmpty()) {
      -  1023  0
                   return;
      -  1024   +  1011  38
               if (value == null || value.isEmpty() || classes == null || classes.isEmpty()) {
      +  1012  0
                   return;
      +  1013  
               }
      -  1025  304
               final String text = value.toLowerCase();
      -  1026  304
               for (ClassNameInformation cni : classes) {
      -  1027  122096
                   for (String key : cni.getPackageStructure()) {
      -  1028  472048
                       if (text.contains(key)) { //note, package structure elements are already lowercase.
      -  1029  115512
                           evidence.addEvidence("jar", "package name", key, Confidence.HIGHEST);
      -  1030   +  1014  38
               final String text = value.toLowerCase();
      +  1015  38
               for (ClassNameInformation cni : classes) {
      +  1016  15262
                   for (String key : cni.getPackageStructure()) {
      +  1017  59006
                       if (text.contains(key)) { //note, package structure elements are already lowercase.
      +  1018  14439
                           evidence.addEvidence("jar", "package name", key, Confidence.HIGHEST);
      +  1019  
                       }
      -  1031  472048
                   }
      -  1032  122096
               }
      -  1033  304
           }
      -  1034   +  1020  59006
                   }
      +  1021  15262
               }
      +  1022  38
           }
      +  1023  
       
      -  1035   +  1024  
           /**
      -  1036   +  1025  
            * Simple check to see if the attribute from a manifest is just a package name.
      -  1037   +  1026  
            *
      -  1038   +  1027  
            * @param key the key of the value to check
      -  1039   +  1028  
            * @param value the value to check
      -  1040   +  1029  
            * @return true if the value looks like a java package name, otherwise false
      -  1041   +  1030  
            */
      -  1042   +  1031  
           private boolean isPackage(String key, String value) {
      -  1043   +  1032  
       
      -  1044  112
               return !key.matches(".*(version|title|vendor|name|license|description).*")
      -  1045   +  1033  14
               return !key.matches(".*(version|title|vendor|name|license|description).*")
      +  1034  
                       && value.matches("^([a-zA-Z_][a-zA-Z0-9_\\$]*(\\.[a-zA-Z_][a-zA-Z0-9_\\$]*)*)?$");
      -  1046   +  1035  
       
      -  1047   +  1036  
           }
      -  1048   +  1037  
       
      -  1049   +  1038  
           /**
      -  1050   +  1039  
            * Extracts the license information from the pom and adds it to the dependency.
      -  1051   +  1040  
            *
      -  1052   +  1041  
            * @param pom the pom object
      -  1053   +  1042  
            * @param dependency the dependency to add license information too
      -  1054   +  1043  
            */
      -  1055   +  1044  
           public static void extractLicense(Model pom, Dependency dependency) {
      -  1056   +  1045  
               //license
      -  1057  8
               if (pom.getLicenses() != null) {
      -  1058  8
                   String license = null;
      -  1059  8
                   for (License lic : pom.getLicenses()) {
      -  1060  0
                       String tmp = null;
      -  1061  0
                       if (lic.getName() != null) {
      -  1062  0
                           tmp = lic.getName();
      -  1063   +  1046  1
               if (pom.getLicenses() != null) {
      +  1047  1
                   String license = null;
      +  1048  1
                   for (License lic : pom.getLicenses()) {
      +  1049  0
                       String tmp = null;
      +  1050  0
                       if (lic.getName() != null) {
      +  1051  0
                           tmp = lic.getName();
      +  1052  
                       }
      -  1064  0
                       if (lic.getUrl() != null) {
      -  1065  0
                           if (tmp == null) {
      -  1066  0
                               tmp = lic.getUrl();
      -  1067   +  1053  0
                       if (lic.getUrl() != null) {
      +  1054  0
                           if (tmp == null) {
      +  1055  0
                               tmp = lic.getUrl();
      +  1056  
                           } else {
      -  1068  0
                               tmp += ": " + lic.getUrl();
      -  1069   +  1057  0
                               tmp += ": " + lic.getUrl();
      +  1058  
                           }
      +  1059   +
                       }
      +  1060  0
                       if (tmp == null) {
      +  1061  0
                           continue;
      +  1062   +
                       }
      +  1063  0
                       if (HTML_DETECTION_PATTERN.matcher(tmp).find()) {
      +  1064  0
                           tmp = Jsoup.parse(tmp).text();
      +  1065   +
                       }
      +  1066  0
                       if (license == null) {
      +  1067  0
                           license = tmp;
      +  1068   +
                       } else {
      +  1069  0
                           license += "\n" + tmp;
       1070  
                       }
      -  1071  0
                       if (tmp == null) {
      -  1072  0
                           continue;
      -  1073   -
                       }
      -  1074  0
                       if (HTML_DETECTION_PATTERN.matcher(tmp).find()) {
      -  1075  0
                           tmp = Jsoup.parse(tmp).text();
      +  1071  0
                   }
      +  1072  1
                   if (license != null) {
      +  1073  0
                       dependency.setLicense(license);
      +  1074   +
       
      +  1075   +
                   }
       1076   -
                       }
      -  1077  0
                       if (license == null) {
      -  1078  0
                           license = tmp;
      +
               }
      +  1077  1
           }
      +  1078   +
       
       1079   -
                       } else {
      -  1080  0
                           license += "\n" + tmp;
      -  1081   -
                       }
      -  1082  0
                   }
      -  1083  8
                   if (license != null) {
      -  1084  0
                       dependency.setLicense(license);
      -  1085   -
       
      -  1086   -
                   }
      -  1087   -
               }
      -  1088  8
           }
      -  1089   -
       
      -  1090  
           /**
      -  1091   +  1080  
            * Stores information about a class name.
      -  1092   +  1081  
            */
      -  1093   +  1082  
           protected static class ClassNameInformation {
      -  1094   +  1083  
       
      -  1095   +  1084  
               /**
      -  1096   +  1085  
                * <p>
      -  1097   +  1086  
                * Stores information about a given class name. This class will keep the fully qualified class name and a list of the
      -  1098   +  1087  
                * important parts of the package structure. Up to the first four levels of the package structure are stored, excluding a
      -  1099   +  1088  
                * leading "org" or "com". Example:</p>
      -  1100   +  1089  
                * <code>ClassNameInformation obj = new ClassNameInformation("org.owasp.dependencycheck.analyzer.JarAnalyzer");
      -  1101   +  1090  
                * System.out.println(obj.getName());
      -  1102   +  1091  
                * for (String p : obj.getPackageStructure())
      -  1103   +  1092  
                *     System.out.println(p);
      -  1104   +  1093  
                * </code>
      -  1105   +  1094  
                * <p>
      -  1106   +  1095  
                * Would result in:</p>
      -  1107   +  1096  
                * <code>org.owasp.dependencycheck.analyzer.JarAnalyzer
      -  1108   +  1097  
                * owasp
      -  1109   +  1098  
                * dependencycheck
      -  1110   +  1099  
                * analyzer
      -  1111   +  1100  
                * jaranalyzer</code>
      -  1112   +  1101  
                *
      -  1113   +  1102  
                * @param className a fully qualified class name
      -  1114   +  1103  
                */
      -  1115  12280
               ClassNameInformation(String className) {
      -  1116  12280
                   name = className;
      -  1117  12280
                   if (name.contains("/")) {
      -  1118  12280
                       final String[] tmp = className.toLowerCase().split("/");
      -  1119  12280
                       int start = 0;
      -  1120  12280
                       int end = 3;
      -  1121  12280
                       if ("com".equals(tmp[0]) || "org".equals(tmp[0])) {
      -  1122  12280
                           start = 1;
      -  1123  12280
                           end = 4;
      -  1124   +  1104  1535
               ClassNameInformation(String className) {
      +  1105  1535
                   name = className;
      +  1106  1535
                   if (name.contains("/")) {
      +  1107  1535
                       final String[] tmp = className.toLowerCase().split("/");
      +  1108  1535
                       int start = 0;
      +  1109  1535
                       int end = 3;
      +  1110  1535
                       if ("com".equals(tmp[0]) || "org".equals(tmp[0])) {
      +  1111  1535
                           start = 1;
      +  1112  1535
                           end = 4;
      +  1113  
                       }
      -  1125  12280
                       if (tmp.length <= end) {
      -  1126  2760
                           end = tmp.length - 1;
      -  1127   +  1114  1535
                       if (tmp.length <= end) {
      +  1115  345
                           end = tmp.length - 1;
      +  1116  
                       }
      -  1128  58640
                       for (int i = start; i <= end; i++) {
      -  1129  46360
                           packageStructure.add(tmp[i]);
      -  1130   +  1117  7330
                       for (int i = start; i <= end; i++) {
      +  1118  5795
                           packageStructure.add(tmp[i]);
      +  1119  
                       }
      -  1131  12280
                   } else {
      -  1132  0
                       packageStructure.add(name);
      -  1133   +  1120  1535
                   } else {
      +  1121  0
                       packageStructure.add(name);
      +  1122  
                   }
      -  1134  12280
               }
      -  1135   +  1123  1535
               }
      +  1124  
               /**
      -  1136   +  1125  
                * The fully qualified class name.
      -  1137   +  1126  
                */
      -  1138   +  1127  
               private String name;
      -  1139   +  1128  
       
      -  1140   +  1129  
               /**
      -  1141   +  1130  
                * Get the value of name
      -  1142   +  1131  
                *
      -  1143   +  1132  
                * @return the value of name
      -  1144   +  1133  
                */
      -  1145   +  1134  
               public String getName() {
      -  1146  0
                   return name;
      -  1147   +  1135  0
                   return name;
      +  1136  
               }
      -  1148   +  1137  
       
      -  1149   +  1138  
               /**
      -  1150   +  1139  
                * Set the value of name
      -  1151   +  1140  
                *
      -  1152   +  1141  
                * @param name new value of name
      -  1153   +  1142  
                */
      -  1154   +  1143  
               public void setName(String name) {
      -  1155  0
                   this.name = name;
      -  1156  0
               }
      -  1157   +  1144  0
                   this.name = name;
      +  1145  0
               }
      +  1146  
               /**
      -  1158   +  1147  
                * Up to the first four levels of the package structure, excluding a leading "org" or "com".
      -  1159   +  1148  
                */
      -  1160  12280
               private final ArrayList<String> packageStructure = new ArrayList<String>();
      -  1161   +  1149  1535
               private final ArrayList<String> packageStructure = new ArrayList<String>();
      +  1150  
       
      -  1162   +  1151  
               /**
      -  1163   +  1152  
                * Get the value of packageStructure
      -  1164   +  1153  
                *
      -  1165   +  1154  
                * @return the value of packageStructure
      -  1166   +  1155  
                */
      -  1167   +  1156  
               public ArrayList<String> getPackageStructure() {
      -  1168  134376
                   return packageStructure;
      -  1169   +  1157  16797
                   return packageStructure;
      +  1158  
               }
      -  1170   +  1159  
           }
      -  1171   +  1160  
       
      -  1172   +  1161  
           /**
      -  1173   +  1162  
            * Retrieves the next temporary directory to extract an archive too.
      -  1174   +  1163  
            *
      -  1175   +  1164  
            * @return a directory
      -  1176   +  1165  
            * @throws AnalysisException thrown if unable to create temporary directory
      -  1177   +  1166  
            */
      -  1178   +  1167  
           private File getNextTempDirectory() throws AnalysisException {
      -  1179  0
               dirCount += 1;
      -  1180  0
               final File directory = new File(tempFileLocation, String.valueOf(dirCount));
      -  1181   +  1168  0
               dirCount += 1;
      +  1169  0
               final File directory = new File(tempFileLocation, String.valueOf(dirCount));
      +  1170  
               //getting an exception for some directories not being able to be created; might be because the directory already exists?
      -  1182  0
               if (directory.exists()) {
      -  1183  0
                   return getNextTempDirectory();
      -  1184   +  1171  0
               if (directory.exists()) {
      +  1172  0
                   return getNextTempDirectory();
      +  1173  
               }
      -  1185  0
               if (!directory.mkdirs()) {
      -  1186  0
                   final String msg = String.format("Unable to create temp directory '%s'.", directory.getAbsolutePath());
      -  1187  0
                   throw new AnalysisException(msg);
      -  1188   +  1174  0
               if (!directory.mkdirs()) {
      +  1175  0
                   final String msg = String.format("Unable to create temp directory '%s'.", directory.getAbsolutePath());
      +  1176  0
                   throw new AnalysisException(msg);
      +  1177  
               }
      -  1189  0
               return directory;
      -  1190   +  1178  0
               return directory;
      +  1179  
           }
      -  1191   +  1180  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NexusAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NexusAnalyzer.html index 1923673ba..c8942b28b 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NexusAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NexusAnalyzer.html @@ -131,7 +131,7 @@
        * @author colezlaw
       57  
        */
      -  58  24
       public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
      +  58  4
       public class NexusAnalyzer extends AbstractFileTypeAnalyzer {
       59  
       
       60   @@ -150,7 +150,7 @@
            * The logger.
       67  
            */
      -  68  8
           private static final Logger LOGGER = LoggerFactory.getLogger(NexusAnalyzer.class);
      +  68  1
           private static final Logger LOGGER = LoggerFactory.getLogger(NexusAnalyzer.class);
       69  
       
       70   @@ -169,7 +169,7 @@
            * The phase in which the analyzer runs.
       77  
            */
      -  78  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
      +  78  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
       79  
       
       80   @@ -198,7 +198,7 @@
            * Field indicating if the analyzer is enabled.
       92  
            */
      -  93  24
           private final boolean enabled = checkEnabled();
      +  93  4
           private final boolean enabled = checkEnabled();
       94  
       
       95   @@ -221,25 +221,25 @@
                central one) and it's enabled by the user.
       104  
                */
      -  105  24
               boolean retval = false;
      +  105  4
               boolean retval = false;
       106  
               try {
      -  107  24
                   if ((!DEFAULT_URL.equals(Settings.getString(Settings.KEYS.ANALYZER_NEXUS_URL)))
      +  107  4
                   if ((!DEFAULT_URL.equals(Settings.getString(Settings.KEYS.ANALYZER_NEXUS_URL)))
       108  
                           && Settings.getBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED)) {
       109  0
                       LOGGER.info("Enabling Nexus analyzer");
       110  0
                       retval = true;
       111  
                   } else {
      -  112  24
                       LOGGER.debug("Nexus analyzer disabled, using Central instead");
      +  112  4
                       LOGGER.debug("Nexus analyzer disabled, using Central instead");
       113  
                   }
       114  0
               } catch (InvalidSettingException ise) {
       115  0
                   LOGGER.warn("Invalid setting. Disabling Nexus analyzer");
      -  116  24
               }
      +  116  4
               }
       117  
       
      -  118  24
               return retval;
      +  118  4
               return retval;
       119  
           }
       120   @@ -317,7 +317,7 @@
           @Override
       164  
           public String getName() {
      -  165  32
               return ANALYZER_NAME;
      +  165  4
               return ANALYZER_NAME;
       166  
           }
       167   @@ -336,7 +336,7 @@
           @Override
       174  
           protected String getAnalyzerEnabledSettingKey() {
      -  175  24
               return Settings.KEYS.ANALYZER_NEXUS_ENABLED;
      +  175  4
               return Settings.KEYS.ANALYZER_NEXUS_ENABLED;
       176  
           }
       177   @@ -355,7 +355,7 @@
           @Override
       184  
           public AnalysisPhase getAnalysisPhase() {
      -  185  16
               return ANALYSIS_PHASE;
      +  185  3
               return ANALYSIS_PHASE;
       186  
           }
       187   @@ -366,7 +366,7 @@
            * The file filter used to determine which files this analyzer supports.
       190  
            */
      -  191  8
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(SUPPORTED_EXTENSIONS).build();
      +  191  1
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(SUPPORTED_EXTENSIONS).build();
       192  
       
       193   @@ -383,7 +383,7 @@
           @Override
       199  
           protected FileFilter getFileFilter() {
      -  200  6824
               return FILTER;
      +  200  853
               return FILTER;
       201  
           }
       202   @@ -456,7 +456,7 @@  248  0
               } catch (IllegalArgumentException iae) {
       249  
                   //dependency.addAnalysisException(new AnalysisException("Invalid SHA-1"));
      -  250  0
                   LOGGER.info(String.format("invalid sha-1 hash on %s", dependency.getFileName()));
      +  250  0
                   LOGGER.info("invalid sha-1 hash on {}", dependency.getFileName());
       251  0
               } catch (FileNotFoundException fnfe) {
       252  
                   //dependency.addAnalysisException(new AnalysisException("Artifact not found on repository"));
      @@ -472,6 +472,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NodePackageAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NodePackageAnalyzer.html new file mode 100644 index 000000000..ae26b3af4 --- /dev/null +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NodePackageAnalyzer.html @@ -0,0 +1,348 @@ + + + + +Coverage Report + + + + +
      Coverage Report - org.owasp.dependencycheck.analyzer.NodePackageAnalyzer
      +
       
      + + + + +
      Classes in this File Line Coverage Branch Coverage Complexity
      NodePackageAnalyzer
      86%
      43/50
      64%
      9/14
      2.429
      +
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       1  
       /*
       2  
        * This file is part of dependency-check-core.
       3  
        *
       4  
        * Licensed under the Apache License, Version 2.0 (the "License");
       5  
        * you may not use this file except in compliance with the License.
       6  
        * You may obtain a copy of the License at
       7  
        *
       8  
        *     http://www.apache.org/licenses/LICENSE-2.0
       9  
        *
       10  
        * Unless required by applicable law or agreed to in writing, software
       11  
        * distributed under the License is distributed on an "AS IS" BASIS,
       12  
        * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       13  
        * See the License for the specific language governing permissions and
       14  
        * limitations under the License.
       15  
        *
       16  
        * Copyright (c) 2015 Institute for Defense Analyses. All Rights Reserved.
       17  
        */
       18  
       package org.owasp.dependencycheck.analyzer;
       19  
       
       20  
       import org.apache.commons.io.FileUtils;
       21  
       import org.owasp.dependencycheck.Engine;
       22  
       import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
       23  
       import org.owasp.dependencycheck.dependency.Confidence;
       24  
       import org.owasp.dependencycheck.dependency.Dependency;
       25  
       import org.owasp.dependencycheck.dependency.EvidenceCollection;
       26  
       import org.owasp.dependencycheck.utils.FileFilterBuilder;
       27  
       import org.owasp.dependencycheck.utils.Settings;
       28  
       import org.slf4j.Logger;
       29  
       import org.slf4j.LoggerFactory;
       30  
       
       31  
       import java.io.File;
       32  
       import java.io.FileFilter;
       33  
       import java.io.IOException;
       34  
       import java.util.Map;
       35  
       import javax.json.Json;
       36  
       import javax.json.JsonException;
       37  
       import javax.json.JsonObject;
       38  
       import javax.json.JsonReader;
       39  
       import javax.json.JsonString;
       40  
       import javax.json.JsonValue;
       41  
       
       42  
       /**
       43  
        * Used to analyze Node Package Manager (npm) package.json files, and collect information that can be used to determine the
       44  
        * associated CPE.
       45  
        *
       46  
        * @author Dale Visser <dvisser@ida.org>
       47  
        */
       48  7
       public class NodePackageAnalyzer extends AbstractFileTypeAnalyzer {
       49  
       
       50  
           /**
       51  
            * The logger.
       52  
            */
       53  1
           private static final Logger LOGGER = LoggerFactory.getLogger(NodePackageAnalyzer.class);
       54  
       
       55  
           /**
       56  
            * The name of the analyzer.
       57  
            */
       58  
           private static final String ANALYZER_NAME = "Node.js Package Analyzer";
       59  
       
       60  
           /**
       61  
            * The phase that this analyzer is intended to run in.
       62  
            */
       63  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
       64  
       
       65  
           /**
       66  
            * The file name to scan.
       67  
            */
       68  
           public static final String PACKAGE_JSON = "package.json";
       69  
           /**
       70  
            * Filter that detects files named "package.json".
       71  
            */
       72  1
           private static final FileFilter PACKAGE_JSON_FILTER = FileFilterBuilder.newInstance()
       73  
                   .addFilenames(PACKAGE_JSON).build();
       74  
       
       75  
           /**
       76  
            * Returns the FileFilter
       77  
            *
       78  
            * @return the FileFilter
       79  
            */
       80  
           @Override
       81  
           protected FileFilter getFileFilter() {
       82  854
               return PACKAGE_JSON_FILTER;
       83  
           }
       84  
       
       85  
           @Override
       86  
           protected void initializeFileTypeAnalyzer() throws Exception {
       87  
               // NO-OP
       88  3
           }
       89  
       
       90  
           /**
       91  
            * Returns the name of the analyzer.
       92  
            *
       93  
            * @return the name of the analyzer.
       94  
            */
       95  
           @Override
       96  
           public String getName() {
       97  5
               return ANALYZER_NAME;
       98  
           }
       99  
       
       100  
           /**
       101  
            * Returns the phase that the analyzer is intended to run in.
       102  
            *
       103  
            * @return the phase that the analyzer is intended to run in.
       104  
            */
       105  
           @Override
       106  
           public AnalysisPhase getAnalysisPhase() {
       107  3
               return ANALYSIS_PHASE;
       108  
           }
       109  
       
       110  
           /**
       111  
            * Returns the key used in the properties file to reference the analyzer's enabled property.
       112  
            *
       113  
            * @return the analyzer's enabled property setting key
       114  
            */
       115  
           @Override
       116  
           protected String getAnalyzerEnabledSettingKey() {
       117  7
               return Settings.KEYS.ANALYZER_NODE_PACKAGE_ENABLED;
       118  
           }
       119  
       
       120  
           @Override
       121  
           protected void analyzeFileType(Dependency dependency, Engine engine)
       122  
                   throws AnalysisException {
       123  1
               final File file = dependency.getActualFile();
       124  
               JsonReader jsonReader;
       125  
               try {
       126  1
                   jsonReader = Json.createReader(FileUtils.openInputStream(file));
       127  0
               } catch (IOException e) {
       128  0
                   throw new AnalysisException(
       129  
                           "Problem occurred while reading dependency file.", e);
       130  1
               }
       131  
               try {
       132  1
                   final JsonObject json = jsonReader.readObject();
       133  1
                   final EvidenceCollection productEvidence = dependency.getProductEvidence();
       134  1
                   final EvidenceCollection vendorEvidence = dependency.getVendorEvidence();
       135  1
                   if (json.containsKey("name")) {
       136  1
                       final Object value = json.get("name");
       137  1
                       if (value instanceof JsonString) {
       138  1
                           final String valueString = ((JsonString) value).getString();
       139  1
                           productEvidence.addEvidence(PACKAGE_JSON, "name", valueString, Confidence.HIGHEST);
       140  1
                           vendorEvidence.addEvidence(PACKAGE_JSON, "name_project", String.format("%s_project", valueString), Confidence.LOW);
       141  1
                       } else {
       142  0
                           LOGGER.warn("JSON value not string as expected: {}", value);
       143  
                       }
       144  
                   }
       145  1
                   addToEvidence(json, productEvidence, "description");
       146  1
                   addToEvidence(json, vendorEvidence, "author");
       147  1
                   addToEvidence(json, dependency.getVersionEvidence(), "version");
       148  1
                   dependency.setDisplayFileName(String.format("%s/%s", file.getParentFile().getName(), file.getName()));
       149  0
               } catch (JsonException e) {
       150  0
                   LOGGER.warn("Failed to parse package.json file.", e);
       151  
               } finally {
       152  1
                   jsonReader.close();
       153  1
               }
       154  1
           }
       155  
       
       156  
           /**
       157  
            * Adds information to an evidence collection from the node json configuration.
       158  
            *
       159  
            * @param json information from node.js
       160  
            * @param collection a set of evidence about a dependency
       161  
            * @param key the key to obtain the data from the json information
       162  
            */
       163  
           private void addToEvidence(JsonObject json, EvidenceCollection collection, String key) {
       164  3
               if (json.containsKey(key)) {
       165  3
                   final JsonValue value = json.get(key);
       166  3
                   if (value instanceof JsonString) {
       167  2
                       collection.addEvidence(PACKAGE_JSON, key, ((JsonString) value).getString(), Confidence.HIGHEST);
       168  1
                   } else if (value instanceof JsonObject) {
       169  1
                       final JsonObject jsonObject = (JsonObject) value;
       170  1
                       for (final Map.Entry<String, JsonValue> entry : jsonObject.entrySet()) {
       171  1
                           final String property = entry.getKey();
       172  1
                           final JsonValue subValue = entry.getValue();
       173  1
                           if (subValue instanceof JsonString) {
       174  1
                               collection.addEvidence(PACKAGE_JSON,
       175  
                                       String.format("%s.%s", key, property),
       176  
                                       ((JsonString) subValue).getString(),
       177  
                                       Confidence.HIGHEST);
       178  
                           } else {
       179  0
                               LOGGER.warn("JSON sub-value not string as expected: {}", subValue);
       180  
                           }
       181  1
                       }
       182  1
                   } else {
       183  0
                       LOGGER.warn("JSON value not string or JSON object as expected: {}", value);
       184  
                   }
       185  
               }
       186  3
           }
       187  
       }
      + + + + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NuspecAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NuspecAnalyzer.html index bc3fba3c6..e92268656 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NuspecAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NuspecAnalyzer.html @@ -101,7 +101,7 @@
        * @author colezlaw
       42  
        */
      -  43  48
       public class NuspecAnalyzer extends AbstractFileTypeAnalyzer {
      +  43  7
       public class NuspecAnalyzer extends AbstractFileTypeAnalyzer {
       44  
       
       45   @@ -110,7 +110,7 @@
            * The logger.
       47  
            */
      -  48  8
           private static final Logger LOGGER = LoggerFactory.getLogger(NuspecAnalyzer.class);
      +  48  1
           private static final Logger LOGGER = LoggerFactory.getLogger(NuspecAnalyzer.class);
       49  
       
       50   @@ -129,7 +129,7 @@
            * The phase in which the analyzer runs.
       57  
            */
      -  58  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
      +  58  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
       59  
       
       60   @@ -173,7 +173,7 @@
           @Override
       80  
           public String getName() {
      -  81  40
               return ANALYZER_NAME;
      +  81  5
               return ANALYZER_NAME;
       82  
           }
       83   @@ -192,7 +192,7 @@
           @Override
       90  
           protected String getAnalyzerEnabledSettingKey() {
      -  91  48
               return Settings.KEYS.ANALYZER_NUSPEC_ENABLED;
      +  91  7
               return Settings.KEYS.ANALYZER_NUSPEC_ENABLED;
       92  
           }
       93   @@ -211,7 +211,7 @@
           @Override
       100  
           public AnalysisPhase getAnalysisPhase() {
      -  101  24
               return ANALYSIS_PHASE;
      +  101  4
               return ANALYSIS_PHASE;
       102  
           }
       103   @@ -222,7 +222,7 @@
            * The file filter used to determine which files this analyzer supports.
       106  
            */
      -  107  8
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(
      +  107  1
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(
       108  
                   SUPPORTED_EXTENSIONS).build();
       109   @@ -241,7 +241,7 @@
           @Override
       116  
           protected FileFilter getFileFilter() {
      -  117  6840
               return FILTER;
      +  117  855
               return FILTER;
       118  
           }
       119   @@ -312,6 +312,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NvdCveAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NvdCveAnalyzer.html index e1d61120f..e6d0a5209 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NvdCveAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.NvdCveAnalyzer.html @@ -89,7 +89,7 @@
        * @author Jeremy Long
       36  
        */
      -  37  24
       public class NvdCveAnalyzer implements Analyzer {
      +  37  4
       public class NvdCveAnalyzer implements Analyzer {
       38  
       
       39   @@ -128,9 +128,9 @@
            */
       56  
           public void open() throws SQLException, IOException, DatabaseException, ClassNotFoundException {
      -  57  8
               cveDB = new CveDB();
      -  58  8
               cveDB.open();
      -  59  8
           }
      +  57  1
               cveDB = new CveDB();
      +  58  1
               cveDB.open();
      +  59  1
           }
       60  
       
       61   @@ -143,9 +143,9 @@
           @Override
       65  
           public void close() {
      -  66  8
               cveDB.close();
      -  67  8
               cveDB = null;
      -  68  8
           }
      +  66  1
               cveDB.close();
      +  67  1
               cveDB = null;
      +  68  1
           }
       69  
       
       70   @@ -160,7 +160,7 @@
            */
       75  
           public boolean isOpen() {
      -  76  17
               return (cveDB != null);
      +  76  3
               return (cveDB != null);
       77  
           }
       78   @@ -179,12 +179,12 @@
           @Override
       85  
           protected void finalize() throws Throwable {
      -  86  17
               super.finalize();
      -  87  17
               if (isOpen()) {
      +  86  3
               super.finalize();
      +  87  3
               if (isOpen()) {
       88  0
                   close();
       89  
               }
      -  90  17
           }
      +  90  3
           }
       91  
       
       92   @@ -205,20 +205,20 @@
           @Override
       100  
           public void analyze(Dependency dependency, Engine engine) throws AnalysisException {
      -  101  16
               for (Identifier id : dependency.getIdentifiers()) {
      -  102  24
                   if ("cpe".equals(id.getType())) {
      +  101  2
               for (Identifier id : dependency.getIdentifiers()) {
      +  102  3
                   if ("cpe".equals(id.getType())) {
       103  
                       try {
      -  104  24
                           final String value = id.getValue();
      -  105  24
                           final List<Vulnerability> vulns = cveDB.getVulnerabilities(value);
      -  106  24
                           dependency.getVulnerabilities().addAll(vulns);
      +  104  3
                           final String value = id.getValue();
      +  105  3
                           final List<Vulnerability> vulns = cveDB.getVulnerabilities(value);
      +  106  3
                           dependency.getVulnerabilities().addAll(vulns);
       107  0
                       } catch (DatabaseException ex) {
       108  0
                           throw new AnalysisException(ex);
      -  109  24
                       }
      +  109  3
                       }
       110  
                   }
      -  111  24
               }
      -  112  16
               for (Identifier id : dependency.getSuppressedIdentifiers()) {
      +  111  3
               }
      +  112  2
               for (Identifier id : dependency.getSuppressedIdentifiers()) {
       113  0
                   if ("cpe".equals(id.getType())) {
       114  
                       try {
      @@ -231,7 +231,7 @@  121  
                   }
       122  0
               }
      -  123  16
           }
      +  123  2
           }
       124  
       
       125   @@ -248,7 +248,7 @@
           @Override
       131  
           public String getName() {
      -  132  32
               return "NVD CVE Analyzer";
      +  132  4
               return "NVD CVE Analyzer";
       133  
           }
       134   @@ -267,7 +267,7 @@
           @Override
       141  
           public AnalysisPhase getAnalysisPhase() {
      -  142  16
               return AnalysisPhase.FINDING_ANALYSIS;
      +  142  3
               return AnalysisPhase.FINDING_ANALYSIS;
       143  
           }
       144   @@ -286,12 +286,12 @@
           @Override
       151  
           public void initialize() throws Exception {
      -  152  8
               this.open();
      -  153  8
           }
      +  152  1
               this.open();
      +  153  1
           }
       154  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.OpenSSLAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.OpenSSLAnalyzer.html index dc430ab3e..e7c4f11e1 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.OpenSSLAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.OpenSSLAnalyzer.html @@ -93,7 +93,7 @@
        * @author Dale Visser <dvisser@ida.org>
       38  
        */
      -  39  56
       public class OpenSSLAnalyzer extends AbstractFileTypeAnalyzer {
      +  39  8
       public class OpenSSLAnalyzer extends AbstractFileTypeAnalyzer {
       40  
       
       41   @@ -114,8 +114,8 @@
            * Filter that detects files named "__init__.py".
       49  
            */
      -  50  8
           private static final FileFilter OPENSSLV_FILTER = FileFilterBuilder.newInstance().addFilenames(OPENSSLV_H).build();
      -  51  8
           private static final Pattern VERSION_PATTERN = Pattern.compile(
      +  50  1
           private static final FileFilter OPENSSLV_FILTER = FileFilterBuilder.newInstance().addFilenames(OPENSSLV_H).build();
      +  51  1
           private static final Pattern VERSION_PATTERN = Pattern.compile(
       52  
                   "define\\s+OPENSSL_VERSION_NUMBER\\s+0x([0-9a-zA-Z]{8})L", Pattern.DOTALL
       53   @@ -154,14 +154,14 @@
            */
       70  
           static String getOpenSSLVersion(long openSSLVersionConstant) {
      -  71  72
               final long major = openSSLVersionConstant >>> MAJOR_OFFSET;
      -  72  72
               final long minor = (openSSLVersionConstant & MINOR_MASK) >>> MINOR_OFFSET;
      -  73  72
               final long fix = (openSSLVersionConstant & FIX_MASK) >>> FIX_OFFSET;
      -  74  72
               final long patchLevel = (openSSLVersionConstant & PATCH_MASK) >>> PATCH_OFFSET;
      -  75  72
               final String patch = 0 == patchLevel || patchLevel > NUM_LETTERS ? "" : String.valueOf((char) (patchLevel + 'a' - 1));
      -  76  72
               final int statusCode = (int) (openSSLVersionConstant & STATUS_MASK);
      -  77  72
               final String status = 0xf == statusCode ? "" : (0 == statusCode ? "-dev" : "-beta" + statusCode);
      -  78  72
               return String.format("%d.%d.%d%s%s", major, minor, fix, patch, status);
      +  71  9
               final long major = openSSLVersionConstant >>> MAJOR_OFFSET;
      +  72  9
               final long minor = (openSSLVersionConstant & MINOR_MASK) >>> MINOR_OFFSET;
      +  73  9
               final long fix = (openSSLVersionConstant & FIX_MASK) >>> FIX_OFFSET;
      +  74  9
               final long patchLevel = (openSSLVersionConstant & PATCH_MASK) >>> PATCH_OFFSET;
      +  75  9
               final String patch = 0 == patchLevel || patchLevel > NUM_LETTERS ? "" : String.valueOf((char) (patchLevel + 'a' - 1));
      +  76  9
               final int statusCode = (int) (openSSLVersionConstant & STATUS_MASK);
      +  77  9
               final String status = 0xf == statusCode ? "" : (0 == statusCode ? "-dev" : "-beta" + statusCode);
      +  78  9
               return String.format("%d.%d.%d%s%s", major, minor, fix, patch, status);
       79  
           }
       80   @@ -180,7 +180,7 @@
           @Override
       87  
           public String getName() {
      -  88  40
               return "OpenSSL Source Analyzer";
      +  88  5
               return "OpenSSL Source Analyzer";
       89  
           }
       90   @@ -199,7 +199,7 @@
           @Override
       97  
           public AnalysisPhase getAnalysisPhase() {
      -  98  16
               return AnalysisPhase.INFORMATION_COLLECTION;
      +  98  3
               return AnalysisPhase.INFORMATION_COLLECTION;
       99  
           }
       100   @@ -218,7 +218,7 @@
           @Override
       107  
           protected FileFilter getFileFilter() {
      -  108  6832
               return OPENSSLV_FILTER;
      +  108  854
               return OPENSSLV_FILTER;
       109  
           }
       110   @@ -239,7 +239,7 @@
           protected void initializeFileTypeAnalyzer() throws Exception {
       118  
               // Nothing to do here.
      -  119  32
           }
      +  119  4
           }
       120  
       
       121   @@ -262,31 +262,31 @@
           protected void analyzeFileType(Dependency dependency, Engine engine)
       130  
                   throws AnalysisException {
      -  131  8
               final File file = dependency.getActualFile();
      -  132  8
               final String parentName = file.getParentFile().getName();
      -  133  8
               boolean found = false;
      -  134  8
               final String contents = getFileContents(file);
      -  135  8
               if (!contents.isEmpty()) {
      -  136  8
                   final Matcher matcher = VERSION_PATTERN.matcher(contents);
      -  137  8
                   if (matcher.find()) {
      -  138  8
                       dependency.getVersionEvidence().addEvidence(OPENSSLV_H, "Version Constant",
      +  131  1
               final File file = dependency.getActualFile();
      +  132  1
               final String parentName = file.getParentFile().getName();
      +  133  1
               boolean found = false;
      +  134  1
               final String contents = getFileContents(file);
      +  135  1
               if (!contents.isEmpty()) {
      +  136  1
                   final Matcher matcher = VERSION_PATTERN.matcher(contents);
      +  137  1
                   if (matcher.find()) {
      +  138  1
                       dependency.getVersionEvidence().addEvidence(OPENSSLV_H, "Version Constant",
       139  
                               getOpenSSLVersion(Long.parseLong(matcher.group(1), HEXADECIMAL)), Confidence.HIGH);
      -  140  8
                       found = true;
      +  140  1
                       found = true;
       141  
                   }
       142  
               }
      -  143  8
               if (found) {
      -  144  8
                   dependency.setDisplayFileName(parentName + File.separatorChar + OPENSSLV_H);
      -  145  8
                   dependency.getVendorEvidence().addEvidence(OPENSSLV_H, "Vendor", "OpenSSL", Confidence.HIGHEST);
      -  146  8
                   dependency.getProductEvidence().addEvidence(OPENSSLV_H, "Product", "OpenSSL", Confidence.HIGHEST);
      +  143  1
               if (found) {
      +  144  1
                   dependency.setDisplayFileName(parentName + File.separatorChar + OPENSSLV_H);
      +  145  1
                   dependency.getVendorEvidence().addEvidence(OPENSSLV_H, "Vendor", "OpenSSL", Confidence.HIGHEST);
      +  146  1
                   dependency.getProductEvidence().addEvidence(OPENSSLV_H, "Product", "OpenSSL", Confidence.HIGHEST);
       147  
               } else {
       148  0
                   engine.getDependencies().remove(dependency);
       149  
               }
      -  150  8
           }
      +  150  1
           }
       151  
       
       152   @@ -311,13 +311,13 @@
               String contents;
       162  
               try {
      -  163  8
                   contents = FileUtils.readFileToString(actualFile).trim();
      +  163  1
                   contents = FileUtils.readFileToString(actualFile).trim();
       164  0
               } catch (IOException e) {
       165  0
                   throw new AnalysisException(
       166  
                           "Problem occurred while reading dependency file.", e);
      -  167  8
               }
      -  168  8
               return contents;
      +  167  1
               }
      +  168  1
               return contents;
       169  
           }
       170   @@ -326,13 +326,13 @@
           @Override
       172  
           protected String getAnalyzerEnabledSettingKey() {
      -  173  56
               return Settings.KEYS.ANALYZER_OPENSSL_ENABLED;
      +  173  8
               return Settings.KEYS.ANALYZER_OPENSSL_ENABLED;
       174  
           }
       175  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.PythonDistributionAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.PythonDistributionAnalyzer.html index 1c374395c..c1689d2a9 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.PythonDistributionAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.PythonDistributionAnalyzer.html @@ -74,7 +74,7 @@  28  
       import org.apache.commons.io.input.AutoCloseInputStream;
       29   -
       import org.apache.commons.lang.StringUtils;
      +
       import org.apache.commons.lang3.StringUtils;
       30  
       import org.owasp.dependencycheck.Engine;
       31   @@ -121,13 +121,13 @@
        * @author Dale Visser <dvisser@ida.org>
       52  
        */
      -  53  88
       public class PythonDistributionAnalyzer extends AbstractFileTypeAnalyzer {
      +  53  12
       public class PythonDistributionAnalyzer extends AbstractFileTypeAnalyzer {
       54  
       
       55  
           /**
       56   -
            * Name of egg metatdata files to analyze.
      +
            * Name of egg metadata files to analyze.
       57  
            */
       58   @@ -150,7 +150,7 @@
            * The logger.
       67  
            */
      -  68  8
           private static final Logger LOGGER = LoggerFactory
      +  68  1
           private static final Logger LOGGER = LoggerFactory
       69  
                   .getLogger(PythonDistributionAnalyzer.class);
       70   @@ -161,7 +161,7 @@
            * The count of directories created during analysis. This is used for creating temporary directories.
       73  
            */
      -  74  8
           private static int dirCount = 0;
      +  74  1
           private static int dirCount = 0;
       75  
       
       76   @@ -178,7 +178,7 @@
            * The phase that this analyzer is intended to run in.
       82  
            */
      -  83  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
      +  83  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
       84  
       
       85   @@ -187,7 +187,7 @@
            * The set of file extensions supported by this analyzer.
       87  
            */
      -  88  8
           private static final String[] EXTENSIONS = {"whl", "egg", "zip"};
      +  88  1
           private static final String[] EXTENSIONS = {"whl", "egg", "zip"};
       89  
       
       90   @@ -196,7 +196,7 @@
            * Used to match on egg archive candidate extensions.
       92  
            */
      -  93  8
           private static final FileFilter EGG_OR_ZIP = FileFilterBuilder.newInstance().addExtensions("egg", "zip").build();
      +  93  1
           private static final FileFilter EGG_OR_ZIP = FileFilterBuilder.newInstance().addExtensions("egg", "zip").build();
       94  
       
       95   @@ -205,7 +205,7 @@
            * Used to detect files with a .whl extension.
       97  
            */
      -  98  8
           private static final FileFilter WHL_FILTER = FileFilterBuilder.newInstance().addExtensions("whl").build();
      +  98  1
           private static final FileFilter WHL_FILTER = FileFilterBuilder.newInstance().addExtensions("whl").build();
       99  
       
       100   @@ -224,7 +224,7 @@
            * Filter that detects *.dist-info files (but doesn't verify they are directories.
       107  
            */
      -  108  8
           private static final FilenameFilter DIST_INFO_FILTER = new SuffixFileFilter(
      +  108  1
           private static final FilenameFilter DIST_INFO_FILTER = new SuffixFileFilter(
       109  
                   ".dist-info");
       110   @@ -235,7 +235,7 @@
            * Filter that detects files named "METADATA".
       113  
            */
      -  114  8
           private static final FilenameFilter EGG_INFO_FILTER = new NameFileFilter(
      +  114  1
           private static final FilenameFilter EGG_INFO_FILTER = new NameFileFilter(
       115  
                   "EGG-INFO");
       116   @@ -246,7 +246,7 @@
            * Filter that detects files named "METADATA".
       119  
            */
      -  120  8
           private static final NameFileFilter METADATA_FILTER = new NameFileFilter(
      +  120  1
           private static final NameFileFilter METADATA_FILTER = new NameFileFilter(
       121  
                   METADATA);
       122   @@ -257,7 +257,7 @@
            * Filter that detects files named "PKG-INFO".
       125  
            */
      -  126  8
           private static final NameFileFilter PKG_INFO_FILTER = new NameFileFilter(
      +  126  1
           private static final NameFileFilter PKG_INFO_FILTER = new NameFileFilter(
       127  
                   PKG_INFO);
       128   @@ -268,7 +268,7 @@
            * The file filter used to determine which files this analyzer supports.
       131  
            */
      -  132  8
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addFileFilters(
      +  132  1
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addFileFilters(
       133  
                   METADATA_FILTER, PKG_INFO_FILTER).addExtensions(EXTENSIONS).build();
       134   @@ -287,7 +287,7 @@
           @Override
       141  
           protected FileFilter getFileFilter() {
      -  142  6864
               return FILTER;
      +  142  858
               return FILTER;
       143  
           }
       144   @@ -306,7 +306,7 @@
           @Override
       151  
           public String getName() {
      -  152  40
               return ANALYZER_NAME;
      +  152  5
               return ANALYZER_NAME;
       153  
           }
       154   @@ -325,7 +325,7 @@
           @Override
       161  
           public AnalysisPhase getAnalysisPhase() {
      -  162  16
               return ANALYSIS_PHASE;
      +  162  3
               return ANALYSIS_PHASE;
       163  
           }
       164   @@ -344,7 +344,7 @@
           @Override
       171  
           protected String getAnalyzerEnabledSettingKey() {
      -  172  88
               return Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED;
      +  172  12
               return Settings.KEYS.ANALYZER_PYTHON_DISTRIBUTION_ENABLED;
       173  
           }
       174   @@ -355,38 +355,38 @@
           protected void analyzeFileType(Dependency dependency, Engine engine)
       177  
                   throws AnalysisException {
      -  178  48
               final File actualFile = dependency.getActualFile();
      -  179  48
               if (WHL_FILTER.accept(actualFile)) {
      -  180  8
                   collectMetadataFromArchiveFormat(dependency, DIST_INFO_FILTER,
      +  178  6
               final File actualFile = dependency.getActualFile();
      +  179  6
               if (WHL_FILTER.accept(actualFile)) {
      +  180  1
                   collectMetadataFromArchiveFormat(dependency, DIST_INFO_FILTER,
       181  
                           METADATA_FILTER);
      -  182  40
               } else if (EGG_OR_ZIP.accept(actualFile)) {
      -  183  16
                   collectMetadataFromArchiveFormat(dependency, EGG_INFO_FILTER,
      +  182  5
               } else if (EGG_OR_ZIP.accept(actualFile)) {
      +  183  2
                   collectMetadataFromArchiveFormat(dependency, EGG_INFO_FILTER,
       184  
                           PKG_INFO_FILTER);
       185  
               } else {
      -  186  24
                   final String name = actualFile.getName();
      -  187  24
                   final boolean metadata = METADATA.equals(name);
      -  188  24
                   if (metadata || PKG_INFO.equals(name)) {
      -  189  24
                       final File parent = actualFile.getParentFile();
      -  190  24
                       final String parentName = parent.getName();
      -  191  24
                       dependency.setDisplayFileName(parentName + "/" + name);
      -  192  24
                       if (parent.isDirectory()
      +  186  3
                   final String name = actualFile.getName();
      +  187  3
                   final boolean metadata = METADATA.equals(name);
      +  188  3
                   if (metadata || PKG_INFO.equals(name)) {
      +  189  3
                       final File parent = actualFile.getParentFile();
      +  190  3
                       final String parentName = parent.getName();
      +  191  3
                       dependency.setDisplayFileName(parentName + "/" + name);
      +  192  3
                       if (parent.isDirectory()
       193  
                               && (metadata && parentName.endsWith(".dist-info")
       194  
                               || parentName.endsWith(".egg-info") || "EGG-INFO"
       195  
                               .equals(parentName))) {
      -  196  24
                           collectWheelMetadata(dependency, actualFile);
      +  196  3
                           collectWheelMetadata(dependency, actualFile);
       197  
                       }
       198  
                   }
       199  
               }
      -  200  48
           }
      +  200  6
           }
       201  
       
       202   @@ -411,28 +411,28 @@
                   FilenameFilter folderFilter, FilenameFilter metadataFilter)
       212  
                   throws AnalysisException {
      -  213  24
               final File temp = getNextTempDirectory();
      -  214  24
               LOGGER.debug("{} exists? {}", temp, temp.exists());
      +  213  3
               final File temp = getNextTempDirectory();
      +  214  3
               LOGGER.debug("{} exists? {}", temp, temp.exists());
       215  
               try {
      -  216  24
                   ExtractionUtil.extractFilesUsingFilter(
      +  216  3
                   ExtractionUtil.extractFilesUsingFilter(
       217  
                           new File(dependency.getActualFilePath()), temp,
       218  
                           metadataFilter);
       219  0
               } catch (ExtractionException ex) {
       220  0
                   throw new AnalysisException(ex);
      -  221  24
               }
      +  221  3
               }
       222  
       
      -  223  24
               collectWheelMetadata(
      +  223  3
               collectWheelMetadata(
       224  
                       dependency,
       225  
                       getMatchingFile(getMatchingFile(temp, folderFilter),
       226  
                               metadataFilter));
      -  227  24
           }
      +  227  3
           }
       228  
       
       229   @@ -449,9 +449,9 @@
           @Override
       235  
           protected void initializeFileTypeAnalyzer() throws Exception {
      -  236  64
               final File baseDir = Settings.getTempDirectory();
      -  237  64
               tempFileLocation = File.createTempFile("check", "tmp", baseDir);
      -  238  64
               if (!tempFileLocation.delete()) {
      +  236  8
               final File baseDir = Settings.getTempDirectory();
      +  237  8
               tempFileLocation = File.createTempFile("check", "tmp", baseDir);
      +  238  8
               if (!tempFileLocation.delete()) {
       239  0
                   final String msg = String.format(
       240  
                           "Unable to delete temporary file '%s'.",
      @@ -460,7 +460,7 @@  242  0
                   throw new AnalysisException(msg);
       243  
               }
      -  244  64
               if (!tempFileLocation.mkdirs()) {
      +  244  8
               if (!tempFileLocation.mkdirs()) {
       245  0
                   final String msg = String.format(
       246  
                           "Unable to create directory '%s'.",
      @@ -469,7 +469,7 @@  248  0
                   throw new AnalysisException(msg);
       249  
               }
      -  250  64
           }
      +  250  8
           }
       251  
       
       252   @@ -482,18 +482,18 @@
           @Override
       256  
           public void close() {
      -  257  72
               if (tempFileLocation != null && tempFileLocation.exists()) {
      -  258  64
                   LOGGER.debug("Attempting to delete temporary files");
      -  259  64
                   final boolean success = FileUtils.delete(tempFileLocation);
      -  260  64
                   if (!success) {
      -  261  8
                       LOGGER.warn(
      +  257  9
               if (tempFileLocation != null && tempFileLocation.exists()) {
      +  258  8
                   LOGGER.debug("Attempting to delete temporary files");
      +  259  8
                   final boolean success = FileUtils.delete(tempFileLocation);
      +  260  8
                   if (!success) {
      +  261  1
                       LOGGER.warn(
       262  
                               "Failed to delete some temporary files, see the log for more details");
       263  
                   }
       264  
               }
      -  265  72
           }
      +  265  9
           }
       266  
       
       267   @@ -507,178 +507,174 @@  271  
            * @param file a reference to the manifest/properties file
       272   -
            * @throws AnalysisException thrown when there is an error
      +
            */
       273   -
            */
      -  274   -
           private static void collectWheelMetadata(Dependency dependency, File file)
      -  275   -
                   throws AnalysisException {
      -  276  48
               final InternetHeaders headers = getManifestProperties(file);
      -  277  48
               addPropertyToEvidence(headers, dependency.getVersionEvidence(),
      -  278   +
           private static void collectWheelMetadata(Dependency dependency, File file) {
      +  274  6
               final InternetHeaders headers = getManifestProperties(file);
      +  275  6
               addPropertyToEvidence(headers, dependency.getVersionEvidence(),
      +  276  
                       "Version", Confidence.HIGHEST);
      -  279  48
               addPropertyToEvidence(headers, dependency.getProductEvidence(), "Name",
      -  280   +  277  6
               addPropertyToEvidence(headers, dependency.getProductEvidence(), "Name",
      +  278  
                       Confidence.HIGHEST);
      -  281  48
               final String url = headers.getHeader("Home-page", null);
      -  282  48
               final EvidenceCollection vendorEvidence = dependency
      -  283   +  279  6
               final String url = headers.getHeader("Home-page", null);
      +  280  6
               final EvidenceCollection vendorEvidence = dependency
      +  281  
                       .getVendorEvidence();
      -  284  48
               if (StringUtils.isNotBlank(url)) {
      -  285  48
                   if (UrlStringUtils.isUrl(url)) {
      -  286  48
                       vendorEvidence.addEvidence(METADATA, "vendor", url,
      -  287   +  282  6
               if (StringUtils.isNotBlank(url)) {
      +  283  6
                   if (UrlStringUtils.isUrl(url)) {
      +  284  6
                       vendorEvidence.addEvidence(METADATA, "vendor", url,
      +  285  
                               Confidence.MEDIUM);
      -  288   +  286  
                   }
      -  289   +  287  
               }
      -  290  48
               addPropertyToEvidence(headers, vendorEvidence, "Author", Confidence.LOW);
      -  291  48
               final String summary = headers.getHeader("Summary", null);
      -  292  48
               if (StringUtils.isNotBlank(summary)) {
      -  293  48
                   JarAnalyzer
      -  294   +  288  6
               addPropertyToEvidence(headers, vendorEvidence, "Author", Confidence.LOW);
      +  289  6
               final String summary = headers.getHeader("Summary", null);
      +  290  6
               if (StringUtils.isNotBlank(summary)) {
      +  291  6
                   JarAnalyzer
      +  292  
                           .addDescription(dependency, summary, METADATA, "summary");
      +  293   +
               }
      +  294  6
           }
       295   -
               }
      -  296  48
           }
      +
       
      +  296   +
           /**
       297   -
       
      -  298   -
           /**
      -  299  
            * Adds a value to the evidence collection.
      -  300   +  298  
            *
      -  301   +  299  
            * @param headers the properties collection
      -  302   +  300  
            * @param evidence the evidence collection to add the value
      -  303   +  301  
            * @param property the property name
      -  304   +  302  
            * @param confidence the confidence of the evidence
      -  305   +  303  
            */
      -  306   +  304  
           private static void addPropertyToEvidence(InternetHeaders headers,
      -  307   +  305  
                   EvidenceCollection evidence, String property, Confidence confidence) {
      -  308  144
               final String value = headers.getHeader(property, null);
      -  309  144
               LOGGER.debug("Property: {}, Value: {}", property, value);
      -  310  144
               if (StringUtils.isNotBlank(value)) {
      -  311  144
                   evidence.addEvidence(METADATA, property, value, confidence);
      +  306  18
               final String value = headers.getHeader(property, null);
      +  307  18
               LOGGER.debug("Property: {}, Value: {}", property, value);
      +  308  18
               if (StringUtils.isNotBlank(value)) {
      +  309  18
                   evidence.addEvidence(METADATA, property, value, confidence);
      +  310   +
               }
      +  311  18
           }
       312   -
               }
      -  313  144
           }
      +
       
      +  313   +
           /**
       314   -
       
      -  315   -
           /**
      -  316  
            * Returns a list of files that match the given filter, this does not recursively scan the directory.
      -  317   +  315  
            *
      -  318   +  316  
            * @param folder the folder to filter
      -  319   +  317  
            * @param filter the filter to apply to the files in the directory
      -  320   +  318  
            * @return the list of Files in the directory that match the provided filter
      -  321   +  319  
            */
      -  322   +  320  
           private static File getMatchingFile(File folder, FilenameFilter filter) {
      -  323  48
               File result = null;
      -  324  48
               final File[] matches = folder.listFiles(filter);
      -  325  48
               if (null != matches && 1 == matches.length) {
      -  326  48
                   result = matches[0];
      +  321  6
               File result = null;
      +  322  6
               final File[] matches = folder.listFiles(filter);
      +  323  6
               if (null != matches && 1 == matches.length) {
      +  324  6
                   result = matches[0];
      +  325   +
               }
      +  326  6
               return result;
       327   -
               }
      -  328  48
               return result;
      +
           }
      +  328   +
       
       329   -
           }
      +
           /**
       330   -
       
      -  331   -
           /**
      -  332  
            * Reads the manifest entries from the provided file.
      -  333   +  331  
            *
      -  334   +  332  
            * @param manifest the manifest
      -  335   +  333  
            * @return the manifest entries
      -  336   +  334  
            */
      -  337   +  335  
           private static InternetHeaders getManifestProperties(File manifest) {
      -  338  48
               final InternetHeaders result = new InternetHeaders();
      -  339  48
               if (null == manifest) {
      -  340  0
                   LOGGER.debug("Manifest file not found.");
      -  341   +  336  6
               final InternetHeaders result = new InternetHeaders();
      +  337  6
               if (null == manifest) {
      +  338  0
                   LOGGER.debug("Manifest file not found.");
      +  339  
               } else {
      -  342   +  340  
                   try {
      -  343  48
                       result.load(new AutoCloseInputStream(new BufferedInputStream(
      -  344   +  341  6
                       result.load(new AutoCloseInputStream(new BufferedInputStream(
      +  342  
                               new FileInputStream(manifest))));
      -  345  0
                   } catch (MessagingException e) {
      +  343  0
                   } catch (MessagingException e) {
      +  344  0
                       LOGGER.warn(e.getMessage(), e);
      +  345  0
                   } catch (FileNotFoundException e) {
       346  0
                       LOGGER.warn(e.getMessage(), e);
      -  347  0
                   } catch (FileNotFoundException e) {
      -  348  0
                       LOGGER.warn(e.getMessage(), e);
      -  349  48
                   }
      +  347  6
                   }
      +  348   +
               }
      +  349  6
               return result;
       350   -
               }
      -  351  48
               return result;
      +
           }
      +  351   +
       
       352   -
           }
      -  353   -
       
      -  354  
           /**
      -  355   -
            * Retrieves the next temporary destingation directory for extracting an archive.
      -  356   +  353   +
            * Retrieves the next temporary destination directory for extracting an archive.
      +  354  
            *
      -  357   +  355  
            * @return a directory
      -  358   +  356  
            * @throws AnalysisException thrown if unable to create temporary directory
      -  359   +  357  
            */
      -  360   +  358  
           private File getNextTempDirectory() throws AnalysisException {
      -  361   +  359  
               File directory;
      -  362   +  360  
       
      -  363   +  361  
               // getting an exception for some directories not being able to be
      -  364   +  362  
               // created; might be because the directory already exists?
      -  365   +  363  
               do {
      -  366  24
                   dirCount += 1;
      -  367  24
                   directory = new File(tempFileLocation, String.valueOf(dirCount));
      -  368  24
               } while (directory.exists());
      -  369  24
               if (!directory.mkdirs()) {
      -  370  0
                   throw new AnalysisException(String.format(
      -  371   +  364  3
                   dirCount += 1;
      +  365  3
                   directory = new File(tempFileLocation, String.valueOf(dirCount));
      +  366  3
               } while (directory.exists());
      +  367  3
               if (!directory.mkdirs()) {
      +  368  0
                   throw new AnalysisException(String.format(
      +  369  
                           "Unable to create temp directory '%s'.",
      -  372   +  370  
                           directory.getAbsolutePath()));
      -  373   +  371  
               }
      -  374  24
               return directory;
      -  375   +  372  3
               return directory;
      +  373  
           }
      -  376   +  374  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.PythonPackageAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.PythonPackageAnalyzer.html index a7f18469e..5f13f857e 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.PythonPackageAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.PythonPackageAnalyzer.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      PythonPackageAnalyzer
      90%
      63/70
      77%
      14/18
      2.091
      PythonPackageAnalyzer
      92%
      61/66
      77%
      14/18
      2
       
      @@ -78,531 +78,507 @@  30  
       import org.owasp.dependencycheck.utils.UrlStringUtils;
       31   -
       import org.slf4j.Logger;
      +
       
       32   -
       import org.slf4j.LoggerFactory;
      -  33   -
       
      -  34  
       import java.io.File;
      -  35   +  33  
       import java.io.FileFilter;
      -  36   +  34  
       import java.io.IOException;
      -  37   -
       import java.net.MalformedURLException;
      -  38   +  35  
       import java.util.ArrayList;
      -  39   +  36  
       import java.util.List;
      -  40   +  37  
       import java.util.regex.Matcher;
      -  41   +  38  
       import java.util.regex.Pattern;
      -  42   +  39  
       
      -  43   +  40  
       /**
      -  44   +  41  
        * Used to analyze a Python package, and collect information that can be used to determine the associated CPE.
      -  45   +  42  
        *
      -  46   +  43  
        * @author Dale Visser <dvisser@ida.org>
      -  47   +  44  
        */
      -  48  48
       public class PythonPackageAnalyzer extends AbstractFileTypeAnalyzer {
      -  49   +  45  7
       public class PythonPackageAnalyzer extends AbstractFileTypeAnalyzer {
      +  46  
       
      -  50   +  47  
           /**
      -  51   +  48  
            * Used when compiling file scanning regex patterns.
      -  52   +  49  
            */
      -  53   +  50  
           private static final int REGEX_OPTIONS = Pattern.DOTALL
      -  54   +  51  
                   | Pattern.CASE_INSENSITIVE;
      -  55   +  52  
       
      -  56   +  53  
           /**
      -  57   -
            * The logger.
      -  58   -
            */
      -  59  8
           private static final Logger LOGGER = LoggerFactory
      -  60   -
                   .getLogger(PythonPackageAnalyzer.class);
      -  61   -
       
      -  62   -
           /**
      -  63   +  54  
            * Filename extensions for files to be analyzed.
      -  64   +  55  
            */
      -  65   +  56  
           private static final String EXTENSIONS = "py";
      -  66   +  57  
       
      -  67   +  58  
           /**
      -  68   +  59  
            * Pattern for matching the module docstring in a source file.
      -  69   +  60  
            */
      -  70  8
           private static final Pattern MODULE_DOCSTRING = Pattern.compile(
      -  71   +  61  1
           private static final Pattern MODULE_DOCSTRING = Pattern.compile(
      +  62  
                   "^(['\\\"]{3})(.*?)\\1", REGEX_OPTIONS);
      -  72   +  63  
       
      -  73   +  64  
           /**
      -  74   +  65  
            * Matches assignments to version variables in Python source code.
      -  75   +  66  
            */
      -  76  8
           private static final Pattern VERSION_PATTERN = Pattern.compile(
      -  77   +  67  1
           private static final Pattern VERSION_PATTERN = Pattern.compile(
      +  68  
                   "\\b(__)?version(__)? *= *(['\"]+)(\\d+\\.\\d+.*?)\\3",
      -  78   +  69  
                   REGEX_OPTIONS);
      -  79   +  70  
       
      -  80   +  71  
           /**
      -  81   +  72  
            * Matches assignments to title variables in Python source code.
      -  82   +  73  
            */
      -  83  8
           private static final Pattern TITLE_PATTERN = compileAssignPattern("title");
      -  84   +  74  1
           private static final Pattern TITLE_PATTERN = compileAssignPattern("title");
      +  75  
       
      -  85   +  76  
           /**
      -  86   +  77  
            * Matches assignments to summary variables in Python source code.
      -  87   +  78  
            */
      -  88  8
           private static final Pattern SUMMARY_PATTERN = compileAssignPattern("summary");
      -  89   +  79  1
           private static final Pattern SUMMARY_PATTERN = compileAssignPattern("summary");
      +  80  
       
      -  90   +  81  
           /**
      -  91   +  82  
            * Matches assignments to URL/URL variables in Python source code.
      -  92   +  83  
            */
      -  93  8
           private static final Pattern URI_PATTERN = compileAssignPattern("ur[il]");
      -  94   +  84  1
           private static final Pattern URI_PATTERN = compileAssignPattern("ur[il]");
      +  85  
       
      -  95   +  86  
           /**
      -  96   +  87  
            * Matches assignments to home page variables in Python source code.
      -  97   +  88  
            */
      -  98  8
           private static final Pattern HOMEPAGE_PATTERN = compileAssignPattern("home_?page");
      -  99   +  89  1
           private static final Pattern HOMEPAGE_PATTERN = compileAssignPattern("home_?page");
      +  90  
       
      -  100   +  91  
           /**
      -  101   +  92  
            * Matches assignments to author variables in Python source code.
      -  102   +  93  
            */
      -  103  8
           private static final Pattern AUTHOR_PATTERN = compileAssignPattern("author");
      -  104   +  94  1
           private static final Pattern AUTHOR_PATTERN = compileAssignPattern("author");
      +  95  
       
      -  105   +  96  
           /**
      -  106   +  97  
            * Filter that detects files named "__init__.py".
      -  107   +  98  
            */
      -  108  8
           private static final FileFilter INIT_PY_FILTER = new NameFileFilter("__init__.py");
      -  109   +  99  1
           private static final FileFilter INIT_PY_FILTER = new NameFileFilter("__init__.py");
      +  100  
       
      -  110   +  101  
           /**
      -  111   +  102  
            * The file filter for python files.
      -  112   +  103  
            */
      -  113  8
           private static final FileFilter PY_FILTER = new SuffixFileFilter(".py");
      -  114   +  104  1
           private static final FileFilter PY_FILTER = new SuffixFileFilter(".py");
      +  105  
       
      -  115   +  106  
           /**
      -  116   +  107  
            * Returns the name of the Python Package Analyzer.
      -  117   +  108  
            *
      -  118   +  109  
            * @return the name of the analyzer
      -  119   +  110  
            */
      -  120   +  111  
           @Override
      -  121   +  112  
           public String getName() {
      -  122  40
               return "Python Package Analyzer";
      -  123   +  113  5
               return "Python Package Analyzer";
      +  114  
           }
      -  124   +  115  
       
      -  125   +  116  
           /**
      -  126   +  117  
            * Tell that we are used for information collection.
      -  127   +  118  
            *
      -  128   +  119  
            * @return INFORMATION_COLLECTION
      -  129   +  120  
            */
      -  130   +  121  
           @Override
      -  131   +  122  
           public AnalysisPhase getAnalysisPhase() {
      -  132  16
               return AnalysisPhase.INFORMATION_COLLECTION;
      -  133   +  123  3
               return AnalysisPhase.INFORMATION_COLLECTION;
      +  124  
           }
      -  134   +  125  
       
      -  135   +  126  
           /**
      -  136   +  127  
            * The file filter used to determine which files this analyzer supports.
      -  137   +  128  
            */
      -  138  8
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build();
      -  139   +  129  1
           private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build();
      +  130  
       
      -  140   +  131  
           /**
      -  141   +  132  
            * Returns the FileFilter
      -  142   +  133  
            *
      -  143   +  134  
            * @return the FileFilter
      -  144   +  135  
            */
      -  145   +  136  
           @Override
      -  146   +  137  
           protected FileFilter getFileFilter() {
      -  147  6832
               return FILTER;
      -  148   +  138  854
               return FILTER;
      +  139  
           }
      -  149   +  140  
       
      -  150   +  141  
           /**
      -  151   +  142  
            * No-op initializer implementation.
      -  152   +  143  
            *
      -  153   +  144  
            * @throws Exception never thrown
      -  154   +  145  
            */
      -  155   +  146  
           @Override
      -  156   +  147  
           protected void initializeFileTypeAnalyzer() throws Exception {
      -  157   +  148  
               // Nothing to do here.
      -  158  24
           }
      -  159   +  149  3
           }
      +  150  
       
      -  160   +  151  
           /**
      -  161   +  152  
            * Utility function to create a regex pattern matcher.
      -  162   +  153  
            *
      -  163   +  154  
            * @param name the value to use when constructing the assignment pattern
      -  164   +  155  
            * @return the compiled Pattern
      -  165   +  156  
            */
      -  166   +  157  
           private static Pattern compileAssignPattern(String name) {
      -  167  40
               return Pattern.compile(
      -  168   +  158  5
               return Pattern.compile(
      +  159  
                       String.format("\\b(__)?%s(__)?\\b *= *(['\"]+)(.*?)\\3", name),
      -  169   +  160  
                       REGEX_OPTIONS);
      -  170   +  161  
           }
      -  171   +  162  
       
      -  172   +  163  
           /**
      -  173   +  164  
            * Analyzes python packages and adds evidence to the dependency.
      -  174   +  165  
            *
      -  175   +  166  
            * @param dependency the dependency being analyzed
      -  176   -
            * @param engine the engine being used to perform the scan
      -  177   +  167   +
            * @param engine     the engine being used to perform the scan
      +  168  
            * @throws AnalysisException thrown if there is an unrecoverable error analyzing the dependency
      -  178   +  169  
            */
      -  179   +  170  
           @Override
      -  180   +  171  
           protected void analyzeFileType(Dependency dependency, Engine engine)
      +  172   +
                   throws AnalysisException {
      +  173  1
               final File file = dependency.getActualFile();
      +  174  1
               final File parent = file.getParentFile();
      +  175  1
               final String parentName = parent.getName();
      +  176  1
               boolean found = false;
      +  177  1
               if (INIT_PY_FILTER.accept(file)) {
      +  178  4
                   for (final File sourceFile : parent.listFiles(PY_FILTER)) {
      +  179  3
                       found |= analyzeFileContents(dependency, sourceFile);
      +  180   +
                   }
       181   -
                   throws AnalysisException {
      -  182  8
               final File file = dependency.getActualFile();
      -  183  8
               final File parent = file.getParentFile();
      -  184  8
               final String parentName = parent.getName();
      -  185  8
               boolean found = false;
      -  186  8
               if (INIT_PY_FILTER.accept(file)) {
      -  187  32
                   for (final File sourcefile : parent.listFiles(PY_FILTER)) {
      -  188  24
                       found |= analyzeFileContents(dependency, sourcefile);
      -  189   -
                   }
      -  190  
               }
      -  191  8
               if (found) {
      -  192  8
                   dependency.setDisplayFileName(parentName + "/__init__.py");
      -  193  8
                   dependency.getProductEvidence().addEvidence(file.getName(),
      -  194   +  182  1
               if (found) {
      +  183  1
                   dependency.setDisplayFileName(parentName + "/__init__.py");
      +  184  1
                   dependency.getProductEvidence().addEvidence(file.getName(),
      +  185  
                           "PackageName", parentName, Confidence.MEDIUM);
      -  195   +  186  
               } else {
      -  196   +  187  
                   // copy, alter and set in case some other thread is iterating over
      -  197  0
                   final List<Dependency> deps = new ArrayList<Dependency>(
      -  198   +  188  0
                   final List<Dependency> dependencies = new ArrayList<Dependency>(
      +  189  
                           engine.getDependencies());
      -  199  0
                   deps.remove(dependency);
      -  200  0
                   engine.setDependencies(deps);
      -  201   +  190  0
                   dependencies.remove(dependency);
      +  191  0
                   engine.setDependencies(dependencies);
      +  192  
               }
      -  202  8
           }
      -  203   +  193  1
           }
      +  194  
       
      -  204   +  195  
           /**
      -  205   +  196  
            * This should gather information from leading docstrings, file comments, and assignments to __version__, __title__,
      -  206   +  197  
            * __summary__, __uri__, __url__, __home*page__, __author__, and their all caps equivalents.
      -  207   +  198  
            *
      -  208   +  199  
            * @param dependency the dependency being analyzed
      -  209   -
            * @param file the file name to analyze
      -  210   +  200   +
            * @param file       the file name to analyze
      +  201  
            * @return whether evidence was found
      -  211   +  202  
            * @throws AnalysisException thrown if there is an unrecoverable error
      -  212   +  203  
            */
      -  213   +  204  
           private boolean analyzeFileContents(Dependency dependency, File file)
      -  214   +  205  
                   throws AnalysisException {
      -  215   +  206  
               String contents;
      -  216   +  207  
               try {
      -  217  24
                   contents = FileUtils.readFileToString(file).trim();
      -  218  0
               } catch (IOException e) {
      -  219  0
                   throw new AnalysisException(
      -  220   +  208  3
                   contents = FileUtils.readFileToString(file).trim();
      +  209  0
               } catch (IOException e) {
      +  210  0
                   throw new AnalysisException(
      +  211  
                           "Problem occurred while reading dependency file.", e);
      -  221  24
               }
      -  222  24
               boolean found = false;
      -  223  24
               if (!contents.isEmpty()) {
      -  224  24
                   final String source = file.getName();
      -  225  24
                   found = gatherEvidence(VERSION_PATTERN, contents, source,
      -  226   +  212  3
               }
      +  213  3
               boolean found = false;
      +  214  3
               if (!contents.isEmpty()) {
      +  215  3
                   final String source = file.getName();
      +  216  3
                   found = gatherEvidence(VERSION_PATTERN, contents, source,
      +  217  
                           dependency.getVersionEvidence(), "SourceVersion",
      -  227   +  218  
                           Confidence.MEDIUM);
      -  228  24
                   found |= addSummaryInfo(dependency, SUMMARY_PATTERN, 4, contents,
      -  229   +  219  3
                   found |= addSummaryInfo(dependency, SUMMARY_PATTERN, 4, contents,
      +  220  
                           source, "summary");
      -  230  24
                   if (INIT_PY_FILTER.accept(file)) {
      -  231  8
                       found |= addSummaryInfo(dependency, MODULE_DOCSTRING, 2,
      -  232   +  221  3
                   if (INIT_PY_FILTER.accept(file)) {
      +  222  1
                       found |= addSummaryInfo(dependency, MODULE_DOCSTRING, 2,
      +  223  
                               contents, source, "docstring");
      -  233   +  224  
                   }
      -  234  24
                   found |= gatherEvidence(TITLE_PATTERN, contents, source,
      -  235   +  225  3
                   found |= gatherEvidence(TITLE_PATTERN, contents, source,
      +  226  
                           dependency.getProductEvidence(), "SourceTitle",
      -  236   +  227  
                           Confidence.LOW);
      -  237  24
                   final EvidenceCollection vendorEvidence = dependency
      -  238   +  228  3
                   final EvidenceCollection vendorEvidence = dependency
      +  229  
                           .getVendorEvidence();
      -  239  24
                   found |= gatherEvidence(AUTHOR_PATTERN, contents, source,
      -  240   +  230  3
                   found |= gatherEvidence(AUTHOR_PATTERN, contents, source,
      +  231  
                           vendorEvidence, "SourceAuthor", Confidence.MEDIUM);
      +  232  3
                   found |= gatherHomePageEvidence(URI_PATTERN, vendorEvidence,
      +  233   +
                           source, "URL", contents);
      +  234  3
                   found |= gatherHomePageEvidence(HOMEPAGE_PATTERN,
      +  235   +
                           vendorEvidence, source, "HomePage", contents);
      +  236   +
               }
      +  237  3
               return found;
      +  238   +
           }
      +  239   +
       
      +  240   +
           /**
       241   -
                   try {
      -  242  24
                       found |= gatherHomePageEvidence(URI_PATTERN, vendorEvidence,
      -  243   -
                               source, "URL", contents);
      -  244  24
                       found |= gatherHomePageEvidence(HOMEPAGE_PATTERN,
      -  245   -
                               vendorEvidence, source, "HomePage", contents);
      -  246  0
                   } catch (MalformedURLException e) {
      -  247  0
                       LOGGER.warn(e.getMessage());
      -  248  24
                   }
      -  249   -
               }
      -  250  24
               return found;
      -  251   -
           }
      -  252   -
       
      -  253   -
           /**
      -  254  
            * Adds summary information to the dependency
      -  255   +  242  
            *
      -  256   +  243  
            * @param dependency the dependency being analyzed
      -  257   -
            * @param pattern the pattern used to perform analysis
      -  258   -
            * @param group the group from the pattern that indicates the data to use
      -  259   -
            * @param contents the data being analyzed
      -  260   -
            * @param source the source name to use when recording the evidence
      -  261   -
            * @param key the key name to use when recording the evidence
      -  262   +  244   +
            * @param pattern    the pattern used to perform analysis
      +  245   +
            * @param group      the group from the pattern that indicates the data to use
      +  246   +
            * @param contents   the data being analyzed
      +  247   +
            * @param source     the source name to use when recording the evidence
      +  248   +
            * @param key        the key name to use when recording the evidence
      +  249  
            * @return true if evidence was collected; otherwise false
      -  263   +  250  
            */
      -  264   +  251  
           private boolean addSummaryInfo(Dependency dependency, Pattern pattern,
      -  265   -
                   int group, String contents, String source, String key) {
      -  266  32
               final Matcher matcher = pattern.matcher(contents);
      -  267  32
               final boolean found = matcher.find();
      -  268  32
               if (found) {
      -  269  8
                   JarAnalyzer.addDescription(dependency, matcher.group(group),
      -  270   +  252   +
                                          int group, String contents, String source, String key) {
      +  253  4
               final Matcher matcher = pattern.matcher(contents);
      +  254  4
               final boolean found = matcher.find();
      +  255  4
               if (found) {
      +  256  1
                   JarAnalyzer.addDescription(dependency, matcher.group(group),
      +  257  
                           source, key);
      -  271   +  258  
               }
      -  272  32
               return found;
      -  273   +  259  4
               return found;
      +  260  
           }
      -  274   +  261  
       
      -  275   +  262  
           /**
      -  276   +  263  
            * Collects evidence from the home page URL.
      -  277   +  264  
            *
      -  278   -
            * @param pattern the pattern to match
      -  279   +  265   +
            * @param pattern  the pattern to match
      +  266  
            * @param evidence the evidence collection to add the evidence to
      -  280   -
            * @param source the source of the evidence
      -  281   -
            * @param name the name of the evidence
      -  282   +  267   +
            * @param source   the source of the evidence
      +  268   +
            * @param name     the name of the evidence
      +  269  
            * @param contents the home page URL
      -  283   +  270  
            * @return true if evidence was collected; otherwise false
      -  284   -
            * @throws MalformedURLException thrown if the URL is malformed
      -  285   +  271  
            */
      -  286   +  272  
           private boolean gatherHomePageEvidence(Pattern pattern,
      -  287   -
                   EvidenceCollection evidence, String source, String name,
      -  288   -
                   String contents) throws MalformedURLException {
      -  289  48
               final Matcher matcher = pattern.matcher(contents);
      -  290  48
               boolean found = false;
      -  291  48
               if (matcher.find()) {
      -  292  8
                   final String url = matcher.group(4);
      -  293  8
                   if (UrlStringUtils.isUrl(url)) {
      -  294  8
                       found = true;
      -  295  8
                       evidence.addEvidence(source, name, url, Confidence.MEDIUM);
      -  296   +  273   +
                                                  EvidenceCollection evidence, String source, String name,
      +  274   +
                                                  String contents) {
      +  275  6
               final Matcher matcher = pattern.matcher(contents);
      +  276  6
               boolean found = false;
      +  277  6
               if (matcher.find()) {
      +  278  1
                   final String url = matcher.group(4);
      +  279  1
                   if (UrlStringUtils.isUrl(url)) {
      +  280  1
                       found = true;
      +  281  1
                       evidence.addEvidence(source, name, url, Confidence.MEDIUM);
      +  282  
                   }
      -  297   +  283  
               }
      -  298  48
               return found;
      -  299   +  284  6
               return found;
      +  285  
           }
      -  300   +  286  
       
      -  301   +  287  
           /**
      -  302   -
            * Gather evidence from a Python source file usin the given string assignment regex pattern.
      -  303   +  288   +
            * Gather evidence from a Python source file using the given string assignment regex pattern.
      +  289  
            *
      -  304   -
            * @param pattern to scan contents with
      -  305   -
            * @param contents of Python source file
      -  306   -
            * @param source for storing evidence
      -  307   -
            * @param evidence to store evidence in
      -  308   -
            * @param name of evidence
      -  309   +  290   +
            * @param pattern    to scan contents with
      +  291   +
            * @param contents   of Python source file
      +  292   +
            * @param source     for storing evidence
      +  293   +
            * @param evidence   to store evidence in
      +  294   +
            * @param name       of evidence
      +  295  
            * @param confidence in evidence
      -  310   +  296  
            * @return whether evidence was found
      -  311   +  297  
            */
      -  312   +  298  
           private boolean gatherEvidence(Pattern pattern, String contents,
      -  313   -
                   String source, EvidenceCollection evidence, String name,
      -  314   -
                   Confidence confidence) {
      -  315  72
               final Matcher matcher = pattern.matcher(contents);
      -  316  72
               final boolean found = matcher.find();
      -  317  72
               if (found) {
      -  318  24
                   evidence.addEvidence(source, name, matcher.group(4), confidence);
      -  319   +  299   +
                                          String source, EvidenceCollection evidence, String name,
      +  300   +
                                          Confidence confidence) {
      +  301  9
               final Matcher matcher = pattern.matcher(contents);
      +  302  9
               final boolean found = matcher.find();
      +  303  9
               if (found) {
      +  304  3
                   evidence.addEvidence(source, name, matcher.group(4), confidence);
      +  305  
               }
      -  320  72
               return found;
      -  321   +  306  9
               return found;
      +  307  
           }
      -  322   +  308  
       
      -  323   +  309  
           @Override
      -  324   +  310  
           protected String getAnalyzerEnabledSettingKey() {
      -  325  48
               return Settings.KEYS.ANALYZER_PYTHON_PACKAGE_ENABLED;
      -  326   +  311  7
               return Settings.KEYS.ANALYZER_PYTHON_PACKAGE_ENABLED;
      +  312  
           }
      -  327   +  313  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.RubyGemspecAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.RubyGemspecAnalyzer.html new file mode 100644 index 000000000..2a34fc329 --- /dev/null +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.RubyGemspecAnalyzer.html @@ -0,0 +1,302 @@ + + + + +Coverage Report + + + + +
      Coverage Report - org.owasp.dependencycheck.analyzer.RubyGemspecAnalyzer
      +
       
      + + + + +
      Classes in this File Line Coverage Branch Coverage Complexity
      RubyGemspecAnalyzer
      92%
      39/42
      60%
      6/10
      1.875
      +
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       1  
       /*
       2  
        * This file is part of dependency-check-core.
       3  
        *
       4  
        * Licensed under the Apache License, Version 2.0 (the "License");
       5  
        * you may not use this file except in compliance with the License.
       6  
        * You may obtain a copy of the License at
       7  
        *
       8  
        *     http://www.apache.org/licenses/LICENSE-2.0
       9  
        *
       10  
        * Unless required by applicable law or agreed to in writing, software
       11  
        * distributed under the License is distributed on an "AS IS" BASIS,
       12  
        * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       13  
        * See the License for the specific language governing permissions and
       14  
        * limitations under the License.
       15  
        *
       16  
        * Copyright (c) 2015 Institute for Defense Analyses. All Rights Reserved.
       17  
        */
       18  
       package org.owasp.dependencycheck.analyzer;
       19  
       
       20  
       import org.apache.commons.io.FileUtils;
       21  
       import org.owasp.dependencycheck.Engine;
       22  
       import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
       23  
       import org.owasp.dependencycheck.dependency.Confidence;
       24  
       import org.owasp.dependencycheck.dependency.Dependency;
       25  
       import org.owasp.dependencycheck.dependency.EvidenceCollection;
       26  
       import org.owasp.dependencycheck.utils.FileFilterBuilder;
       27  
       import org.owasp.dependencycheck.utils.Settings;
       28  
       
       29  
       import java.io.FileFilter;
       30  
       import java.io.IOException;
       31  
       import java.util.regex.Matcher;
       32  
       import java.util.regex.Pattern;
       33  
       
       34  
       /**
       35  
        * Used to analyze Ruby Gem specifications and collect information that can be used to determine the associated CPE.
       36  
        * Regular expressions are used to parse the well-defined Ruby syntax that forms the specification.
       37  
        *
       38  
        * @author Dale Visser <dvisser@ida.org>
       39  
        */
       40  7
       public class RubyGemspecAnalyzer extends AbstractFileTypeAnalyzer {
       41  
       
       42  
           /**
       43  
            * The name of the analyzer.
       44  
            */
       45  
           private static final String ANALYZER_NAME = "Ruby Gemspec Analyzer";
       46  
       
       47  
           /**
       48  
            * The phase that this analyzer is intended to run in.
       49  
            */
       50  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
       51  
       
       52  1
           private static final FileFilter FILTER =
       53  
                   FileFilterBuilder.newInstance().addExtensions("gemspec").addFilenames("Rakefile").build();
       54  
       
       55  
           private static final String EMAIL = "email";
       56  
           private static final String GEMSPEC = "gemspec";
       57  
       
       58  
           /**
       59  
            * @return a filter that accepts files named Rakefile or matching the glob pattern, *.gemspec
       60  
            */
       61  
           @Override
       62  
           protected FileFilter getFileFilter() {
       63  855
               return FILTER;
       64  
           }
       65  
       
       66  
           @Override
       67  
           protected void initializeFileTypeAnalyzer() throws Exception {
       68  
               // NO-OP
       69  3
           }
       70  
       
       71  
           /**
       72  
            * Returns the name of the analyzer.
       73  
            *
       74  
            * @return the name of the analyzer.
       75  
            */
       76  
           @Override
       77  
           public String getName() {
       78  5
               return ANALYZER_NAME;
       79  
           }
       80  
       
       81  
           /**
       82  
            * Returns the phase that the analyzer is intended to run in.
       83  
            *
       84  
            * @return the phase that the analyzer is intended to run in.
       85  
            */
       86  
           @Override
       87  
           public AnalysisPhase getAnalysisPhase() {
       88  3
               return ANALYSIS_PHASE;
       89  
           }
       90  
       
       91  
           /**
       92  
            * Returns the key used in the properties file to reference the analyzer's enabled property.
       93  
            *
       94  
            * @return the analyzer's enabled property setting key
       95  
            */
       96  
           @Override
       97  
           protected String getAnalyzerEnabledSettingKey() {
       98  7
               return Settings.KEYS.ANALYZER_RUBY_GEMSPEC_ENABLED;
       99  
           }
       100  
       
       101  
           /**
       102  
            * The capture group #1 is the block variable.
       103  
            */
       104  1
           private static final Pattern GEMSPEC_BLOCK_INIT =
       105  
                   Pattern.compile("Gem::Specification\\.new\\s+?do\\s+?\\|(.+?)\\|");
       106  
       
       107  
           @Override
       108  
           protected void analyzeFileType(Dependency dependency, Engine engine)
       109  
                   throws AnalysisException {
       110  
               String contents;
       111  
               try {
       112  1
                   contents = FileUtils.readFileToString(dependency.getActualFile());
       113  0
               } catch (IOException e) {
       114  0
                   throw new AnalysisException(
       115  
                           "Problem occurred while reading dependency file.", e);
       116  1
               }
       117  1
               final Matcher matcher = GEMSPEC_BLOCK_INIT.matcher(contents);
       118  1
               if (matcher.find()) {
       119  1
                   contents = contents.substring(matcher.end());
       120  1
                   final String blockVariable = matcher.group(1);
       121  1
                   final EvidenceCollection vendor = dependency.getVendorEvidence();
       122  1
                   addStringEvidence(vendor, contents, blockVariable, "author", Confidence.HIGHEST);
       123  1
                   addListEvidence(vendor, contents, blockVariable, "authors", Confidence.HIGHEST);
       124  1
                   final String email = addStringEvidence(vendor, contents, blockVariable, EMAIL, Confidence.MEDIUM);
       125  1
                   if (email.isEmpty()) {
       126  0
                       addListEvidence(vendor, contents, blockVariable, EMAIL, Confidence.MEDIUM);
       127  
                   }
       128  1
                   addStringEvidence(vendor, contents, blockVariable, "homepage", Confidence.MEDIUM);
       129  1
                   final EvidenceCollection product = dependency.getProductEvidence();
       130  1
                   final String name = addStringEvidence(product, contents, blockVariable, "name", Confidence.HIGHEST);
       131  1
                   if (!name.isEmpty()) {
       132  1
                       vendor.addEvidence(GEMSPEC, "name_project", name + "_project", Confidence.LOW);
       133  
                   }
       134  1
                   addStringEvidence(product, contents, blockVariable, "summary", Confidence.LOW);
       135  1
                   addStringEvidence(dependency.getVersionEvidence(), contents, blockVariable, "version", Confidence.HIGHEST);
       136  
               }
       137  1
           }
       138  
       
       139  
           private void addListEvidence(EvidenceCollection evidences, String contents,
       140  
                                        String blockVariable, String field, Confidence confidence) {
       141  1
               final Matcher matcher = Pattern.compile(
       142  
                       String.format("\\s+?%s\\.%s\\s*?=\\s*?\\[(.*?)\\]", blockVariable, field)).matcher(contents);
       143  1
               if (matcher.find()) {
       144  1
                   final String value = matcher.group(1).replaceAll("['\"]", " ").trim();
       145  1
                   evidences.addEvidence(GEMSPEC, field, value, confidence);
       146  
               }
       147  1
           }
       148  
       
       149  
           private String addStringEvidence(EvidenceCollection evidences, String contents,
       150  
                                            String blockVariable, String field, Confidence confidence) {
       151  6
               final Matcher matcher = Pattern.compile(
       152  
                       String.format("\\s+?%s\\.%s\\s*?=\\s*?(['\"])(.*?)\\1", blockVariable, field)).matcher(contents);
       153  6
               String value = "";
       154  6
               if (matcher.find()) {
       155  5
                   value = matcher.group(2);
       156  5
                   evidences.addEvidence(GEMSPEC, field, value, confidence);
       157  
               }
       158  6
               return value;
       159  
           }
       160  
       }
      + + + + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.VulnerabilitySuppressionAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.VulnerabilitySuppressionAnalyzer.html index 59678a44c..ee1b5c24d 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.VulnerabilitySuppressionAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.VulnerabilitySuppressionAnalyzer.html @@ -77,7 +77,7 @@
        * @author Jeremy Long
       30  
        */
      -  31  24
       public class VulnerabilitySuppressionAnalyzer extends AbstractSuppressionAnalyzer {
      +  31  4
       public class VulnerabilitySuppressionAnalyzer extends AbstractSuppressionAnalyzer {
       32  
       
       33   @@ -96,7 +96,7 @@
            * The phase that this analyzer is intended to run in.
       40  
            */
      -  41  8
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.POST_FINDING_ANALYSIS;
      +  41  1
           private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.POST_FINDING_ANALYSIS;
       42  
       
       43   @@ -113,7 +113,7 @@
           @Override
       49  
           public String getName() {
      -  50  32
               return ANALYZER_NAME;
      +  50  4
               return ANALYZER_NAME;
       51  
           }
       52   @@ -132,7 +132,7 @@
           @Override
       59  
           public AnalysisPhase getAnalysisPhase() {
      -  60  16
               return ANALYSIS_PHASE;
      +  60  3
               return ANALYSIS_PHASE;
       61  
           }
       62   @@ -145,20 +145,20 @@
           public void analyze(final Dependency dependency, final Engine engine) throws AnalysisException {
       66  
       
      -  67  16
               if (getRules() == null || getRules().size() <= 0) {
      +  67  2
               if (getRules() == null || getRules().size() <= 0) {
       68  0
                   return;
       69  
               }
       70  
       
      -  71  16
               for (final SuppressionRule rule : getRules()) {
      -  72  304
                   rule.process(dependency);
      -  73  304
               }
      -  74  16
           }
      +  71  2
               for (final SuppressionRule rule : getRules()) {
      +  72  40
                   rule.process(dependency);
      +  73  40
               }
      +  74  2
           }
       75  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.exception.AnalysisException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.exception.AnalysisException.html index cc3a71387..55229fbf0 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.exception.AnalysisException.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.exception.AnalysisException.html @@ -103,8 +103,8 @@
            */
       44  
           public AnalysisException(String msg) {
      -  45  8
               super(msg);
      -  46  8
           }
      +  45  1
               super(msg);
      +  46  1
           }
       47  
       
       48   @@ -143,6 +143,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.exception.ArchiveExtractionException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.exception.ArchiveExtractionException.html index 760af0743..f27ea4c38 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.exception.ArchiveExtractionException.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.analyzer.exception.ArchiveExtractionException.html @@ -143,6 +143,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.central.CentralSearch.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.central.CentralSearch.html index 154382bc6..0d2445237 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.central.CentralSearch.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.central.CentralSearch.html @@ -133,7 +133,7 @@
            * Used for logging.
       58  
            */
      -  59  8
           private static final Logger LOGGER = LoggerFactory.getLogger(CentralSearch.class);
      +  59  1
           private static final Logger LOGGER = LoggerFactory.getLogger(CentralSearch.class);
       60  
       
       61   @@ -148,18 +148,18 @@
            * end in /select)
       66  
            */
      -  67  40
           public CentralSearch(URL rootURL) {
      -  68  40
               this.rootURL = rootURL;
      -  69  40
               if (null != Settings.getString(Settings.KEYS.PROXY_SERVER)) {
      +  67  5
           public CentralSearch(URL rootURL) {
      +  68  5
               this.rootURL = rootURL;
      +  69  5
               if (null != Settings.getString(Settings.KEYS.PROXY_SERVER)) {
       70  0
                   useProxy = true;
       71  0
                   LOGGER.debug("Using proxy");
       72  
               } else {
      -  73  40
                   useProxy = false;
      -  74  40
                   LOGGER.debug("Not using proxy");
      +  73  5
                   useProxy = false;
      +  74  5
                   LOGGER.debug("Not using proxy");
       75  
               }
      -  76  40
           }
      +  76  5
           }
       77  
       
       78   @@ -180,16 +180,16 @@
            */
       86  
           public List<MavenArtifact> searchSha1(String sha1) throws IOException {
      -  87  40
               if (null == sha1 || !sha1.matches("^[0-9A-Fa-f]{40}$")) {
      -  88  16
                   throw new IllegalArgumentException("Invalid SHA1 format");
      +  87  5
               if (null == sha1 || !sha1.matches("^[0-9A-Fa-f]{40}$")) {
      +  88  2
                   throw new IllegalArgumentException("Invalid SHA1 format");
       89  
               }
       90  
       
      -  91  24
               final URL url = new URL(rootURL + String.format("?q=1:\"%s\"&wt=xml", sha1));
      +  91  3
               final URL url = new URL(rootURL + String.format("?q=1:\"%s\"&wt=xml", sha1));
       92  
       
      -  93  24
               LOGGER.debug("Searching Central url {}", url.toString());
      +  93  3
               LOGGER.debug("Searching Central url {}", url.toString());
       94  
       
       95   @@ -200,62 +200,62 @@
               // 2) Otherwise, don't use the proxy (either the proxy isn't configured,
       98  
               // or proxy is specifically set to false)
      -  99  24
               final HttpURLConnection conn = URLConnectionFactory.createHttpURLConnection(url, useProxy);
      +  99  3
               final HttpURLConnection conn = URLConnectionFactory.createHttpURLConnection(url, useProxy);
       100  
       
      -  101  24
               conn.setDoOutput(true);
      +  101  3
               conn.setDoOutput(true);
       102  
       
       103  
               // JSON would be more elegant, but there's not currently a dependency
       104  
               // on JSON, so don't want to add one just for this
      -  105  24
               conn.addRequestProperty("Accept", "application/xml");
      -  106  24
               conn.connect();
      +  105  3
               conn.addRequestProperty("Accept", "application/xml");
      +  106  3
               conn.connect();
       107  
       
      -  108  9
               if (conn.getResponseCode() == 200) {
      -  109  9
                   boolean missing = false;
      +  108  3
               if (conn.getResponseCode() == 200) {
      +  109  3
                   boolean missing = false;
       110  
                   try {
      -  111  9
                       final DocumentBuilder builder = DocumentBuilderFactory
      +  111  3
                       final DocumentBuilder builder = DocumentBuilderFactory
       112  
                               .newInstance().newDocumentBuilder();
      -  113  9
                       final Document doc = builder.parse(conn.getInputStream());
      -  114  9
                       final XPath xpath = XPathFactory.newInstance().newXPath();
      -  115  9
                       final String numFound = xpath.evaluate("/response/result/@numFound", doc);
      -  116  9
                       if ("0".equals(numFound)) {
      -  117  3
                           missing = true;
      +  113  3
                       final Document doc = builder.parse(conn.getInputStream());
      +  114  3
                       final XPath xpath = XPathFactory.newInstance().newXPath();
      +  115  3
                       final String numFound = xpath.evaluate("/response/result/@numFound", doc);
      +  116  3
                       if ("0".equals(numFound)) {
      +  117  1
                           missing = true;
       118  
                       } else {
      -  119  6
                           final ArrayList<MavenArtifact> result = new ArrayList<MavenArtifact>();
      -  120  6
                           final NodeList docs = (NodeList) xpath.evaluate("/response/result/doc", doc, XPathConstants.NODESET);
      -  121  15
                           for (int i = 0; i < docs.getLength(); i++) {
      -  122  9
                               final String g = xpath.evaluate("./str[@name='g']", docs.item(i));
      -  123  9
                               LOGGER.trace("GroupId: {}", g);
      -  124  9
                               final String a = xpath.evaluate("./str[@name='a']", docs.item(i));
      -  125  9
                               LOGGER.trace("ArtifactId: {}", a);
      -  126  9
                               final String v = xpath.evaluate("./str[@name='v']", docs.item(i));
      -  127  9
                               NodeList atts = (NodeList) xpath.evaluate("./arr[@name='ec']/str", docs.item(i), XPathConstants.NODESET);
      -  128  9
                               boolean pomAvailable = false;
      -  129  9
                               boolean jarAvailable = false;
      -  130  42
                               for (int x = 0; x < atts.getLength(); x++) {
      -  131  33
                                   final String tmp = xpath.evaluate(".", atts.item(x));
      -  132  33
                                   if (".pom".equals(tmp)) {
      -  133  9
                                       pomAvailable = true;
      -  134  24
                                   } else if (".jar".equals(tmp)) {
      -  135  9
                                       jarAvailable = true;
      +  119  2
                           final List<MavenArtifact> result = new ArrayList<MavenArtifact>();
      +  120  2
                           final NodeList docs = (NodeList) xpath.evaluate("/response/result/doc", doc, XPathConstants.NODESET);
      +  121  5
                           for (int i = 0; i < docs.getLength(); i++) {
      +  122  3
                               final String g = xpath.evaluate("./str[@name='g']", docs.item(i));
      +  123  3
                               LOGGER.trace("GroupId: {}", g);
      +  124  3
                               final String a = xpath.evaluate("./str[@name='a']", docs.item(i));
      +  125  3
                               LOGGER.trace("ArtifactId: {}", a);
      +  126  3
                               final String v = xpath.evaluate("./str[@name='v']", docs.item(i));
      +  127  3
                               NodeList atts = (NodeList) xpath.evaluate("./arr[@name='ec']/str", docs.item(i), XPathConstants.NODESET);
      +  128  3
                               boolean pomAvailable = false;
      +  129  3
                               boolean jarAvailable = false;
      +  130  14
                               for (int x = 0; x < atts.getLength(); x++) {
      +  131  11
                                   final String tmp = xpath.evaluate(".", atts.item(x));
      +  132  11
                                   if (".pom".equals(tmp)) {
      +  133  3
                                       pomAvailable = true;
      +  134  8
                                   } else if (".jar".equals(tmp)) {
      +  135  3
                                       jarAvailable = true;
       136  
                                   }
       137  
                               }
       138  
       
      -  139  9
                               atts = (NodeList) xpath.evaluate("./arr[@name='tags']/str", docs.item(i), XPathConstants.NODESET);
      -  140  9
                               boolean useHTTPS = false;
      -  141  63
                               for (int x = 0; x < atts.getLength(); x++) {
      -  142  54
                                   final String tmp = xpath.evaluate(".", atts.item(x));
      -  143  54
                                   if ("https".equals(tmp)) {
      +  139  3
                               atts = (NodeList) xpath.evaluate("./arr[@name='tags']/str", docs.item(i), XPathConstants.NODESET);
      +  140  3
                               boolean useHTTPS = false;
      +  141  21
                               for (int x = 0; x < atts.getLength(); x++) {
      +  142  18
                                   final String tmp = xpath.evaluate(".", atts.item(x));
      +  143  18
                                   if ("https".equals(tmp)) {
       144  0
                                       useHTTPS = true;
       145  
                                   }
      @@ -263,13 +263,13 @@
                               }
       147  
       
      -  148  9
                               LOGGER.trace("Version: {}", v);
      -  149  9
                               result.add(new MavenArtifact(g, a, v, jarAvailable, pomAvailable, useHTTPS));
      +  148  3
                               LOGGER.trace("Version: {}", v);
      +  149  3
                               result.add(new MavenArtifact(g, a, v, jarAvailable, pomAvailable, useHTTPS));
       150  
                           }
       151  
       
      -  152  6
                           return result;
      +  152  2
                           return result;
       153  
                       }
       154  0
                   } catch (Throwable e) {
      @@ -278,11 +278,11 @@  156  
                       // from well
       157  0
                       throw new IOException(e.getMessage(), e);
      -  158  3
                   }
      +  158  1
                   }
       159  
       
      -  160  3
                   if (missing) {
      -  161  3
                       throw new FileNotFoundException("Artifact not found in Central");
      +  160  1
                   if (missing) {
      +  161  1
                       throw new FileNotFoundException("Artifact not found in Central");
       162  
                   }
       163  0
               } else {
      @@ -301,6 +301,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.composer.ComposerDependency.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.composer.ComposerDependency.html new file mode 100644 index 000000000..8b5cc18c4 --- /dev/null +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.composer.ComposerDependency.html @@ -0,0 +1,222 @@ + + + + +Coverage Report + + + + +
      Coverage Report - org.owasp.dependencycheck.data.composer.ComposerDependency
      +
       
      + + + + +
      Classes in this File Line Coverage Branch Coverage Complexity
      ComposerDependency
      72%
      16/22
      35%
      10/28
      3.333
      +
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       1  
       /*
       2  
        * This file is part of dependency-check-core.
       3  
        *
       4  
        * Licensed under the Apache License, Version 2.0 (the "License");
       5  
        * you may not use this file except in compliance with the License.
       6  
        * You may obtain a copy of the License at
       7  
        *
       8  
        *     http://www.apache.org/licenses/LICENSE-2.0
       9  
        *
       10  
        * Unless required by applicable law or agreed to in writing, software
       11  
        * distributed under the License is distributed on an "AS IS" BASIS,
       12  
        * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       13  
        * See the License for the specific language governing permissions and
       14  
        * limitations under the License.
       15  
        *
       16  
        * Copyright (c) 2015 The OWASP Foundation. All Rights Reserved.
       17  
        */
       18  
       package org.owasp.dependencycheck.data.composer;
       19  
       
       20  
       /**
       21  
        * Reperesents a dependency (GAV, right now) from a Composer dependency.
       22  
        *
       23  
        * @author colezlaw
       24  
        */
       25  
       public final class ComposerDependency {
       26  
       
       27  
           /**
       28  
            * The group
       29  
            */
       30  
           private final String group;
       31  
       
       32  
           /**
       33  
            * The project
       34  
            */
       35  
           private final String project;
       36  
       
       37  
           /**
       38  
            * The version
       39  
            */
       40  
           private final String version;
       41  
       
       42  
           /**
       43  
            * Create a ComposerDependency from group, project, and version.
       44  
            *
       45  
            * @param group the group
       46  
            * @param project the project
       47  
            * @param version the version
       48  
            */
       49  61
           public ComposerDependency(String group, String project, String version) {
       50  61
               this.group = group;
       51  61
               this.project = project;
       52  61
               this.version = version;
       53  61
           }
       54  
       
       55  
           /**
       56  
            * Get the group.
       57  
            *
       58  
            * @return the group
       59  
            */
       60  
           public String getGroup() {
       61  90
               return group;
       62  
           }
       63  
       
       64  
           /**
       65  
            * Get the project.
       66  
            *
       67  
            * @return the project
       68  
            */
       69  
           public String getProject() {
       70  90
               return project;
       71  
           }
       72  
       
       73  
           /**
       74  
            * Get the version.
       75  
            *
       76  
            * @return the version
       77  
            */
       78  
           public String getVersion() {
       79  30
               return version;
       80  
           }
       81  
       
       82  
           @Override
       83  
           public boolean equals(Object o) {
       84  28
               if (this == o) {
       85  0
                   return true;
       86  
               }
       87  28
               if (!(o instanceof ComposerDependency)) {
       88  0
                   return false;
       89  
               }
       90  
       
       91  28
               final ComposerDependency that = (ComposerDependency) o;
       92  
       
       93  28
               if (group != null ? !group.equals(that.group) : that.group != null) {
       94  17
                   return false;
       95  
               }
       96  11
               if (project != null ? !project.equals(that.project) : that.project != null) {
       97  10
                   return false;
       98  
               }
       99  1
               return !(version != null ? !version.equals(that.version) : that.version != null);
       100  
       
       101  
           }
       102  
       
       103  
           @Override
       104  
           public int hashCode() {
       105  0
               int result = group != null ? group.hashCode() : 0;
       106  0
               result = 31 * result + (project != null ? project.hashCode() : 0);
       107  0
               result = 31 * result + (version != null ? version.hashCode() : 0);
       108  0
               return result;
       109  
           }
       110  
       }
      + + + + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.composer.ComposerException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.composer.ComposerException.html new file mode 100644 index 000000000..c0c01042a --- /dev/null +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.composer.ComposerException.html @@ -0,0 +1,122 @@ + + + + +Coverage Report + + + + +
      Coverage Report - org.owasp.dependencycheck.data.composer.ComposerException
      +
       
      + + + + +
      Classes in this File Line Coverage Branch Coverage Complexity
      ComposerException
      33%
      2/6
      N/A
      1
      +
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       1  
       /*
       2  
        * This file is part of dependency-check-core.
       3  
        *
       4  
        * Licensed under the Apache License, Version 2.0 (the "License");
       5  
        * you may not use this file except in compliance with the License.
       6  
        * You may obtain a copy of the License at
       7  
        *
       8  
        *     http://www.apache.org/licenses/LICENSE-2.0
       9  
        *
       10  
        * Unless required by applicable law or agreed to in writing, software
       11  
        * distributed under the License is distributed on an "AS IS" BASIS,
       12  
        * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       13  
        * See the License for the specific language governing permissions and
       14  
        * limitations under the License.
       15  
        *
       16  
        * Copyright (c) 2015 The OWASP Foundation. All Rights Reserved.
       17  
        */
       18  
       package org.owasp.dependencycheck.data.composer;
       19  
       
       20  
       /**
       21  
        * Represents an exception when handling a composer.json or composer.lock file. Generally used to wrap a downstream exception.
       22  
        *
       23  
        * @author colezlaw
       24  
        */
       25  
       public class ComposerException extends RuntimeException {
       26  
       
       27  
           /**
       28  
            * Creates a ComposerException with default message.
       29  
            */
       30  
           public ComposerException() {
       31  0
               super();
       32  0
           }
       33  
       
       34  
           /**
       35  
            * Creates a ComposerException with the specified message.
       36  
            *
       37  
            * @param message the exception message
       38  
            */
       39  
           public ComposerException(String message) {
       40  0
               super(message);
       41  0
           }
       42  
       
       43  
           /**
       44  
            * Creates a Composer exception with the specified message and cause.
       45  
            *
       46  
            * @param message the message
       47  
            * @param cause the underlying cause
       48  
            */
       49  
           public ComposerException(String message, Throwable cause) {
       50  3
               super(message, cause);
       51  3
           }
       52  
       }
      + + + + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.composer.ComposerLockParser.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.composer.ComposerLockParser.html new file mode 100644 index 000000000..06a4c105b --- /dev/null +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.composer.ComposerLockParser.html @@ -0,0 +1,233 @@ + + + + +Coverage Report + + + + +
      Coverage Report - org.owasp.dependencycheck.data.composer.ComposerLockParser
      +
       
      + + + + +
      Classes in this File Line Coverage Branch Coverage Complexity
      ComposerLockParser
      89%
      35/39
      64%
      9/14
      6
      +
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
       1  
       /*
       2  
        * This file is part of dependency-check-core.
       3  
        *
       4  
        * Licensed under the Apache License, Version 2.0 (the "License");
       5  
        * you may not use this file except in compliance with the License.
       6  
        * You may obtain a copy of the License at
       7  
        *
       8  
        *     http://www.apache.org/licenses/LICENSE-2.0
       9  
        *
       10  
        * Unless required by applicable law or agreed to in writing, software
       11  
        * distributed under the License is distributed on an "AS IS" BASIS,
       12  
        * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       13  
        * See the License for the specific language governing permissions and
       14  
        * limitations under the License.
       15  
        *
       16  
        * Copyright (c) 2015 The OWASP Foundation. All Rights Reserved.
       17  
        */
       18  
       package org.owasp.dependencycheck.data.composer;
       19  
       
       20  
       import org.slf4j.Logger;
       21  
       import org.slf4j.LoggerFactory;
       22  
       
       23  
       import javax.json.Json;
       24  
       import javax.json.JsonArray;
       25  
       import javax.json.JsonException;
       26  
       import javax.json.JsonObject;
       27  
       import javax.json.JsonReader;
       28  
       import javax.json.stream.JsonParsingException;
       29  
       import java.io.InputStream;
       30  
       import java.util.ArrayList;
       31  
       import java.util.List;
       32  
       
       33  
       /**
       34  
        * Parses a Composer.lock file from an input stream. In a separate class so it can hopefully be injected.
       35  
        *
       36  
        * @author colezlaw
       37  
        */
       38  
       public class ComposerLockParser {
       39  
       
       40  
           /**
       41  
            * The JsonReader for parsing JSON
       42  
            */
       43  
           private final JsonReader jsonReader;
       44  
       
       45  
           /**
       46  
            * The input stream we'll read
       47  
            */
       48  
           private final InputStream inputStream; // NOPMD - it gets set in the constructor, read later
       49  
       
       50  
           /**
       51  
            * The List of ComposerDependencies found
       52  
            */
       53  
           private final List<ComposerDependency> composerDependencies;
       54  
       
       55  
           /**
       56  
            * The LOGGER
       57  
            */
       58  1
           private static final Logger LOGGER = LoggerFactory.getLogger(ComposerLockParser.class);
       59  
       
       60  
           /**
       61  
            * Createas a ComposerLockParser from a JsonReader and an InputStream.
       62  
            *
       63  
            * @param inputStream the InputStream to parse
       64  
            */
       65  5
           public ComposerLockParser(InputStream inputStream) {
       66  5
               LOGGER.info("Creating a ComposerLockParser");
       67  5
               this.inputStream = inputStream;
       68  5
               this.jsonReader = Json.createReader(inputStream);
       69  5
               this.composerDependencies = new ArrayList<ComposerDependency>();
       70  5
           }
       71  
       
       72  
           /**
       73  
            * Process the input stream to create the list of dependencies.
       74  
            */
       75  
           public void process() {
       76  5
               LOGGER.info("Beginning Composer lock processing");
       77  
               try {
       78  5
                   final JsonObject composer = jsonReader.readObject();
       79  3
                   if (composer.containsKey("packages")) {
       80  3
                       LOGGER.debug("Found packages");
       81  3
                       final JsonArray packages = composer.getJsonArray("packages");
       82  2
                       for (JsonObject pkg : packages.getValuesAs(JsonObject.class)) {
       83  60
                           if (pkg.containsKey("name")) {
       84  60
                               final String groupName = pkg.getString("name");
       85  60
                               if (groupName.indexOf('/') >= 0 && groupName.indexOf('/') <= groupName.length() - 1) {
       86  60
                                   if (pkg.containsKey("version")) {
       87  60
                                       final String group = groupName.substring(0, groupName.indexOf('/'));
       88  60
                                       final String project = groupName.substring(groupName.indexOf('/') + 1);
       89  60
                                       String version = pkg.getString("version");
       90  
                                       // Some version nubmers begin with v - which doesn't end up matching CPE's
       91  60
                                       if (version.startsWith("v")) {
       92  42
                                           version = version.substring(1);
       93  
                                       }
       94  60
                                       LOGGER.debug("Got package {}/{}/{}", group, project, version);
       95  60
                                       composerDependencies.add(new ComposerDependency(group, project, version));
       96  60
                                   } else {
       97  0
                                       LOGGER.debug("Group/package {} does not have a version", groupName);
       98  
                                   }
       99  
                               } else {
       100  0
                                   LOGGER.debug("Got a dependency with no name");
       101  
                               }
       102  
                           }
       103  60
                       }
       104  
                   }
       105  1
               } catch (JsonParsingException jsonpe) {
       106  1
                   throw new ComposerException("Error parsing stream", jsonpe);
       107  1
               } catch (JsonException jsone) {
       108  1
                   throw new ComposerException("Error reading stream", jsone);
       109  0
               } catch (IllegalStateException ise) {
       110  0
                   throw new ComposerException("Illegal state in composer stream", ise);
       111  1
               } catch (ClassCastException cce) {
       112  1
                   throw new ComposerException("Not exactly composer lock", cce);
       113  2
               }
       114  2
           }
       115  
       
       116  
           /**
       117  
            * Gets the list of dependencies.
       118  
            *
       119  
            * @return the list of dependencies
       120  
            */
       121  
           public List<ComposerDependency> getDependencies() {
       122  3
               return composerDependencies;
       123  
           }
       124  
       }
      + + + + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.CpeMemoryIndex.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.CpeMemoryIndex.html index 210222dc3..86908ca08 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.CpeMemoryIndex.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.CpeMemoryIndex.html @@ -137,14 +137,14 @@
            * The logger.
       60  
            */
      -  61  8
           private static final Logger LOGGER = LoggerFactory.getLogger(CpeMemoryIndex.class);
      +  61  1
           private static final Logger LOGGER = LoggerFactory.getLogger(CpeMemoryIndex.class);
       62  
           /**
       63  
            * singleton instance.
       64  
            */
      -  65  8
           private static final CpeMemoryIndex INSTANCE = new CpeMemoryIndex();
      +  65  1
           private static final CpeMemoryIndex INSTANCE = new CpeMemoryIndex();
       66  
       
       67   @@ -153,8 +153,8 @@
            * private constructor for singleton.
       69  
            */
      -  70  8
           private CpeMemoryIndex() {
      -  71  8
           }
      +  70  1
           private CpeMemoryIndex() {
      +  71  1
           }
       72  
       
       73   @@ -169,7 +169,7 @@
            */
       78  
           public static CpeMemoryIndex getInstance() {
      -  79  8
               return INSTANCE;
      +  79  1
               return INSTANCE;
       80  
           }
       81   @@ -244,31 +244,31 @@
            */
       116  
           public void open(CveDB cve) throws IndexException {
      -  117  8
               synchronized (INSTANCE) {
      -  118  8
                   if (!openState) {
      -  119  8
                       index = new RAMDirectory();
      -  120  8
                       buildIndex(cve);
      +  117  1
               synchronized (INSTANCE) {
      +  118  1
                   if (!openState) {
      +  119  1
                       index = new RAMDirectory();
      +  120  1
                       buildIndex(cve);
       121  
                       try {
      -  122  8
                           indexReader = DirectoryReader.open(index);
      +  122  1
                           indexReader = DirectoryReader.open(index);
       123  0
                       } catch (IOException ex) {
       124  0
                           throw new IndexException(ex);
      -  125  8
                       }
      -  126  8
                       indexSearcher = new IndexSearcher(indexReader);
      -  127  8
                       searchingAnalyzer = createSearchingAnalyzer();
      -  128  8
                       queryParser = new QueryParser(LuceneUtils.CURRENT_VERSION, Fields.DOCUMENT_KEY, searchingAnalyzer);
      -  129  8
                       openState = true;
      +  125  1
                       }
      +  126  1
                       indexSearcher = new IndexSearcher(indexReader);
      +  127  1
                       searchingAnalyzer = createSearchingAnalyzer();
      +  128  1
                       queryParser = new QueryParser(LuceneUtils.CURRENT_VERSION, Fields.DOCUMENT_KEY, searchingAnalyzer);
      +  129  1
                       openState = true;
       130  
                   }
      -  131  8
               }
      -  132  8
           }
      +  131  1
               }
      +  132  1
           }
       133  
           /**
       134  
            * A flag indicating whether or not the index is open.
       135  
            */
      -  136  8
           private boolean openState = false;
      +  136  1
           private boolean openState = false;
       137  
       
       138   @@ -302,9 +302,9 @@
           @SuppressWarnings("unchecked")
       153  
           private Analyzer createIndexingAnalyzer() {
      -  154  8
               final Map fieldAnalyzers = new HashMap();
      -  155  8
               fieldAnalyzers.put(Fields.DOCUMENT_KEY, new KeywordAnalyzer());
      -  156  8
               return new PerFieldAnalyzerWrapper(new FieldAnalyzer(LuceneUtils.CURRENT_VERSION), fieldAnalyzers);
      +  154  1
               final Map<String, Analyzer> fieldAnalyzers = new HashMap<String, Analyzer>();
      +  155  1
               fieldAnalyzers.put(Fields.DOCUMENT_KEY, new KeywordAnalyzer());
      +  156  1
               return new PerFieldAnalyzerWrapper(new FieldAnalyzer(LuceneUtils.CURRENT_VERSION), fieldAnalyzers);
       157  
           }
       158   @@ -323,15 +323,15 @@
           @SuppressWarnings("unchecked")
       165  
           private Analyzer createSearchingAnalyzer() {
      -  166  8
               final Map<String, Analyzer> fieldAnalyzers = new HashMap<String, Analyzer>();
      -  167  8
               fieldAnalyzers.put(Fields.DOCUMENT_KEY, new KeywordAnalyzer());
      -  168  8
               productSearchFieldAnalyzer = new SearchFieldAnalyzer(LuceneUtils.CURRENT_VERSION);
      -  169  8
               vendorSearchFieldAnalyzer = new SearchFieldAnalyzer(LuceneUtils.CURRENT_VERSION);
      -  170  8
               fieldAnalyzers.put(Fields.PRODUCT, productSearchFieldAnalyzer);
      -  171  8
               fieldAnalyzers.put(Fields.VENDOR, vendorSearchFieldAnalyzer);
      +  166  1
               final Map<String, Analyzer> fieldAnalyzers = new HashMap<String, Analyzer>();
      +  167  1
               fieldAnalyzers.put(Fields.DOCUMENT_KEY, new KeywordAnalyzer());
      +  168  1
               productSearchFieldAnalyzer = new SearchFieldAnalyzer(LuceneUtils.CURRENT_VERSION);
      +  169  1
               vendorSearchFieldAnalyzer = new SearchFieldAnalyzer(LuceneUtils.CURRENT_VERSION);
      +  170  1
               fieldAnalyzers.put(Fields.PRODUCT, productSearchFieldAnalyzer);
      +  171  1
               fieldAnalyzers.put(Fields.VENDOR, vendorSearchFieldAnalyzer);
       172  
       
      -  173  8
               return new PerFieldAnalyzerWrapper(new FieldAnalyzer(LuceneUtils.CURRENT_VERSION), fieldAnalyzers);
      +  173  1
               return new PerFieldAnalyzerWrapper(new FieldAnalyzer(LuceneUtils.CURRENT_VERSION), fieldAnalyzers);
       174  
           }
       175   @@ -356,13 +356,13 @@
            */
       185  
           public void saveEntry(String vendor, String product, IndexWriter indexWriter) throws CorruptIndexException, IOException {
      -  186  201178
               final Document doc = new Document();
      -  187  201178
               final Field v = new TextField(Fields.VENDOR, vendor, Field.Store.YES);
      -  188  201178
               final Field p = new TextField(Fields.PRODUCT, product, Field.Store.YES);
      -  189  201178
               doc.add(v);
      -  190  201178
               doc.add(p);
      -  191  201178
               indexWriter.addDocument(doc);
      -  192  201178
           }
      +  186  25290
               final Document doc = new Document();
      +  187  25290
               final Field v = new TextField(Fields.VENDOR, vendor, Field.Store.YES);
      +  188  25290
               final Field p = new TextField(Fields.PRODUCT, product, Field.Store.YES);
      +  189  25290
               doc.add(v);
      +  190  25290
               doc.add(p);
      +  191  25290
               indexWriter.addDocument(doc);
      +  192  25290
           }
       193  
       
       194   @@ -373,30 +373,30 @@
            */
       197  
           public void close() {
      -  198  8
               if (searchingAnalyzer != null) {
      -  199  8
                   searchingAnalyzer.close();
      -  200  8
                   searchingAnalyzer = null;
      +  198  1
               if (searchingAnalyzer != null) {
      +  199  1
                   searchingAnalyzer.close();
      +  200  1
                   searchingAnalyzer = null;
       201  
               }
      -  202  8
               if (indexReader != null) {
      +  202  1
               if (indexReader != null) {
       203  
                   try {
      -  204  8
                       indexReader.close();
      +  204  1
                       indexReader.close();
       205  0
                   } catch (IOException ex) {
       206  0
                       LOGGER.trace("", ex);
      -  207  8
                   }
      -  208  8
                   indexReader = null;
      +  207  1
                   }
      +  208  1
                   indexReader = null;
       209  
               }
      -  210  8
               queryParser = null;
      -  211  8
               indexSearcher = null;
      -  212  8
               if (index != null) {
      -  213  8
                   index.close();
      -  214  8
                   index = null;
      +  210  1
               queryParser = null;
      +  211  1
               indexSearcher = null;
      +  212  1
               if (index != null) {
      +  213  1
                   index.close();
      +  214  1
                   index = null;
       215  
               }
      -  216  8
               openState = false;
      -  217  8
           }
      +  216  1
               openState = false;
      +  217  1
           }
       218  
       
       219   @@ -413,53 +413,53 @@
            */
       225  
           private void buildIndex(CveDB cve) throws IndexException {
      -  226  8
               Analyzer analyzer = null;
      -  227  8
               IndexWriter indexWriter = null;
      +  226  1
               Analyzer analyzer = null;
      +  227  1
               IndexWriter indexWriter = null;
       228  
               try {
      -  229  8
                   analyzer = createIndexingAnalyzer();
      -  230  8
                   final IndexWriterConfig conf = new IndexWriterConfig(LuceneUtils.CURRENT_VERSION, analyzer);
      -  231  8
                   indexWriter = new IndexWriter(index, conf);
      +  229  1
                   analyzer = createIndexingAnalyzer();
      +  230  1
                   final IndexWriterConfig conf = new IndexWriterConfig(LuceneUtils.CURRENT_VERSION, analyzer);
      +  231  1
                   indexWriter = new IndexWriter(index, conf);
       232  
                   try {
      -  233  8
                       final Set<Pair<String, String>> data = cve.getVendorProductList();
      -  234  8
                       for (Pair<String, String> pair : data) {
      -  235  201178
                           saveEntry(pair.getLeft(), pair.getRight(), indexWriter);
      -  236  201178
                       }
      +  233  1
                       final Set<Pair<String, String>> data = cve.getVendorProductList();
      +  234  1
                       for (Pair<String, String> pair : data) {
      +  235  25290
                           saveEntry(pair.getLeft(), pair.getRight(), indexWriter);
      +  236  25290
                       }
       237  0
                   } catch (DatabaseException ex) {
       238  0
                       LOGGER.debug("", ex);
       239  0
                       throw new IndexException("Error reading CPE data", ex);
      -  240  8
                   }
      +  240  1
                   }
       241  0
               } catch (CorruptIndexException ex) {
       242  0
                   throw new IndexException("Unable to close an in-memory index", ex);
       243  0
               } catch (IOException ex) {
       244  0
                   throw new IndexException("Unable to close an in-memory index", ex);
       245  
               } finally {
      -  246  8
                   if (indexWriter != null) {
      +  246  1
                   if (indexWriter != null) {
       247  
                       try {
       248  
                           try {
      -  249  8
                               indexWriter.commit();
      +  249  1
                               indexWriter.commit();
       250  
                           } finally {
      -  251  8
                               indexWriter.close(true);
      -  252  8
                           }
      +  251  1
                               indexWriter.close(true);
      +  252  1
                           }
       253  0
                       } catch (CorruptIndexException ex) {
       254  0
                           throw new IndexException("Unable to close an in-memory index", ex);
       255  0
                       } catch (IOException ex) {
       256  0
                           throw new IndexException("Unable to close an in-memory index", ex);
      -  257  8
                       }
      -  258  8
                       if (analyzer != null) {
      -  259  8
                           analyzer.close();
      +  257  1
                       }
      +  258  1
                       if (analyzer != null) {
      +  259  1
                           analyzer.close();
       260  
                       }
       261  
                   }
       262  
               }
      -  263  8
           }
      +  263  1
           }
       264  
       
       265   @@ -501,12 +501,12 @@
            */
       286  
           public TopDocs search(String searchString, int maxQueryResults) throws ParseException, IOException {
      -  287  48
               if (searchString == null || searchString.trim().isEmpty()) {
      +  287  6
               if (searchString == null || searchString.trim().isEmpty()) {
       288  0
                   throw new ParseException("Query is null or empty");
       289  
               }
      -  290  48
               final Query query = queryParser.parse(searchString);
      -  291  48
               return indexSearcher.search(query, maxQueryResults);
      +  290  6
               final Query query = queryParser.parse(searchString);
      +  291  6
               return indexSearcher.search(query, maxQueryResults);
       292  
           }
       293   @@ -553,7 +553,7 @@
            */
       315  
           public Document getDocument(int documentId) throws IOException {
      -  316  344
               return indexSearcher.doc(documentId);
      +  316  43
               return indexSearcher.doc(documentId);
       317  
           }
       318   @@ -581,6 +581,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.Fields.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.Fields.html index 05852edb4..cf8b5ceaf 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.Fields.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.Fields.html @@ -107,6 +107,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.IndexEntry.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.IndexEntry.html index 9e5159a7e..7421450ea 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.IndexEntry.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.IndexEntry.html @@ -73,7 +73,7 @@
        * @author Jeremy Long
       28  
        */
      -  29  12192
       public class IndexEntry implements Serializable {
      +  29  1524
       public class IndexEntry implements Serializable {
       30  
       
       31   @@ -151,7 +151,7 @@
            */
       70  
           public String getVendor() {
      -  71  240
               return vendor;
      +  71  30
               return vendor;
       72  
           }
       73   @@ -168,8 +168,8 @@
            */
       79  
           public void setVendor(String vendor) {
      -  80  12184
               this.vendor = vendor;
      -  81  12184
           }
      +  80  1523
               this.vendor = vendor;
      +  81  1523
           }
       82  
           /**
       83   @@ -192,7 +192,7 @@
            */
       92  
           public String getProduct() {
      -  93  504
               return product;
      +  93  63
               return product;
       94  
           }
       95   @@ -209,8 +209,8 @@
            */
       101  
           public void setProduct(String product) {
      -  102  12184
               this.product = product;
      -  103  12184
           }
      +  102  1523
               this.product = product;
      +  103  1523
           }
       104  
           /**
       105   @@ -250,8 +250,8 @@
            */
       123  
           public void setSearchScore(float searchScore) {
      -  124  344
               this.searchScore = searchScore;
      -  125  344
           }
      +  124  43
               this.searchScore = searchScore;
      +  125  43
           }
       126  
       
       127   @@ -290,19 +290,19 @@
            */
       144  
           public void parseName(String cpeName) throws UnsupportedEncodingException {
      -  145  8
               if (cpeName != null && cpeName.length() > 7) {
      -  146  8
                   final String[] data = cpeName.substring(7).split(":");
      -  147  8
                   if (data.length >= 1) {
      -  148  8
                       vendor = URLDecoder.decode(data[0].replace("+", "%2B"), "UTF-8");
      -  149  8
                       if (data.length >= 2) {
      -  150  8
                           product = URLDecoder.decode(data[1].replace("+", "%2B"), "UTF-8");
      +  145  1
               if (cpeName != null && cpeName.length() > 7) {
      +  146  1
                   final String[] data = cpeName.substring(7).split(":");
      +  147  1
                   if (data.length >= 1) {
      +  148  1
                       vendor = URLDecoder.decode(data[0].replace("+", "%2B"), "UTF-8");
      +  149  1
                       if (data.length >= 2) {
      +  150  1
                           product = URLDecoder.decode(data[1].replace("+", "%2B"), "UTF-8");
       151  
                       }
       152  
                   }
       153  
               }
      -  154  8
           }
      +  154  1
           }
       155  
       
       156   @@ -320,21 +320,21 @@
           @Override
       164  
           public boolean equals(Object obj) {
      -  165  1224
               if (obj == null) {
      +  165  153
               if (obj == null) {
       166  0
                   return false;
       167  
               }
      -  168  1224
               if (getClass() != obj.getClass()) {
      +  168  153
               if (getClass() != obj.getClass()) {
       169  0
                   return false;
       170  
               }
      -  171  1224
               final IndexEntry other = (IndexEntry) obj;
      -  172  1224
               if ((this.vendor == null) ? (other.vendor != null) : !this.vendor.equals(other.vendor)) {
      -  173  1184
                   return false;
      +  171  153
               final IndexEntry other = (IndexEntry) obj;
      +  172  153
               if ((this.vendor == null) ? (other.vendor != null) : !this.vendor.equals(other.vendor)) {
      +  173  148
                   return false;
       174  
               }
      -  175  40
               if ((this.product == null) ? (other.product != null) : !this.product.equals(other.product)) {
      -  176  40
                   return false;
      +  175  5
               if ((this.product == null) ? (other.product != null) : !this.product.equals(other.product)) {
      +  176  5
                   return false;
       177  
               }
       178  0
               return true;
      @@ -363,6 +363,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.IndexException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.IndexException.html index 821fea1d6..22f9168a3 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.IndexException.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cpe.IndexException.html @@ -143,6 +143,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cwe.CweDB.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cwe.CweDB.html index b8d821a79..5853e2227 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cwe.CweDB.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cwe.CweDB.html @@ -70,120 +70,122 @@  26  
       import java.util.HashMap;
       27   -
       
      +
       import java.util.Map;
       28   -
       /**
      +
       
       29   -
        *
      +
       /**
       30   -
        * @author Jeremy Long
      +
        *
       31   -
        */
      +
        * @author Jeremy Long
       32   -
       public final class CweDB {
      +
        */
       33   -
       
      +
       public final class CweDB {
       34   -
           /**
      +
       
       35   -
            * The Logger.
      +
           /**
       36   +
            * The Logger.
      +  37  
            */
      -  37  8
           private static final Logger LOGGER = LoggerFactory.getLogger(CweDB.class);
      -  38   -
       
      +  38  1
           private static final Logger LOGGER = LoggerFactory.getLogger(CweDB.class);
       39   -
           /**
      +
       
       40   -
            * Empty private constructor as this is a utility class.
      +
           /**
       41   +
            * Empty private constructor as this is a utility class.
      +  42  
            */
      -  42  0
           private CweDB() {
      -  43   +  43  0
           private CweDB() {
      +  44  
               //empty
      -  44  0
           }
      -  45   -
           /**
      +  45  0
           }
       46   -
            * A HashMap of the CWE data.
      +
           /**
       47   +
            * A HashMap of the CWE data.
      +  48  
            */
      -  48  8
           private static final HashMap<String, String> CWE = loadData();
      -  49   -
       
      +  49  1
           private static final Map<String, String> CWE = loadData();
       50   -
           /**
      -  51   -
            * Loads a HashMap containing the CWE data from a resource found in the jar.
      -  52   -
            *
      -  53   -
            * @return a HashMap of CWE data
      -  54   -
            */
      -  55   -
           private static HashMap<String, String> loadData() {
      -  56  8
               ObjectInputStream oin = null;
      -  57   -
               try {
      -  58  8
                   final String filePath = "data/cwe.hashmap.serialized";
      -  59  8
                   final InputStream input = CweDB.class.getClassLoader().getResourceAsStream(filePath);
      -  60  8
                   oin = new ObjectInputStream(input);
      -  61   -
                   @SuppressWarnings("unchecked")
      -  62  8
                   final HashMap<String, String> ret = (HashMap<String, String>) oin.readObject();
      -  63  8
                   return ret;
      -  64  0
               } catch (ClassNotFoundException ex) {
      -  65  0
                   LOGGER.warn("Unable to load CWE data. This should not be an issue.");
      -  66  0
                   LOGGER.debug("", ex);
      -  67  0
               } catch (IOException ex) {
      -  68  0
                   LOGGER.warn("Unable to load CWE data due to an IO Error. This should not be an issue.");
      -  69  0
                   LOGGER.debug("", ex);
      -  70   -
               } finally {
      -  71  8
                   if (oin != null) {
      -  72   -
                       try {
      -  73  8
                           oin.close();
      -  74  0
                       } catch (IOException ex) {
      -  75  0
                           LOGGER.trace("", ex);
      -  76  16
                       }
      -  77   -
                   }
      -  78   -
               }
      -  79  0
               return null;
      -  80   -
           }
      -  81  
       
      -  82   +  51  
           /**
      -  83   -
            * <p>
      -  84   -
            * Returns the full CWE name from the CWE ID.</p>
      -  85   +  52   +
            * Loads a HashMap containing the CWE data from a resource found in the jar.
      +  53  
            *
      -  86   -
            * @param cweId the CWE ID
      -  87   -
            * @return the full name of the CWE
      -  88   +  54   +
            * @return a HashMap of CWE data
      +  55  
            */
      -  89   -
           public static String getCweName(String cweId) {
      -  90  72
               if (cweId != null) {
      -  91  72
                   return CWE.get(cweId);
      -  92   +  56   +
           private static Map<String, String> loadData() {
      +  57  1
               ObjectInputStream oin = null;
      +  58   +
               try {
      +  59  1
                   final String filePath = "data/cwe.hashmap.serialized";
      +  60  1
                   final InputStream input = CweDB.class.getClassLoader().getResourceAsStream(filePath);
      +  61  1
                   oin = new ObjectInputStream(input);
      +  62   +
                   @SuppressWarnings("unchecked")
      +  63  1
                   final Map<String, String> ret = (HashMap<String, String>) oin.readObject();
      +  64  1
                   return ret;
      +  65  0
               } catch (ClassNotFoundException ex) {
      +  66  0
                   LOGGER.warn("Unable to load CWE data. This should not be an issue.");
      +  67  0
                   LOGGER.debug("", ex);
      +  68  0
               } catch (IOException ex) {
      +  69  0
                   LOGGER.warn("Unable to load CWE data due to an IO Error. This should not be an issue.");
      +  70  0
                   LOGGER.debug("", ex);
      +  71   +
               } finally {
      +  72  1
                   if (oin != null) {
      +  73   +
                       try {
      +  74  1
                           oin.close();
      +  75  0
                       } catch (IOException ex) {
      +  76  0
                           LOGGER.trace("", ex);
      +  77  2
                       }
      +  78   +
                   }
      +  79  
               }
      -  93  0
               return null;
      -  94   +  80  0
               return null;
      +  81  
           }
      +  82   +
       
      +  83   +
           /**
      +  84   +
            * <p>
      +  85   +
            * Returns the full CWE name from the CWE ID.</p>
      +  86   +
            *
      +  87   +
            * @param cweId the CWE ID
      +  88   +
            * @return the full name of the CWE
      +  89   +
            */
      +  90   +
           public static String getCweName(String cweId) {
      +  91  9
               if (cweId != null) {
      +  92  9
                   return CWE.get(cweId);
      +  93   +
               }
      +  94  0
               return null;
       95   +
           }
      +  96  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cwe.CweHandler.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cwe.CweHandler.html index 3eb9208eb..5236350d9 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cwe.CweHandler.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.cwe.CweHandler.html @@ -121,6 +121,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.AbstractTokenizingFilter.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.AbstractTokenizingFilter.html index 6e91b2cf0..4f3f34ef4 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.AbstractTokenizingFilter.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.AbstractTokenizingFilter.html @@ -85,7 +85,7 @@
            * The char term attribute.
       34  
            */
      -  35  83
           private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
      +  35  11
           private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
       36  
       
       37   @@ -100,7 +100,7 @@
            */
       42  
           protected CharTermAttribute getTermAtt() {
      -  43  224495
               return termAtt;
      +  43  32273
               return termAtt;
       44  
           }
       45   @@ -125,7 +125,7 @@
            */
       55  
           protected LinkedList<String> getTokens() {
      -  56  224288
               return tokens;
      +  56  32245
               return tokens;
       57  
           }
       58   @@ -142,9 +142,9 @@
            */
       64  
           public AbstractTokenizingFilter(TokenStream stream) {
      -  65  83
               super(stream);
      -  66  83
               tokens = new LinkedList<String>();
      -  67  83
           }
      +  65  11
               super(stream);
      +  66  11
               tokens = new LinkedList<String>();
      +  67  11
           }
       68  
       
       69   @@ -159,20 +159,20 @@
            */
       74  
           protected boolean addTerm() {
      -  75  223708
               final boolean termAdded = !tokens.isEmpty();
      -  76  223691
               if (termAdded) {
      -  77  149115
                   final String term = tokens.pop();
      -  78  149045
                   clearAttributes();
      -  79  149103
                   termAtt.append(term);
      +  75  32163
               final boolean termAdded = !tokens.isEmpty();
      +  76  32162
               if (termAdded) {
      +  77  21597
                   final String term = tokens.pop();
      +  78  21571
                   clearAttributes();
      +  79  21585
                   termAtt.append(term);
       80  
               }
      -  81  223641
               return termAdded;
      +  81  32161
               return termAdded;
       82  
           }
       83  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.AlphaNumericTokenizer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.AlphaNumericTokenizer.html index 0e6b4ff83..e5a285055 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.AlphaNumericTokenizer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.AlphaNumericTokenizer.html @@ -91,8 +91,8 @@
            */
       37  
           public AlphaNumericTokenizer(Version matchVersion, Reader in) {
      -  38  56
               super(matchVersion, in);
      -  39  56
           }
      +  38  7
               super(matchVersion, in);
      +  39  7
           }
       40  
       
       41   @@ -131,13 +131,13 @@
           @Override
       59  
           protected boolean isTokenChar(int c) {
      -  60  4812152
               return Character.isLetter(c) || Character.isDigit(c);
      +  60  605810
               return Character.isLetter(c) || Character.isDigit(c);
       61  
           }
       62  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.DependencySimilarity.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.DependencySimilarity.html index 3a27ad301..f2f4b579c 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.DependencySimilarity.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.DependencySimilarity.html @@ -111,6 +111,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.FieldAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.FieldAnalyzer.html index d3a1ccbd2..acf2ad12f 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.FieldAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.FieldAnalyzer.html @@ -113,9 +113,9 @@
            * @param version the Lucene version
       48  
            */
      -  49  24
           public FieldAnalyzer(Version version) {
      -  50  24
               this.version = version;
      -  51  24
           }
      +  49  3
           public FieldAnalyzer(Version version) {
      +  50  3
               this.version = version;
      +  51  3
           }
       52  
       
       53   @@ -136,13 +136,13 @@
           @Override
       61  
           protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
      -  62  24
               final Tokenizer source = new AlphaNumericTokenizer(version, reader);
      +  62  3
               final Tokenizer source = new AlphaNumericTokenizer(version, reader);
       63  
       
      -  64  24
               TokenStream stream = source;
      +  64  3
               TokenStream stream = source;
       65  
       
      -  66  24
               stream = new WordDelimiterFilter(stream,
      +  66  3
               stream = new WordDelimiterFilter(stream,
       67  
                       WordDelimiterFilter.CATENATE_WORDS
       68   @@ -159,17 +159,17 @@
                       | WordDelimiterFilter.STEM_ENGLISH_POSSESSIVE, null);
       74  
       
      -  75  24
               stream = new LowerCaseFilter(version, stream);
      -  76  24
               stream = new StopFilter(version, stream, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
      +  75  3
               stream = new LowerCaseFilter(version, stream);
      +  76  3
               stream = new StopFilter(version, stream, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
       77  
       
      -  78  24
               return new TokenStreamComponents(source, stream);
      +  78  3
               return new TokenStreamComponents(source, stream);
       79  
           }
       80  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.LuceneUtils.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.LuceneUtils.html index b61eed8fa..f330278b0 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.LuceneUtils.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.LuceneUtils.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      LuceneUtils
      88%
      16/18
      90%
      9/10
      9
      LuceneUtils
      88%
      15/17
      90%
      9/10
      9
       
      @@ -85,7 +85,7 @@
            * base.
       34  
            */
      -  35  8
           public static final Version CURRENT_VERSION = Version.LUCENE_47;
      +  35  1
           public static final Version CURRENT_VERSION = Version.LUCENE_47;
       36  
       
       37   @@ -124,15 +124,15 @@
                   final CharSequence text) {
       55  
       
      -  56  1160
               if (text == null || buf == null) {
      -  57  8
                   return;
      +  56  145
               if (text == null || buf == null) {
      +  57  1
                   return;
       58  
               }
       59  
       
      -  60  10104
               for (int i = 0; i < text.length(); i++) {
      -  61  8952
                   final char c = text.charAt(i);
      -  62  8952
                   switch (c) {
      +  60  1263
               for (int i = 0; i < text.length(); i++) {
      +  61  1119
                   final char c = text.charAt(i);
      +  62  1119
                   switch (c) {
       63  
                       case '+':
       64   @@ -169,17 +169,17 @@
                       case ':':
       80  
                       case '\\': //it is supposed to fall through here
      -  81  464
                           buf.append('\\');
      +  81  58
                           buf.append('\\');
       82  
                       default:
      -  83  8952
                           buf.append(c);
      +  83  1119
                           buf.append(c);
       84  
                           break;
       85  
                   }
       86  
               }
      -  87  1152
           }
      +  87  144
           }
       88  
       
       89   @@ -196,29 +196,20 @@
            */
       95  
           public static String escapeLuceneQuery(final CharSequence text) {
      -  96   -
       
      -  97  1152
               if (text == null) {
      -  98  8
                   return null;
      -  99   +  96  144
               if (text == null) {
      +  97  1
                   return null;
      +  98  
               }
      -  100   -
       
      -  101  1144
               int size = text.length();
      -  102  1144
               size = size >> 1;
      -  103  1144
               final StringBuilder buf = new StringBuilder(size);
      -  104   -
       
      -  105  1144
               appendEscapedLuceneQuery(buf, text);
      -  106   -
       
      -  107  1144
               return buf.toString();
      -  108   +  99  143
               final int size = text.length() << 1;
      +  100  143
               final StringBuilder buf = new StringBuilder(size);
      +  101  143
               appendEscapedLuceneQuery(buf, text);
      +  102  143
               return buf.toString();
      +  103  
           }
      -  109   +  104  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.SearchFieldAnalyzer.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.SearchFieldAnalyzer.html index d12162a1c..56995df46 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.SearchFieldAnalyzer.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.SearchFieldAnalyzer.html @@ -117,9 +117,9 @@
            * @param version the Lucene version
       50  
            */
      -  51  32
           public SearchFieldAnalyzer(Version version) {
      -  52  32
               this.version = version;
      -  53  32
           }
      +  51  4
           public SearchFieldAnalyzer(Version version) {
      +  52  4
               this.version = version;
      +  53  4
           }
       54  
       
       55   @@ -140,13 +140,13 @@
           @Override
       63  
           protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
      -  64  32
               final Tokenizer source = new AlphaNumericTokenizer(version, reader);
      +  64  4
               final Tokenizer source = new AlphaNumericTokenizer(version, reader);
       65  
       
      -  66  32
               TokenStream stream = source;
      +  66  4
               TokenStream stream = source;
       67  
       
      -  68  32
               stream = new WordDelimiterFilter(stream,
      +  68  4
               stream = new WordDelimiterFilter(stream,
       69  
                       WordDelimiterFilter.GENERATE_WORD_PARTS
       70   @@ -161,14 +161,14 @@
                       | WordDelimiterFilter.STEM_ENGLISH_POSSESSIVE, null);
       75  
       
      -  76  32
               stream = new LowerCaseFilter(version, stream);
      -  77  32
               stream = new UrlTokenizingFilter(stream);
      -  78  32
               concatenatingFilter = new TokenPairConcatenatingFilter(stream);
      -  79  32
               stream = concatenatingFilter;
      -  80  32
               stream = new StopFilter(version, stream, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
      +  76  4
               stream = new LowerCaseFilter(version, stream);
      +  77  4
               stream = new UrlTokenizingFilter(stream);
      +  78  4
               concatenatingFilter = new TokenPairConcatenatingFilter(stream);
      +  79  4
               stream = concatenatingFilter;
      +  80  4
               stream = new StopFilter(version, stream, StopAnalyzer.ENGLISH_STOP_WORDS_SET);
       81  
       
      -  82  32
               return new TokenStreamComponents(source, stream);
      +  82  4
               return new TokenStreamComponents(source, stream);
       83  
           }
       84   @@ -187,15 +187,15 @@
            */
       91  
           public void clear() {
      -  92  16
               if (concatenatingFilter != null) {
      -  93  16
                   concatenatingFilter.clear();
      +  92  2
               if (concatenatingFilter != null) {
      +  93  2
                   concatenatingFilter.clear();
       94  
               }
      -  95  16
           }
      +  95  2
           }
       96  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.TokenPairConcatenatingFilter.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.TokenPairConcatenatingFilter.html index 30af2a422..51a57cbc5 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.TokenPairConcatenatingFilter.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.TokenPairConcatenatingFilter.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      TokenPairConcatenatingFilter
      100%
      26/26
      100%
      8/8
      2.2
      TokenPairConcatenatingFilter
      60%
      26/43
      22%
      8/36
      4.429
       
      @@ -93,7 +93,7 @@
            * The char term attribute.
       38  
            */
      -  39  48
           private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
      +  39  6
           private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
       40  
           /**
       41   @@ -124,7 +124,7 @@
            */
       54  
           protected String getPreviousWord() {
      -  55  16
               return previousWord;
      +  55  2
               return previousWord;
       56  
           }
       57   @@ -141,7 +141,7 @@
            */
       63  
           protected LinkedList<String> getWords() {
      -  64  8
               return words;
      +  64  1
               return words;
       65  
           }
       66   @@ -158,17 +158,17 @@
            */
       72  
           public TokenPairConcatenatingFilter(TokenStream stream) {
      -  73  48
               super(stream);
      -  74  48
               words = new LinkedList<String>();
      -  75  48
           }
      +  73  6
               super(stream);
      +  74  6
               words = new LinkedList<String>();
      +  75  6
           }
       76  
       
       77  
           /**
       78   -
            * Increments the underlying TokenStream and sets CharTermAttributes to construct an expanded set of tokens by
      +
            * Increments the underlying TokenStream and sets CharTermAttributes to construct an expanded set of tokens by concatenating
       79   -
            * concatenating tokens with the previous token.
      +
            * tokens with the previous token.
       80  
            *
       81   @@ -185,35 +185,35 @@
       
       87  
               //collect all the terms into the words collection
      -  88  6576
               while (input.incrementToken()) {
      -  89  1816
                   final String word = new String(termAtt.buffer(), 0, termAtt.length());
      -  90  1816
                   words.add(word);
      -  91  1816
               }
      +  88  822
               while (input.incrementToken()) {
      +  89  227
                   final String word = new String(termAtt.buffer(), 0, termAtt.length());
      +  90  227
                   words.add(word);
      +  91  227
               }
       92  
       
       93  
               //if we have a previousTerm - write it out as its own token concatenated
       94  
               // with the current word (if one is available).
      -  95  4760
               if (previousWord != null && !words.isEmpty()) {
      -  96  1752
                   final String word = words.getFirst();
      -  97  1752
                   clearAttributes();
      -  98  1752
                   termAtt.append(previousWord).append(word);
      -  99  1752
                   previousWord = null;
      -  100  1752
                   return true;
      +  95  595
               if (previousWord != null && !words.isEmpty()) {
      +  96  219
                   final String word = words.getFirst();
      +  97  219
                   clearAttributes();
      +  98  219
                   termAtt.append(previousWord).append(word);
      +  99  219
                   previousWord = null;
      +  100  219
                   return true;
       101  
               }
       102  
               //if we have words, write it out as a single token
      -  103  3008
               if (!words.isEmpty()) {
      -  104  1816
                   final String word = words.removeFirst();
      -  105  1816
                   clearAttributes();
      -  106  1816
                   termAtt.append(word);
      -  107  1816
                   previousWord = word;
      -  108  1816
                   return true;
      +  103  376
               if (!words.isEmpty()) {
      +  104  227
                   final String word = words.removeFirst();
      +  105  227
                   clearAttributes();
      +  106  227
                   termAtt.append(word);
      +  107  227
                   previousWord = word;
      +  108  227
                   return true;
       109  
               }
      -  110  1192
               return false;
      +  110  149
               return false;
       111  
           }
       112   @@ -223,24 +223,89 @@  114  
            * <p>
       115   -
            * Resets the Filter and clears any internal state data that may have been left-over from previous uses of the
      +
            * Resets the Filter and clears any internal state data that may have been left-over from previous uses of the Filter.</p>
       116   -
            * Filter.</p>
      -  117  
            * <p>
      -  118   +  117  
            * <b>If this Filter is re-used this method must be called between uses.</b></p>
      -  119   +  118  
            */
      -  120   +  119  
           public void clear() {
      -  121  24
               previousWord = null;
      -  122  24
               words.clear();
      -  123  24
           }
      +  120  3
               previousWord = null;
      +  121  3
               words.clear();
      +  122  3
           }
      +  123   +
       
       124   +
           /**
      +  125   +
            * Standard hash code implementation.
      +  126   +
            *
      +  127   +
            * @return the hash code
      +  128   +
            */
      +  129   +
           @Override
      +  130   +
           public int hashCode() {
      +  131  0
               int hash = 3;
      +  132  0
               hash = 31 * hash + (this.termAtt != null ? this.termAtt.hashCode() : 0);
      +  133  0
               hash = 31 * hash + (this.previousWord != null ? this.previousWord.hashCode() : 0);
      +  134  0
               hash = 31 * hash + (this.words != null ? this.words.hashCode() : 0);
      +  135  0
               return hash;
      +  136   +
           }
      +  137   +
       
      +  138   +
           /**
      +  139   +
            * Standard equals implementation.
      +  140   +
            *
      +  141   +
            * @param obj the object to compare
      +  142   +
            * @return true if the objects are equal; otherwise false.
      +  143   +
            */
      +  144   +
           @Override
      +  145   +
           public boolean equals(Object obj) {
      +  146  0
               if (obj == null) {
      +  147  0
                   return false;
      +  148   +
               }
      +  149  0
               if (getClass() != obj.getClass()) {
      +  150  0
                   return false;
      +  151   +
               }
      +  152  0
               final TokenPairConcatenatingFilter other = (TokenPairConcatenatingFilter) obj;
      +  153  0
               if (this.termAtt != other.termAtt && (this.termAtt == null || !this.termAtt.equals(other.termAtt))) {
      +  154  0
                   return false;
      +  155   +
               }
      +  156  0
               if ((this.previousWord == null) ? (other.previousWord != null) : !this.previousWord.equals(other.previousWord)) {
      +  157  0
                   return false;
      +  158   +
               }
      +  159  0
               if (this.words != other.words && (this.words == null || !this.words.equals(other.words))) {
      +  160  0
                   return false;
      +  161   +
               }
      +  162  0
               return true;
      +  163   +
           }
      +  164   +
       
      +  165  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.UrlTokenizingFilter.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.UrlTokenizingFilter.html index 533d71f37..326d063d4 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.UrlTokenizingFilter.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.lucene.UrlTokenizingFilter.html @@ -99,7 +99,7 @@
            * The logger.
       41  
            */
      -  42  8
           private static final Logger LOGGER = LoggerFactory.getLogger(UrlTokenizingFilter.class);
      +  42  1
           private static final Logger LOGGER = LoggerFactory.getLogger(UrlTokenizingFilter.class);
       43  
           /**
       44   @@ -112,8 +112,8 @@
            */
       48  
           public UrlTokenizingFilter(TokenStream stream) {
      -  49  83
               super(stream);
      -  50  83
           }
      +  49  11
               super(stream);
      +  50  11
           }
       51  
       
       52   @@ -134,22 +134,22 @@
           @Override
       60  
           public boolean incrementToken() throws IOException {
      -  61  223990
               final LinkedList<String> tokens = getTokens();
      -  62  224217
               final CharTermAttribute termAtt = getTermAtt();
      -  63  224401
               if (tokens.isEmpty() && input.incrementToken()) {
      -  64  149295
                   final String text = new String(termAtt.buffer(), 0, termAtt.length());
      -  65  149249
                   if (UrlStringUtils.containsUrl(text)) {
      -  66  48
                       final String[] parts = text.split("\\s");
      -  67  96
                       for (String part : parts) {
      -  68  48
                           if (UrlStringUtils.isUrl(part)) {
      +  61  32183
               final LinkedList<String> tokens = getTokens();
      +  62  32244
               final CharTermAttribute termAtt = getTermAtt();
      +  63  32266
               if (tokens.isEmpty() && input.incrementToken()) {
      +  64  21620
                   final String text = new String(termAtt.buffer(), 0, termAtt.length());
      +  65  21622
                   if (UrlStringUtils.containsUrl(text)) {
      +  66  6
                       final String[] parts = text.split("\\s");
      +  67  12
                       for (String part : parts) {
      +  68  6
                           if (UrlStringUtils.isUrl(part)) {
       69  
                               try {
      -  70  48
                                   final List<String> data = UrlStringUtils.extractImportantUrlData(part);
      -  71  48
                                   tokens.addAll(data);
      +  70  6
                                   final List<String> data = UrlStringUtils.extractImportantUrlData(part);
      +  71  6
                                   tokens.addAll(data);
       72  0
                               } catch (MalformedURLException ex) {
       73  0
                                   LOGGER.debug("error parsing {}", part, ex);
       74  0
                                   tokens.add(part);
      -  75  48
                               }
      +  75  6
                               }
       76  
                           } else {
       77  0
                               tokens.add(part);
      @@ -157,19 +157,19 @@
                           }
       79  
                       }
      -  80  48
                   } else {
      -  81  149203
                       tokens.add(text);
      +  80  6
                   } else {
      +  81  21621
                       tokens.add(text);
       82  
                   }
       83  
               }
      -  84  223725
               return addTerm();
      +  84  32163
               return addTerm();
       85  
           }
       86  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nexus.MavenArtifact.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nexus.MavenArtifact.html index 2234b6b53..c183cbc82 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nexus.MavenArtifact.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nexus.MavenArtifact.html @@ -178,36 +178,36 @@
            * @param secureDownload if the jar and pom files should be downloaded using HTTPS.
       84  
            */
      -  85  9
           public MavenArtifact(String groupId, String artifactId, String version, boolean jarAvailable, boolean pomAvailable, boolean secureDownload) {
      -  86  9
               this.groupId = groupId;
      -  87  9
               this.artifactId = artifactId;
      -  88  9
               this.version = version;
      +  85  3
           public MavenArtifact(String groupId, String artifactId, String version, boolean jarAvailable, boolean pomAvailable, boolean secureDownload) {
      +  86  3
               this.groupId = groupId;
      +  87  3
               this.artifactId = artifactId;
      +  88  3
               this.version = version;
       89  
               String base;
      -  90  9
               if (secureDownload) {
      +  90  3
               if (secureDownload) {
       91  0
                   base = "https:" + CENTRAL_CONTENT_URL;
       92  
               } else {
      -  93  9
                   base = "http:" + CENTRAL_CONTENT_URL;
      +  93  3
                   base = "http:" + CENTRAL_CONTENT_URL;
       94  
               }
      -  95  9
               if (jarAvailable) {
      +  95  3
               if (jarAvailable) {
       96  
                   //org/springframework/spring-core/3.2.0.RELEASE/spring-core-3.2.0.RELEASE.pom
      -  97  9
                   this.artifactUrl = base + groupId.replace('.', '/') + "/" + artifactId + "/"
      +  97  3
                   this.artifactUrl = base + groupId.replace('.', '/') + "/" + artifactId + "/"
       98  
                           + version + "/" + artifactId + "-" + version + ".jar";
       99  
               }
      -  100  9
               if (pomAvailable) {
      +  100  3
               if (pomAvailable) {
       101  
                   //org/springframework/spring-core/3.2.0.RELEASE/spring-core-3.2.0.RELEASE.pom
      -  102  9
                   this.pomUrl = base + groupId.replace('.', '/') + "/" + artifactId + "/"
      +  102  3
                   this.pomUrl = base + groupId.replace('.', '/') + "/" + artifactId + "/"
       103  
                           + version + "/" + artifactId + "-" + version + ".pom";
       104  
               }
      -  105  9
           }
      +  105  3
           }
       106  
       
       107   @@ -226,12 +226,12 @@
            * @param url the artifactLink url
       114  
            */
      -  115  16
           public MavenArtifact(String groupId, String artifactId, String version, String url) {
      -  116  16
               this.groupId = groupId;
      -  117  16
               this.artifactId = artifactId;
      -  118  16
               this.version = version;
      -  119  16
               this.artifactUrl = url;
      -  120  16
           }
      +  115  2
           public MavenArtifact(String groupId, String artifactId, String version, String url) {
      +  116  2
               this.groupId = groupId;
      +  117  2
               this.artifactId = artifactId;
      +  118  2
               this.version = version;
      +  119  2
               this.artifactUrl = url;
      +  120  2
           }
       121  
       
       122   @@ -248,7 +248,7 @@
           @Override
       128  
           public String toString() {
      -  129  16
               return String.format("%s:%s:%s", groupId, artifactId, version);
      +  129  2
               return String.format("%s:%s:%s", groupId, artifactId, version);
       130  
           }
       131   @@ -281,7 +281,7 @@
            */
       146  
           public String getGroupId() {
      -  147  35
               return groupId;
      +  147  5
               return groupId;
       148  
           }
       149   @@ -314,7 +314,7 @@
            */
       164  
           public String getArtifactId() {
      -  165  35
               return artifactId;
      +  165  5
               return artifactId;
       166  
           }
       167   @@ -347,7 +347,7 @@
            */
       182  
           public String getVersion() {
      -  183  35
               return version;
      +  183  5
               return version;
       184  
           }
       185   @@ -380,7 +380,7 @@
            */
       200  
           public String getArtifactUrl() {
      -  201  32
               return artifactUrl;
      +  201  4
               return artifactUrl;
       202  
           }
       203   @@ -426,6 +426,6 @@
       // vim: cc=120:sw=4:ts=4:sts=4
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nexus.NexusSearch.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nexus.NexusSearch.html index ab4609b95..0a89003d1 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nexus.NexusSearch.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nexus.NexusSearch.html @@ -255,11 +255,11 @@  133  
                                       doc);
       134  0
                       final MavenArtifact ma = new MavenArtifact(groupId, artifactId, version);
      -  135  0
                       if (link != null && !"".equals(link)) {
      +  135  0
                       if (link != null && !link.isEmpty()) {
       136  0
                           ma.setArtifactUrl(link);
       137  
                       }
      -  138  0
                       if (pomLink != null && !"".equals(pomLink)) {
      +  138  0
                       if (pomLink != null && !pomLink.isEmpty()) {
       139  0
                           ma.setPomUrl(pomLink);
       140  
                       }
      @@ -334,6 +334,6 @@
       // vim: cc=120:sw=4:ts=4:sts=4
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.NugetPackage.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.NugetPackage.html index ed6b2c04a..5c6240aa7 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.NugetPackage.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.NugetPackage.html @@ -133,8 +133,8 @@
            * Creates an empty NugetPackage.
       58  
            */
      -  59  16
           public NugetPackage() {
      -  60  16
           }
      +  59  2
           public NugetPackage() {
      +  60  2
           }
       61  
       
       62   @@ -147,8 +147,8 @@
            */
       66  
           public void setId(String id) {
      -  67  8
               this.id = id;
      -  68  8
           }
      +  67  1
               this.id = id;
      +  68  1
           }
       69  
       
       70   @@ -161,7 +161,7 @@
            */
       74  
           public String getId() {
      -  75  8
               return id;
      +  75  1
               return id;
       76  
           }
       77   @@ -176,8 +176,8 @@
            */
       82  
           public void setVersion(String version) {
      -  83  8
               this.version = version;
      -  84  8
           }
      +  83  1
               this.version = version;
      +  84  1
           }
       85  
       
       86   @@ -190,7 +190,7 @@
            */
       90  
           public String getVersion() {
      -  91  8
               return version;
      +  91  1
               return version;
       92  
           }
       93   @@ -205,8 +205,8 @@
            */
       98  
           public void setTitle(String title) {
      -  99  8
               this.title = title;
      -  100  8
           }
      +  99  1
               this.title = title;
      +  100  1
           }
       101  
       
       102   @@ -219,7 +219,7 @@
            */
       106  
           public String getTitle() {
      -  107  8
               return title;
      +  107  1
               return title;
       108  
           }
       109   @@ -234,8 +234,8 @@
            */
       114  
           public void setAuthors(String authors) {
      -  115  8
               this.authors = authors;
      -  116  8
           }
      +  115  1
               this.authors = authors;
      +  116  1
           }
       117  
       
       118   @@ -248,7 +248,7 @@
            */
       122  
           public String getAuthors() {
      -  123  8
               return authors;
      +  123  1
               return authors;
       124  
           }
       125   @@ -263,8 +263,8 @@
            */
       130  
           public void setOwners(String owners) {
      -  131  8
               this.owners = owners;
      -  132  8
           }
      +  131  1
               this.owners = owners;
      +  132  1
           }
       133  
       
       134   @@ -277,7 +277,7 @@
            */
       138  
           public String getOwners() {
      -  139  8
               return owners;
      +  139  1
               return owners;
       140  
           }
       141   @@ -292,8 +292,8 @@
            */
       146  
           public void setLicenseUrl(String licenseUrl) {
      -  147  8
               this.licenseUrl = licenseUrl;
      -  148  8
           }
      +  147  1
               this.licenseUrl = licenseUrl;
      +  148  1
           }
       149  
       
       150   @@ -306,7 +306,7 @@
            */
       154  
           public String getLicenseUrl() {
      -  155  8
               return licenseUrl;
      +  155  1
               return licenseUrl;
       156  
           }
       157   @@ -357,6 +357,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.NuspecParseException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.NuspecParseException.html index 48187a7a0..3bb4e3e9f 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.NuspecParseException.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.NuspecParseException.html @@ -113,8 +113,8 @@
            */
       49  
           public NuspecParseException(String message) {
      -  50  8
               super(message);
      -  51  8
           }
      +  50  1
               super(message);
      +  51  1
           }
       52  
       
       53   @@ -141,12 +141,12 @@
            */
       64  
           public NuspecParseException(String message, Throwable cause) {
      -  65  16
               super(message, cause);
      -  66  16
           }
      +  65  2
               super(message, cause);
      +  66  2
           }
       67  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.NuspecParser.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.NuspecParser.html index d23fb2c09..56143e90c 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.NuspecParser.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.NuspecParser.html @@ -93,6 +93,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.XPathNuspecParser.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.XPathNuspecParser.html index e5df37207..6498f578b 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.XPathNuspecParser.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nuget.XPathNuspecParser.html @@ -81,7 +81,7 @@
        * @author colezlaw
       32  
        */
      -  33  24
       public class XPathNuspecParser implements NuspecParser {
      +  33  3
       public class XPathNuspecParser implements NuspecParser {
       34  
       
       35   @@ -98,8 +98,8 @@
            */
       41  
           private String getOrNull(Node n) {
      -  42  24
               if (n != null) {
      -  43  24
                   return n.getTextContent();
      +  42  3
               if (n != null) {
      +  43  3
                   return n.getTextContent();
       44  
               } else {
       45  0
                   return null;
      @@ -129,32 +129,32 @@
           public NugetPackage parse(InputStream stream) throws NuspecParseException {
       58  
               try {
      -  59  24
                   final Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(stream);
      -  60  16
                   final XPath xpath = XPathFactory.newInstance().newXPath();
      -  61  16
                   final NugetPackage nuspec = new NugetPackage();
      +  59  3
                   final Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(stream);
      +  60  2
                   final XPath xpath = XPathFactory.newInstance().newXPath();
      +  61  2
                   final NugetPackage nuspec = new NugetPackage();
       62  
       
      -  63  16
                   if (xpath.evaluate("/package/metadata/id", d, XPathConstants.NODE) == null
      +  63  2
                   if (xpath.evaluate("/package/metadata/id", d, XPathConstants.NODE) == null
       64  
                           || xpath.evaluate("/package/metadata/version", d, XPathConstants.NODE) == null
       65  
                           || xpath.evaluate("/package/metadata/authors", d, XPathConstants.NODE) == null
       66  
                           || xpath.evaluate("/package/metadata/description", d, XPathConstants.NODE) == null) {
      -  67  8
                       throw new NuspecParseException("Invalid Nuspec format");
      +  67  1
                       throw new NuspecParseException("Invalid Nuspec format");
       68  
                   }
       69  
       
      -  70  8
                   nuspec.setId(xpath.evaluate("/package/metadata/id", d));
      -  71  8
                   nuspec.setVersion(xpath.evaluate("/package/metadata/version", d));
      -  72  8
                   nuspec.setAuthors(xpath.evaluate("/package/metadata/authors", d));
      -  73  8
                   nuspec.setOwners(getOrNull((Node) xpath.evaluate("/package/metadata/owners", d, XPathConstants.NODE)));
      -  74  8
                   nuspec.setLicenseUrl(getOrNull((Node) xpath.evaluate("/package/metadata/licenseUrl", d, XPathConstants.NODE)));
      -  75  8
                   nuspec.setTitle(getOrNull((Node) xpath.evaluate("/package/metadata/title", d, XPathConstants.NODE)));
      -  76  8
                   return nuspec;
      -  77  16
               } catch (Throwable e) {
      -  78  16
                   throw new NuspecParseException("Unable to parse nuspec", e);
      +  70  1
                   nuspec.setId(xpath.evaluate("/package/metadata/id", d));
      +  71  1
                   nuspec.setVersion(xpath.evaluate("/package/metadata/version", d));
      +  72  1
                   nuspec.setAuthors(xpath.evaluate("/package/metadata/authors", d));
      +  73  1
                   nuspec.setOwners(getOrNull((Node) xpath.evaluate("/package/metadata/owners", d, XPathConstants.NODE)));
      +  74  1
                   nuspec.setLicenseUrl(getOrNull((Node) xpath.evaluate("/package/metadata/licenseUrl", d, XPathConstants.NODE)));
      +  75  1
                   nuspec.setTitle(getOrNull((Node) xpath.evaluate("/package/metadata/title", d, XPathConstants.NODE)));
      +  76  1
                   return nuspec;
      +  77  2
               } catch (Throwable e) {
      +  78  2
                   throw new NuspecParseException("Unable to parse nuspec", e);
       79  
               }
       80   @@ -163,6 +163,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.ConnectionFactory.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.ConnectionFactory.html index 76b7b1265..80eec16ae 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.ConnectionFactory.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.ConnectionFactory.html @@ -111,14 +111,14 @@
            * The Logger.
       47  
            */
      -  48  8
           private static final Logger LOGGER = LoggerFactory.getLogger(ConnectionFactory.class);
      +  48  1
           private static final Logger LOGGER = LoggerFactory.getLogger(ConnectionFactory.class);
       49  
           /**
       50  
            * The version of the current DB Schema.
       51  
            */
      -  52  8
           public static final String DB_SCHEMA_VERSION = Settings.getString(Settings.KEYS.DB_VERSION);
      +  52  1
           public static final String DB_SCHEMA_VERSION = Settings.getString(Settings.KEYS.DB_VERSION);
       53  
           /**
       54   @@ -141,28 +141,28 @@
            * The database driver used to connect to the database.
       63  
            */
      -  64  8
           private static Driver driver = null;
      +  64  1
           private static Driver driver = null;
       65  
           /**
       66  
            * The database connection string.
       67  
            */
      -  68  8
           private static String connectionString = null;
      +  68  1
           private static String connectionString = null;
       69  
           /**
       70  
            * The username to connect to the database.
       71  
            */
      -  72  8
           private static String userName = null;
      +  72  1
           private static String userName = null;
       73  
           /**
       74  
            * The password for the database.
       75  
            */
      -  76  8
           private static String password = null;
      +  76  1
           private static String password = null;
       77  
       
       78   @@ -191,42 +191,42 @@
           public static synchronized void initialize() throws DatabaseException {
       91  
               //this only needs to be called once.
      -  92  64
               if (connectionString != null) {
      -  93  56
                   return;
      +  92  9
               if (connectionString != null) {
      +  93  8
                   return;
       94  
               }
      -  95  8
               Connection conn = null;
      +  95  1
               Connection conn = null;
       96  
               try {
       97  
                   //load the driver if necessary
      -  98  8
                   final String driverName = Settings.getString(Settings.KEYS.DB_DRIVER_NAME, "");
      -  99  8
                   if (!driverName.isEmpty()) { //likely need to load the correct driver
      -  100  8
                       LOGGER.debug("Loading driver: {}", driverName);
      -  101  8
                       final String driverPath = Settings.getString(Settings.KEYS.DB_DRIVER_PATH, "");
      +  98  1
                   final String driverName = Settings.getString(Settings.KEYS.DB_DRIVER_NAME, "");
      +  99  1
                   if (!driverName.isEmpty()) { //likely need to load the correct driver
      +  100  1
                       LOGGER.debug("Loading driver: {}", driverName);
      +  101  1
                       final String driverPath = Settings.getString(Settings.KEYS.DB_DRIVER_PATH, "");
       102  
                       try {
      -  103  8
                           if (!driverPath.isEmpty()) {
      +  103  1
                           if (!driverPath.isEmpty()) {
       104  0
                               LOGGER.debug("Loading driver from: {}", driverPath);
       105  0
                               driver = DriverLoader.load(driverName, driverPath);
       106  
                           } else {
      -  107  8
                               driver = DriverLoader.load(driverName);
      +  107  1
                               driver = DriverLoader.load(driverName);
       108  
                           }
       109  0
                       } catch (DriverLoadException ex) {
       110  0
                           LOGGER.debug("Unable to load database driver", ex);
       111  0
                           throw new DatabaseException("Unable to load database driver");
      -  112  8
                       }
      +  112  1
                       }
       113  
                   }
      -  114  8
                   userName = Settings.getString(Settings.KEYS.DB_USER, "dcuser");
      +  114  1
                   userName = Settings.getString(Settings.KEYS.DB_USER, "dcuser");
       115  
                   //yes, yes - hard-coded password - only if there isn't one in the properties file.
      -  116  8
                   password = Settings.getString(Settings.KEYS.DB_PASSWORD, "DC-Pass1337!");
      +  116  1
                   password = Settings.getString(Settings.KEYS.DB_PASSWORD, "DC-Pass1337!");
       117  
                   try {
      -  118  8
                       connectionString = Settings.getConnectionString(
      +  118  1
                       connectionString = Settings.getConnectionString(
       119  
                               Settings.KEYS.DB_CONNECTION_STRING,
       120   @@ -236,27 +236,27 @@  123  
                               "Unable to retrieve the database connection string", ex);
       124  0
                       throw new DatabaseException("Unable to retrieve the database connection string");
      -  125  8
                   }
      -  126  8
                   boolean shouldCreateSchema = false;
      +  125  1
                   }
      +  126  1
                   boolean shouldCreateSchema = false;
       127  
                   try {
      -  128  8
                       if (connectionString.startsWith("jdbc:h2:file:")) { //H2
      -  129  8
                           shouldCreateSchema = !h2DataFileExists();
      -  130  8
                           LOGGER.debug("Need to create DB Structure: {}", shouldCreateSchema);
      +  128  1
                       if (connectionString.startsWith("jdbc:h2:file:")) { //H2
      +  129  1
                           shouldCreateSchema = !h2DataFileExists();
      +  130  1
                           LOGGER.debug("Need to create DB Structure: {}", shouldCreateSchema);
       131  
                       }
       132  0
                   } catch (IOException ioex) {
       133  0
                       LOGGER.debug("Unable to verify database exists", ioex);
       134  0
                       throw new DatabaseException("Unable to verify database exists");
      -  135  8
                   }
      -  136  8
                   LOGGER.debug("Loading database connection");
      -  137  8
                   LOGGER.debug("Connection String: {}", connectionString);
      -  138  8
                   LOGGER.debug("Database User: {}", userName);
      +  135  1
                   }
      +  136  1
                   LOGGER.debug("Loading database connection");
      +  137  1
                   LOGGER.debug("Connection String: {}", connectionString);
      +  138  1
                   LOGGER.debug("Database User: {}", userName);
       139  
       
       140  
                   try {
      -  141  8
                       conn = DriverManager.getConnection(connectionString, userName, password);
      +  141  1
                       conn = DriverManager.getConnection(connectionString, userName, password);
       142  0
                   } catch (SQLException ex) {
       143  0
                       if (ex.getMessage().contains("java.net.UnknownHostException") && connectionString.contains("AUTO_SERVER=TRUE;")) {
       144  0
                           connectionString = connectionString.replace("AUTO_SERVER=TRUE;", "");
      @@ -277,10 +277,10 @@  156  0
                           throw new DatabaseException("Unable to connect to the database");
       157  
                       }
      -  158  8
                   }
      +  158  1
                   }
       159  
       
      -  160  8
                   if (shouldCreateSchema) {
      +  160  1
                   if (shouldCreateSchema) {
       161  
                       try {
       162  0
                           createTables(conn);
      @@ -292,25 +292,25 @@
                   }
       168  
                   try {
      -  169  8
                       ensureSchemaVersion(conn);
      +  169  1
                       ensureSchemaVersion(conn);
       170  0
                   } catch (DatabaseException dex) {
       171  0
                       LOGGER.debug("", dex);
       172  0
                       throw new DatabaseException("Database schema does not match this version of dependency-check", dex);
      -  173  8
                   }
      +  173  1
                   }
       174  
               } finally {
      -  175  8
                   if (conn != null) {
      +  175  1
                   if (conn != null) {
       176  
                       try {
      -  177  8
                           conn.close();
      +  177  1
                           conn.close();
       178  0
                       } catch (SQLException ex) {
       179  0
                           LOGGER.debug("An error occurred closing the connection", ex);
      -  180  8
                       }
      +  180  1
                       }
       181  
                   }
       182  
               }
      -  183  8
           }
      +  183  1
           }
       184  
       
       185   @@ -359,16 +359,16 @@
            */
       213  
           public static Connection getConnection() throws DatabaseException {
      -  214  48
               initialize();
      -  215  48
               Connection conn = null;
      +  214  6
               initialize();
      +  215  6
               Connection conn = null;
       216  
               try {
      -  217  48
                   conn = DriverManager.getConnection(connectionString, userName, password);
      +  217  6
                   conn = DriverManager.getConnection(connectionString, userName, password);
       218  0
               } catch (SQLException ex) {
       219  0
                   LOGGER.debug("", ex);
       220  0
                   throw new DatabaseException("Unable to connect to the database");
      -  221  48
               }
      -  222  48
               return conn;
      +  221  6
               }
      +  222  6
               return conn;
       223  
           }
       224   @@ -387,10 +387,10 @@
            */
       231  
           private static boolean h2DataFileExists() throws IOException {
      -  232  8
               final File dir = Settings.getDataDirectory();
      -  233  8
               final String fileName = Settings.getString(Settings.KEYS.DB_FILE_NAME);
      -  234  8
               final File file = new File(dir, fileName);
      -  235  8
               return file.exists();
      +  232  1
               final File dir = Settings.getDataDirectory();
      +  233  1
               final String fileName = Settings.getString(Settings.KEYS.DB_FILE_NAME);
      +  234  1
               final File file = new File(dir, fileName);
      +  235  1
               return file.exists();
       236  
           }
       237   @@ -546,16 +546,16 @@
            */
       339  
           private static void ensureSchemaVersion(Connection conn) throws DatabaseException {
      -  340  8
               ResultSet rs = null;
      -  341  8
               CallableStatement cs = null;
      +  340  1
               ResultSet rs = null;
      +  341  1
               CallableStatement cs = null;
       342  
               try {
       343  
                   //TODO convert this to use DatabaseProperties
      -  344  8
                   cs = conn.prepareCall("SELECT value FROM properties WHERE id = 'version'");
      -  345  8
                   rs = cs.executeQuery();
      -  346  8
                   if (rs.next()) {
      -  347  8
                       if (!DB_SCHEMA_VERSION.equals(rs.getString(1))) {
      +  344  1
                   cs = conn.prepareCall("SELECT value FROM properties WHERE id = 'version'");
      +  345  1
                   rs = cs.executeQuery();
      +  346  1
                   if (rs.next()) {
      +  347  1
                       if (!DB_SCHEMA_VERSION.equals(rs.getString(1))) {
       348  0
                           LOGGER.debug("Current Schema: " + DB_SCHEMA_VERSION);
       349  0
                           LOGGER.debug("DB Schema: " + rs.getString(1));
       350  0
                           updateSchema(conn, rs.getString(1));
      @@ -571,14 +571,14 @@  357  0
                   throw new DatabaseException("Unable to check the database schema version");
       358  
               } finally {
      -  359  8
                   DBUtils.closeResultSet(rs);
      -  360  8
                   DBUtils.closeStatement(cs);
      -  361  8
               }
      -  362  8
           }
      +  359  1
                   DBUtils.closeResultSet(rs);
      +  360  1
                   DBUtils.closeStatement(cs);
      +  361  1
               }
      +  362  1
           }
       363  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.CorruptDatabaseException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.CorruptDatabaseException.html index fa978ff08..e5fa97792 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.CorruptDatabaseException.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.CorruptDatabaseException.html @@ -117,6 +117,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.CveDB.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.CveDB.html index 2091a9b1c..d2ca8c388 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.CveDB.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.CveDB.html @@ -133,7 +133,7 @@
            * The logger.
       58  
            */
      -  59  8
           private static final Logger LOGGER = LoggerFactory.getLogger(CveDB.class);
      +  59  1
           private static final Logger LOGGER = LoggerFactory.getLogger(CveDB.class);
       60  
           /**
       61   @@ -148,7 +148,7 @@
            * The bundle of statements used when accessing the database.
       66  
            */
      -  67  48
           private ResourceBundle statementBundle = null;
      +  67  6
           private ResourceBundle statementBundle = null;
       68  
       
       69   @@ -165,16 +165,16 @@
            */
       75  
           public CveDB() throws DatabaseException {
      -  76  48
               super();
      -  77  48
               statementBundle = ResourceBundle.getBundle("data/dbStatements");
      +  76  6
               super();
      +  77  6
               statementBundle = ResourceBundle.getBundle("data/dbStatements");
       78  
               try {
      -  79  48
                   open();
      -  80  48
                   databaseProperties = new DatabaseProperties(this);
      +  79  6
                   open();
      +  80  6
                   databaseProperties = new DatabaseProperties(this);
       81  0
               } catch (DatabaseException ex) {
       82  0
                   throw ex;
      -  83  48
               }
      -  84  48
           }
      +  83  6
               }
      +  84  6
           }
       85  
       
       86   @@ -189,7 +189,7 @@
            */
       91  
           protected Connection getConnection() {
      -  92  296
               return conn;
      +  92  37
               return conn;
       93  
           }
       94   @@ -206,11 +206,11 @@
            */
       100  
           public final void open() throws DatabaseException {
      -  101  96
               if (!isOpen()) {
      -  102  48
                   conn = ConnectionFactory.getConnection();
      +  101  12
               if (!isOpen()) {
      +  102  6
                   conn = ConnectionFactory.getConnection();
       103  
               }
      -  104  96
           }
      +  104  12
           }
       105  
       
       106   @@ -221,21 +221,21 @@
            */
       109  
           public void close() {
      -  110  62
               if (conn != null) {
      +  110  8
               if (conn != null) {
       111  
                   try {
      -  112  48
                       conn.close();
      +  112  6
                       conn.close();
       113  0
                   } catch (SQLException ex) {
       114  0
                       LOGGER.error("There was an error attempting to close the CveDB, see the log for more details.");
       115  0
                       LOGGER.debug("", ex);
       116  0
                   } catch (Throwable ex) {
       117  0
                       LOGGER.error("There was an exception attempting to close the CveDB, see the log for more details.");
       118  0
                       LOGGER.debug("", ex);
      -  119  48
                   }
      -  120  48
                   conn = null;
      +  119  6
                   }
      +  120  6
                   conn = null;
       121  
               }
      -  122  62
           }
      +  122  8
           }
       123  
       
       124   @@ -250,7 +250,7 @@
            */
       129  
           public boolean isOpen() {
      -  130  96
               return conn != null;
      +  130  12
               return conn != null;
       131  
           }
       132   @@ -294,10 +294,10 @@
           @SuppressWarnings("FinalizeDeclaration")
       152  
           protected void finalize() throws Throwable {
      -  153  14
               LOGGER.debug("Entering finalize");
      -  154  14
               close();
      -  155  14
               super.finalize();
      -  156  14
           }
      +  153  2
               LOGGER.debug("Entering finalize");
      +  154  2
               close();
      +  155  2
               super.finalize();
      +  156  2
           }
       157  
           /**
       158   @@ -320,7 +320,7 @@
            */
       167  
           public DatabaseProperties getDatabaseProperties() {
      -  168  24
               return databaseProperties;
      +  168  3
               return databaseProperties;
       169  
           }
       170   @@ -343,31 +343,31 @@
            */
       179  
           public Set<VulnerableSoftware> getCPEs(String vendor, String product) {
      -  180  24
               final Set<VulnerableSoftware> cpe = new HashSet<VulnerableSoftware>();
      -  181  24
               ResultSet rs = null;
      -  182  24
               PreparedStatement ps = null;
      +  180  3
               final Set<VulnerableSoftware> cpe = new HashSet<VulnerableSoftware>();
      +  181  3
               ResultSet rs = null;
      +  182  3
               PreparedStatement ps = null;
       183  
               try {
      -  184  24
                   ps = getConnection().prepareStatement(statementBundle.getString("SELECT_CPE_ENTRIES"));
      -  185  24
                   ps.setString(1, vendor);
      -  186  24
                   ps.setString(2, product);
      -  187  24
                   rs = ps.executeQuery();
      +  184  3
                   ps = getConnection().prepareStatement(statementBundle.getString("SELECT_CPE_ENTRIES"));
      +  185  3
                   ps.setString(1, vendor);
      +  186  3
                   ps.setString(2, product);
      +  187  3
                   rs = ps.executeQuery();
       188  
       
      -  189  896
                   while (rs.next()) {
      -  190  872
                       final VulnerableSoftware vs = new VulnerableSoftware();
      -  191  872
                       vs.setCpe(rs.getString(1));
      -  192  872
                       cpe.add(vs);
      -  193  872
                   }
      +  189  112
                   while (rs.next()) {
      +  190  109
                       final VulnerableSoftware vs = new VulnerableSoftware();
      +  191  109
                       vs.setCpe(rs.getString(1));
      +  192  109
                       cpe.add(vs);
      +  193  109
                   }
       194  0
               } catch (SQLException ex) {
       195  0
                   LOGGER.error("An unexpected SQL Exception occurred; please see the verbose log for more details.");
       196  0
                   LOGGER.debug("", ex);
       197  
               } finally {
      -  198  24
                   DBUtils.closeResultSet(rs);
      -  199  24
                   DBUtils.closeStatement(ps);
      -  200  24
               }
      -  201  24
               return cpe;
      +  198  3
                   DBUtils.closeResultSet(rs);
      +  199  3
                   DBUtils.closeStatement(ps);
      +  200  3
               }
      +  201  3
               return cpe;
       202  
           }
       203   @@ -386,15 +386,15 @@
            */
       210  
           public Set<Pair<String, String>> getVendorProductList() throws DatabaseException {
      -  211  8
               final Set<Pair<String, String>> data = new HashSet<Pair<String, String>>();
      -  212  8
               ResultSet rs = null;
      -  213  8
               PreparedStatement ps = null;
      +  211  1
               final Set<Pair<String, String>> data = new HashSet<Pair<String, String>>();
      +  212  1
               ResultSet rs = null;
      +  213  1
               PreparedStatement ps = null;
       214  
               try {
      -  215  8
                   ps = getConnection().prepareStatement(statementBundle.getString("SELECT_VENDOR_PRODUCT_LIST"));
      -  216  8
                   rs = ps.executeQuery();
      -  217  201186
                   while (rs.next()) {
      -  218  201178
                       data.add(new Pair<String, String>(rs.getString(1), rs.getString(2)));
      +  215  1
                   ps = getConnection().prepareStatement(statementBundle.getString("SELECT_VENDOR_PRODUCT_LIST"));
      +  216  1
                   rs = ps.executeQuery();
      +  217  25291
                   while (rs.next()) {
      +  218  25290
                       data.add(new Pair<String, String>(rs.getString(1), rs.getString(2)));
       219  
                   }
       220  0
               } catch (SQLException ex) {
      @@ -402,10 +402,10 @@  222  0
                   throw new DatabaseException(msg, ex);
       223  
               } finally {
      -  224  8
                   DBUtils.closeResultSet(rs);
      -  225  8
                   DBUtils.closeStatement(ps);
      -  226  8
               }
      -  227  8
               return data;
      +  224  1
                   DBUtils.closeResultSet(rs);
      +  225  1
                   DBUtils.closeStatement(ps);
      +  226  1
               }
      +  227  1
               return data;
       228  
           }
       229   @@ -422,15 +422,15 @@
            */
       235  
           Properties getProperties() {
      -  236  48
               final Properties prop = new Properties();
      -  237  48
               PreparedStatement ps = null;
      -  238  48
               ResultSet rs = null;
      +  236  6
               final Properties prop = new Properties();
      +  237  6
               PreparedStatement ps = null;
      +  238  6
               ResultSet rs = null;
       239  
               try {
      -  240  48
                   ps = getConnection().prepareStatement(statementBundle.getString("SELECT_PROPERTIES"));
      -  241  48
                   rs = ps.executeQuery();
      -  242  960
                   while (rs.next()) {
      -  243  912
                       prop.setProperty(rs.getString(1), rs.getString(2));
      +  240  6
                   ps = getConnection().prepareStatement(statementBundle.getString("SELECT_PROPERTIES"));
      +  241  6
                   rs = ps.executeQuery();
      +  242  120
                   while (rs.next()) {
      +  243  114
                       prop.setProperty(rs.getString(1), rs.getString(2));
       244  
                   }
       245  0
               } catch (SQLException ex) {
      @@ -438,10 +438,10 @@  247  0
                   LOGGER.debug("", ex);
       248  
               } finally {
      -  249  48
                   DBUtils.closeStatement(ps);
      -  250  48
                   DBUtils.closeResultSet(rs);
      -  251  48
               }
      -  252  48
               return prop;
      +  249  6
                   DBUtils.closeStatement(ps);
      +  250  6
                   DBUtils.closeResultSet(rs);
      +  251  6
               }
      +  252  6
               return prop;
       253  
           }
       254   @@ -571,659 +571,665 @@
            */
       342  
           public List<Vulnerability> getVulnerabilities(String cpeStr) throws DatabaseException {
      -  343  24
               ResultSet rs = null;
      -  344  24
               final VulnerableSoftware cpe = new VulnerableSoftware();
      -  345   +  343  3
               final VulnerableSoftware cpe = new VulnerableSoftware();
      +  344  
               try {
      -  346  24
                   cpe.parseName(cpeStr);
      -  347  0
               } catch (UnsupportedEncodingException ex) {
      -  348  0
                   LOGGER.trace("", ex);
      -  349  24
               }
      -  350  24
               final DependencyVersion detectedVersion = parseDependencyVersion(cpe);
      -  351  24
               final List<Vulnerability> vulnerabilities = new ArrayList<Vulnerability>();
      -  352   +  345  3
                   cpe.parseName(cpeStr);
      +  346  0
               } catch (UnsupportedEncodingException ex) {
      +  347  0
                   LOGGER.trace("", ex);
      +  348  3
               }
      +  349  3
               final DependencyVersion detectedVersion = parseDependencyVersion(cpe);
      +  350  3
               final List<Vulnerability> vulnerabilities = new ArrayList<Vulnerability>();
      +  351  
       
      -  353   -
               PreparedStatement ps;
      +  352  3
               PreparedStatement ps = null;
      +  353  3
               ResultSet rs = null;
       354  
               try {
      -  355  24
                   ps = getConnection().prepareStatement(statementBundle.getString("SELECT_CVE_FROM_SOFTWARE"));
      -  356  24
                   ps.setString(1, cpe.getVendor());
      -  357  24
                   ps.setString(2, cpe.getProduct());
      -  358  24
                   rs = ps.executeQuery();
      -  359  24
                   String currentCVE = "";
      +  355  3
                   ps = getConnection().prepareStatement(statementBundle.getString("SELECT_CVE_FROM_SOFTWARE"));
      +  356  3
                   ps.setString(1, cpe.getVendor());
      +  357  3
                   ps.setString(2, cpe.getProduct());
      +  358  3
                   rs = ps.executeQuery();
      +  359  3
                   String currentCVE = "";
       360  
       
      -  361  24
                   final Map<String, Boolean> vulnSoftware = new HashMap<String, Boolean>();
      -  362  2256
                   while (rs.next()) {
      -  363  2232
                       final String cveId = rs.getString(1);
      -  364  2232
                       if (!currentCVE.equals(cveId)) { //check for match and add
      -  365  80
                           final Entry<String, Boolean> matchedCPE = getMatchingSoftware(vulnSoftware, cpe.getVendor(), cpe.getProduct(), detectedVersion);
      -  366  80
                           if (matchedCPE != null) {
      -  367  48
                               final Vulnerability v = getVulnerability(currentCVE);
      -  368  48
                               v.setMatchedCPE(matchedCPE.getKey(), matchedCPE.getValue() ? "Y" : null);
      -  369  48
                               vulnerabilities.add(v);
      +  361  3
                   final Map<String, Boolean> vulnSoftware = new HashMap<String, Boolean>();
      +  362  282
                   while (rs.next()) {
      +  363  279
                       final String cveId = rs.getString(1);
      +  364  279
                       if (!currentCVE.equals(cveId)) { //check for match and add
      +  365  10
                           final Entry<String, Boolean> matchedCPE = getMatchingSoftware(vulnSoftware, cpe.getVendor(), cpe.getProduct(), detectedVersion);
      +  366  10
                           if (matchedCPE != null) {
      +  367  6
                               final Vulnerability v = getVulnerability(currentCVE);
      +  368  6
                               v.setMatchedCPE(matchedCPE.getKey(), matchedCPE.getValue() ? "Y" : null);
      +  369  6
                               vulnerabilities.add(v);
       370  
                           }
      -  371  80
                           vulnSoftware.clear();
      -  372  80
                           currentCVE = cveId;
      +  371  10
                           vulnSoftware.clear();
      +  372  10
                           currentCVE = cveId;
       373  
                       }
       374  
       
      -  375  2232
                       final String cpeId = rs.getString(2);
      -  376  2232
                       final String previous = rs.getString(3);
      -  377  2232
                       final Boolean p = previous != null && !previous.isEmpty();
      -  378  2232
                       vulnSoftware.put(cpeId, p);
      -  379  2232
                   }
      +  375  279
                       final String cpeId = rs.getString(2);
      +  376  279
                       final String previous = rs.getString(3);
      +  377  279
                       final Boolean p = previous != null && !previous.isEmpty();
      +  378  279
                       vulnSoftware.put(cpeId, p);
      +  379  279
                   }
       380  
                   //remember to process the last set of CVE/CPE entries
      -  381  24
                   final Entry<String, Boolean> matchedCPE = getMatchingSoftware(vulnSoftware, cpe.getVendor(), cpe.getProduct(), detectedVersion);
      -  382  24
                   if (matchedCPE != null) {
      -  383  16
                       final Vulnerability v = getVulnerability(currentCVE);
      -  384  16
                       v.setMatchedCPE(matchedCPE.getKey(), matchedCPE.getValue() ? "Y" : null);
      -  385  16
                       vulnerabilities.add(v);
      +  381  3
                   final Entry<String, Boolean> matchedCPE = getMatchingSoftware(vulnSoftware, cpe.getVendor(), cpe.getProduct(), detectedVersion);
      +  382  3
                   if (matchedCPE != null) {
      +  383  2
                       final Vulnerability v = getVulnerability(currentCVE);
      +  384  2
                       v.setMatchedCPE(matchedCPE.getKey(), matchedCPE.getValue() ? "Y" : null);
      +  385  2
                       vulnerabilities.add(v);
       386  
                   }
      -  387  24
                   DBUtils.closeResultSet(rs);
      -  388  24
                   DBUtils.closeStatement(ps);
      -  389  0
               } catch (SQLException ex) {
      -  390  0
                   throw new DatabaseException("Exception retrieving vulnerability for " + cpeStr, ex);
      -  391   +  387  0
               } catch (SQLException ex) {
      +  388  0
                   throw new DatabaseException("Exception retrieving vulnerability for " + cpeStr, ex);
      +  389  
               } finally {
      -  392  24
                   DBUtils.closeResultSet(rs);
      -  393  24
               }
      -  394  24
               return vulnerabilities;
      +  390  3
                   DBUtils.closeResultSet(rs);
      +  391  3
                   DBUtils.closeStatement(ps);
      +  392  3
               }
      +  393  3
               return vulnerabilities;
      +  394   +
           }
       395   -
           }
      +
       
       396   -
       
      +
           /**
       397   -
           /**
      -  398  
            * Gets a vulnerability for the provided CVE.
      +  398   +
            *
       399   -
            *
      -  400  
            * @param cve the CVE to lookup
      -  401   +  400  
            * @return a vulnerability object
      -  402   +  401  
            * @throws DatabaseException if an exception occurs
      +  402   +
            */
       403   -
            */
      -  404  
           private Vulnerability getVulnerability(String cve) throws DatabaseException {
      -  405  64
               PreparedStatement psV = null;
      -  406  64
               PreparedStatement psR = null;
      -  407  64
               PreparedStatement psS = null;
      -  408  64
               ResultSet rsV = null;
      -  409  64
               ResultSet rsR = null;
      -  410  64
               ResultSet rsS = null;
      -  411  64
               Vulnerability vuln = null;
      -  412   +  404  8
               PreparedStatement psV = null;
      +  405  8
               PreparedStatement psR = null;
      +  406  8
               PreparedStatement psS = null;
      +  407  8
               ResultSet rsV = null;
      +  408  8
               ResultSet rsR = null;
      +  409  8
               ResultSet rsS = null;
      +  410  8
               Vulnerability vuln = null;
      +  411  
               try {
      -  413  64
                   psV = getConnection().prepareStatement(statementBundle.getString("SELECT_VULNERABILITY"));
      -  414  64
                   psV.setString(1, cve);
      -  415  64
                   rsV = psV.executeQuery();
      -  416  64
                   if (rsV.next()) {
      -  417  64
                       vuln = new Vulnerability();
      -  418  64
                       vuln.setName(cve);
      -  419  64
                       vuln.setDescription(rsV.getString(2));
      -  420  64
                       String cwe = rsV.getString(3);
      -  421  64
                       if (cwe != null) {
      -  422  64
                           final String name = CweDB.getCweName(cwe);
      -  423  64
                           if (name != null) {
      -  424  56
                               cwe += " " + name;
      +  412  8
                   psV = getConnection().prepareStatement(statementBundle.getString("SELECT_VULNERABILITY"));
      +  413  8
                   psV.setString(1, cve);
      +  414  8
                   rsV = psV.executeQuery();
      +  415  8
                   if (rsV.next()) {
      +  416  8
                       vuln = new Vulnerability();
      +  417  8
                       vuln.setName(cve);
      +  418  8
                       vuln.setDescription(rsV.getString(2));
      +  419  8
                       String cwe = rsV.getString(3);
      +  420  8
                       if (cwe != null) {
      +  421  8
                           final String name = CweDB.getCweName(cwe);
      +  422  8
                           if (name != null) {
      +  423  7
                               cwe += " " + name;
      +  424   +
                           }
       425   -
                           }
      -  426  
                       }
      -  427  64
                       final int cveId = rsV.getInt(1);
      -  428  64
                       vuln.setCwe(cwe);
      -  429  64
                       vuln.setCvssScore(rsV.getFloat(4));
      -  430  64
                       vuln.setCvssAccessVector(rsV.getString(5));
      -  431  64
                       vuln.setCvssAccessComplexity(rsV.getString(6));
      -  432  64
                       vuln.setCvssAuthentication(rsV.getString(7));
      -  433  64
                       vuln.setCvssConfidentialityImpact(rsV.getString(8));
      -  434  64
                       vuln.setCvssIntegrityImpact(rsV.getString(9));
      -  435  64
                       vuln.setCvssAvailabilityImpact(rsV.getString(10));
      -  436   +  426  8
                       final int cveId = rsV.getInt(1);
      +  427  8
                       vuln.setCwe(cwe);
      +  428  8
                       vuln.setCvssScore(rsV.getFloat(4));
      +  429  8
                       vuln.setCvssAccessVector(rsV.getString(5));
      +  430  8
                       vuln.setCvssAccessComplexity(rsV.getString(6));
      +  431  8
                       vuln.setCvssAuthentication(rsV.getString(7));
      +  432  8
                       vuln.setCvssConfidentialityImpact(rsV.getString(8));
      +  433  8
                       vuln.setCvssIntegrityImpact(rsV.getString(9));
      +  434  8
                       vuln.setCvssAvailabilityImpact(rsV.getString(10));
      +  435  
       
      -  437  64
                       psR = getConnection().prepareStatement(statementBundle.getString("SELECT_REFERENCES"));
      -  438  64
                       psR.setInt(1, cveId);
      -  439  64
                       rsR = psR.executeQuery();
      -  440  608
                       while (rsR.next()) {
      -  441  544
                           vuln.addReference(rsR.getString(1), rsR.getString(2), rsR.getString(3));
      -  442   +  436  8
                       psR = getConnection().prepareStatement(statementBundle.getString("SELECT_REFERENCES"));
      +  437  8
                       psR.setInt(1, cveId);
      +  438  8
                       rsR = psR.executeQuery();
      +  439  76
                       while (rsR.next()) {
      +  440  68
                           vuln.addReference(rsR.getString(1), rsR.getString(2), rsR.getString(3));
      +  441  
                       }
      -  443  64
                       psS = getConnection().prepareStatement(statementBundle.getString("SELECT_SOFTWARE"));
      -  444  64
                       psS.setInt(1, cveId);
      -  445  64
                       rsS = psS.executeQuery();
      -  446  1952
                       while (rsS.next()) {
      -  447  1888
                           final String cpe = rsS.getString(1);
      -  448  1888
                           final String prevVersion = rsS.getString(2);
      -  449  1888
                           if (prevVersion == null) {
      -  450  1824
                               vuln.addVulnerableSoftware(cpe);
      -  451   +  442  8
                       psS = getConnection().prepareStatement(statementBundle.getString("SELECT_SOFTWARE"));
      +  443  8
                       psS.setInt(1, cveId);
      +  444  8
                       rsS = psS.executeQuery();
      +  445  244
                       while (rsS.next()) {
      +  446  236
                           final String cpe = rsS.getString(1);
      +  447  236
                           final String prevVersion = rsS.getString(2);
      +  448  236
                           if (prevVersion == null) {
      +  449  228
                               vuln.addVulnerableSoftware(cpe);
      +  450  
                           } else {
      -  452  64
                               vuln.addVulnerableSoftware(cpe, prevVersion);
      -  453   +  451  8
                               vuln.addVulnerableSoftware(cpe, prevVersion);
      +  452  
                           }
      -  454  1888
                       }
      -  455   +  453  236
                       }
      +  454  
                   }
      -  456  0
               } catch (SQLException ex) {
      -  457  0
                   throw new DatabaseException("Error retrieving " + cve, ex);
      -  458   +  455  0
               } catch (SQLException ex) {
      +  456  0
                   throw new DatabaseException("Error retrieving " + cve, ex);
      +  457  
               } finally {
      -  459  64
                   DBUtils.closeResultSet(rsV);
      -  460  64
                   DBUtils.closeResultSet(rsR);
      -  461  64
                   DBUtils.closeResultSet(rsS);
      -  462  64
                   DBUtils.closeStatement(psV);
      -  463  64
                   DBUtils.closeStatement(psR);
      -  464  64
                   DBUtils.closeStatement(psS);
      -  465  64
               }
      -  466  64
               return vuln;
      +  458  8
                   DBUtils.closeResultSet(rsV);
      +  459  8
                   DBUtils.closeResultSet(rsR);
      +  460  8
                   DBUtils.closeResultSet(rsS);
      +  461  8
                   DBUtils.closeStatement(psV);
      +  462  8
                   DBUtils.closeStatement(psR);
      +  463  8
                   DBUtils.closeStatement(psS);
      +  464  8
               }
      +  465  8
               return vuln;
      +  466   +
           }
       467   -
           }
      +
       
       468   -
       
      +
           /**
       469   -
           /**
      -  470  
            * Updates the vulnerability within the database. If the vulnerability does not exist it will be added.
      +  470   +
            *
       471   -
            *
      -  472  
            * @param vuln the vulnerability to add to the database
      -  473   +  472  
            * @throws DatabaseException is thrown if the database
      +  473   +
            */
       474   -
            */
      -  475  
           public void updateVulnerability(Vulnerability vuln) throws DatabaseException {
      -  476  0
               PreparedStatement selectVulnerabilityId = null;
      -  477  0
               PreparedStatement deleteVulnerability = null;
      -  478  0
               PreparedStatement deleteReferences = null;
      -  479  0
               PreparedStatement deleteSoftware = null;
      -  480  0
               PreparedStatement updateVulnerability = null;
      -  481  0
               PreparedStatement insertVulnerability = null;
      -  482  0
               PreparedStatement insertReference = null;
      -  483  0
               PreparedStatement selectCpeId = null;
      -  484  0
               PreparedStatement insertCpe = null;
      -  485  0
               PreparedStatement insertSoftware = null;
      +  475  0
               PreparedStatement selectVulnerabilityId = null;
      +  476  0
               PreparedStatement deleteVulnerability = null;
      +  477  0
               PreparedStatement deleteReferences = null;
      +  478  0
               PreparedStatement deleteSoftware = null;
      +  479  0
               PreparedStatement updateVulnerability = null;
      +  480  0
               PreparedStatement insertVulnerability = null;
      +  481  0
               PreparedStatement insertReference = null;
      +  482  0
               PreparedStatement selectCpeId = null;
      +  483  0
               PreparedStatement insertCpe = null;
      +  484  0
               PreparedStatement insertSoftware = null;
      +  485   +
       
       486   -
       
      -  487  
               try {
      -  488  0
                   selectVulnerabilityId = getConnection().prepareStatement(statementBundle.getString("SELECT_VULNERABILITY_ID"));
      -  489  0
                   deleteVulnerability = getConnection().prepareStatement(statementBundle.getString("DELETE_VULNERABILITY"));
      -  490  0
                   deleteReferences = getConnection().prepareStatement(statementBundle.getString("DELETE_REFERENCE"));
      -  491  0
                   deleteSoftware = getConnection().prepareStatement(statementBundle.getString("DELETE_SOFTWARE"));
      -  492  0
                   updateVulnerability = getConnection().prepareStatement(statementBundle.getString("UPDATE_VULNERABILITY"));
      -  493  0
                   String ids[] = {"id"};
      -  494  0
                   insertVulnerability = getConnection().prepareStatement(statementBundle.getString("INSERT_VULNERABILITY"),
      +  487  0
                   selectVulnerabilityId = getConnection().prepareStatement(statementBundle.getString("SELECT_VULNERABILITY_ID"));
      +  488  0
                   deleteVulnerability = getConnection().prepareStatement(statementBundle.getString("DELETE_VULNERABILITY"));
      +  489  0
                   deleteReferences = getConnection().prepareStatement(statementBundle.getString("DELETE_REFERENCE"));
      +  490  0
                   deleteSoftware = getConnection().prepareStatement(statementBundle.getString("DELETE_SOFTWARE"));
      +  491  0
                   updateVulnerability = getConnection().prepareStatement(statementBundle.getString("UPDATE_VULNERABILITY"));
      +  492  0
                   final String[] ids = {"id"};
      +  493  0
                   insertVulnerability = getConnection().prepareStatement(statementBundle.getString("INSERT_VULNERABILITY"),
      +  494   +
                           //Statement.RETURN_GENERATED_KEYS);
       495   -
                           //Statement.RETURN_GENERATED_KEYS);
      -  496  
                           ids);
      -  497  0
                   insertReference = getConnection().prepareStatement(statementBundle.getString("INSERT_REFERENCE"));
      -  498  0
                   selectCpeId = getConnection().prepareStatement(statementBundle.getString("SELECT_CPE_ID"));
      -  499  0
                   insertCpe = getConnection().prepareStatement(statementBundle.getString("INSERT_CPE"),
      +  496  0
                   insertReference = getConnection().prepareStatement(statementBundle.getString("INSERT_REFERENCE"));
      +  497  0
                   selectCpeId = getConnection().prepareStatement(statementBundle.getString("SELECT_CPE_ID"));
      +  498  0
                   insertCpe = getConnection().prepareStatement(statementBundle.getString("INSERT_CPE"),
      +  499   +
                           //Statement.RETURN_GENERATED_KEYS);
       500   -
                           //Statement.RETURN_GENERATED_KEYS);
      -  501  
                           ids);
      -  502  0
                   insertSoftware = getConnection().prepareStatement(statementBundle.getString("INSERT_SOFTWARE"));
      -  503  0
                   int vulnerabilityId = 0;
      -  504  0
                   selectVulnerabilityId.setString(1, vuln.getName());
      -  505  0
                   ResultSet rs = selectVulnerabilityId.executeQuery();
      -  506  0
                   if (rs.next()) {
      -  507  0
                       vulnerabilityId = rs.getInt(1);
      -  508   +  501  0
                   insertSoftware = getConnection().prepareStatement(statementBundle.getString("INSERT_SOFTWARE"));
      +  502  0
                   int vulnerabilityId = 0;
      +  503  0
                   selectVulnerabilityId.setString(1, vuln.getName());
      +  504  0
                   ResultSet rs = selectVulnerabilityId.executeQuery();
      +  505  0
                   if (rs.next()) {
      +  506  0
                       vulnerabilityId = rs.getInt(1);
      +  507  
                       // first delete any existing vulnerability info. We don't know what was updated. yes, slower but atm easier.
      -  509  0
                       deleteReferences.setInt(1, vulnerabilityId);
      -  510  0
                       deleteReferences.execute();
      -  511  0
                       deleteSoftware.setInt(1, vulnerabilityId);
      -  512  0
                       deleteSoftware.execute();
      -  513   +  508  0
                       deleteReferences.setInt(1, vulnerabilityId);
      +  509  0
                       deleteReferences.execute();
      +  510  0
                       deleteSoftware.setInt(1, vulnerabilityId);
      +  511  0
                       deleteSoftware.execute();
      +  512  
                   }
      -  514  0
                   DBUtils.closeResultSet(rs);
      -  515  0
                   rs = null;
      -  516  0
                   if (vulnerabilityId != 0) {
      -  517  0
                       if (vuln.getDescription().contains("** REJECT **")) {
      -  518  0
                           deleteVulnerability.setInt(1, vulnerabilityId);
      -  519  0
                           deleteVulnerability.executeUpdate();
      -  520   +  513  0
                   DBUtils.closeResultSet(rs);
      +  514  0
                   rs = null;
      +  515  0
                   if (vulnerabilityId != 0) {
      +  516  0
                       if (vuln.getDescription().contains("** REJECT **")) {
      +  517  0
                           deleteVulnerability.setInt(1, vulnerabilityId);
      +  518  0
                           deleteVulnerability.executeUpdate();
      +  519  
                       } else {
      -  521  0
                           updateVulnerability.setString(1, vuln.getDescription());
      -  522  0
                           updateVulnerability.setString(2, vuln.getCwe());
      -  523  0
                           updateVulnerability.setFloat(3, vuln.getCvssScore());
      -  524  0
                           updateVulnerability.setString(4, vuln.getCvssAccessVector());
      -  525  0
                           updateVulnerability.setString(5, vuln.getCvssAccessComplexity());
      -  526  0
                           updateVulnerability.setString(6, vuln.getCvssAuthentication());
      -  527  0
                           updateVulnerability.setString(7, vuln.getCvssConfidentialityImpact());
      -  528  0
                           updateVulnerability.setString(8, vuln.getCvssIntegrityImpact());
      -  529  0
                           updateVulnerability.setString(9, vuln.getCvssAvailabilityImpact());
      -  530  0
                           updateVulnerability.setInt(10, vulnerabilityId);
      -  531  0
                           updateVulnerability.executeUpdate();
      +  520  0
                           updateVulnerability.setString(1, vuln.getDescription());
      +  521  0
                           updateVulnerability.setString(2, vuln.getCwe());
      +  522  0
                           updateVulnerability.setFloat(3, vuln.getCvssScore());
      +  523  0
                           updateVulnerability.setString(4, vuln.getCvssAccessVector());
      +  524  0
                           updateVulnerability.setString(5, vuln.getCvssAccessComplexity());
      +  525  0
                           updateVulnerability.setString(6, vuln.getCvssAuthentication());
      +  526  0
                           updateVulnerability.setString(7, vuln.getCvssConfidentialityImpact());
      +  527  0
                           updateVulnerability.setString(8, vuln.getCvssIntegrityImpact());
      +  528  0
                           updateVulnerability.setString(9, vuln.getCvssAvailabilityImpact());
      +  529  0
                           updateVulnerability.setInt(10, vulnerabilityId);
      +  530  0
                           updateVulnerability.executeUpdate();
      +  531   +
                       }
       532   -
                       }
      -  533  
                   } else {
      -  534  0
                       insertVulnerability.setString(1, vuln.getName());
      -  535  0
                       insertVulnerability.setString(2, vuln.getDescription());
      -  536  0
                       insertVulnerability.setString(3, vuln.getCwe());
      -  537  0
                       insertVulnerability.setFloat(4, vuln.getCvssScore());
      -  538  0
                       insertVulnerability.setString(5, vuln.getCvssAccessVector());
      -  539  0
                       insertVulnerability.setString(6, vuln.getCvssAccessComplexity());
      -  540  0
                       insertVulnerability.setString(7, vuln.getCvssAuthentication());
      -  541  0
                       insertVulnerability.setString(8, vuln.getCvssConfidentialityImpact());
      -  542  0
                       insertVulnerability.setString(9, vuln.getCvssIntegrityImpact());
      -  543  0
                       insertVulnerability.setString(10, vuln.getCvssAvailabilityImpact());
      -  544  0
                       insertVulnerability.execute();
      -  545   +  533  0
                       insertVulnerability.setString(1, vuln.getName());
      +  534  0
                       insertVulnerability.setString(2, vuln.getDescription());
      +  535  0
                       insertVulnerability.setString(3, vuln.getCwe());
      +  536  0
                       insertVulnerability.setFloat(4, vuln.getCvssScore());
      +  537  0
                       insertVulnerability.setString(5, vuln.getCvssAccessVector());
      +  538  0
                       insertVulnerability.setString(6, vuln.getCvssAccessComplexity());
      +  539  0
                       insertVulnerability.setString(7, vuln.getCvssAuthentication());
      +  540  0
                       insertVulnerability.setString(8, vuln.getCvssConfidentialityImpact());
      +  541  0
                       insertVulnerability.setString(9, vuln.getCvssIntegrityImpact());
      +  542  0
                       insertVulnerability.setString(10, vuln.getCvssAvailabilityImpact());
      +  543  0
                       insertVulnerability.execute();
      +  544  
                       try {
      -  546  0
                           rs = insertVulnerability.getGeneratedKeys();
      -  547  0
                           rs.next();
      -  548  0
                           vulnerabilityId = rs.getInt(1);
      -  549  0
                       } catch (SQLException ex) {
      -  550  0
                           final String msg = String.format("Unable to retrieve id for new vulnerability for '%s'", vuln.getName());
      -  551  0
                           throw new DatabaseException(msg, ex);
      -  552   +  545  0
                           rs = insertVulnerability.getGeneratedKeys();
      +  546  0
                           rs.next();
      +  547  0
                           vulnerabilityId = rs.getInt(1);
      +  548  0
                       } catch (SQLException ex) {
      +  549  0
                           final String msg = String.format("Unable to retrieve id for new vulnerability for '%s'", vuln.getName());
      +  550  0
                           throw new DatabaseException(msg, ex);
      +  551  
                       } finally {
      -  553  0
                           DBUtils.closeResultSet(rs);
      -  554  0
                           rs = null;
      -  555  0
                       }
      -  556   +  552  0
                           DBUtils.closeResultSet(rs);
      +  553  0
                           rs = null;
      +  554  0
                       }
      +  555  
                   }
      -  557  0
                   insertReference.setInt(1, vulnerabilityId);
      -  558  0
                   for (Reference r : vuln.getReferences()) {
      -  559  0
                       insertReference.setString(2, r.getName());
      -  560  0
                       insertReference.setString(3, r.getUrl());
      -  561  0
                       insertReference.setString(4, r.getSource());
      -  562  0
                       insertReference.execute();
      -  563  0
                   }
      -  564  0
                   for (VulnerableSoftware s : vuln.getVulnerableSoftware()) {
      -  565  0
                       int cpeProductId = 0;
      -  566  0
                       selectCpeId.setString(1, s.getName());
      -  567   +  556  0
                   insertReference.setInt(1, vulnerabilityId);
      +  557  0
                   for (Reference r : vuln.getReferences()) {
      +  558  0
                       insertReference.setString(2, r.getName());
      +  559  0
                       insertReference.setString(3, r.getUrl());
      +  560  0
                       insertReference.setString(4, r.getSource());
      +  561  0
                       insertReference.execute();
      +  562  0
                   }
      +  563  0
                   for (VulnerableSoftware s : vuln.getVulnerableSoftware()) {
      +  564  0
                       int cpeProductId = 0;
      +  565  0
                       selectCpeId.setString(1, s.getName());
      +  566  
                       try {
      -  568  0
                           rs = selectCpeId.executeQuery();
      -  569  0
                           if (rs.next()) {
      -  570  0
                               cpeProductId = rs.getInt(1);
      -  571   +  567  0
                           rs = selectCpeId.executeQuery();
      +  568  0
                           if (rs.next()) {
      +  569  0
                               cpeProductId = rs.getInt(1);
      +  570  
                           }
      -  572  0
                       } catch (SQLException ex) {
      -  573  0
                           throw new DatabaseException("Unable to get primary key for new cpe: " + s.getName(), ex);
      -  574   +  571  0
                       } catch (SQLException ex) {
      +  572  0
                           throw new DatabaseException("Unable to get primary key for new cpe: " + s.getName(), ex);
      +  573  
                       } finally {
      -  575  0
                           DBUtils.closeResultSet(rs);
      -  576  0
                           rs = null;
      -  577  0
                       }
      -  578   +  574  0
                           DBUtils.closeResultSet(rs);
      +  575  0
                           rs = null;
      +  576  0
                       }
      +  577  
       
      -  579  0
                       if (cpeProductId == 0) {
      -  580  0
                           insertCpe.setString(1, s.getName());
      -  581  0
                           insertCpe.setString(2, s.getVendor());
      -  582  0
                           insertCpe.setString(3, s.getProduct());
      -  583  0
                           insertCpe.executeUpdate();
      -  584  0
                           cpeProductId = DBUtils.getGeneratedKey(insertCpe);
      -  585   +  578  0
                       if (cpeProductId == 0) {
      +  579  0
                           insertCpe.setString(1, s.getName());
      +  580  0
                           insertCpe.setString(2, s.getVendor());
      +  581  0
                           insertCpe.setString(3, s.getProduct());
      +  582  0
                           insertCpe.executeUpdate();
      +  583  0
                           cpeProductId = DBUtils.getGeneratedKey(insertCpe);
      +  584   +
                       }
      +  585  0
                       if (cpeProductId == 0) {
      +  586  0
                           throw new DatabaseException("Unable to retrieve cpeProductId - no data returned");
      +  587  
                       }
      -  586  0
                       if (cpeProductId == 0) {
      -  587  0
                           throw new DatabaseException("Unable to retrieve cpeProductId - no data returned");
       588   -
                       }
      -  589  
       
      -  590  0
                       insertSoftware.setInt(1, vulnerabilityId);
      -  591  0
                       insertSoftware.setInt(2, cpeProductId);
      -  592  0
                       if (s.getPreviousVersion() == null) {
      -  593  0
                           insertSoftware.setNull(3, java.sql.Types.VARCHAR);
      -  594   +  589  0
                       insertSoftware.setInt(1, vulnerabilityId);
      +  590  0
                       insertSoftware.setInt(2, cpeProductId);
      +  591  0
                       if (s.getPreviousVersion() == null) {
      +  592  0
                           insertSoftware.setNull(3, java.sql.Types.VARCHAR);
      +  593  
                       } else {
      -  595  0
                           insertSoftware.setString(3, s.getPreviousVersion());
      -  596   +  594  0
                           insertSoftware.setString(3, s.getPreviousVersion());
      +  595  
                       }
      -  597  0
                       insertSoftware.execute();
      -  598  0
                   }
      -  599   +  596  0
                       insertSoftware.execute();
      +  597  0
                   }
      +  598  
       
      -  600  0
               } catch (SQLException ex) {
      -  601  0
                   final String msg = String.format("Error updating '%s'", vuln.getName());
      -  602  0
                   LOGGER.debug("", ex);
      -  603  0
                   throw new DatabaseException(msg, ex);
      -  604   +  599  0
               } catch (SQLException ex) {
      +  600  0
                   final String msg = String.format("Error updating '%s'", vuln.getName());
      +  601  0
                   LOGGER.debug("", ex);
      +  602  0
                   throw new DatabaseException(msg, ex);
      +  603  
               } finally {
      -  605  0
                   DBUtils.closeStatement(selectVulnerabilityId);
      -  606  0
                   DBUtils.closeStatement(deleteReferences);
      -  607  0
                   DBUtils.closeStatement(deleteSoftware);
      -  608  0
                   DBUtils.closeStatement(updateVulnerability);
      -  609  0
                   DBUtils.closeStatement(deleteVulnerability);
      -  610  0
                   DBUtils.closeStatement(insertVulnerability);
      -  611  0
                   DBUtils.closeStatement(insertReference);
      -  612  0
                   DBUtils.closeStatement(selectCpeId);
      -  613  0
                   DBUtils.closeStatement(insertCpe);
      -  614  0
                   DBUtils.closeStatement(insertSoftware);
      -  615  0
               }
      -  616  0
           }
      +  604  0
                   DBUtils.closeStatement(selectVulnerabilityId);
      +  605  0
                   DBUtils.closeStatement(deleteReferences);
      +  606  0
                   DBUtils.closeStatement(deleteSoftware);
      +  607  0
                   DBUtils.closeStatement(updateVulnerability);
      +  608  0
                   DBUtils.closeStatement(deleteVulnerability);
      +  609  0
                   DBUtils.closeStatement(insertVulnerability);
      +  610  0
                   DBUtils.closeStatement(insertReference);
      +  611  0
                   DBUtils.closeStatement(selectCpeId);
      +  612  0
                   DBUtils.closeStatement(insertCpe);
      +  613  0
                   DBUtils.closeStatement(insertSoftware);
      +  614  0
               }
      +  615  0
           }
      +  616   +
       
       617   -
       
      +
           /**
       618   -
           /**
      -  619  
            * Checks to see if data exists so that analysis can be performed.
      +  619   +
            *
       620   -
            *
      -  621  
            * @return <code>true</code> if data exists; otherwise <code>false</code>
      +  621   +
            */
       622   -
            */
      -  623  
           public boolean dataExists() {
      -  624  8
               Statement cs = null;
      -  625  8
               ResultSet rs = null;
      -  626   +  623  1
               Statement cs = null;
      +  624  1
               ResultSet rs = null;
      +  625  
               try {
      -  627  8
                   cs = conn.createStatement();
      -  628  8
                   rs = cs.executeQuery("SELECT COUNT(*) records FROM cpeEntry");
      -  629  8
                   if (rs.next()) {
      -  630  8
                       if (rs.getInt(1) > 0) {
      -  631  8
                           return true;
      +  626  1
                   cs = conn.createStatement();
      +  627  1
                   rs = cs.executeQuery("SELECT COUNT(*) records FROM cpeEntry");
      +  628  1
                   if (rs.next()) {
      +  629  1
                       if (rs.getInt(1) > 0) {
      +  630  1
                           return true;
      +  631   +
                       }
       632   -
                       }
      -  633  
                   }
      -  634  0
               } catch (SQLException ex) {
      -  635   +  633  0
               } catch (SQLException ex) {
      +  634  
                   String dd;
      -  636   +  635  
                   try {
      -  637  0
                       dd = Settings.getDataDirectory().getAbsolutePath();
      -  638  0
                   } catch (IOException ex1) {
      -  639  0
                       dd = Settings.getString(Settings.KEYS.DATA_DIRECTORY);
      -  640  0
                   }
      -  641  0
                   LOGGER.error("Unable to access the local database.\n\nEnsure that '{}' is a writable directory. "
      -  642   +  636  0
                       dd = Settings.getDataDirectory().getAbsolutePath();
      +  637  0
                   } catch (IOException ex1) {
      +  638  0
                       dd = Settings.getString(Settings.KEYS.DATA_DIRECTORY);
      +  639  0
                   }
      +  640  0
                   LOGGER.error("Unable to access the local database.\n\nEnsure that '{}' is a writable directory. "
      +  641  
                           + "If the problem persist try deleting the files in '{}' and running {} again. If the problem continues, please "
      -  643   +  642  
                           + "create a log file (see documentation at http://jeremylong.github.io/DependencyCheck/) and open a ticket at "
      -  644   +  643  
                           + "https://github.com/jeremylong/DependencyCheck/issues and include the log file.\n\n",
      -  645   +  644  
                           dd, dd, Settings.getString(Settings.KEYS.APPLICATION_VAME));
      -  646  0
                   LOGGER.debug("", ex);
      -  647   +  645  0
                   LOGGER.debug("", ex);
      +  646  
               } finally {
      -  648  8
                   DBUtils.closeResultSet(rs);
      -  649  8
                   DBUtils.closeStatement(cs);
      -  650  0
               }
      -  651  0
               return false;
      +  647  1
                   DBUtils.closeResultSet(rs);
      +  648  1
                   DBUtils.closeStatement(cs);
      +  649  0
               }
      +  650  0
               return false;
      +  651   +
           }
       652   -
           }
      +
       
       653   -
       
      +
           /**
       654   -
           /**
      -  655  
            * It is possible that orphaned rows may be generated during database updates. This should be called after all updates have
      -  656   +  655  
            * been completed to ensure orphan entries are removed.
      +  656   +
            */
       657   -
            */
      -  658  
           public void cleanupDatabase() {
      -  659  0
               PreparedStatement ps = null;
      -  660   +  658  0
               PreparedStatement ps = null;
      +  659  
               try {
      -  661  0
                   ps = getConnection().prepareStatement(statementBundle.getString("CLEANUP_ORPHANS"));
      -  662  0
                   if (ps != null) {
      -  663  0
                       ps.executeUpdate();
      -  664   +  660  0
                   ps = getConnection().prepareStatement(statementBundle.getString("CLEANUP_ORPHANS"));
      +  661  0
                   if (ps != null) {
      +  662  0
                       ps.executeUpdate();
      +  663  
                   }
      -  665  0
               } catch (SQLException ex) {
      -  666  0
                   LOGGER.error("An unexpected SQL Exception occurred; please see the verbose log for more details.");
      -  667  0
                   LOGGER.debug("", ex);
      -  668   +  664  0
               } catch (SQLException ex) {
      +  665  0
                   LOGGER.error("An unexpected SQL Exception occurred; please see the verbose log for more details.");
      +  666  0
                   LOGGER.debug("", ex);
      +  667  
               } finally {
      -  669  0
                   DBUtils.closeStatement(ps);
      -  670  0
               }
      -  671  0
           }
      +  668  0
                   DBUtils.closeStatement(ps);
      +  669  0
               }
      +  670  0
           }
      +  671   +
       
       672   -
       
      +
           /**
       673   -
           /**
      -  674  
            * Determines if the given identifiedVersion is affected by the given cpeId and previous version flag. A non-null, non-empty
      -  675   +  674  
            * string passed to the previous version argument indicates that all previous versions are affected.
      +  675   +
            *
       676   -
            *
      -  677  
            * @param vendor the vendor of the dependency being analyzed
      -  678   +  677  
            * @param product the product name of the dependency being analyzed
      -  679   +  678  
            * @param vulnerableSoftware a map of the vulnerable software with a boolean indicating if all previous versions are affected
      -  680   +  679  
            * @param identifiedVersion the identified version of the dependency being analyzed
      -  681   +  680  
            * @return true if the identified version is affected, otherwise false
      +  681   +
            */
       682   -
            */
      -  683  
           Entry<String, Boolean> getMatchingSoftware(Map<String, Boolean> vulnerableSoftware, String vendor, String product,
      -  684   +  683  
                   DependencyVersion identifiedVersion) {
      -  685   +  684  
       
      -  686  104
               final boolean isVersionTwoADifferentProduct = "apache".equals(vendor) && "struts".equals(product);
      -  687   +  685  13
               final boolean isVersionTwoADifferentProduct = "apache".equals(vendor) && "struts".equals(product);
      +  686  
       
      -  688  104
               final Set<String> majorVersionsAffectingAllPrevious = new HashSet<String>();
      -  689  104
               final boolean matchesAnyPrevious = identifiedVersion == null || "-".equals(identifiedVersion.toString());
      -  690  104
               String majorVersionMatch = null;
      -  691  104
               for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) {
      -  692  2232
                   final DependencyVersion v = parseDependencyVersion(entry.getKey());
      -  693  2232
                   if (v == null || "-".equals(v.toString())) { //all versions
      -  694  0
                       return entry;
      -  695   +  687  13
               final Set<String> majorVersionsAffectingAllPrevious = new HashSet<String>();
      +  688  13
               final boolean matchesAnyPrevious = identifiedVersion == null || "-".equals(identifiedVersion.toString());
      +  689  13
               String majorVersionMatch = null;
      +  690  13
               for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) {
      +  691  279
                   final DependencyVersion v = parseDependencyVersion(entry.getKey());
      +  692  279
                   if (v == null || "-".equals(v.toString())) { //all versions
      +  693  0
                       return entry;
      +  694  
                   }
      -  696  2232
                   if (entry.getValue()) {
      -  697  64
                       if (matchesAnyPrevious) {
      -  698  0
                           return entry;
      -  699   +  695  279
                   if (entry.getValue()) {
      +  696  8
                       if (matchesAnyPrevious) {
      +  697  0
                           return entry;
      +  698  
                       }
      -  700  64
                       if (identifiedVersion != null && identifiedVersion.getVersionParts().get(0).equals(v.getVersionParts().get(0))) {
      -  701  48
                           majorVersionMatch = v.getVersionParts().get(0);
      -  702   +  699  8
                       if (identifiedVersion != null && identifiedVersion.getVersionParts().get(0).equals(v.getVersionParts().get(0))) {
      +  700  6
                           majorVersionMatch = v.getVersionParts().get(0);
      +  701  
                       }
      -  703  64
                       majorVersionsAffectingAllPrevious.add(v.getVersionParts().get(0));
      -  704   +  702  8
                       majorVersionsAffectingAllPrevious.add(v.getVersionParts().get(0));
      +  703  
                   }
      -  705  2232
               }
      -  706  104
               if (matchesAnyPrevious) {
      -  707  0
                   return null;
      +  704  279
               }
      +  705  13
               if (matchesAnyPrevious) {
      +  706  0
                   return null;
      +  707   +
               }
       708   -
               }
      -  709  
       
      -  710  104
               final boolean canSkipVersions = majorVersionMatch != null && majorVersionsAffectingAllPrevious.size() > 1;
      -  711   +  709  13
               final boolean canSkipVersions = majorVersionMatch != null && majorVersionsAffectingAllPrevious.size() > 1;
      +  710  
               //yes, we are iterating over this twice. The first time we are skipping versions those that affect all versions
      -  712   +  711  
               //then later we process those that affect all versions. This could be done with sorting...
      -  713  104
               for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) {
      -  714  1856
                   if (!entry.getValue()) {
      -  715  1800
                       final DependencyVersion v = parseDependencyVersion(entry.getKey());
      -  716   +  712  13
               for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) {
      +  713  232
                   if (!entry.getValue()) {
      +  714  225
                       final DependencyVersion v = parseDependencyVersion(entry.getKey());
      +  715  
                       //this can't dereference a null 'majorVersionMatch' as canSkipVersions accounts for this.
      -  717  1800
                       if (canSkipVersions && !majorVersionMatch.equals(v.getVersionParts().get(0))) {
      -  718  80
                           continue;
      +  716  225
                       if (canSkipVersions && !majorVersionMatch.equals(v.getVersionParts().get(0))) {
      +  717  10
                           continue;
      +  718   +
                       }
       719   -
                       }
      +
                       //this can't dereference a null 'identifiedVersion' because if it was null we would have exited
       720   -
                       //this can't dereference a null 'identifiedVersion' because if it was null we would have exited
      -  721  
                       //in the above loop or just after loop (if matchesAnyPrevious return null).
      -  722  1720
                       if (identifiedVersion.equals(v)) {
      -  723  64
                           return entry;
      +  721  215
                       if (identifiedVersion.equals(v)) {
      +  722  8
                           return entry;
      +  723   +
                       }
       724   -
                       }
      -  725  
                   }
      -  726  1712
               }
      -  727  40
               for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) {
      -  728  448
                   if (entry.getValue()) {
      -  729  0
                       final DependencyVersion v = parseDependencyVersion(entry.getKey());
      -  730   +  725  214
               }
      +  726  5
               for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) {
      +  727  56
                   if (entry.getValue()) {
      +  728  0
                       final DependencyVersion v = parseDependencyVersion(entry.getKey());
      +  729  
                       //this can't dereference a null 'majorVersionMatch' as canSkipVersions accounts for this.
      -  731  0
                       if (canSkipVersions && !majorVersionMatch.equals(v.getVersionParts().get(0))) {
      -  732  0
                           continue;
      +  730  0
                       if (canSkipVersions && !majorVersionMatch.equals(v.getVersionParts().get(0))) {
      +  731  0
                           continue;
      +  732   +
                       }
       733   -
                       }
      -  734  
                       //this can't dereference a null 'identifiedVersion' because if it was null we would have exited
      -  735   +  734  
                       //in the above loop or just after loop (if matchesAnyPrevious return null).
      -  736  0
                       if (entry.getValue() && identifiedVersion.compareTo(v) <= 0) {
      -  737  0
                           if (!(isVersionTwoADifferentProduct && !identifiedVersion.getVersionParts().get(0).equals(v.getVersionParts().get(0)))) {
      -  738  0
                               return entry;
      -  739   +  735  0
                       if (entry.getValue() && identifiedVersion.compareTo(v) <= 0) {
      +  736  0
                           if (!(isVersionTwoADifferentProduct && !identifiedVersion.getVersionParts().get(0).equals(v.getVersionParts().get(0)))) {
      +  737  0
                               return entry;
      +  738  
                           }
      -  740   +  739  
                       }
      -  741   +  740  
                   }
      -  742  448
               }
      -  743  40
               return null;
      +  741  56
               }
      +  742  5
               return null;
      +  743   +
           }
       744   -
           }
      +
       
       745   -
       
      +
           /**
       746   -
           /**
      -  747  
            * Parses the version (including revision) from a CPE identifier. If no version is identified then a '-' is returned.
      +  747   +
            *
       748   -
            *
      -  749  
            * @param cpeStr a cpe identifier
      +  749   +
            * @return a dependency version
       750   -
            * @return a dependency version
      +
            */
       751   -
            */
      -  752  
           private DependencyVersion parseDependencyVersion(String cpeStr) {
      -  753  4032
               final VulnerableSoftware cpe = new VulnerableSoftware();
      -  754   +  752  504
               final VulnerableSoftware cpe = new VulnerableSoftware();
      +  753  
               try {
      -  755  4032
                   cpe.parseName(cpeStr);
      -  756  0
               } catch (UnsupportedEncodingException ex) {
      -  757   +  754  504
                   cpe.parseName(cpeStr);
      +  755  0
               } catch (UnsupportedEncodingException ex) {
      +  756  
                   //never going to happen.
      -  758  0
                   LOGGER.trace("", ex);
      -  759  4032
               }
      -  760  4032
               return parseDependencyVersion(cpe);
      +  757  0
                   LOGGER.trace("", ex);
      +  758  504
               }
      +  759  504
               return parseDependencyVersion(cpe);
      +  760   +
           }
       761   -
           }
      +
       
       762   -
       
      +
           /**
       763   -
           /**
      -  764  
            * Takes a CPE and parses out the version number. If no version is identified then a '-' is returned.
      +  764   +
            *
       765   -
            *
      -  766  
            * @param cpe a cpe object
      -  767   +  766  
            * @return a dependency version
      +  767   +
            */
       768   -
            */
      -  769  
           private DependencyVersion parseDependencyVersion(VulnerableSoftware cpe) {
      -  770   -
               DependencyVersion cpeVersion;
      -  771  4056
               if (cpe.getVersion() != null && !cpe.getVersion().isEmpty()) {
      -  772   -
                   String versionText;
      -  773  4056
                   if (cpe.getUpdate() != null && !cpe.getUpdate().isEmpty()) {
      -  774  1040
                       versionText = String.format("%s.%s", cpe.getVersion(), cpe.getUpdate());
      -  775   +  769   +
               final DependencyVersion cpeVersion;
      +  770  507
               if (cpe.getVersion() != null && !cpe.getVersion().isEmpty()) {
      +  771   +
                   final String versionText;
      +  772  507
                   if (cpe.getUpdate() != null && !cpe.getUpdate().isEmpty()) {
      +  773  130
                       versionText = String.format("%s.%s", cpe.getVersion(), cpe.getUpdate());
      +  774  
                   } else {
      -  776  3016
                       versionText = cpe.getVersion();
      -  777   +  775  377
                       versionText = cpe.getVersion();
      +  776  
                   }
      -  778  4056
                   cpeVersion = DependencyVersionUtil.parseVersion(versionText);
      -  779  4056
               } else {
      -  780  0
                   cpeVersion = new DependencyVersion("-");
      -  781   +  777  507
                   cpeVersion = DependencyVersionUtil.parseVersion(versionText);
      +  778  507
               } else {
      +  779  0
                   cpeVersion = new DependencyVersion("-");
      +  780  
               }
      -  782  4056
               return cpeVersion;
      -  783   +  781  507
               return cpeVersion;
      +  782  
           }
      +  783   +
       
       784   -
       
      +
           /**
       785   -
           /**
      +
            * This method is only referenced in unused code.
       786   -
            * Deletes unused dictionary entries from the database.
      -  787   -
            */
      -  788   -
           public void deleteUnusedCpe() {
      -  789  0
               CallableStatement cs = null;
      -  790   -
               try {
      -  791  0
                   cs = getConnection().prepareCall(statementBundle.getString("DELETE_UNUSED_DICT_CPE"));
      -  792  0
                   cs.executeUpdate();
      -  793  0
               } catch (SQLException ex) {
      -  794  0
                   LOGGER.error("Unable to delete CPE dictionary entries", ex);
      -  795   -
               } finally {
      -  796  0
                   DBUtils.closeStatement(cs);
      -  797  0
               }
      -  798  0
           }
      -  799   -
       
      -  800   -
           /**
      -  801   -
            * Merges CPE entries into the database.
      -  802  
            *
      -  803   -
            * @param cpe the CPE identifier
      -  804   -
            * @param vendor the CPE vendor
      -  805   -
            * @param product the CPE product
      -  806   +  787   +
            * Deletes unused dictionary entries from the database.
      +  788  
            */
      -  807   -
           public void addCpe(String cpe, String vendor, String product) {
      -  808  0
               PreparedStatement ps = null;
      -  809   +  789   +
           public void deleteUnusedCpe() {
      +  790  0
               CallableStatement cs = null;
      +  791  
               try {
      -  810  0
                   ps = getConnection().prepareCall(statementBundle.getString("ADD_DICT_CPE"));
      -  811  0
                   ps.setString(1, cpe);
      -  812  0
                   ps.setString(2, vendor);
      -  813  0
                   ps.setString(3, product);
      -  814  0
                   ps.executeUpdate();
      -  815  0
               } catch (SQLException ex) {
      -  816  0
                   LOGGER.error("Unable to add CPE dictionary entry", ex);
      -  817   +  792  0
                   cs = getConnection().prepareCall(statementBundle.getString("DELETE_UNUSED_DICT_CPE"));
      +  793  0
                   cs.executeUpdate();
      +  794  0
               } catch (SQLException ex) {
      +  795  0
                   LOGGER.error("Unable to delete CPE dictionary entries", ex);
      +  796  
               } finally {
      -  818  0
                   DBUtils.closeStatement(ps);
      -  819  0
               }
      -  820  0
           }
      -  821   +  797  0
                   DBUtils.closeStatement(cs);
      +  798  0
               }
      +  799  0
           }
      +  800   +
       
      +  801   +
           /**
      +  802   +
            * This method is only referenced in unused code and will likely break on MySQL if ever used due to the MERGE statement.
      +  803   +
            *
      +  804   +
            * Merges CPE entries into the database.
      +  805   +
            *
      +  806   +
            * @param cpe the CPE identifier
      +  807   +
            * @param vendor the CPE vendor
      +  808   +
            * @param product the CPE product
      +  809   +
            */
      +  810   +
           public void addCpe(String cpe, String vendor, String product) {
      +  811  0
               PreparedStatement ps = null;
      +  812   +
               try {
      +  813  0
                   ps = getConnection().prepareCall(statementBundle.getString("ADD_DICT_CPE"));
      +  814  0
                   ps.setString(1, cpe);
      +  815  0
                   ps.setString(2, vendor);
      +  816  0
                   ps.setString(3, product);
      +  817  0
                   ps.executeUpdate();
      +  818  0
               } catch (SQLException ex) {
      +  819  0
                   LOGGER.error("Unable to add CPE dictionary entry", ex);
      +  820   +
               } finally {
      +  821  0
                   DBUtils.closeStatement(ps);
      +  822  0
               }
      +  823  0
           }
      +  824  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DatabaseException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DatabaseException.html index 2efff5573..1ee43bc68 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DatabaseException.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DatabaseException.html @@ -131,6 +131,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DatabaseProperties.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DatabaseProperties.html index 5f56c10d2..46d1a5ac8 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DatabaseProperties.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DatabaseProperties.html @@ -99,7 +99,7 @@
            * The Logger.
       41  
            */
      -  42  8
           private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseProperties.class);
      +  42  1
           private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseProperties.class);
       43  
           /**
       44   @@ -174,10 +174,10 @@
            * @param cveDB the database object holding the properties
       79  
            */
      -  80  48
           DatabaseProperties(CveDB cveDB) {
      -  81  48
               this.cveDB = cveDB;
      -  82  48
               loadProperties();
      -  83  48
           }
      +  80  6
           DatabaseProperties(CveDB cveDB) {
      +  81  6
               this.cveDB = cveDB;
      +  82  6
               loadProperties();
      +  83  6
           }
       84  
       
       85   @@ -188,8 +188,8 @@
            */
       88  
           private void loadProperties() {
      -  89  48
               this.properties = cveDB.getProperties();
      -  90  48
           }
      +  89  6
               this.properties = cveDB.getProperties();
      +  90  6
           }
       91  
       
       92   @@ -306,7 +306,7 @@
            */
       153  
           public Properties getProperties() {
      -  154  8
               return properties;
      +  154  1
               return properties;
       155  
           }
       156   @@ -356,6 +356,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DriverLoadException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DriverLoadException.html index d671aefac..da84181b3 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DriverLoadException.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DriverLoadException.html @@ -125,12 +125,12 @@
            */
       56  
           public DriverLoadException(String msg, Throwable ex) {
      -  57  24
               super(msg, ex);
      -  58  24
           }
      +  57  3
               super(msg, ex);
      +  58  3
           }
       59  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DriverLoader.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DriverLoader.html index becb13e04..062de7a79 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DriverLoader.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DriverLoader.html @@ -106,7 +106,7 @@
            * The logger.
       44  
            */
      -  45  8
           private static final Logger LOGGER = LoggerFactory.getLogger(DriverLoader.class);
      +  45  1
           private static final Logger LOGGER = LoggerFactory.getLogger(DriverLoader.class);
       46  
       
       47   @@ -135,8 +135,8 @@
            */
       60  
           public static Driver load(String className) throws DriverLoadException {
      -  61  24
               final ClassLoader loader = DriverLoader.class.getClassLoader(); //ClassLoader.getSystemClassLoader();
      -  62  24
               return load(className, loader);
      +  61  3
               final ClassLoader loader = DriverLoader.class.getClassLoader(); //ClassLoader.getSystemClassLoader();
      +  62  3
               return load(className, loader);
       63  
           }
       64   @@ -169,54 +169,54 @@
            */
       78  
           public static Driver load(String className, String pathToDriver) throws DriverLoadException {
      -  79  32
               final URLClassLoader parent = (URLClassLoader) ClassLoader.getSystemClassLoader();
      -  80  32
               final List<URL> urls = new ArrayList<URL>();
      -  81  32
               final String[] paths = pathToDriver.split(File.pathSeparator);
      -  82  72
               for (String path : paths) {
      -  83  40
                   final File file = new File(path);
      -  84  40
                   if (file.isDirectory()) {
      -  85  16
                       final File[] files = file.listFiles();
      +  79  4
               final URLClassLoader parent = (URLClassLoader) ClassLoader.getSystemClassLoader();
      +  80  4
               final List<URL> urls = new ArrayList<URL>();
      +  81  4
               final String[] paths = pathToDriver.split(File.pathSeparator);
      +  82  9
               for (String path : paths) {
      +  83  5
                   final File file = new File(path);
      +  84  5
                   if (file.isDirectory()) {
      +  85  2
                       final File[] files = file.listFiles();
       86  
       
      -  87  264
                       for (File f : files) {
      +  87  37
                       for (File f : files) {
       88  
                           try {
      -  89  248
                               urls.add(f.toURI().toURL());
      +  89  35
                               urls.add(f.toURI().toURL());
       90  0
                           } catch (MalformedURLException ex) {
       91  0
                               LOGGER.debug("Unable to load database driver '{}'; invalid path provided '{}'",
       92  
                                   className, f.getAbsoluteFile(), ex);
       93  0
                               throw new DriverLoadException("Unable to load database driver. Invalid path provided", ex);
      -  94  248
                           }
      +  94  35
                           }
       95  
                       }
      -  96  16
                   } else if (file.exists()) {
      +  96  2
                   } else if (file.exists()) {
       97  
                       try {
      -  98  16
                           urls.add(file.toURI().toURL());
      +  98  2
                           urls.add(file.toURI().toURL());
       99  0
                       } catch (MalformedURLException ex) {
       100  0
                           LOGGER.debug("Unable to load database driver '{}'; invalid path provided '{}'",
       101  
                               className, file.getAbsoluteFile(), ex);
       102  0
                           throw new DriverLoadException("Unable to load database driver. Invalid path provided", ex);
      -  103  16
                       }
      +  103  2
                       }
       104  
                   }
       105  
               }
      -  106  64
               final URLClassLoader loader = AccessController.doPrivileged(new PrivilegedAction<URLClassLoader>() {
      +  106  8
               final URLClassLoader loader = AccessController.doPrivileged(new PrivilegedAction<URLClassLoader>() {
       107  
                   @Override
       108  
                   public URLClassLoader run() {
      -  109  32
                       return new URLClassLoader(urls.toArray(new URL[urls.size()]), parent);
      +  109  4
                       return new URLClassLoader(urls.toArray(new URL[urls.size()]), parent);
       110  
                   }
       111  
               });
       112  
       
      -  113  32
               return load(className, loader);
      +  113  4
               return load(className, loader);
       114  
           }
       115   @@ -241,19 +241,19 @@
           private static Driver load(String className, ClassLoader loader) throws DriverLoadException {
       125  
               try {
      -  126  56
                   final Class c = Class.forName(className, true, loader);
      +  126  7
                   final Class c = Class.forName(className, true, loader);
       127  
                   //final Class c = loader.loadClass(className);
      -  128  32
                   final Driver driver = (Driver) c.newInstance();
      -  129  32
                   final Driver shim = new DriverShim(driver);
      +  128  4
                   final Driver driver = (Driver) c.newInstance();
      +  129  4
                   final Driver shim = new DriverShim(driver);
       130  
                   //using the DriverShim to get around the fact that the DriverManager won't register a driver not in the base class path
      -  131  32
                   DriverManager.registerDriver(shim);
      -  132  32
                   return shim;
      -  133  24
               } catch (ClassNotFoundException ex) {
      -  134  24
                   final String msg = String.format("Unable to load database driver '%s'", className);
      -  135  24
                   LOGGER.debug(msg, ex);
      -  136  24
                   throw new DriverLoadException(msg, ex);
      +  131  4
                   DriverManager.registerDriver(shim);
      +  132  4
                   return shim;
      +  133  3
               } catch (ClassNotFoundException ex) {
      +  134  3
                   final String msg = String.format("Unable to load database driver '%s'", className);
      +  135  3
                   LOGGER.debug(msg, ex);
      +  136  3
                   throw new DriverLoadException(msg, ex);
       137  0
               } catch (InstantiationException ex) {
       138  0
                   final String msg = String.format("Unable to load database driver '%s'", className);
       139  0
                   LOGGER.debug(msg, ex);
      @@ -274,6 +274,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DriverShim.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DriverShim.html index 6ff64bb63..286ea7494 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DriverShim.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.nvdcve.DriverShim.html @@ -107,7 +107,7 @@
            * The logger.
       45  
            */
      -  46  8
           private static final Logger LOGGER = LoggerFactory.getLogger(DriverShim.class);
      +  46  1
           private static final Logger LOGGER = LoggerFactory.getLogger(DriverShim.class);
       47  
           /**
       48   @@ -128,9 +128,9 @@
            * @param driver the database driver to wrap
       56  
            */
      -  57  32
           DriverShim(Driver driver) {
      -  58  32
               this.driver = driver;
      -  59  32
           }
      +  57  4
           DriverShim(Driver driver) {
      +  58  4
               this.driver = driver;
      +  59  4
           }
       60  
       
       61   @@ -155,7 +155,7 @@
           @Override
       71  
           public boolean acceptsURL(String url) throws SQLException {
      -  72  16
               return this.driver.acceptsURL(url);
      +  72  2
               return this.driver.acceptsURL(url);
       73  
           }
       74   @@ -244,7 +244,7 @@  117  
            */
       118   -
           //@Override
      +
           @Override
       119  
           public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException {
       120   @@ -387,13 +387,13 @@
           @Override
       202  
           public String toString() {
      -  203  56
               return "DriverShim{" + "driver=" + driver + '}';
      +  203  7
               return "DriverShim{" + "driver=" + driver + '}';
       204  
           }
       205  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.BaseUpdater.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.BaseUpdater.html index f530bff03..916b02d55 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.BaseUpdater.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.BaseUpdater.html @@ -77,7 +77,7 @@
        * @author Jeremy Long
       30  
        */
      -  31  32
       public abstract class BaseUpdater {
      +  31  4
       public abstract class BaseUpdater {
       32  
       
       33   @@ -86,7 +86,7 @@
            * Static logger.
       35  
            */
      -  36  8
           private static final Logger LOGGER = LoggerFactory.getLogger(BaseUpdater.class);
      +  36  1
           private static final Logger LOGGER = LoggerFactory.getLogger(BaseUpdater.class);
       37  
           /**
       38   @@ -101,19 +101,19 @@
            * Reference to the Cve Database.
       43  
            */
      -  44  32
           private CveDB cveDB = null;
      +  44  4
           private CveDB cveDB = null;
       45  
       
       46  
           protected CveDB getCveDB() {
      -  47  8
               return cveDB;
      +  47  1
               return cveDB;
       48  
           }
       49  
       
       50  
           protected DatabaseProperties getProperties() {
      -  51  8
               return properties;
      +  51  1
               return properties;
       52  
           }
       53   @@ -126,18 +126,18 @@
            */
       57  
           protected void closeDataStores() {
      -  58  24
               if (cveDB != null) {
      +  58  3
               if (cveDB != null) {
       59  
                   try {
      -  60  24
                       cveDB.close();
      -  61  24
                       cveDB = null;
      -  62  24
                       properties = null;
      +  60  3
                       cveDB.close();
      +  61  3
                       cveDB = null;
      +  62  3
                       properties = null;
       63  0
                   } catch (Throwable ignore) {
       64  0
                       LOGGER.trace("Error closing the database", ignore);
      -  65  24
                   }
      +  65  3
                   }
       66  
               }
      -  67  24
           }
      +  67  3
           }
       68  
       
       69   @@ -152,25 +152,25 @@
            */
       74  
           protected final void openDataStores() throws UpdateException {
      -  75  24
               if (cveDB != null) {
      +  75  3
               if (cveDB != null) {
       76  0
                   return;
       77  
               }
       78  
               try {
      -  79  24
                   cveDB = new CveDB();
      -  80  24
                   cveDB.open();
      -  81  24
                   properties = cveDB.getDatabaseProperties();
      +  79  3
                   cveDB = new CveDB();
      +  80  3
                   cveDB.open();
      +  81  3
                   properties = cveDB.getDatabaseProperties();
       82  0
               } catch (DatabaseException ex) {
       83  0
                   closeDataStores();
       84  0
                   LOGGER.debug("Database Exception opening databases", ex);
       85  0
                   throw new UpdateException("Error updating the database, please see the log file for more details.");
      -  86  24
               }
      -  87  24
           }
      +  86  3
               }
      +  87  3
           }
       88  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.CachedWebDataSource.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.CachedWebDataSource.html index 266eaac76..000b013a5 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.CachedWebDataSource.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.CachedWebDataSource.html @@ -93,6 +93,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.CpeUpdater.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.CpeUpdater.html index eeb1a4bf2..896740146 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.CpeUpdater.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.CpeUpdater.html @@ -70,276 +70,280 @@  26  
       import java.net.URL;
       27   -
       import java.util.Date;
      -  28  
       import java.util.List;
      -  29   +  28  
       import java.util.zip.GZIPInputStream;
      -  30   +  29  
       import javax.xml.parsers.ParserConfigurationException;
      -  31   +  30  
       import javax.xml.parsers.SAXParser;
      -  32   +  31  
       import javax.xml.parsers.SAXParserFactory;
      -  33   +  32  
       import org.apache.commons.io.FileUtils;
      -  34   +  33  
       import static org.owasp.dependencycheck.data.nvdcve.DatabaseProperties.LAST_CPE_UPDATE;
      -  35   +  34  
       import org.owasp.dependencycheck.data.update.cpe.CPEHandler;
      -  36   +  35  
       import org.owasp.dependencycheck.data.update.cpe.Cpe;
      -  37   +  36  
       import org.owasp.dependencycheck.data.update.exception.UpdateException;
      -  38   +  37  
       import org.owasp.dependencycheck.utils.DateUtil;
      -  39   +  38  
       import org.owasp.dependencycheck.utils.DownloadFailedException;
      -  40   +  39  
       import org.owasp.dependencycheck.utils.Downloader;
      -  41   +  40  
       import org.owasp.dependencycheck.utils.Settings;
      -  42   +  41  
       import org.slf4j.Logger;
      -  43   +  42  
       import org.slf4j.LoggerFactory;
      -  44   +  43  
       import org.xml.sax.SAXException;
      +  44   +
       
       45   -
       
      -  46  
       /**
      -  47   -
        * The CpeUpdater is designed to download the CPE data file from NIST and import the data into the database. However, as this
      -  48   -
        * currently adds no beneficial data, compared to what is in the CPE data contained in the CVE data files, this class is not
      -  49   -
        * currently used. The code is being kept as a future update may utilize more data from the CPE xml files.
      -  50   +  46  
        *
      +  47   +
        * This class is currently unused and if enabled will likely not work on MySQL as the MERGE statement is used.
      +  48   +
        *
      +  49   +
        * The CpeUpdater is designed to download the CPE data file from NIST and import the data into the database. However, as this
      +  50   +
        * currently adds no beneficial data, compared to what is in the CPE data contained in the CVE data files, this class is not
       51   -
        * @author Jeremy Long
      +
        * currently used. The code is being kept as a future update may utilize more data from the CPE xml files.
       52   -
        */
      -  53  0
       public class CpeUpdater extends BaseUpdater implements CachedWebDataSource {
      +
        *
      +  53   +
        * @author Jeremy Long
       54   -
       
      -  55   -
           /**
      +
        */
      +  55  0
       public class CpeUpdater extends BaseUpdater implements CachedWebDataSource {
       56   -
            * Static logger.
      +
       
       57   -
            */
      -  58  0
           private static final Logger LOGGER = LoggerFactory.getLogger(CpeUpdater.class);
      +
           /**
      +  58   +
            * Static logger.
       59   -
       
      -  60   -
           @Override
      +
            */
      +  60  0
           private static final Logger LOGGER = LoggerFactory.getLogger(CpeUpdater.class);
       61   -
           public void update() throws UpdateException {
      +
       
       62   +
           @Override
      +  63   +
           public void update() throws UpdateException {
      +  64  
               try {
      -  63  0
                   openDataStores();
      -  64  0
                   if (updateNeeded()) {
      -  65  0
                       LOGGER.info("Updating the Common Platform Enumeration (CPE)");
      -  66  0
                       final File xml = downloadCpe();
      -  67  0
                       final List<Cpe> cpes = processXML(xml);
      -  68  0
                       getCveDB().deleteUnusedCpe();
      -  69  0
                       for (Cpe cpe : cpes) {
      -  70  0
                           getCveDB().addCpe(cpe.getValue(), cpe.getVendor(), cpe.getProduct());
      -  71  0
                       }
      -  72  0
                       final Date now = new Date();
      -  73  0
                       getProperties().save(LAST_CPE_UPDATE, Long.toString(now.getTime()));
      -  74  0
                       LOGGER.info("CPE update complete");
      -  75   +  65  0
                   openDataStores();
      +  66  0
                   if (updateNeeded()) {
      +  67  0
                       LOGGER.info("Updating the Common Platform Enumeration (CPE)");
      +  68  0
                       final File xml = downloadCpe();
      +  69  0
                       final List<Cpe> cpes = processXML(xml);
      +  70  0
                       getCveDB().deleteUnusedCpe();
      +  71  0
                       for (Cpe cpe : cpes) {
      +  72  0
                           getCveDB().addCpe(cpe.getValue(), cpe.getVendor(), cpe.getProduct());
      +  73  0
                       }
      +  74  0
                       final long now = System.currentTimeMillis();
      +  75  0
                       getProperties().save(LAST_CPE_UPDATE, Long.toString(now));
      +  76  0
                       LOGGER.info("CPE update complete");
      +  77  
                   }
      -  76   +  78  
               } finally {
      -  77  0
                   closeDataStores();
      -  78  0
               }
      -  79  0
           }
      -  80   -
       
      -  81   -
           /**
      +  79  0
                   closeDataStores();
      +  80  0
               }
      +  81  0
           }
       82   -
            * Downloads the CPE XML file.
      +
       
       83   -
            *
      +
           /**
       84   -
            * @return the file reference to the CPE.xml file
      +
            * Downloads the CPE XML file.
       85   -
            * @throws UpdateException thrown if there is an issue downloading the XML file
      +
            *
       86   -
            */
      +
            * @return the file reference to the CPE.xml file
       87   -
           private File downloadCpe() throws UpdateException {
      +
            * @throws UpdateException thrown if there is an issue downloading the XML file
       88   -
               File xml;
      +
            */
       89   -
               final URL url;
      +
           private File downloadCpe() throws UpdateException {
       90   +
               File xml;
      +  91   +
               final URL url;
      +  92  
               try {
      -  91  0
                   url = new URL(Settings.getString(Settings.KEYS.CPE_URL));
      -  92  0
                   xml = File.createTempFile("cpe", ".xml", Settings.getTempDirectory());
      -  93  0
                   Downloader.fetchFile(url, xml);
      -  94  0
                   if (url.toExternalForm().endsWith(".xml.gz")) {
      -  95  0
                       extractGzip(xml);
      -  96   +  93  0
                   url = new URL(Settings.getString(Settings.KEYS.CPE_URL));
      +  94  0
                   xml = File.createTempFile("cpe", ".xml", Settings.getTempDirectory());
      +  95  0
                   Downloader.fetchFile(url, xml);
      +  96  0
                   if (url.toExternalForm().endsWith(".xml.gz")) {
      +  97  0
                       extractGzip(xml);
      +  98  
                   }
      -  97   -
       
      -  98  0
               } catch (MalformedURLException ex) {
      -  99  0
                   throw new UpdateException("Invalid CPE URL", ex);
      -  100  0
               } catch (DownloadFailedException ex) {
      -  101  0
                   throw new UpdateException("Unable to download CPE XML file", ex);
      -  102  0
               } catch (IOException ex) {
      -  103  0
                   throw new UpdateException("Unable to create temporary file to download CPE", ex);
      -  104  0
               }
      -  105  0
               return xml;
      -  106   -
           }
      -  107   +  99  
       
      +  100  0
               } catch (MalformedURLException ex) {
      +  101  0
                   throw new UpdateException("Invalid CPE URL", ex);
      +  102  0
               } catch (DownloadFailedException ex) {
      +  103  0
                   throw new UpdateException("Unable to download CPE XML file", ex);
      +  104  0
               } catch (IOException ex) {
      +  105  0
                   throw new UpdateException("Unable to create temporary file to download CPE", ex);
      +  106  0
               }
      +  107  0
               return xml;
       108   -
           /**
      +
           }
       109   -
            * Parses the CPE XML file to return a list of CPE entries.
      +
       
       110   -
            *
      +
           /**
       111   -
            * @param xml the CPE data file
      +
            * Parses the CPE XML file to return a list of CPE entries.
       112   -
            * @return the list of CPE entries
      +
            *
       113   -
            * @throws UpdateException thrown if there is an issue with parsing the XML file
      +
            * @param xml the CPE data file
       114   -
            */
      +
            * @return the list of CPE entries
       115   -
           private List<Cpe> processXML(final File xml) throws UpdateException {
      +
            * @throws UpdateException thrown if there is an issue with parsing the XML file
       116   +
            */
      +  117   +
           private List<Cpe> processXML(final File xml) throws UpdateException {
      +  118  
               try {
      -  117  0
                   final SAXParserFactory factory = SAXParserFactory.newInstance();
      -  118  0
                   final SAXParser saxParser = factory.newSAXParser();
      -  119  0
                   final CPEHandler handler = new CPEHandler();
      -  120  0
                   saxParser.parse(xml, handler);
      -  121  0
                   return handler.getData();
      -  122  0
               } catch (ParserConfigurationException ex) {
      -  123  0
                   throw new UpdateException("Unable to parse CPE XML file due to SAX Parser Issue", ex);
      -  124  0
               } catch (SAXException ex) {
      -  125  0
                   throw new UpdateException("Unable to parse CPE XML file due to SAX Parser Exception", ex);
      -  126  0
               } catch (IOException ex) {
      -  127  0
                   throw new UpdateException("Unable to parse CPE XML file due to IO Failure", ex);
      -  128   -
               }
      -  129   -
           }
      +  119  0
                   final SAXParserFactory factory = SAXParserFactory.newInstance();
      +  120  0
                   final SAXParser saxParser = factory.newSAXParser();
      +  121  0
                   final CPEHandler handler = new CPEHandler();
      +  122  0
                   saxParser.parse(xml, handler);
      +  123  0
                   return handler.getData();
      +  124  0
               } catch (ParserConfigurationException ex) {
      +  125  0
                   throw new UpdateException("Unable to parse CPE XML file due to SAX Parser Issue", ex);
      +  126  0
               } catch (SAXException ex) {
      +  127  0
                   throw new UpdateException("Unable to parse CPE XML file due to SAX Parser Exception", ex);
      +  128  0
               } catch (IOException ex) {
      +  129  0
                   throw new UpdateException("Unable to parse CPE XML file due to IO Failure", ex);
       130   -
       
      +
               }
       131   -
           /**
      -  132   -
            * Checks to find the last time the CPE data was refreshed and if it needs to be updated.
      -  133   -
            *
      -  134   -
            * @return true if the CPE data should be refreshed
      -  135   -
            */
      -  136   -
           private boolean updateNeeded() {
      -  137  0
               final Date now = new Date();
      -  138  0
               final int days = Settings.getInt(Settings.KEYS.CVE_MODIFIED_VALID_FOR_DAYS, 30);
      -  139  0
               long timestamp = 0;
      -  140  0
               final String ts = getProperties().getProperty(LAST_CPE_UPDATE);
      -  141  0
               if (ts != null && ts.matches("^[0-9]+$")) {
      -  142  0
                   timestamp = Long.parseLong(ts);
      -  143   -
               }
      -  144  0
               return !DateUtil.withinDateRange(timestamp, now.getTime(), days);
      -  145  
           }
      -  146   +  132  
       
      -  147   +  133  
           /**
      -  148   -
            * Extracts the file contained in a gzip archive. The extracted file is placed in the exact same path as the file specified.
      -  149   +  134   +
            * Checks to find the last time the CPE data was refreshed and if it needs to be updated.
      +  135  
            *
      -  150   -
            * @param file the archive file
      -  151   -
            * @throws FileNotFoundException thrown if the file does not exist
      -  152   -
            * @throws IOException thrown if there is an error extracting the file.
      -  153   +  136   +
            * @return true if the CPE data should be refreshed
      +  137  
            */
      -  154   -
           private void extractGzip(File file) throws FileNotFoundException, IOException {
      -  155   -
               //TODO - move this to a util class as it is duplicative of (copy of) code in the DownloadTask
      -  156  0
               final String originalPath = file.getPath();
      -  157  0
               final File gzip = new File(originalPath + ".gz");
      -  158  0
               if (gzip.isFile() && !gzip.delete()) {
      -  159  0
                   gzip.deleteOnExit();
      -  160   +  138   +
           private boolean updateNeeded() {
      +  139  0
               final long now = System.currentTimeMillis();
      +  140  0
               final int days = Settings.getInt(Settings.KEYS.CVE_MODIFIED_VALID_FOR_DAYS, 30);
      +  141  0
               long timestamp = 0;
      +  142  0
               final String ts = getProperties().getProperty(LAST_CPE_UPDATE);
      +  143  0
               if (ts != null && ts.matches("^[0-9]+$")) {
      +  144  0
                   timestamp = Long.parseLong(ts);
      +  145  
               }
      -  161  0
               if (!file.renameTo(gzip)) {
      -  162  0
                   throw new IOException("Unable to rename '" + file.getPath() + "'");
      -  163   -
               }
      -  164  0
               final File newfile = new File(originalPath);
      -  165   +  146  0
               return !DateUtil.withinDateRange(timestamp, now, days);
      +  147   +
           }
      +  148  
       
      -  166  0
               final byte[] buffer = new byte[4096];
      +  149   +
           /**
      +  150   +
            * Extracts the file contained in a gzip archive. The extracted file is placed in the exact same path as the file specified.
      +  151   +
            *
      +  152   +
            * @param file the archive file
      +  153   +
            * @throws FileNotFoundException thrown if the file does not exist
      +  154   +
            * @throws IOException thrown if there is an error extracting the file.
      +  155   +
            */
      +  156   +
           private void extractGzip(File file) throws FileNotFoundException, IOException {
      +  157   +
               //TODO - move this to a util class as it is duplicative of (copy of) code in the DownloadTask
      +  158  0
               final String originalPath = file.getPath();
      +  159  0
               final File gzip = new File(originalPath + ".gz");
      +  160  0
               if (gzip.isFile() && !gzip.delete()) {
      +  161  0
                   gzip.deleteOnExit();
      +  162   +
               }
      +  163  0
               if (!file.renameTo(gzip)) {
      +  164  0
                   throw new IOException("Unable to rename '" + file.getPath() + "'");
      +  165   +
               }
      +  166  0
               final File newfile = new File(originalPath);
       167  
       
      -  168  0
               GZIPInputStream cin = null;
      -  169  0
               FileOutputStream out = null;
      -  170   -
               try {
      -  171  0
                   cin = new GZIPInputStream(new FileInputStream(gzip));
      -  172  0
                   out = new FileOutputStream(newfile);
      -  173   +  168  0
               final byte[] buffer = new byte[4096];
      +  169  
       
      -  174   +  170  0
               GZIPInputStream cin = null;
      +  171  0
               FileOutputStream out = null;
      +  172   +
               try {
      +  173  0
                   cin = new GZIPInputStream(new FileInputStream(gzip));
      +  174  0
                   out = new FileOutputStream(newfile);
      +  175   +
       
      +  176  
                   int len;
      -  175  0
                   while ((len = cin.read(buffer)) > 0) {
      -  176  0
                       out.write(buffer, 0, len);
      -  177   +  177  0
                   while ((len = cin.read(buffer)) > 0) {
      +  178  0
                       out.write(buffer, 0, len);
      +  179  
                   }
      -  178   -
               } finally {
      -  179  0
                   if (cin != null) {
       180   +
               } finally {
      +  181  0
                   if (cin != null) {
      +  182  
                       try {
      -  181  0
                           cin.close();
      -  182  0
                       } catch (IOException ex) {
      -  183  0
                           LOGGER.trace("ignore", ex);
      -  184  0
                       }
      -  185   -
                   }
      -  186  0
                   if (out != null) {
      +  183  0
                           cin.close();
      +  184  0
                       } catch (IOException ex) {
      +  185  0
                           LOGGER.trace("ignore", ex);
      +  186  0
                       }
       187   +
                   }
      +  188  0
                   if (out != null) {
      +  189  
                       try {
      -  188  0
                           out.close();
      -  189  0
                       } catch (IOException ex) {
      -  190  0
                           LOGGER.trace("ignore", ex);
      -  191  0
                       }
      -  192   +  190  0
                           out.close();
      +  191  0
                       } catch (IOException ex) {
      +  192  0
                           LOGGER.trace("ignore", ex);
      +  193  0
                       }
      +  194  
                   }
      -  193  0
                   if (gzip.isFile()) {
      -  194  0
                       FileUtils.deleteQuietly(gzip);
      -  195   +  195  0
                   if (gzip.isFile()) {
      +  196  0
                       FileUtils.deleteQuietly(gzip);
      +  197  
                   }
      -  196   -
               }
      -  197  0
           }
       198   +
               }
      +  199  0
           }
      +  200  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.EngineVersionCheck.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.EngineVersionCheck.html index 224e4af15..88efc58f4 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.EngineVersionCheck.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.EngineVersionCheck.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      EngineVersionCheck
      51%
      40/78
      53%
      14/26
      4.286
      EngineVersionCheck
      47%
      37/78
      50%
      13/26
      4.286
       
      @@ -64,311 +64,309 @@  23  
       import java.net.URL;
       24   -
       import java.util.Date;
      -  25  
       import org.apache.commons.io.IOUtils;
      -  26   +  25  
       import org.owasp.dependencycheck.data.nvdcve.CveDB;
      -  27   +  26  
       import org.owasp.dependencycheck.data.nvdcve.DatabaseException;
      -  28   +  27  
       import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties;
      -  29   +  28  
       import org.owasp.dependencycheck.data.update.exception.UpdateException;
      -  30   +  29  
       import org.owasp.dependencycheck.utils.DateUtil;
      -  31   +  30  
       import org.owasp.dependencycheck.utils.DependencyVersion;
      -  32   +  31  
       import org.owasp.dependencycheck.utils.Settings;
      -  33   +  32  
       import org.owasp.dependencycheck.utils.URLConnectionFactory;
      -  34   +  33  
       import org.owasp.dependencycheck.utils.URLConnectionFailureException;
      -  35   +  34  
       import org.slf4j.Logger;
      -  36   +  35  
       import org.slf4j.LoggerFactory;
      +  36   +
       
       37   -
       
      -  38  
       /**
      -  39   +  38  
        *
      -  40   +  39  
        * @author Jeremy Long
      -  41   +  40  
        */
      -  42  16
       public class EngineVersionCheck implements CachedWebDataSource {
      +  41  2
       public class EngineVersionCheck implements CachedWebDataSource {
      +  42   +
       
       43   -
       
      +
           /**
       44   -
           /**
      -  45  
            * Static logger.
      -  46   +  45  
            */
      -  47  8
           private static final Logger LOGGER = LoggerFactory.getLogger(EngineVersionCheck.class);
      +  46  1
           private static final Logger LOGGER = LoggerFactory.getLogger(EngineVersionCheck.class);
      +  47   +
           /**
       48   -
           /**
      +
            * The property key indicating when the last version check occurred.
       49   -
            * The property key indicating when the last version check occurred.
      +
            */
       50   -
            */
      -  51  
           public static final String ENGINE_VERSION_CHECKED_ON = "VersionCheckOn";
      +  51   +
           /**
       52   -
           /**
      -  53  
            * The property key indicating when the last version check occurred.
      +  53   +
            */
       54   -
            */
      -  55  
           public static final String CURRENT_ENGINE_RELEASE = "CurrentEngineRelease";
      +  55   +
           /**
       56   -
           /**
      -  57  
            * Reference to the Cve Database.
      -  58   +  57  
            */
      -  59  16
           private CveDB cveDB = null;
      +  58  2
           private CveDB cveDB = null;
      +  59   +
       
       60   -
       
      +
           /**
       61   -
           /**
      -  62  
            * The version retrieved from the database properties or web to check against.
      +  62   +
            */
       63   -
            */
      -  64  
           private String updateToVersion;
      +  64   +
       
       65   -
       
      +
           /**
       66   -
           /**
      -  67  
            * Getter for updateToVersion - only used for testing. Represents the version retrieved from the database.
      +  67   +
            *
       68   -
            *
      -  69  
            * @return the version to test
      +  69   +
            */
       70   -
            */
      -  71  
           protected String getUpdateToVersion() {
      -  72  0
               return updateToVersion;
      +  71  0
               return updateToVersion;
      +  72   +
           }
       73   -
           }
      +
       
       74   -
       
      +
           /**
       75   -
           /**
      -  76  
            * Setter for updateToVersion - only used for testing. Represents the version retrieved from the database.
      +  76   +
            *
       77   -
            *
      -  78  
            * @param version the version to test
      +  78   +
            */
       79   -
            */
      -  80  
           protected void setUpdateToVersion(String version) {
      -  81  31
               updateToVersion = version;
      -  82  31
           }
      +  80  7
               updateToVersion = version;
      +  81  7
           }
      +  82   +
       
       83   -
       
      -  84  
           @Override
      -  85   +  84  
           public void update() throws UpdateException {
      -  86   +  85  
               try {
      -  87  0
                   openDatabase();
      -  88  0
                   LOGGER.debug("Begin Engine Version Check");
      -  89  0
                   final DatabaseProperties properties = cveDB.getDatabaseProperties();
      -  90  0
                   final long lastChecked = Long.parseLong(properties.getProperty(ENGINE_VERSION_CHECKED_ON, "0"));
      -  91  0
                   final long now = (new Date()).getTime();
      -  92  0
                   updateToVersion = properties.getProperty(CURRENT_ENGINE_RELEASE, "");
      -  93  0
                   final String currentVersion = Settings.getString(Settings.KEYS.APPLICATION_VERSION, "0.0.0");
      -  94  0
                   LOGGER.debug("Last checked: {}", lastChecked);
      -  95  0
                   LOGGER.debug("Now: {}", now);
      -  96  0
                   LOGGER.debug("Current version: {}", currentVersion);
      -  97  0
                   final boolean updateNeeded = shouldUpdate(lastChecked, now, properties, currentVersion);
      -  98  0
                   if (updateNeeded) {
      -  99  0
                       LOGGER.warn("A new version of dependency-check is available. Consider updating to version {}.",
      -  100   +  86  0
                   openDatabase();
      +  87  0
                   LOGGER.debug("Begin Engine Version Check");
      +  88  0
                   final DatabaseProperties properties = cveDB.getDatabaseProperties();
      +  89  0
                   final long lastChecked = Long.parseLong(properties.getProperty(ENGINE_VERSION_CHECKED_ON, "0"));
      +  90  0
                   final long now = System.currentTimeMillis();
      +  91  0
                   updateToVersion = properties.getProperty(CURRENT_ENGINE_RELEASE, "");
      +  92  0
                   final String currentVersion = Settings.getString(Settings.KEYS.APPLICATION_VERSION, "0.0.0");
      +  93  0
                   LOGGER.debug("Last checked: {}", lastChecked);
      +  94  0
                   LOGGER.debug("Now: {}", now);
      +  95  0
                   LOGGER.debug("Current version: {}", currentVersion);
      +  96  0
                   final boolean updateNeeded = shouldUpdate(lastChecked, now, properties, currentVersion);
      +  97  0
                   if (updateNeeded) {
      +  98  0
                       LOGGER.warn("A new version of dependency-check is available. Consider updating to version {}.",
      +  99  
                               updateToVersion);
      -  101   +  100  
                   }
      -  102  0
               } catch (DatabaseException ex) {
      -  103  0
                   LOGGER.debug("Database Exception opening databases to retrieve properties", ex);
      -  104  0
                   throw new UpdateException("Error occured updating database properties.");
      -  105   +  101  0
               } catch (DatabaseException ex) {
      +  102  0
                   LOGGER.debug("Database Exception opening databases to retrieve properties", ex);
      +  103  0
                   throw new UpdateException("Error occured updating database properties.");
      +  104  
               } finally {
      -  106  0
                   closeDatabase();
      -  107  0
               }
      -  108  0
           }
      +  105  0
                   closeDatabase();
      +  106  0
               }
      +  107  0
           }
      +  108   +
       
       109   -
       
      +
           /**
       110   -
           /**
      -  111  
            * Determines if a new version of the dependency-check engine has been released.
      +  111   +
            *
       112   -
            *
      -  113  
            * @param lastChecked the epoch time of the last version check
      -  114   +  113  
            * @param now the current epoch time
      -  115   +  114  
            * @param properties the database properties object
      -  116   +  115  
            * @param currentVersion the current version of dependency-check
      -  117   +  116  
            * @return <code>true</code> if a newer version of the database has been released; otherwise <code>false</code>
      -  118   +  117  
            * @throws UpdateException thrown if there is an error connecting to the github documentation site or accessing the local
      -  119   +  118  
            * database.
      +  119   +
            */
       120   -
            */
      -  121  
           protected boolean shouldUpdate(final long lastChecked, final long now, final DatabaseProperties properties,
      -  122   +  121  
                   String currentVersion) throws UpdateException {
      -  123   +  122  
               //check every 30 days if we know there is an update, otherwise check every 7 days
      -  124  31
               int checkRange = 30;
      -  125  31
               if (updateToVersion.isEmpty()) {
      -  126  6
                   checkRange = 7;
      -  127   +  123  7
               int checkRange = 30;
      +  124  7
               if (updateToVersion.isEmpty()) {
      +  125  2
                   checkRange = 7;
      +  126  
               }
      -  128  31
               if (!DateUtil.withinDateRange(lastChecked, now, checkRange)) {
      -  129  11
                   LOGGER.debug("Checking web for new version.");
      -  130  11
                   final String currentRelease = getCurrentReleaseVersion();
      -  131  11
                   if (currentRelease != null) {
      -  132  6
                       final DependencyVersion v = new DependencyVersion(currentRelease);
      -  133  6
                       if (v.getVersionParts() != null && v.getVersionParts().size() >= 3) {
      -  134  6
                           updateToVersion = v.toString();
      -  135  6
                           if (!currentRelease.equals(updateToVersion)) {
      -  136  0
                               properties.save(CURRENT_ENGINE_RELEASE, updateToVersion);
      -  137   +  127  7
               if (!DateUtil.withinDateRange(lastChecked, now, checkRange)) {
      +  128  2
                   LOGGER.debug("Checking web for new version.");
      +  129  2
                   final String currentRelease = getCurrentReleaseVersion();
      +  130  2
                   if (currentRelease != null) {
      +  131  2
                       final DependencyVersion v = new DependencyVersion(currentRelease);
      +  132  2
                       if (v.getVersionParts() != null && v.getVersionParts().size() >= 3) {
      +  133  2
                           updateToVersion = v.toString();
      +  134  2
                           if (!currentRelease.equals(updateToVersion)) {
      +  135  0
                               properties.save(CURRENT_ENGINE_RELEASE, updateToVersion);
      +  136  
                           } else {
      -  138  6
                               properties.save(CURRENT_ENGINE_RELEASE, "");
      -  139   +  137  2
                               properties.save(CURRENT_ENGINE_RELEASE, "");
      +  138  
                           }
      -  140  6
                           properties.save(ENGINE_VERSION_CHECKED_ON, Long.toString(now));
      -  141   +  139  2
                           properties.save(ENGINE_VERSION_CHECKED_ON, Long.toString(now));
      +  140  
                       }
      -  142   +  141  
                   }
      -  143  11
                   LOGGER.debug("Current Release: {}", updateToVersion);
      -  144   +  142  2
                   LOGGER.debug("Current Release: {}", updateToVersion);
      +  143  
               }
      -  145  31
               final DependencyVersion running = new DependencyVersion(currentVersion);
      -  146  31
               final DependencyVersion released = new DependencyVersion(updateToVersion);
      -  147  31
               if (running.compareTo(released) < 0) {
      -  148  9
                   LOGGER.debug("Upgrade recommended");
      -  149  9
                   return true;
      -  150   +  144  7
               final DependencyVersion running = new DependencyVersion(currentVersion);
      +  145  7
               final DependencyVersion released = new DependencyVersion(updateToVersion);
      +  146  7
               if (running.compareTo(released) < 0) {
      +  147  3
                   LOGGER.debug("Upgrade recommended");
      +  148  3
                   return true;
      +  149  
               }
      -  151  22
               LOGGER.debug("Upgrade not needed");
      -  152  22
               return false;
      +  150  4
               LOGGER.debug("Upgrade not needed");
      +  151  4
               return false;
      +  152   +
           }
       153   -
           }
      +
       
       154   -
       
      +
           /**
       155   -
           /**
      -  156  
            * Opens the CVE and CPE data stores.
      +  156   +
            *
       157   -
            *
      -  158  
            * @throws DatabaseException thrown if a data store cannot be opened
      +  158   +
            */
       159   -
            */
      -  160  
           protected final void openDatabase() throws DatabaseException {
      -  161  0
               if (cveDB != null) {
      -  162  0
                   return;
      -  163   +  160  0
               if (cveDB != null) {
      +  161  0
                   return;
      +  162  
               }
      -  164  0
               cveDB = new CveDB();
      -  165  0
               cveDB.open();
      -  166  0
           }
      +  163  0
               cveDB = new CveDB();
      +  164  0
               cveDB.open();
      +  165  0
           }
      +  166   +
       
       167   -
       
      +
           /**
       168   -
           /**
      -  169  
            * Closes the CVE and CPE data stores.
      +  169   +
            */
       170   -
            */
      -  171  
           protected void closeDatabase() {
      -  172  0
               if (cveDB != null) {
      -  173   +  171  0
               if (cveDB != null) {
      +  172  
                   try {
      -  174  0
                       cveDB.close();
      -  175  0
                       cveDB = null;
      -  176  0
                   } catch (Throwable ignore) {
      -  177  0
                       LOGGER.trace("Error closing the cveDB", ignore);
      -  178  0
                   }
      -  179   +  173  0
                       cveDB.close();
      +  174  0
                       cveDB = null;
      +  175  0
                   } catch (Throwable ignore) {
      +  176  0
                       LOGGER.trace("Error closing the cveDB", ignore);
      +  177  0
                   }
      +  178  
               }
      -  180  0
           }
      -  181   +  179  0
           }
      +  180  
       
      -  182   +  181  
           /**
      -  183   +  182  
            * Retrieves the current released version number from the github documentation site.
      -  184   +  183  
            *
      -  185   +  184  
            * @return the current released version number
      -  186   +  185  
            */
      -  187   +  186  
           protected String getCurrentReleaseVersion() {
      -  188  19
               HttpURLConnection conn = null;
      -  189   +  187  3
               HttpURLConnection conn = null;
      +  188  
               try {
      -  190  19
                   final String str = Settings.getString(Settings.KEYS.ENGINE_VERSION_CHECK_URL, "http://jeremylong.github.io/DependencyCheck/current.txt");
      -  191  19
                   final URL url = new URL(str);
      -  192  19
                   conn = URLConnectionFactory.createHttpURLConnection(url);
      -  193  19
                   conn.connect();
      -  194  9
                   if (conn.getResponseCode() != 200) {
      -  195  0
                       return null;
      -  196   +  189  3
                   final String str = Settings.getString(Settings.KEYS.ENGINE_VERSION_CHECK_URL, "http://jeremylong.github.io/DependencyCheck/current.txt");
      +  190  3
                   final URL url = new URL(str);
      +  191  3
                   conn = URLConnectionFactory.createHttpURLConnection(url);
      +  192  3
                   conn.connect();
      +  193  3
                   if (conn.getResponseCode() != 200) {
      +  194  0
                       return null;
      +  195  
                   }
      -  197  9
                   final String releaseVersion = IOUtils.toString(conn.getInputStream(), "UTF-8");
      -  198  9
                   if (releaseVersion != null) {
      -  199  9
                       return releaseVersion.trim();
      -  200   +  196  3
                   final String releaseVersion = IOUtils.toString(conn.getInputStream(), "UTF-8");
      +  197  3
                   if (releaseVersion != null) {
      +  198  3
                       return releaseVersion.trim();
      +  199  
                   }
      -  201  0
               } catch (MalformedURLException ex) {
      -  202  0
                   LOGGER.debug("unable to retrieve current release version of dependency-check", ex);
      -  203  0
               } catch (URLConnectionFailureException ex) {
      -  204  0
                   LOGGER.debug("unable to retrieve current release version of dependency-check", ex);
      -  205  10
               } catch (IOException ex) {
      -  206  10
                   LOGGER.debug("unable to retrieve current release version of dependency-check", ex);
      -  207   +  200  0
               } catch (MalformedURLException ex) {
      +  201  0
                   LOGGER.debug("unable to retrieve current release version of dependency-check", ex);
      +  202  0
               } catch (URLConnectionFailureException ex) {
      +  203  0
                   LOGGER.debug("unable to retrieve current release version of dependency-check", ex);
      +  204  0
               } catch (IOException ex) {
      +  205  0
                   LOGGER.debug("unable to retrieve current release version of dependency-check", ex);
      +  206  
               } finally {
      -  208  19
                   if (conn != null) {
      -  209  19
                       conn.disconnect();
      -  210   +  207  3
                   if (conn != null) {
      +  208  3
                       conn.disconnect();
      +  209  
                   }
      -  211   +  210  
               }
      -  212  10
               return null;
      -  213   +  211  0
               return null;
      +  212  
           }
      -  214   +  213  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.NvdCveUpdater.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.NvdCveUpdater.html index 1a66c6bee..c0c2bd6e5 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.NvdCveUpdater.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.NvdCveUpdater.html @@ -60,403 +60,401 @@  21  
       import java.util.Calendar;
       22   -
       import java.util.Date;
      -  23  
       import java.util.HashSet;
      -  24   +  23  
       import java.util.Set;
      -  25   +  24  
       import java.util.concurrent.ExecutionException;
      -  26   +  25  
       import java.util.concurrent.ExecutorService;
      -  27   +  26  
       import java.util.concurrent.Executors;
      -  28   +  27  
       import java.util.concurrent.Future;
      -  29   +  28  
       import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties;
      -  30   +  29  
       import static org.owasp.dependencycheck.data.nvdcve.DatabaseProperties.MODIFIED;
      -  31   +  30  
       import org.owasp.dependencycheck.data.update.exception.InvalidDataException;
      -  32   +  31  
       import org.owasp.dependencycheck.data.update.exception.UpdateException;
      -  33   +  32  
       import org.owasp.dependencycheck.data.update.nvd.DownloadTask;
      -  34   +  33  
       import org.owasp.dependencycheck.data.update.nvd.NvdCveInfo;
      -  35   +  34  
       import org.owasp.dependencycheck.data.update.nvd.ProcessTask;
      -  36   +  35  
       import org.owasp.dependencycheck.data.update.nvd.UpdateableNvdCve;
      -  37   +  36  
       import org.owasp.dependencycheck.utils.DateUtil;
      -  38   +  37  
       import org.owasp.dependencycheck.utils.DownloadFailedException;
      -  39   +  38  
       import org.owasp.dependencycheck.utils.InvalidSettingException;
      -  40   +  39  
       import org.owasp.dependencycheck.utils.Settings;
      -  41   +  40  
       import org.slf4j.Logger;
      -  42   +  41  
       import org.slf4j.LoggerFactory;
      +  42   +
       
       43   -
       
      -  44  
       /**
      -  45   +  44  
        * Class responsible for updating the NVD CVE data.
      -  46   +  45  
        *
      -  47   +  46  
        * @author Jeremy Long
      -  48   +  47  
        */
      -  49  0
       public class NvdCveUpdater extends BaseUpdater implements CachedWebDataSource {
      +  48  0
       public class NvdCveUpdater extends BaseUpdater implements CachedWebDataSource {
      +  49   +
       
       50   -
       
      +
           /**
       51   -
           /**
      -  52  
            * The logger
      -  53   +  52  
            */
      -  54  0
           private static final Logger LOGGER = LoggerFactory.getLogger(NvdCveUpdater.class);
      +  53  0
           private static final Logger LOGGER = LoggerFactory.getLogger(NvdCveUpdater.class);
      +  54   +
           /**
       55   -
           /**
      -  56  
            * The max thread pool size to use when downloading files.
      -  57   +  56  
            */
      -  58  0
           public static final int MAX_THREAD_POOL_SIZE = Settings.getInt(Settings.KEYS.MAX_DOWNLOAD_THREAD_POOL_SIZE, 3);
      +  57  0
           public static final int MAX_THREAD_POOL_SIZE = Settings.getInt(Settings.KEYS.MAX_DOWNLOAD_THREAD_POOL_SIZE, 3);
      +  58   +
       
       59   -
       
      +
           /**
       60   -
           /**
      -  61  
            * <p>
      -  62   +  61  
            * Downloads the latest NVD CVE XML file from the web and imports it into the current CVE Database.</p>
      +  62   +
            *
       63   -
            *
      +
            * @throws UpdateException is thrown if there is an error updating the database
       64   -
            * @throws UpdateException is thrown if there is an error updating the database
      +
            */
       65   -
            */
      -  66  
           @Override
      -  67   +  66  
           public void update() throws UpdateException {
      -  68   +  67  
               try {
      -  69  0
                   openDataStores();
      -  70  0
                   final UpdateableNvdCve updateable = getUpdatesNeeded();
      -  71  0
                   if (updateable.isUpdateNeeded()) {
      -  72  0
                       performUpdate(updateable);
      -  73   +  68  0
                   openDataStores();
      +  69  0
                   final UpdateableNvdCve updateable = getUpdatesNeeded();
      +  70  0
                   if (updateable.isUpdateNeeded()) {
      +  71  0
                       performUpdate(updateable);
      +  72  
                   }
      -  74  0
               } catch (MalformedURLException ex) {
      -  75  0
                   LOGGER.warn(
      -  76   +  73  0
               } catch (MalformedURLException ex) {
      +  74  0
                   LOGGER.warn(
      +  75  
                           "NVD CVE properties files contain an invalid URL, unable to update the data to use the most current data.");
      -  77  0
                   LOGGER.debug("", ex);
      -  78  0
               } catch (DownloadFailedException ex) {
      -  79  0
                   LOGGER.warn(
      -  80   +  76  0
                   LOGGER.debug("", ex);
      +  77  0
               } catch (DownloadFailedException ex) {
      +  78  0
                   LOGGER.warn(
      +  79  
                           "Unable to download the NVD CVE data; the results may not include the most recent CPE/CVEs from the NVD.");
      -  81  0
                   if (Settings.getString(Settings.KEYS.PROXY_SERVER) == null) {
      -  82  0
                       LOGGER.info(
      -  83   +  80  0
                   if (Settings.getString(Settings.KEYS.PROXY_SERVER) == null) {
      +  81  0
                       LOGGER.info(
      +  82  
                               "If you are behind a proxy you may need to configure dependency-check to use the proxy.");
      -  84   +  83  
                   }
      -  85  0
                   LOGGER.debug("", ex);
      -  86   +  84  0
                   LOGGER.debug("", ex);
      +  85  
               } finally {
      -  87  0
                   closeDataStores();
      -  88  0
               }
      -  89  0
           }
      +  86  0
                   closeDataStores();
      +  87  0
               }
      +  88  0
           }
      +  89   +
       
       90   -
       
      +
           /**
       91   -
           /**
      -  92  
            * Downloads the latest NVD CVE XML file from the web and imports it into the current CVE Database.
      +  92   +
            *
       93   -
            *
      -  94  
            * @param updateable a collection of NVD CVE data file references that need to be downloaded and processed to update the
      -  95   +  94  
            * database
      -  96   +  95  
            * @throws UpdateException is thrown if there is an error updating the database
      +  96   +
            */
       97   -
            */
      -  98  
           public void performUpdate(UpdateableNvdCve updateable) throws UpdateException {
      -  99  0
               int maxUpdates = 0;
      -  100   +  98  0
               int maxUpdates = 0;
      +  99  
               try {
      -  101  0
                   for (NvdCveInfo cve : updateable) {
      -  102  0
                       if (cve.getNeedsUpdate()) {
      -  103  0
                           maxUpdates += 1;
      -  104   +  100  0
                   for (NvdCveInfo cve : updateable) {
      +  101  0
                       if (cve.getNeedsUpdate()) {
      +  102  0
                           maxUpdates += 1;
      +  103  
                       }
      -  105  0
                   }
      -  106  0
                   if (maxUpdates <= 0) {
      -  107   +  104  0
                   }
      +  105  0
                   if (maxUpdates <= 0) {
      +  106  
                       return;
      -  108   +  107  
                   }
      -  109  0
                   if (maxUpdates > 3) {
      -  110  0
                       LOGGER.info(
      -  111   +  108  0
                   if (maxUpdates > 3) {
      +  109  0
                       LOGGER.info(
      +  110  
                               "NVD CVE requires several updates; this could take a couple of minutes.");
      -  112   +  111   +
                   }
      +  112  0
                   if (maxUpdates > 0) {
      +  113  0
                       openDataStores();
      +  114  
                   }
      -  113  0
                   if (maxUpdates > 0) {
      -  114  0
                       openDataStores();
       115   -
                   }
      -  116  
       
      -  117  0
                   final int poolSize = (MAX_THREAD_POOL_SIZE < maxUpdates) ? MAX_THREAD_POOL_SIZE : maxUpdates;
      -  118   +  116  0
                   final int poolSize = (MAX_THREAD_POOL_SIZE < maxUpdates) ? MAX_THREAD_POOL_SIZE : maxUpdates;
      +  117  
       
      -  119  0
                   final ExecutorService downloadExecutors = Executors.newFixedThreadPool(poolSize);
      -  120  0
                   final ExecutorService processExecutor = Executors.newSingleThreadExecutor();
      -  121  0
                   final Set<Future<Future<ProcessTask>>> downloadFutures = new HashSet<Future<Future<ProcessTask>>>(maxUpdates);
      -  122  0
                   for (NvdCveInfo cve : updateable) {
      -  123  0
                       if (cve.getNeedsUpdate()) {
      -  124  0
                           final DownloadTask call = new DownloadTask(cve, processExecutor, getCveDB(), Settings.getInstance());
      -  125  0
                           downloadFutures.add(downloadExecutors.submit(call));
      -  126   +  118  0
                   final ExecutorService downloadExecutors = Executors.newFixedThreadPool(poolSize);
      +  119  0
                   final ExecutorService processExecutor = Executors.newSingleThreadExecutor();
      +  120  0
                   final Set<Future<Future<ProcessTask>>> downloadFutures = new HashSet<Future<Future<ProcessTask>>>(maxUpdates);
      +  121  0
                   for (NvdCveInfo cve : updateable) {
      +  122  0
                       if (cve.getNeedsUpdate()) {
      +  123  0
                           final DownloadTask call = new DownloadTask(cve, processExecutor, getCveDB(), Settings.getInstance());
      +  124  0
                           downloadFutures.add(downloadExecutors.submit(call));
      +  125  
                       }
      -  127  0
                   }
      -  128  0
                   downloadExecutors.shutdown();
      +  126  0
                   }
      +  127  0
                   downloadExecutors.shutdown();
      +  128   +
       
       129   -
       
      -  130  
                   //next, move the future future processTasks to just future processTasks
      -  131  0
                   final Set<Future<ProcessTask>> processFutures = new HashSet<Future<ProcessTask>>(maxUpdates);
      -  132  0
                   for (Future<Future<ProcessTask>> future : downloadFutures) {
      -  133  0
                       Future<ProcessTask> task = null;
      -  134   +  130  0
                   final Set<Future<ProcessTask>> processFutures = new HashSet<Future<ProcessTask>>(maxUpdates);
      +  131  0
                   for (Future<Future<ProcessTask>> future : downloadFutures) {
      +  132  0
                       Future<ProcessTask> task = null;
      +  133  
                       try {
      -  135  0
                           task = future.get();
      -  136  0
                       } catch (InterruptedException ex) {
      -  137  0
                           downloadExecutors.shutdownNow();
      -  138  0
                           processExecutor.shutdownNow();
      -  139   +  134  0
                           task = future.get();
      +  135  0
                       } catch (InterruptedException ex) {
      +  136  0
                           downloadExecutors.shutdownNow();
      +  137  0
                           processExecutor.shutdownNow();
      +  138  
       
      -  140  0
                           LOGGER.debug("Thread was interrupted during download", ex);
      -  141  0
                           throw new UpdateException("The download was interrupted", ex);
      -  142  0
                       } catch (ExecutionException ex) {
      -  143  0
                           downloadExecutors.shutdownNow();
      -  144  0
                           processExecutor.shutdownNow();
      -  145   +  139  0
                           LOGGER.debug("Thread was interrupted during download", ex);
      +  140  0
                           throw new UpdateException("The download was interrupted", ex);
      +  141  0
                       } catch (ExecutionException ex) {
      +  142  0
                           downloadExecutors.shutdownNow();
      +  143  0
                           processExecutor.shutdownNow();
      +  144  
       
      -  146  0
                           LOGGER.debug("Thread was interrupted during download execution", ex);
      -  147  0
                           throw new UpdateException("The execution of the download was interrupted", ex);
      -  148  0
                       }
      -  149  0
                       if (task == null) {
      -  150  0
                           downloadExecutors.shutdownNow();
      -  151  0
                           processExecutor.shutdownNow();
      -  152  0
                           LOGGER.debug("Thread was interrupted during download");
      -  153  0
                           throw new UpdateException("The download was interrupted; unable to complete the update");
      -  154   +  145  0
                           LOGGER.debug("Thread was interrupted during download execution", ex);
      +  146  0
                           throw new UpdateException("The execution of the download was interrupted", ex);
      +  147  0
                       }
      +  148  0
                       if (task == null) {
      +  149  0
                           downloadExecutors.shutdownNow();
      +  150  0
                           processExecutor.shutdownNow();
      +  151  0
                           LOGGER.debug("Thread was interrupted during download");
      +  152  0
                           throw new UpdateException("The download was interrupted; unable to complete the update");
      +  153  
                       } else {
      -  155  0
                           processFutures.add(task);
      -  156   +  154  0
                           processFutures.add(task);
      +  155  
                       }
      -  157  0
                   }
      -  158   +  156  0
                   }
      +  157  
       
      -  159  0
                   for (Future<ProcessTask> future : processFutures) {
      -  160   +  158  0
                   for (Future<ProcessTask> future : processFutures) {
      +  159  
                       try {
      -  161  0
                           final ProcessTask task = future.get();
      -  162  0
                           if (task.getException() != null) {
      -  163  0
                               throw task.getException();
      -  164   +  160  0
                           final ProcessTask task = future.get();
      +  161  0
                           if (task.getException() != null) {
      +  162  0
                               throw task.getException();
      +  163  
                           }
      -  165  0
                       } catch (InterruptedException ex) {
      -  166  0
                           processExecutor.shutdownNow();
      -  167  0
                           LOGGER.debug("Thread was interrupted during processing", ex);
      -  168  0
                           throw new UpdateException(ex);
      -  169  0
                       } catch (ExecutionException ex) {
      -  170  0
                           processExecutor.shutdownNow();
      -  171  0
                           LOGGER.debug("Execution Exception during process", ex);
      -  172  0
                           throw new UpdateException(ex);
      -  173   +  164  0
                       } catch (InterruptedException ex) {
      +  165  0
                           processExecutor.shutdownNow();
      +  166  0
                           LOGGER.debug("Thread was interrupted during processing", ex);
      +  167  0
                           throw new UpdateException(ex);
      +  168  0
                       } catch (ExecutionException ex) {
      +  169  0
                           processExecutor.shutdownNow();
      +  170  0
                           LOGGER.debug("Execution Exception during process", ex);
      +  171  0
                           throw new UpdateException(ex);
      +  172  
                       } finally {
      -  174  0
                           processExecutor.shutdown();
      -  175  0
                       }
      -  176  0
                   }
      -  177   +  173  0
                           processExecutor.shutdown();
      +  174  0
                       }
      +  175  0
                   }
      +  176  
       
      -  178  0
                   if (maxUpdates >= 1) { //ensure the modified file date gets written (we may not have actually updated it)
      -  179  0
                       getProperties().save(updateable.get(MODIFIED));
      -  180  0
                       LOGGER.info("Begin database maintenance.");
      -  181  0
                       getCveDB().cleanupDatabase();
      -  182  0
                       LOGGER.info("End database maintenance.");
      -  183   +  177  0
                   if (maxUpdates >= 1) { //ensure the modified file date gets written (we may not have actually updated it)
      +  178  0
                       getProperties().save(updateable.get(MODIFIED));
      +  179  0
                       LOGGER.info("Begin database maintenance.");
      +  180  0
                       getCveDB().cleanupDatabase();
      +  181  0
                       LOGGER.info("End database maintenance.");
      +  182  
                   }
      -  184   +  183  
               } finally {
      -  185  0
                   closeDataStores();
      -  186  0
               }
      -  187  0
           }
      +  184  0
                   closeDataStores();
      +  185  0
               }
      +  186  0
           }
      +  187   +
       
       188   -
       
      +
           /**
       189   -
           /**
      -  190  
            * Determines if the index needs to be updated. This is done by fetching the NVD CVE meta data and checking the last update
      -  191   +  190  
            * date. If the data needs to be refreshed this method will return the NvdCveUrl for the files that need to be updated.
      +  191   +
            *
       192   -
            *
      -  193  
            * @return the collection of files that need to be updated
      -  194   +  193  
            * @throws MalformedURLException is thrown if the URL for the NVD CVE Meta data is incorrect
      -  195   +  194  
            * @throws DownloadFailedException is thrown if there is an error. downloading the NVD CVE download data file
      -  196   +  195  
            * @throws UpdateException Is thrown if there is an issue with the last updated properties file
      +  196   +
            */
       197   -
            */
      -  198  
           protected final UpdateableNvdCve getUpdatesNeeded() throws MalformedURLException, DownloadFailedException, UpdateException {
      -  199  0
               UpdateableNvdCve updates = null;
      -  200   +  198  0
               UpdateableNvdCve updates = null;
      +  199  
               try {
      -  201  0
                   updates = retrieveCurrentTimestampsFromWeb();
      -  202  0
               } catch (InvalidDataException ex) {
      -  203  0
                   final String msg = "Unable to retrieve valid timestamp from nvd cve downloads page";
      -  204  0
                   LOGGER.debug(msg, ex);
      -  205  0
                   throw new DownloadFailedException(msg, ex);
      -  206  0
               } catch (InvalidSettingException ex) {
      -  207  0
                   LOGGER.debug("Invalid setting found when retrieving timestamps", ex);
      -  208  0
                   throw new DownloadFailedException("Invalid settings", ex);
      -  209  0
               }
      -  210   +  200  0
                   updates = retrieveCurrentTimestampsFromWeb();
      +  201  0
               } catch (InvalidDataException ex) {
      +  202  0
                   final String msg = "Unable to retrieve valid timestamp from nvd cve downloads page";
      +  203  0
                   LOGGER.debug(msg, ex);
      +  204  0
                   throw new DownloadFailedException(msg, ex);
      +  205  0
               } catch (InvalidSettingException ex) {
      +  206  0
                   LOGGER.debug("Invalid setting found when retrieving timestamps", ex);
      +  207  0
                   throw new DownloadFailedException("Invalid settings", ex);
      +  208  0
               }
      +  209  
       
      -  211  0
               if (updates == null) {
      -  212  0
                   throw new DownloadFailedException("Unable to retrieve the timestamps of the currently published NVD CVE data");
      -  213   +  210  0
               if (updates == null) {
      +  211  0
                   throw new DownloadFailedException("Unable to retrieve the timestamps of the currently published NVD CVE data");
      +  212  
               }
      -  214  0
               if (!getProperties().isEmpty()) {
      -  215   +  213  0
               if (!getProperties().isEmpty()) {
      +  214  
                   try {
      -  216  0
                       final long lastUpdated = Long.parseLong(getProperties().getProperty(DatabaseProperties.LAST_UPDATED, "0"));
      -  217  0
                       final Date now = new Date();
      -  218  0
                       final int days = Settings.getInt(Settings.KEYS.CVE_MODIFIED_VALID_FOR_DAYS, 7);
      -  219  0
                       if (lastUpdated == updates.getTimeStamp(MODIFIED)) {
      -  220  0
                           updates.clear(); //we don't need to update anything.
      -  221  0
                       } else if (DateUtil.withinDateRange(lastUpdated, now.getTime(), days)) {
      -  222  0
                           for (NvdCveInfo entry : updates) {
      -  223  0
                               if (MODIFIED.equals(entry.getId())) {
      -  224  0
                                   entry.setNeedsUpdate(true);
      -  225   +  215  0
                       final long lastUpdated = Long.parseLong(getProperties().getProperty(DatabaseProperties.LAST_UPDATED, "0"));
      +  216  0
                       final long now = System.currentTimeMillis();
      +  217  0
                       final int days = Settings.getInt(Settings.KEYS.CVE_MODIFIED_VALID_FOR_DAYS, 7);
      +  218  0
                       if (lastUpdated == updates.getTimeStamp(MODIFIED)) {
      +  219  0
                           updates.clear(); //we don't need to update anything.
      +  220  0
                       } else if (DateUtil.withinDateRange(lastUpdated, now, days)) {
      +  221  0
                           for (NvdCveInfo entry : updates) {
      +  222  0
                               if (MODIFIED.equals(entry.getId())) {
      +  223  0
                                   entry.setNeedsUpdate(true);
      +  224  
                               } else {
      -  226  0
                                   entry.setNeedsUpdate(false);
      -  227   +  225  0
                                   entry.setNeedsUpdate(false);
      +  226  
                               }
      -  228  0
                           }
      -  229   +  227  0
                           }
      +  228  
                       } else { //we figure out which of the several XML files need to be downloaded.
      -  230  0
                           for (NvdCveInfo entry : updates) {
      -  231  0
                               if (MODIFIED.equals(entry.getId())) {
      -  232  0
                                   entry.setNeedsUpdate(true);
      -  233   +  229  0
                           for (NvdCveInfo entry : updates) {
      +  230  0
                               if (MODIFIED.equals(entry.getId())) {
      +  231  0
                                   entry.setNeedsUpdate(true);
      +  232  
                               } else {
      -  234  0
                                   long currentTimestamp = 0;
      -  235   +  233  0
                                   long currentTimestamp = 0;
      +  234  
                                   try {
      -  236  0
                                       currentTimestamp = Long.parseLong(getProperties().getProperty(DatabaseProperties.LAST_UPDATED_BASE
      -  237   +  235  0
                                       currentTimestamp = Long.parseLong(getProperties().getProperty(DatabaseProperties.LAST_UPDATED_BASE
      +  236  
                                               + entry.getId(), "0"));
      -  238  0
                                   } catch (NumberFormatException ex) {
      -  239  0
                                       LOGGER.debug("Error parsing '{}' '{}' from nvdcve.lastupdated",
      -  240   +  237  0
                                   } catch (NumberFormatException ex) {
      +  238  0
                                       LOGGER.debug("Error parsing '{}' '{}' from nvdcve.lastupdated",
      +  239  
                                               DatabaseProperties.LAST_UPDATED_BASE, entry.getId(), ex);
      -  241  0
                                   }
      -  242  0
                                   if (currentTimestamp == entry.getTimestamp()) {
      -  243  0
                                       entry.setNeedsUpdate(false);
      -  244   +  240  0
                                   }
      +  241  0
                                   if (currentTimestamp == entry.getTimestamp()) {
      +  242  0
                                       entry.setNeedsUpdate(false);
      +  243  
                                   }
      -  245   +  244  
                               }
      -  246  0
                           }
      -  247   +  245  0
                           }
      +  246  
                       }
      -  248  0
                   } catch (NumberFormatException ex) {
      -  249  0
                       LOGGER.warn("An invalid schema version or timestamp exists in the data.properties file.");
      -  250  0
                       LOGGER.debug("", ex);
      -  251  0
                   }
      -  252   +  247  0
                   } catch (NumberFormatException ex) {
      +  248  0
                       LOGGER.warn("An invalid schema version or timestamp exists in the data.properties file.");
      +  249  0
                       LOGGER.debug("", ex);
      +  250  0
                   }
      +  251  
               }
      -  253  0
               return updates;
      +  252  0
               return updates;
      +  253   +
           }
       254   -
           }
      +
       
       255   -
       
      -  256  
           /**
      -  257   +  256  
            * Retrieves the timestamps from the NVD CVE meta data file.
      -  258   +  257  
            *
      -  259   +  258  
            * @return the timestamp from the currently published nvdcve downloads page
      -  260   +  259  
            * @throws MalformedURLException thrown if the URL for the NVD CCE Meta data is incorrect.
      -  261   +  260  
            * @throws DownloadFailedException thrown if there is an error downloading the nvd cve meta data file
      -  262   +  261  
            * @throws InvalidDataException thrown if there is an exception parsing the timestamps
      -  263   +  262  
            * @throws InvalidSettingException thrown if the settings are invalid
      -  264   +  263  
            */
      -  265   +  264  
           private UpdateableNvdCve retrieveCurrentTimestampsFromWeb()
      -  266   +  265  
                   throws MalformedURLException, DownloadFailedException, InvalidDataException, InvalidSettingException {
      -  267   +  266  
       
      -  268  0
               final UpdateableNvdCve updates = new UpdateableNvdCve();
      -  269  0
               updates.add(MODIFIED, Settings.getString(Settings.KEYS.CVE_MODIFIED_20_URL),
      -  270   +  267  0
               final UpdateableNvdCve updates = new UpdateableNvdCve();
      +  268  0
               updates.add(MODIFIED, Settings.getString(Settings.KEYS.CVE_MODIFIED_20_URL),
      +  269  
                       Settings.getString(Settings.KEYS.CVE_MODIFIED_12_URL),
      -  271   +  270  
                       false);
      -  272   +  271  
       
      -  273  0
               final int start = Settings.getInt(Settings.KEYS.CVE_START_YEAR);
      -  274  0
               final int end = Calendar.getInstance().get(Calendar.YEAR);
      -  275  0
               final String baseUrl20 = Settings.getString(Settings.KEYS.CVE_SCHEMA_2_0);
      -  276  0
               final String baseUrl12 = Settings.getString(Settings.KEYS.CVE_SCHEMA_1_2);
      -  277  0
               for (int i = start; i <= end; i++) {
      -  278  0
                   updates.add(Integer.toString(i), String.format(baseUrl20, i),
      -  279   +  272  0
               final int start = Settings.getInt(Settings.KEYS.CVE_START_YEAR);
      +  273  0
               final int end = Calendar.getInstance().get(Calendar.YEAR);
      +  274  0
               final String baseUrl20 = Settings.getString(Settings.KEYS.CVE_SCHEMA_2_0);
      +  275  0
               final String baseUrl12 = Settings.getString(Settings.KEYS.CVE_SCHEMA_1_2);
      +  276  0
               for (int i = start; i <= end; i++) {
      +  277  0
                   updates.add(Integer.toString(i), String.format(baseUrl20, i),
      +  278  
                           String.format(baseUrl12, i),
      -  280   +  279  
                           true);
      -  281   +  280  
               }
      -  282  0
               return updates;
      -  283   +  281  0
               return updates;
      +  282  
           }
      -  284   +  283  
       
      -  285   +  284  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.UpdateService.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.UpdateService.html index ca0059812..772c99241 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.UpdateService.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.UpdateService.html @@ -121,6 +121,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.cpe.CPEHandler.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.cpe.CPEHandler.html index 346442a10..ad240f531 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.cpe.CPEHandler.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.cpe.CPEHandler.html @@ -350,7 +350,7 @@
            * A simple class to maintain information about the current element while parsing the CPE XML.
       181  
            */
      -  182  0
           protected class Element {
      +  182  0
           protected static final class Element {
       183  
       
       184   @@ -701,6 +701,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.cpe.Cpe.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.cpe.Cpe.html index dc32692b6..0d64e6759 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.cpe.Cpe.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.cpe.Cpe.html @@ -251,6 +251,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.exception.InvalidDataException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.exception.InvalidDataException.html index 48c6ddade..efcf2f877 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.exception.InvalidDataException.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.exception.InvalidDataException.html @@ -115,6 +115,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.exception.UpdateException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.exception.UpdateException.html index 6573d851f..bf8d15d55 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.exception.UpdateException.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.exception.UpdateException.html @@ -147,6 +147,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.DownloadTask.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.DownloadTask.html index 256067208..69bf20af4 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.DownloadTask.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.DownloadTask.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      DownloadTask
      59%
      55/93
      25%
      11/44
      3.583
      DownloadTask
      53%
      50/94
      22%
      10/44
      3.583
       
      @@ -112,7 +112,7 @@
            * The Logger.
       48  
            */
      -  49  8
           private static final Logger LOGGER = LoggerFactory.getLogger(DownloadTask.class);
      +  49  1
           private static final Logger LOGGER = LoggerFactory.getLogger(DownloadTask.class);
       50  
       
       51   @@ -135,11 +135,11 @@
            * @throws UpdateException thrown if temporary files could not be created
       60  
            */
      -  61  8
           public DownloadTask(NvdCveInfo nvdCveInfo, ExecutorService processor, CveDB cveDB, Settings settings) throws UpdateException {
      -  62  8
               this.nvdCveInfo = nvdCveInfo;
      -  63  8
               this.processorService = processor;
      -  64  8
               this.cveDB = cveDB;
      -  65  8
               this.settings = settings;
      +  61  1
           public DownloadTask(NvdCveInfo nvdCveInfo, ExecutorService processor, CveDB cveDB, Settings settings) throws UpdateException {
      +  62  1
               this.nvdCveInfo = nvdCveInfo;
      +  63  1
               this.processorService = processor;
      +  64  1
               this.cveDB = cveDB;
      +  65  1
               this.settings = settings;
       66  
       
       67   @@ -150,16 +150,16 @@
       
       70  
               try {
      -  71  8
                   file1 = File.createTempFile("cve" + nvdCveInfo.getId() + "_", ".xml", Settings.getTempDirectory());
      -  72  8
                   file2 = File.createTempFile("cve_1_2_" + nvdCveInfo.getId() + "_", ".xml", Settings.getTempDirectory());
      +  71  1
                   file1 = File.createTempFile("cve" + nvdCveInfo.getId() + "_", ".xml", Settings.getTempDirectory());
      +  72  1
                   file2 = File.createTempFile("cve_1_2_" + nvdCveInfo.getId() + "_", ".xml", Settings.getTempDirectory());
       73  0
               } catch (IOException ex) {
       74  0
                   throw new UpdateException("Unable to create temporary files", ex);
      -  75  8
               }
      -  76  8
               this.first = file1;
      -  77  8
               this.second = file2;
      +  75  1
               }
      +  76  1
               this.first = file1;
      +  77  1
               this.second = file2;
       78  
       
      -  79  8
           }
      +  79  1
           }
       80  
           /**
       81   @@ -313,7 +313,7 @@
            * A placeholder for an exception.
       160  
            */
      -  161  8
           private Exception exception = null;
      +  161  1
           private Exception exception = null;
       162  
       
       163   @@ -356,174 +356,177 @@
           public Future<ProcessTask> call() throws Exception {
       183  
               try {
      -  184  8
                   Settings.setInstance(settings);
      -  185  8
                   final URL url1 = new URL(nvdCveInfo.getUrl());
      -  186  8
                   final URL url2 = new URL(nvdCveInfo.getOldSchemaVersionUrl());
      -  187  8
                   LOGGER.info("Download Started for NVD CVE - {}", nvdCveInfo.getId());
      -  188   +  184  1
                   Settings.setInstance(settings);
      +  185  1
                   final URL url1 = new URL(nvdCveInfo.getUrl());
      +  186  1
                   final URL url2 = new URL(nvdCveInfo.getOldSchemaVersionUrl());
      +  187  1
                   LOGGER.info("Download Started for NVD CVE - {}", nvdCveInfo.getId());
      +  188  1
                   final long startDownload = System.currentTimeMillis();
      +  189  
                   try {
      -  189  8
                       Downloader.fetchFile(url1, first);
      -  190  3
                       Downloader.fetchFile(url2, second);
      -  191  5
                   } catch (DownloadFailedException ex) {
      -  192  5
                       LOGGER.warn("Download Failed for NVD CVE - {}\nSome CVEs may not be reported.", nvdCveInfo.getId());
      -  193  5
                       if (Settings.getString(Settings.KEYS.PROXY_SERVER) == null) {
      -  194  5
                           LOGGER.info(
      -  195   -
                                   "If you are behind a proxy you may need to configure dependency-check to use the proxy.");
      +  190  1
                       Downloader.fetchFile(url1, first);
      +  191  1
                       Downloader.fetchFile(url2, second);
      +  192  0
                   } catch (DownloadFailedException ex) {
      +  193  0
                       LOGGER.warn("Download Failed for NVD CVE - {}\nSome CVEs may not be reported.", nvdCveInfo.getId());
      +  194  0
                       if (Settings.getString(Settings.KEYS.PROXY_SERVER) == null) {
      +  195  0
                           LOGGER.info(
       196   +
                                   "If you are behind a proxy you may need to configure dependency-check to use the proxy.");
      +  197  
                       }
      -  197  5
                       LOGGER.debug("", ex);
      -  198  5
                       return null;
      -  199  3
                   }
      -  200  3
                   if (url1.toExternalForm().endsWith(".xml.gz")) {
      -  201  3
                       extractGzip(first);
      -  202   -
                   }
      -  203  3
                   if (url2.toExternalForm().endsWith(".xml.gz")) {
      -  204  3
                       extractGzip(second);
      -  205   +  198  0
                       LOGGER.debug("", ex);
      +  199  0
                       return null;
      +  200  1
                   }
      +  201  1
                   if (url1.toExternalForm().endsWith(".xml.gz")) {
      +  202  1
                       extractGzip(first);
      +  203  
                   }
      +  204  1
                   if (url2.toExternalForm().endsWith(".xml.gz")) {
      +  205  1
                       extractGzip(second);
       206   -
       
      -  207  3
                   LOGGER.info("Download Complete for NVD CVE - {}", nvdCveInfo.getId());
      -  208  3
                   if (this.processorService == null) {
      -  209  3
                       return null;
      -  210  
                   }
      -  211  0
                   final ProcessTask task = new ProcessTask(cveDB, this, settings);
      -  212  0
                   return this.processorService.submit(task);
      -  213   +  207  
       
      -  214  0
               } catch (Throwable ex) {
      -  215  0
                   LOGGER.warn("An exception occurred downloading NVD CVE - {}\nSome CVEs may not be reported.", nvdCveInfo.getId());
      -  216  0
                   LOGGER.debug("Download Task Failed", ex);
      -  217   +  208  1
                   LOGGER.info("Download Complete for NVD CVE - {}  ({} ms)", nvdCveInfo.getId(),
      +  209   +
                       System.currentTimeMillis() - startDownload);
      +  210  1
                   if (this.processorService == null) {
      +  211  1
                       return null;
      +  212   +
                   }
      +  213  0
                   final ProcessTask task = new ProcessTask(cveDB, this, settings);
      +  214  0
                   return this.processorService.submit(task);
      +  215   +
       
      +  216  0
               } catch (Throwable ex) {
      +  217  0
                   LOGGER.warn("An exception occurred downloading NVD CVE - {}\nSome CVEs may not be reported.", nvdCveInfo.getId());
      +  218  0
                   LOGGER.debug("Download Task Failed", ex);
      +  219  
               } finally {
      -  218  8
                   Settings.cleanup(false);
      -  219  0
               }
      -  220  0
               return null;
      -  221   -
           }
      -  222   -
       
      +  220  1
                   Settings.cleanup(false);
      +  221  0
               }
      +  222  0
               return null;
       223   -
           /**
      +
           }
       224   -
            * Attempts to delete the files that were downloaded.
      +
       
       225   -
            */
      -  226   -
           public void cleanup() {
      -  227  0
               boolean deleted = false;
      -  228   -
               try {
      -  229  0
                   if (first != null && first.exists()) {
      -  230  0
                       deleted = first.delete();
      -  231   -
                   }
      -  232   -
               } finally {
      -  233  0
                   if (first != null && (first.exists() || !deleted)) {
      -  234  0
                       first.deleteOnExit();
      -  235   -
                   }
      -  236   -
               }
      -  237   -
               try {
      -  238  0
                   deleted = false;
      -  239  0
                   if (second != null && second.exists()) {
      -  240  0
                       deleted = second.delete();
      -  241   -
                   }
      -  242   -
               } finally {
      -  243  0
                   if (second != null && (second.exists() || !deleted)) {
      -  244  0
                       second.deleteOnExit();
      -  245   -
                   }
      -  246   -
               }
      -  247  0
           }
      -  248   -
       
      -  249  
           /**
      -  250   -
            * Extracts the file contained in a gzip archive. The extracted file is placed in the exact same path as the file specified.
      -  251   -
            *
      -  252   -
            * @param file the archive file
      -  253   -
            * @throws FileNotFoundException thrown if the file does not exist
      -  254   -
            * @throws IOException thrown if there is an error extracting the file.
      -  255   +  226   +
            * Attempts to delete the files that were downloaded.
      +  227  
            */
      -  256   -
           private void extractGzip(File file) throws FileNotFoundException, IOException {
      -  257  6
               final String originalPath = file.getPath();
      -  258  6
               final File gzip = new File(originalPath + ".gz");
      -  259  6
               if (gzip.isFile() && !gzip.delete()) {
      -  260  0
                   gzip.deleteOnExit();
      -  261   +  228   +
           public void cleanup() {
      +  229  0
               boolean deleted = false;
      +  230   +
               try {
      +  231  0
                   if (first != null && first.exists()) {
      +  232  0
                       deleted = first.delete();
      +  233   +
                   }
      +  234   +
               } finally {
      +  235  0
                   if (first != null && (first.exists() || !deleted)) {
      +  236  0
                       first.deleteOnExit();
      +  237   +
                   }
      +  238  
               }
      -  262  6
               if (!file.renameTo(gzip)) {
      -  263  0
                   throw new IOException("Unable to rename '" + file.getPath() + "'");
      -  264   +  239   +
               try {
      +  240  0
                   deleted = false;
      +  241  0
                   if (second != null && second.exists()) {
      +  242  0
                       deleted = second.delete();
      +  243   +
                   }
      +  244   +
               } finally {
      +  245  0
                   if (second != null && (second.exists() || !deleted)) {
      +  246  0
                       second.deleteOnExit();
      +  247   +
                   }
      +  248  
               }
      -  265  6
               final File newfile = new File(originalPath);
      -  266   +  249  0
           }
      +  250  
       
      -  267  6
               final byte[] buffer = new byte[4096];
      +  251   +
           /**
      +  252   +
            * Extracts the file contained in a gzip archive. The extracted file is placed in the exact same path as the file specified.
      +  253   +
            *
      +  254   +
            * @param file the archive file
      +  255   +
            * @throws FileNotFoundException thrown if the file does not exist
      +  256   +
            * @throws IOException thrown if there is an error extracting the file.
      +  257   +
            */
      +  258   +
           private void extractGzip(File file) throws FileNotFoundException, IOException {
      +  259  2
               final String originalPath = file.getPath();
      +  260  2
               final File gzip = new File(originalPath + ".gz");
      +  261  2
               if (gzip.isFile() && !gzip.delete()) {
      +  262  0
                   gzip.deleteOnExit();
      +  263   +
               }
      +  264  2
               if (!file.renameTo(gzip)) {
      +  265  0
                   throw new IOException("Unable to rename '" + file.getPath() + "'");
      +  266   +
               }
      +  267  2
               final File newfile = new File(originalPath);
       268  
       
      -  269  6
               GZIPInputStream cin = null;
      -  270  6
               FileOutputStream out = null;
      -  271   -
               try {
      -  272  6
                   cin = new GZIPInputStream(new FileInputStream(gzip));
      -  273  6
                   out = new FileOutputStream(newfile);
      -  274   +  269  2
               final byte[] buffer = new byte[4096];
      +  270  
       
      -  275   +  271  2
               GZIPInputStream cin = null;
      +  272  2
               FileOutputStream out = null;
      +  273   +
               try {
      +  274  2
                   cin = new GZIPInputStream(new FileInputStream(gzip));
      +  275  2
                   out = new FileOutputStream(newfile);
      +  276   +
       
      +  277  
                   int len;
      -  276  1767
                   while ((len = cin.read(buffer)) > 0) {
      -  277  1761
                       out.write(buffer, 0, len);
      -  278   +  278  618
                   while ((len = cin.read(buffer)) > 0) {
      +  279  616
                       out.write(buffer, 0, len);
      +  280  
                   }
      -  279   -
               } finally {
      -  280  6
                   if (cin != null) {
       281   +
               } finally {
      +  282  2
                   if (cin != null) {
      +  283  
                       try {
      -  282  6
                           cin.close();
      -  283  0
                       } catch (IOException ex) {
      -  284  0
                           LOGGER.trace("ignore", ex);
      -  285  6
                       }
      -  286   -
                   }
      -  287  6
                   if (out != null) {
      +  284  2
                           cin.close();
      +  285  0
                       } catch (IOException ex) {
      +  286  0
                           LOGGER.trace("ignore", ex);
      +  287  2
                       }
       288   +
                   }
      +  289  2
                   if (out != null) {
      +  290  
                       try {
      -  289  6
                           out.close();
      -  290  0
                       } catch (IOException ex) {
      -  291  0
                           LOGGER.trace("ignore", ex);
      -  292  6
                       }
      -  293   +  291  2
                           out.close();
      +  292  0
                       } catch (IOException ex) {
      +  293  0
                           LOGGER.trace("ignore", ex);
      +  294  2
                       }
      +  295  
                   }
      -  294  6
                   if (gzip.isFile()) {
      -  295  6
                       FileUtils.deleteQuietly(gzip);
      -  296   +  296  2
                   if (gzip.isFile()) {
      +  297  2
                       FileUtils.deleteQuietly(gzip);
      +  298  
                   }
      -  297   -
               }
      -  298  6
           }
       299   +
               }
      +  300  2
           }
      +  301  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.NvdCve12Handler.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.NvdCve12Handler.html index c1afc30b3..4c2beb143 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.NvdCve12Handler.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.NvdCve12Handler.html @@ -90,7 +90,7 @@
        * @author Jeremy Long
       36  
        */
      -  37  8
       public class NvdCve12Handler extends DefaultHandler {
      +  37  1
       public class NvdCve12Handler extends DefaultHandler {
       38  
       
       39   @@ -139,21 +139,21 @@
            * if the nvd cve should be skipped because it was rejected.
       61  
            */
      -  62  8
           private boolean skip = false;
      +  62  1
           private boolean skip = false;
       63  
           /**
       64  
            * flag indicating if there is a previous version.
       65  
            */
      -  66  8
           private boolean hasPreviousVersion = false;
      +  66  1
           private boolean hasPreviousVersion = false;
       67  
           /**
       68  
            * The current element.
       69  
            */
      -  70  8
           private final Element current = new Element();
      +  70  1
           private final Element current = new Element();
       71  
           /**
       72   @@ -176,7 +176,7 @@
            */
       81  
           public Map<String, List<VulnerableSoftware>> getVulnerabilities() {
      -  82  8
               return vulnerabilities;
      +  82  1
               return vulnerabilities;
       83  
           }
       84   @@ -185,33 +185,33 @@
           @Override
       86  
           public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
      -  87  9776
               current.setNode(qName);
      -  88  9776
               if (current.isEntryNode()) {
      -  89  216
                   vendor = null;
      -  90  216
                   product = null;
      -  91  216
                   hasPreviousVersion = false;
      -  92  216
                   final String reject = attributes.getValue("reject");
      -  93  216
                   skip = "1".equals(reject);
      -  94  216
                   if (!skip) {
      -  95  208
                       vulnerability = attributes.getValue("name");
      -  96  208
                       software = new ArrayList<VulnerableSoftware>();
      +  87  1222
               current.setNode(qName);
      +  88  1222
               if (current.isEntryNode()) {
      +  89  27
                   vendor = null;
      +  90  27
                   product = null;
      +  91  27
                   hasPreviousVersion = false;
      +  92  27
                   final String reject = attributes.getValue("reject");
      +  93  27
                   skip = "1".equals(reject);
      +  94  27
                   if (!skip) {
      +  95  26
                       vulnerability = attributes.getValue("name");
      +  96  26
                       software = new ArrayList<VulnerableSoftware>();
       97  
                   } else {
      -  98  8
                       vulnerability = null;
      -  99  8
                       software = null;
      +  98  1
                       vulnerability = null;
      +  99  1
                       software = null;
       100  
                   }
      -  101  216
               } else if (!skip && current.isProdNode()) {
      +  101  27
               } else if (!skip && current.isProdNode()) {
       102  
       
      -  103  416
                   vendor = attributes.getValue("vendor");
      -  104  416
                   product = attributes.getValue("name");
      -  105  9144
               } else if (!skip && current.isVersNode()) {
      -  106  6088
                   final String prev = attributes.getValue("prev");
      -  107  6088
                   if (prev != null && "1".equals(prev)) {
      -  108  8
                       hasPreviousVersion = true;
      -  109  8
                       final String edition = attributes.getValue("edition");
      -  110  8
                       final String num = attributes.getValue("num");
      +  103  52
                   vendor = attributes.getValue("vendor");
      +  104  52
                   product = attributes.getValue("name");
      +  105  1143
               } else if (!skip && current.isVersNode()) {
      +  106  761
                   final String prev = attributes.getValue("prev");
      +  107  761
                   if (prev != null && "1".equals(prev)) {
      +  108  1
                       hasPreviousVersion = true;
      +  109  1
                       final String edition = attributes.getValue("edition");
      +  110  1
                       final String num = attributes.getValue("num");
       111  
       
       112   @@ -220,48 +220,48 @@
                        purposes this is good enough as we won't use this if we don't find a corresponding "a"
       114  
                        in the nvd cve 2.0. */
      -  115  8
                       String cpe = "cpe:/a:" + vendor + ":" + product;
      -  116  8
                       if (num != null) {
      -  117  8
                           cpe += ":" + num;
      +  115  1
                       String cpe = "cpe:/a:" + vendor + ":" + product;
      +  116  1
                       if (num != null) {
      +  117  1
                           cpe += ":" + num;
       118  
                       }
      -  119  8
                       if (edition != null) {
      +  119  1
                       if (edition != null) {
       120  0
                           cpe += ":" + edition;
       121  
                       }
      -  122  8
                       final VulnerableSoftware vs = new VulnerableSoftware();
      -  123  8
                       vs.setCpe(cpe);
      -  124  8
                       vs.setPreviousVersion(prev);
      -  125  8
                       software.add(vs);
      +  122  1
                       final VulnerableSoftware vs = new VulnerableSoftware();
      +  123  1
                       vs.setCpe(cpe);
      +  124  1
                       vs.setPreviousVersion(prev);
      +  125  1
                       software.add(vs);
       126  
                   }
      -  127  6088
               } else if (current.isNVDNode()) {
      -  128  8
                   final String nvdVer = attributes.getValue("nvd_xml_version");
      -  129  8
                   if (!CURRENT_SCHEMA_VERSION.equals(nvdVer)) {
      +  127  761
               } else if (current.isNVDNode()) {
      +  128  1
                   final String nvdVer = attributes.getValue("nvd_xml_version");
      +  129  1
                   if (!CURRENT_SCHEMA_VERSION.equals(nvdVer)) {
       130  0
                       throw new SAXNotSupportedException("Schema version " + nvdVer + " is not supported");
       131  
                   }
      -  132  8
                   vulnerabilities = new HashMap<String, List<VulnerableSoftware>>();
      +  132  1
                   vulnerabilities = new HashMap<String, List<VulnerableSoftware>>();
       133  
               }
      -  134  9776
           }
      +  134  1222
           }
       135  
       
       136  
           @Override
       137  
           public void endElement(String uri, String localName, String qName) throws SAXException {
      -  138  9776
               current.setNode(qName);
      -  139  9776
               if (current.isEntryNode()) {
      -  140  216
                   if (!skip && hasPreviousVersion) {
      -  141  8
                       vulnerabilities.put(vulnerability, software);
      +  138  1222
               current.setNode(qName);
      +  139  1222
               if (current.isEntryNode()) {
      +  140  27
                   if (!skip && hasPreviousVersion) {
      +  141  1
                       vulnerabilities.put(vulnerability, software);
       142  
                   }
      -  143  216
                   vulnerability = null;
      -  144  216
                   software = null;
      +  143  27
                   vulnerability = null;
      +  144  27
                   software = null;
       145  
               }
      -  146  9776
           }
      +  146  1222
           }
       147  
       
       148   @@ -272,7 +272,7 @@
            * A simple class to maintain information about the current element while parsing the NVD CVE XML.
       151  
            */
      -  152  8
           protected static class Element {
      +  152  1
           protected static class Element {
       153  
       
       154   @@ -354,8 +354,8 @@
                */
       193  
               public void setNode(String node) {
      -  194  19552
                   this.node = node;
      -  195  19552
               }
      +  194  2444
                   this.node = node;
      +  195  2444
               }
       196  
       
       197   @@ -370,7 +370,7 @@
                */
       202  
               public boolean isNVDNode() {
      -  203  3056
                   return NVD.equals(node);
      +  203  382
                   return NVD.equals(node);
       204  
               }
       205   @@ -387,7 +387,7 @@
                */
       211  
               public boolean isEntryNode() {
      -  212  19552
                   return ENTRY.equals(node);
      +  212  2444
                   return ENTRY.equals(node);
       213  
               }
       214   @@ -421,7 +421,7 @@
                */
       229  
               public boolean isProdNode() {
      -  230  9536
                   return PROD.equals(node);
      +  230  1192
                   return PROD.equals(node);
       231  
               }
       232   @@ -438,7 +438,7 @@
                */
       238  
               public boolean isVersNode() {
      -  239  9120
                   return VERS.equals(node);
      +  239  1140
                   return VERS.equals(node);
       240  
               }
       241   @@ -449,6 +449,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.NvdCve20Handler.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.NvdCve20Handler.html index 831821632..eca2646c9 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.NvdCve20Handler.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.NvdCve20Handler.html @@ -98,7 +98,7 @@
        * @author Jeremy Long
       40  
        */
      -  41  8
       public class NvdCve20Handler extends DefaultHandler {
      +  41  1
       public class NvdCve20Handler extends DefaultHandler {
       42  
       
       43   @@ -107,7 +107,7 @@
            * The logger.
       45  
            */
      -  46  8
           private static final Logger LOGGER = LoggerFactory.getLogger(NvdCve20Handler.class);
      +  46  1
           private static final Logger LOGGER = LoggerFactory.getLogger(NvdCve20Handler.class);
       47  
           /**
       48   @@ -122,7 +122,7 @@
            * the current element.
       53  
            */
      -  54  8
           private final Element current = new Element();
      +  54  1
           private final Element current = new Element();
       55  
           /**
       56   @@ -153,7 +153,7 @@
            * flag indicating whether the application has a cpe.
       69  
            */
      -  70  8
           private boolean hasApplicationCpe = false;
      +  70  1
           private boolean hasApplicationCpe = false;
       71  
           /**
       72   @@ -210,144 +210,144 @@
           @Override
       99  
           public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
      -  100  19296
               current.setNode(qName);
      -  101  19296
               if (current.isEntryNode()) {
      -  102  216
                   hasApplicationCpe = false;
      -  103  216
                   vulnerability = new Vulnerability();
      -  104  216
                   vulnerability.setName(attributes.getValue("id"));
      -  105  19080
               } else if (current.isVulnProductNode()) {
      -  106  5816
                   nodeText = new StringBuilder(100);
      -  107  13264
               } else if (current.isVulnReferencesNode()) {
      -  108  720
                   final String lang = attributes.getValue("xml:lang");
      -  109  720
                   if ("en".equals(lang)) {
      -  110  720
                       reference = new Reference();
      +  100  2412
               current.setNode(qName);
      +  101  2412
               if (current.isEntryNode()) {
      +  102  27
                   hasApplicationCpe = false;
      +  103  27
                   vulnerability = new Vulnerability();
      +  104  27
                   vulnerability.setName(attributes.getValue("id"));
      +  105  2385
               } else if (current.isVulnProductNode()) {
      +  106  727
                   nodeText = new StringBuilder(100);
      +  107  1658
               } else if (current.isVulnReferencesNode()) {
      +  108  90
                   final String lang = attributes.getValue("xml:lang");
      +  109  90
                   if ("en".equals(lang)) {
      +  110  90
                       reference = new Reference();
       111  
                   } else {
       112  0
                       reference = null;
       113  
                   }
      -  114  720
               } else if (reference != null && current.isVulnReferenceNode()) {
      -  115  720
                   reference.setUrl(attributes.getValue("href"));
      -  116  720
                   nodeText = new StringBuilder(130);
      -  117  11824
               } else if (reference != null && current.isVulnSourceNode()) {
      -  118  720
                   nodeText = new StringBuilder(30);
      -  119  11104
               } else if (current.isVulnSummaryNode()) {
      -  120  216
                   nodeText = new StringBuilder(500);
      -  121  10888
               } else if (current.isNVDNode()) {
      -  122  8
                   final String nvdVer = attributes.getValue("nvd_xml_version");
      -  123  8
                   if (!CURRENT_SCHEMA_VERSION.equals(nvdVer)) {
      +  114  90
               } else if (reference != null && current.isVulnReferenceNode()) {
      +  115  90
                   reference.setUrl(attributes.getValue("href"));
      +  116  90
                   nodeText = new StringBuilder(130);
      +  117  1478
               } else if (reference != null && current.isVulnSourceNode()) {
      +  118  90
                   nodeText = new StringBuilder(30);
      +  119  1388
               } else if (current.isVulnSummaryNode()) {
      +  120  27
                   nodeText = new StringBuilder(500);
      +  121  1361
               } else if (current.isNVDNode()) {
      +  122  1
                   final String nvdVer = attributes.getValue("nvd_xml_version");
      +  123  1
                   if (!CURRENT_SCHEMA_VERSION.equals(nvdVer)) {
       124  0
                       throw new SAXNotSupportedException("Schema version " + nvdVer + " is not supported");
       125  
                   }
      -  126  8
               } else if (current.isVulnCWENode()) {
      -  127  152
                   vulnerability.setCwe(attributes.getValue("id"));
      -  128  10728
               } else if (current.isCVSSScoreNode()) {
      -  129  208
                   nodeText = new StringBuilder(5);
      -  130  10520
               } else if (current.isCVSSAccessVectorNode()) {
      -  131  208
                   nodeText = new StringBuilder(20);
      -  132  10312
               } else if (current.isCVSSAccessComplexityNode()) {
      -  133  208
                   nodeText = new StringBuilder(20);
      -  134  10104
               } else if (current.isCVSSAuthenticationNode()) {
      -  135  208
                   nodeText = new StringBuilder(20);
      -  136  9896
               } else if (current.isCVSSAvailabilityImpactNode()) {
      -  137  208
                   nodeText = new StringBuilder(20);
      -  138  9688
               } else if (current.isCVSSConfidentialityImpactNode()) {
      -  139  208
                   nodeText = new StringBuilder(20);
      -  140  9480
               } else if (current.isCVSSIntegrityImpactNode()) {
      -  141  208
                   nodeText = new StringBuilder(20);
      +  126  1
               } else if (current.isVulnCWENode()) {
      +  127  19
                   vulnerability.setCwe(attributes.getValue("id"));
      +  128  1341
               } else if (current.isCVSSScoreNode()) {
      +  129  26
                   nodeText = new StringBuilder(5);
      +  130  1315
               } else if (current.isCVSSAccessVectorNode()) {
      +  131  26
                   nodeText = new StringBuilder(20);
      +  132  1289
               } else if (current.isCVSSAccessComplexityNode()) {
      +  133  26
                   nodeText = new StringBuilder(20);
      +  134  1263
               } else if (current.isCVSSAuthenticationNode()) {
      +  135  26
                   nodeText = new StringBuilder(20);
      +  136  1237
               } else if (current.isCVSSAvailabilityImpactNode()) {
      +  137  26
                   nodeText = new StringBuilder(20);
      +  138  1211
               } else if (current.isCVSSConfidentialityImpactNode()) {
      +  139  26
                   nodeText = new StringBuilder(20);
      +  140  1185
               } else if (current.isCVSSIntegrityImpactNode()) {
      +  141  26
                   nodeText = new StringBuilder(20);
       142  
               }
      -  143  19296
           }
      +  143  2412
           }
       144  
       
       145  
           @Override
       146  
           public void characters(char[] ch, int start, int length) throws SAXException {
      -  147  31896
               if (nodeText != null) {
      -  148  9136
                   nodeText.append(ch, start, length);
      +  147  3987
               if (nodeText != null) {
      +  148  1142
                   nodeText.append(ch, start, length);
       149  
               }
      -  150  31896
           }
      +  150  3987
           }
       151  
       
       152  
           @Override
       153  
           public void endElement(String uri, String localName, String qName) throws SAXException {
      -  154  19296
               current.setNode(qName);
      -  155  19296
               if (current.isEntryNode()) {
      -  156  216
                   totalNumberOfEntries += 1;
      -  157  216
                   if (hasApplicationCpe) {
      -  158  152
                       totalNumberOfApplicationEntries += 1;
      +  154  2412
               current.setNode(qName);
      +  155  2412
               if (current.isEntryNode()) {
      +  156  27
                   totalNumberOfEntries += 1;
      +  157  27
                   if (hasApplicationCpe) {
      +  158  19
                       totalNumberOfApplicationEntries += 1;
       159  
                       try {
      -  160  152
                           saveEntry(vulnerability);
      +  160  19
                           saveEntry(vulnerability);
       161  0
                       } catch (DatabaseException ex) {
       162  0
                           throw new SAXException(ex);
       163  0
                       } catch (CorruptIndexException ex) {
       164  0
                           throw new SAXException(ex);
       165  0
                       } catch (IOException ex) {
       166  0
                           throw new SAXException(ex);
      -  167  152
                       }
      +  167  19
                       }
       168  
                   }
      -  169  216
                   vulnerability = null;
      -  170  19080
               } else if (current.isCVSSScoreNode()) {
      +  169  27
                   vulnerability = null;
      +  170  2385
               } else if (current.isCVSSScoreNode()) {
       171  
                   try {
      -  172  208
                       final float score = Float.parseFloat(nodeText.toString());
      -  173  208
                       vulnerability.setCvssScore(score);
      +  172  26
                       final float score = Float.parseFloat(nodeText.toString());
      +  173  26
                       vulnerability.setCvssScore(score);
       174  0
                   } catch (NumberFormatException ex) {
       175  0
                       LOGGER.error("Error parsing CVSS Score.");
       176  0
                       LOGGER.debug("", ex);
      -  177  208
                   }
      -  178  208
                   nodeText = null;
      -  179  18872
               } else if (current.isCVSSAccessVectorNode()) {
      -  180  208
                   vulnerability.setCvssAccessVector(nodeText.toString());
      -  181  208
                   nodeText = null;
      -  182  18664
               } else if (current.isCVSSAccessComplexityNode()) {
      -  183  208
                   vulnerability.setCvssAccessComplexity(nodeText.toString());
      -  184  208
                   nodeText = null;
      -  185  18456
               } else if (current.isCVSSAuthenticationNode()) {
      -  186  208
                   vulnerability.setCvssAuthentication(nodeText.toString());
      -  187  208
                   nodeText = null;
      -  188  18248
               } else if (current.isCVSSAvailabilityImpactNode()) {
      -  189  208
                   vulnerability.setCvssAvailabilityImpact(nodeText.toString());
      -  190  208
                   nodeText = null;
      -  191  18040
               } else if (current.isCVSSConfidentialityImpactNode()) {
      -  192  208
                   vulnerability.setCvssConfidentialityImpact(nodeText.toString());
      -  193  208
                   nodeText = null;
      -  194  17832
               } else if (current.isCVSSIntegrityImpactNode()) {
      -  195  208
                   vulnerability.setCvssIntegrityImpact(nodeText.toString());
      -  196  208
                   nodeText = null;
      -  197  17624
               } else if (current.isVulnProductNode()) {
      -  198  5816
                   final String cpe = nodeText.toString();
      -  199  5816
                   if (cpe.startsWith("cpe:/a:")) {
      -  200  4912
                       hasApplicationCpe = true;
      -  201  4912
                       vulnerability.addVulnerableSoftware(cpe);
      +  177  26
                   }
      +  178  26
                   nodeText = null;
      +  179  2359
               } else if (current.isCVSSAccessVectorNode()) {
      +  180  26
                   vulnerability.setCvssAccessVector(nodeText.toString());
      +  181  26
                   nodeText = null;
      +  182  2333
               } else if (current.isCVSSAccessComplexityNode()) {
      +  183  26
                   vulnerability.setCvssAccessComplexity(nodeText.toString());
      +  184  26
                   nodeText = null;
      +  185  2307
               } else if (current.isCVSSAuthenticationNode()) {
      +  186  26
                   vulnerability.setCvssAuthentication(nodeText.toString());
      +  187  26
                   nodeText = null;
      +  188  2281
               } else if (current.isCVSSAvailabilityImpactNode()) {
      +  189  26
                   vulnerability.setCvssAvailabilityImpact(nodeText.toString());
      +  190  26
                   nodeText = null;
      +  191  2255
               } else if (current.isCVSSConfidentialityImpactNode()) {
      +  192  26
                   vulnerability.setCvssConfidentialityImpact(nodeText.toString());
      +  193  26
                   nodeText = null;
      +  194  2229
               } else if (current.isCVSSIntegrityImpactNode()) {
      +  195  26
                   vulnerability.setCvssIntegrityImpact(nodeText.toString());
      +  196  26
                   nodeText = null;
      +  197  2203
               } else if (current.isVulnProductNode()) {
      +  198  727
                   final String cpe = nodeText.toString();
      +  199  727
                   if (cpe.startsWith("cpe:/a:")) {
      +  200  614
                       hasApplicationCpe = true;
      +  201  614
                       vulnerability.addVulnerableSoftware(cpe);
       202  
                   }
      -  203  5816
                   nodeText = null;
      -  204  5816
               } else if (reference != null && current.isVulnReferencesNode()) {
      -  205  720
                   vulnerability.addReference(reference);
      -  206  720
                   reference = null;
      -  207  11088
               } else if (reference != null && current.isVulnReferenceNode()) {
      -  208  720
                   reference.setName(nodeText.toString());
      -  209  720
                   nodeText = null;
      -  210  10368
               } else if (reference != null && current.isVulnSourceNode()) {
      -  211  720
                   reference.setSource(nodeText.toString());
      -  212  720
                   nodeText = null;
      -  213  9648
               } else if (current.isVulnSummaryNode()) {
      -  214  216
                   vulnerability.setDescription(nodeText.toString());
      -  215  216
                   if (nodeText.indexOf("** REJECT **") >= 0) {
      -  216  8
                       hasApplicationCpe = true; //ensure we process this to delete the vuln
      +  203  727
                   nodeText = null;
      +  204  727
               } else if (reference != null && current.isVulnReferencesNode()) {
      +  205  90
                   vulnerability.addReference(reference);
      +  206  90
                   reference = null;
      +  207  1386
               } else if (reference != null && current.isVulnReferenceNode()) {
      +  208  90
                   reference.setName(nodeText.toString());
      +  209  90
                   nodeText = null;
      +  210  1296
               } else if (reference != null && current.isVulnSourceNode()) {
      +  211  90
                   reference.setSource(nodeText.toString());
      +  212  90
                   nodeText = null;
      +  213  1206
               } else if (current.isVulnSummaryNode()) {
      +  214  27
                   vulnerability.setDescription(nodeText.toString());
      +  215  27
                   if (nodeText.indexOf("** REJECT **") >= 0) {
      +  216  1
                       hasApplicationCpe = true; //ensure we process this to delete the vuln
       217  
                   }
      -  218  216
                   nodeText = null;
      +  218  27
                   nodeText = null;
       219  
               }
      -  220  19296
           }
      +  220  2412
           }
       221  
           /**
       222   @@ -416,8 +416,8 @@
            */
       256  
           private void saveEntry(Vulnerability vuln) throws DatabaseException, CorruptIndexException, IOException {
      -  257  152
               if (cveDB == null) {
      -  258  152
                   return;
      +  257  19
               if (cveDB == null) {
      +  258  19
                   return;
       259  
               }
       260  0
               final String cveName = vuln.getName();
      @@ -440,7 +440,7 @@
            * A simple class to maintain information about the current element while parsing the NVD CVE XML.
       273  
            */
      -  274  8
           protected static class Element {
      +  274  1
           protected static class Element {
       275  
       
       276   @@ -602,8 +602,8 @@
                */
       355  
               public void setNode(String node) {
      -  356  38592
                   this.node = node;
      -  357  38592
               }
      +  356  4824
                   this.node = node;
      +  357  4824
               }
       358  
       
       359   @@ -618,7 +618,7 @@
                */
       364  
               public boolean isNVDNode() {
      -  365  10888
                   return NVD.equals(node);
      +  365  1361
                   return NVD.equals(node);
       366  
               }
       367   @@ -635,7 +635,7 @@
                */
       373  
               public boolean isEntryNode() {
      -  374  38592
                   return ENTRY.equals(node);
      +  374  4824
                   return ENTRY.equals(node);
       375  
               }
       376   @@ -652,7 +652,7 @@
                */
       382  
               public boolean isVulnProductNode() {
      -  383  36704
                   return VULN_PRODUCT.equals(node);
      +  383  4588
                   return VULN_PRODUCT.equals(node);
       384  
               }
       385   @@ -669,7 +669,7 @@
                */
       391  
               public boolean isVulnReferencesNode() {
      -  392  15424
                   return VULN_REFERENCES.equals(node);
      +  392  1928
                   return VULN_REFERENCES.equals(node);
       393  
               }
       394   @@ -686,7 +686,7 @@
                */
       400  
               public boolean isVulnReferenceNode() {
      -  401  2880
                   return VULN_REFERENCE.equals(node);
      +  401  360
                   return VULN_REFERENCE.equals(node);
       402  
               }
       403   @@ -703,7 +703,7 @@
                */
       409  
               public boolean isVulnSourceNode() {
      -  410  1440
                   return VULN_SOURCE.equals(node);
      +  410  180
                   return VULN_SOURCE.equals(node);
       411  
               }
       412   @@ -720,7 +720,7 @@
                */
       418  
               public boolean isVulnSummaryNode() {
      -  419  20752
                   return VULN_SUMMARY.equals(node);
      +  419  2594
                   return VULN_SUMMARY.equals(node);
       420  
               }
       421   @@ -737,7 +737,7 @@
                */
       427  
               public boolean isVulnCWENode() {
      -  428  10880
                   return VULN_CWE.equals(node);
      +  428  1360
                   return VULN_CWE.equals(node);
       429  
               }
       430   @@ -754,7 +754,7 @@
                */
       436  
               public boolean isCVSSScoreNode() {
      -  437  29808
                   return CVSS_SCORE.equals(node);
      +  437  3726
                   return CVSS_SCORE.equals(node);
       438  
               }
       439   @@ -771,7 +771,7 @@
                */
       445  
               public boolean isCVSSAccessVectorNode() {
      -  446  29392
                   return CVSS_ACCESS_VECTOR.equals(node);
      +  446  3674
                   return CVSS_ACCESS_VECTOR.equals(node);
       447  
               }
       448   @@ -788,7 +788,7 @@
                */
       454  
               public boolean isCVSSAccessComplexityNode() {
      -  455  28976
                   return CVSS_ACCESS_COMPLEXITY.equals(node);
      +  455  3622
                   return CVSS_ACCESS_COMPLEXITY.equals(node);
       456  
               }
       457   @@ -805,7 +805,7 @@
                */
       463  
               public boolean isCVSSAuthenticationNode() {
      -  464  28560
                   return CVSS_AUTHENTICATION.equals(node);
      +  464  3570
                   return CVSS_AUTHENTICATION.equals(node);
       465  
               }
       466   @@ -822,7 +822,7 @@
                */
       472  
               public boolean isCVSSConfidentialityImpactNode() {
      -  473  27728
                   return CVSS_CONFIDENTIALITY_IMPACT.equals(node);
      +  473  3466
                   return CVSS_CONFIDENTIALITY_IMPACT.equals(node);
       474  
               }
       475   @@ -839,7 +839,7 @@
                */
       481  
               public boolean isCVSSIntegrityImpactNode() {
      -  482  27312
                   return CVSS_INTEGRITY_IMPACT.equals(node);
      +  482  3414
                   return CVSS_INTEGRITY_IMPACT.equals(node);
       483  
               }
       484   @@ -856,7 +856,7 @@
                */
       490  
               public boolean isCVSSAvailabilityImpactNode() {
      -  491  28144
                   return CVSS_AVAILABILITY_IMPACT.equals(node);
      +  491  3518
                   return CVSS_AVAILABILITY_IMPACT.equals(node);
       492  
               }
       493   @@ -867,6 +867,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.NvdCveInfo.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.NvdCveInfo.html index ec7826561..ee65a7ac8 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.NvdCveInfo.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.NvdCveInfo.html @@ -65,7 +65,7 @@
        * @author Jeremy Long
       24  
        */
      -  25  120
       public class NvdCveInfo {
      +  25  15
       public class NvdCveInfo {
       26  
       
       27   @@ -90,7 +90,7 @@
            */
       37  
           public String getId() {
      -  38  80
               return id;
      +  38  10
               return id;
       39  
           }
       40   @@ -107,8 +107,8 @@
            */
       46  
           public void setId(String id) {
      -  47  88
               this.id = id;
      -  48  88
           }
      +  47  11
               this.id = id;
      +  48  11
           }
       49  
           /**
       50   @@ -131,7 +131,7 @@
            */
       59  
           public String getUrl() {
      -  60  32
               return url;
      +  60  4
               return url;
       61  
           }
       62   @@ -148,8 +148,8 @@
            */
       68  
           public void setUrl(String url) {
      -  69  88
               this.url = url;
      -  70  88
           }
      +  69  11
               this.url = url;
      +  70  11
           }
       71  
           /**
       72   @@ -172,7 +172,7 @@
            */
       81  
           public String getOldSchemaVersionUrl() {
      -  82  32
               return oldSchemaVersionUrl;
      +  82  4
               return oldSchemaVersionUrl;
       83  
           }
       84   @@ -189,8 +189,8 @@
            */
       90  
           public void setOldSchemaVersionUrl(String oldSchemaVersionUrl) {
      -  91  88
               this.oldSchemaVersionUrl = oldSchemaVersionUrl;
      -  92  88
           }
      +  91  11
               this.oldSchemaVersionUrl = oldSchemaVersionUrl;
      +  92  11
           }
       93  
           /**
       94   @@ -213,7 +213,7 @@
            */
       103  
           public long getTimestamp() {
      -  104  8
               return timestamp;
      +  104  1
               return timestamp;
       105  
           }
       106   @@ -230,15 +230,15 @@
            */
       112  
           public void setTimestamp(long timestamp) {
      -  113  80
               this.timestamp = timestamp;
      -  114  80
           }
      +  113  10
               this.timestamp = timestamp;
      +  114  10
           }
       115  
           /**
       116  
            * indicates whether or not this item should be updated.
       117  
            */
      -  118  120
           private boolean needsUpdate = true;
      +  118  15
           private boolean needsUpdate = true;
       119  
       
       120   @@ -253,7 +253,7 @@
            */
       125  
           public boolean getNeedsUpdate() {
      -  126  40
               return needsUpdate;
      +  126  5
               return needsUpdate;
       127  
           }
       128   @@ -270,12 +270,12 @@
            */
       134  
           public void setNeedsUpdate(boolean needsUpdate) {
      -  135  88
               this.needsUpdate = needsUpdate;
      -  136  88
           }
      +  135  11
               this.needsUpdate = needsUpdate;
      +  136  11
           }
       137  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.ProcessTask.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.ProcessTask.html index d8a769c69..9bc92318c 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.ProcessTask.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.ProcessTask.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      ProcessTask
      0%
      0/51
      N/A
      3.5
      ProcessTask
      0%
      0/52
      N/A
      3.5
       
      @@ -305,35 +305,38 @@  158  
           private void processFiles() throws UpdateException {
       159  0
               LOGGER.info("Processing Started for NVD CVE - {}", filePair.getNvdCveInfo().getId());
      -  160   +  160  0
               final long startProcessing = System.currentTimeMillis();
      +  161  
               try {
      -  161  0
                   importXML(filePair.getFirst(), filePair.getSecond());
      -  162  0
                   cveDB.commit();
      -  163  0
                   properties.save(filePair.getNvdCveInfo());
      -  164  0
               } catch (FileNotFoundException ex) {
      -  165  0
                   throw new UpdateException(ex);
      -  166  0
               } catch (ParserConfigurationException ex) {
      -  167  0
                   throw new UpdateException(ex);
      -  168  0
               } catch (SAXException ex) {
      -  169  0
                   throw new UpdateException(ex);
      -  170  0
               } catch (IOException ex) {
      -  171  0
                   throw new UpdateException(ex);
      -  172  0
               } catch (SQLException ex) {
      -  173  0
                   throw new UpdateException(ex);
      -  174  0
               } catch (DatabaseException ex) {
      -  175  0
                   throw new UpdateException(ex);
      -  176  0
               } catch (ClassNotFoundException ex) {
      -  177  0
                   throw new UpdateException(ex);
      -  178   +  162  0
                   importXML(filePair.getFirst(), filePair.getSecond());
      +  163  0
                   cveDB.commit();
      +  164  0
                   properties.save(filePair.getNvdCveInfo());
      +  165  0
               } catch (FileNotFoundException ex) {
      +  166  0
                   throw new UpdateException(ex);
      +  167  0
               } catch (ParserConfigurationException ex) {
      +  168  0
                   throw new UpdateException(ex);
      +  169  0
               } catch (SAXException ex) {
      +  170  0
                   throw new UpdateException(ex);
      +  171  0
               } catch (IOException ex) {
      +  172  0
                   throw new UpdateException(ex);
      +  173  0
               } catch (SQLException ex) {
      +  174  0
                   throw new UpdateException(ex);
      +  175  0
               } catch (DatabaseException ex) {
      +  176  0
                   throw new UpdateException(ex);
      +  177  0
               } catch (ClassNotFoundException ex) {
      +  178  0
                   throw new UpdateException(ex);
      +  179  
               } finally {
      -  179  0
                   filePair.cleanup();
      -  180  0
               }
      -  181  0
               LOGGER.info("Processing Complete for NVD CVE - {}", filePair.getNvdCveInfo().getId());
      -  182  0
           }
      +  180  0
                   filePair.cleanup();
      +  181  0
               }
      +  182  0
               LOGGER.info("Processing Complete for NVD CVE - {}  ({} ms)", filePair.getNvdCveInfo().getId(),
       183   +
                   System.currentTimeMillis() - startProcessing);
      +  184  0
           }
      +  185  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.UpdateableNvdCve.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.UpdateableNvdCve.html index 6787d59ed..d4d9d5158 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.UpdateableNvdCve.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.data.update.nvd.UpdateableNvdCve.html @@ -85,7 +85,7 @@
        * @author Jeremy Long
       34  
        */
      -  35  96
       public class UpdateableNvdCve implements java.lang.Iterable<NvdCveInfo>, Iterator<NvdCveInfo> {
      +  35  12
       public class UpdateableNvdCve implements java.lang.Iterable<NvdCveInfo>, Iterator<NvdCveInfo> {
       36  
       
       37   @@ -94,7 +94,7 @@
            * A collection of sources of data.
       39  
            */
      -  40  40
           private Map<String, NvdCveInfo> collection = new TreeMap<String, NvdCveInfo>();
      +  40  5
           private Map<String, NvdCveInfo> collection = new TreeMap<String, NvdCveInfo>();
       41  
       
       42   @@ -109,7 +109,7 @@
            */
       47  
           protected Map<String, NvdCveInfo> getCollection() {
      -  48  24
               return collection;
      +  48  3
               return collection;
       49  
           }
       50   @@ -126,13 +126,13 @@
            */
       56  
           public boolean isUpdateNeeded() {
      -  57  24
               for (NvdCveInfo item : this) {
      -  58  32
                   if (item.getNeedsUpdate()) {
      -  59  8
                       return true;
      +  57  3
               for (NvdCveInfo item : this) {
      +  58  4
                   if (item.getNeedsUpdate()) {
      +  59  1
                       return true;
       60  
                   }
      -  61  24
               }
      -  62  16
               return false;
      +  61  3
               }
      +  62  2
               return false;
       63  
           }
       64   @@ -157,8 +157,8 @@
            */
       74  
           public void add(String id, String url, String oldUrl) throws MalformedURLException, DownloadFailedException {
      -  75  8
               add(id, url, oldUrl, false);
      -  76  8
           }
      +  75  1
               add(id, url, oldUrl, false);
      +  76  1
           }
       77  
       
       78   @@ -183,14 +183,14 @@
            */
       88  
           public void add(String id, String url, String oldUrl, boolean needsUpdate) throws MalformedURLException, DownloadFailedException {
      -  89  72
               final NvdCveInfo item = new NvdCveInfo();
      -  90  72
               item.setNeedsUpdate(needsUpdate); //the others default to true, to make life easier later this should default to false.
      -  91  72
               item.setId(id);
      -  92  72
               item.setUrl(url);
      -  93  72
               item.setOldSchemaVersionUrl(oldUrl);
      -  94  72
               item.setTimestamp(Downloader.getLastModified(new URL(url)));
      -  95  72
               collection.put(id, item);
      -  96  72
           }
      +  89  9
               final NvdCveInfo item = new NvdCveInfo();
      +  90  9
               item.setNeedsUpdate(needsUpdate); //the others default to true, to make life easier later this should default to false.
      +  91  9
               item.setId(id);
      +  92  9
               item.setUrl(url);
      +  93  9
               item.setOldSchemaVersionUrl(oldUrl);
      +  94  9
               item.setTimestamp(Downloader.getLastModified(new URL(url)));
      +  95  9
               collection.put(id, item);
      +  96  9
           }
       97  
       
       98   @@ -201,8 +201,8 @@
            */
       101  
           public void clear() {
      -  102  8
               collection.clear();
      -  103  8
           }
      +  102  1
               collection.clear();
      +  103  1
           }
       104  
       
       105   @@ -228,7 +228,7 @@
            * An internal iterator used to implement iterable.
       116  
            */
      -  117  40
           private Iterator<Entry<String, NvdCveInfo>> iterableContent = null;
      +  117  5
           private Iterator<Entry<String, NvdCveInfo>> iterableContent = null;
       118  
       
       119   @@ -251,8 +251,8 @@
           @Override
       128  
           public Iterator<NvdCveInfo> iterator() {
      -  129  32
               iterableContent = collection.entrySet().iterator();
      -  130  32
               return this;
      +  129  4
               iterableContent = collection.entrySet().iterator();
      +  130  4
               return this;
       131  
           }
       132   @@ -277,7 +277,7 @@
           @Override
       142  
           public boolean hasNext() {
      -  143  80
               return iterableContent.hasNext();
      +  143  10
               return iterableContent.hasNext();
       144  
           }
       145   @@ -302,7 +302,7 @@
           @Override
       155  
           public NvdCveInfo next() {
      -  156  56
               return iterableContent.next().getValue();
      +  156  7
               return iterableContent.next().getValue();
       157  
           }
       158   @@ -323,8 +323,8 @@
           @Override
       166  
           public void remove() {
      -  167  8
               iterableContent.remove();
      -  168  8
           }
      +  167  1
               iterableContent.remove();
      +  168  1
           }
       169  
       
       170   @@ -341,7 +341,7 @@
            */
       176  
           public NvdCveInfo get(String key) {
      -  177  16
               return collection.get(key);
      +  177  2
               return collection.get(key);
       178  
           }
       179   @@ -357,6 +357,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Confidence.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Confidence.html index 117bfc479..ab8da1ca4 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Confidence.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Confidence.html @@ -65,7 +65,7 @@
        * @author Jeremy Long
       24  
        */
      -  25  80
       public enum Confidence {
      +  25  10
       public enum Confidence {
       26  
       
       27   @@ -74,32 +74,32 @@
            * High confidence evidence.
       29  
            */
      -  30  8
           HIGHEST,
      +  30  1
           HIGHEST,
       31  
           /**
       32  
            * High confidence evidence.
       33  
            */
      -  34  8
           HIGH,
      +  34  1
           HIGH,
       35  
           /**
       36  
            * Medium confidence evidence.
       37  
            */
      -  38  8
           MEDIUM,
      +  38  1
           MEDIUM,
       39  
           /**
       40  
            * Low confidence evidence.
       41  
            */
      -  42  8
           LOW
      +  42  1
           LOW
       43  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Dependency.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Dependency.html index ccc7dcdd1..d8ae2ec6c 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Dependency.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Dependency.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      Dependency
      66%
      103/154
      26%
      18/68
      1.661
      Dependency
      67%
      102/151
      47%
      17/36
      1.393
       
      @@ -78,1301 +78,1340 @@  30  
       
       31   -
       import org.apache.commons.lang.ObjectUtils;
      +
       import org.apache.commons.lang3.builder.EqualsBuilder;
       32   -
       import org.owasp.dependencycheck.data.nexus.MavenArtifact;
      +
       import org.apache.commons.lang3.builder.HashCodeBuilder;
       33   -
       import org.owasp.dependencycheck.utils.Checksum;
      +
       import org.owasp.dependencycheck.data.nexus.MavenArtifact;
       34   -
       import org.slf4j.Logger;
      +
       import org.owasp.dependencycheck.utils.Checksum;
       35   -
       import org.slf4j.LoggerFactory;
      +
       import org.slf4j.Logger;
       36   -
       
      +
       import org.slf4j.LoggerFactory;
       37   -
       /**
      +
       
       38   -
        * A program dependency. This object is one of the core components within DependencyCheck. It is used to collect information about
      +
       /**
       39   -
        * the dependency in the form of evidence. The Evidence is then used to determine if there are any known, published,
      +
        * A program dependency. This object is one of the core components within DependencyCheck. It is used to collect information about
       40   -
        * vulnerabilities associated with the program dependency.
      +
        * the dependency in the form of evidence. The Evidence is then used to determine if there are any known, published,
       41   -
        *
      +
        * vulnerabilities associated with the program dependency.
       42   -
        * @author Jeremy Long
      +
        *
       43   +
        * @author Jeremy Long
      +  44  
        */
      -  44  16
       public class Dependency implements Serializable, Comparable<Dependency> {
      -  45   -
       
      +  45  2
       public class Dependency implements Serializable, Comparable<Dependency> {
       46   -
           /**
      -  47   -
            * The logger.
      -  48   -
            */
      -  49  8
           private static final Logger LOGGER = LoggerFactory.getLogger(Dependency.class);
      -  50   -
           /**
      -  51   -
            * Used as starting point for generating the value in {@link #hashCode()}.
      -  52   -
            */
      -  53   -
           private static final int MAGIC_HASH_INIT_VALUE = 3;
      -  54   -
           /**
      -  55   -
            * Used as a multiplier for generating the value in {@link #hashCode()}.
      -  56   -
            */
      -  57   -
           private static final int MAGIC_HASH_MULTIPLIER = 47;
      -  58   -
           /**
      -  59   -
            * The actual file path of the dependency on disk.
      -  60   -
            */
      -  61   -
           private String actualFilePath;
      -  62   -
           /**
      -  63   -
            * The file path to display.
      -  64   -
            */
      -  65   -
           private String filePath;
      -  66   -
           /**
      -  67   -
            * The file name of the dependency.
      -  68   -
            */
      -  69   -
           private String fileName;
      -  70   -
           /**
      -  71   -
            * The md5 hash of the dependency.
      -  72   -
            */
      -  73   -
           private String md5sum;
      -  74   -
           /**
      -  75   -
            * The SHA1 hash of the dependency.
      -  76   -
            */
      -  77   -
           private String sha1sum;
      -  78   -
           /**
      -  79   -
            * A list of Identifiers.
      -  80   -
            */
      -  81   -
           private Set<Identifier> identifiers;
      -  82   -
           /**
      -  83   -
            * A collection of vendor evidence.
      -  84   -
            */
      -  85   -
           private final EvidenceCollection vendorEvidence;
      -  86   -
           /**
      -  87   -
            * A collection of product evidence.
      -  88   -
            */
      -  89   -
           private final EvidenceCollection productEvidence;
      -  90   -
           /**
      -  91   -
            * A collection of version evidence.
      -  92   -
            */
      -  93   -
           private final EvidenceCollection versionEvidence;
      -  94  
       
      +  47   +
           /**
      +  48   +
            * The serial version UID for serialization.
      +  49   +
            */
      +  50   +
           private static final long serialVersionUID = 1L;
      +  51   +
           /**
      +  52   +
            * The logger.
      +  53   +
            */
      +  54  1
           private static final Logger LOGGER = LoggerFactory.getLogger(Dependency.class);
      +  55   +
           /**
      +  56   +
            * Used as starting point for generating the value in {@link #hashCode()}.
      +  57   +
            */
      +  58   +
           private static final int MAGIC_HASH_INIT_VALUE = 3;
      +  59   +
           /**
      +  60   +
            * Used as a multiplier for generating the value in {@link #hashCode()}.
      +  61   +
            */
      +  62   +
           private static final int MAGIC_HASH_MULTIPLIER = 47;
      +  63   +
           /**
      +  64   +
            * The actual file path of the dependency on disk.
      +  65   +
            */
      +  66   +
           private String actualFilePath;
      +  67   +
           /**
      +  68   +
            * The file path to display.
      +  69   +
            */
      +  70   +
           private String filePath;
      +  71   +
           /**
      +  72   +
            * The file name of the dependency.
      +  73   +
            */
      +  74   +
           private String fileName;
      +  75   +
           /**
      +  76   +
            * The md5 hash of the dependency.
      +  77   +
            */
      +  78   +
           private String md5sum;
      +  79   +
           /**
      +  80   +
            * The SHA1 hash of the dependency.
      +  81   +
            */
      +  82   +
           private String sha1sum;
      +  83   +
           /**
      +  84   +
            * A list of Identifiers.
      +  85   +
            */
      +  86   +
           private Set<Identifier> identifiers;
      +  87   +
           /**
      +  88   +
            * A collection of vendor evidence.
      +  89   +
            */
      +  90   +
           private final EvidenceCollection vendorEvidence;
      +  91   +
           /**
      +  92   +
            * A collection of product evidence.
      +  93   +
            */
      +  94   +
           private final EvidenceCollection productEvidence;
       95  
           /**
       96   -
            * Constructs a new Dependency object.
      +
            * A collection of version evidence.
       97  
            */
      -  98  432
           public Dependency() {
      -  99  432
               vendorEvidence = new EvidenceCollection();
      -  100  432
               productEvidence = new EvidenceCollection();
      -  101  432
               versionEvidence = new EvidenceCollection();
      -  102  432
               identifiers = new TreeSet<Identifier>();
      -  103  432
               vulnerabilities = new TreeSet<Vulnerability>(new VulnerabilityComparator());
      -  104  432
               suppressedIdentifiers = new TreeSet<Identifier>();
      -  105  432
               suppressedVulnerabilities = new TreeSet<Vulnerability>(new VulnerabilityComparator());
      -  106  432
           }
      -  107   +  98   +
           private final EvidenceCollection versionEvidence;
      +  99  
       
      -  108   +  100  
           /**
      -  109   +  101  
            * Constructs a new Dependency object.
      -  110   -
            *
      -  111   -
            * @param file the File to create the dependency object from.
      +  102   +
            */
      +  103  87
           public Dependency() {
      +  104  87
               vendorEvidence = new EvidenceCollection();
      +  105  87
               productEvidence = new EvidenceCollection();
      +  106  87
               versionEvidence = new EvidenceCollection();
      +  107  87
               identifiers = new TreeSet<Identifier>();
      +  108  87
               vulnerabilities = new TreeSet<Vulnerability>(new VulnerabilityComparator());
      +  109  87
               suppressedIdentifiers = new TreeSet<Identifier>();
      +  110  87
               suppressedVulnerabilities = new TreeSet<Vulnerability>(new VulnerabilityComparator());
      +  111  87
           }
       112   -
            */
      +
       
       113   +
           /**
      +  114   +
            * Constructs a new Dependency object.
      +  115   +
            *
      +  116   +
            * @param file the File to create the dependency object from.
      +  117   +
            */
      +  118  
           public Dependency(File file) {
      -  114  264
               this();
      -  115  264
               this.actualFilePath = file.getAbsolutePath();
      -  116  264
               this.filePath = this.actualFilePath;
      -  117  264
               this.fileName = file.getName();
      -  118  264
               determineHashes(file);
      -  119  264
           }
      -  120   -
       
      -  121   -
           /**
      -  122   -
            * Returns the file name of the dependency.
      -  123   -
            *
      -  124   -
            * @return the file name of the dependency
      +  119  66
               this();
      +  120  66
               this.actualFilePath = file.getAbsolutePath();
      +  121  66
               this.filePath = this.actualFilePath;
      +  122  66
               this.fileName = file.getName();
      +  123  66
               determineHashes(file);
      +  124  66
           }
       125   -
            */
      +
       
       126   -
           public String getFileName() {
      -  127  288
               return this.fileName;
      +
           /**
      +  127   +
            * Returns the file name of the dependency.
       128   -
           }
      +
            *
       129   -
       
      +
            * @return the file name of the dependency
       130   -
           /**
      +
            */
       131   -
            * Returns the file name of the dependency with the backslash escaped for use in JavaScript. This is a complete hack as I
      -  132   -
            * could not get the replace to work in the template itself.
      +
           public String getFileName() {
      +  132  36
               return this.fileName;
       133   -
            *
      +
           }
       134   -
            * @return the file name of the dependency with the backslash escaped for use in JavaScript
      +
       
       135   -
            */
      +
           /**
       136   -
           public String getFileNameForJavaScript() {
      -  137  0
               return this.fileName.replace("\\", "\\\\");
      +
            * Returns the file name of the dependency with the backslash escaped for use in JavaScript. This is a complete hack as I
      +  137   +
            * could not get the replace to work in the template itself.
       138   -
           }
      +
            *
       139   -
       
      +
            * @return the file name of the dependency with the backslash escaped for use in JavaScript
       140   -
           /**
      +
            */
       141   -
            * Sets the file name of the dependency.
      -  142   -
            *
      +
           public String getFileNameForJavaScript() {
      +  142  0
               return this.fileName.replace("\\", "\\\\");
       143   -
            * @param fileName the file name of the dependency
      +
           }
       144   -
            */
      +
       
       145   -
           public void setFileName(String fileName) {
      -  146  56
               this.fileName = fileName;
      -  147  56
           }
      +
           /**
      +  146   +
            * Sets the file name of the dependency.
      +  147   +
            *
       148   -
       
      +
            * @param fileName the file name of the dependency
       149   -
           /**
      +
            */
       150   -
            * Sets the actual file path of the dependency on disk.
      -  151   -
            *
      -  152   -
            * @param actualFilePath the file path of the dependency
      +
           public void setFileName(String fileName) {
      +  151  7
               this.fileName = fileName;
      +  152  7
           }
       153   -
            */
      +
       
       154   -
           public void setActualFilePath(String actualFilePath) {
      -  155  16
               this.actualFilePath = actualFilePath;
      -  156  16
               if (this.sha1sum == null) {
      -  157  0
                   final File file = new File(this.actualFilePath);
      -  158  0
                   determineHashes(file);
      +
           /**
      +  155   +
            * Sets the actual file path of the dependency on disk.
      +  156   +
            *
      +  157   +
            * @param actualFilePath the file path of the dependency
      +  158   +
            */
       159   -
               }
      -  160  16
           }
      -  161   -
       
      -  162   -
           /**
      -  163   -
            * Gets the file path of the dependency.
      +
           public void setActualFilePath(String actualFilePath) {
      +  160  2
               this.actualFilePath = actualFilePath;
      +  161  2
               if (this.sha1sum == null) {
      +  162  0
                   final File file = new File(this.actualFilePath);
      +  163  0
                   determineHashes(file);
       164   -
            *
      -  165   -
            * @return the file path of the dependency
      +
               }
      +  165  2
           }
       166   -
            */
      +
       
       167   -
           public String getActualFilePath() {
      -  168  392
               return this.actualFilePath;
      +
           /**
      +  168   +
            * Gets the file path of the dependency.
       169   -
           }
      +
            *
       170   -
       
      +
            * @return the file path of the dependency
       171   -
           /**
      +
            */
       172   -
            * Gets a reference to the File object.
      -  173   -
            *
      +
           public String getActualFilePath() {
      +  173  50
               return this.actualFilePath;
       174   -
            * @return the File object
      -  175   -
            */
      -  176   -
           public File getActualFile() {
      -  177  416
               return new File(this.actualFilePath);
      -  178  
           }
      -  179   +  175  
       
      -  180   +  176  
           /**
      -  181   -
            * Sets the file path of the dependency.
      -  182   +  177   +
            * Gets a reference to the File object.
      +  178  
            *
      +  179   +
            * @return the File object
      +  180   +
            */
      +  181   +
           public File getActualFile() {
      +  182  91
               return new File(this.actualFilePath);
       183   -
            * @param filePath the file path of the dependency
      +
           }
       184   -
            */
      -  185   -
           public void setFilePath(String filePath) {
      -  186  56
               this.filePath = filePath;
      -  187  56
           }
      -  188  
       
      -  189   +  185  
           /**
      -  190   -
            * The file name to display in reports.
      -  191   +  186   +
            * Sets the file path of the dependency.
      +  187   +
            *
      +  188   +
            * @param filePath the file path of the dependency
      +  189  
            */
      -  192  432
           private String displayName = null;
      +  190   +
           public void setFilePath(String filePath) {
      +  191  37
               this.filePath = filePath;
      +  192  37
           }
       193  
       
       194  
           /**
       195   -
            * Sets the file name to display in reports.
      +
            * The file name to display in reports.
       196   -
            *
      -  197   -
            * @param displayName the name to display
      +
            */
      +  197  87
           private String displayName = null;
       198   -
            */
      +
       
       199   -
           public void setDisplayFileName(String displayName) {
      -  200  128
               this.displayName = displayName;
      -  201  128
           }
      +
           /**
      +  200   +
            * Sets the file name to display in reports.
      +  201   +
            *
       202   -
       
      +
            * @param displayName the name to display
       203   -
           /**
      +
            */
       204   -
            * Returns the file name to display in reports; if no display file name has been set it will default to the actual file name.
      -  205   -
            *
      -  206   -
            * @return the file name to display
      +
           public void setDisplayFileName(String displayName) {
      +  205  47
               this.displayName = displayName;
      +  206  47
           }
       207   -
            */
      +
       
       208   -
           public String getDisplayFileName() {
      -  209  80
               if (displayName == null) {
      -  210  0
                   return this.fileName;
      +
           /**
      +  209   +
            * Returns the file name to display in reports; if no display file name has been set it will default to the actual file name.
      +  210   +
            *
       211   -
               }
      -  212  80
               return this.displayName;
      +
            * @return the file name to display
      +  212   +
            */
       213   -
           }
      -  214   -
       
      -  215   -
           /**
      +
           public String getDisplayFileName() {
      +  214  40
               if (displayName == null) {
      +  215  30
                   return this.fileName;
       216   -
            * <p>
      -  217   -
            * Gets the file path of the dependency.</p>
      +
               }
      +  217  10
               return this.displayName;
       218   -
            * <p>
      +
           }
       219   -
            * <b>NOTE:</b> This may not be the actual path of the file on disk. The actual path of the file on disk can be obtained via
      +
       
       220   -
            * the getActualFilePath().</p>
      +
           /**
       221   -
            *
      +
            * <p>
       222   -
            * @return the file path of the dependency
      +
            * Gets the file path of the dependency.</p>
       223   -
            */
      +
            * <p>
       224   -
           public String getFilePath() {
      -  225  224
               return this.filePath;
      +
            * <b>NOTE:</b> This may not be the actual path of the file on disk. The actual path of the file on disk can be obtained via
      +  225   +
            * the getActualFilePath().</p>
       226   -
           }
      +
            *
       227   -
       
      +
            * @return the file path of the dependency
       228   -
           /**
      +
            */
       229   -
            * Returns the MD5 Checksum of the dependency file.
      -  230   -
            *
      +
           public String getFilePath() {
      +  230  58
               return this.filePath;
       231   -
            * @return the MD5 Checksum
      +
           }
       232   -
            */
      +
       
       233   -
           public String getMd5sum() {
      -  234  16
               return this.md5sum;
      +
           /**
      +  234   +
            * Returns the MD5 Checksum of the dependency file.
       235   -
           }
      +
            *
       236   -
       
      +
            * @return the MD5 Checksum
       237   -
           /**
      +
            */
       238   -
            * Sets the MD5 Checksum of the dependency.
      -  239   -
            *
      +
           public String getMd5sum() {
      +  239  2
               return this.md5sum;
       240   -
            * @param md5sum the MD5 Checksum
      +
           }
       241   -
            */
      +
       
       242   -
           public void setMd5sum(String md5sum) {
      -  243  272
               this.md5sum = md5sum;
      -  244  272
           }
      +
           /**
      +  243   +
            * Sets the MD5 Checksum of the dependency.
      +  244   +
            *
       245   -
       
      +
            * @param md5sum the MD5 Checksum
       246   -
           /**
      +
            */
       247   -
            * Returns the SHA1 Checksum of the dependency.
      -  248   -
            *
      -  249   -
            * @return the SHA1 Checksum
      +
           public void setMd5sum(String md5sum) {
      +  248  67
               this.md5sum = md5sum;
      +  249  67
           }
       250   -
            */
      +
       
       251   -
           public String getSha1sum() {
      -  252  72
               return this.sha1sum;
      +
           /**
      +  252   +
            * Returns the SHA1 Checksum of the dependency.
       253   -
           }
      +
            *
       254   -
       
      +
            * @return the SHA1 Checksum
       255   -
           /**
      +
            */
       256   -
            * Sets the SHA1 Checksum of the dependency.
      -  257   -
            *
      +
           public String getSha1sum() {
      +  257  9
               return this.sha1sum;
       258   -
            * @param sha1sum the SHA1 Checksum
      -  259   -
            */
      -  260   -
           public void setSha1sum(String sha1sum) {
      -  261  336
               this.sha1sum = sha1sum;
      -  262  336
           }
      -  263   -
       
      -  264   -
           /**
      -  265   -
            * Returns a List of Identifiers.
      -  266   -
            *
      -  267   -
            * @return an ArrayList of Identifiers
      -  268   -
            */
      -  269   -
           public Set<Identifier> getIdentifiers() {
      -  270  880
               return this.identifiers;
      -  271  
           }
      +  259   +
       
      +  260   +
           /**
      +  261   +
            * Sets the SHA1 Checksum of the dependency.
      +  262   +
            *
      +  263   +
            * @param sha1sum the SHA1 Checksum
      +  264   +
            */
      +  265   +
           public void setSha1sum(String sha1sum) {
      +  266  105
               this.sha1sum = sha1sum;
      +  267  105
           }
      +  268   +
       
      +  269   +
           /**
      +  270   +
            * Returns a List of Identifiers.
      +  271   +
            *
       272   -
       
      +
            * @return an ArrayList of Identifiers
       273   -
           /**
      +
            */
       274   -
            * Sets a List of Identifiers.
      -  275   -
            *
      +
           public Set<Identifier> getIdentifiers() {
      +  275  114
               return this.identifiers;
       276   -
            * @param identifiers A list of Identifiers
      +
           }
       277   -
            */
      +
       
       278   -
           public void setIdentifiers(Set<Identifier> identifiers) {
      -  279  8
               this.identifiers = identifiers;
      -  280  8
           }
      +
           /**
      +  279   +
            * Sets a List of Identifiers.
      +  280   +
            *
       281   -
       
      +
            * @param identifiers A list of Identifiers
       282   -
           /**
      +
            */
       283   -
            * Adds an entry to the list of detected Identifiers for the dependency file.
      -  284   -
            *
      -  285   -
            * @param type the type of identifier (such as CPE)
      +
           public void setIdentifiers(Set<Identifier> identifiers) {
      +  284  1
               this.identifiers = identifiers;
      +  285  1
           }
       286   -
            * @param value the value of the identifier
      +
       
       287   -
            * @param url the URL of the identifier
      +
           /**
       288   -
            */
      +
            * Adds an entry to the list of detected Identifiers for the dependency file.
       289   -
           public void addIdentifier(String type, String value, String url) {
      -  290  88
               final Identifier i = new Identifier(type, value, url);
      -  291  88
               this.identifiers.add(i);
      -  292  88
           }
      -  293   -
       
      -  294   -
           /**
      -  295   -
            * Adds an entry to the list of detected Identifiers for the dependency file.
      -  296  
            *
      -  297   +  290  
            * @param type the type of identifier (such as CPE)
      -  298   +  291  
            * @param value the value of the identifier
      -  299   +  292  
            * @param url the URL of the identifier
      +  293   +
            */
      +  294   +
           public void addIdentifier(String type, String value, String url) {
      +  295  11
               final Identifier i = new Identifier(type, value, url);
      +  296  11
               this.identifiers.add(i);
      +  297  11
           }
      +  298   +
       
      +  299   +
           /**
       300   -
            * @param confidence the confidence in the Identifier being accurate
      -  301   -
            */
      -  302   -
           public void addIdentifier(String type, String value, String url, Confidence confidence) {
      -  303  16
               final Identifier i = new Identifier(type, value, url);
      -  304  16
               i.setConfidence(confidence);
      -  305  16
               this.identifiers.add(i);
      -  306  16
           }
      -  307   -
       
      -  308   -
           /**
      -  309   -
            * Adds the maven artifact as evidence.
      -  310   -
            *
      -  311   -
            * @param source The source of the evidence
      -  312   -
            * @param mavenArtifact The maven artifact
      -  313   -
            * @param confidence The confidence level of this evidence
      -  314   -
            */
      -  315   -
           public void addAsEvidence(String source, MavenArtifact mavenArtifact, Confidence confidence) {
      -  316  16
               if (mavenArtifact.getGroupId() != null && !mavenArtifact.getGroupId().isEmpty()) {
      -  317  8
                   this.getVendorEvidence().addEvidence(source, "groupid", mavenArtifact.getGroupId(), confidence);
      -  318   -
               }
      -  319  16
               if (mavenArtifact.getArtifactId() != null && !mavenArtifact.getArtifactId().isEmpty()) {
      -  320  8
                   this.getProductEvidence().addEvidence(source, "artifactid", mavenArtifact.getArtifactId(), confidence);
      -  321   -
               }
      -  322  16
               if (mavenArtifact.getVersion() != null && !mavenArtifact.getVersion().isEmpty()) {
      -  323  8
                   this.getVersionEvidence().addEvidence(source, "version", mavenArtifact.getVersion(), confidence);
      -  324   -
               }
      -  325  16
               if (mavenArtifact.getArtifactUrl() != null && !mavenArtifact.getArtifactUrl().isEmpty()) {
      -  326  8
                   boolean found = false;
      -  327  8
                   for (Identifier i : this.getIdentifiers()) {
      -  328  0
                       if ("maven".equals(i.getType()) && i.getValue().equals(mavenArtifact.toString())) {
      -  329  0
                           found = true;
      -  330  0
                           i.setConfidence(Confidence.HIGHEST);
      -  331  0
                           final String url = "http://search.maven.org/#search|ga|1|1%3A%22" + this.getSha1sum() + "%22";
      -  332  0
                           i.setUrl(url);
      -  333   -
                           //i.setUrl(mavenArtifact.getArtifactUrl());
      -  334  0
                           LOGGER.debug("Already found identifier {}. Confidence set to highest", i.getValue());
      -  335  0
                           break;
      -  336   -
                       }
      -  337  0
                   }
      -  338  8
                   if (!found) {
      -  339  8
                       LOGGER.debug("Adding new maven identifier {}", mavenArtifact.toString());
      -  340  8
                       this.addIdentifier("maven", mavenArtifact.toString(), mavenArtifact.getArtifactUrl(), Confidence.HIGHEST);
      -  341   -
                   }
      -  342   -
               }
      -  343  16
           }
      -  344   -
       
      -  345   -
           /**
      -  346  
            * Adds an entry to the list of detected Identifiers for the dependency file.
      -  347   +  301  
            *
      -  348   -
            * @param identifier the identifier to add
      -  349   +  302   +
            * @param type the type of identifier (such as CPE)
      +  303   +
            * @param value the value of the identifier
      +  304   +
            * @param url the URL of the identifier
      +  305   +
            * @param confidence the confidence in the Identifier being accurate
      +  306  
            */
      -  350   -
           public void addIdentifier(Identifier identifier) {
      -  351  24
               this.identifiers.add(identifier);
      -  352  24
           }
      -  353   +  307   +
           public void addIdentifier(String type, String value, String url, Confidence confidence) {
      +  308  2
               final Identifier i = new Identifier(type, value, url);
      +  309  2
               i.setConfidence(confidence);
      +  310  2
               this.identifiers.add(i);
      +  311  2
           }
      +  312  
       
      -  354   +  313  
           /**
      -  355   -
            * A set of identifiers that have been suppressed.
      -  356   +  314   +
            * Adds the maven artifact as evidence.
      +  315   +
            *
      +  316   +
            * @param source The source of the evidence
      +  317   +
            * @param mavenArtifact The maven artifact
      +  318   +
            * @param confidence The confidence level of this evidence
      +  319  
            */
      -  357   -
           private Set<Identifier> suppressedIdentifiers;
      +  320   +
           public void addAsEvidence(String source, MavenArtifact mavenArtifact, Confidence confidence) {
      +  321  2
               if (mavenArtifact.getGroupId() != null && !mavenArtifact.getGroupId().isEmpty()) {
      +  322  1
                   this.getVendorEvidence().addEvidence(source, "groupid", mavenArtifact.getGroupId(), confidence);
      +  323   +
               }
      +  324  2
               if (mavenArtifact.getArtifactId() != null && !mavenArtifact.getArtifactId().isEmpty()) {
      +  325  1
                   this.getProductEvidence().addEvidence(source, "artifactid", mavenArtifact.getArtifactId(), confidence);
      +  326   +
               }
      +  327  2
               if (mavenArtifact.getVersion() != null && !mavenArtifact.getVersion().isEmpty()) {
      +  328  1
                   this.getVersionEvidence().addEvidence(source, "version", mavenArtifact.getVersion(), confidence);
      +  329   +
               }
      +  330  2
               if (mavenArtifact.getArtifactUrl() != null && !mavenArtifact.getArtifactUrl().isEmpty()) {
      +  331  1
                   boolean found = false;
      +  332  1
                   for (Identifier i : this.getIdentifiers()) {
      +  333  0
                       if ("maven".equals(i.getType()) && i.getValue().equals(mavenArtifact.toString())) {
      +  334  0
                           found = true;
      +  335  0
                           i.setConfidence(Confidence.HIGHEST);
      +  336  0
                           final String url = "http://search.maven.org/#search|ga|1|1%3A%22" + this.getSha1sum() + "%22";
      +  337  0
                           i.setUrl(url);
      +  338   +
                           //i.setUrl(mavenArtifact.getArtifactUrl());
      +  339  0
                           LOGGER.debug("Already found identifier {}. Confidence set to highest", i.getValue());
      +  340  0
                           break;
      +  341   +
                       }
      +  342  0
                   }
      +  343  1
                   if (!found) {
      +  344  1
                       LOGGER.debug("Adding new maven identifier {}", mavenArtifact.toString());
      +  345  1
                       this.addIdentifier("maven", mavenArtifact.toString(), mavenArtifact.getArtifactUrl(), Confidence.HIGHEST);
      +  346   +
                   }
      +  347   +
               }
      +  348  2
           }
      +  349   +
       
      +  350   +
           /**
      +  351   +
            * Adds an entry to the list of detected Identifiers for the dependency file.
      +  352   +
            *
      +  353   +
            * @param identifier the identifier to add
      +  354   +
            */
      +  355   +
           public void addIdentifier(Identifier identifier) {
      +  356  3
               this.identifiers.add(identifier);
      +  357  3
           }
       358  
       
       359  
           /**
       360   -
            * Get the value of suppressedIdentifiers.
      +
            * A set of identifiers that have been suppressed.
       361   -
            *
      +
            */
       362   -
            * @return the value of suppressedIdentifiers
      +
           private Set<Identifier> suppressedIdentifiers;
       363   -
            */
      +
       
       364   -
           public Set<Identifier> getSuppressedIdentifiers() {
      -  365  40
               return suppressedIdentifiers;
      +
           /**
      +  365   +
            * Get the value of suppressedIdentifiers.
       366   -
           }
      +
            *
       367   -
       
      +
            * @return the value of suppressedIdentifiers
       368   -
           /**
      +
            */
       369   -
            * Set the value of suppressedIdentifiers.
      -  370   -
            *
      +
           public Set<Identifier> getSuppressedIdentifiers() {
      +  370  5
               return suppressedIdentifiers;
       371   -
            * @param suppressedIdentifiers new value of suppressedIdentifiers
      +
           }
       372   -
            */
      +
       
       373   -
           public void setSuppressedIdentifiers(Set<Identifier> suppressedIdentifiers) {
      -  374  0
               this.suppressedIdentifiers = suppressedIdentifiers;
      -  375  0
           }
      -  376   -
       
      -  377  
           /**
      -  378   -
            * Adds an identifier to the list of suppressed identifiers.
      -  379   +  374   +
            * Set the value of suppressedIdentifiers.
      +  375  
            *
      -  380   -
            * @param identifier an identifier that was suppressed.
      +  376   +
            * @param suppressedIdentifiers new value of suppressedIdentifiers
      +  377   +
            */
      +  378   +
           public void setSuppressedIdentifiers(Set<Identifier> suppressedIdentifiers) {
      +  379  0
               this.suppressedIdentifiers = suppressedIdentifiers;
      +  380  0
           }
       381   -
            */
      -  382   -
           public void addSuppressedIdentifier(Identifier identifier) {
      -  383  32
               this.suppressedIdentifiers.add(identifier);
      -  384  32
           }
      -  385  
       
      -  386   +  382  
           /**
      -  387   -
            * A set of vulnerabilities that have been suppressed.
      -  388   +  383   +
            * Adds an identifier to the list of suppressed identifiers.
      +  384   +
            *
      +  385   +
            * @param identifier an identifier that was suppressed.
      +  386  
            */
      -  389   -
           private SortedSet<Vulnerability> suppressedVulnerabilities;
      +  387   +
           public void addSuppressedIdentifier(Identifier identifier) {
      +  388  4
               this.suppressedIdentifiers.add(identifier);
      +  389  4
           }
       390  
       
       391  
           /**
       392   -
            * Get the value of suppressedVulnerabilities.
      +
            * A set of vulnerabilities that have been suppressed.
       393   -
            *
      +
            */
       394   -
            * @return the value of suppressedVulnerabilities
      +
           private SortedSet<Vulnerability> suppressedVulnerabilities;
       395   -
            */
      +
       
       396   -
           public SortedSet<Vulnerability> getSuppressedVulnerabilities() {
      -  397  24
               return suppressedVulnerabilities;
      +
           /**
      +  397   +
            * Get the value of suppressedVulnerabilities.
       398   -
           }
      +
            *
       399   -
       
      +
            * @return the value of suppressedVulnerabilities
       400   -
           /**
      +
            */
       401   -
            * Set the value of suppressedVulnerabilities.
      -  402   -
            *
      +
           public SortedSet<Vulnerability> getSuppressedVulnerabilities() {
      +  402  3
               return suppressedVulnerabilities;
       403   -
            * @param suppressedVulnerabilities new value of suppressedVulnerabilities
      +
           }
       404   -
            */
      +
       
       405   -
           public void setSuppressedVulnerabilities(SortedSet<Vulnerability> suppressedVulnerabilities) {
      -  406  0
               this.suppressedVulnerabilities = suppressedVulnerabilities;
      -  407  0
           }
      +
           /**
      +  406   +
            * Set the value of suppressedVulnerabilities.
      +  407   +
            *
       408   -
       
      +
            * @param suppressedVulnerabilities new value of suppressedVulnerabilities
       409   -
           /**
      +
            */
       410   -
            * Adds a vulnerability to the set of suppressed vulnerabilities.
      -  411   -
            *
      -  412   -
            * @param vulnerability the vulnerability that was suppressed
      +
           public void setSuppressedVulnerabilities(SortedSet<Vulnerability> suppressedVulnerabilities) {
      +  411  0
               this.suppressedVulnerabilities = suppressedVulnerabilities;
      +  412  0
           }
       413   -
            */
      +
       
       414   -
           public void addSuppressedVulnerability(Vulnerability vulnerability) {
      -  415  24
               this.suppressedVulnerabilities.add(vulnerability);
      -  416  24
           }
      +
           /**
      +  415   +
            * Adds a vulnerability to the set of suppressed vulnerabilities.
      +  416   +
            *
       417   -
       
      +
            * @param vulnerability the vulnerability that was suppressed
       418   -
           /**
      +
            */
       419   -
            * Returns the evidence used to identify this dependency.
      -  420   -
            *
      -  421   -
            * @return an EvidenceCollection.
      +
           public void addSuppressedVulnerability(Vulnerability vulnerability) {
      +  420  3
               this.suppressedVulnerabilities.add(vulnerability);
      +  421  3
           }
       422   -
            */
      +
       
       423   -
           public EvidenceCollection getEvidence() {
      -  424  88
               return EvidenceCollection.merge(this.productEvidence, this.vendorEvidence, this.versionEvidence);
      +
           /**
      +  424   +
            * Returns the evidence used to identify this dependency.
       425   -
           }
      +
            *
       426   -
       
      +
            * @return an EvidenceCollection.
       427   -
           /**
      +
            */
       428   -
            * Returns the evidence used to identify this dependency.
      -  429   -
            *
      +
           public EvidenceCollection getEvidence() {
      +  429  11
               return EvidenceCollection.merge(this.productEvidence, this.vendorEvidence, this.versionEvidence);
       430   -
            * @return an EvidenceCollection.
      +
           }
       431   -
            */
      +
       
       432   -
           public Set<Evidence> getEvidenceForDisplay() {
      -  433  0
               return EvidenceCollection.mergeForDisplay(this.productEvidence, this.vendorEvidence, this.versionEvidence);
      -  434   -
           }
      -  435   -
       
      -  436  
           /**
      -  437   +  433  
            * Returns the evidence used to identify this dependency.
      -  438   +  434  
            *
      +  435   +
            * @return an EvidenceCollection.
      +  436   +
            */
      +  437   +
           public Set<Evidence> getEvidenceForDisplay() {
      +  438  0
               return EvidenceCollection.mergeForDisplay(this.productEvidence, this.vendorEvidence, this.versionEvidence);
       439   -
            * @return an EvidenceCollection.
      +
           }
       440   -
            */
      +
       
       441   -
           public EvidenceCollection getEvidenceUsed() {
      -  442  8
               return EvidenceCollection.mergeUsed(this.productEvidence, this.vendorEvidence, this.versionEvidence);
      +
           /**
      +  442   +
            * Returns the evidence used to identify this dependency.
       443   -
           }
      +
            *
       444   -
       
      +
            * @return an EvidenceCollection.
       445   -
           /**
      +
            */
       446   -
            * Gets the Vendor Evidence.
      -  447   -
            *
      +
           public EvidenceCollection getEvidenceUsed() {
      +  447  1
               return EvidenceCollection.mergeUsed(this.productEvidence, this.vendorEvidence, this.versionEvidence);
       448   -
            * @return an EvidenceCollection.
      +
           }
       449   -
            */
      +
       
       450   -
           public EvidenceCollection getVendorEvidence() {
      -  451  800
               return this.vendorEvidence;
      +
           /**
      +  451   +
            * Gets the Vendor Evidence.
       452   -
           }
      +
            *
       453   -
       
      +
            * @return an EvidenceCollection.
       454   -
           /**
      +
            */
       455   -
            * Gets the Product Evidence.
      -  456   -
            *
      +
           public EvidenceCollection getVendorEvidence() {
      +  456  134
               return this.vendorEvidence;
       457   -
            * @return an EvidenceCollection.
      +
           }
       458   -
            */
      +
       
       459   -
           public EvidenceCollection getProductEvidence() {
      -  460  1128
               return this.productEvidence;
      +
           /**
      +  460   +
            * Gets the Product Evidence.
       461   -
           }
      -  462   -
       
      -  463   -
           /**
      -  464   -
            * Gets the Version Evidence.
      -  465  
            *
      -  466   +  462  
            * @return an EvidenceCollection.
      -  467   +  463  
            */
      -  468   -
           public EvidenceCollection getVersionEvidence() {
      -  469  536
               return this.versionEvidence;
      -  470   +  464   +
           public EvidenceCollection getProductEvidence() {
      +  465  175
               return this.productEvidence;
      +  466  
           }
      -  471   +  467  
       
      -  472   +  468  
           /**
      -  473   -
            * The description of the JAR file.
      -  474   +  469   +
            * Gets the Version Evidence.
      +  470   +
            *
      +  471   +
            * @return an EvidenceCollection.
      +  472  
            */
      +  473   +
           public EvidenceCollection getVersionEvidence() {
      +  474  101
               return this.versionEvidence;
       475   -
           private String description;
      +
           }
       476  
       
       477  
           /**
       478   -
            * Get the value of description.
      +
            * The description of the JAR file.
       479   -
            *
      +
            */
       480   -
            * @return the value of description
      +
           private String description;
       481   -
            */
      +
       
       482   -
           public String getDescription() {
      -  483  72
               return description;
      +
           /**
      +  483   +
            * Get the value of description.
       484   -
           }
      -  485   -
       
      -  486   -
           /**
      -  487   -
            * Set the value of description.
      -  488  
            *
      +  485   +
            * @return the value of description
      +  486   +
            */
      +  487   +
           public String getDescription() {
      +  488  9
               return description;
       489   -
            * @param description new value of description
      +
           }
       490   -
            */
      -  491   -
           public void setDescription(String description) {
      -  492  144
               this.description = description;
      -  493  144
           }
      -  494  
       
      -  495   +  491  
           /**
      -  496   -
            * The license that this dependency uses.
      -  497   +  492   +
            * Set the value of description.
      +  493   +
            *
      +  494   +
            * @param description new value of description
      +  495  
            */
      -  498   -
           private String license;
      +  496   +
           public void setDescription(String description) {
      +  497  18
               this.description = description;
      +  498  18
           }
       499  
       
       500  
           /**
       501   -
            * Get the value of license.
      +
            * The license that this dependency uses.
       502   -
            *
      +
            */
       503   -
            * @return the value of license
      +
           private String license;
       504   -
            */
      +
       
       505   -
           public String getLicense() {
      -  506  16
               return license;
      +
           /**
      +  506   +
            * Get the value of license.
       507   -
           }
      -  508   -
       
      -  509   -
           /**
      -  510   -
            * Set the value of license.
      -  511  
            *
      +  508   +
            * @return the value of license
      +  509   +
            */
      +  510   +
           public String getLicense() {
      +  511  2
               return license;
       512   -
            * @param license new value of license
      +
           }
       513   -
            */
      -  514   -
           public void setLicense(String license) {
      -  515  16
               this.license = license;
      -  516  16
           }
      -  517  
       
      -  518   +  514  
           /**
      -  519   -
            * A list of vulnerabilities for this dependency.
      -  520   +  515   +
            * Set the value of license.
      +  516   +
            *
      +  517   +
            * @param license new value of license
      +  518  
            */
      -  521   -
           private SortedSet<Vulnerability> vulnerabilities;
      +  519   +
           public void setLicense(String license) {
      +  520  2
               this.license = license;
      +  521  2
           }
       522  
       
       523  
           /**
       524   -
            * Get the list of vulnerabilities.
      +
            * A list of vulnerabilities for this dependency.
       525   -
            *
      +
            */
       526   -
            * @return the list of vulnerabilities
      +
           private SortedSet<Vulnerability> vulnerabilities;
       527   -
            */
      +
       
       528   -
           public SortedSet<Vulnerability> getVulnerabilities() {
      -  529  112
               return vulnerabilities;
      +
           /**
      +  529   +
            * Get the list of vulnerabilities.
       530   -
           }
      +
            *
       531   -
       
      +
            * @return the list of vulnerabilities
       532   -
           /**
      +
            */
       533   -
            * Set the value of vulnerabilities.
      -  534   -
            *
      +
           public SortedSet<Vulnerability> getVulnerabilities() {
      +  534  14
               return vulnerabilities;
       535   -
            * @param vulnerabilities new value of vulnerabilities
      +
           }
       536   -
            */
      +
       
       537   -
           public void setVulnerabilities(SortedSet<Vulnerability> vulnerabilities) {
      -  538  0
               this.vulnerabilities = vulnerabilities;
      -  539  0
           }
      +
           /**
      +  538   +
            * Set the value of vulnerabilities.
      +  539   +
            *
       540   -
       
      +
            * @param vulnerabilities new value of vulnerabilities
       541   -
           /**
      +
            */
       542   -
            * Determines the sha1 and md5 sum for the given file.
      -  543   -
            *
      -  544   -
            * @param file the file to create checksums for
      +
           public void setVulnerabilities(SortedSet<Vulnerability> vulnerabilities) {
      +  543  0
               this.vulnerabilities = vulnerabilities;
      +  544  0
           }
       545   -
            */
      +
       
       546   -
           private void determineHashes(File file) {
      -  547  264
               String md5 = null;
      -  548  264
               String sha1 = null;
      -  549   -
               try {
      -  550  264
                   md5 = Checksum.getMD5Checksum(file);
      -  551  256
                   sha1 = Checksum.getSHA1Checksum(file);
      -  552  8
               } catch (IOException ex) {
      -  553  8
                   LOGGER.warn("Unable to read '{}' to determine hashes.", file.getName());
      -  554  8
                   LOGGER.debug("", ex);
      -  555  0
               } catch (NoSuchAlgorithmException ex) {
      -  556  0
                   LOGGER.warn("Unable to use MD5 of SHA1 checksums.");
      -  557  0
                   LOGGER.debug("", ex);
      -  558  264
               }
      -  559  264
               this.setMd5sum(md5);
      -  560  264
               this.setSha1sum(sha1);
      -  561  264
           }
      -  562   -
       
      -  563  
           /**
      -  564   -
            * Adds a vulnerability to the dependency.
      -  565   +  547   +
            * Determines the sha1 and md5 sum for the given file.
      +  548  
            *
      -  566   -
            * @param vulnerability a vulnerability outlining a vulnerability.
      +  549   +
            * @param file the file to create checksums for
      +  550   +
            */
      +  551   +
           private void determineHashes(File file) {
      +  552  66
               String md5 = null;
      +  553  66
               String sha1 = null;
      +  554   +
               try {
      +  555  66
                   md5 = Checksum.getMD5Checksum(file);
      +  556  65
                   sha1 = Checksum.getSHA1Checksum(file);
      +  557  1
               } catch (IOException ex) {
      +  558  1
                   LOGGER.warn("Unable to read '{}' to determine hashes.", file.getName());
      +  559  1
                   LOGGER.debug("", ex);
      +  560  0
               } catch (NoSuchAlgorithmException ex) {
      +  561  0
                   LOGGER.warn("Unable to use MD5 of SHA1 checksums.");
      +  562  0
                   LOGGER.debug("", ex);
      +  563  66
               }
      +  564  66
               this.setMd5sum(md5);
      +  565  66
               this.setSha1sum(sha1);
      +  566  66
           }
       567   -
            */
      -  568   -
           public void addVulnerability(Vulnerability vulnerability) {
      -  569  24
               this.vulnerabilities.add(vulnerability);
      -  570  24
           }
      -  571  
       
      -  572   +  568  
           /**
      -  573   -
            * A collection of related dependencies.
      -  574   +  569   +
            * Adds a vulnerability to the dependency.
      +  570   +
            *
      +  571   +
            * @param vulnerability a vulnerability outlining a vulnerability.
      +  572  
            */
      -  575  432
           private Set<Dependency> relatedDependencies = new TreeSet<Dependency>();
      +  573   +
           public void addVulnerability(Vulnerability vulnerability) {
      +  574  3
               this.vulnerabilities.add(vulnerability);
      +  575  3
           }
       576  
       
       577  
           /**
       578   -
            * Get the value of {@link #relatedDependencies}. This field is used to collect other dependencies which really represent the
      +
            * A collection of related dependencies.
       579   -
            * same dependency, and may be presented as one item in reports.
      -  580   -
            *
      +
            */
      +  580  87
           private Set<Dependency> relatedDependencies = new TreeSet<Dependency>();
       581   -
            * @return the value of relatedDependencies
      -  582   -
            */
      -  583   -
           public Set<Dependency> getRelatedDependencies() {
      -  584  0
               return relatedDependencies;
      -  585   -
           }
      -  586  
       
      -  587   +  582  
           /**
      -  588   -
            * A list of projects that reference this dependency.
      -  589   +  583   +
            * Get the value of {@link #relatedDependencies}. This field is used to collect other dependencies which really represent the
      +  584   +
            * same dependency, and may be presented as one item in reports.
      +  585   +
            *
      +  586   +
            * @return the value of relatedDependencies
      +  587  
            */
      -  590  432
           private Set<String> projectReferences = new HashSet<String>();
      +  588   +
           public Set<Dependency> getRelatedDependencies() {
      +  589  0
               return relatedDependencies;
      +  590   +
           }
       591  
       
       592  
           /**
       593   -
            * Get the value of projectReferences.
      +
            * A list of projects that reference this dependency.
       594   -
            *
      -  595   -
            * @return the value of projectReferences
      +
            */
      +  595  87
           private Set<String> projectReferences = new HashSet<String>();
       596   -
            */
      +
       
       597   -
           public Set<String> getProjectReferences() {
      -  598  0
               return projectReferences;
      +
           /**
      +  598   +
            * Get the value of projectReferences.
       599   -
           }
      +
            *
       600   -
       
      +
            * @return the value of projectReferences
       601   -
           /**
      +
            */
       602   -
            * Set the value of projectReferences.
      -  603   -
            *
      +
           public Set<String> getProjectReferences() {
      +  603  0
               return projectReferences;
       604   -
            * @param projectReferences new value of projectReferences
      +
           }
       605   -
            */
      +
       
       606   -
           public void setProjectReferences(Set<String> projectReferences) {
      -  607  0
               this.projectReferences = projectReferences;
      -  608  0
           }
      +
           /**
      +  607   +
            * Set the value of projectReferences.
      +  608   +
            *
       609   -
       
      +
            * @param projectReferences new value of projectReferences
       610   -
           /**
      +
            */
       611   -
            * Adds a project reference.
      -  612   -
            *
      -  613   -
            * @param projectReference a project reference
      +
           public void setProjectReferences(Set<String> projectReferences) {
      +  612  0
               this.projectReferences = projectReferences;
      +  613  0
           }
       614   -
            */
      +
       
       615   -
           public void addProjectReference(String projectReference) {
      -  616  0
               this.projectReferences.add(projectReference);
      -  617  0
           }
      +
           /**
      +  616   +
            * Adds a project reference.
      +  617   +
            *
       618   -
       
      +
            * @param projectReference a project reference
       619   -
           /**
      +
            */
       620   -
            * Add a collection of project reference.
      -  621   -
            *
      -  622   -
            * @param projectReferences a set of project references
      +
           public void addProjectReference(String projectReference) {
      +  621  0
               this.projectReferences.add(projectReference);
      +  622  0
           }
       623   -
            */
      +
       
       624   -
           public void addAllProjectReferences(Set<String> projectReferences) {
      -  625  0
               this.projectReferences.addAll(projectReferences);
      -  626  0
           }
      +
           /**
      +  625   +
            * Add a collection of project reference.
      +  626   +
            *
       627   -
       
      +
            * @param projectReferences a set of project references
       628   -
           /**
      +
            */
       629   -
            * Set the value of relatedDependencies.
      -  630   -
            *
      -  631   -
            * @param relatedDependencies new value of relatedDependencies
      +
           public void addAllProjectReferences(Set<String> projectReferences) {
      +  630  0
               this.projectReferences.addAll(projectReferences);
      +  631  0
           }
       632   -
            */
      +
       
       633   -
           public void setRelatedDependencies(Set<Dependency> relatedDependencies) {
      -  634  0
               this.relatedDependencies = relatedDependencies;
      -  635  0
           }
      -  636   -
       
      -  637  
           /**
      -  638   -
            * Adds a related dependency. The internal collection is normally a {@link java.util.TreeSet}, which relies on
      -  639   -
            * {@link #compareTo(Dependency)}. A consequence of this is that if you attempt to add a dependency with the same file path
      -  640   -
            * (modulo character case) as one that is already in the collection, it won't get added.
      -  641   +  634   +
            * Set the value of relatedDependencies.
      +  635  
            *
      -  642   -
            * @param dependency a reference to the related dependency
      -  643   +  636   +
            * @param relatedDependencies new value of relatedDependencies
      +  637  
            */
      -  644   -
           public void addRelatedDependency(Dependency dependency) {
      -  645  0
               if (this == dependency) {
      -  646  0
                   LOGGER.warn("Attempted to add a circular reference - please post the log file to issue #172 here "
      -  647   -
                           + "https://github.com/jeremylong/DependencyCheck/issues/172");
      -  648  0
                   LOGGER.debug("this: {}", this);
      -  649  0
                   LOGGER.debug("dependency: {}", dependency);
      -  650  0
               } else if (!relatedDependencies.add(dependency)) {
      -  651  0
                   LOGGER.debug("Failed to add dependency, likely due to referencing the same file as another dependency in the set.");
      -  652  0
                   LOGGER.debug("this: {}", this);
      -  653  0
                   LOGGER.debug("dependency: {}", dependency);
      -  654   -
               }
      -  655  0
           }
      -  656   +  638   +
           public void setRelatedDependencies(Set<Dependency> relatedDependencies) {
      +  639  0
               this.relatedDependencies = relatedDependencies;
      +  640  0
           }
      +  641  
       
      -  657   +  642  
           /**
      -  658   -
            * A list of available versions.
      -  659   +  643   +
            * Adds a related dependency. The internal collection is normally a {@link java.util.TreeSet}, which relies on
      +  644   +
            * {@link #compareTo(Dependency)}. A consequence of this is that if you attempt to add a dependency with the same file path
      +  645   +
            * (modulo character case) as one that is already in the collection, it won't get added.
      +  646   +
            *
      +  647   +
            * @param dependency a reference to the related dependency
      +  648  
            */
      -  660  432
           private List<String> availableVersions = new ArrayList<String>();
      +  649   +
           public void addRelatedDependency(Dependency dependency) {
      +  650  0
               if (this == dependency) {
      +  651  0
                   LOGGER.warn("Attempted to add a circular reference - please post the log file to issue #172 here "
      +  652   +
                           + "https://github.com/jeremylong/DependencyCheck/issues/172");
      +  653  0
                   LOGGER.debug("this: {}", this);
      +  654  0
                   LOGGER.debug("dependency: {}", dependency);
      +  655  0
               } else if (!relatedDependencies.add(dependency)) {
      +  656  0
                   LOGGER.debug("Failed to add dependency, likely due to referencing the same file as another dependency in the set.");
      +  657  0
                   LOGGER.debug("this: {}", this);
      +  658  0
                   LOGGER.debug("dependency: {}", dependency);
      +  659   +
               }
      +  660  0
           }
       661  
       
       662  
           /**
       663   -
            * Get the value of availableVersions.
      +
            * A list of available versions.
       664   -
            *
      -  665   -
            * @return the value of availableVersions
      +
            */
      +  665  87
           private List<String> availableVersions = new ArrayList<String>();
       666   -
            */
      +
       
       667   -
           public List<String> getAvailableVersions() {
      -  668  0
               return availableVersions;
      +
           /**
      +  668   +
            * Get the value of availableVersions.
       669   -
           }
      +
            *
       670   -
       
      +
            * @return the value of availableVersions
       671   -
           /**
      +
            */
       672   -
            * Set the value of availableVersions.
      -  673   -
            *
      +
           public List<String> getAvailableVersions() {
      +  673  0
               return availableVersions;
       674   -
            * @param availableVersions new value of availableVersions
      +
           }
       675   -
            */
      +
       
       676   -
           public void setAvailableVersions(List<String> availableVersions) {
      -  677  0
               this.availableVersions = availableVersions;
      -  678  0
           }
      +
           /**
      +  677   +
            * Set the value of availableVersions.
      +  678   +
            *
       679   -
       
      +
            * @param availableVersions new value of availableVersions
       680   -
           /**
      +
            */
       681   -
            * Adds a version to the available version list.
      -  682   -
            *
      -  683   -
            * @param version the version to add to the list
      +
           public void setAvailableVersions(List<String> availableVersions) {
      +  682  0
               this.availableVersions = availableVersions;
      +  683  0
           }
       684   -
            */
      +
       
       685   -
           public void addAvailableVersion(String version) {
      -  686  0
               this.availableVersions.add(version);
      -  687  0
           }
      +
           /**
      +  686   +
            * Adds a version to the available version list.
      +  687   +
            *
       688   -
       
      +
            * @param version the version to add to the list
       689   -
           /**
      +
            */
       690   -
            * Implementation of the Comparable<Dependency> interface. The comparison is solely based on the file path.
      -  691   -
            *
      -  692   -
            * @param o a dependency to compare
      +
           public void addAvailableVersion(String version) {
      +  691  0
               this.availableVersions.add(version);
      +  692  0
           }
       693   -
            * @return an integer representing the natural ordering
      +
       
       694   -
            */
      +
           /**
       695   -
           public int compareTo(Dependency o) {
      -  696  16
               return this.getFilePath().compareToIgnoreCase(o.getFilePath());
      +
            * Implementation of the Comparable<Dependency> interface. The comparison is solely based on the file path.
      +  696   +
            *
       697   -
           }
      +
            * @param o a dependency to compare
       698   -
       
      +
            * @return an integer representing the natural ordering
       699   -
           /**
      +
            */
       700   -
            * Implementation of the equals method.
      +
           @Override
       701   -
            *
      -  702   -
            * @param obj the object to compare
      +
           public int compareTo(Dependency o) {
      +  702  2
               return this.getFilePath().compareToIgnoreCase(o.getFilePath());
       703   -
            * @return true if the objects are equal, otherwise false
      +
           }
       704   -
            */
      +
       
       705   -
           @Override
      +
           /**
       706   -
           public boolean equals(Object obj) {
      -  707  0
               if (obj == null || getClass() != obj.getClass()) {
      -  708  0
                   return false;
      +
            * Implementation of the equals method.
      +  707   +
            *
      +  708   +
            * @param obj the object to compare
       709   -
               }
      -  710  0
               final Dependency other = (Dependency) obj;
      -  711  0
               return ObjectUtils.equals(this.actualFilePath, other.actualFilePath)
      +
            * @return true if the objects are equal, otherwise false
      +  710   +
            */
      +  711   +
           @Override
       712   -
                       && ObjectUtils.equals(this.filePath, other.filePath)
      -  713   -
                       && ObjectUtils.equals(this.fileName, other.fileName)
      -  714   -
                       && ObjectUtils.equals(this.md5sum, other.md5sum)
      +
           public boolean equals(Object obj) {
      +  713  0
               if (obj == null || getClass() != obj.getClass()) {
      +  714  0
                   return false;
       715   -
                       && ObjectUtils.equals(this.sha1sum, other.sha1sum)
      -  716   -
                       && ObjectUtils.equals(this.identifiers, other.identifiers)
      -  717   -
                       && ObjectUtils.equals(this.vendorEvidence, other.vendorEvidence)
      -  718   -
                       && ObjectUtils.equals(this.productEvidence, other.productEvidence)
      -  719   -
                       && ObjectUtils.equals(this.versionEvidence, other.versionEvidence)
      -  720   -
                       && ObjectUtils.equals(this.description, other.description)
      -  721   -
                       && ObjectUtils.equals(this.license, other.license)
      -  722   -
                       && ObjectUtils.equals(this.vulnerabilities, other.vulnerabilities)
      -  723   -
                       && ObjectUtils.equals(this.relatedDependencies, other.relatedDependencies)
      -  724   -
                       && ObjectUtils.equals(this.projectReferences, other.projectReferences)
      -  725   -
                       && ObjectUtils.equals(this.availableVersions, other.availableVersions);
      -  726   -
           }
      -  727   -
       
      -  728   -
           /**
      -  729   -
            * Generates the HashCode.
      -  730   -
            *
      -  731   -
            * @return the HashCode
      -  732   -
            */
      -  733   -
           @Override
      -  734   -
           public int hashCode() {
      -  735  304
               int hash = MAGIC_HASH_INIT_VALUE;
      -  736  4864
               for (Object field : new Object[]{this.actualFilePath, this.filePath, this.fileName, this.md5sum,
      -  737   -
                   this.sha1sum, this.identifiers, this.vendorEvidence, this.productEvidence, this.versionEvidence,
      -  738   -
                   this.description, this.license, this.vulnerabilities, this.relatedDependencies, this.projectReferences,
      -  739   -
                   this.availableVersions}) {
      -  740  4560
                   hash = MAGIC_HASH_MULTIPLIER * hash + ObjectUtils.hashCode(field);
      -  741  
               }
      -  742  304
               return hash;
      -  743   +  716  0
               final Dependency other = (Dependency) obj;
      +  717  0
               return new EqualsBuilder()
      +  718   +
                   .appendSuper(super.equals(obj))
      +  719   +
                   .append(this.actualFilePath, other.actualFilePath)
      +  720   +
                   .append(this.filePath, other.filePath)
      +  721   +
                   .append(this.fileName, other.fileName)
      +  722   +
                   .append(this.md5sum, other.md5sum)
      +  723   +
                   .append(this.sha1sum, other.sha1sum)
      +  724   +
                   .append(this.identifiers, other.identifiers)
      +  725   +
                   .append(this.vendorEvidence, other.vendorEvidence)
      +  726   +
                   .append(this.productEvidence, other.productEvidence)
      +  727   +
                   .append(this.versionEvidence, other.versionEvidence)
      +  728   +
                   .append(this.description, other.description)
      +  729   +
                   .append(this.license, other.license)
      +  730   +
                   .append(this.vulnerabilities, other.vulnerabilities)
      +  731   +
                   //.append(this.relatedDependencies, other.relatedDependencies)
      +  732   +
                   .append(this.projectReferences, other.projectReferences)
      +  733   +
                   .append(this.availableVersions, other.availableVersions)
      +  734   +
                   .isEquals();
      +  735  
           }
      -  744   +  736  
       
      -  745   +  737  
           /**
      -  746   -
            * Standard toString() implementation showing the filename, actualFilePath, and filePath.
      -  747   +  738   +
            * Generates the HashCode.
      +  739  
            *
      -  748   -
            * @return the string representation of the file
      -  749   +  740   +
            * @return the HashCode
      +  741  
            */
      -  750   +  742  
           @Override
      +  743   +
           public int hashCode() {
      +  744  44
               return new HashCodeBuilder(MAGIC_HASH_INIT_VALUE, MAGIC_HASH_MULTIPLIER)
      +  745   +
                   .append(actualFilePath)
      +  746   +
                   .append(filePath)
      +  747   +
                   .append(fileName)
      +  748   +
                   .append(md5sum)
      +  749   +
                   .append(sha1sum)
      +  750   +
                   .append(identifiers)
       751   -
           public String toString() {
      -  752  0
               return "Dependency{ fileName='" + fileName + "', actualFilePath='" + actualFilePath + "', filePath='" + filePath + "'}";
      +
                   .append(vendorEvidence)
      +  752   +
                   .append(productEvidence)
       753   -
           }
      +
                   .append(versionEvidence)
       754   +
                   .append(description)
      +  755   +
                   .append(license)
      +  756   +
                   .append(vulnerabilities)
      +  757   +
                   //.append(relatedDependencies)
      +  758   +
                   .append(projectReferences)
      +  759   +
                   .append(availableVersions)
      +  760   +
                   .toHashCode();
      +  761   +
           }
      +  762   +
       
      +  763   +
           /**
      +  764   +
            * Standard toString() implementation showing the filename, actualFilePath, and filePath.
      +  765   +
            *
      +  766   +
            * @return the string representation of the file
      +  767   +
            */
      +  768   +
           @Override
      +  769   +
           public String toString() {
      +  770  30
               return "Dependency{ fileName='" + fileName + "', actualFilePath='" + actualFilePath + "', filePath='" + filePath + "'}";
      +  771   +
           }
      +  772  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Evidence.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Evidence.html index b5e0091f7..39edf96ce 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Evidence.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Evidence.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      Evidence
      67%
      39/58
      61%
      21/34
      2.389
      Evidence
      64%
      34/53
      61%
      21/34
      2.389
       
      @@ -56,479 +56,496 @@  19  
       
       20   -
       import org.apache.commons.lang.ObjectUtils;
      +
       import org.apache.commons.lang3.ObjectUtils;
       21   -
       import org.apache.commons.lang.StringUtils;
      +
       import org.apache.commons.lang3.StringUtils;
       22   -
       
      +
       import org.apache.commons.lang3.builder.HashCodeBuilder;
       23   -
       import java.io.Serializable;
      +
       
       24   -
       
      +
       import java.io.Serializable;
       25   -
       /**
      +
       
       26   -
        * Evidence is a piece of information about a Dependency.
      +
       /**
       27   -
        *
      +
        * Evidence is a piece of information about a Dependency.
       28   -
        * @author Jeremy Long
      +
        *
       29   +
        * @author Jeremy Long
      +  30  
        */
      -  30  306480
       public class Evidence implements Serializable, Comparable<Evidence> {
      -  31   -
       
      +  31  38437
       public class Evidence implements Serializable, Comparable<Evidence> {
       32   -
           /**
      -  33   -
            * Used as starting point for generating the value in {@link #hashCode()}.
      -  34   -
            */
      -  35   -
           private static final int MAGIC_HASH_INIT_VALUE = 3;
      -  36  
       
      +  33   +
           /**
      +  34   +
            * The serial version UID for serialization.
      +  35   +
            */
      +  36   +
           private static final long serialVersionUID = 1L;
       37  
           /**
       38   -
            * Used as a multiplier for generating the value in {@link #hashCode()}.
      +
            * Used as starting point for generating the value in {@link #hashCode()}.
       39  
            */
       40   -
           private static final int MAGIC_HASH_MULTIPLIER = 67;
      +
           private static final int MAGIC_HASH_INIT_VALUE = 3;
       41  
       
       42  
           /**
       43   -
            * Creates a new Evidence object.
      +
            * Used as a multiplier for generating the value in {@link #hashCode()}.
       44  
            */
      -  45  0
           public Evidence() {
      -  46  0
           }
      +  45   +
           private static final int MAGIC_HASH_MULTIPLIER = 67;
      +  46   +
       
       47   -
       
      +
           /**
       48   -
           /**
      +
            * Creates a new Evidence object.
       49   -
            * Creates a new Evidence objects.
      -  50   -
            *
      -  51   -
            * @param source     the source of the evidence.
      +
            */
      +  50  0
           public Evidence() {
      +  51  0
           }
       52   -
            * @param name       the name of the evidence.
      -  53   -
            * @param value      the value of the evidence.
      -  54   -
            * @param confidence the confidence of the evidence.
      -  55   -
            */
      -  56  117192
           public Evidence(String source, String name, String value, Confidence confidence) {
      -  57  117192
               this.source = source;
      -  58  117192
               this.name = name;
      -  59  117192
               this.value = value;
      -  60  117192
               this.confidence = confidence;
      -  61  117192
           }
      -  62  
       
      -  63   +  53  
           /**
      -  64   -
            * The name of the evidence.
      -  65   +  54   +
            * Creates a new Evidence objects.
      +  55   +
            *
      +  56   +
            * @param source     the source of the evidence.
      +  57   +
            * @param name       the name of the evidence.
      +  58   +
            * @param value      the value of the evidence.
      +  59   +
            * @param confidence the confidence of the evidence.
      +  60  
            */
      -  66   -
           private String name;
      +  61  14757
           public Evidence(String source, String name, String value, Confidence confidence) {
      +  62  14757
               this.source = source;
      +  63  14757
               this.name = name;
      +  64  14757
               this.value = value;
      +  65  14757
               this.confidence = confidence;
      +  66  14757
           }
       67  
       
       68  
           /**
       69   -
            * Get the value of name.
      +
            * The name of the evidence.
       70   -
            *
      +
            */
       71   -
            * @return the value of name
      +
           private String name;
       72   -
            */
      +
       
       73   -
           public String getName() {
      -  74  192
               return name;
      +
           /**
      +  74   +
            * Get the value of name.
       75   -
           }
      -  76   -
       
      -  77   -
           /**
      -  78   -
            * Set the value of name.
      -  79  
            *
      +  76   +
            * @return the value of name
      +  77   +
            */
      +  78   +
           public String getName() {
      +  79  24
               return name;
       80   -
            * @param name new value of name
      +
           }
       81   -
            */
      -  82   -
           public void setName(String name) {
      -  83  0
               this.name = name;
      -  84  0
           }
      -  85  
       
      -  86   +  82  
           /**
      -  87   -
            * The source of the evidence.
      -  88   +  83   +
            * Set the value of name.
      +  84   +
            *
      +  85   +
            * @param name new value of name
      +  86  
            */
      -  89   -
           private String source;
      +  87   +
           public void setName(String name) {
      +  88  0
               this.name = name;
      +  89  0
           }
       90  
       
       91  
           /**
       92   -
            * Get the value of source.
      +
            * The source of the evidence.
       93   -
            *
      +
            */
       94   -
            * @return the value of source
      +
           private String source;
       95   -
            */
      +
       
       96   -
           public String getSource() {
      -  97  88
               return source;
      +
           /**
      +  97   +
            * Get the value of source.
       98   -
           }
      -  99   -
       
      -  100   -
           /**
      -  101   -
            * Set the value of source.
      -  102  
            *
      +  99   +
            * @return the value of source
      +  100   +
            */
      +  101   +
           public String getSource() {
      +  102  11
               return source;
       103   -
            * @param source new value of source
      +
           }
       104   -
            */
      -  105   -
           public void setSource(String source) {
      -  106  0
               this.source = source;
      -  107  0
           }
      -  108  
       
      -  109   +  105  
           /**
      -  110   -
            * The value of the evidence.
      -  111   +  106   +
            * Set the value of source.
      +  107   +
            *
      +  108   +
            * @param source new value of source
      +  109  
            */
      -  112   -
           private String value;
      +  110   +
           public void setSource(String source) {
      +  111  0
               this.source = source;
      +  112  0
           }
       113  
       
       114  
           /**
       115   -
            * Get the value of value.
      +
            * The value of the evidence.
       116   -
            *
      +
            */
       117   -
            * @return the value of value
      +
           private String value;
       118   -
            */
      +
       
       119   -
           public String getValue() {
      -  120  6200
               used = true;
      -  121  6200
               return value;
      +
           /**
      +  120   +
            * Get the value of value.
      +  121   +
            *
       122   -
           }
      -  123   -
       
      -  124   -
           /**
      -  125   -
            * Get the value of value. If setUsed is set to false this call to get will not mark the evidence as used.
      -  126   -
            *
      -  127   -
            * @param setUsed whether or not this call to getValue should cause the used flag to be updated
      -  128  
            * @return the value of value
      -  129   +  123  
            */
      -  130   -
           public String getValue(Boolean setUsed) {
      -  131  400
               used = used || setUsed;
      -  132  400
               return value;
      -  133   +  124   +
           public String getValue() {
      +  125  787
               used = true;
      +  126  787
               return value;
      +  127  
           }
      -  134   +  128  
       
      -  135   +  129  
           /**
      -  136   -
            * Set the value of value.
      -  137   +  130   +
            * Get the value of value. If setUsed is set to false this call to get will not mark the evidence as used.
      +  131  
            *
      +  132   +
            * @param setUsed whether or not this call to getValue should cause the used flag to be updated
      +  133   +
            * @return the value of value
      +  134   +
            */
      +  135   +
           public String getValue(Boolean setUsed) {
      +  136  50
               used = used || setUsed;
      +  137  50
               return value;
       138   -
            * @param value new value of value
      +
           }
       139   -
            */
      -  140   -
           public void setValue(String value) {
      -  141  0
               this.value = value;
      -  142  0
           }
      -  143  
       
      -  144   +  140  
           /**
      -  145   -
            * A value indicating if the Evidence has been "used" (aka read).
      -  146   +  141   +
            * Set the value of value.
      +  142   +
            *
      +  143   +
            * @param value new value of value
      +  144  
            */
      -  147   -
           private boolean used;
      +  145   +
           public void setValue(String value) {
      +  146  0
               this.value = value;
      +  147  0
           }
       148  
       
       149  
           /**
       150   -
            * Get the value of used.
      +
            * A value indicating if the Evidence has been "used" (aka read).
       151   -
            *
      +
            */
       152   -
            * @return the value of used
      +
           private boolean used;
       153   -
            */
      +
       
       154   -
           public boolean isUsed() {
      -  155  8656
               return used;
      +
           /**
      +  155   +
            * Get the value of used.
       156   -
           }
      -  157   -
       
      -  158   -
           /**
      -  159   -
            * Set the value of used.
      -  160  
            *
      +  157   +
            * @return the value of used
      +  158   +
            */
      +  159   +
           public boolean isUsed() {
      +  160  1082
               return used;
       161   -
            * @param used new value of used
      +
           }
       162   -
            */
      -  163   -
           public void setUsed(boolean used) {
      -  164  0
               this.used = used;
      -  165  0
           }
      -  166  
       
      -  167   +  163  
           /**
      -  168   -
            * The confidence level for the evidence.
      -  169   +  164   +
            * Set the value of used.
      +  165   +
            *
      +  166   +
            * @param used new value of used
      +  167  
            */
      -  170   -
           private Confidence confidence;
      +  168   +
           public void setUsed(boolean used) {
      +  169  0
               this.used = used;
      +  170  0
           }
       171  
       
       172  
           /**
       173   -
            * Get the value of confidence.
      +
            * The confidence level for the evidence.
       174   -
            *
      +
            */
       175   -
            * @return the value of confidence
      +
           private Confidence confidence;
       176   -
            */
      +
       
       177   -
           public Confidence getConfidence() {
      -  178  1904
               return confidence;
      +
           /**
      +  178   +
            * Get the value of confidence.
       179   -
           }
      +
            *
       180   -
       
      +
            * @return the value of confidence
       181   -
           /**
      +
            */
       182   -
            * Set the value of confidence.
      -  183   -
            *
      +
           public Confidence getConfidence() {
      +  183  238
               return confidence;
       184   -
            * @param confidence new value of confidence
      +
           }
       185   -
            */
      +
       
       186   -
           public void setConfidence(Confidence confidence) {
      -  187  0
               this.confidence = confidence;
      -  188  0
           }
      +
           /**
      +  187   +
            * Set the value of confidence.
      +  188   +
            *
       189   -
       
      +
            * @param confidence new value of confidence
       190   -
           /**
      +
            */
       191   -
            * Implements the hashCode for Evidence.
      -  192   -
            *
      -  193   -
            * @return hash code.
      +
           public void setConfidence(Confidence confidence) {
      +  192  0
               this.confidence = confidence;
      +  193  0
           }
       194   -
            */
      +
       
       195   -
           @Override
      +
           /**
       196   +
            * Implements the hashCode for Evidence.
      +  197   +
            *
      +  198   +
            * @return hash code.
      +  199   +
            */
      +  200   +
           @Override
      +  201  
           public int hashCode() {
      -  197  56
               int hash = MAGIC_HASH_INIT_VALUE;
      -  198  56
               hash = MAGIC_HASH_MULTIPLIER * hash + ObjectUtils.hashCode(StringUtils.lowerCase(this.name));
      -  199  56
               hash = MAGIC_HASH_MULTIPLIER * hash + ObjectUtils.hashCode(StringUtils.lowerCase(this.source));
      -  200  56
               hash = MAGIC_HASH_MULTIPLIER * hash + ObjectUtils.hashCode(StringUtils.lowerCase(this.value));
      -  201  56
               hash = MAGIC_HASH_MULTIPLIER * hash + ObjectUtils.hashCode(this.confidence);
      -  202  56
               return hash;
      +  202  7
               return new HashCodeBuilder(MAGIC_HASH_INIT_VALUE, MAGIC_HASH_MULTIPLIER)
       203   -
           }
      +
                   .append(StringUtils.lowerCase(name))
       204   -
       
      +
                   .append(StringUtils.lowerCase(source))
       205   -
           /**
      +
                   .append(StringUtils.lowerCase(value))
       206   -
            * Implements equals for Evidence.
      +
                   .append(confidence)
       207   -
            *
      +
                   .toHashCode();
       208   -
            * @param that an object to check the equality of.
      +
           }
       209   -
            * @return whether the two objects are equal.
      +
       
       210   -
            */
      +
           /**
       211   -
           @Override
      +
            * Implements equals for Evidence.
       212   -
           public boolean equals(Object that) {
      -  213  80
               if (this == that) {
      -  214  0
                   return true;
      +
            *
      +  213   +
            * @param that an object to check the equality of.
      +  214   +
            * @return whether the two objects are equal.
       215   -
               }
      -  216  80
               if (!(that instanceof Evidence)) {
      -  217  0
                   return false;
      -  218   -
               }
      -  219  80
               final Evidence e = (Evidence) that;
      -  220   -
       
      -  221  80
               return StringUtils.equalsIgnoreCase(name, e.name)
      -  222   -
                       && StringUtils.equalsIgnoreCase(source, e.source)
      -  223   -
                       && StringUtils.equalsIgnoreCase(value, e.value)
      -  224   -
                       && ObjectUtils.equals(confidence, e.confidence);
      -  225   -
           }
      -  226   -
       
      -  227   -
           /**
      -  228   -
            * Implementation of the comparable interface.
      -  229   -
            *
      -  230   -
            * @param o the evidence being compared
      -  231   -
            * @return an integer indicating the ordering of the two objects
      -  232  
            */
      -  233   -
           public int compareTo(Evidence o) {
      -  234  306560
               if (o == null) {
      -  235  0
                   return 1;
      -  236   -
               }
      -  237  306560
               if (StringUtils.equalsIgnoreCase(source, o.source)) {
      -  238  188912
                   if (StringUtils.equalsIgnoreCase(name, o.name)) {
      -  239  187768
                       if (StringUtils.equalsIgnoreCase(value, o.value)) {
      -  240  116296
                           if (ObjectUtils.equals(confidence, o.confidence)) {
      -  241  116184
                               return 0; //they are equal
      -  242   -
                           } else {
      -  243  112
                               return ObjectUtils.compare(confidence, o.confidence);
      -  244   -
                           }
      -  245   -
                       } else {
      -  246  71472
                           return compareToIgnoreCaseWithNullCheck(value, o.value);
      -  247   -
                       }
      -  248   -
                   } else {
      -  249  1144
                       return compareToIgnoreCaseWithNullCheck(name, o.name);
      -  250   -
                   }
      -  251   -
               } else {
      -  252  117648
                   return compareToIgnoreCaseWithNullCheck(source, o.source);
      -  253   -
               }
      -  254   -
           }
      -  255   -
       
      -  256   -
           /**
      -  257   -
            * Wrapper around {@link java.lang.String#compareToIgnoreCase(java.lang.String) String.compareToIgnoreCase} with an
      -  258   -
            * exhaustive, possibly duplicative, check against nulls.
      -  259   -
            *
      -  260   -
            * @param me    the value to be compared
      -  261   -
            * @param other the other value to be compared
      -  262   -
            * @return true if the values are equal; otherwise false
      -  263   -
            */
      -  264   -
           private int compareToIgnoreCaseWithNullCheck(String me, String other) {
      -  265  190264
               if (me == null && other == null) {
      -  266  0
                   return 0;
      -  267  190264
               } else if (me == null) {
      -  268  0
                   return -1; //the other string is greater then me
      -  269  190264
               } else if (other == null) {
      -  270  0
                   return 1; //me is greater then the other string
      -  271   -
               }
      -  272  190264
               return me.compareToIgnoreCase(other);
      -  273   -
           }
      -  274   -
       
      -  275   -
           /**
      -  276   -
            * Standard toString() implementation.
      -  277   -
            *
      -  278   -
            * @return the string representation of the object
      -  279   -
            */
      -  280   +  216  
           @Override
      -  281   -
           public String toString() {
      -  282  0
               return "Evidence{" + "name=" + name + ", source=" + source + ", value=" + value + ", confidence=" + confidence + '}';
      -  283   +  217   +
           public boolean equals(Object that) {
      +  218  10
               if (this == that) {
      +  219  0
                   return true;
      +  220   +
               }
      +  221  10
               if (!(that instanceof Evidence)) {
      +  222  0
                   return false;
      +  223   +
               }
      +  224  10
               final Evidence e = (Evidence) that;
      +  225   +
       
      +  226  10
               return StringUtils.equalsIgnoreCase(name, e.name)
      +  227   +
                       && StringUtils.equalsIgnoreCase(source, e.source)
      +  228   +
                       && StringUtils.equalsIgnoreCase(value, e.value)
      +  229   +
                       && ObjectUtils.equals(confidence, e.confidence);
      +  230  
           }
      +  231   +
       
      +  232   +
           /**
      +  233   +
            * Implementation of the comparable interface.
      +  234   +
            *
      +  235   +
            * @param o the evidence being compared
      +  236   +
            * @return an integer indicating the ordering of the two objects
      +  237   +
            */
      +  238   +
           @Override
      +  239   +
           public int compareTo(Evidence o) {
      +  240  38447
               if (o == null) {
      +  241  0
                   return 1;
      +  242   +
               }
      +  243  38447
               if (StringUtils.equalsIgnoreCase(source, o.source)) {
      +  244  23718
                   if (StringUtils.equalsIgnoreCase(name, o.name)) {
      +  245  23567
                       if (StringUtils.equalsIgnoreCase(value, o.value)) {
      +  246  14633
                           if (ObjectUtils.equals(confidence, o.confidence)) {
      +  247  14619
                               return 0; //they are equal
      +  248   +
                           } else {
      +  249  14
                               return ObjectUtils.compare(confidence, o.confidence);
      +  250   +
                           }
      +  251   +
                       } else {
      +  252  8934
                           return compareToIgnoreCaseWithNullCheck(value, o.value);
      +  253   +
                       }
      +  254   +
                   } else {
      +  255  151
                       return compareToIgnoreCaseWithNullCheck(name, o.name);
      +  256   +
                   }
      +  257   +
               } else {
      +  258  14729
                   return compareToIgnoreCaseWithNullCheck(source, o.source);
      +  259   +
               }
      +  260   +
           }
      +  261   +
       
      +  262   +
           /**
      +  263   +
            * Wrapper around {@link java.lang.String#compareToIgnoreCase(java.lang.String) String.compareToIgnoreCase} with an
      +  264   +
            * exhaustive, possibly duplicative, check against nulls.
      +  265   +
            *
      +  266   +
            * @param me    the value to be compared
      +  267   +
            * @param other the other value to be compared
      +  268   +
            * @return true if the values are equal; otherwise false
      +  269   +
            */
      +  270   +
           private int compareToIgnoreCaseWithNullCheck(String me, String other) {
      +  271  23814
               if (me == null && other == null) {
      +  272  0
                   return 0;
      +  273  23814
               } else if (me == null) {
      +  274  0
                   return -1; //the other string is greater then me
      +  275  23814
               } else if (other == null) {
      +  276  0
                   return 1; //me is greater then the other string
      +  277   +
               }
      +  278  23814
               return me.compareToIgnoreCase(other);
      +  279   +
           }
      +  280   +
       
      +  281   +
           /**
      +  282   +
            * Standard toString() implementation.
      +  283   +
            *
       284   +
            * @return the string representation of the object
      +  285   +
            */
      +  286   +
           @Override
      +  287   +
           public String toString() {
      +  288  0
               return "Evidence{" + "name=" + name + ", source=" + source + ", value=" + value + ", confidence=" + confidence + '}';
      +  289   +
           }
      +  290  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.EvidenceCollection.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.EvidenceCollection.html index 888ef61ba..532eeff36 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.EvidenceCollection.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.EvidenceCollection.html @@ -75,7 +75,7 @@  26  
       import java.util.TreeSet;
       27   -
       import org.apache.commons.lang.StringUtils;
      +
       import org.apache.commons.lang3.StringUtils;
       28  
       import org.owasp.dependencycheck.utils.DependencyVersion;
       29   @@ -107,238 +107,239 @@  42  
           /**
       43   -
            * The logger.
      +
            * The serial version UID for serialization.
       44  
            */
      -  45  8
           private static final Logger LOGGER = LoggerFactory.getLogger(EvidenceCollection.class);
      +  45   +
           private static final long serialVersionUID = 1L;
       46  
           /**
       47   -
            * Used to iterate over highest confidence evidence contained in the collection.
      +
            * The logger.
       48  
            */
      -  49  512
           private static final Filter<Evidence> HIGHEST_CONFIDENCE = new Filter<Evidence>() {
      +  49  1
           private static final Logger LOGGER = LoggerFactory.getLogger(EvidenceCollection.class);
       50   -
               public boolean passes(Evidence evidence) {
      -  51  504
                   return evidence.getConfidence() == Confidence.HIGHEST;
      +
           /**
      +  51   +
            * Used to iterate over highest confidence evidence contained in the collection.
       52   -
               }
      -  53   -
           };
      +
            */
      +  53  64
           private static final Filter<Evidence> HIGHEST_CONFIDENCE = new Filter<Evidence>() {
       54   -
           /**
      +
               @Override
       55   -
            * Used to iterate over high confidence evidence contained in the collection.
      -  56   -
            */
      -  57  328
           private static final Filter<Evidence> HIGH_CONFIDENCE = new Filter<Evidence>() {
      +
               public boolean passes(Evidence evidence) {
      +  56  63
                   return evidence.getConfidence() == Confidence.HIGHEST;
      +  57   +
               }
       58   -
               public boolean passes(Evidence evidence) {
      -  59  320
                   return evidence.getConfidence() == Confidence.HIGH;
      +
           };
      +  59   +
           /**
       60   -
               }
      +
            * Used to iterate over high confidence evidence contained in the collection.
       61   -
           };
      -  62   -
           /**
      +
            */
      +  62  41
           private static final Filter<Evidence> HIGH_CONFIDENCE = new Filter<Evidence>() {
       63   -
            * Used to iterate over medium confidence evidence contained in the collection.
      +
               @Override
       64   -
            */
      -  65  8
           private static final Filter<Evidence> MEDIUM_CONFIDENCE = new Filter<Evidence>() {
      +
               public boolean passes(Evidence evidence) {
      +  65  40
                   return evidence.getConfidence() == Confidence.HIGH;
       66   -
               public boolean passes(Evidence evidence) {
      -  67  296
                   return evidence.getConfidence() == Confidence.MEDIUM;
      +
               }
      +  67   +
           };
       68   -
               }
      +
           /**
       69   -
           };
      +
            * Used to iterate over medium confidence evidence contained in the collection.
       70   -
           /**
      -  71   -
            * Used to iterate over low confidence evidence contained in the collection.
      +
            */
      +  71  1
           private static final Filter<Evidence> MEDIUM_CONFIDENCE = new Filter<Evidence>() {
       72   -
            */
      -  73  8
           private static final Filter<Evidence> LOW_CONFIDENCE = new Filter<Evidence>() {
      -  74   +
               @Override
      +  73  
               public boolean passes(Evidence evidence) {
      -  75  296
                   return evidence.getConfidence() == Confidence.LOW;
      -  76   +  74  37
                   return evidence.getConfidence() == Confidence.MEDIUM;
      +  75  
               }
      -  77   +  76  
           };
      -  78   +  77  
           /**
      +  78   +
            * Used to iterate over low confidence evidence contained in the collection.
       79   -
            * Used to iterate over evidence that has was used (aka read) from the collection.
      -  80  
            */
      -  81  8
           private static final Filter<Evidence> EVIDENCE_USED = new Filter<Evidence>() {
      +  80  1
           private static final Filter<Evidence> LOW_CONFIDENCE = new Filter<Evidence>() {
      +  81   +
               @Override
       82  
               public boolean passes(Evidence evidence) {
      -  83  8640
                   return evidence.isUsed();
      +  83  37
                   return evidence.getConfidence() == Confidence.LOW;
       84  
               }
       85  
           };
       86   -
       
      +
           /**
       87   -
           /**
      +
            * Used to iterate over evidence that has was used (aka read) from the collection.
       88   -
            * Used to iterate over evidence of the specified confidence.
      -  89   -
            *
      +
            */
      +  89  1
           private static final Filter<Evidence> EVIDENCE_USED = new Filter<Evidence>() {
       90   -
            * @param confidence the confidence level for the evidence to be iterated over.
      +
               @Override
       91   -
            * @return Iterable<Evidence> an iterable collection of evidence
      -  92   -
            */
      +
               public boolean passes(Evidence evidence) {
      +  92  1080
                   return evidence.isUsed();
       93   -
           public final Iterable<Evidence> iterator(Confidence confidence) {
      -  94  184
               if (confidence == Confidence.HIGHEST) {
      -  95  56
                   return EvidenceCollection.HIGHEST_CONFIDENCE.filter(this.list);
      -  96  128
               } else if (confidence == Confidence.HIGH) {
      -  97  48
                   return EvidenceCollection.HIGH_CONFIDENCE.filter(this.list);
      -  98  80
               } else if (confidence == Confidence.MEDIUM) {
      -  99  40
                   return EvidenceCollection.MEDIUM_CONFIDENCE.filter(this.list);
      -  100   -
               } else {
      -  101  40
                   return EvidenceCollection.LOW_CONFIDENCE.filter(this.list);
      -  102  
               }
      -  103   -
           }
      -  104   -
           /**
      -  105   -
            * A collection of evidence.
      -  106   -
            */
      -  107   -
           private final Set<Evidence> list;
      -  108   -
           /**
      -  109   -
            * A collection of strings used to adjust Lucene's term weighting.
      -  110   -
            */
      -  111   -
           private final Set<String> weightedStrings;
      -  112   +  94   +
           };
      +  95  
       
      +  96   +
           /**
      +  97   +
            * Used to iterate over evidence of the specified confidence.
      +  98   +
            *
      +  99   +
            * @param confidence the confidence level for the evidence to be iterated over.
      +  100   +
            * @return Iterable<Evidence> an iterable collection of evidence
      +  101   +
            */
      +  102   +
           public final Iterable<Evidence> iterator(Confidence confidence) {
      +  103  23
               if (confidence == Confidence.HIGHEST) {
      +  104  7
                   return EvidenceCollection.HIGHEST_CONFIDENCE.filter(this.list);
      +  105  16
               } else if (confidence == Confidence.HIGH) {
      +  106  6
                   return EvidenceCollection.HIGH_CONFIDENCE.filter(this.list);
      +  107  10
               } else if (confidence == Confidence.MEDIUM) {
      +  108  5
                   return EvidenceCollection.MEDIUM_CONFIDENCE.filter(this.list);
      +  109   +
               } else {
      +  110  5
                   return EvidenceCollection.LOW_CONFIDENCE.filter(this.list);
      +  111   +
               }
      +  112   +
           }
       113  
           /**
       114   -
            * Creates a new EvidenceCollection.
      +
            * A collection of evidence.
       115  
            */
      -  116  1392
           public EvidenceCollection() {
      -  117  1392
               list = new TreeSet<Evidence>();
      -  118  1392
               weightedStrings = new HashSet<String>();
      -  119  1392
           }
      -  120   -
       
      -  121   +  116   +
           private final Set<Evidence> list;
      +  117  
           /**
      -  122   -
            * Adds evidence to the collection.
      -  123   -
            *
      -  124   -
            * @param e Evidence.
      -  125   +  118   +
            * A collection of strings used to adjust Lucene's term weighting.
      +  119  
            */
      -  126   -
           public void addEvidence(Evidence e) {
      -  127  116856
               list.add(e);
      -  128  116856
           }
      +  120   +
           private final Set<String> weightedStrings;
      +  121   +
       
      +  122   +
           /**
      +  123   +
            * Creates a new EvidenceCollection.
      +  124   +
            */
      +  125  273
           public EvidenceCollection() {
      +  126  273
               list = new TreeSet<Evidence>();
      +  127  273
               weightedStrings = new HashSet<String>();
      +  128  273
           }
       129  
       
       130  
           /**
       131   -
            * Creates an Evidence object from the parameters and adds the resulting object to the collection.
      +
            * Adds evidence to the collection.
       132  
            *
       133   -
            * @param source the source of the Evidence.
      +
            * @param e Evidence.
       134   -
            * @param name the name of the Evidence.
      +
            */
       135   -
            * @param value the value of the Evidence.
      -  136   -
            * @param confidence the confidence of the Evidence.
      -  137   -
            */
      +
           public void addEvidence(Evidence e) {
      +  136  14709
               list.add(e);
      +  137  14709
           }
       138   -
           public void addEvidence(String source, String name, String value, Confidence confidence) {
      -  139  116800
               final Evidence e = new Evidence(source, name, value, confidence);
      -  140  116800
               addEvidence(e);
      -  141  116800
           }
      +
       
      +  139   +
           /**
      +  140   +
            * Creates an Evidence object from the parameters and adds the resulting object to the collection.
      +  141   +
            *
       142   -
       
      +
            * @param source the source of the Evidence.
       143   -
           /**
      +
            * @param name the name of the Evidence.
       144   -
            * Adds term to the weighting collection. The terms added here are used later to boost the score of other terms. This is a way
      +
            * @param value the value of the Evidence.
       145   -
            * of combining evidence from multiple sources to boost the confidence of the given evidence.
      +
            * @param confidence the confidence of the Evidence.
       146   -
            *
      +
            */
       147   -
            * Example: The term 'Apache' is found in the manifest of a JAR and is added to the Collection. When we parse the package
      -  148   -
            * names within the JAR file we may add these package names to the "weighted" strings collection to boost the score in the
      -  149   -
            * Lucene query. That way when we construct the Lucene query we find the term Apache in the collection AND in the weighted
      -  150   -
            * strings; as such, we will boost the confidence of the term Apache.
      +
           public void addEvidence(String source, String name, String value, Confidence confidence) {
      +  148  14702
               final Evidence e = new Evidence(source, name, value, confidence);
      +  149  14702
               addEvidence(e);
      +  150  14702
           }
       151   -
            *
      +
       
       152   -
            * @param str to add to the weighting collection.
      +
           /**
       153   -
            */
      +
            * Adds term to the weighting collection. The terms added here are used later to boost the score of other terms. This is a way
       154   -
           public void addWeighting(String str) {
      -  155  120
               weightedStrings.add(str);
      -  156  120
           }
      -  157   -
       
      -  158   -
           /**
      -  159   -
            * Returns a set of Weightings - a list of terms that are believed to be of higher confidence when also found in another
      -  160   -
            * location.
      -  161   +
            * of combining evidence from multiple sources to boost the confidence of the given evidence.
      +  155  
            *
      +  156   +
            * Example: The term 'Apache' is found in the manifest of a JAR and is added to the Collection. When we parse the package
      +  157   +
            * names within the JAR file we may add these package names to the "weighted" strings collection to boost the score in the
      +  158   +
            * Lucene query. That way when we construct the Lucene query we find the term Apache in the collection AND in the weighted
      +  159   +
            * strings; as such, we will boost the confidence of the term Apache.
      +  160   +
            *
      +  161   +
            * @param str to add to the weighting collection.
       162   -
            * @return Set<String>
      -  163  
            */
      -  164   -
           public Set<String> getWeighting() {
      -  165  104
               return weightedStrings;
      +  163   +
           public void addWeighting(String str) {
      +  164  15
               weightedStrings.add(str);
      +  165  15
           }
       166   -
           }
      -  167  
       
      -  168   +  167  
           /**
      +  168   +
            * Returns a set of Weightings - a list of terms that are believed to be of higher confidence when also found in another
       169   -
            * Returns the set of evidence.
      +
            * location.
       170  
            *
       171   -
            * @return the set of evidence.
      +
            * @return Set<String>
       172  
            */
       173   -
           public Set<Evidence> getEvidence() {
      -  174  72
               return list;
      +
           public Set<String> getWeighting() {
      +  174  13
               return weightedStrings;
       175  
           }
       176   @@ -346,78 +347,78 @@  177  
           /**
       178   -
            * Returns the set of evidence from a given source.
      +
            * Returns the set of evidence.
       179  
            *
       180   -
            * @param source the source of the evidence
      +
            * @return the set of evidence.
       181   -
            * @return the set of evidence.
      +
            */
       182   -
            */
      -  183   -
           public Set<Evidence> getEvidence(String source) {
      -  184  0
               if (source == null) {
      -  185  0
                   return null;
      +
           public Set<Evidence> getEvidence() {
      +  183  9
               return list;
      +  184   +
           }
      +  185   +
       
       186   -
               }
      -  187  0
               final Set<Evidence> ret = new HashSet<Evidence>();
      -  188  0
               for (Evidence e : list) {
      -  189  0
                   if (source.equals(e.getSource())) {
      -  190  0
                       ret.add(e);
      -  191   -
                   }
      -  192  0
               }
      -  193  0
               return ret;
      -  194   -
           }
      -  195   -
       
      -  196  
           /**
      -  197   -
            * Returns the set of evidence from a given source and name.
      -  198   +  187   +
            * Returns the set of evidence from a given source.
      +  188  
            *
      -  199   +  189  
            * @param source the source of the evidence
      -  200   -
            * @param name the name of the evidence to return
      -  201   +  190  
            * @return the set of evidence.
      -  202   +  191  
            */
      -  203   -
           public Set<Evidence> getEvidence(String source, String name) {
      -  204  64
               if (source == null || name == null) {
      -  205  0
                   return null;
      -  206   +  192   +
           public Set<Evidence> getEvidence(String source) {
      +  193  0
               if (source == null) {
      +  194  0
                   return null;
      +  195  
               }
      -  207  64
               final Set<Evidence> ret = new HashSet<Evidence>();
      -  208  64
               for (Evidence e : list) {
      -  209  88
                   if (source.equals(e.getSource()) && name.equals(e.getName())) {
      -  210  40
                       ret.add(e);
      -  211   +  196  0
               final Set<Evidence> ret = new HashSet<Evidence>();
      +  197  0
               for (Evidence e : list) {
      +  198  0
                   if (source.equals(e.getSource())) {
      +  199  0
                       ret.add(e);
      +  200  
                   }
      -  212  88
               }
      -  213  64
               return ret;
      -  214   +  201  0
               }
      +  202  0
               return ret;
      +  203  
           }
      -  215   +  204  
       
      -  216   +  205  
           /**
      -  217   -
            * Implements the iterator interface for the Evidence Collection.
      -  218   +  206   +
            * Returns the set of evidence from a given source and name.
      +  207  
            *
      -  219   -
            * @return an Iterator<Evidence>.
      -  220   +  208   +
            * @param source the source of the evidence
      +  209   +
            * @param name the name of the evidence to return
      +  210   +
            * @return the set of evidence.
      +  211  
            */
      -  221   -
           public Iterator<Evidence> iterator() {
      -  222  1048
               return list.iterator();
      +  212   +
           public Set<Evidence> getEvidence(String source, String name) {
      +  213  8
               if (source == null || name == null) {
      +  214  0
                   return null;
      +  215   +
               }
      +  216  8
               final Set<Evidence> ret = new HashSet<Evidence>();
      +  217  8
               for (Evidence e : list) {
      +  218  11
                   if (source.equals(e.getSource()) && name.equals(e.getName())) {
      +  219  5
                       ret.add(e);
      +  220   +
                   }
      +  221  11
               }
      +  222  8
               return ret;
       223  
           }
       224   @@ -425,289 +426,308 @@  225  
           /**
       226   -
            * Used to determine if a given string was used (aka read).
      +
            * Implements the iterator interface for the Evidence Collection.
       227  
            *
       228   -
            * @param text the string to search for.
      +
            * @return an Iterator<Evidence>.
       229   -
            * @return whether or not the string was used.
      -  230  
            */
      +  230   +
           @Override
       231   -
           public boolean containsUsedString(String text) {
      -  232  952
               if (text == null) {
      -  233  0
                   return false;
      -  234   -
               }
      -  235  952
               final String textToTest = text.toLowerCase();
      -  236   -
       
      -  237  952
               for (Evidence e : EvidenceCollection.EVIDENCE_USED.filter(this)) {
      -  238   -
                   //TODO consider changing the regex to only compare alpha-numeric (i.e. strip everything else)
      -  239  5160
                   final String value = urlCorrection(e.getValue().toLowerCase()).replaceAll("[\\s_-]", "");
      -  240  5160
                   if (value.contains(textToTest)) {
      -  241  392
                       return true;
      -  242   -
                   }
      -  243  4768
               }
      -  244  560
               return false;
      -  245   +
           public Iterator<Evidence> iterator() {
      +  232  131
               return list.iterator();
      +  233  
           }
      +  234   +
       
      +  235   +
           /**
      +  236   +
            * Used to determine if a given string was used (aka read).
      +  237   +
            *
      +  238   +
            * @param text the string to search for.
      +  239   +
            * @return whether or not the string was used.
      +  240   +
            */
      +  241   +
           public boolean containsUsedString(String text) {
      +  242  119
               if (text == null) {
      +  243  0
                   return false;
      +  244   +
               }
      +  245  119
               final String textToTest = text.toLowerCase();
       246  
       
      -  247   -
           /**
      +  247  119
               for (Evidence e : EvidenceCollection.EVIDENCE_USED.filter(this)) {
       248   -
            * Used to determine if a given version was used (aka read) from the EvidenceCollection.
      -  249   -
            *
      -  250   -
            * @param version the version to search for within the collected evidence.
      -  251   -
            * @return whether or not the string was used.
      +
                   //TODO consider changing the regex to only compare alpha-numeric (i.e. strip everything else)
      +  249  645
                   final String value = urlCorrection(e.getValue().toLowerCase()).replaceAll("[\\s_-]", "");
      +  250  645
                   if (value.contains(textToTest)) {
      +  251  49
                       return true;
       252   -
            */
      -  253   -
           public boolean containsUsedVersion(DependencyVersion version) {
      -  254  0
               if (version == null) {
      -  255  0
                   return false;
      +
                   }
      +  253  596
               }
      +  254  70
               return false;
      +  255   +
           }
       256   -
               }
      +
       
       257   -
       
      -  258  0
               for (Evidence e : EvidenceCollection.EVIDENCE_USED.filter(this)) {
      -  259  0
                   final DependencyVersion value = DependencyVersionUtil.parseVersion(e.getValue());
      -  260  0
                   if (value != null && value.matchesAtLeastThreeLevels(version)) {
      -  261  0
                       return true;
      +
           /**
      +  258   +
            * Used to determine if a given version was used (aka read) from the EvidenceCollection.
      +  259   +
            *
      +  260   +
            * @param version the version to search for within the collected evidence.
      +  261   +
            * @return whether or not the string was used.
       262   -
                   }
      -  263  0
               }
      -  264  0
               return false;
      -  265   -
           }
      +
            */
      +  263   +
           public boolean containsUsedVersion(DependencyVersion version) {
      +  264  0
               if (version == null) {
      +  265  0
                   return false;
       266   -
       
      +
               }
       267   -
           /**
      -  268   -
            * Returns whether or not the collection contains evidence of a specified Confidence.
      -  269   -
            *
      -  270   -
            * @param confidence A Confidence value.
      -  271   -
            * @return boolean.
      +
       
      +  268  0
               for (Evidence e : EvidenceCollection.EVIDENCE_USED.filter(this)) {
      +  269  0
                   final DependencyVersion value = DependencyVersionUtil.parseVersion(e.getValue());
      +  270  0
                   if (value != null && value.matchesAtLeastThreeLevels(version)) {
      +  271  0
                       return true;
       272   -
            */
      -  273   -
           public boolean contains(Confidence confidence) {
      -  274  112
               for (Evidence e : list) {
      -  275  488
                   if (e.getConfidence().equals(confidence)) {
      -  276  88
                       return true;
      -  277  
                   }
      -  278  400
               }
      -  279  24
               return false;
      +  273  0
               }
      +  274  0
               return false;
      +  275   +
           }
      +  276   +
       
      +  277   +
           /**
      +  278   +
            * Returns whether or not the collection contains evidence of a specified Confidence.
      +  279   +
            *
       280   -
           }
      +
            * @param confidence A Confidence value.
       281   -
       
      +
            * @return boolean.
       282   -
           /**
      +
            */
       283   -
            * Merges multiple EvidenceCollections together, only merging evidence that was used, into a new EvidenceCollection.
      -  284   -
            *
      -  285   -
            * @param ec One or more EvidenceCollections.
      -  286   -
            * @return a new EvidenceCollection containing the used evidence.
      +
           public boolean contains(Confidence confidence) {
      +  284  14
               for (Evidence e : list) {
      +  285  61
                   if (e.getConfidence().equals(confidence)) {
      +  286  11
                       return true;
       287   -
            */
      -  288   -
           public static EvidenceCollection mergeUsed(EvidenceCollection... ec) {
      -  289  8
               final EvidenceCollection ret = new EvidenceCollection();
      -  290  32
               for (EvidenceCollection col : ec) {
      -  291  24
                   for (Evidence e : col.list) {
      -  292  16
                       if (e.isUsed()) {
      -  293  8
                           ret.addEvidence(e);
      +
                   }
      +  288  50
               }
      +  289  3
               return false;
      +  290   +
           }
      +  291   +
       
      +  292   +
           /**
      +  293   +
            * Merges multiple EvidenceCollections together, only merging evidence that was used, into a new EvidenceCollection.
       294   -
                       }
      -  295  16
                   }
      -  296   -
               }
      -  297  8
               return ret;
      -  298   -
           }
      -  299   -
       
      -  300   -
           /**
      -  301   -
            * Merges multiple EvidenceCollections together.
      -  302  
            *
      -  303   +  295  
            * @param ec One or more EvidenceCollections.
      +  296   +
            * @return a new EvidenceCollection containing the used evidence.
      +  297   +
            */
      +  298   +
           public static EvidenceCollection mergeUsed(EvidenceCollection... ec) {
      +  299  1
               final EvidenceCollection ret = new EvidenceCollection();
      +  300  4
               for (EvidenceCollection col : ec) {
      +  301  3
                   for (Evidence e : col.list) {
      +  302  2
                       if (e.isUsed()) {
      +  303  1
                           ret.addEvidence(e);
       304   -
            * @return a new EvidenceCollection.
      -  305   -
            */
      +
                       }
      +  305  2
                   }
       306   -
           public static EvidenceCollection merge(EvidenceCollection... ec) {
      -  307  88
               final EvidenceCollection ret = new EvidenceCollection();
      -  308  352
               for (EvidenceCollection col : ec) {
      -  309  264
                   ret.list.addAll(col.list);
      -  310  264
                   ret.weightedStrings.addAll(col.weightedStrings);
      +
               }
      +  307  1
               return ret;
      +  308   +
           }
      +  309   +
       
      +  310   +
           /**
       311   -
               }
      -  312  88
               return ret;
      +
            * Merges multiple EvidenceCollections together.
      +  312   +
            *
       313   -
           }
      +
            * @param ec One or more EvidenceCollections.
       314   -
       
      +
            * @return a new EvidenceCollection.
       315   -
           /**
      +
            */
       316   -
            * Merges multiple EvidenceCollections together; flattening all of the evidence items by removing the confidence.
      -  317   -
            *
      -  318   -
            * @param ec One or more EvidenceCollections
      -  319   -
            * @return new set of evidence resulting from merging the evidence in the collections
      -  320   -
            */
      +
           public static EvidenceCollection merge(EvidenceCollection... ec) {
      +  317  11
               final EvidenceCollection ret = new EvidenceCollection();
      +  318  44
               for (EvidenceCollection col : ec) {
      +  319  33
                   ret.list.addAll(col.list);
      +  320  33
                   ret.weightedStrings.addAll(col.weightedStrings);
       321   -
           public static Set<Evidence> mergeForDisplay(EvidenceCollection... ec) {
      -  322  0
               final Set<Evidence> ret = new TreeSet<Evidence>();
      -  323  0
               for (EvidenceCollection col : ec) {
      -  324  0
                   for (Evidence e : col) {
      -  325   -
                       //if (e.isUsed()) {
      -  326  0
                       final Evidence newEvidence = new Evidence(e.getSource(), e.getName(), e.getValue(), null);
      -  327  0
                       newEvidence.setUsed(true);
      -  328  0
                       ret.add(newEvidence);
      -  329   -
                       //}
      -  330  0
                   }
      -  331  
               }
      -  332  0
               return ret;
      -  333   +  322  11
               return ret;
      +  323  
           }
      -  334   +  324  
       
      +  325   +
           /**
      +  326   +
            * Merges multiple EvidenceCollections together; flattening all of the evidence items by removing the confidence.
      +  327   +
            *
      +  328   +
            * @param ec One or more EvidenceCollections
      +  329   +
            * @return new set of evidence resulting from merging the evidence in the collections
      +  330   +
            */
      +  331   +
           public static Set<Evidence> mergeForDisplay(EvidenceCollection... ec) {
      +  332  0
               final Set<Evidence> ret = new TreeSet<Evidence>();
      +  333  0
               for (EvidenceCollection col : ec) {
      +  334  0
                   for (Evidence e : col) {
       335   -
           /**
      -  336   -
            * Returns a string of evidence 'values'.
      -  337   -
            *
      -  338   -
            * @return a string containing the evidence.
      +
                       //if (e.isUsed()) {
      +  336  0
                       final Evidence newEvidence = new Evidence(e.getSource(), e.getName(), e.getValue(), null);
      +  337  0
                       newEvidence.setUsed(true);
      +  338  0
                       ret.add(newEvidence);
       339   -
            */
      -  340   -
           @Override
      +
                       //}
      +  340  0
                   }
       341   -
           public String toString() {
      -  342  264
               final StringBuilder sb = new StringBuilder();
      -  343  264
               for (Evidence e : this.list) {
      -  344  512
                   sb.append(e.getValue()).append(' ');
      -  345  512
               }
      -  346  264
               return sb.toString();
      +
               }
      +  342  0
               return ret;
      +  343   +
           }
      +  344   +
       
      +  345   +
           /**
      +  346   +
            * Returns a string of evidence 'values'.
       347   -
           }
      +
            *
       348   -
       
      +
            * @return a string containing the evidence.
       349   -
           /**
      -  350   -
            * Returns the number of elements in the EvidenceCollection.
      -  351   -
            *
      -  352   -
            * @return the number of elements in the collection.
      -  353  
            */
      -  354   -
           public int size() {
      -  355  96
               return list.size();
      -  356   -
           }
      +  350   +
           @Override
      +  351   +
           public String toString() {
      +  352  39
               final StringBuilder sb = new StringBuilder();
      +  353  39
               for (Evidence e : this.list) {
      +  354  76
                   sb.append(e.getValue()).append(' ');
      +  355  76
               }
      +  356  39
               return sb.toString();
       357   -
       
      +
           }
       358   -
           /**
      +
       
       359   -
            * <p>
      +
           /**
       360   -
            * Takes a string that may contain a fully qualified domain and it will return the string having removed the query string, the
      +
            * Returns the number of elements in the EvidenceCollection.
       361   -
            * protocol, the sub-domain of 'www', and the file extension of the path.</p>
      -  362   -
            * <p>
      -  363   -
            * This is useful for checking if the evidence contains a specific string. The presence of the protocol, file extension, etc.
      -  364   -
            * may produce false positives.
      -  365  
            *
      +  362   +
            * @return the number of elements in the collection.
      +  363   +
            */
      +  364   +
           public int size() {
      +  365  12
               return list.size();
       366   -
            * <p>
      +
           }
       367   -
            * Example, given the following input:</p>
      +
       
       368   -
            * <code>'Please visit https://www.somedomain.com/path1/path2/file.php?id=439'</code>
      +
           /**
       369  
            * <p>
       370   -
            * The function would return:</p>
      +
            * Takes a string that may contain a fully qualified domain and it will return the string having removed the query string, the
       371   -
            * <code>'Please visit somedomain path1 path2 file'</code>
      +
            * protocol, the sub-domain of 'www', and the file extension of the path.</p>
       372   -
            *
      +
            * <p>
       373   -
            * @param value the value that may contain a url
      +
            * This is useful for checking if the evidence contains a specific string. The presence of the protocol, file extension, etc.
       374   -
            * @return the modified string
      +
            * may produce false positives.
       375   -
            */
      +
            *
       376   -
           private String urlCorrection(String value) {
      -  377  5160
               if (value == null || !UrlStringUtils.containsUrl(value)) {
      -  378  5008
                   return value;
      +
            * <p>
      +  377   +
            * Example, given the following input:</p>
      +  378   +
            * <code>'Please visit https://www.somedomain.com/path1/path2/file.php?id=439'</code>
       379   -
               }
      -  380  152
               final StringBuilder sb = new StringBuilder(value.length());
      -  381  152
               final String[] parts = value.split("\\s");
      -  382  304
               for (String part : parts) {
      -  383  152
                   if (UrlStringUtils.isUrl(part)) {
      +
            * <p>
      +  380   +
            * The function would return:</p>
      +  381   +
            * <code>'Please visit somedomain path1 path2 file'</code>
      +  382   +
            *
      +  383   +
            * @param value the value that may contain a url
       384   -
                       try {
      -  385  152
                           final List<String> data = UrlStringUtils.extractImportantUrlData(part);
      -  386  152
                           sb.append(' ').append(StringUtils.join(data, ' '));
      -  387  0
                       } catch (MalformedURLException ex) {
      -  388  0
                           LOGGER.debug("error parsing {}", part, ex);
      -  389  0
                           sb.append(' ').append(part);
      -  390  152
                       }
      -  391   -
                   } else {
      -  392  0
                       sb.append(' ').append(part);
      -  393   -
                   }
      -  394   +
            * @return the modified string
      +  385   +
            */
      +  386   +
           private String urlCorrection(String value) {
      +  387  645
               if (value == null || !UrlStringUtils.containsUrl(value)) {
      +  388  626
                   return value;
      +  389  
               }
      -  395  152
               return sb.toString().trim();
      -  396   +  390  19
               final StringBuilder sb = new StringBuilder(value.length());
      +  391  19
               final String[] parts = value.split("\\s");
      +  392  38
               for (String part : parts) {
      +  393  19
                   if (UrlStringUtils.isUrl(part)) {
      +  394   +
                       try {
      +  395  19
                           final List<String> data = UrlStringUtils.extractImportantUrlData(part);
      +  396  19
                           sb.append(' ').append(StringUtils.join(data, ' '));
      +  397  0
                       } catch (MalformedURLException ex) {
      +  398  0
                           LOGGER.debug("error parsing {}", part, ex);
      +  399  0
                           sb.append(' ').append(part);
      +  400  19
                       }
      +  401   +
                   } else {
      +  402  0
                       sb.append(' ').append(part);
      +  403   +
                   }
      +  404   +
               }
      +  405  19
               return sb.toString().trim();
      +  406  
           }
      -  397   +  407  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Identifier.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Identifier.html index 6db5d2650..76a44d509 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Identifier.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Identifier.html @@ -67,364 +67,376 @@
        * @author Jeremy Long
       25  
        */
      -  26  240
       public class Identifier implements Serializable, Comparable<Identifier> {
      +  26  30
       public class Identifier implements Serializable, Comparable<Identifier> {
       27  
       
       28  
           /**
       29   -
            * Default constructor. Should only be used for automatic class
      +
            * The serial version UID for serialization.
       30   -
            * creation as is the case with many XML parsers (for the parsing
      +
            */
       31   -
            * of the Dependency-Check XML report). For all other use-cases,
      +
           private static final long serialVersionUID = 1L;
       32   -
            * please use the non-default constructors.
      +
       
       33   -
            */
      -  34  0
           public Identifier() {
      -  35  0
           }
      +
           /**
      +  34   +
            * Default constructor. Should only be used for automatic class
      +  35   +
            * creation as is the case with many XML parsers (for the parsing
       36   -
       
      +
            * of the Dependency-Check XML report). For all other use-cases,
       37   -
           /**
      +
            * please use the non-default constructors.
       38   -
            * Constructs a new Identifier with the specified data.
      -  39   -
            *
      -  40   -
            * @param type the identifier type.
      +
            */
      +  39  0
           public Identifier() {
      +  40  0
           }
       41   -
            * @param value the identifier value.
      +
       
       42   -
            * @param url the identifier url.
      +
           /**
       43   -
            */
      -  44  216
           public Identifier(String type, String value, String url) {
      -  45  216
               this.type = type;
      -  46  216
               this.value = value;
      -  47  216
               this.url = url;
      -  48  216
           }
      -  49   -
       
      -  50   -
           /**
      -  51  
            * Constructs a new Identifier with the specified data.
      -  52   +  44  
            *
      -  53   +  45  
            * @param type the identifier type.
      -  54   +  46  
            * @param value the identifier value.
      -  55   +  47  
            * @param url the identifier url.
      -  56   -
            * @param description the description of the identifier.
      -  57   +  48  
            */
      -  58   -
           public Identifier(String type, String value, String url, String description) {
      -  59  0
               this(type, value, url);
      -  60  0
               this.description = description;
      -  61  0
           }
      -  62   +  49  27
           public Identifier(String type, String value, String url) {
      +  50  27
               this.type = type;
      +  51  27
               this.value = value;
      +  52  27
               this.url = url;
      +  53  27
           }
      +  54  
       
      -  63   +  55  
           /**
      -  64   -
            * The confidence that this is the correct identifier.
      -  65   +  56   +
            * Constructs a new Identifier with the specified data.
      +  57   +
            *
      +  58   +
            * @param type the identifier type.
      +  59   +
            * @param value the identifier value.
      +  60   +
            * @param url the identifier url.
      +  61   +
            * @param description the description of the identifier.
      +  62  
            */
      -  66   -
           private Confidence confidence;
      +  63   +
           public Identifier(String type, String value, String url, String description) {
      +  64  0
               this(type, value, url);
      +  65  0
               this.description = description;
      +  66  0
           }
       67  
       
       68  
           /**
       69   -
            * Get the value of confidence.
      +
            * The confidence that this is the correct identifier.
       70   -
            *
      +
            */
       71   -
            * @return the value of confidence
      +
           private Confidence confidence;
       72   -
            */
      +
       
       73   -
           public Confidence getConfidence() {
      -  74  0
               return confidence;
      +
           /**
      +  74   +
            * Get the value of confidence.
       75   -
           }
      -  76   -
       
      -  77   -
           /**
      -  78   -
            * Set the value of confidence.
      -  79  
            *
      +  76   +
            * @return the value of confidence
      +  77   +
            */
      +  78   +
           public Confidence getConfidence() {
      +  79  0
               return confidence;
       80   -
            * @param confidence new value of confidence
      +
           }
       81   -
            */
      -  82   -
           public void setConfidence(Confidence confidence) {
      -  83  40
               this.confidence = confidence;
      -  84  40
           }
      -  85  
       
      -  86   +  82  
           /**
      -  87   -
            * The value of the identifier
      -  88   +  83   +
            * Set the value of confidence.
      +  84   +
            *
      +  85   +
            * @param confidence new value of confidence
      +  86  
            */
      -  89   -
           private String value;
      +  87   +
           public void setConfidence(Confidence confidence) {
      +  88  5
               this.confidence = confidence;
      +  89  5
           }
       90  
       
       91  
           /**
       92   -
            * Get the value of value.
      +
            * The value of the identifier
       93   -
            *
      +
            */
       94   -
            * @return the value of value
      +
           private String value;
       95   -
            */
      +
       
       96   -
           public String getValue() {
      -  97  1248
               return value;
      +
           /**
      +  97   +
            * Get the value of value.
       98   -
           }
      -  99   -
       
      -  100   -
           /**
      -  101   -
            * Set the value of value.
      -  102  
            *
      +  99   +
            * @return the value of value
      +  100   +
            */
      +  101   +
           public String getValue() {
      +  102  156
               return value;
       103   -
            * @param value new value of value
      +
           }
       104   -
            */
      -  105   -
           public void setValue(String value) {
      -  106  0
               this.value = value;
      -  107  0
           }
      -  108   -
           /**
      -  109   -
            * The url for the identifier.
      -  110   -
            */
      -  111   -
           private String url;
      -  112  
       
      +  105   +
           /**
      +  106   +
            * Set the value of value.
      +  107   +
            *
      +  108   +
            * @param value new value of value
      +  109   +
            */
      +  110   +
           public void setValue(String value) {
      +  111  0
               this.value = value;
      +  112  0
           }
       113  
           /**
       114   -
            * Get the value of url.
      +
            * The url for the identifier.
       115   -
            *
      +
            */
       116   -
            * @return the value of url
      +
           private String url;
       117   -
            */
      +
       
       118   -
           public String getUrl() {
      -  119  0
               return url;
      +
           /**
      +  119   +
            * Get the value of url.
       120   -
           }
      -  121   -
       
      -  122   -
           /**
      -  123   -
            * Set the value of url.
      -  124  
            *
      +  121   +
            * @return the value of url
      +  122   +
            */
      +  123   +
           public String getUrl() {
      +  124  0
               return url;
       125   -
            * @param url new value of url
      +
           }
       126   -
            */
      -  127   -
           public void setUrl(String url) {
      -  128  0
               this.url = url;
      -  129  0
           }
      -  130   -
           /**
      -  131   -
            * The type of the identifier.
      -  132   -
            */
      -  133   -
           private String type;
      -  134  
       
      +  127   +
           /**
      +  128   +
            * Set the value of url.
      +  129   +
            *
      +  130   +
            * @param url new value of url
      +  131   +
            */
      +  132   +
           public void setUrl(String url) {
      +  133  0
               this.url = url;
      +  134  0
           }
       135  
           /**
       136   -
            * Get the value of type.
      +
            * The type of the identifier.
       137   -
            *
      +
            */
       138   -
            * @return the value of type
      +
           private String type;
       139   -
            */
      +
       
       140   -
           public String getType() {
      -  141  1248
               return type;
      +
           /**
      +  141   +
            * Get the value of type.
       142   -
           }
      -  143   -
       
      -  144   -
           /**
      -  145   -
            * <p>
      -  146   -
            * Set the value of type.</p><p>
      -  147   -
            * Example would be "CPE".</p>
      -  148  
            *
      -  149   -
            * @param type new value of type
      -  150   +  143   +
            * @return the value of type
      +  144  
            */
      -  151   -
           public void setType(String type) {
      -  152  0
               this.type = type;
      -  153  0
           }
      -  154   -
           /**
      -  155   -
            * A description of the identifier.
      -  156   -
            */
      -  157   -
           private String description;
      -  158   +  145   +
           public String getType() {
      +  146  162
               return type;
      +  147   +
           }
      +  148  
       
      +  149   +
           /**
      +  150   +
            * <p>
      +  151   +
            * Set the value of type.</p><p>
      +  152   +
            * Example would be "CPE".</p>
      +  153   +
            *
      +  154   +
            * @param type new value of type
      +  155   +
            */
      +  156   +
           public void setType(String type) {
      +  157  0
               this.type = type;
      +  158  0
           }
       159  
           /**
       160   -
            * Get the value of description.
      +
            * A description of the identifier.
       161   -
            *
      +
            */
       162   -
            * @return the value of description
      +
           private String description;
       163   -
            */
      +
       
       164   -
           public String getDescription() {
      -  165  0
               return description;
      +
           /**
      +  165   +
            * Get the value of description.
       166   -
           }
      +
            *
       167   -
       
      +
            * @return the value of description
       168   -
           /**
      +
            */
       169   -
            * Set the value of description.
      -  170   -
            *
      +
           public String getDescription() {
      +  170  0
               return description;
       171   -
            * @param description new value of description
      +
           }
       172   -
            */
      +
       
       173   -
           public void setDescription(String description) {
      -  174  0
               this.description = description;
      -  175  0
           }
      +
           /**
      +  174   +
            * Set the value of description.
      +  175   +
            *
       176   -
       
      +
            * @param description new value of description
       177   -
           @Override
      +
            */
       178   -
           public boolean equals(Object obj) {
      -  179  0
               if (obj == null) {
      -  180  0
                   return false;
      +
           public void setDescription(String description) {
      +  179  0
               this.description = description;
      +  180  0
           }
       181   +
       
      +  182   +
           @Override
      +  183   +
           public boolean equals(Object obj) {
      +  184  0
               if (obj == null) {
      +  185  0
                   return false;
      +  186  
               }
      -  182  0
               if (getClass() != obj.getClass()) {
      -  183  0
                   return false;
      -  184   +  187  0
               if (getClass() != obj.getClass()) {
      +  188  0
                   return false;
      +  189  
               }
      -  185  0
               final Identifier other = (Identifier) obj;
      -  186  0
               if ((this.value == null) ? (other.value != null) : !this.value.equals(other.value)) {
      -  187  0
                   return false;
      -  188   -
               }
      -  189  0
               if ((this.type == null) ? (other.type != null) : !this.type.equals(other.type)) {
      -  190  0
                   return false;
      -  191   -
               }
      -  192  0
               return true;
      +  190  0
               final Identifier other = (Identifier) obj;
      +  191  0
               if ((this.value == null) ? (other.value != null) : !this.value.equals(other.value)) {
      +  192  0
                   return false;
       193   -
           }
      -  194   -
       
      -  195   -
           @Override
      -  196   -
           public int hashCode() {
      -  197  120
               int hash = 5;
      -  198  120
               hash = 53 * hash + (this.value != null ? this.value.hashCode() : 0);
      -  199  120
               hash = 53 * hash + (this.type != null ? this.type.hashCode() : 0);
      -  200  120
               return hash;
      -  201   -
           }
      -  202   -
       
      -  203   -
           /**
      -  204   -
            * Standard implementation of toString; displays identifier value and type.
      -  205   -
            *
      -  206   -
            * @return a String representation of the object
      -  207   -
            */
      -  208   -
           @Override
      -  209   -
           public String toString() {
      -  210  0
               return "Identifier{" + "value=" + value + ", type=" + type + '}';
      -  211   -
           }
      -  212   -
       
      -  213   -
           /**
      -  214   -
            * Implementation of the comparator interface. This compares the value of the identifier only.
      -  215   -
            *
      -  216   -
            * @param o the object being compared
      -  217   -
            * @return an integer indicating the ordering
      -  218   -
            */
      -  219   -
           public int compareTo(Identifier o) {
      -  220  256
               if (o == null) {
      -  221  0
                   return -1;
      -  222  
               }
      -  223  256
               return this.value.compareTo(o.value);
      -  224   +  194  0
               if ((this.type == null) ? (other.type != null) : !this.type.equals(other.type)) {
      +  195  0
                   return false;
      +  196   +
               }
      +  197  0
               return true;
      +  198  
           }
      +  199   +
       
      +  200   +
           @Override
      +  201   +
           public int hashCode() {
      +  202  15
               int hash = 5;
      +  203  15
               hash = 53 * hash + (this.value != null ? this.value.hashCode() : 0);
      +  204  15
               hash = 53 * hash + (this.type != null ? this.type.hashCode() : 0);
      +  205  15
               return hash;
      +  206   +
           }
      +  207   +
       
      +  208   +
           /**
      +  209   +
            * Standard implementation of toString; displays identifier value and type.
      +  210   +
            *
      +  211   +
            * @return a String representation of the object
      +  212   +
            */
      +  213   +
           @Override
      +  214   +
           public String toString() {
      +  215  0
               return "Identifier{" + "value=" + value + ", type=" + type + '}';
      +  216   +
           }
      +  217   +
       
      +  218   +
           /**
      +  219   +
            * Implementation of the comparator interface. This compares the value of the identifier only.
      +  220   +
            *
      +  221   +
            * @param o the object being compared
      +  222   +
            * @return an integer indicating the ordering
      +  223   +
            */
      +  224   +
           @Override
       225   +
           public int compareTo(Identifier o) {
      +  226  32
               if (o == null) {
      +  227  0
                   return -1;
      +  228   +
               }
      +  229  32
               return this.value.compareTo(o.value);
      +  230   +
           }
      +  231  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Reference.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Reference.html index a6b8d6687..47fa5d43c 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Reference.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Reference.html @@ -69,7 +69,7 @@
        * @author Jeremy Long
       26  
        */
      -  27  4096
       public class Reference implements Serializable, Comparable<Reference> {
      +  27  512
       public class Reference implements Serializable, Comparable<Reference> {
       28  
       
       29   @@ -119,8 +119,8 @@
            */
       52  
           public void setName(String name) {
      -  53  1264
               this.name = name;
      -  54  1264
           }
      +  53  158
               this.name = name;
      +  54  158
           }
       55  
           /**
       56   @@ -160,8 +160,8 @@
            */
       74  
           public void setUrl(String url) {
      -  75  1264
               this.url = url;
      -  76  1264
           }
      +  75  158
               this.url = url;
      +  76  158
           }
       77  
           /**
       78   @@ -201,8 +201,8 @@
            */
       96  
           public void setSource(String source) {
      -  97  1264
               this.source = source;
      -  98  1264
           }
      +  97  158
               this.source = source;
      +  98  158
           }
       99  
       
       100   @@ -261,32 +261,34 @@  135  
            */
       136   +
           @Override
      +  137  
           public int compareTo(Reference o) {
      -  137  2832
               if (source.equals(o.source)) {
      -  138  832
                   if (name.equals(o.name)) {
      -  139  272
                       if (url.equals(o.url)) {
      -  140  272
                           return 0; //they are equal
      -  141   +  138  354
               if (source.equals(o.source)) {
      +  139  104
                   if (name.equals(o.name)) {
      +  140  34
                       if (url.equals(o.url)) {
      +  141  34
                           return 0; //they are equal
      +  142  
                       } else {
      -  142  0
                           return url.compareTo(o.url);
      -  143   -
                       }
      +  143  0
                           return url.compareTo(o.url);
       144   +
                       }
      +  145  
                   } else {
      -  145  560
                       return name.compareTo(o.name);
      -  146   -
                   }
      +  146  70
                       return name.compareTo(o.name);
       147   +
                   }
      +  148  
               } else {
      -  148  2000
                   return source.compareTo(o.source);
      -  149   -
               }
      +  149  250
                   return source.compareTo(o.source);
       150   -
           }
      +
               }
       151   +
           }
      +  152  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Vulnerability.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Vulnerability.html index 2a77c7745..0aa5ce485 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Vulnerability.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.Vulnerability.html @@ -75,7 +75,7 @@
        * @author Jeremy Long
       29  
        */
      -  30  288
       public class Vulnerability implements Serializable, Comparable<Vulnerability> {
      +  30  36
       public class Vulnerability implements Serializable, Comparable<Vulnerability> {
       31  
       
       32   @@ -108,7 +108,7 @@
            */
       46  
           public String getName() {
      -  47  424
               return name;
      +  47  53
               return name;
       48  
           }
       49   @@ -125,8 +125,8 @@
            */
       55  
           public void setName(String name) {
      -  56  288
               this.name = name;
      -  57  288
           }
      +  56  36
               this.name = name;
      +  57  36
           }
       58  
           /**
       59   @@ -166,15 +166,15 @@
            */
       77  
           public void setDescription(String description) {
      -  78  280
               this.description = description;
      -  79  280
           }
      +  78  35
               this.description = description;
      +  79  35
           }
       80  
           /**
       81  
            * References for this vulnerability.
       82  
            */
      -  83  288
           private SortedSet<Reference> references = new TreeSet<Reference>();
      +  83  36
           private SortedSet<Reference> references = new TreeSet<Reference>();
       84  
       
       85   @@ -222,8 +222,8 @@
            */
       108  
           public void addReference(Reference ref) {
      -  109  720
               this.references.add(ref);
      -  110  720
           }
      +  109  90
               this.references.add(ref);
      +  110  90
           }
       111  
       
       112   @@ -242,19 +242,19 @@
            */
       119  
           public void addReference(String referenceSource, String referenceName, String referenceUrl) {
      -  120  544
               final Reference ref = new Reference();
      -  121  544
               ref.setSource(referenceSource);
      -  122  544
               ref.setName(referenceName);
      -  123  544
               ref.setUrl(referenceUrl);
      -  124  544
               this.references.add(ref);
      -  125  544
           }
      +  120  68
               final Reference ref = new Reference();
      +  121  68
               ref.setSource(referenceSource);
      +  122  68
               ref.setName(referenceName);
      +  123  68
               ref.setUrl(referenceUrl);
      +  124  68
               this.references.add(ref);
      +  125  68
           }
       126  
           /**
       127  
            * A set of vulnerable software.
       128  
            */
      -  129  288
           private SortedSet<VulnerableSoftware> vulnerableSoftware = new TreeSet<VulnerableSoftware>();
      +  129  36
           private SortedSet<VulnerableSoftware> vulnerableSoftware = new TreeSet<VulnerableSoftware>();
       130  
       
       131   @@ -304,7 +304,7 @@
            */
       155  
           public boolean addVulnerableSoftware(String cpe) {
      -  156  6736
               return addVulnerableSoftware(cpe, null);
      +  156  842
               return addVulnerableSoftware(cpe, null);
       157  
           }
       158   @@ -325,13 +325,13 @@
            */
       166  
           public boolean addVulnerableSoftware(String cpe, String previousVersion) {
      -  167  6800
               final VulnerableSoftware vs = new VulnerableSoftware();
      -  168  6800
               vs.setCpe(cpe);
      -  169  6800
               if (previousVersion != null) {
      -  170  64
                   vs.setPreviousVersion(previousVersion);
      +  167  850
               final VulnerableSoftware vs = new VulnerableSoftware();
      +  168  850
               vs.setCpe(cpe);
      +  169  850
               if (previousVersion != null) {
      +  170  8
                   vs.setPreviousVersion(previousVersion);
       171  
               }
      -  172  6800
               return updateVulnerableSoftware(vs);
      +  172  850
               return updateVulnerableSoftware(vs);
       173  
           }
       174   @@ -350,11 +350,11 @@
            */
       181  
           public boolean updateVulnerableSoftware(VulnerableSoftware vulnSoftware) {
      -  182  6800
               if (vulnerableSoftware.contains(vulnSoftware)) {
      +  182  850
               if (vulnerableSoftware.contains(vulnSoftware)) {
       183  0
                   vulnerableSoftware.remove(vulnSoftware);
       184  
               }
      -  185  6800
               return vulnerableSoftware.add(vulnSoftware);
      +  185  850
               return vulnerableSoftware.add(vulnSoftware);
       186  
           }
       187   @@ -379,7 +379,7 @@
            */
       197  
           public String getCwe() {
      -  198  16
               return cwe;
      +  198  2
               return cwe;
       199  
           }
       200   @@ -396,8 +396,8 @@
            */
       206  
           public void setCwe(String cwe) {
      -  207  224
               this.cwe = cwe;
      -  208  224
           }
      +  207  28
               this.cwe = cwe;
      +  208  28
           }
       209  
           /**
       210   @@ -420,7 +420,7 @@
            */
       219  
           public float getCvssScore() {
      -  220  24
               return cvssScore;
      +  220  3
               return cvssScore;
       221  
           }
       222   @@ -437,8 +437,8 @@
            */
       228  
           public void setCvssScore(float cvssScore) {
      -  229  280
               this.cvssScore = cvssScore;
      -  230  280
           }
      +  229  35
               this.cvssScore = cvssScore;
      +  230  35
           }
       231  
           /**
       232   @@ -478,8 +478,8 @@
            */
       250  
           public void setCvssAccessVector(String cvssAccessVector) {
      -  251  272
               this.cvssAccessVector = cvssAccessVector;
      -  252  272
           }
      +  251  34
               this.cvssAccessVector = cvssAccessVector;
      +  252  34
           }
       253  
           /**
       254   @@ -519,8 +519,8 @@
            */
       272  
           public void setCvssAccessComplexity(String cvssAccessComplexity) {
      -  273  272
               this.cvssAccessComplexity = cvssAccessComplexity;
      -  274  272
           }
      +  273  34
               this.cvssAccessComplexity = cvssAccessComplexity;
      +  274  34
           }
       275  
           /**
       276   @@ -560,8 +560,8 @@
            */
       294  
           public void setCvssAuthentication(String cvssAuthentication) {
      -  295  272
               this.cvssAuthentication = cvssAuthentication;
      -  296  272
           }
      +  295  34
               this.cvssAuthentication = cvssAuthentication;
      +  296  34
           }
       297  
           /**
       298   @@ -601,8 +601,8 @@
            */
       316  
           public void setCvssConfidentialityImpact(String cvssConfidentialityImpact) {
      -  317  272
               this.cvssConfidentialityImpact = cvssConfidentialityImpact;
      -  318  272
           }
      +  317  34
               this.cvssConfidentialityImpact = cvssConfidentialityImpact;
      +  318  34
           }
       319  
           /**
       320   @@ -642,8 +642,8 @@
            */
       338  
           public void setCvssIntegrityImpact(String cvssIntegrityImpact) {
      -  339  272
               this.cvssIntegrityImpact = cvssIntegrityImpact;
      -  340  272
           }
      +  339  34
               this.cvssIntegrityImpact = cvssIntegrityImpact;
      +  340  34
           }
       341  
           /**
       342   @@ -683,8 +683,8 @@
            */
       360  
           public void setCvssAvailabilityImpact(String cvssAvailabilityImpact) {
      -  361  272
               this.cvssAvailabilityImpact = cvssAvailabilityImpact;
      -  362  272
           }
      +  361  34
               this.cvssAvailabilityImpact = cvssAvailabilityImpact;
      +  362  34
           }
       363  
       
       364   @@ -713,9 +713,9 @@
           @Override
       380  
           public int hashCode() {
      -  381  64
               int hash = 5;
      -  382  64
               hash = 41 * hash + (this.name != null ? this.name.hashCode() : 0);
      -  383  64
               return hash;
      +  381  8
               int hash = 5;
      +  382  8
               hash = 41 * hash + (this.name != null ? this.name.hashCode() : 0);
      +  383  8
               return hash;
       384  
           }
       385   @@ -735,104 +735,106 @@  392  
            */
       393   +
           @Override
      +  394  
           public int compareTo(Vulnerability v) {
      -  394  0
               return v.getName().compareTo(this.getName());
      -  395   -
           }
      +  395  0
               return v.getName().compareTo(this.getName());
       396   -
       
      +
           }
       397   -
           /**
      +
       
       398   -
            * The CPE id that caused this vulnerability to be flagged.
      +
           /**
       399   -
            */
      +
            * The CPE id that caused this vulnerability to be flagged.
       400   -
           private String matchedCPE;
      +
            */
       401   -
           /**
      +
           private String matchedCPE;
       402   -
            * Whether or not all previous versions were affected.
      +
           /**
       403   -
            */
      +
            * Whether or not all previous versions were affected.
       404   -
           private String matchedAllPreviousCPE;
      +
            */
       405   -
       
      +
           private String matchedAllPreviousCPE;
       406   -
           /**
      +
       
       407   -
            * Sets the CPE that caused this vulnerability to be flagged.
      +
           /**
       408   -
            *
      +
            * Sets the CPE that caused this vulnerability to be flagged.
       409   -
            * @param cpeId a CPE identifier
      +
            *
       410   -
            * @param previous a flag indicating whether or not all previous versions were affected (any non-null value is
      +
            * @param cpeId a CPE identifier
       411   -
            * considered true)
      +
            * @param previous a flag indicating whether or not all previous versions were affected (any non-null value is
       412   -
            */
      +
            * considered true)
       413   +
            */
      +  414  
           public void setMatchedCPE(String cpeId, String previous) {
      -  414  64
               matchedCPE = cpeId;
      -  415  64
               matchedAllPreviousCPE = previous;
      -  416  64
           }
      -  417   -
       
      +  415  8
               matchedCPE = cpeId;
      +  416  8
               matchedAllPreviousCPE = previous;
      +  417  8
           }
       418   -
           /**
      +
       
       419   -
            * Get the value of matchedCPE.
      +
           /**
       420   -
            *
      +
            * Get the value of matchedCPE.
       421   -
            * @return the value of matchedCPE
      +
            *
       422   -
            */
      +
            * @return the value of matchedCPE
       423   +
            */
      +  424  
           public String getMatchedCPE() {
      -  424  0
               return matchedCPE;
      -  425   -
           }
      +  425  0
               return matchedCPE;
       426   -
       
      +
           }
       427   -
           /**
      -  428   -
            * Get the value of matchedAllPreviousCPE.
      -  429   -
            *
      -  430   -
            * @return the value of matchedAllPreviousCPE
      -  431   -
            */
      -  432   -
           public String getMatchedAllPreviousCPE() {
      -  433  0
               return matchedAllPreviousCPE;
      -  434   -
           }
      -  435  
       
      -  436   +  428  
           /**
      -  437   -
            * Determines whether or not matchedAllPreviousCPE has been set.
      -  438   +  429   +
            * Get the value of matchedAllPreviousCPE.
      +  430  
            *
      -  439   -
            * @return true if matchedAllPreviousCPE is not null; otherwise false
      -  440   +  431   +
            * @return the value of matchedAllPreviousCPE
      +  432  
            */
      -  441   -
           public boolean hasMatchedAllPreviousCPE() {
      -  442  0
               return matchedAllPreviousCPE != null;
      -  443   +  433   +
           public String getMatchedAllPreviousCPE() {
      +  434  0
               return matchedAllPreviousCPE;
      +  435  
           }
      +  436   +
       
      +  437   +
           /**
      +  438   +
            * Determines whether or not matchedAllPreviousCPE has been set.
      +  439   +
            *
      +  440   +
            * @return true if matchedAllPreviousCPE is not null; otherwise false
      +  441   +
            */
      +  442   +
           public boolean hasMatchedAllPreviousCPE() {
      +  443  0
               return matchedAllPreviousCPE != null;
       444   +
           }
      +  445  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.VulnerabilityComparator.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.VulnerabilityComparator.html index 991e0410b..c5e26a469 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.VulnerabilityComparator.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.VulnerabilityComparator.html @@ -71,7 +71,7 @@
        * @author Jeremy Long
       27  
        */
      -  28  1064
       public class VulnerabilityComparator implements Comparator<Vulnerability>, Serializable {
      +  28  199
       public class VulnerabilityComparator implements Comparator<Vulnerability>, Serializable {
       29  
       
       30   @@ -99,14 +99,16 @@  41  
            */
       42   +
           @Override
      +  43  
           public int compare(Vulnerability o1, Vulnerability o2) {
      -  43  200
               return o2.getName().compareTo(o1.getName());
      -  44   -
           }
      +  44  25
               return o2.getName().compareTo(o1.getName());
       45   +
           }
      +  46  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.VulnerableSoftware.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.VulnerableSoftware.html index c11af51ee..7c364e99a 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.VulnerableSoftware.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.dependency.VulnerableSoftware.html @@ -79,7 +79,7 @@
        * @author Jeremy Long
       31  
        */
      -  32  91872
       public class VulnerableSoftware extends IndexEntry implements Serializable, Comparable<VulnerableSoftware> {
      +  32  11484
       public class VulnerableSoftware extends IndexEntry implements Serializable, Comparable<VulnerableSoftware> {
       33  
       
       34   @@ -88,7 +88,7 @@
            * The logger.
       36  
            */
      -  37  8
           private static final Logger LOGGER = LoggerFactory.getLogger(VulnerableSoftware.class);
      +  37  1
           private static final Logger LOGGER = LoggerFactory.getLogger(VulnerableSoftware.class);
       38  
           /**
       39   @@ -113,13 +113,13 @@
           public void setCpe(String cpe) {
       49  
               try {
      -  50  7736
                   parseName(cpe);
      +  50  967
                   parseName(cpe);
       51  0
               } catch (UnsupportedEncodingException ex) {
       52  0
                   LOGGER.warn("Character encoding is unsupported for CPE '{}'.", cpe);
       53  0
                   LOGGER.debug("", ex);
       54  0
                   setName(cpe);
      -  55  7736
               }
      -  56  7736
           }
      +  55  967
               }
      +  56  967
           }
       57  
       
       58   @@ -154,32 +154,32 @@
           @Override
       73  
           public void parseName(String cpeName) throws UnsupportedEncodingException {
      -  74  11840
               this.name = cpeName;
      -  75  11840
               if (cpeName != null && cpeName.length() > 7) {
      -  76  11840
                   final String[] data = cpeName.substring(7).split(":");
      -  77  11840
                   if (data.length >= 1) {
      -  78  11840
                       this.setVendor(urlDecode(data[0]));
      +  74  1480
               this.name = cpeName;
      +  75  1480
               if (cpeName != null && cpeName.length() > 7) {
      +  76  1480
                   final String[] data = cpeName.substring(7).split(":");
      +  77  1480
                   if (data.length >= 1) {
      +  78  1480
                       this.setVendor(urlDecode(data[0]));
       79  
                   }
      -  80  11840
                   if (data.length >= 2) {
      -  81  11840
                       this.setProduct(urlDecode(data[1]));
      +  80  1480
                   if (data.length >= 2) {
      +  81  1480
                       this.setProduct(urlDecode(data[1]));
       82  
                   }
      -  83  11840
                   if (data.length >= 3) {
      -  84  11840
                       version = urlDecode(data[2]);
      +  83  1480
                   if (data.length >= 3) {
      +  84  1480
                       version = urlDecode(data[2]);
       85  
                   }
      -  86  11840
                   if (data.length >= 4) {
      -  87  1992
                       update = urlDecode(data[3]);
      +  86  1480
                   if (data.length >= 4) {
      +  87  249
                       update = urlDecode(data[3]);
       88  
                   }
      -  89  11840
                   if (data.length >= 5) {
      +  89  1480
                   if (data.length >= 5) {
       90  0
                       edition = urlDecode(data[4]);
       91  
                   }
       92  
               }
      -  93  11840
           }
      +  93  1480
           }
       94  
           /**
       95   @@ -236,8 +236,8 @@
            */
       122  
           public void setPreviousVersion(String previousVersion) {
      -  123  72
               this.previousVersion = previousVersion;
      -  124  72
           }
      +  123  9
               this.previousVersion = previousVersion;
      +  124  9
           }
       125  
       
       126   @@ -256,17 +256,17 @@
           @Override
       133  
           public boolean equals(Object obj) {
      -  134  8
               if (obj == null) {
      +  134  1
               if (obj == null) {
       135  0
                   return false;
       136  
               }
      -  137  8
               if (getClass() != obj.getClass()) {
      +  137  1
               if (getClass() != obj.getClass()) {
       138  0
                   return false;
       139  
               }
      -  140  8
               final VulnerableSoftware other = (VulnerableSoftware) obj;
      -  141  8
               if ((this.getName() == null) ? (other.getName() != null) : !this.getName().equals(other.getName())) {
      -  142  8
                   return false;
      +  140  1
               final VulnerableSoftware other = (VulnerableSoftware) obj;
      +  141  1
               if ((this.getName() == null) ? (other.getName() != null) : !this.getName().equals(other.getName())) {
      +  142  1
                   return false;
       143  
               }
       144  0
               return true;
      @@ -288,9 +288,9 @@
           @Override
       153  
           public int hashCode() {
      -  154  920
               int hash = 7;
      -  155  920
               hash = 83 * hash + (this.getName() != null ? this.getName().hashCode() : 0);
      -  156  920
               return hash;
      +  154  115
               int hash = 7;
      +  155  115
               hash = 83 * hash + (this.getName() != null ? this.getName().hashCode() : 0);
      +  156  115
               return hash;
       157  
           }
       158   @@ -330,21 +330,21 @@
           @Override
       176  
           public int compareTo(VulnerableSoftware vs) {
      -  177  80048
               int result = 0;
      -  178  80048
               final String[] left = this.getName().split(":");
      -  179  80048
               final String[] right = vs.getName().split(":");
      -  180  80048
               final int max = (left.length <= right.length) ? left.length : right.length;
      -  181  80048
               if (max > 0) {
      -  182  482008
                   for (int i = 0; result == 0 && i < max; i++) {
      -  183  401960
                       final String[] subLeft = left[i].split("\\.");
      -  184  401960
                       final String[] subRight = right[i].split("\\.");
      -  185  401960
                       final int subMax = (subLeft.length <= subRight.length) ? subLeft.length : subRight.length;
      -  186  401960
                       if (subMax > 0) {
      -  187  917184
                           for (int x = 0; result == 0 && x < subMax; x++) {
      -  188  515224
                               if (isPositiveInteger(subLeft[x]) && isPositiveInteger(subRight[x])) {
      +  177  10006
               int result = 0;
      +  178  10006
               final String[] left = this.getName().split(":");
      +  179  10006
               final String[] right = vs.getName().split(":");
      +  180  10006
               final int max = (left.length <= right.length) ? left.length : right.length;
      +  181  10006
               if (max > 0) {
      +  182  60251
                   for (int i = 0; result == 0 && i < max; i++) {
      +  183  50245
                       final String[] subLeft = left[i].split("\\.");
      +  184  50245
                       final String[] subRight = right[i].split("\\.");
      +  185  50245
                       final int subMax = (subLeft.length <= subRight.length) ? subLeft.length : subRight.length;
      +  186  50245
                       if (subMax > 0) {
      +  187  114648
                           for (int x = 0; result == 0 && x < subMax; x++) {
      +  188  64403
                               if (isPositiveInteger(subLeft[x]) && isPositiveInteger(subRight[x])) {
       189  
                                   try {
      -  190  187616
                                       result = Long.valueOf(subLeft[x]).compareTo(Long.valueOf(subRight[x]));
      +  190  23452
                                       result = Long.valueOf(subLeft[x]).compareTo(Long.valueOf(subRight[x]));
       191  
       //                                final long iLeft = Long.parseLong(subLeft[x]);
       192   @@ -370,21 +370,21 @@  203  0
                                           result = subLeft[x].compareToIgnoreCase(subRight[x]);
       204  
                                       }
      -  205  187616
                                   }
      +  205  23452
                                   }
       206  
                               } else {
      -  207  327608
                                   result = subLeft[x].compareToIgnoreCase(subRight[x]);
      +  207  40951
                                   result = subLeft[x].compareToIgnoreCase(subRight[x]);
       208  
                               }
       209  
                           }
      -  210  401960
                           if (result == 0) {
      -  211  323712
                               if (subLeft.length > subRight.length) {
      -  212  912
                                   result = 2;
      +  210  50245
                           if (result == 0) {
      +  211  40464
                               if (subLeft.length > subRight.length) {
      +  212  114
                                   result = 2;
       213  
                               }
      -  214  323712
                               if (subRight.length > subLeft.length) {
      -  215  56
                                   result = -2;
      +  214  40464
                               if (subRight.length > subLeft.length) {
      +  215  7
                                   result = -2;
       216  
                               }
       217   @@ -396,13 +396,13 @@
                       }
       221  
                   }
      -  222  80048
                   if (result == 0) {
      -  223  832
                       if (left.length > right.length) {
      -  224  544
                           result = 2;
      +  222  10006
                   if (result == 0) {
      +  223  104
                       if (left.length > right.length) {
      +  224  68
                           result = 2;
       225  
                       }
      -  226  832
                       if (right.length > left.length) {
      -  227  80
                           result = -2;
      +  226  104
                       if (right.length > left.length) {
      +  227  10
                           result = -2;
       228  
                       }
       229   @@ -412,7 +412,7 @@  231  0
                   result = this.getName().compareToIgnoreCase(vs.getName());
       232  
               }
      -  233  80048
               return result;
      +  233  10006
               return result;
       234  
           }
       235   @@ -431,19 +431,19 @@
            */
       242  
           private static boolean isPositiveInteger(final String str) {
      -  243  703416
               if (str == null || str.isEmpty()) {
      -  244  112
                   return false;
      +  243  87927
               if (str == null || str.isEmpty()) {
      +  244  14
                   return false;
       245  
               }
      -  246  1143184
               for (int i = 0; i < str.length(); i++) {
      -  247  767376
                   final char c = str.charAt(i);
      -  248  767376
                   if (c < '0' || c > '9') {
      -  249  327496
                       return false;
      +  246  142898
               for (int i = 0; i < str.length(); i++) {
      +  247  95922
                   final char c = str.charAt(i);
      +  248  95922
                   if (c < '0' || c > '9') {
      +  249  40937
                       return false;
       250  
                   }
       251  
               }
      -  252  375808
               return true;
      +  252  46976
               return true;
       253  
           }
       254   @@ -468,7 +468,7 @@
            */
       264  
           public String getName() {
      -  265  162088
               return name;
      +  265  20261
               return name;
       266  
           }
       267   @@ -509,7 +509,7 @@
            */
       286  
           public String getVersion() {
      -  287  15656
               return version;
      +  287  1957
               return version;
       288  
           }
       289   @@ -550,7 +550,7 @@
            */
       308  
           public String getUpdate() {
      -  309  11672
               return update;
      +  309  1459
               return update;
       310  
           }
       311   @@ -626,12 +626,12 @@
            */
       349  
           private String urlDecode(String string) {
      -  350  37512
               final String text = string.replace("+", "%2B");
      +  350  4689
               final String text = string.replace("+", "%2B");
       351  
               String result;
       352  
               try {
      -  353  37512
                   result = URLDecoder.decode(text, "UTF-8");
      +  353  4689
                   result = URLDecoder.decode(text, "UTF-8");
       354  0
               } catch (UnsupportedEncodingException ex) {
       355  
                   try {
      @@ -639,8 +639,8 @@  357  0
                   } catch (UnsupportedEncodingException ex1) {
       358  0
                       result = defaultUrlDecode(text);
       359  0
                   }
      -  360  37512
               }
      -  361  37512
               return result;
      +  360  4689
               }
      +  361  4689
               return result;
       362  
           }
       363   @@ -668,6 +668,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.exception.NoDataException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.exception.NoDataException.html index 2abee8d33..b3c197b7e 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.exception.NoDataException.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.exception.NoDataException.html @@ -147,6 +147,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.exception.ScanAgentException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.exception.ScanAgentException.html index edb9b9f0f..6f4c8d22e 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.exception.ScanAgentException.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.exception.ScanAgentException.html @@ -147,6 +147,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.reporting.EscapeTool.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.reporting.EscapeTool.html index 8e9965bcf..e3e02bbc7 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.reporting.EscapeTool.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.reporting.EscapeTool.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      EscapeTool
      0%
      0/9
      N/A
      1.667
      EscapeTool
      0%
      0/15
      0%
      0/12
      4.667
       
      @@ -60,7 +60,7 @@  21  
       import java.net.URLEncoder;
       22   -
       import org.apache.commons.lang.StringEscapeUtils;
      +
       import org.apache.commons.lang3.StringEscapeUtils;
       23  
       import org.slf4j.Logger;
       24   @@ -70,9 +70,9 @@  26  
       /**
       27   -
        * An extremely simple wrapper around various escape utils to perform URL and HTML encoding within the reports. This
      +
        * An extremely simple wrapper around various escape utils to perform URL and HTML encoding within the reports. This class was
       28   -
        * class was created to simplify the velocity configuration and avoid using the "built-in" escape tool.
      +
        * created to simplify the velocity configuration and avoid using the "built-in" escape tool.
       29  
        *
       30   @@ -105,59 +105,71 @@
            */
       45  
           public String url(String text) {
      -  46   -
               try {
      -  47  0
                   return URLEncoder.encode(text, "UTF-8");
      -  48  0
               } catch (UnsupportedEncodingException ex) {
      -  49  0
                   LOGGER.warn("UTF-8 is not supported?");
      -  50  0
                   LOGGER.info("", ex);
      -  51   +  46  0
               if (text == null || text.isEmpty()) {
      +  47  0
                   return text;
      +  48  
               }
      -  52  0
               return "";
      -  53   -
           }
      +  49   +
               try {
      +  50  0
                   return URLEncoder.encode(text, "UTF-8");
      +  51  0
               } catch (UnsupportedEncodingException ex) {
      +  52  0
                   LOGGER.warn("UTF-8 is not supported?");
      +  53  0
                   LOGGER.info("", ex);
       54   -
       
      -  55   -
           /**
      +
               }
      +  55  0
               return "";
       56   -
            * HTML Encodes the provided text.
      +
           }
       57   -
            *
      -  58   -
            * @param text the text to encode
      -  59   -
            * @return the HTML encoded text
      -  60   -
            */
      -  61   -
           public String html(String text) {
      -  62  0
               return StringEscapeUtils.escapeHtml(text);
      -  63   -
           }
      -  64  
       
      -  65   +  58  
           /**
      -  66   -
            * XML Encodes the provided text.
      -  67   +  59   +
            * HTML Encodes the provided text.
      +  60  
            *
      -  68   +  61  
            * @param text the text to encode
      -  69   -
            * @return the XML encoded text
      -  70   +  62   +
            * @return the HTML encoded text
      +  63  
            */
      -  71   -
           public String xml(String text) {
      -  72  0
               return StringEscapeUtils.escapeXml(text);
      -  73   +  64   +
           public String html(String text) {
      +  65  0
               if (text == null || text.isEmpty()) {
      +  66  0
                   return text;
      +  67   +
               }
      +  68  0
               return StringEscapeUtils.escapeHtml4(text);
      +  69  
           }
      +  70   +
       
      +  71   +
           /**
      +  72   +
            * XML Encodes the provided text.
      +  73   +
            *
       74   +
            * @param text the text to encode
      +  75   +
            * @return the XML encoded text
      +  76   +
            */
      +  77   +
           public String xml(String text) {
      +  78  0
               if (text == null || text.isEmpty()) {
      +  79  0
                   return text;
      +  80   +
               }
      +  81  0
               return StringEscapeUtils.escapeXml11(text);
      +  82   +
           }
      +  83  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.reporting.ReportGenerator.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.reporting.ReportGenerator.html index c1850a8b8..e072c7584 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.reporting.ReportGenerator.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.reporting.ReportGenerator.html @@ -543,6 +543,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.reporting.VelocityLoggerRedirect.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.reporting.VelocityLoggerRedirect.html index 36debf37e..12d1f68ca 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.reporting.VelocityLoggerRedirect.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.reporting.VelocityLoggerRedirect.html @@ -112,125 +112,133 @@  48  
            */
       49   -
           public void init(RuntimeServices rsvc) {
      +
           @Override
       50   +
           public void init(RuntimeServices rsvc) {
      +  51  
               // do nothing
      -  51  0
           }
      -  52   -
       
      +  52  0
           }
       53   -
           /**
      -  54   -
            * Given a Velocity log level and message, this method will call the appropriate Logger level and log the specified
      -  55   -
            * values.
      -  56   -
            *
      -  57   -
            * @param level the logging level
      -  58   -
            * @param message the message to be logged
      -  59   -
            */
      -  60   -
           public void log(int level, String message) {
      -  61  0
               switch (level) {
      -  62   -
                   case TRACE_ID:
      -  63  0
                       LOGGER.trace(message);
      -  64  0
                       break;
      -  65   -
                   case DEBUG_ID:
      -  66  0
                       LOGGER.debug(message);
      -  67  0
                       break;
      -  68   -
                   case INFO_ID:
      -  69  0
                       LOGGER.info(message);
      -  70  0
                       break;
      -  71   -
                   case WARN_ID:
      -  72  0
                       LOGGER.warn(message);
      -  73  0
                       break;
      -  74   -
                   case ERROR_ID:
      -  75  0
                       LOGGER.error(message);
      -  76  0
                       break;
      -  77   -
                   default:
      -  78  0
                       LOGGER.info(message);
      -  79   -
               }
      -  80  0
           }
      -  81  
       
      -  82   +  54  
           /**
      -  83   -
            * Given a Velocity log level, message and Throwable, this method will call the appropriate Logger level and log the
      -  84   -
            * specified values.
      -  85   +  55   +
            * Given a Velocity log level and message, this method will call the appropriate Logger level and log the specified
      +  56   +
            * values.
      +  57  
            *
      -  86   +  58  
            * @param level the logging level
      -  87   +  59  
            * @param message the message to be logged
      -  88   -
            * @param t a throwable to log
      -  89   +  60  
            */
      -  90   -
           public void log(int level, String message, Throwable t) {
      -  91  0
               switch (level) {
      -  92   +  61   +
           @Override
      +  62   +
           public void log(int level, String message) {
      +  63  0
               switch (level) {
      +  64  
                   case TRACE_ID:
      -  93  0
                       LOGGER.trace(message, t);
      -  94  0
                       break;
      -  95   +  65  0
                       LOGGER.trace(message);
      +  66  0
                       break;
      +  67  
                   case DEBUG_ID:
      -  96  0
                       LOGGER.debug(message, t);
      +  68  0
                       LOGGER.debug(message);
      +  69  0
                       break;
      +  70   +
                   case INFO_ID:
      +  71  0
                       LOGGER.info(message);
      +  72  0
                       break;
      +  73   +
                   case WARN_ID:
      +  74  0
                       LOGGER.warn(message);
      +  75  0
                       break;
      +  76   +
                   case ERROR_ID:
      +  77  0
                       LOGGER.error(message);
      +  78  0
                       break;
      +  79   +
                   default:
      +  80  0
                       LOGGER.info(message);
      +  81   +
               }
      +  82  0
           }
      +  83   +
       
      +  84   +
           /**
      +  85   +
            * Given a Velocity log level, message and Throwable, this method will call the appropriate Logger level and log the
      +  86   +
            * specified values.
      +  87   +
            *
      +  88   +
            * @param level the logging level
      +  89   +
            * @param message the message to be logged
      +  90   +
            * @param t a throwable to log
      +  91   +
            */
      +  92   +
           @Override
      +  93   +
           public void log(int level, String message, Throwable t) {
      +  94  0
               switch (level) {
      +  95   +
                   case TRACE_ID:
      +  96  0
                       LOGGER.trace(message, t);
       97  0
                       break;
       98   -
                   case INFO_ID:
      -  99  0
                       LOGGER.info(message, t);
      +
                   case DEBUG_ID:
      +  99  0
                       LOGGER.debug(message, t);
       100  0
                       break;
       101   -
                   case WARN_ID:
      -  102  0
                       LOGGER.warn(message, t);
      +
                   case INFO_ID:
      +  102  0
                       LOGGER.info(message, t);
       103  0
                       break;
       104   -
                   case ERROR_ID:
      -  105  0
                       LOGGER.error(message, t);
      +
                   case WARN_ID:
      +  105  0
                       LOGGER.warn(message, t);
       106  0
                       break;
       107   +
                   case ERROR_ID:
      +  108  0
                       LOGGER.error(message, t);
      +  109  0
                       break;
      +  110  
                   default:
      -  108  0
                       LOGGER.info(message, t);
      -  109   -
               }
      -  110  0
           }
      -  111   -
       
      +  111  0
                       LOGGER.info(message, t);
       112   -
           /**
      -  113   -
            * Will always return true. The property file will decide what level to log.
      +
               }
      +  113  0
           }
       114   -
            *
      +
       
       115   -
            * @param level the logging level
      +
           /**
       116   -
            * @return true
      +
            * Will always return true. The property file will decide what level to log.
       117   -
            */
      +
            *
       118   -
           public boolean isLevelEnabled(int level) {
      -  119  0
               return true;
      +
            * @param level the logging level
      +  119   +
            * @return true
       120   -
           }
      +
            */
       121   +
           @Override
      +  122   +
           public boolean isLevelEnabled(int level) {
      +  123  0
               return true;
      +  124   +
           }
      +  125  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.PropertyType.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.PropertyType.html index 8e60818a3..f8e9b384b 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.PropertyType.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.PropertyType.html @@ -71,7 +71,7 @@
        * @author Jeremy Long
       27  
        */
      -  28  2568
       public class PropertyType {
      +  28  336
       public class PropertyType {
       29  
       
       30   @@ -100,7 +100,7 @@
            */
       42  
           public String getValue() {
      -  43  464
               return value;
      +  43  58
               return value;
       44  
           }
       45   @@ -117,15 +117,15 @@
            */
       51  
           public void setValue(String value) {
      -  52  2640
               this.value = value;
      -  53  2640
           }
      +  52  345
               this.value = value;
      +  53  345
           }
       54  
           /**
       55  
            * Whether or not the expression is a regex.
       56  
            */
      -  57  2568
           private boolean regex = false;
      +  57  336
           private boolean regex = false;
       58  
       
       59   @@ -142,7 +142,7 @@
            */
       65  
           public boolean isRegex() {
      -  66  296
               return regex;
      +  66  37
               return regex;
       67  
           }
       68   @@ -161,15 +161,15 @@
            */
       75  
           public void setRegex(boolean value) {
      -  76  2512
               this.regex = value;
      -  77  2512
           }
      +  76  329
               this.regex = value;
      +  77  329
           }
       78  
           /**
       79  
            * Indicates case sensitivity.
       80  
            */
      -  81  2568
           private boolean caseSensitive = false;
      +  81  336
           private boolean caseSensitive = false;
       82  
       
       83   @@ -186,7 +186,7 @@
            */
       89  
           public boolean isCaseSensitive() {
      -  90  216
               return caseSensitive;
      +  90  27
               return caseSensitive;
       91  
           }
       92   @@ -205,8 +205,8 @@
            */
       99  
           public void setCaseSensitive(boolean value) {
      -  100  2520
               this.caseSensitive = value;
      -  101  2520
           }
      +  100  330
               this.caseSensitive = value;
      +  101  330
           }
       102  
           //</editor-fold>
       103   @@ -225,28 +225,28 @@
            */
       110  
           public boolean matches(String text) {
      -  111  464
               if (text == null) {
      +  111  58
               if (text == null) {
       112  0
                   return false;
       113  
               }
      -  114  464
               if (this.regex) {
      +  114  58
               if (this.regex) {
       115  
                   Pattern rx;
      -  116  192
                   if (this.caseSensitive) {
      -  117  16
                       rx = Pattern.compile(this.value);
      +  116  24
                   if (this.caseSensitive) {
      +  117  2
                       rx = Pattern.compile(this.value);
       118  
                   } else {
      -  119  176
                       rx = Pattern.compile(this.value, Pattern.CASE_INSENSITIVE);
      +  119  22
                       rx = Pattern.compile(this.value, Pattern.CASE_INSENSITIVE);
       120  
                   }
      -  121  192
                   return rx.matcher(text).matches();
      +  121  24
                   return rx.matcher(text).matches();
       122  
               } else {
      -  123  272
                   if (this.caseSensitive) {
      -  124  16
                       return value.equals(text);
      +  123  34
                   if (this.caseSensitive) {
      +  124  2
                       return value.equals(text);
       125  
                   } else {
      -  126  256
                       return value.equalsIgnoreCase(text);
      +  126  32
                       return value.equalsIgnoreCase(text);
       127  
                   }
       128   @@ -296,28 +296,28 @@
           @Override
       153  
           public boolean equals(Object obj) {
      -  154  8
               if (obj == null) {
      +  154  1
               if (obj == null) {
       155  0
                   return false;
       156  
               }
      -  157  8
               if (getClass() != obj.getClass()) {
      +  157  1
               if (getClass() != obj.getClass()) {
       158  0
                   return false;
       159  
               }
      -  160  8
               final PropertyType other = (PropertyType) obj;
      -  161  8
               if ((this.value == null) ? (other.value != null) : !this.value.equals(other.value)) {
      +  160  1
               final PropertyType other = (PropertyType) obj;
      +  161  1
               if ((this.value == null) ? (other.value != null) : !this.value.equals(other.value)) {
       162  0
                   return false;
       163  
               }
      -  164  8
               if (this.regex != other.regex) {
      +  164  1
               if (this.regex != other.regex) {
       165  0
                   return false;
       166  
               }
      -  167  8
               if (this.caseSensitive != other.caseSensitive) {
      +  167  1
               if (this.caseSensitive != other.caseSensitive) {
       168  0
                   return false;
       169  
               }
      -  170  8
               return true;
      +  170  1
               return true;
       171  
           }
       172   @@ -345,6 +345,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionErrorHandler.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionErrorHandler.html index 45f497f30..9c5331267 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionErrorHandler.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionErrorHandler.html @@ -77,7 +77,7 @@
        * @author Jeremy Long
       30  
        */
      -  31  72
       public class SuppressionErrorHandler implements ErrorHandler {
      +  31  9
       public class SuppressionErrorHandler implements ErrorHandler {
       32  
       
       33   @@ -86,7 +86,7 @@
            * The logger.
       35  
            */
      -  36  8
           private static final Logger LOGGER = LoggerFactory.getLogger(SuppressionErrorHandler.class);
      +  36  1
           private static final Logger LOGGER = LoggerFactory.getLogger(SuppressionErrorHandler.class);
       37  
       
       38   @@ -196,6 +196,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionHandler.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionHandler.html index abadde457..c7b7417b6 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionHandler.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionHandler.html @@ -77,7 +77,7 @@
        * @author Jeremy Long
       30  
        */
      -  31  72
       public class SuppressionHandler extends DefaultHandler {
      +  31  9
       public class SuppressionHandler extends DefaultHandler {
       32  
       
       33   @@ -150,7 +150,7 @@
            * A list of suppression rules.
       67  
            */
      -  68  72
           private List<SuppressionRule> suppressionRules = new ArrayList<SuppressionRule>();
      +  68  9
           private List<SuppressionRule> suppressionRules = new ArrayList<SuppressionRule>();
       69  
       
       70   @@ -165,7 +165,7 @@
            */
       75  
           public List<SuppressionRule> getSuppressionRules() {
      -  76  72
               return suppressionRules;
      +  76  9
               return suppressionRules;
       77  
           }
       78   @@ -191,7 +191,7 @@  88  
            */
       89   -
           private StringBuffer currentText;
      +
           private StringBuilder currentText;
       90  
       
       91   @@ -216,13 +216,13 @@
           @Override
       101  
           public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
      -  102  4480
               currentAttributes = attributes;
      -  103  4480
               currentText = new StringBuffer();
      -  104  4480
               if (SUPPRESS.equals(qName)) {
      -  105  920
                   rule = new SuppressionRule();
      -  106  920
                   final String base = currentAttributes.getValue("base");
      -  107  920
                   if (base != null) {
      -  108  920
                       rule.setBase(Boolean.parseBoolean(base));
      +  102  585
               currentAttributes = attributes;
      +  103  585
               currentText = new StringBuilder();
      +  104  585
               if (SUPPRESS.equals(qName)) {
      +  105  120
                   rule = new SuppressionRule();
      +  106  120
                   final String base = currentAttributes.getValue("base");
      +  107  120
                   if (base != null) {
      +  108  120
                       rule.setBase(Boolean.parseBoolean(base));
       109  
                   } else {
       110  0
                       rule.setBase(false);
      @@ -230,7 +230,7 @@
                   }
       112  
               }
      -  113  4480
           }
      +  113  585
           }
       114  
       
       115   @@ -253,30 +253,30 @@
           @Override
       124  
           public void endElement(String uri, String localName, String qName) throws SAXException {
      -  125  4480
               if (SUPPRESS.equals(qName)) {
      -  126  920
                   suppressionRules.add(rule);
      -  127  920
                   rule = null;
      -  128  3560
               } else if (FILE_PATH.equals(qName)) {
      -  129  256
                   final PropertyType pt = processPropertyType();
      -  130  256
                   rule.setFilePath(pt);
      -  131  256
               } else if (SHA1.equals(qName)) {
      -  132  32
                   rule.setSha1(currentText.toString());
      -  133  3272
               } else if (GAV.equals(qName)) {
      -  134  600
                   final PropertyType pt = processPropertyType();
      -  135  600
                   rule.setGav(pt);
      -  136  600
               } else if (CPE.equals(qName)) {
      -  137  1584
                   final PropertyType pt = processPropertyType();
      -  138  1584
                   rule.addCpe(pt);
      -  139  1584
               } else if (CWE.equals(qName)) {
      +  125  585
               if (SUPPRESS.equals(qName)) {
      +  126  120
                   suppressionRules.add(rule);
      +  127  120
                   rule = null;
      +  128  465
               } else if (FILE_PATH.equals(qName)) {
      +  129  32
                   final PropertyType pt = processPropertyType();
      +  130  32
                   rule.setFilePath(pt);
      +  131  32
               } else if (SHA1.equals(qName)) {
      +  132  4
                   rule.setSha1(currentText.toString());
      +  133  429
               } else if (GAV.equals(qName)) {
      +  134  80
                   final PropertyType pt = processPropertyType();
      +  135  80
                   rule.setGav(pt);
      +  136  80
               } else if (CPE.equals(qName)) {
      +  137  208
                   final PropertyType pt = processPropertyType();
      +  138  208
                   rule.addCpe(pt);
      +  139  208
               } else if (CWE.equals(qName)) {
       140  0
                   rule.addCwe(currentText.toString());
      -  141  1088
               } else if (CVE.equals(qName)) {
      -  142  64
                   rule.addCve(currentText.toString());
      -  143  1024
               } else if (CVSS_BELOW.equals(qName)) {
      -  144  32
                   final float cvss = Float.parseFloat(currentText.toString());
      -  145  32
                   rule.addCvssBelow(cvss);
      +  141  141
               } else if (CVE.equals(qName)) {
      +  142  8
                   rule.addCve(currentText.toString());
      +  143  133
               } else if (CVSS_BELOW.equals(qName)) {
      +  144  4
                   final float cvss = Float.parseFloat(currentText.toString());
      +  145  4
                   rule.addCvssBelow(cvss);
       146  
               }
      -  147  4480
           }
      +  147  585
           }
       148  
       
       149   @@ -299,8 +299,8 @@
           @Override
       158  
           public void characters(char[] ch, int start, int length) throws SAXException {
      -  159  10128
               currentText.append(ch, start, length);
      -  160  10128
           }
      +  159  1306
               currentText.append(ch, start, length);
      +  160  1306
           }
       161  
       
       162   @@ -317,28 +317,28 @@
            */
       168  
           private PropertyType processPropertyType() {
      -  169  2440
               final PropertyType pt = new PropertyType();
      -  170  2440
               pt.setValue(currentText.toString());
      -  171  2440
               if (currentAttributes != null && currentAttributes.getLength() > 0) {
      -  172  2440
                   final String regex = currentAttributes.getValue("regex");
      -  173  2440
                   if (regex != null) {
      -  174  2440
                       pt.setRegex(Boolean.parseBoolean(regex));
      +  169  320
               final PropertyType pt = new PropertyType();
      +  170  320
               pt.setValue(currentText.toString());
      +  171  320
               if (currentAttributes != null && currentAttributes.getLength() > 0) {
      +  172  320
                   final String regex = currentAttributes.getValue("regex");
      +  173  320
                   if (regex != null) {
      +  174  320
                       pt.setRegex(Boolean.parseBoolean(regex));
       175  
                   }
      -  176  2440
                   final String caseSensitive = currentAttributes.getValue("caseSensitive");
      -  177  2440
                   if (caseSensitive != null) {
      -  178  2440
                       pt.setCaseSensitive(Boolean.parseBoolean(caseSensitive));
      +  176  320
                   final String caseSensitive = currentAttributes.getValue("caseSensitive");
      +  177  320
                   if (caseSensitive != null) {
      +  178  320
                       pt.setCaseSensitive(Boolean.parseBoolean(caseSensitive));
       179  
                   }
       180  
               }
      -  181  2440
               return pt;
      +  181  320
               return pt;
       182  
           }
       183  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionParseException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionParseException.html index 5406d319f..c3c6b99e0 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionParseException.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionParseException.html @@ -76,67 +76,77 @@  29  
           /**
       30   -
            * Creates a new SuppressionParseException.
      +
            * The serial version UID for serialization.
       31  
            */
       32   -
           public SuppressionParseException() {
      -  33  0
               super();
      -  34  0
           }
      +
           private static final long serialVersionUID = 1L;
      +  33   +
       
      +  34   +
           /**
       35   -
       
      +
            * Creates a new SuppressionParseException.
       36   -
           /**
      +
            */
       37   -
            * Creates a new SuppressionParseException.
      -  38   -
            *
      -  39   -
            * @param msg a message for the exception.
      +
           public SuppressionParseException() {
      +  38  0
               super();
      +  39  0
           }
       40   -
            */
      +
       
       41   -
           public SuppressionParseException(String msg) {
      -  42  0
               super(msg);
      -  43  0
           }
      +
           /**
      +  42   +
            * Creates a new SuppressionParseException.
      +  43   +
            *
       44   -
       
      -  45   -
           /**
      -  46   -
            * Creates a new SuppressionParseException.
      -  47   -
            *
      -  48   -
            * @param ex the cause of the parse exception
      -  49   -
            */
      -  50   -
           public SuppressionParseException(Throwable ex) {
      -  51  8
               super(ex);
      -  52  8
           }
      -  53   -
       
      -  54   -
           /**
      -  55   -
            * Creates a new SuppressionParseException.
      -  56   -
            *
      -  57  
            * @param msg a message for the exception.
      -  58   -
            * @param ex the cause of the parse exception
      -  59   +  45  
            */
      +  46   +
           public SuppressionParseException(String msg) {
      +  47  0
               super(msg);
      +  48  0
           }
      +  49   +
       
      +  50   +
           /**
      +  51   +
            * Creates a new SuppressionParseException.
      +  52   +
            *
      +  53   +
            * @param ex the cause of the parse exception
      +  54   +
            */
      +  55   +
           public SuppressionParseException(Throwable ex) {
      +  56  1
               super(ex);
      +  57  1
           }
      +  58   +
       
      +  59   +
           /**
       60   -
           public SuppressionParseException(String msg, Throwable ex) {
      -  61  8
               super(msg, ex);
      -  62  8
           }
      +
            * Creates a new SuppressionParseException.
      +  61   +
            *
      +  62   +
            * @param msg a message for the exception.
       63   +
            * @param ex the cause of the parse exception
      +  64   +
            */
      +  65   +
           public SuppressionParseException(String msg, Throwable ex) {
      +  66  1
               super(msg, ex);
      +  67  1
           }
      +  68  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionParser.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionParser.html index 106a1082b..d3224cf8f 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionParser.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionParser.html @@ -101,7 +101,7 @@
        * @author Jeremy Long
       42  
        */
      -  43  48
       public class SuppressionParser {
      +  43  6
       public class SuppressionParser {
       44  
       
       45   @@ -110,7 +110,7 @@
            * The logger.
       47  
            */
      -  48  8
           private static final Logger LOGGER = LoggerFactory.getLogger(SuppressionParser.class);
      +  48  1
           private static final Logger LOGGER = LoggerFactory.getLogger(SuppressionParser.class);
       49  
           /**
       50   @@ -153,23 +153,23 @@
            */
       69  
           public List<SuppressionRule> parseSuppressionRules(File file) throws SuppressionParseException {
      -  70  32
               FileInputStream fis = null;
      +  70  4
               FileInputStream fis = null;
       71  
               try {
      -  72  32
                   fis = new FileInputStream(file);
      -  73  24
                   return parseSuppressionRules(fis);
      -  74  8
               } catch (IOException ex) {
      -  75  8
                   LOGGER.debug("", ex);
      -  76  8
                   throw new SuppressionParseException(ex);
      +  72  4
                   fis = new FileInputStream(file);
      +  73  3
                   return parseSuppressionRules(fis);
      +  74  1
               } catch (IOException ex) {
      +  75  1
                   LOGGER.debug("", ex);
      +  76  1
                   throw new SuppressionParseException(ex);
       77  
               } finally {
      -  78  32
                   if (fis != null) {
      +  78  4
                   if (fis != null) {
       79  
                       try {
      -  80  24
                           fis.close();
      +  80  3
                           fis.close();
       81  0
                       } catch (IOException ex) {
       82  0
                           LOGGER.debug("Unable to close stream", ex);
      -  83  56
                       }
      +  83  7
                       }
       84  
                   }
       85   @@ -196,29 +196,29 @@
           public List<SuppressionRule> parseSuppressionRules(InputStream inputStream) throws SuppressionParseException {
       96  
               try {
      -  97  64
                   final InputStream schemaStream = this.getClass().getClassLoader().getResourceAsStream("schema/suppression.xsd");
      -  98  64
                   final SuppressionHandler handler = new SuppressionHandler();
      -  99  64
                   final SAXParserFactory factory = SAXParserFactory.newInstance();
      -  100  64
                   factory.setNamespaceAware(true);
      -  101  64
                   factory.setValidating(true);
      -  102  64
                   final SAXParser saxParser = factory.newSAXParser();
      -  103  64
                   saxParser.setProperty(SuppressionParser.JAXP_SCHEMA_LANGUAGE, SuppressionParser.W3C_XML_SCHEMA);
      -  104  64
                   saxParser.setProperty(SuppressionParser.JAXP_SCHEMA_SOURCE, new InputSource(schemaStream));
      -  105  64
                   final XMLReader xmlReader = saxParser.getXMLReader();
      -  106  64
                   xmlReader.setErrorHandler(new SuppressionErrorHandler());
      -  107  64
                   xmlReader.setContentHandler(handler);
      +  97  8
                   final InputStream schemaStream = this.getClass().getClassLoader().getResourceAsStream("schema/suppression.xsd");
      +  98  8
                   final SuppressionHandler handler = new SuppressionHandler();
      +  99  8
                   final SAXParserFactory factory = SAXParserFactory.newInstance();
      +  100  8
                   factory.setNamespaceAware(true);
      +  101  8
                   factory.setValidating(true);
      +  102  8
                   final SAXParser saxParser = factory.newSAXParser();
      +  103  8
                   saxParser.setProperty(SuppressionParser.JAXP_SCHEMA_LANGUAGE, SuppressionParser.W3C_XML_SCHEMA);
      +  104  8
                   saxParser.setProperty(SuppressionParser.JAXP_SCHEMA_SOURCE, new InputSource(schemaStream));
      +  105  8
                   final XMLReader xmlReader = saxParser.getXMLReader();
      +  106  8
                   xmlReader.setErrorHandler(new SuppressionErrorHandler());
      +  107  8
                   xmlReader.setContentHandler(handler);
       108  
       
      -  109  64
                   final Reader reader = new InputStreamReader(inputStream, "UTF-8");
      -  110  64
                   final InputSource in = new InputSource(reader);
      +  109  8
                   final Reader reader = new InputStreamReader(inputStream, "UTF-8");
      +  110  8
                   final InputSource in = new InputSource(reader);
       111  
                   //in.setEncoding("UTF-8");
       112  
       
      -  113  64
                   xmlReader.parse(in);
      +  113  8
                   xmlReader.parse(in);
       114  
       
      -  115  64
                   return handler.getSuppressionRules();
      +  115  8
                   return handler.getSuppressionRules();
       116  0
               } catch (ParserConfigurationException ex) {
       117  0
                   LOGGER.debug("", ex);
       118  0
                   throw new SuppressionParseException(ex);
      @@ -239,6 +239,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionRule.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionRule.html index 0314d429a..e89ad3ff6 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionRule.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.suppression.SuppressionRule.html @@ -77,7 +77,7 @@
        * @author Jeremy Long
       30  
        */
      -  31  1048
       public class SuppressionRule {
      +  31  136
       public class SuppressionRule {
       32  
       
       33   @@ -102,7 +102,7 @@
            */
       43  
           public PropertyType getFilePath() {
      -  44  8
               return filePath;
      +  44  1
               return filePath;
       45  
           }
       46   @@ -119,8 +119,8 @@
            */
       52  
           public void setFilePath(PropertyType filePath) {
      -  53  272
               this.filePath = filePath;
      -  54  272
           }
      +  53  34
               this.filePath = filePath;
      +  54  34
           }
       55  
           /**
       56   @@ -143,7 +143,7 @@
            */
       65  
           public String getSha1() {
      -  66  8
               return sha1;
      +  66  1
               return sha1;
       67  
           }
       68   @@ -160,15 +160,15 @@
            */
       74  
           public void setSha1(String sha1) {
      -  75  48
               this.sha1 = sha1;
      -  76  48
           }
      +  75  6
               this.sha1 = sha1;
      +  76  6
           }
       77  
           /**
       78  
            * A list of CPEs to suppression
       79  
            */
      -  80  1048
           private List<PropertyType> cpe = new ArrayList<PropertyType>();
      +  80  136
           private List<PropertyType> cpe = new ArrayList<PropertyType>();
       81  
       
       82   @@ -183,7 +183,7 @@
            */
       87  
           public List<PropertyType> getCpe() {
      -  88  8
               return cpe;
      +  88  1
               return cpe;
       89  
           }
       90   @@ -200,8 +200,8 @@
            */
       96  
           public void setCpe(List<PropertyType> cpe) {
      -  97  8
               this.cpe = cpe;
      -  98  8
           }
      +  97  1
               this.cpe = cpe;
      +  98  1
           }
       99  
       
       100   @@ -216,8 +216,8 @@
            */
       105  
           public void addCpe(PropertyType cpe) {
      -  106  1640
               this.cpe.add(cpe);
      -  107  1640
           }
      +  106  215
               this.cpe.add(cpe);
      +  107  215
           }
       108  
       
       109   @@ -232,7 +232,7 @@
            */
       114  
           public boolean hasCpe() {
      -  115  152
               return !cpe.isEmpty();
      +  115  19
               return !cpe.isEmpty();
       116  
           }
       117   @@ -241,7 +241,7 @@
            * The list of cvssBelow scores.
       119  
            */
      -  120  1048
           private List<Float> cvssBelow = new ArrayList<Float>();
      +  120  136
           private List<Float> cvssBelow = new ArrayList<Float>();
       121  
       
       122   @@ -256,7 +256,7 @@
            */
       127  
           public List<Float> getCvssBelow() {
      -  128  8
               return cvssBelow;
      +  128  1
               return cvssBelow;
       129  
           }
       130   @@ -273,8 +273,8 @@
            */
       136  
           public void setCvssBelow(List<Float> cvssBelow) {
      -  137  8
               this.cvssBelow = cvssBelow;
      -  138  8
           }
      +  137  1
               this.cvssBelow = cvssBelow;
      +  138  1
           }
       139  
       
       140   @@ -289,8 +289,8 @@
            */
       145  
           public void addCvssBelow(Float cvss) {
      -  146  56
               this.cvssBelow.add(cvss);
      -  147  56
           }
      +  146  7
               this.cvssBelow.add(cvss);
      +  147  7
           }
       148  
       
       149   @@ -305,7 +305,7 @@
            */
       154  
           public boolean hasCvssBelow() {
      -  155  128
               return !cvssBelow.isEmpty();
      +  155  16
               return !cvssBelow.isEmpty();
       156  
           }
       157   @@ -314,7 +314,7 @@
            * The list of cwe entries to suppress.
       159  
            */
      -  160  1048
           private List<String> cwe = new ArrayList<String>();
      +  160  136
           private List<String> cwe = new ArrayList<String>();
       161  
       
       162   @@ -329,7 +329,7 @@
            */
       167  
           public List<String> getCwe() {
      -  168  8
               return cwe;
      +  168  1
               return cwe;
       169  
           }
       170   @@ -346,8 +346,8 @@
            */
       176  
           public void setCwe(List<String> cwe) {
      -  177  8
               this.cwe = cwe;
      -  178  8
           }
      +  177  1
               this.cwe = cwe;
      +  178  1
           }
       179  
       
       180   @@ -362,8 +362,8 @@
            */
       185  
           public void addCwe(String cwe) {
      -  186  16
               this.cwe.add(cwe);
      -  187  16
           }
      +  186  2
               this.cwe.add(cwe);
      +  187  2
           }
       188  
       
       189   @@ -378,7 +378,7 @@
            */
       194  
           public boolean hasCwe() {
      -  195  136
               return !cwe.isEmpty();
      +  195  17
               return !cwe.isEmpty();
       196  
           }
       197   @@ -387,7 +387,7 @@
            * The list of cve entries to suppress.
       199  
            */
      -  200  1048
           private List<String> cve = new ArrayList<String>();
      +  200  136
           private List<String> cve = new ArrayList<String>();
       201  
       
       202   @@ -402,7 +402,7 @@
            */
       207  
           public List<String> getCve() {
      -  208  8
               return cve;
      +  208  1
               return cve;
       209  
           }
       210   @@ -419,8 +419,8 @@
            */
       216  
           public void setCve(List<String> cve) {
      -  217  8
               this.cve = cve;
      -  218  8
           }
      +  217  1
               this.cve = cve;
      +  218  1
           }
       219  
       
       220   @@ -435,8 +435,8 @@
            */
       225  
           public void addCve(String cve) {
      -  226  88
               this.cve.add(cve);
      -  227  88
           }
      +  226  11
               this.cve.add(cve);
      +  227  11
           }
       228  
       
       229   @@ -451,7 +451,7 @@
            */
       234  
           public boolean hasCve() {
      -  235  152
               return !cve.isEmpty();
      +  235  19
               return !cve.isEmpty();
       236  
           }
       237   @@ -460,7 +460,7 @@
            * A Maven GAV to suppression.
       239  
            */
      -  240  1048
           private PropertyType gav = null;
      +  240  136
           private PropertyType gav = null;
       241  
       
       242   @@ -492,8 +492,8 @@
            */
       256  
           public void setGav(PropertyType gav) {
      -  257  608
               this.gav = gav;
      -  258  608
           }
      +  257  81
               this.gav = gav;
      +  258  81
           }
       259  
       
       260   @@ -537,7 +537,7 @@
            */
       280  
           public boolean isBase() {
      -  281  136
               return base;
      +  281  17
               return base;
       282  
           }
       283   @@ -554,8 +554,8 @@
            */
       289  
           public void setBase(boolean base) {
      -  290  936
               this.base = base;
      -  291  936
           }
      +  290  122
               this.base = base;
      +  291  122
           }
       292  
       
       293   @@ -572,71 +572,71 @@
            */
       299  
           public void process(Dependency dependency) {
      -  300  688
               if (filePath != null && !filePath.matches(dependency.getFilePath())) {
      -  301  64
                   return;
      +  300  90
               if (filePath != null && !filePath.matches(dependency.getFilePath())) {
      +  301  8
                   return;
       302  
               }
      -  303  624
               if (sha1 != null && !sha1.equalsIgnoreCase(dependency.getSha1sum())) {
      -  304  8
                   return;
      +  303  82
               if (sha1 != null && !sha1.equalsIgnoreCase(dependency.getSha1sum())) {
      +  304  1
                   return;
       305  
               }
      -  306  616
               if (gav != null) {
      -  307  488
                   final Iterator<Identifier> itr = dependency.getIdentifiers().iterator();
      -  308  488
                   boolean gavFound = false;
      -  309  1240
                   while (itr.hasNext()) {
      -  310  760
                       final Identifier i = itr.next();
      -  311  760
                       if (identifierMatches("maven", this.gav, i)) {
      -  312  8
                           gavFound = true;
      -  313  8
                           break;
      +  306  81
               if (gav != null) {
      +  307  65
                   final Iterator<Identifier> itr = dependency.getIdentifiers().iterator();
      +  308  65
                   boolean gavFound = false;
      +  309  165
                   while (itr.hasNext()) {
      +  310  101
                       final Identifier i = itr.next();
      +  311  101
                       if (identifierMatches("maven", this.gav, i)) {
      +  312  1
                           gavFound = true;
      +  313  1
                           break;
       314  
                       }
      -  315  752
                   }
      -  316  488
                   if (!gavFound) {
      -  317  480
                       return;
      +  315  100
                   }
      +  316  65
                   if (!gavFound) {
      +  317  64
                       return;
       318  
                   }
       319  
               }
       320  
       
      -  321  136
               if (this.hasCpe()) {
      -  322  96
                   final Iterator<Identifier> itr = dependency.getIdentifiers().iterator();
      -  323  272
                   while (itr.hasNext()) {
      -  324  176
                       final Identifier i = itr.next();
      -  325  176
                       for (PropertyType c : this.cpe) {
      -  326  240
                           if (identifierMatches("cpe", c, i)) {
      -  327  56
                               if (!isBase()) {
      -  328  32
                                   dependency.addSuppressedIdentifier(i);
      +  321  17
               if (this.hasCpe()) {
      +  322  12
                   final Iterator<Identifier> itr = dependency.getIdentifiers().iterator();
      +  323  34
                   while (itr.hasNext()) {
      +  324  22
                       final Identifier i = itr.next();
      +  325  22
                       for (PropertyType c : this.cpe) {
      +  326  30
                           if (identifierMatches("cpe", c, i)) {
      +  327  7
                               if (!isBase()) {
      +  328  4
                                   dependency.addSuppressedIdentifier(i);
       329  
                               }
      -  330  56
                               itr.remove();
      -  331  56
                               break;
      +  330  7
                               itr.remove();
      +  331  7
                               break;
       332  
                           }
      -  333  184
                       }
      -  334  176
                   }
      +  333  23
                       }
      +  334  22
                   }
       335  
               }
      -  336  136
               if (hasCve() || hasCwe() || hasCvssBelow()) {
      -  337  40
                   final Iterator<Vulnerability> itr = dependency.getVulnerabilities().iterator();
      -  338  80
                   while (itr.hasNext()) {
      -  339  40
                       boolean remove = false;
      -  340  40
                       final Vulnerability v = itr.next();
      -  341  40
                       for (String entry : this.cve) {
      -  342  24
                           if (entry.equalsIgnoreCase(v.getName())) {
      -  343  8
                               remove = true;
      -  344  8
                               break;
      +  336  17
               if (hasCve() || hasCwe() || hasCvssBelow()) {
      +  337  5
                   final Iterator<Vulnerability> itr = dependency.getVulnerabilities().iterator();
      +  338  10
                   while (itr.hasNext()) {
      +  339  5
                       boolean remove = false;
      +  340  5
                       final Vulnerability v = itr.next();
      +  341  5
                       for (String entry : this.cve) {
      +  342  3
                           if (entry.equalsIgnoreCase(v.getName())) {
      +  343  1
                               remove = true;
      +  344  1
                               break;
       345  
                           }
      -  346  16
                       }
      -  347  40
                       if (!remove) {
      -  348  32
                           for (String entry : this.cwe) {
      -  349  8
                               if (v.getCwe() != null) {
      -  350  8
                                   final String toMatch = String.format("CWE-%s ", entry);
      -  351  8
                                   final String toTest = v.getCwe().substring(0, toMatch.length()).toUpperCase();
      -  352  8
                                   if (toTest.equals(toMatch)) {
      -  353  8
                                       remove = true;
      -  354  8
                                       break;
      +  346  2
                       }
      +  347  5
                       if (!remove) {
      +  348  4
                           for (String entry : this.cwe) {
      +  349  1
                               if (v.getCwe() != null) {
      +  350  1
                                   final String toMatch = String.format("CWE-%s ", entry);
      +  351  1
                                   final String toTest = v.getCwe().substring(0, toMatch.length()).toUpperCase();
      +  352  1
                                   if (toTest.equals(toMatch)) {
      +  353  1
                                       remove = true;
      +  354  1
                                       break;
       355  
                                   }
       356   @@ -644,28 +644,28 @@  357  0
                           }
       358  
                       }
      -  359  40
                       if (!remove) {
      -  360  24
                           for (float cvss : this.cvssBelow) {
      -  361  24
                               if (v.getCvssScore() < cvss) {
      -  362  8
                                   remove = true;
      -  363  8
                                   break;
      +  359  5
                       if (!remove) {
      +  360  3
                           for (float cvss : this.cvssBelow) {
      +  361  3
                               if (v.getCvssScore() < cvss) {
      +  362  1
                                   remove = true;
      +  363  1
                                   break;
       364  
                               }
      -  365  16
                           }
      +  365  2
                           }
       366  
                       }
      -  367  40
                       if (remove) {
      -  368  24
                           if (!isBase()) {
      -  369  24
                               dependency.addSuppressedVulnerability(v);
      +  367  5
                       if (remove) {
      +  368  3
                           if (!isBase()) {
      +  369  3
                               dependency.addSuppressedVulnerability(v);
       370  
                           }
      -  371  24
                           itr.remove();
      +  371  3
                           itr.remove();
       372  
                       }
      -  373  40
                   }
      +  373  5
                   }
       374  
               }
      -  375  136
           }
      +  375  17
           }
       376  
       
       377   @@ -682,15 +682,15 @@
            */
       383  
           boolean cpeHasNoVersion(PropertyType c) {
      -  384  272
               if (c.isRegex()) {
      -  385  16
                   return false;
      +  384  34
               if (c.isRegex()) {
      +  385  2
                   return false;
       386  
               }
      -  387  256
               if (countCharacter(c.getValue(), ':') == 3) {
      -  388  208
                   return true;
      +  387  32
               if (countCharacter(c.getValue(), ':') == 3) {
      +  388  26
                   return true;
       389  
               }
      -  390  48
               return false;
      +  390  6
               return false;
       391  
           }
       392   @@ -711,14 +711,14 @@
            */
       400  
           int countCharacter(String str, char c) {
      -  401  280
               int count = 0;
      -  402  280
               int pos = str.indexOf(c) + 1;
      -  403  1144
               while (pos > 0) {
      -  404  864
                   count += 1;
      -  405  864
                   pos = str.indexOf(c, pos) + 1;
      +  401  35
               int count = 0;
      +  402  35
               int pos = str.indexOf(c) + 1;
      +  403  143
               while (pos > 0) {
      +  404  108
                   count += 1;
      +  405  108
                   pos = str.indexOf(c, pos) + 1;
       406  
               }
      -  407  280
               return count;
      +  407  35
               return count;
       408  
           }
       409   @@ -741,24 +741,24 @@
            */
       418  
           boolean identifierMatches(String identifierType, PropertyType suppressionEntry, Identifier identifier) {
      -  419  1072
               if (identifierType.equals(identifier.getType())) {
      -  420  296
                   if (suppressionEntry.matches(identifier.getValue())) {
      -  421  40
                       return true;
      -  422  256
                   } else if ("cpe".equals(identifierType) && cpeHasNoVersion(suppressionEntry)) {
      -  423  200
                       if (suppressionEntry.isCaseSensitive()) {
      +  419  140
               if (identifierType.equals(identifier.getType())) {
      +  420  37
                   if (suppressionEntry.matches(identifier.getValue())) {
      +  421  5
                       return true;
      +  422  32
                   } else if ("cpe".equals(identifierType) && cpeHasNoVersion(suppressionEntry)) {
      +  423  25
                       if (suppressionEntry.isCaseSensitive()) {
       424  0
                           return identifier.getValue().startsWith(suppressionEntry.getValue());
       425  
                       } else {
      -  426  200
                           final String id = identifier.getValue().toLowerCase();
      -  427  200
                           final String check = suppressionEntry.getValue().toLowerCase();
      -  428  200
                           return id.startsWith(check);
      +  426  25
                           final String id = identifier.getValue().toLowerCase();
      +  427  25
                           final String check = suppressionEntry.getValue().toLowerCase();
      +  428  25
                           return id.startsWith(check);
       429  
                       }
       430  
                   }
       431  
               }
      -  432  832
               return false;
      +  432  110
               return false;
       433  
           }
       434   @@ -831,6 +831,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DBUtils.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DBUtils.html index ba38cecd2..1fe672600 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DBUtils.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DBUtils.html @@ -89,7 +89,7 @@
            * The logger.
       36  
            */
      -  37  8
           private static final Logger LOGGER = LoggerFactory.getLogger(DBUtils.class);
      +  37  1
           private static final Logger LOGGER = LoggerFactory.getLogger(DBUtils.class);
       38  
       
       39   @@ -151,16 +151,16 @@
            */
       74  
           public static void closeStatement(Statement statement) {
      -  75  312
               if (statement != null) {
      +  75  39
               if (statement != null) {
       76  
                   try {
      -  77  312
                       statement.close();
      +  77  39
                       statement.close();
       78  0
                   } catch (SQLException ex) {
       79  0
                       LOGGER.trace(statement.toString(), ex);
      -  80  312
                   }
      +  80  39
                   }
       81  
               }
      -  82  312
           }
      +  82  39
           }
       83  
       
       84   @@ -175,20 +175,20 @@
            */
       89  
           public static void closeResultSet(ResultSet rs) {
      -  90  336
               if (rs != null) {
      +  90  39
               if (rs != null) {
       91  
                   try {
      -  92  336
                       rs.close();
      +  92  39
                       rs.close();
       93  0
                   } catch (SQLException ex) {
       94  0
                       LOGGER.trace(rs.toString(), ex);
      -  95  336
                   }
      +  95  39
                   }
       96  
               }
      -  97  336
           }
      +  97  39
           }
       98  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DateUtil.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DateUtil.html index cdfa0b8e2..034a1076d 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DateUtil.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DateUtil.html @@ -99,14 +99,14 @@
            */
       42  
           public static boolean withinDateRange(long date, long compareTo, int range) {
      -  43  47
               final double differenceInDays = (compareTo - date) / 1000.0 / 60.0 / 60.0 / 24.0;
      -  44  47
               return differenceInDays < range;
      +  43  9
               final double differenceInDays = (compareTo - date) / 1000.0 / 60.0 / 60.0 / 24.0;
      +  44  9
               return differenceInDays < range;
       45  
           }
       46  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DependencyVersion.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DependencyVersion.html index 244525ea1..d4b606929 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DependencyVersion.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DependencyVersion.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      DependencyVersion
      90%
      80/88
      78%
      50/64
      5.273
      DependencyVersion
      90%
      80/88
      76%
      49/64
      5.273
       
      @@ -66,7 +66,7 @@  24  
       import java.util.regex.Pattern;
       25   -
       import org.apache.commons.lang.StringUtils;
      +
       import org.apache.commons.lang3.StringUtils;
       26  
       
       27   @@ -95,7 +95,7 @@
        * @author Jeremy Long
       39  
        */
      -  40  112
       public class DependencyVersion implements Iterable, Comparable<DependencyVersion> {
      +  40  14
       public class DependencyVersion implements Iterable<String>, Comparable<DependencyVersion> {
       41  
       
       42   @@ -104,8 +104,8 @@
            * Constructor for a empty DependencyVersion.
       44  
            */
      -  45  32
           public DependencyVersion() {
      -  46  32
           }
      +  45  4
           public DependencyVersion() {
      +  46  4
           }
       47  
       
       48   @@ -122,9 +122,9 @@
            * @param version the well formatted version number to parse
       54  
            */
      -  55  8172
           public DependencyVersion(String version) {
      -  56  8172
               parseVersion(version);
      -  57  8172
           }
      +  55  1029
           public DependencyVersion(String version) {
      +  56  1029
               parseVersion(version);
      +  57  1029
           }
       58  
       
       59   @@ -141,21 +141,21 @@
            */
       65  
           public final void parseVersion(String version) {
      -  66  8188
               versionParts = new ArrayList<String>();
      -  67  8188
               if (version != null) {
      -  68  8183
                   final Pattern rx = Pattern.compile("(\\d+[a-z]{1,3}$|[a-z]+\\d+|\\d+|(release|beta|alpha)$)");
      -  69  8183
                   final Matcher matcher = rx.matcher(version.toLowerCase());
      -  70  34131
                   while (matcher.find()) {
      -  71  25948
                       versionParts.add(matcher.group());
      +  66  1031
               versionParts = new ArrayList<String>();
      +  67  1031
               if (version != null) {
      +  68  1031
                   final Pattern rx = Pattern.compile("(\\d+[a-z]{1,3}$|[a-z]+\\d+|\\d+|(release|beta|alpha)$)");
      +  69  1031
                   final Matcher matcher = rx.matcher(version.toLowerCase());
      +  70  4297
                   while (matcher.find()) {
      +  71  3266
                       versionParts.add(matcher.group());
       72  
                   }
      -  73  8183
                   if (versionParts.isEmpty()) {
      -  74  43
                       versionParts.add(version);
      +  73  1031
                   if (versionParts.isEmpty()) {
      +  74  6
                       versionParts.add(version);
       75  
                   }
       76  
               }
      -  77  8188
           }
      +  77  1031
           }
       78  
           /**
       79   @@ -178,7 +178,7 @@
            */
       88  
           public List<String> getVersionParts() {
      -  89  14418
               return versionParts;
      +  89  1811
               return versionParts;
       90  
           }
       91   @@ -195,8 +195,8 @@
            */
       97  
           public void setVersionParts(List<String> versionParts) {
      -  98  24
               this.versionParts = versionParts;
      -  99  24
           }
      +  98  3
               this.versionParts = versionParts;
      +  99  3
           }
       100  
       
       101   @@ -210,241 +210,243 @@  105  
            */
       106   -
           public Iterator iterator() {
      -  107  8
               return versionParts.iterator();
      -  108   -
           }
      +
           @Override
      +  107   +
           public Iterator<String> iterator() {
      +  108  1
               return versionParts.iterator();
       109   -
       
      +
           }
       110   -
           /**
      +
       
       111   -
            * Reconstructs the version string from the split version parts.
      +
           /**
       112   -
            *
      +
            * Reconstructs the version string from the split version parts.
       113   -
            * @return a string representing the version.
      +
            *
       114   -
            */
      +
            * @return a string representing the version.
       115   -
           @Override
      +
            */
       116   +
           @Override
      +  117  
           public String toString() {
      -  117  2526
               return StringUtils.join(versionParts.toArray(), ".");
      -  118   -
           }
      +  118  317
               return StringUtils.join(versionParts.toArray(), ".");
       119   -
       
      +
           }
       120   -
           /**
      +
       
       121   -
            * Compares the equality of this object to the one passed in as a parameter.
      +
           /**
       122   -
            *
      +
            * Compares the equality of this object to the one passed in as a parameter.
       123   -
            * @param obj the object to compare equality
      +
            *
       124   -
            * @return returns true only if the two objects are equal, otherwise false
      +
            * @param obj the object to compare equality
       125   -
            */
      +
            * @return returns true only if the two objects are equal, otherwise false
       126   -
           @Override
      +
            */
       127   +
           @Override
      +  128  
           public boolean equals(Object obj) {
      -  128  5280
               if (obj == null) {
      -  129  0
                   return false;
      -  130   +  129  660
               if (obj == null) {
      +  130  0
                   return false;
      +  131  
               }
      -  131  5280
               if (getClass() != obj.getClass()) {
      -  132  0
                   return false;
      -  133   +  132  660
               if (getClass() != obj.getClass()) {
      +  133  0
                   return false;
      +  134  
               }
      -  134  5280
               final DependencyVersion other = (DependencyVersion) obj;
      -  135  5280
               final int max = (this.versionParts.size() < other.versionParts.size())
      -  136   -
                       ? this.versionParts.size() : other.versionParts.size();
      +  135  660
               final DependencyVersion other = (DependencyVersion) obj;
      +  136  660
               final int max = (this.versionParts.size() < other.versionParts.size())
       137   +
                       ? this.versionParts.size() : other.versionParts.size();
      +  138  
               //TODO steal better version of code from compareTo
      -  138  11696
               for (int i = 0; i < max; i++) {
      -  139  10648
                   final String thisPart = this.versionParts.get(i);
      -  140  10648
                   final String otherPart = other.versionParts.get(i);
      -  141  10648
                   if (!thisPart.equals(otherPart)) {
      -  142  4232
                       return false;
      -  143   -
                   }
      +  139  1462
               for (int i = 0; i < max; i++) {
      +  140  1331
                   final String thisPart = this.versionParts.get(i);
      +  141  1331
                   final String otherPart = other.versionParts.get(i);
      +  142  1331
                   if (!thisPart.equals(otherPart)) {
      +  143  529
                       return false;
       144   +
                   }
      +  145  
               }
      -  145  1048
               if (this.versionParts.size() > max) {
      -  146  0
                   for (int i = max; i < this.versionParts.size(); i++) {
      -  147  0
                       if (!"0".equals(this.versionParts.get(i))) {
      -  148  0
                           return false;
      -  149   -
                       }
      +  146  131
               if (this.versionParts.size() > max) {
      +  147  0
                   for (int i = max; i < this.versionParts.size(); i++) {
      +  148  0
                       if (!"0".equals(this.versionParts.get(i))) {
      +  149  0
                           return false;
       150   -
                   }
      +
                       }
       151   -
               }
      +
                   }
       152   +
               }
      +  153  
       
      -  153  1048
               if (other.versionParts.size() > max) {
      -  154  856
                   for (int i = max; i < other.versionParts.size(); i++) {
      -  155  856
                       if (!"0".equals(other.versionParts.get(i))) {
      -  156  856
                           return false;
      -  157   -
                       }
      +  154  131
               if (other.versionParts.size() > max) {
      +  155  107
                   for (int i = max; i < other.versionParts.size(); i++) {
      +  156  107
                       if (!"0".equals(other.versionParts.get(i))) {
      +  157  107
                           return false;
       158   -
                   }
      +
                       }
       159   -
               }
      +
                   }
       160   -
       
      +
               }
       161   -
               /*
      +
       
       162   -
                *  if (this.versionParts != other.versionParts && (this.versionParts == null || !this.versionParts.equals(other.versionParts))) {
      +
               /*
       163   -
                *      return false;
      +
                *  if (this.versionParts != other.versionParts && (this.versionParts == null || !this.versionParts.equals(other.versionParts))) {
       164   -
                *  }
      +
                *      return false;
       165   +
                *  }
      +  166  
                */
      -  166  192
               return true;
      -  167   -
           }
      +  167  24
               return true;
       168   -
       
      +
           }
       169   -
           /**
      +
       
       170   -
            * Calculates the hashCode for this object.
      -  171   -
            *
      -  172   -
            * @return the hashCode
      -  173   -
            */
      -  174   -
           @Override
      -  175   -
           public int hashCode() {
      -  176  8
               int hash = 5;
      -  177  8
               hash = 71 * hash + (this.versionParts != null ? this.versionParts.hashCode() : 0);
      -  178  8
               return hash;
      -  179   -
           }
      -  180   -
       
      -  181  
           /**
      -  182   -
            * Determines if the three most major major version parts are identical. For instances, if version 1.2.3.4 was
      -  183   -
            * compared to 1.2.3 this function would return true.
      -  184   +  171   +
            * Calculates the hashCode for this object.
      +  172  
            *
      -  185   -
            * @param version the version number to compare
      -  186   -
            * @return true if the first three major parts of the version are identical
      -  187   +  173   +
            * @return the hashCode
      +  174  
            */
      -  188   -
           public boolean matchesAtLeastThreeLevels(DependencyVersion version) {
      -  189  3392
               if (version == null) {
      -  190  0
                   return false;
      -  191   -
               }
      -  192  3392
               if (Math.abs(this.versionParts.size() - version.versionParts.size()) >= 3) {
      -  193  8
                   return false;
      -  194   -
               }
      -  195   -
       
      -  196  3384
               final int max = (this.versionParts.size() < version.versionParts.size())
      -  197   -
                       ? this.versionParts.size() : version.versionParts.size();
      -  198   -
       
      -  199  3384
               boolean ret = true;
      -  200  6976
               for (int i = 0; i < max; i++) {
      -  201  6448
                   final String thisVersion = this.versionParts.get(i);
      -  202  6448
                   final String otherVersion = version.getVersionParts().get(i);
      -  203  6448
                   if (i >= 3) {
      -  204  16
                       if (thisVersion.compareToIgnoreCase(otherVersion) >= 0) {
      -  205  8
                           ret = false;
      -  206  8
                           break;
      -  207   -
                       }
      -  208  6432
                   } else if (!thisVersion.equals(otherVersion)) {
      -  209  2848
                       ret = false;
      -  210  2848
                       break;
      -  211   -
                   }
      -  212   -
               }
      -  213   -
       
      -  214  3384
               return ret;
      -  215   -
           }
      -  216   -
       
      -  217   +  175  
           @Override
      -  218   -
           public int compareTo(DependencyVersion version) {
      -  219  215
               if (version == null) {
      -  220  0
                   return 1;
      -  221   -
               }
      -  222  215
               final List<String> left = this.getVersionParts();
      -  223  215
               final List<String> right = version.getVersionParts();
      -  224  215
               final int max = left.size() < right.size() ? left.size() : right.size();
      -  225   -
       
      -  226  557
               for (int i = 0; i < max; i++) {
      -  227  472
                   final String lStr = left.get(i);
      -  228  472
                   final String rStr = right.get(i);
      -  229  472
                   if (lStr.equals(rStr)) {
      -  230  342
                       continue;
      -  231   -
                   }
      -  232   -
                   try {
      -  233  130
                       final int l = Integer.parseInt(lStr);
      -  234  74
                       final int r = Integer.parseInt(rStr);
      -  235  71
                       if (l < r) {
      -  236  52
                           return -1;
      -  237  19
                       } else if (l > r) {
      -  238  19
                           return 1;
      -  239   -
                       }
      -  240  59
                   } catch (NumberFormatException ex) {
      -  241  59
                       final int comp = left.get(i).compareTo(right.get(i));
      -  242  59
                       if (comp < 0) {
      -  243  48
                           return -1;
      -  244  11
                       } else if (comp > 0) {
      -  245  11
                           return 1;
      -  246   -
                       }
      -  247  0
                   }
      -  248   -
               }
      -  249  85
               if (left.size() < right.size()) {
      -  250  24
                   return -1;
      -  251  61
               } else if (left.size() > right.size()) {
      -  252  29
                   return 1;
      -  253   -
               } else {
      -  254  32
                   return 0;
      -  255   -
               }
      -  256   +  176   +
           public int hashCode() {
      +  177  1
               int hash = 5;
      +  178  1
               hash = 71 * hash + (this.versionParts != null ? this.versionParts.hashCode() : 0);
      +  179  1
               return hash;
      +  180  
           }
      +  181   +
       
      +  182   +
           /**
      +  183   +
            * Determines if the three most major major version parts are identical. For instances, if version 1.2.3.4 was
      +  184   +
            * compared to 1.2.3 this function would return true.
      +  185   +
            *
      +  186   +
            * @param version the version number to compare
      +  187   +
            * @return true if the first three major parts of the version are identical
      +  188   +
            */
      +  189   +
           public boolean matchesAtLeastThreeLevels(DependencyVersion version) {
      +  190  424
               if (version == null) {
      +  191  0
                   return false;
      +  192   +
               }
      +  193  424
               if (Math.abs(this.versionParts.size() - version.versionParts.size()) >= 3) {
      +  194  1
                   return false;
      +  195   +
               }
      +  196   +
       
      +  197  423
               final int max = (this.versionParts.size() < version.versionParts.size())
      +  198   +
                       ? this.versionParts.size() : version.versionParts.size();
      +  199   +
       
      +  200  423
               boolean ret = true;
      +  201  872
               for (int i = 0; i < max; i++) {
      +  202  806
                   final String thisVersion = this.versionParts.get(i);
      +  203  806
                   final String otherVersion = version.getVersionParts().get(i);
      +  204  806
                   if (i >= 3) {
      +  205  2
                       if (thisVersion.compareToIgnoreCase(otherVersion) >= 0) {
      +  206  1
                           ret = false;
      +  207  1
                           break;
      +  208   +
                       }
      +  209  804
                   } else if (!thisVersion.equals(otherVersion)) {
      +  210  356
                       ret = false;
      +  211  356
                       break;
      +  212   +
                   }
      +  213   +
               }
      +  214   +
       
      +  215  423
               return ret;
      +  216   +
           }
      +  217   +
       
      +  218   +
           @Override
      +  219   +
           public int compareTo(DependencyVersion version) {
      +  220  30
               if (version == null) {
      +  221  0
                   return 1;
      +  222   +
               }
      +  223  30
               final List<String> left = this.getVersionParts();
      +  224  30
               final List<String> right = version.getVersionParts();
      +  225  30
               final int max = left.size() < right.size() ? left.size() : right.size();
      +  226   +
       
      +  227  76
               for (int i = 0; i < max; i++) {
      +  228  66
                   final String lStr = left.get(i);
      +  229  66
                   final String rStr = right.get(i);
      +  230  66
                   if (lStr.equals(rStr)) {
      +  231  46
                       continue;
      +  232   +
                   }
      +  233   +
                   try {
      +  234  20
                       final int l = Integer.parseInt(lStr);
      +  235  13
                       final int r = Integer.parseInt(rStr);
      +  236  12
                       if (l < r) {
      +  237  9
                           return -1;
      +  238  3
                       } else if (l > r) {
      +  239  3
                           return 1;
      +  240   +
                       }
      +  241  8
                   } catch (NumberFormatException ex) {
      +  242  8
                       final int comp = left.get(i).compareTo(right.get(i));
      +  243  8
                       if (comp < 0) {
      +  244  6
                           return -1;
      +  245  2
                       } else if (comp > 0) {
      +  246  2
                           return 1;
      +  247   +
                       }
      +  248  0
                   }
      +  249   +
               }
      +  250  10
               if (left.size() < right.size()) {
      +  251  3
                   return -1;
      +  252  7
               } else if (left.size() > right.size()) {
      +  253  3
                   return 1;
      +  254   +
               } else {
      +  255  4
                   return 0;
      +  256   +
               }
       257   +
           }
      +  258  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DependencyVersionUtil.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DependencyVersionUtil.html index 5ab98f91d..1c1c21af7 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DependencyVersionUtil.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.DependencyVersionUtil.html @@ -87,7 +87,7 @@
            * Regular expression to extract version numbers from file names.
       35  
            */
      -  36  8
           private static final Pattern RX_VERSION = Pattern.compile("\\d+(\\.\\d{1,6})+(\\.?([_-](release|beta|alpha|\\d+)|[a-zA-Z_-]{1,3}\\d{0,8}))?");
      +  36  1
           private static final Pattern RX_VERSION = Pattern.compile("\\d+(\\.\\d{1,6})+(\\.?([_-](release|beta|alpha|\\d+)|[a-zA-Z_-]{1,3}\\d{0,8}))?");
       37  
           /**
       38   @@ -96,7 +96,7 @@
            * are missing a version number using the previous regex.
       40  
            */
      -  41  8
           private static final Pattern RX_SINGLE_VERSION = Pattern.compile("\\d+(\\.?([_-](release|beta|alpha)|[a-zA-Z_-]{1,3}\\d{1,8}))?");
      +  41  1
           private static final Pattern RX_SINGLE_VERSION = Pattern.compile("\\d+(\\.?([_-](release|beta|alpha)|[a-zA-Z_-]{1,3}\\d{1,8}))?");
       42  
       
       43   @@ -131,60 +131,60 @@
            */
       59  
           public static DependencyVersion parseVersion(String text) {
      -  60  7832
               if (text == null) {
      +  60  979
               if (text == null) {
       61  0
                   return null;
       62  
               }
       63  
               //'-' is a special case used within the CVE entries, just include it as the version.
      -  64  7832
               if ("-".equals(text)) {
      -  65  8
                   final DependencyVersion dv = new DependencyVersion();
      -  66  8
                   final List<String> list = new ArrayList<String>();
      -  67  8
                   list.add(text);
      -  68  8
                   dv.setVersionParts(list);
      -  69  8
                   return dv;
      +  64  979
               if ("-".equals(text)) {
      +  65  1
                   final DependencyVersion dv = new DependencyVersion();
      +  66  1
                   final List<String> list = new ArrayList<String>();
      +  67  1
                   list.add(text);
      +  68  1
                   dv.setVersionParts(list);
      +  69  1
                   return dv;
       70  
               }
      -  71  7824
               String version = null;
      -  72  7824
               Matcher matcher = RX_VERSION.matcher(text);
      -  73  7824
               if (matcher.find()) {
      -  74  7792
                   version = matcher.group();
      +  71  978
               String version = null;
      +  72  978
               Matcher matcher = RX_VERSION.matcher(text);
      +  73  978
               if (matcher.find()) {
      +  74  974
                   version = matcher.group();
       75  
               }
       76  
               //throw away the results if there are two things that look like version numbers
      -  77  7824
               if (matcher.find()) {
      -  78  16
                   return null;
      +  77  978
               if (matcher.find()) {
      +  78  2
                   return null;
       79  
               }
      -  80  7808
               if (version == null) {
      -  81  32
                   matcher = RX_SINGLE_VERSION.matcher(text);
      -  82  32
                   if (matcher.find()) {
      -  83  16
                       version = matcher.group();
      +  80  976
               if (version == null) {
      +  81  4
                   matcher = RX_SINGLE_VERSION.matcher(text);
      +  82  4
                   if (matcher.find()) {
      +  83  2
                       version = matcher.group();
       84  
                   } else {
      -  85  16
                       return null;
      +  85  2
                       return null;
       86  
                   }
       87  
                   //throw away the results if there are two things that look like version numbers
      -  88  16
                   if (matcher.find()) {
      -  89  8
                       return null;
      +  88  2
                   if (matcher.find()) {
      +  89  1
                       return null;
       90  
                   }
       91  
               }
      -  92  7784
               if (version != null && version.endsWith("-py2") && version.length() > 4) {
      -  93  8
                   version = version.substring(0, version.length() - 4);
      +  92  973
               if (version != null && version.endsWith("-py2") && version.length() > 4) {
      +  93  1
                   version = version.substring(0, version.length() - 4);
       94  
               }
      -  95  7784
               return new DependencyVersion(version);
      +  95  973
               return new DependencyVersion(version);
       96  
           }
       97  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.ExtractionUtil.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.ExtractionUtil.html index 39b2f70fd..a6dc3915c 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.ExtractionUtil.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.ExtractionUtil.html @@ -12,7 +12,7 @@
       
      - +
      Classes in this File Line Coverage Branch Coverage Complexity
      ExtractionUtil
      34%
      41/119
      31%
      12/38
      6
      ExtractionUtil
      30%
      33/110
      27%
      10/36
      6.5
       
      @@ -58,454 +58,409 @@  20  
       import java.io.BufferedInputStream;
       21   -
       import java.io.BufferedOutputStream;
      -  22  
       import java.io.Closeable;
      -  23   +  22  
       import java.io.File;
      -  24   +  23  
       import java.io.FileInputStream;
      -  25   +  24  
       import java.io.FileNotFoundException;
      -  26   +  25  
       import java.io.FileOutputStream;
      -  27   +  26  
       import java.io.FilenameFilter;
      -  28   +  27  
       import java.io.IOException;
      -  29   -
       import java.io.InputStream;
      -  30   +  28  
       import java.util.zip.ZipEntry;
      -  31   +  29  
       import java.util.zip.ZipInputStream;
      -  32   +  30  
       
      -  33   +  31  
       import org.apache.commons.compress.archivers.ArchiveEntry;
      -  34   +  32  
       import org.apache.commons.compress.archivers.ArchiveInputStream;
      -  35   +  33  
       import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
      -  36   +  34   +
       import org.apache.commons.compress.utils.IOUtils;
      +  35  
       import org.owasp.dependencycheck.Engine;
      -  37   +  36  
       import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
      -  38   +  37  
       import org.owasp.dependencycheck.analyzer.exception.ArchiveExtractionException;
      -  39   +  38  
       import org.slf4j.Logger;
      -  40   +  39  
       import org.slf4j.LoggerFactory;
      +  40   +
       
       41   -
       
      -  42  
       /**
      -  43   +  42  
        * Set of utilities to extract files from archives.
      -  44   +  43  
        *
      -  45   +  44  
        * @author Jeremy Long
      -  46   +  45  
        */
      -  47   +  46  
       public final class ExtractionUtil {
      -  48   +  47  
       
      -  49   +  48  
           /**
      -  50   +  49  
            * The logger.
      -  51   +  50  
            */
      -  52  8
           private static final Logger LOGGER = LoggerFactory.getLogger(ExtractionUtil.class);
      +  51  1
           private static final Logger LOGGER = LoggerFactory.getLogger(ExtractionUtil.class);
      +  52   +
       
       53  
           /**
       54   -
            * The buffer size to use when extracting files from the archive.
      +
            * Private constructor for a utility class.
       55  
            */
      -  56   -
           private static final int BUFFER_SIZE = 4096;
      -  57   -
       
      +  56  0
           private ExtractionUtil() {
      +  57  0
           }
       58   -
           /**
      +
       
       59   -
            * Private constructor for a utility class.
      +
           /**
       60   -
            */
      -  61  0
           private ExtractionUtil() {
      -  62  0
           }
      +
            * Extracts the contents of an archive into the specified directory.
      +  61   +
            *
      +  62   +
            * @param archive an archive file such as a WAR or EAR
       63   -
       
      +
            * @param extractTo a directory to extract the contents to
       64   -
           /**
      -  65   -
            * Extracts the contents of an archive into the specified directory.
      -  66   -
            *
      -  67   -
            * @param archive an archive file such as a WAR or EAR
      -  68   -
            * @param extractTo a directory to extract the contents to
      -  69  
            * @throws ExtractionException thrown if an exception occurs while extracting the files
      -  70   +  65  
            */
      -  71   +  66  
           public static void extractFiles(File archive, File extractTo) throws ExtractionException {
      -  72  0
               extractFiles(archive, extractTo, null);
      -  73  0
           }
      -  74   +  67  0
               extractFiles(archive, extractTo, null);
      +  68  0
           }
      +  69  
       
      -  75   +  70  
           /**
      -  76   +  71  
            * Extracts the contents of an archive into the specified directory. The files are only extracted if they are supported by the
      -  77   +  72  
            * analyzers loaded into the specified engine. If the engine is specified as null then all files are extracted.
      -  78   +  73  
            *
      -  79   +  74  
            * @param archive an archive file such as a WAR or EAR
      -  80   +  75  
            * @param extractTo a directory to extract the contents to
      -  81   +  76  
            * @param engine the scanning engine
      -  82   +  77  
            * @throws ExtractionException thrown if there is an error extracting the files
      -  83   +  78  
            */
      -  84   +  79  
           public static void extractFiles(File archive, File extractTo, Engine engine) throws ExtractionException {
      -  85  0
               if (archive == null || extractTo == null) {
      -  86  0
                   return;
      +  80  0
               if (archive == null || extractTo == null) {
      +  81  0
                   return;
      +  82   +
               }
      +  83   +
       
      +  84  0
               FileInputStream fis = null;
      +  85  0
               ZipInputStream zis = null;
      +  86   +
       
       87   -
               }
      -  88   -
       
      -  89  0
               FileInputStream fis = null;
      -  90  0
               ZipInputStream zis = null;
      -  91   -
       
      -  92  
               try {
      -  93  0
                   fis = new FileInputStream(archive);
      -  94  0
               } catch (FileNotFoundException ex) {
      -  95  0
                   LOGGER.debug("", ex);
      -  96  0
                   throw new ExtractionException("Archive file was not found.", ex);
      -  97  0
               }
      -  98  0
               zis = new ZipInputStream(new BufferedInputStream(fis));
      -  99   +  88  0
                   fis = new FileInputStream(archive);
      +  89  0
               } catch (FileNotFoundException ex) {
      +  90  0
                   LOGGER.debug("", ex);
      +  91  0
                   throw new ExtractionException("Archive file was not found.", ex);
      +  92  0
               }
      +  93  0
               zis = new ZipInputStream(new BufferedInputStream(fis));
      +  94  
               ZipEntry entry;
      -  100   +  95  
               try {
      -  101  0
                   while ((entry = zis.getNextEntry()) != null) {
      -  102  0
                       if (entry.isDirectory()) {
      -  103  0
                           final File d = new File(extractTo, entry.getName());
      -  104  0
                           if (!d.exists() && !d.mkdirs()) {
      -  105  0
                               final String msg = String.format("Unable to create '%s'.", d.getAbsolutePath());
      -  106  0
                               throw new ExtractionException(msg);
      +  96  0
                   while ((entry = zis.getNextEntry()) != null) {
      +  97  0
                       if (entry.isDirectory()) {
      +  98  0
                           final File d = new File(extractTo, entry.getName());
      +  99  0
                           if (!d.exists() && !d.mkdirs()) {
      +  100  0
                               final String msg = String.format("Unable to create '%s'.", d.getAbsolutePath());
      +  101  0
                               throw new ExtractionException(msg);
      +  102   +
                           }
      +  103  0
                       } else {
      +  104  0
                           final File file = new File(extractTo, entry.getName());
      +  105  0
                           if (engine == null || engine.accept(file)) {
      +  106  0
                               FileOutputStream fos = null;
       107   -
                           }
      -  108  0
                       } else {
      -  109  0
                           final File file = new File(extractTo, entry.getName());
      -  110  0
                           if (engine == null || engine.accept(file)) {
      -  111  0
                               BufferedOutputStream bos = null;
      -  112   -
                               FileOutputStream fos;
      -  113  
                               try {
      -  114  0
                                   fos = new FileOutputStream(file);
      -  115  0
                                   bos = new BufferedOutputStream(fos, BUFFER_SIZE);
      -  116  0
                                   transferUsingBuffer(zis, bos);
      -  117  0
                               } catch (FileNotFoundException ex) {
      -  118  0
                                   LOGGER.debug("", ex);
      -  119  0
                                   final String msg = String.format("Unable to find file '%s'.", file.getName());
      -  120  0
                                   throw new ExtractionException(msg, ex);
      -  121  0
                               } catch (IOException ex) {
      -  122  0
                                   LOGGER.debug("", ex);
      -  123  0
                                   final String msg = String.format("IO Exception while parsing file '%s'.", file.getName());
      -  124  0
                                   throw new ExtractionException(msg, ex);
      -  125   +  108  0
                                   fos = new FileOutputStream(file);
      +  109  0
                                   IOUtils.copy(zis, fos);
      +  110  0
                               } catch (FileNotFoundException ex) {
      +  111  0
                                   LOGGER.debug("", ex);
      +  112  0
                                   final String msg = String.format("Unable to find file '%s'.", file.getName());
      +  113  0
                                   throw new ExtractionException(msg, ex);
      +  114  0
                               } catch (IOException ex) {
      +  115  0
                                   LOGGER.debug("", ex);
      +  116  0
                                   final String msg = String.format("IO Exception while parsing file '%s'.", file.getName());
      +  117  0
                                   throw new ExtractionException(msg, ex);
      +  118  
                               } finally {
      -  126  0
                                   closeStream(bos);
      -  127  0
                               }
      +  119  0
                                   closeStream(fos);
      +  120  0
                               }
      +  121   +
                           }
      +  122  0
                       }
      +  123   +
                   }
      +  124  0
               } catch (IOException ex) {
      +  125  0
                   final String msg = String.format("Exception reading archive '%s'.", archive.getName());
      +  126  0
                   LOGGER.debug("", ex);
      +  127  0
                   throw new ExtractionException(msg, ex);
       128   -
                           }
      -  129  0
                       }
      -  130   -
                   }
      -  131  0
               } catch (IOException ex) {
      -  132  0
                   final String msg = String.format("Exception reading archive '%s'.", archive.getName());
      -  133  0
                   LOGGER.debug("", ex);
      -  134  0
                   throw new ExtractionException(msg, ex);
      -  135  
               } finally {
      -  136  0
                   closeStream(zis);
      -  137  0
               }
      -  138  0
           }
      -  139   +  129  0
                   closeStream(zis);
      +  130  0
               }
      +  131  0
           }
      +  132  
       
      -  140   +  133  
           /**
      -  141   +  134  
            * Extracts the contents of an archive into the specified directory.
      -  142   +  135  
            *
      -  143   +  136  
            * @param archive an archive file such as a WAR or EAR
      -  144   +  137  
            * @param destination a directory to extract the contents to
      -  145   +  138  
            * @param filter determines which files get extracted
      -  146   +  139  
            * @throws ExtractionException thrown if the archive is not found
      -  147   +  140  
            */
      -  148   +  141  
           public static void extractFilesUsingFilter(File archive, File destination,
      -  149   +  142  
                   FilenameFilter filter) throws ExtractionException {
      -  150  24
               if (archive == null || destination == null) {
      -  151  0
                   return;
      -  152   +  143  3
               if (archive == null || destination == null) {
      +  144  0
                   return;
      +  145  
               }
      -  153   +  146  
       
      -  154  24
               FileInputStream fis = null;
      -  155   +  147  3
               FileInputStream fis = null;
      +  148  
               try {
      -  156  24
                   fis = new FileInputStream(archive);
      -  157  0
               } catch (FileNotFoundException ex) {
      -  158  0
                   LOGGER.debug("", ex);
      -  159  0
                   throw new ExtractionException("Archive file was not found.", ex);
      -  160  24
               }
      -  161   +  149  3
                   fis = new FileInputStream(archive);
      +  150  0
               } catch (FileNotFoundException ex) {
      +  151  0
                   LOGGER.debug("", ex);
      +  152  0
                   throw new ExtractionException("Archive file was not found.", ex);
      +  153  3
               }
      +  154  
               try {
      -  162  24
                   extractArchive(new ZipArchiveInputStream(new BufferedInputStream(
      -  163   +  155  3
                   extractArchive(new ZipArchiveInputStream(new BufferedInputStream(
      +  156  
                           fis)), destination, filter);
      -  164  0
               } catch (ArchiveExtractionException ex) {
      -  165  0
                   LOGGER.warn("Exception extracting archive '{}'.", archive.getName());
      -  166  0
                   LOGGER.debug("", ex);
      -  167   +  157  0
               } catch (ArchiveExtractionException ex) {
      +  158  0
                   LOGGER.warn("Exception extracting archive '{}'.", archive.getName());
      +  159  0
                   LOGGER.debug("", ex);
      +  160  
               } finally {
      -  168  0
                   try {
      -  169  24
                       fis.close();
      -  170  0
                   } catch (IOException ex) {
      -  171  0
                       LOGGER.debug("", ex);
      -  172  24
                   }
      -  173  0
               }
      -  174  24
           }
      -  175   +  161  0
                   try {
      +  162  3
                       fis.close();
      +  163  0
                   } catch (IOException ex) {
      +  164  0
                       LOGGER.debug("", ex);
      +  165  3
                   }
      +  166  0
               }
      +  167  3
           }
      +  168  
       
      -  176   +  169  
           /**
      -  177   +  170  
            * Extracts files from an archive.
      -  178   +  171  
            *
      -  179   +  172  
            * @param input the archive to extract files from
      -  180   +  173  
            * @param destination the location to write the files too
      -  181   +  174  
            * @param filter determines which files get extracted
      -  182   +  175  
            * @throws ArchiveExtractionException thrown if there is an exception extracting files from the archive
      -  183   +  176  
            */
      -  184   +  177  
           private static void extractArchive(ArchiveInputStream input,
      -  185   +  178  
                   File destination, FilenameFilter filter)
      -  186   +  179  
                   throws ArchiveExtractionException {
      -  187   +  180  
               ArchiveEntry entry;
      -  188   +  181  
               try {
      -  189  288
                   while ((entry = input.getNextEntry()) != null) {
      -  190  264
                       if (entry.isDirectory()) {
      -  191  0
                           final File dir = new File(destination, entry.getName());
      -  192  0
                           if (!dir.exists()) {
      -  193  0
                               if (!dir.mkdirs()) {
      -  194  0
                                   final String msg = String.format(
      -  195   +  182  36
                   while ((entry = input.getNextEntry()) != null) {
      +  183  33
                       if (entry.isDirectory()) {
      +  184  0
                           final File dir = new File(destination, entry.getName());
      +  185  0
                           if (!dir.exists()) {
      +  186  0
                               if (!dir.mkdirs()) {
      +  187  0
                                   final String msg = String.format(
      +  188  
                                           "Unable to create directory '%s'.",
      -  196   +  189  
                                           dir.getAbsolutePath());
      -  197  0
                                   throw new AnalysisException(msg);
      -  198   +  190  0
                                   throw new AnalysisException(msg);
      +  191  
                               }
      -  199   +  192  
                           }
      -  200  0
                       } else {
      -  201  264
                           extractFile(input, destination, filter, entry);
      -  202   +  193  0
                       } else {
      +  194  33
                           extractFile(input, destination, filter, entry);
      +  195  
                       }
      -  203   +  196  
                   }
      -  204  0
               } catch (IOException ex) {
      -  205  0
                   throw new ArchiveExtractionException(ex);
      -  206  0
               } catch (Throwable ex) {
      -  207  0
                   throw new ArchiveExtractionException(ex);
      -  208   +  197  0
               } catch (IOException ex) {
      +  198  0
                   throw new ArchiveExtractionException(ex);
      +  199  0
               } catch (Throwable ex) {
      +  200  0
                   throw new ArchiveExtractionException(ex);
      +  201  
               } finally {
      -  209  24
                   closeStream(input);
      -  210  24
               }
      -  211  24
           }
      -  212   +  202  3
                   closeStream(input);
      +  203  3
               }
      +  204  3
           }
      +  205  
       
      -  213   +  206  
           /**
      -  214   +  207  
            * Extracts a file from an archive (input stream) and correctly builds the directory structure.
      -  215   +  208  
            *
      -  216   +  209  
            * @param input the archive input stream
      -  217   +  210  
            * @param destination where to write the file
      -  218   +  211  
            * @param filter the file filter to apply to the files being extracted
      -  219   +  212  
            * @param entry the entry from the archive to extract
      -  220   +  213  
            * @throws ExtractionException thrown if there is an error reading from the archive stream
      -  221   +  214  
            */
      -  222   +  215  
           private static void extractFile(ArchiveInputStream input, File destination,
      -  223   +  216  
                   FilenameFilter filter, ArchiveEntry entry) throws ExtractionException {
      -  224  264
               final File file = new File(destination, entry.getName());
      -  225  264
               if (filter.accept(file.getParentFile(), file.getName())) {
      -  226  24
                   LOGGER.debug("Extracting '{}'",
      -  227   +  217  33
               final File file = new File(destination, entry.getName());
      +  218  33
               if (filter.accept(file.getParentFile(), file.getName())) {
      +  219  3
                   LOGGER.debug("Extracting '{}'",
      +  220  
                           file.getPath());
      -  228  24
                   BufferedOutputStream bos = null;
      -  229  24
                   FileOutputStream fos = null;
      -  230   +  221  3
                   FileOutputStream fos = null;
      +  222  
                   try {
      -  231  24
                       createParentFile(file);
      -  232  24
                       fos = new FileOutputStream(file);
      -  233  24
                       bos = new BufferedOutputStream(fos, BUFFER_SIZE);
      -  234  24
                       transferUsingBuffer(input, bos);
      -  235  0
                   } catch (FileNotFoundException ex) {
      -  236  0
                       LOGGER.debug("", ex);
      -  237  0
                       final String msg = String.format("Unable to find file '%s'.",
      -  238   +  223  3
                       createParentFile(file);
      +  224  3
                       fos = new FileOutputStream(file);
      +  225  3
                       IOUtils.copy(input, fos);
      +  226  0
                   } catch (FileNotFoundException ex) {
      +  227  0
                       LOGGER.debug("", ex);
      +  228  0
                       final String msg = String.format("Unable to find file '%s'.",
      +  229  
                               file.getName());
      -  239  0
                       throw new ExtractionException(msg, ex);
      -  240  0
                   } catch (IOException ex) {
      -  241  0
                       LOGGER.debug("", ex);
      -  242  0
                       final String msg = String
      -  243   +  230  0
                       throw new ExtractionException(msg, ex);
      +  231  0
                   } catch (IOException ex) {
      +  232  0
                       LOGGER.debug("", ex);
      +  233  0
                       final String msg = String
      +  234  
                               .format("IO Exception while parsing file '%s'.",
      -  244   +  235  
                                       file.getName());
      -  245  0
                       throw new ExtractionException(msg, ex);
      -  246   +  236  0
                       throw new ExtractionException(msg, ex);
      +  237  
                   } finally {
      -  247  24
                       closeStream(bos);
      -  248  24
                       closeStream(fos);
      -  249  24
                   }
      -  250   +  238  3
                       closeStream(fos);
      +  239  3
                   }
      +  240  
               }
      -  251  264
           }
      -  252   +  241  33
           }
      +  242  
       
      -  253   +  243  
           /**
      -  254   -
            * Transfers data from one stream to another using a buffer.
      -  255   -
            *
      -  256   -
            * @param input the input stream
      -  257   -
            * @param bos the output stream
      -  258   -
            * @throws IOException thrown if there is an error reading/writing to the streams
      -  259   -
            */
      -  260   -
           private static void transferUsingBuffer(InputStream input,
      -  261   -
                   BufferedOutputStream bos) throws IOException {
      -  262   -
               int count;
      -  263  24
               final byte[] data = new byte[BUFFER_SIZE];
      -  264  48
               while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) {
      -  265  24
                   bos.write(data, 0, count);
      -  266   -
               }
      -  267  24
               bos.flush();
      -  268  24
           }
      -  269   -
       
      -  270   -
           /**
      -  271   +  244  
            * Closes the stream.
      -  272   +  245  
            *
      -  273   +  246  
            * @param stream the stream to close
      -  274   +  247  
            */
      -  275   +  248  
           private static void closeStream(Closeable stream) {
      -  276  72
               if (stream != null) {
      -  277   +  249  6
               if (stream != null) {
      +  250  
                   try {
      -  278  72
                       stream.close();
      -  279  0
                   } catch (IOException ex) {
      -  280  0
                       LOGGER.trace("", ex);
      -  281  72
                   }
      -  282   +  251  6
                       stream.close();
      +  252  0
                   } catch (IOException ex) {
      +  253  0
                       LOGGER.trace("", ex);
      +  254  6
                   }
      +  255  
               }
      -  283  72
           }
      -  284   +  256  6
           }
      +  257  
       
      -  285   +  258  
           /**
      -  286   +  259  
            * Ensures the parent path is correctly created on disk so that the file can be extracted to the correct location.
      -  287   +  260  
            *
      -  288   +  261  
            * @param file the file path
      -  289   +  262  
            * @throws ExtractionException thrown if the parent paths could not be created
      -  290   +  263  
            */
      -  291   +  264  
           private static void createParentFile(final File file)
      -  292   +  265  
                   throws ExtractionException {
      -  293  24
               final File parent = file.getParentFile();
      -  294  24
               if (!parent.isDirectory()) {
      -  295  24
                   if (!parent.mkdirs()) {
      -  296  0
                       final String msg = String.format(
      -  297   +  266  3
               final File parent = file.getParentFile();
      +  267  3
               if (!parent.isDirectory()) {
      +  268  3
                   if (!parent.mkdirs()) {
      +  269  0
                       final String msg = String.format(
      +  270  
                               "Unable to build directory '%s'.",
      -  298   +  271  
                               parent.getAbsolutePath());
      -  299  0
                       throw new ExtractionException(msg);
      -  300   +  272  0
                       throw new ExtractionException(msg);
      +  273  
                   }
      -  301   +  274  
               }
      -  302  24
           }
      -  303   +  275  3
           }
      +  276  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.FileFilterBuilder.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.FileFilterBuilder.html index 5c8625548..1b7dc6a48 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.FileFilterBuilder.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.FileFilterBuilder.html @@ -107,7 +107,7 @@
        * @see <a href="https://en.wikipedia.org/wiki/Builder_pattern">Builder pattern</a>
       45  
        */
      -  46  128
       public class FileFilterBuilder {
      +  46  19
       public class FileFilterBuilder {
       47  
       
       48   @@ -116,21 +116,21 @@
            * A set of filenames to filter.
       50  
            */
      -  51  128
           private final Set<String> filenames = new HashSet<String>();
      +  51  19
           private final Set<String> filenames = new HashSet<String>();
       52  
           /**
       53  
            * A set of extensions to filter.
       54  
            */
      -  55  128
           private final Set<String> extensions = new HashSet<String>();
      +  55  19
           private final Set<String> extensions = new HashSet<String>();
       56  
           /**
       57  
            * An array list of file filters.
       58  
            */
      -  59  128
           private final List<IOFileFilter> fileFilters = new ArrayList<IOFileFilter>();
      +  59  19
           private final List<IOFileFilter> fileFilters = new ArrayList<IOFileFilter>();
       60  
       
       61   @@ -145,7 +145,7 @@
            */
       66  
           public static FileFilterBuilder newInstance() {
      -  67  128
               return new FileFilterBuilder();
      +  67  19
               return new FileFilterBuilder();
       68  
           }
       69   @@ -164,8 +164,8 @@
            */
       76  
           public FileFilterBuilder addFilenames(String... names) {
      -  77  24
               filenames.addAll(Arrays.asList(names));
      -  78  24
               return this;
      +  77  6
               filenames.addAll(Arrays.asList(names));
      +  78  6
               return this;
       79  
           }
       80   @@ -184,7 +184,7 @@
            */
       87  
           public FileFilterBuilder addExtensions(String... extensions) {
      -  88  112
               return this.addExtensions(Arrays.asList(extensions));
      +  88  15
               return this.addExtensions(Arrays.asList(extensions));
       89  
           }
       90   @@ -203,12 +203,12 @@
            */
       97  
           public FileFilterBuilder addExtensions(Iterable<String> extensions) {
      -  98  120
               for (String extension : extensions) {
      +  98  16
               for (String extension : extensions) {
       99  
                   // Ultimately, SuffixFileFilter will be used, and the "." needs to be explicit.
      -  100  272
                   this.extensions.add(extension.startsWith(".") ? extension : "." + extension);
      -  101  272
               }
      -  102  120
               return this;
      +  100  39
                   this.extensions.add(extension.startsWith(".") ? extension : "." + extension);
      +  101  39
               }
      +  102  16
               return this;
       103  
           }
       104   @@ -227,8 +227,8 @@
            */
       111  
           public FileFilterBuilder addFileFilters(IOFileFilter... filters) {
      -  112  8
               fileFilters.addAll(Arrays.asList(filters));
      -  113  8
               return this;
      +  112  1
               fileFilters.addAll(Arrays.asList(filters));
      +  113  1
               return this;
       114  
           }
       115   @@ -247,29 +247,29 @@
            */
       122  
           public FileFilter build() {
      -  123  128
               if (filenames.isEmpty() && extensions.isEmpty() && fileFilters.isEmpty()) {
      +  123  19
               if (filenames.isEmpty() && extensions.isEmpty() && fileFilters.isEmpty()) {
       124  0
                   throw new IllegalStateException("May only be invoked after at least one add... method has been invoked.");
       125  
               }
      -  126  128
               final OrFileFilter filter = new OrFileFilter();
      -  127  128
               if (!filenames.isEmpty()) {
      -  128  24
                   filter.addFileFilter(new NameFileFilter(new ArrayList<String>(filenames)));
      +  126  19
               final OrFileFilter filter = new OrFileFilter();
      +  127  19
               if (!filenames.isEmpty()) {
      +  128  6
                   filter.addFileFilter(new NameFileFilter(new ArrayList<String>(filenames)));
       129  
               }
      -  130  128
               if (!extensions.isEmpty()) {
      -  131  120
                   filter.addFileFilter(new SuffixFileFilter(new ArrayList<String>(extensions), IOCase.INSENSITIVE));
      +  130  19
               if (!extensions.isEmpty()) {
      +  131  16
                   filter.addFileFilter(new SuffixFileFilter(new ArrayList<String>(extensions), IOCase.INSENSITIVE));
       132  
               }
      -  133  128
               for (IOFileFilter iof : fileFilters) {
      -  134  16
                   filter.addFileFilter(iof);
      -  135  16
               }
      -  136  128
               return filter;
      +  133  19
               for (IOFileFilter iof : fileFilters) {
      +  134  2
                   filter.addFileFilter(iof);
      +  135  2
               }
      +  136  19
               return filter;
       137  
           }
       138  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.Filter.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.Filter.html index 6800228ab..e0dc56206 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.Filter.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.Filter.html @@ -47,7 +47,7 @@
        * https://plus.google.com/115403795880834599019/?rel=author
       14  
        */
      -  15  48
       public abstract class Filter<T> {
      +  15  6
       public abstract class Filter<T> {
       16  
       
       17   @@ -56,87 +56,95 @@
       
       19  
           public Iterator<T> filter(Iterator<T> iterator) {
      -  20  1144
               return new FilterIterator(iterator);
      +  20  143
               return new FilterIterator(iterator);
       21  
           }
       22  
       
       23  
           public Iterable<T> filter(final Iterable<T> iterable) {
      -  24  1144
               return new Iterable<T>() {
      +  24  143
               return new Iterable<T>() {
       25  
       
       26   +
                   @Override
      +  27  
                   public Iterator<T> iterator() {
      -  27  1144
                       return filter(iterable.iterator());
      -  28   -
                   }
      +  28  143
                       return filter(iterable.iterator());
       29   -
               };
      -  30   -
           }
      -  31   -
       
      -  32  48
           private class FilterIterator implements Iterator<T> {
      -  33   -
       
      -  34   -
               private final Iterator<T> iterator;
      -  35   -
               private T next;
      -  36   -
       
      -  37  1144
               private FilterIterator(Iterator<T> iterator) {
      -  38  1144
                   this.iterator = iterator;
      -  39  1144
                   toNext();
      -  40  1144
               }
      -  41   -
       
      -  42   -
               public boolean hasNext() {
      -  43  6360
                   return next != null;
      -  44   -
               }
      -  45   -
       
      -  46   -
               public T next() {
      -  47  5608
                   if (next == null) {
      -  48  0
                       throw new NoSuchElementException();
      -  49  
                   }
      -  50  5608
                   T returnValue = next;
      -  51  5608
                   toNext();
      -  52  5608
                   return returnValue;
      -  53   -
               }
      -  54   -
       
      -  55   -
               public void remove() {
      -  56  0
                   throw new UnsupportedOperationException();
      -  57   -
               }
      -  58   -
       
      -  59   -
               private void toNext() {
      -  60  6752
                   next = null;
      -  61  10840
                   while (iterator.hasNext()) {
      -  62  10080
                       T item = iterator.next();
      -  63  10080
                       if (item != null && passes(item)) {
      -  64  5992
                           next = item;
      -  65  5992
                           break;
      -  66   -
                       }
      -  67  4088
                   }
      -  68  6752
               }
      -  69   +  30   +
               };
      +  31  
           }
      +  32   +
       
      +  33  6
           private class FilterIterator implements Iterator<T> {
      +  34   +
       
      +  35   +
               private final Iterator<T> iterator;
      +  36   +
               private T next;
      +  37   +
       
      +  38  143
               private FilterIterator(Iterator<T> iterator) {
      +  39  143
                   this.iterator = iterator;
      +  40  143
                   toNext();
      +  41  143
               }
      +  42   +
       
      +  43   +
               @Override
      +  44   +
               public boolean hasNext() {
      +  45  795
                   return next != null;
      +  46   +
               }
      +  47   +
       
      +  48   +
               @Override
      +  49   +
               public T next() {
      +  50  701
                   if (next == null) {
      +  51  0
                       throw new NoSuchElementException();
      +  52   +
                   }
      +  53  701
                   T returnValue = next;
      +  54  701
                   toNext();
      +  55  701
                   return returnValue;
      +  56   +
               }
      +  57   +
       
      +  58   +
               @Override
      +  59   +
               public void remove() {
      +  60  0
                   throw new UnsupportedOperationException();
      +  61   +
               }
      +  62   +
       
      +  63   +
               private void toNext() {
      +  64  844
                   next = null;
      +  65  1355
                   while (iterator.hasNext()) {
      +  66  1260
                       T item = iterator.next();
      +  67  1260
                       if (item != null && passes(item)) {
      +  68  749
                           next = item;
      +  69  749
                           break;
       70   +
                       }
      +  71  511
                   }
      +  72  844
               }
      +  73   +
           }
      +  74  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.NonClosingStream.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.NonClosingStream.html index 4274d2da3..c4ea60645 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.NonClosingStream.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.NonClosingStream.html @@ -110,6 +110,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.Pair.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.Pair.html index d8cb80267..bf1947e1d 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.Pair.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.Pair.html @@ -97,17 +97,17 @@
            * @param right the value for the right pair
       41  
            */
      -  42  201178
           public Pair(L left, R right) {
      -  43  201178
               this.left = left;
      -  44  201178
               this.right = right;
      -  45  201178
           }
      +  42  25290
           public Pair(L left, R right) {
      +  43  25290
               this.left = left;
      +  44  25290
               this.right = right;
      +  45  25290
           }
       46  
           /**
       47  
            * The left element of the pair.
       48  
            */
      -  49  201178
           private L left = null;
      +  49  25290
           private L left = null;
       50  
       
       51   @@ -122,7 +122,7 @@
            */
       56  
           public L getLeft() {
      -  57  201178
               return left;
      +  57  25290
               return left;
       58  
           }
       59   @@ -147,7 +147,7 @@
            * The right element of the pair.
       70  
            */
      -  71  201178
           private R right = null;
      +  71  25290
           private R right = null;
       72  
       
       73   @@ -162,7 +162,7 @@
            */
       78  
           public R getRight() {
      -  79  201178
               return right;
      +  79  25290
               return right;
       80  
           }
       81   @@ -197,10 +197,10 @@
           @Override
       97  
           public int hashCode() {
      -  98  201274
               int hash = 3;
      -  99  201274
               hash = 53 * hash + (this.left != null ? this.left.hashCode() : 0);
      -  100  201274
               hash = 53 * hash + (this.right != null ? this.right.hashCode() : 0);
      -  101  201274
               return hash;
      +  98  25302
               int hash = 3;
      +  99  25302
               hash = 53 * hash + (this.left != null ? this.left.hashCode() : 0);
      +  100  25302
               hash = 53 * hash + (this.right != null ? this.right.hashCode() : 0);
      +  101  25302
               return hash;
       102  
           }
       103   @@ -245,6 +245,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.UrlStringUtils.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.UrlStringUtils.html index 0f1254540..2fcb7fab3 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.UrlStringUtils.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.utils.UrlStringUtils.html @@ -99,14 +99,14 @@
            * A regular expression to test if a string contains a URL.
       42  
            */
      -  43  8
           private static final Pattern CONTAINS_URL_TEST = Pattern.compile("^.*(ht|f)tps?://.*$", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
      +  43  1
           private static final Pattern CONTAINS_URL_TEST = Pattern.compile("^.*(ht|f)tps?://.*$", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
       44  
           /**
       45  
            * A regular expression to test if a string is a URL.
       46  
            */
      -  47  8
           private static final Pattern IS_URL_TEST = Pattern.compile("^(ht|f)tps?://.*", Pattern.CASE_INSENSITIVE);
      +  47  1
           private static final Pattern IS_URL_TEST = Pattern.compile("^(ht|f)tps?://.*", Pattern.CASE_INSENSITIVE);
       48  
       
       49   @@ -125,7 +125,7 @@
            */
       56  
           public static boolean containsUrl(String text) {
      -  57  154385
               return CONTAINS_URL_TEST.matcher(text).matches();
      +  57  21976
               return CONTAINS_URL_TEST.matcher(text).matches();
       58  
           }
       59   @@ -144,7 +144,7 @@
            */
       66  
           public static boolean isUrl(String text) {
      -  67  264
               return IS_URL_TEST.matcher(text).matches();
      +  67  33
               return IS_URL_TEST.matcher(text).matches();
       68  
           }
       69   @@ -153,7 +153,7 @@
            * A listing of domain parts that should not be used as evidence. Yes, this is an incomplete list.
       71  
            */
      -  72  8
           private static final Set<String> IGNORE_LIST = new HashSet<String>(
      +  72  1
           private static final Set<String> IGNORE_LIST = new HashSet<String>(
       73  
                   Arrays.asList("www", "com", "org", "gov", "info", "name", "net", "pro", "tel", "mobi", "xxx"));
       74   @@ -188,40 +188,40 @@
            */
       89  
           public static List<String> extractImportantUrlData(String text) throws MalformedURLException {
      -  90  200
               final List<String> importantParts = new ArrayList<String>();
      -  91  200
               final URL url = new URL(text);
      -  92  200
               final String[] domain = url.getHost().split("\\.");
      +  90  25
               final List<String> importantParts = new ArrayList<String>();
      +  91  25
               final URL url = new URL(text);
      +  92  25
               final String[] domain = url.getHost().split("\\.");
       93  
               //add the domain except www and the tld.
      -  94  576
               for (int i = 0; i < domain.length - 1; i++) {
      -  95  376
                   final String sub = domain[i];
      -  96  376
                   if (!IGNORE_LIST.contains(sub.toLowerCase())) {
      -  97  352
                       importantParts.add(sub);
      +  94  72
               for (int i = 0; i < domain.length - 1; i++) {
      +  95  47
                   final String sub = domain[i];
      +  96  47
                   if (!IGNORE_LIST.contains(sub.toLowerCase())) {
      +  97  44
                       importantParts.add(sub);
       98  
                   }
       99  
               }
      -  100  200
               final String document = url.getPath();
      -  101  200
               final String[] pathParts = document.split("[\\//]");
      -  102  352
               for (int i = 0; i < pathParts.length - 2; i++) {
      -  103  152
                   if (!pathParts[i].isEmpty()) {
      +  100  25
               final String document = url.getPath();
      +  101  25
               final String[] pathParts = document.split("[\\//]");
      +  102  44
               for (int i = 0; i < pathParts.length - 2; i++) {
      +  103  19
                   if (!pathParts[i].isEmpty()) {
       104  0
                       importantParts.add(pathParts[i]);
       105  
                   }
       106  
               }
      -  107  200
               if (pathParts.length > 0 && !pathParts[pathParts.length - 1].isEmpty()) {
      -  108  176
                   final String fileNameNoExt = pathParts[pathParts.length - 1].replaceAll("\\..*{0,5}$", "");
      -  109  176
                   importantParts.add(fileNameNoExt);
      +  107  25
               if (pathParts.length > 0 && !pathParts[pathParts.length - 1].isEmpty()) {
      +  108  22
                   final String fileNameNoExt = pathParts[pathParts.length - 1].replaceAll("\\..*{0,5}$", "");
      +  109  22
                   importantParts.add(fileNameNoExt);
       110  
               }
      -  111  200
               return importantParts;
      +  111  25
               return importantParts;
       112  
           }
       113  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.License.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.License.html index 9c773c872..a28e3f1eb 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.License.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.License.html @@ -89,12 +89,12 @@
            * @param url the license url
       37  
            */
      -  38  24
           public License(String name, String url) {
      -  39  24
               this.url = url;
      -  40  24
               this.name = name;
      +  38  3
           public License(String name, String url) {
      +  39  3
               this.url = url;
      +  40  3
               this.name = name;
       41  
       
      -  42  24
           }
      +  42  3
           }
       43  
       
       44   @@ -221,24 +221,24 @@
           @Override
       110  
           public boolean equals(Object obj) {
      -  111  8
               if (obj == null) {
      +  111  1
               if (obj == null) {
       112  0
                   return false;
       113  
               }
      -  114  8
               if (getClass() != obj.getClass()) {
      +  114  1
               if (getClass() != obj.getClass()) {
       115  0
                   return false;
       116  
               }
      -  117  8
               final License other = (License) obj;
      -  118  8
               if ((this.url == null) ? (other.url != null) : !this.url.equals(other.url)) {
      +  117  1
               final License other = (License) obj;
      +  118  1
               if ((this.url == null) ? (other.url != null) : !this.url.equals(other.url)) {
       119  0
                   return false;
       120  
               }
      -  121  8
               if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
      +  121  1
               if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
       122  0
                   return false;
       123  
               }
      -  124  8
               return true;
      +  124  1
               return true;
       125  
           }
       126   @@ -266,6 +266,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.Model.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.Model.html index 27fafc0c2..9558c8045 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.Model.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.Model.html @@ -73,7 +73,7 @@
        * @author jeremy
       28  
        */
      -  29  184
       public class Model {
      +  29  23
       public class Model {
       30  
       
       31   @@ -98,7 +98,7 @@
            */
       41  
           public String getName() {
      -  42  32
               return name;
      +  42  4
               return name;
       43  
           }
       44   @@ -115,8 +115,8 @@
            */
       50  
           public void setName(String name) {
      -  51  40
               this.name = name;
      -  52  40
           }
      +  51  5
               this.name = name;
      +  52  5
           }
       53  
       
       54   @@ -141,7 +141,7 @@
            */
       64  
           public String getOrganization() {
      -  65  16
               return organization;
      +  65  2
               return organization;
       66  
           }
       67   @@ -158,8 +158,8 @@
            */
       73  
           public void setOrganization(String organization) {
      -  74  16
               this.organization = organization;
      -  75  16
           }
      +  74  2
               this.organization = organization;
      +  75  2
           }
       76  
       
       77   @@ -184,7 +184,7 @@
            */
       87  
           public String getDescription() {
      -  88  16
               return description;
      +  88  2
               return description;
       89  
           }
       90   @@ -201,8 +201,8 @@
            */
       96  
           public void setDescription(String description) {
      -  97  24
               this.description = description;
      -  98  24
           }
      +  97  3
               this.description = description;
      +  98  3
           }
       99  
       
       100   @@ -227,7 +227,7 @@
            */
       110  
           public String getGroupId() {
      -  111  16
               return groupId;
      +  111  2
               return groupId;
       112  
           }
       113   @@ -244,8 +244,8 @@
            */
       119  
           public void setGroupId(String groupId) {
      -  120  32
               this.groupId = groupId;
      -  121  32
           }
      +  120  4
               this.groupId = groupId;
      +  121  4
           }
       122  
       
       123   @@ -270,7 +270,7 @@
            */
       133  
           public String getArtifactId() {
      -  134  16
               return artifactId;
      +  134  2
               return artifactId;
       135  
           }
       136   @@ -287,8 +287,8 @@
            */
       142  
           public void setArtifactId(String artifactId) {
      -  143  32
               this.artifactId = artifactId;
      -  144  32
           }
      +  143  4
               this.artifactId = artifactId;
      +  144  4
           }
       145  
       
       146   @@ -313,7 +313,7 @@
            */
       156  
           public String getVersion() {
      -  157  16
               return version;
      +  157  2
               return version;
       158  
           }
       159   @@ -330,8 +330,8 @@
            */
       165  
           public void setVersion(String version) {
      -  166  24
               this.version = version;
      -  167  24
           }
      +  166  3
               this.version = version;
      +  167  3
           }
       168  
       
       169   @@ -356,7 +356,7 @@
            */
       179  
           public String getParentGroupId() {
      -  180  16
               return parentGroupId;
      +  180  2
               return parentGroupId;
       181  
           }
       182   @@ -373,8 +373,8 @@
            */
       188  
           public void setParentGroupId(String parentGroupId) {
      -  189  24
               this.parentGroupId = parentGroupId;
      -  190  24
           }
      +  189  3
               this.parentGroupId = parentGroupId;
      +  190  3
           }
       191  
       
       192   @@ -399,7 +399,7 @@
            */
       202  
           public String getParentArtifactId() {
      -  203  16
               return parentArtifactId;
      +  203  2
               return parentArtifactId;
       204  
           }
       205   @@ -416,8 +416,8 @@
            */
       211  
           public void setParentArtifactId(String parentArtifactId) {
      -  212  24
               this.parentArtifactId = parentArtifactId;
      -  213  24
           }
      +  212  3
               this.parentArtifactId = parentArtifactId;
      +  213  3
           }
       214  
       
       215   @@ -442,7 +442,7 @@
            */
       225  
           public String getParentVersion() {
      -  226  16
               return parentVersion;
      +  226  2
               return parentVersion;
       227  
           }
       228   @@ -459,8 +459,8 @@
            */
       234  
           public void setParentVersion(String parentVersion) {
      -  235  24
               this.parentVersion = parentVersion;
      -  236  24
           }
      +  235  3
               this.parentVersion = parentVersion;
      +  236  3
           }
       237  
       
       238   @@ -469,7 +469,7 @@
            * The list of licenses.
       240  
            */
      -  241  184
           private List<License> licenses = new ArrayList<License>();
      +  241  23
           private List<License> licenses = new ArrayList<License>();
       242  
       
       243   @@ -484,7 +484,7 @@
            */
       248  
           public List<License> getLicenses() {
      -  249  40
               return licenses;
      +  249  5
               return licenses;
       250  
           }
       251   @@ -501,8 +501,8 @@
            */
       257  
           public void addLicense(License license) {
      -  258  16
               licenses.add(license);
      -  259  16
           }
      +  258  2
               licenses.add(license);
      +  259  2
           }
       260  
       
       261   @@ -517,22 +517,22 @@
            */
       266  
           public void processProperties(Properties properties) {
      -  267  16
               this.groupId = interpolateString(this.groupId, properties);
      -  268  16
               this.artifactId = interpolateString(this.artifactId, properties);
      -  269  16
               this.version = interpolateString(this.version, properties);
      -  270  16
               this.description = interpolateString(this.description, properties);
      -  271  16
               for (License l : this.getLicenses()) {
      +  267  2
               this.groupId = interpolateString(this.groupId, properties);
      +  268  2
               this.artifactId = interpolateString(this.artifactId, properties);
      +  269  2
               this.version = interpolateString(this.version, properties);
      +  270  2
               this.description = interpolateString(this.description, properties);
      +  271  2
               for (License l : this.getLicenses()) {
       272  0
                   l.setName(interpolateString(l.getName(), properties));
       273  0
                   l.setUrl(interpolateString(l.getUrl(), properties));
       274  0
               }
      -  275  16
               this.name = interpolateString(this.name, properties);
      -  276  16
               this.organization = interpolateString(this.organization, properties);
      -  277  16
               this.parentGroupId = interpolateString(this.parentGroupId, properties);
      -  278  16
               this.parentArtifactId = interpolateString(this.parentArtifactId, properties);
      -  279  16
               this.parentVersion = interpolateString(this.parentVersion, properties);
      +  275  2
               this.name = interpolateString(this.name, properties);
      +  276  2
               this.organization = interpolateString(this.organization, properties);
      +  277  2
               this.parentGroupId = interpolateString(this.parentGroupId, properties);
      +  278  2
               this.parentArtifactId = interpolateString(this.parentArtifactId, properties);
      +  279  2
               this.parentVersion = interpolateString(this.parentVersion, properties);
       280  
       
      -  281  16
           }
      +  281  2
           }
       282  
       
       283   @@ -589,40 +589,40 @@
            */
       309  
           public static String interpolateString(String text, Properties properties) {
      -  310  248
               final Properties props = properties;
      -  311  248
               if (text == null) {
      -  312  88
                   return text;
      +  310  31
               final Properties props = properties;
      +  311  31
               if (text == null) {
      +  312  11
                   return text;
       313  
               }
      -  314  160
               if (props == null) {
      -  315  48
                   return text;
      +  314  20
               if (props == null) {
      +  315  6
                   return text;
       316  
               }
       317  
       
      -  318  112
               final int pos = text.indexOf("${");
      -  319  112
               if (pos < 0) {
      -  320  64
                   return text;
      +  318  14
               final int pos = text.indexOf("${");
      +  319  14
               if (pos < 0) {
      +  320  8
                   return text;
       321  
               }
      -  322  48
               final int end = text.indexOf("}");
      -  323  48
               if (end < pos) {
      +  322  6
               final int end = text.indexOf("}");
      +  323  6
               if (end < pos) {
       324  0
                   return text;
       325  
               }
       326  
       
      -  327  48
               final String propName = text.substring(pos + 2, end);
      -  328  48
               String propValue = interpolateString(props.getProperty(propName), props);
      -  329  48
               if (propValue == null) {
      +  327  6
               final String propName = text.substring(pos + 2, end);
      +  328  6
               String propValue = interpolateString(props.getProperty(propName), props);
      +  329  6
               if (propValue == null) {
       330  0
                   propValue = "";
       331  
               }
      -  332  48
               final StringBuilder sb = new StringBuilder(propValue.length() + text.length());
      -  333  48
               sb.append(text.subSequence(0, pos));
      -  334  48
               sb.append(propValue);
      -  335  48
               sb.append(text.substring(end + 1));
      -  336  48
               return interpolateString(sb.toString(), props); //yes yes, this should be a loop...
      +  332  6
               final StringBuilder sb = new StringBuilder(propValue.length() + text.length());
      +  333  6
               sb.append(text.subSequence(0, pos));
      +  334  6
               sb.append(propValue);
      +  335  6
               sb.append(text.substring(end + 1));
      +  336  6
               return interpolateString(sb.toString(), props); //yes yes, this should be a loop...
       337  
           }
       338   @@ -631,6 +631,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomHandler.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomHandler.html index 0edc67b04..a07e791c6 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomHandler.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomHandler.html @@ -77,7 +77,7 @@
        * @author Jeremy Long
       30  
        */
      -  31  16
       public class PomHandler extends DefaultHandler {
      +  31  2
       public class PomHandler extends DefaultHandler {
       32  
       
       33   @@ -176,7 +176,7 @@
            * The pom model.
       80  
            */
      -  81  16
           private Model model = new Model();
      +  81  2
           private Model model = new Model();
       82  
       
       83   @@ -191,7 +191,7 @@
            */
       88  
           public Model getModel() {
      -  89  16
               return model;
      +  89  2
               return model;
       90  
           }
       91   @@ -200,14 +200,14 @@
            * The stack of elements processed; used to determine the parent node.
       93  
            */
      -  94  16
           private final Deque<String> stack = new ArrayDeque<String>();
      +  94  2
           private final Deque<String> stack = new ArrayDeque<String>();
       95  
           /**
       96  
            * The license object.
       97  
            */
      -  98  16
           private License license = null;
      +  98  2
           private License license = null;
       99  
       
       100   @@ -217,7 +217,7 @@  102  
            */
       103   -
           private StringBuffer currentText;
      +
           private StringBuilder currentText;
       104  
       
       105   @@ -242,13 +242,13 @@
           @Override
       115  
           public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
      -  116  3768
               currentText = new StringBuffer();
      -  117  3768
               stack.push(qName);
      -  118  3768
               if (LICENSE.equals(qName)) {
      +  116  471
               currentText = new StringBuilder();
      +  117  471
               stack.push(qName);
      +  118  471
               if (LICENSE.equals(qName)) {
       119  0
                   license = new License();
       120  
               }
      -  121  3768
           }
      +  121  471
           }
       122  
       
       123   @@ -271,33 +271,33 @@
           @Override
       132  
           public void endElement(String uri, String localName, String qName) throws SAXException {
      -  133  3768
               stack.pop();
      -  134  3768
               final String parentNode = stack.peek();
      -  135  3768
               if (PROJECT.equals(parentNode)) {
      -  136  232
                   if (GROUPID.equals(qName)) {
      -  137  16
                       model.setGroupId(currentText.toString());
      -  138  216
                   } else if (ARTIFACTID.equals(qName)) {
      -  139  16
                       model.setArtifactId(currentText.toString());
      -  140  200
                   } else if (VERSION.equals(qName)) {
      -  141  8
                       model.setVersion(currentText.toString());
      -  142  192
                   } else if (NAME.equals(qName)) {
      -  143  16
                       model.setName(currentText.toString());
      -  144  176
                   } else if (ORGANIZATION.equals(qName)) {
      +  133  471
               stack.pop();
      +  134  471
               final String parentNode = stack.peek();
      +  135  471
               if (PROJECT.equals(parentNode)) {
      +  136  29
                   if (GROUPID.equals(qName)) {
      +  137  2
                       model.setGroupId(currentText.toString());
      +  138  27
                   } else if (ARTIFACTID.equals(qName)) {
      +  139  2
                       model.setArtifactId(currentText.toString());
      +  140  25
                   } else if (VERSION.equals(qName)) {
      +  141  1
                       model.setVersion(currentText.toString());
      +  142  24
                   } else if (NAME.equals(qName)) {
      +  143  2
                       model.setName(currentText.toString());
      +  144  22
                   } else if (ORGANIZATION.equals(qName)) {
       145  0
                       model.setOrganization(currentText.toString());
      -  146  176
                   } else if (DESCRIPTION.equals(qName)) {
      -  147  8
                       model.setDescription(currentText.toString());
      +  146  22
                   } else if (DESCRIPTION.equals(qName)) {
      +  147  1
                       model.setDescription(currentText.toString());
       148  
                   }
      -  149  3536
               } else if (PARENT.equals(parentNode)) {
      -  150  24
                   if (GROUPID.equals(qName)) {
      -  151  8
                       model.setParentGroupId(currentText.toString());
      -  152  16
                   } else if (ARTIFACTID.equals(qName)) {
      -  153  8
                       model.setParentArtifactId(currentText.toString());
      -  154  8
                   } else if (VERSION.equals(qName)) {
      -  155  8
                       model.setParentVersion(currentText.toString());
      +  149  442
               } else if (PARENT.equals(parentNode)) {
      +  150  3
                   if (GROUPID.equals(qName)) {
      +  151  1
                       model.setParentGroupId(currentText.toString());
      +  152  2
                   } else if (ARTIFACTID.equals(qName)) {
      +  153  1
                       model.setParentArtifactId(currentText.toString());
      +  154  1
                   } else if (VERSION.equals(qName)) {
      +  155  1
                       model.setParentVersion(currentText.toString());
       156  
                   }
      -  157  3512
               } else if (LICENSE.equals(parentNode)) {
      +  157  439
               } else if (LICENSE.equals(parentNode)) {
       158  0
                   if (license != null) {
       159  0
                       if (NAME.equals(qName)) {
       160  0
                           license.setName(currentText.toString());
      @@ -311,7 +311,7 @@
                       //TODO add error logging
       166  
                   }
      -  167  3512
               } else if (LICENSES.equals(parentNode)) {
      +  167  439
               } else if (LICENSES.equals(parentNode)) {
       168  0
                   if (LICENSE.equals(qName)) {
       169  0
                       if (license != null) {
       170  0
                           model.addLicense(license);
      @@ -325,7 +325,7 @@
                   }
       175  
               }
      -  176  3768
           }
      +  176  471
           }
       177  
       
       178   @@ -348,12 +348,12 @@
           @Override
       187  
           public void characters(char[] ch, int start, int length) throws SAXException {
      -  188  7624
               currentText.append(ch, start, length);
      -  189  7624
           }
      +  188  953
               currentText.append(ch, start, length);
      +  189  953
           }
       190  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomParseException.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomParseException.html index ea44c9678..ac53de7af 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomParseException.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomParseException.html @@ -76,67 +76,77 @@  29  
           /**
       30   -
            * Creates a new SuppressionParseException.
      +
            * The serial version UID for serialization.
       31  
            */
       32   -
           public PomParseException() {
      -  33  0
               super();
      -  34  0
           }
      +
           private static final long serialVersionUID = 1L;
      +  33   +
       
      +  34   +
           /**
       35   -
       
      +
            * Creates a new SuppressionParseException.
       36   -
           /**
      +
            */
       37   -
            * Creates a new SuppressionParseException.
      -  38   -
            *
      -  39   -
            * @param msg a message for the exception.
      +
           public PomParseException() {
      +  38  0
               super();
      +  39  0
           }
       40   -
            */
      +
       
       41   -
           public PomParseException(String msg) {
      -  42  0
               super(msg);
      -  43  0
           }
      +
           /**
      +  42   +
            * Creates a new SuppressionParseException.
      +  43   +
            *
       44   -
       
      -  45   -
           /**
      -  46   -
            * Creates a new SuppressionParseException.
      -  47   -
            *
      -  48   -
            * @param ex the cause of the parse exception
      -  49   -
            */
      -  50   -
           public PomParseException(Throwable ex) {
      -  51  0
               super(ex);
      -  52  0
           }
      -  53   -
       
      -  54   -
           /**
      -  55   -
            * Creates a new SuppressionParseException.
      -  56   -
            *
      -  57  
            * @param msg a message for the exception.
      -  58   -
            * @param ex the cause of the parse exception
      -  59   +  45  
            */
      +  46   +
           public PomParseException(String msg) {
      +  47  0
               super(msg);
      +  48  0
           }
      +  49   +
       
      +  50   +
           /**
      +  51   +
            * Creates a new SuppressionParseException.
      +  52   +
            *
      +  53   +
            * @param ex the cause of the parse exception
      +  54   +
            */
      +  55   +
           public PomParseException(Throwable ex) {
      +  56  0
               super(ex);
      +  57  0
           }
      +  58   +
       
      +  59   +
           /**
       60   -
           public PomParseException(String msg, Throwable ex) {
      -  61  0
               super(msg, ex);
      -  62  0
           }
      +
            * Creates a new SuppressionParseException.
      +  61   +
            *
      +  62   +
            * @param msg a message for the exception.
       63   +
            * @param ex the cause of the parse exception
      +  64   +
            */
      +  65   +
           public PomParseException(String msg, Throwable ex) {
      +  66  0
               super(msg, ex);
      +  67  0
           }
      +  68  
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomParser.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomParser.html index 200923f77..30c4699d1 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomParser.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomParser.html @@ -99,7 +99,7 @@
        * @author Jeremy Long
       41  
        */
      -  42  16
       public class PomParser {
      +  42  2
       public class PomParser {
       43  
       
       44   @@ -108,7 +108,7 @@
            * The logger.
       46  
            */
      -  47  8
           private static final Logger LOGGER = LoggerFactory.getLogger(PomParser.class);
      +  47  1
           private static final Logger LOGGER = LoggerFactory.getLogger(PomParser.class);
       48  
       
       49   @@ -127,23 +127,23 @@
            */
       56  
           public Model parse(File file) throws PomParseException {
      -  57  8
               FileInputStream fis = null;
      +  57  1
               FileInputStream fis = null;
       58  
               try {
      -  59  8
                   fis = new FileInputStream(file);
      -  60  8
                   return parse(fis);
      +  59  1
                   fis = new FileInputStream(file);
      +  60  1
                   return parse(fis);
       61  0
               } catch (IOException ex) {
       62  0
                   LOGGER.debug("", ex);
       63  0
                   throw new PomParseException(ex);
       64  
               } finally {
      -  65  8
                   if (fis != null) {
      +  65  1
                   if (fis != null) {
       66  
                       try {
      -  67  8
                           fis.close();
      +  67  1
                           fis.close();
       68  0
                       } catch (IOException ex) {
       69  0
                           LOGGER.debug("Unable to close stream", ex);
      -  70  16
                       }
      +  70  2
                       }
       71  
                   }
       72   @@ -170,27 +170,27 @@
           public Model parse(InputStream inputStream) throws PomParseException {
       83  
               try {
      -  84  16
                   final PomHandler handler = new PomHandler();
      -  85  16
                   final SAXParserFactory factory = SAXParserFactory.newInstance();
      +  84  2
                   final PomHandler handler = new PomHandler();
      +  85  2
                   final SAXParserFactory factory = SAXParserFactory.newInstance();
       86  
       //            factory.setNamespaceAware(true);
       87  
       //            factory.setValidating(true);
      -  88  16
                   final SAXParser saxParser = factory.newSAXParser();
      -  89  16
                   final XMLReader xmlReader = saxParser.getXMLReader();
      -  90  16
                   xmlReader.setContentHandler(handler);
      +  88  2
                   final SAXParser saxParser = factory.newSAXParser();
      +  89  2
                   final XMLReader xmlReader = saxParser.getXMLReader();
      +  90  2
                   xmlReader.setContentHandler(handler);
       91  
       
      -  92  16
                   final Reader reader = new InputStreamReader(inputStream, "UTF-8");
      -  93  16
                   final InputSource in = new InputSource(reader);
      +  92  2
                   final Reader reader = new InputStreamReader(inputStream, "UTF-8");
      +  93  2
                   final InputSource in = new InputSource(reader);
       94  
                   //in.setEncoding("UTF-8");
       95  
       
      -  96  16
                   xmlReader.parse(in);
      +  96  2
                   xmlReader.parse(in);
       97  
       
      -  98  16
                   return handler.getModel();
      +  98  2
                   return handler.getModel();
       99  0
               } catch (ParserConfigurationException ex) {
       100  0
                   LOGGER.debug("", ex);
       101  0
                   throw new PomParseException(ex);
      @@ -211,6 +211,6 @@
       }
      - + diff --git a/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomUtils.html b/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomUtils.html index 130e47865..12a82fd14 100644 --- a/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomUtils.html +++ b/dependency-check-core/cobertura/org.owasp.dependencycheck.xml.pom.PomUtils.html @@ -101,7 +101,7 @@
            * The logger.
       43  
            */
      -  44  8
           private static final Logger LOGGER = LoggerFactory.getLogger(PomUtils.class);
      +  44  1
           private static final Logger LOGGER = LoggerFactory.getLogger(PomUtils.class);
       45  
       
       46   @@ -120,11 +120,11 @@
            */
       53  
           public static Model readPom(File file) throws AnalysisException {
      -  54  8
               Model model = null;
      +  54  1
               Model model = null;
       55  
               try {
      -  56  8
                   final PomParser parser = new PomParser();
      -  57  8
                   model = parser.parse(file);
      +  56  1
                   final PomParser parser = new PomParser();
      +  57  1
                   model = parser.parse(file);
       58  0
               } catch (PomParseException ex) {
       59  0
                   LOGGER.warn("Unable to parse pom '{}'", file.getPath());
       60  0
                   LOGGER.debug("", ex);
      @@ -137,8 +137,8 @@  67  0
                   LOGGER.warn("Unexpected error during parsing of the pom '{}'", file.getPath());
       68  0
                   LOGGER.debug("", ex);
       69  0
                   throw new AnalysisException(ex);
      -  70  8
               }
      -  71  8
               return model;
      +  70  1
               }
      +  71  1
               return model;
       72  
           }
       73   @@ -161,14 +161,14 @@
            */
       82  
           public static Model readPom(String path, JarFile jar) throws AnalysisException {
      -  83  8
               final ZipEntry entry = jar.getEntry(path);
      -  84  8
               Model model = null;
      -  85  8
               if (entry != null) { //should never be null
      +  83  1
               final ZipEntry entry = jar.getEntry(path);
      +  84  1
               Model model = null;
      +  85  1
               if (entry != null) { //should never be null
       86  
                   try {
      -  87  8
                       final PomParser parser = new PomParser();
      -  88  8
                       model = parser.parse(jar.getInputStream(entry));
      -  89  8
                       LOGGER.debug("Read POM {}", path);
      +  87  1
                       final PomParser parser = new PomParser();
      +  88  1
                       model = parser.parse(jar.getInputStream(entry));
      +  89  1
                       LOGGER.debug("Read POM {}", path);
       90  0
                   } catch (SecurityException ex) {
       91  0
                       LOGGER.warn("Unable to parse pom '{}' in jar '{}'; invalid signature", path, jar.getName());
       92  0
                       LOGGER.debug("", ex);
      @@ -181,10 +181,10 @@  99  0
                       LOGGER.warn("Unexpected error during parsing of the pom '{}' in jar '{}'", path, jar.getName());
       100  0
                       LOGGER.debug("", ex);
       101  0
                       throw new AnalysisException(ex);
      -  102  8
                   }
      +  102  1
                   }
       103  
               }
      -  104  8
               return model;
      +  104  1
               return model;
       105  
           }
       106   @@ -212,6 +212,6 @@
       }
      - + diff --git a/dependency-check-core/cpd.html b/dependency-check-core/cpd.html index c93f2f792..ccb8fb6a1 100644 --- a/dependency-check-core/cpd.html +++ b/dependency-check-core/cpd.html @@ -1,21 +1,21 @@ - + - dependency-check-core - CPD Results - + dependency-check-core – CPD Results + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
    • - + /
    • @@ -67,9 +67,9 @@ -
    • | Last Published: 2015-08-04
    • +
    • | Last Published: 2015-09-20
    • - Version: 1.3.0 + Version: 1.3.1
    @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    CPD Results

    -

    The following document contains the results of PMD's CPD 5.0.2.

    +

    CPD Results

    +

    The following document contains the results of PMD's CPD 5.3.2.

    -

    Duplications

    +

    Duplications

    - + - + - + - + - + - + - + - +
    File Line
    org\owasp\dependencycheck\data\update\CpeUpdater.java145
    147
    org\owasp\dependencycheck\data\update\nvd\DownloadTask.java247
    249
        }
    @@ -314,10 +321,10 @@
     
    Line
    org\owasp\dependencycheck\analyzer\JarAnalyzer.java888
    877
    org\owasp\dependencycheck\analyzer\PythonDistributionAnalyzer.java235
    235
        public void initializeFileTypeAnalyzer() throws Exception {
    @@ -361,10 +368,10 @@
     
    Line
    org\owasp\dependencycheck\analyzer\ArchiveAnalyzer.java173
    174
    org\owasp\dependencycheck\analyzer\JarAnalyzer.java887
    876
        @Override
    @@ -394,10 +401,10 @@
     
    Line
    org\owasp\dependencycheck\analyzer\ArchiveAnalyzer.java174
    175
    org\owasp\dependencycheck\analyzer\PythonDistributionAnalyzer.java235
    235
        public void initializeFileTypeAnalyzer() throws Exception {
    @@ -429,15 +436,14 @@
         
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/css/apache-maven-fluido-1.4.min.css b/dependency-check-core/css/apache-maven-fluido-1.4.min.css new file mode 100644 index 000000000..54a006744 --- /dev/null +++ b/dependency-check-core/css/apache-maven-fluido-1.4.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eeeeee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #dddddd #eee #eeeeee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eeeeee #eee #dddddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}.clear{clear:both;visibility:hidden}.clear hr{display:none}.section p,.section p,.section dt,.section dt{margin-right:7px;margin-left:7px}#ohloh{margin-bottom:10px}#poweredBy{text-align:center}a.externalLink{padding-right:18px}a.newWindow{background:url('../images/window-new.png') right center no-repeat;padding-right:18px}a.externalLink[href^=http]{background:url('../images/internet-web-browser.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".asc"]{background:url('../images/accessories-text-editor.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".jpg"],a.externalLink[href$=".jpeg"],a.externalLink[href$=".gif"],a.externalLink[href$=".png"]{background:url('../images/image-x-generic.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".tar.gz"],a.externalLink[href$=".zip"]{background:url('../images/package-x-generic.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".md5"],a.externalLink[href$=".sha1"]{background:url('../images/document-properties.png') right center no-repeat;padding-right:18px}a.externalLink[href^=https]{background:url('../images/application-certificate.png') right center no-repeat;padding-right:18px}a.externalLink[href^=file]{background:url('../images/drive-harddisk.png') right center no-repeat;padding-right:18px}a.externalLink[href^=ftp]{background:url('../images/network-server.png') right center no-repeat;padding-right:18px}a.externalLink[href^=mailto]{background:url('../images/contact-new.png') right center no-repeat;padding-right:18px}li.none{list-style:none}.search-query{background-image:url(http://www.google.com/cse/intl/en/images/google_custom_search_watermark.gif);background-attachment:initial;background-origin:initial;background-clip:initial;background-color:#fff;background-position:0 50%;background-repeat:no-repeat no-repeat;width:95%}body.topBarEnabled{padding-top:60px}body.topBarDisabled{padding-top:20px}.builtBy{display:block}img.builtBy{margin:10px auto}#search-form{margin-left:9px;margin-right:9px}.hero-unit h2{font-size:60px}tt{padding:0 3px 2px;font-family:Monaco,Andale Mono,Courier New,monospace;font-size:.9em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#fee9cc;color:rgba(0,0,0,0.75);padding:1px 3px}li{color:#404040}table.zebra-striped{background-color:#FFF}.footer{background-color:#EEE}.sidebar-nav{padding-left:0;padding-right:0}.sidebar-nav .icon-chevron-right,.sidebar-nav .icon-chevron-down{margin-top:2px;margin-right:-6px;float:right;opacity:.25}li.pull-right{margin-left:3px;margin-right:3px}.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0;padding-left:15px}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/dependency-check-core/dependency-analysis.html b/dependency-check-core/dependency-analysis.html new file mode 100644 index 000000000..a88d907c0 --- /dev/null +++ b/dependency-check-core/dependency-analysis.html @@ -0,0 +1,598 @@ + + + + + + + + + dependency-check-core – Dependencies Report + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +
    +

    Dependency Analysis

    +
    +

    Used and declared dependencies

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GroupIdArtifactIdVersionScopeClassifierTypeOptional
    com.google.code.findbugsannotations3.0.0compilejar
    org.slf4jslf4j-api1.7.12compilejarfalse
    org.owaspdependency-check-utils1.3.1compilejarfalse
    org.apache.lucenelucene-test-framework4.7.2testjarfalse
    org.jmockitjmockit1.19testjarfalse
    org.apache.commonscommons-compress1.10compilejarfalse
    commons-iocommons-io2.4compilejarfalse
    org.apache.commonscommons-lang33.4compilejarfalse
    org.apache.lucenelucene-core4.7.2compilejarfalse
    org.apache.lucenelucene-analyzers-common4.7.2compilejarfalse
    org.apache.lucenelucene-queryparser4.7.2compilejarfalse
    org.apache.velocityvelocity1.7compilejarfalse
    org.glassfishjavax.json1.0.4compilejarfalse
    org.jsoupjsoup1.8.3compilejarfalse
    com.sun.mailmailapi1.5.4compilejarfalse
    junitjunit4.12testjarfalse
    org.hamcresthamcrest-core1.3testjarfalse

    +
    +

    Used but undeclared dependencies

    + + + + + + + + + + + + + + + + + + + + + + + + +
    GroupIdArtifactIdVersionScopeClassifierTypeOptional
    xercesxmlParserAPIs2.6.0testjar
    xml-apisxml-apis1.3.04testjar

    +
    +

    Unused but declared dependencies

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GroupIdArtifactIdVersionScopeClassifierTypeOptional
    ch.qos.logbacklogback-classic1.1.3testjarfalse
    com.h2databaseh21.3.176runtimejarfalse
    org.apache.maven.scmmaven-scm-provider-cvsexe1.8.1testjar
    org.springframeworkspring-webmvc2.5.5testjar
    org.springframework.securityspring-security-web3.0.0.RELEASEtestjar
    com.hazelcasthazelcast2.5testjar
    net.sf.ehcacheehcache-core2.2.0testjar
    org.apache.strutsstruts2-core2.1.2testjar
    org.mortbay.jettyjetty6.1.0testjar
    org.apache.axis2axis2-spring1.4.1testjar
    org.apache.axis2axis2-adb1.4.1testjar
    org.apache.geronimo.daytraderdaytrader-ear2.1.7testear
    org.glassfish.main.adminguiwar4.0testwar
    org.dojotoolkitdojo-war1.3.0testwar
    org.apache.openjpaopenjpa2.0.1testjar
    com.google.injectguice3.0testjar
    org.springframework.retryspring-retry1.1.0.RELEASEtestjar
    uk.ltd.getaheaddwr1.1.1testjar

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-core/dependency-updates-report.html b/dependency-check-core/dependency-updates-report.html index 85b552add..3d11a3e9d 100644 --- a/dependency-check-core/dependency-updates-report.html +++ b/dependency-check-core/dependency-updates-report.html @@ -1,21 +1,21 @@ - + - dependency-check-core - Dependency Updates Report - + dependency-check-core – Dependency Updates Report + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Overview

    +

    Overview

    This report summarizes newer versions that may be available for your project's various dependencies.

    - + @@ -252,17 +259,17 @@ - + - +
    # of dependencies using the latest version available23
    28
    # of dependencies where the next version available is smaller than an incremental version update
    # of dependencies where the next version available is an incremental version update11
    6
    # of dependencies where the next version available is a minor version update13
    12
    # of dependencies where the next version available is a major version update 0
    -

    Dependency Management

    +

    Dependency Management

    @@ -325,28 +332,28 @@ - + - + - + - + - + - + @@ -362,18 +369,6 @@ - - - - - - - - - - - - @@ -384,35 +379,47 @@ - - + + - + - + + + + + + + + + + + + + - - - - + + + + - + - - + + @@ -566,6 +573,18 @@ + + + + + + + + + + + + @@ -576,31 +595,31 @@ - - + + - + - - + + - - + + - + - - + + - + @@ -612,33 +631,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -648,7 +643,7 @@ - + @@ -661,9 +656,9 @@
    Status1.4.177
    com.sun.mail mailapi1.5.21.5.4 jar 1.5.3
    commons-cli commons-cli1.21.3.1 jar 1.3
    commons-langcommons-lang2.6jar
    junit junit 4.12
    org.apache.ant ant1.9.51.9.6 jar 1.9.6
    org.apache.antant-testutil1.9.6jar
    org.apache.antant-testutil1.9.5org.apache.commonscommons-compress1.10 jar 1.9.6
    org.apache.commonscommons-compress1.9commons-lang33.4 jar
    org.glassfishjavax.json1.0.4jar
    org.hamcrest hamcrest-core 1.3
    org.jmockit jmockit1.161.19 test jar 1.17-beta11.17
    org.jsoup jsoup1.7.21.8.3 jar 1.7.31.8.1
    org.slf4j slf4j-api
    org.slf4jslf4j-ext1.7.12jar
    org.slf4jslf4j-jdk141.7.12jar
    org.slf4j slf4j-simple 1.7.12
    Status Group Id Artifact IdNext Minor Next Major
    -

    Dependencies

    +

    Dependencies

    - + @@ -675,7 +670,7 @@ - + @@ -687,7 +682,7 @@ - + @@ -699,7 +694,7 @@ - + @@ -711,7 +706,7 @@ - + @@ -723,7 +718,7 @@ - + @@ -735,7 +730,7 @@ - + @@ -747,7 +742,7 @@ - + @@ -759,7 +754,7 @@ - + @@ -771,7 +766,7 @@ - + @@ -783,7 +778,7 @@ - + @@ -795,7 +790,7 @@ - + @@ -807,7 +802,7 @@ - + @@ -819,11 +814,11 @@ - + - + @@ -831,7 +826,7 @@ - + @@ -843,7 +838,7 @@ - + @@ -855,7 +850,7 @@ - + @@ -867,7 +862,7 @@ - + @@ -879,7 +874,7 @@ - + @@ -892,34 +887,34 @@
    Status Group Id Artifact IdNext Incremental Next Minor Next Major
    com.google.inject guice 4.0-beta 4.0
    com.hazelcast hazelcast2.5.1 2.6 3.0
    net.sf.ehcache ehcache-core 2.3.0
    org.apache.axis2 axis2-adb 1.5
    org.apache.axis2 axis2-spring 1.5
    org.apache.geronimo.daytrader daytrader-ear
    org.apache.maven.scm maven-scm-provider-cvsexe 1.9
    org.apache.openjpa openjpa 2.1.0
    org.apache.struts struts2-core2.1.6 2.2.1
    org.dojotoolkit dojo-war1.3.1 1.4.2
    org.glassfish.main.admingui war 4.1
    org.mortbay.jetty jetty6.1.17
    org.owasp dependency-check-utils1.3.01.3.1 compile jar
    org.springframework spring-webmvc2.5.6 3.0.0.RELEASE
    org.springframework.retry spring-retry1.1.1.RELEASE
    org.springframework.security spring-security-web3.0.1.RELEASE 3.1.0.RELEASE 4.0.0.RELEASE
    uk.ltd.getahead dwr
    Status Group Id Artifact IdNext Minor Next Major
    -

    Dependency Updates

    +

    Dependency Updates

    -

    ch.qos.logback:logback-classic

    +

    ch.qos.logback:logback-classic

    - + - + - + - + - + - + - +
    Status  No newer versions available.
    Group Id ch.qos.logback
    Artifact Id logback-classic
    Current Version 1.1.3
    Scope
    Classifier
    Type jar
    -

    ch.qos.logback:logback-core

    +

    ch.qos.logback:logback-core

    @@ -943,7 +938,7 @@
    StatusType jar
    -

    com.google.code.findbugs:annotations

    +

    com.google.code.findbugs:annotations

    @@ -967,7 +962,7 @@
    StatusType jar
    -

    com.google.inject:guice

    +

    com.google.inject:guice

    @@ -994,7 +989,7 @@
    StatusNewer versions 4.0-beta Next Minor
    4.0-beta4
    4.0-beta5 Latest Minor
    4.0 Next Major
    -

    com.h2database:h2

    +

    com.h2database:h2

    @@ -1019,9 +1014,9 @@ -
    Statusjar
    Newer versions1.4.177 Next Minor
    1.4.178
    1.4.179
    1.4.180
    1.4.181
    1.4.182
    1.4.183
    1.4.184
    1.4.185
    1.4.186
    1.4.187 Latest Minor
    +
    1.4.177 Next Minor
    1.4.178
    1.4.179
    1.4.180
    1.4.181
    1.4.182
    1.4.183
    1.4.184
    1.4.185
    1.4.186
    1.4.187
    1.4.188
    1.4.189 Latest Minor
    -

    com.hazelcast:hazelcast

    +

    com.hazelcast:hazelcast

    @@ -1046,13 +1041,13 @@ -
    Statusjar
    Newer versions2.5.1 Next Incremental
    2.6 Next Minor
    2.6.1
    2.6.2
    2.6.3
    2.6.4
    2.6.5
    2.6.6
    2.6.7
    2.6.8
    2.6.9
    3.0-RC1
    3.0-RC2 Latest Minor
    3.0 Next Major
    3.0.1
    3.0.2
    3.0.3
    3.1
    3.1.1
    3.1.2
    3.1.3
    3.1.4
    3.1.5
    3.1.6
    3.1.7
    3.1.8
    3.2-RC1
    3.2-RC2
    3.2
    3.2.1
    3.2.2
    3.2.3
    3.2.4
    3.2.5
    3.2.6
    3.3-RC1
    3.3-RC2
    3.3-RC3
    3.3
    3.3-EA
    3.3-EA2
    3.3.1
    3.3.2
    3.3.3
    3.3.4
    3.3.5
    3.4
    3.4-EA
    3.4.1
    3.4.2
    3.4.5
    3.5-EA
    3.5.1 Latest Major
    +2.5.1 Next Incremental
    2.6 Next Minor
    2.6.1
    2.6.2
    2.6.3
    2.6.4
    2.6.5
    2.6.6
    2.6.7
    2.6.8
    2.6.9
    3.0-RC1
    3.0-RC2 Latest Minor
    3.0 Next Major
    3.0.1
    3.0.2
    3.0.3
    3.1
    3.1.1
    3.1.2
    3.1.3
    3.1.4
    3.1.5
    3.1.6
    3.1.7
    3.1.8
    3.2-RC1
    3.2-RC2
    3.2
    3.2.1
    3.2.2
    3.2.3
    3.2.4
    3.2.5
    3.2.6
    3.3-RC1
    3.3-RC2
    3.3-RC3
    3.3
    3.3-EA
    3.3-EA2
    3.3.1
    3.3.2
    3.3.3
    3.3.4
    3.3.5
    3.4
    3.4-EA
    3.4.1
    3.4.2
    3.4.5
    3.4.6
    3.5-EA
    3.5.1
    3.5.2 Latest Major
    -

    com.sun.mail:mailapi

    +

    com.sun.mail:mailapi

    - + @@ -1061,7 +1056,7 @@ - + @@ -1070,16 +1065,13 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id com.sun.mail
    mailapi
    Current Version1.5.2
    1.5.4
    Scope
    Typejar
    Newer versions1.5.3 Next Incremental
    1.5.4 Latest Incremental
    +jar
    -

    commons-cli:commons-cli

    +

    commons-cli:commons-cli

    - + @@ -1088,7 +1080,7 @@ - + @@ -1097,12 +1089,9 @@ - - - -
    Status There is at least one newer minor version available. Minor updates are sometimes passive.
     No newer versions available.
    Group Id commons-cli
    commons-cli
    Current Version1.2
    1.3.1
    Scope
    Typejar
    Newer versions1.3 Next Minor
    1.3.1 Latest Minor
    +jar
    -

    commons-io:commons-io

    +

    commons-io:commons-io

    @@ -1126,31 +1115,7 @@
    StatusType jar
    -

    commons-lang:commons-lang

    - - - - - - - - - - - - - - - - - - - - - -
    Status No newer versions available.
    Group Idcommons-lang
    Artifact Idcommons-lang
    Current Version2.6
    Scope
    Classifier
    Typejar
    -
    -

    junit:junit

    +

    junit:junit

    @@ -1174,7 +1139,7 @@
    StatusType jar
    -

    net.sf.ehcache:ehcache-core

    +

    net.sf.ehcache:ehcache-core

    @@ -1201,11 +1166,11 @@
    StatusNewer versions 2.3.0 Next Minor
    2.3.1
    2.3.2
    2.3.3
    2.4.0
    2.4.1
    2.4.2
    2.4.3
    2.4.4
    2.4.5
    2.4.6
    2.4.7
    2.4.8
    2.5.0
    2.5.1
    2.5.2
    2.5.3
    2.5.4
    2.5.5
    2.5.6
    2.5.7
    2.6.0
    2.6.2
    2.6.3
    2.6.5
    2.6.6
    2.6.8
    2.6.9
    2.6.10
    2.6.11 Latest Minor
    -

    org.apache.ant:ant

    +

    org.apache.ant:ant

    - + @@ -1214,7 +1179,7 @@ - + @@ -1223,16 +1188,13 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.apache.ant
    ant
    Current Version1.9.5
    1.9.6
    Scope
    Typejar
    Newer versions1.9.6 Next Incremental
    +jar
    -

    org.apache.ant:ant-testutil

    +

    org.apache.ant:ant-testutil

    - + @@ -1241,7 +1203,7 @@ - + @@ -1250,12 +1212,9 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.apache.ant
    ant-testutil
    Current Version1.9.5
    1.9.6
    Scope
    Typejar
    Newer versions1.9.6 Next Incremental
    +jar
    -

    org.apache.axis2:axis2-adb

    +

    org.apache.axis2:axis2-adb

    @@ -1282,7 +1241,7 @@
    StatusNewer versions 1.5 Next Minor
    1.5.1
    1.5.2
    1.5.3
    1.5.4
    1.5.5
    1.5.6
    1.6.0
    1.6.1
    1.6.2
    1.6.3 Latest Minor
    -

    org.apache.axis2:axis2-spring

    +

    org.apache.axis2:axis2-spring

    @@ -1309,7 +1268,7 @@
    StatusNewer versions 1.5 Next Minor
    1.5.1
    1.5.2
    1.5.3
    1.5.4
    1.5.5
    1.5.6
    1.6.0
    1.6.1
    1.6.2
    1.6.3 Latest Minor
    -

    org.apache.commons:commons-compress

    +

    org.apache.commons:commons-compress

    @@ -1322,7 +1281,7 @@ - + @@ -1333,7 +1292,31 @@
    Statuscommons-compress
    Current Version1.9
    1.10
    Scope
    Type jar
    -

    org.apache.geronimo.daytrader:daytrader-ear

    +

    org.apache.commons:commons-lang3

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.commons
    Artifact Idcommons-lang3
    Current Version3.4
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.geronimo.daytrader:daytrader-ear

    @@ -1357,7 +1340,7 @@
    StatusType ear
    -

    org.apache.lucene:lucene-analyzers-common

    +

    org.apache.lucene:lucene-analyzers-common

    @@ -1382,9 +1365,9 @@ -
    Statusjar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1 Latest Major
    +4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    -

    org.apache.lucene:lucene-core

    +

    org.apache.lucene:lucene-core

    @@ -1409,9 +1392,9 @@ -
    Statusjar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1 Latest Major
    +4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    -

    org.apache.lucene:lucene-queryparser

    +

    org.apache.lucene:lucene-queryparser

    @@ -1436,9 +1419,9 @@ -
    Statusjar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1 Latest Major
    +4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    -

    org.apache.lucene:lucene-test-framework

    +

    org.apache.lucene:lucene-test-framework

    @@ -1463,9 +1446,9 @@ -
    Statusjar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1 Latest Major
    +4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    -

    org.apache.maven:maven-core

    +

    org.apache.maven:maven-core

    @@ -1489,7 +1472,7 @@
    StatusType jar
    -

    org.apache.maven:maven-plugin-api

    +

    org.apache.maven:maven-plugin-api

    @@ -1513,7 +1496,7 @@
    StatusType jar
    -

    org.apache.maven:maven-settings

    +

    org.apache.maven:maven-settings

    @@ -1537,7 +1520,7 @@
    StatusType jar
    -

    org.apache.maven.plugin-testing:maven-plugin-testing-harness

    +

    org.apache.maven.plugin-testing:maven-plugin-testing-harness

    @@ -1561,7 +1544,7 @@
    StatusType jar
    -

    org.apache.maven.plugin-tools:maven-plugin-annotations

    +

    org.apache.maven.plugin-tools:maven-plugin-annotations

    @@ -1585,7 +1568,7 @@
    StatusType jar
    -

    org.apache.maven.plugins:maven-site-plugin

    +

    org.apache.maven.plugins:maven-site-plugin

    @@ -1609,7 +1592,7 @@
    StatusType jar
    -

    org.apache.maven.reporting:maven-reporting-api

    +

    org.apache.maven.reporting:maven-reporting-api

    @@ -1633,7 +1616,7 @@
    StatusType jar
    -

    org.apache.maven.scm:maven-scm-provider-cvsexe

    +

    org.apache.maven.scm:maven-scm-provider-cvsexe

    @@ -1660,7 +1643,7 @@
    StatusNewer versions 1.9 Next Minor
    1.9.1
    1.9.2
    1.9.4 Latest Minor
    -

    org.apache.openjpa:openjpa

    +

    org.apache.openjpa:openjpa

    @@ -1687,7 +1670,7 @@
    StatusNewer versions 2.1.0 Next Minor
    2.1.1
    2.2.0
    2.2.1
    2.2.2
    2.3.0
    2.4.0 Latest Minor
    -

    org.apache.struts:struts2-core

    +

    org.apache.struts:struts2-core

    @@ -1714,7 +1697,7 @@
    StatusNewer versions 2.1.6 Next Incremental
    2.1.8
    2.1.8.1 Latest Incremental
    2.2.1 Next Minor
    2.2.1.1
    2.2.3
    2.2.3.1
    2.3.1
    2.3.1.1
    2.3.1.2
    2.3.3
    2.3.4
    2.3.4.1
    2.3.7
    2.3.8
    2.3.12
    2.3.14
    2.3.14.1
    2.3.14.2
    2.3.14.3
    2.3.15
    2.3.15.1
    2.3.15.2
    2.3.15.3
    2.3.16
    2.3.16.1
    2.3.16.2
    2.3.16.3
    2.3.20
    2.3.20.1
    2.3.24
    2.5-BETA1 Latest Minor
    -

    org.apache.velocity:velocity

    +

    org.apache.velocity:velocity

    @@ -1738,7 +1721,7 @@
    StatusType jar
    -

    org.dojotoolkit:dojo-war

    +

    org.dojotoolkit:dojo-war

    @@ -1765,7 +1748,31 @@
    StatusNewer versions 1.3.1 Next Incremental
    1.3.2 Latest Incremental
    1.4.2 Next Minor
    1.4.3
    1.4.6
    1.5.0
    1.5.4
    1.6.0
    1.6.1
    1.6.3
    1.7.0
    1.7.1
    1.7.2
    1.7.8
    1.8.0
    1.8.1
    1.8.2
    1.8.3
    1.8.9
    1.9.0b2
    1.9.0
    1.9.1
    1.9.2
    1.9.3
    1.9.6
    1.10.0
    1.10.1
    1.10.2
    1.10.3
    1.10.4 Latest Minor
    -

    org.glassfish.main.admingui:war

    +

    org.glassfish:javax.json

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.glassfish
    Artifact Idjavax.json
    Current Version1.0.4
    Scope
    Classifier
    Typejar
    +
    +

    org.glassfish.main.admingui:war

    @@ -1792,7 +1799,7 @@
    StatusNewer versions 4.1 Next Minor
    -

    org.hamcrest:hamcrest-core

    +

    org.hamcrest:hamcrest-core

    @@ -1816,11 +1823,11 @@
    StatusType jar
    -

    org.jmockit:jmockit

    +

    org.jmockit:jmockit

    - + @@ -1829,7 +1836,7 @@ - + @@ -1838,16 +1845,13 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.jmockit
    jmockit
    Current Version1.16
    1.19
    Scope test
    Typejar
    Newer versions1.17-beta1 Next Incremental
    1.17-beta2 Latest Incremental
    1.17 Next Minor
    +jar
    -

    org.jsoup:jsoup

    +

    org.jsoup:jsoup

    - + @@ -1856,7 +1860,7 @@ - + @@ -1865,12 +1869,9 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.jsoup
    jsoup
    Current Version1.7.2
    1.8.3
    Scope
    Typejar
    Newer versions1.7.3 Next Incremental
    1.8.1 Next Minor
    1.8.2 Latest Minor
    +jar
    -

    org.mortbay.jetty:jetty

    +

    org.mortbay.jetty:jetty

    @@ -1897,7 +1898,7 @@
    StatusNewer versions 6.1H.22 Next Version
    6.1.17 Next Incremental
    6.1.18
    6.1.19
    6.1.20
    6.1.21
    6.1.22
    6.1.23
    6.1.24
    6.1.25
    6.1.26RC0
    6.1.26 Latest Incremental
    -

    org.owasp:dependency-check-utils

    +

    org.owasp:dependency-check-utils

    @@ -1910,7 +1911,7 @@ - + @@ -1921,7 +1922,7 @@
    Statusdependency-check-utils
    Current Version1.3.0
    1.3.1
    Scope compile
    Type jar
    -

    org.slf4j:slf4j-api

    +

    org.slf4j:slf4j-api

    @@ -1945,55 +1946,7 @@
    StatusType jar
    -

    org.slf4j:slf4j-ext

    - - - - - - - - - - - - - - - - - - - - - -
    Status No newer versions available.
    Group Idorg.slf4j
    Artifact Idslf4j-ext
    Current Version1.7.12
    Scope
    Classifier
    Typejar
    -
    -

    org.slf4j:slf4j-jdk14

    - - - - - - - - - - - - - - - - - - - - - -
    Status No newer versions available.
    Group Idorg.slf4j
    Artifact Idslf4j-jdk14
    Current Version1.7.12
    Scope
    Classifier
    Typejar
    -
    -

    org.slf4j:slf4j-simple

    +

    org.slf4j:slf4j-simple

    @@ -2017,7 +1970,7 @@
    StatusType jar
    -

    org.springframework:spring-webmvc

    +

    org.springframework:spring-webmvc

    @@ -2042,9 +1995,9 @@ -
    Statusjar
    Newer versions2.5.6 Next Incremental
    2.5.6.SEC01
    2.5.6.SEC02
    2.5.6.SEC03 Latest Incremental
    3.0.0.RELEASE Next Major
    3.0.1.RELEASE
    3.0.2.RELEASE
    3.0.3.RELEASE
    3.0.4.RELEASE
    3.0.5.RELEASE
    3.0.6.RELEASE
    3.0.7.RELEASE
    3.1.0.RELEASE
    3.1.1.RELEASE
    3.1.2.RELEASE
    3.2.0.RELEASE
    3.2.1.RELEASE
    3.2.2.RELEASE
    3.2.3.RELEASE
    3.2.4.RELEASE
    3.2.5.RELEASE
    3.2.6.RELEASE
    3.2.7.RELEASE
    3.2.8.RELEASE
    3.2.9.RELEASE
    3.2.10.RELEASE
    3.2.11.RELEASE
    3.2.12.RELEASE
    3.2.13.RELEASE
    3.2.14.RELEASE
    4.0.0.RELEASE
    4.0.1.RELEASE
    4.0.2.RELEASE
    4.0.3.RELEASE
    4.0.4.RELEASE
    4.0.5.RELEASE
    4.0.6.RELEASE
    4.0.7.RELEASE
    4.0.8.RELEASE
    4.0.9.RELEASE
    4.1.0.RELEASE
    4.1.1.RELEASE
    4.1.2.RELEASE
    4.1.3.RELEASE
    4.1.4.RELEASE
    4.1.5.RELEASE
    4.1.6.RELEASE
    4.1.7.RELEASE
    4.2.0.RELEASE Latest Major
    +2.5.6 Next Incremental
    2.5.6.SEC01
    2.5.6.SEC02
    2.5.6.SEC03 Latest Incremental
    3.0.0.RELEASE Next Major
    3.0.1.RELEASE
    3.0.2.RELEASE
    3.0.3.RELEASE
    3.0.4.RELEASE
    3.0.5.RELEASE
    3.0.6.RELEASE
    3.0.7.RELEASE
    3.1.0.RELEASE
    3.1.1.RELEASE
    3.1.2.RELEASE
    3.2.0.RELEASE
    3.2.1.RELEASE
    3.2.2.RELEASE
    3.2.3.RELEASE
    3.2.4.RELEASE
    3.2.5.RELEASE
    3.2.6.RELEASE
    3.2.7.RELEASE
    3.2.8.RELEASE
    3.2.9.RELEASE
    3.2.10.RELEASE
    3.2.11.RELEASE
    3.2.12.RELEASE
    3.2.13.RELEASE
    3.2.14.RELEASE
    4.0.0.RELEASE
    4.0.1.RELEASE
    4.0.2.RELEASE
    4.0.3.RELEASE
    4.0.4.RELEASE
    4.0.5.RELEASE
    4.0.6.RELEASE
    4.0.7.RELEASE
    4.0.8.RELEASE
    4.0.9.RELEASE
    4.1.0.RELEASE
    4.1.1.RELEASE
    4.1.2.RELEASE
    4.1.3.RELEASE
    4.1.4.RELEASE
    4.1.5.RELEASE
    4.1.6.RELEASE
    4.1.7.RELEASE
    4.2.0.RELEASE
    4.2.1.RELEASE Latest Major
    -

    org.springframework.retry:spring-retry

    +

    org.springframework.retry:spring-retry

    @@ -2071,7 +2024,7 @@
    StatusNewer versions 1.1.1.RELEASE Next Incremental
    1.1.2.RELEASE Latest Incremental
    -

    org.springframework.security:spring-security-web

    +

    org.springframework.security:spring-security-web

    @@ -2098,7 +2051,7 @@
    StatusNewer versions 3.0.1.RELEASE Next Incremental
    3.0.2.RELEASE
    3.0.3.RELEASE
    3.0.4.RELEASE
    3.0.5.RELEASE
    3.0.6.RELEASE
    3.0.7.RELEASE
    3.0.8.RELEASE Latest Incremental
    3.1.0.RELEASE Next Minor
    3.1.1.RELEASE
    3.1.2.RELEASE
    3.1.3.RELEASE
    3.1.4.RELEASE
    3.1.5.RELEASE
    3.1.6.RELEASE
    3.1.7.RELEASE
    3.2.0.RELEASE
    3.2.1.RELEASE
    3.2.2.RELEASE
    3.2.3.RELEASE
    3.2.4.RELEASE
    3.2.5.RELEASE
    3.2.6.RELEASE
    3.2.7.RELEASE
    3.2.8.RELEASE Latest Minor
    4.0.0.RELEASE Next Major
    4.0.1.RELEASE
    4.0.2.RELEASE Latest Major
    -

    uk.ltd.getahead:dwr

    +

    uk.ltd.getahead:dwr

    @@ -2130,15 +2083,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/failsafe-report.html b/dependency-check-core/failsafe-report.html index b78f7b8e5..dd78f5296 100644 --- a/dependency-check-core/failsafe-report.html +++ b/dependency-check-core/failsafe-report.html @@ -1,21 +1,21 @@ - + - dependency-check-core - Surefire Report - + dependency-check-core – Surefire Report + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Surefire Report

    +

    Surefire Report

    -

    Summary

    +

    Summary

    [Summary] [Package List] [Test Cases]


    Status
    @@ -268,15 +275,15 @@ function toggleDisplay(elementId) { - + -
    Success Rate Time
    3436 0 0 0 100%181.723

    +114.28

    Note: failures are anticipated and checked for with assertions while errors are unanticipated.


    -

    Package List

    +

    Package List

    [Summary] [Package List] [Test Cases]


    @@ -294,7 +301,7 @@ function toggleDisplay(elementId) { - + @@ -302,7 +309,7 @@ function toggleDisplay(elementId) { - + @@ -310,15 +317,15 @@ function toggleDisplay(elementId) { - + - + - + @@ -326,7 +333,7 @@ function toggleDisplay(elementId) { - + @@ -334,10 +341,10 @@ function toggleDisplay(elementId) { -
    0 0 100%6.858
    5.513
    org.owasp.dependencycheck 10 0 100%126.665
    38.5
    org.owasp.dependencycheck.data.update.nvd 10 0 100%15.925
    32.093
    org.owasp.dependencycheck.analyzer1921 0 0 0 100%24.353
    31.058
    org.owasp.dependencycheck.data.update 20 0 100%1.621
    1.105
    org.owasp.dependencycheck.data.nvdcve 90 0 100%6.301

    +6.011

    Note: package statistics are not computed recursively, they only sum up all of its testsuites numbers.

    -

    org.owasp.dependencycheck.reporting

    +

    org.owasp.dependencycheck.reporting

    @@ -356,9 +363,9 @@ function toggleDisplay(elementId) { -
    0 0 100%6.858
    +5.513
    -

    org.owasp.dependencycheck

    +

    org.owasp.dependencycheck

    @@ -377,9 +384,9 @@ function toggleDisplay(elementId) { -
    0 0 100%126.665
    +38.5
    -

    org.owasp.dependencycheck.data.update.nvd

    +

    org.owasp.dependencycheck.data.update.nvd

    @@ -398,9 +405,9 @@ function toggleDisplay(elementId) { -
    0 0 100%15.925
    +32.093
    -

    org.owasp.dependencycheck.analyzer

    +

    org.owasp.dependencycheck.analyzer

    @@ -414,12 +421,12 @@ function toggleDisplay(elementId) { - + - + @@ -428,7 +435,7 @@ function toggleDisplay(elementId) { - + @@ -446,9 +453,9 @@ function toggleDisplay(elementId) { -
    ArchiveAnalyzerIntegrationTest1012 0 0 0 100%15.404
    23.565
    CPEAnalyzerIntegrationTest0 0 100%6.347
    4.769
    DependencyBundlingAnalyzerIntegrationTest0 0 100%2.602
    +2.724
    -

    org.owasp.dependencycheck.data.update

    +

    org.owasp.dependencycheck.data.update

    @@ -476,9 +483,9 @@ function toggleDisplay(elementId) { -
    0 0 100%1.621
    +1.105
    -

    org.owasp.dependencycheck.data.nvdcve

    +

    org.owasp.dependencycheck.data.nvdcve

    @@ -497,7 +504,7 @@ function toggleDisplay(elementId) { - + @@ -506,90 +513,98 @@ function toggleDisplay(elementId) { -
    0 0 100%3.167
    2.762
    DatabasePropertiesIntegrationTest0 0 100%3.134

    +3.249
    -

    Test Cases

    +

    Test Cases

    [Summary] [Package List] [Test Cases]

    -

    ArchiveAnalyzerIntegrationTest

    +

    ArchiveAnalyzerIntegrationTest

    - + - + - - + + - - + + - + - - + + + + + + - + + + + + - + - + -
    testAnalyzeTar3.004
    4.291
    testAnalyzeTgz7.041
    7.24
    testAnalyze0.927
    testAnalyzeTarBz23.895
    testGetAnalysisPhase0.001
    testAnalyze1.587
    testGetNametestGetAnalysisPhase 0
    testAnalyze_badZip0.522
    testGetName0
    testAnalyze_badZip0.53
    testInitialize0.003
    0
    testAnalyzeTbz23.062
    testAnalyzeTarGz3.904
    2.96
    testSupportsExtension0.001
    0
    testSupportsExtensions0.001
    +0
    -

    CPEAnalyzerIntegrationTest

    +

    CPEAnalyzerIntegrationTest

    - + - + - + - + -
    testSearchCPE1.771
    1.471
    testDetermineCPE1.594
    1.189
    testDetermineIdentifiers1.282
    0.924
    testDetermineCPE_full1.699
    1.185
    testBuildSearch0.001
    +0
    -

    DependencyBundlingAnalyzerIntegrationTest

    +

    DependencyBundlingAnalyzerIntegrationTest

    testAnalyze 0
    -

    VulnerabilitySuppressionAnalyzerIntegrationTest

    +

    VulnerabilitySuppressionAnalyzerIntegrationTest

    - + @@ -597,14 +612,14 @@ function toggleDisplay(elementId) { -
    testAnalyze2.601
    2.724
    testGetAnalysisPhase
    testGetName0.001
    +0
    -

    CveDBIntegrationTest

    +

    CveDBIntegrationTest

    - + @@ -612,73 +627,73 @@ function toggleDisplay(elementId) { - + -
    testOpen1.043
    1.08
    testGetCPEs
    testGetVulnerabilities1.074
    0.621
    testGetMatchingSoftware0.525
    +0.536
    -

    DatabasePropertiesIntegrationTest

    +

    DatabasePropertiesIntegrationTest

    - + - + - + - + -
    testSave1.035
    1.075
    testGetProperty_String_String0.528
    0.548
    testGetProperties0.52
    0.517
    testGetProperty_String0.522
    0.554
    testIsEmpty0.529
    +0.555
    -

    CpeUpdaterIntegrationTest

    +

    CpeUpdaterIntegrationTest

    testUpdate 0
    -

    NvdCveUpdaterIntegrationTest

    +

    NvdCveUpdaterIntegrationTest

    -
    testUpdate15.925
    +32.093
    -

    NvdCveUpdaterIntegrationTest

    +

    NvdCveUpdaterIntegrationTest

    -
    testUpdatesNeeded1.621
    +1.105
    -

    EngineIntegrationTest

    +

    EngineIntegrationTest

    -
    testEngine126.665
    +38.5
    -

    ReportGeneratorIntegrationTest

    +

    ReportGeneratorIntegrationTest

    - + -
    testGenerateXMLReport6.857
    5.513
    testGenerateReport0.001

    +0
    @@ -688,15 +703,14 @@ function toggleDisplay(elementId) {
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/findbugs.html b/dependency-check-core/findbugs.html index c0211abd0..a3226cdaa 100644 --- a/dependency-check-core/findbugs.html +++ b/dependency-check-core/findbugs.html @@ -1,21 +1,21 @@ - + - dependency-check-core - FindBugs Bug Detector Report - + dependency-check-core – FindBugs Bug Detector Report + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    FindBugs Bug Detector Report

    -

    The following document contains the results of FindBugs Report

    -

    FindBugs Version is 2.0.2

    +

    FindBugs Bug Detector Report

    +

    The following document contains the results of FindBugs

    +

    FindBugs Version is 3.0.1

    Threshold is medium

    Effort is min

    -

    Summary

    +

    Summary

    @@ -252,12 +259,12 @@ - +
    ClassesErrors Missing Classes
    126132 7 0 0
    -

    org.owasp.dependencycheck.analyzer.ArchiveAnalyzer

    +

    org.owasp.dependencycheck.analyzer.ArchiveAnalyzer

    - + - - + + - - + +
    Bug Category Details Line Priority
    Redundant nullcheck of org.owasp.dependencycheck.analyzer.ArchiveAnalyzer.tempFileLocation, which is known to be non-null in org.owasp.dependencycheck.analyzer.ArchiveAnalyzer.close()
    Possible null pointer dereference in org.owasp.dependencycheck.analyzer.ArchiveAnalyzer.close() due to return value of called method STYLERCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE197NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE198 Medium
    -

    org.owasp.dependencycheck.analyzer.AssemblyAnalyzer

    +

    org.owasp.dependencycheck.analyzer.AssemblyAnalyzer

    - + - - + + - +
    Bug Category Details Line Priority
    org.owasp.dependencycheck.analyzer.AssemblyAnalyzer.initializeFileTypeAnalyzer() discards result of readLine after checking if it is nonnull
    org.owasp.dependencycheck.analyzer.AssemblyAnalyzer.initializeFileTypeAnalyzer() discards result of readLine after checking if it is non-null STYLE RV_DONT_JUST_NULL_CHECK_READLINE249242 Medium
    -

    org.owasp.dependencycheck.analyzer.CMakeAnalyzer

    +

    org.owasp.dependencycheck.analyzer.CMakeAnalyzer

    - + - + - +
    Bug Category Details Line Priority
    Found reliance on default encoding in org.owasp.dependencycheck.analyzer.CMakeAnalyzer.analyzeSetVersionCommand(Dependency, Engine, String): String.getBytes() I18N DM_DEFAULT_ENCODING200199 High
    -

    org.owasp.dependencycheck.analyzer.FalsePositiveAnalyzer

    +

    org.owasp.dependencycheck.analyzer.FalsePositiveAnalyzer

    - + - + - + - + - -
    Bug Category Details Line Priority
    Possible null pointer dereference of currentVersion on branch that might be infeasible in org.owasp.dependencycheck.analyzer.FalsePositiveAnalyzer.removeSpuriousCPE(Dependency) STYLE NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE187188 Medium
    Possible null pointer dereference of nextVersion on branch that might be infeasible in org.owasp.dependencycheck.analyzer.FalsePositiveAnalyzer.removeSpuriousCPE(Dependency) STYLE NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE187Medium
    +188 +Medium
    -

    org.owasp.dependencycheck.data.update.cpe.CPEHandler$Element

    +

    org.owasp.dependencycheck.analyzer.PythonPackageAnalyzer

    - + + + + + + +
    Bug Category Details Line Priority
    Possible null pointer dereference in org.owasp.dependencycheck.analyzer.PythonPackageAnalyzer.analyzeFileType(Dependency, Engine) due to return value of called methodSTYLENP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE178Medium
    +
    +

    org.owasp.dependencycheck.data.nvdcve.DriverLoader

    + - - - - + + + + + + + + + +
    Should org.owasp.dependencycheck.data.update.cpe.CPEHandler$Element be a _static_ inner class?PERFORMANCESIC_INNER_SHOULD_BE_STATIC182-360BugCategoryDetailsLinePriority
    Possible null pointer dereference in org.owasp.dependencycheck.data.nvdcve.DriverLoader.load(String, String) due to return value of called methodSTYLENP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE87 Medium
    @@ -367,15 +392,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/fonts/glyphicons-halflings-regular.eot b/dependency-check-core/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..637452ea5404ac01670c10db5276e73114d16178 GIT binary patch literal 35283 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 literal 0 HcmV?d00001 diff --git a/dependency-check-core/fonts/glyphicons-halflings-regular.svg b/dependency-check-core/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 000000000..446948874 --- /dev/null +++ b/dependency-check-core/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dependency-check-core/fonts/glyphicons-halflings-regular.ttf b/dependency-check-core/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..282401576351ef7d0eb7313e74a251694b6d78bc GIT binary patch literal 55016 zcmeFa>2F-gmM3;2_l>zPOp-}vGMSmANF|pfnbby6`@UC6RF$eqQc+cZP>8UlwJe<$z#CAG-?bJwi~b2?lwFF``Z|X{V(|UJ11@~ z6t(qC!(U9sy*DCm+{lO%Cn8RqbK-`LESEjv2wbkrPLc z9XBDocgzaH>{D$L~MVg;aQEFaU9Q`4{v?>0Pm8H6OdRZ^x-GpeX#3){8I^O9K3@c-MO`4eD@?4H+eeC zA0axj;7d48CvM`S`(J&lp_HV;4Y_;p_~f(qZ!O^Y#`lt*HA3kAt#2QAd|GM*;aJO0 zZ{5H1+kfhY-KY1_gU`PF3ZX-|u1YSbe+YpGU)&)C;HI-ZrD=Y1=k^D;5PP{Tu`%Qw zz(uID%m?%v8+xaSpzBZnD5>HI4>Hd2AZ+*%?kGFLj^p(qEM@mQK5vY*MC@CxPu?up zSjUf7JN>FG9RV^qtv2h^a;#pE-#q^YS|^ z_kdG&rdi^0q&!=GuMFRKx^5cbMgm^`R2Wwg*A%WjxK81^j_W3_ySTo?)$6vWKaQ8~ zH_xQ!FT?9kZSDAM<}qQK){_hx{_E@~KJBCp;*yd;w7pYM67=O+07_{lEW_lG|G zihqRer1Y>EdNUjr&t6=|{q#d(vQs@ch(}<0{lInm?#Jup-)@>rb8t6an3?k5ZN{eQ z^~{{Pynd{Dy~2QZ=I$U-aqZ%Ig^%lu^zk>4Ri#?_o-sRh>ISMz?Vo1E@rTzt z@z<}*ulZ*NZoI{u0?cWgI4ou5FWtDo>>T-_AYV^(UaxI?9hym}%6n#+QFx~OBOWLe z?ouA+<*l8n^69Ie#@&(MxC7rUMk2T}T&Y}V>Q3BcjniUA+%$V3 za<1KBg#2pUmg4}D4OS|{<){B1fGydalA63}Yl7Oy2ZV^7@%8!)y{GZ2^z3 zeu}>(={R&%Z?WVA2k%<`B#|O5NReX2)ti2%;`p2psNVYcW-kmhlgx}%A8D8jm$!C$ zgFnrorhIXIzqA(HFw1H>Yi8~6VM82EI`2F7>1Oe!)S98o>($$QI@QC&;xX03*BP-U z(8Q2`(4{rtLcf(~az zZeCR7O*^Qk7J#m8wpfHN5CJFUt?79oaY= z&W7)-@2pdBCYY~7d>d%tX0|q?3oPd#qcTr7{VYp*Yct4a(M&sY^O>beqg_a~Qtd*p zlB*PgjZ`%iY_vBF3#0CrztE=})d?fI5VX$2ni`HmqBc;pWz6g3mn?HQr985eSkF*-hFp zT3*<*XAfJn-CAr{+pXpHa%-WGFH{$sp6Ynq6RZR)fgEn5zShF3XQ>qk2CCzYrfFjQN3Y;Q|DW^@r#79BJiBr_ZvMW4G>Uif<+k z$0X7064Sk3(HH3_3C)AX{zIaT(%H5@y{=?Sl{B}qdCK|;ZqHH4!_APFMfgB z_e>GL_08Y>aWNLZCj{_@l;kY@K_>!Y(^)cwwyCAU{*)~&KC!-whWWyI);%2b`DSLL zn+#zhaOa&S@w|;^Og;q!y4@GC^4oY~tO{`X60D)q8(i(>#aUAy4-S}fc+Ix*kiNT$ z>-~WN+!GUt0sht{T%A`p1{$RF22hI*T}7xn^KLK4TmGgKc3OljNEYI8aBI^m15$)= z4?W%VZawjav^RMD(vd=54Tb^|j7l@7Dkg=&X{nN8rf^zIc+8BA(Rkc9HavBfBJPAR z)*u37yi*@F?Nzgss-^0|xGC7sVm;`On;hZ-z6qqfa0uXDJAL6=njPxG@hfrSNiq^g z96X;+4drg`^1KVLx@2MKi{qc-Y^&hJjr}{Iax0k%m|UpjGQ+!!QlN+ zmWxHWZ*cwcJAA{eI!@9uc0{9o`F$pY!-w~SK{IpS^NB|2UA`uoaAaKfoUwOE;hbex>_2!$_^BvknQ#&U*?GkaY)b&;}txUya!Y1QwpEUpS z-)FkMKBwRH-aX#3O~F2*?x4x2$G$npdC&I7ZNHhvVi{=%SoMsZJbcnYIs+4iqTX_4 z3c+@v(XKXvuUf(*$eWZK9EnM|bLU^F)E=@9{*T}NJ^cuGX*k?EV9TJxFPWwB`T?`J zypS)MY@nJmIo7*&P(M3ZvrsT*12L@QBYndMgN#)LW{Z|I_ zAV$ZE*%r@qY%aKs&L09YbLg$_mG5j{5CNG}-KpnMCl6^TxsmcrpnYbYgU(^WW^I=l zg3o6gqD1iRw?JML3}3SlO%gbu=?3LVxReDh(iBr$n=6bzB*Vc{YH=B}az2*=qE*K0 zMW9`8*u3O@Nl-IaD&>&n13uZb-LPkUd(8H*l)U>v$#cIyhZ6GJ7V}IJ2a_WHgb;QC zcfonj`ONuQ&|1h$^aP^S{!au8f#ZuCg5v_nvyUV;yY=|!R}#CMu)Kjw;wQEqzXAV( z6c!!@^y8%Vk}&$qq+0jXoAT~~f4k2|rgy z@NTyy_Fe7iy3$e6br)F=86SnhAKBVG${58qcIJt#%{K(gZa#x!g_q;lt(`F_n+HNI z1F`Brs6cKzh7lv!>1DRTAV7?HQTTP+n6tiZyQ6%*IQ(o&ciWw#OgA&cYq&4!nO1!! z0z-vyO3t{7ohW|!vGcL-xbL_VmG9bNQwW=2*nDh; zI?2pXU!W6j^Id)Md!%wd2br@Y$=i@|4GFiAy+Y|$iAbfb%?hhBQc~)Fq%PEdX+(pi zF$wmO$&*C69x}NugViW=scmhR^mM$Zs zFI~KNK>oSYdFa z3NVnzvzTt@uyoC0-3A^-V=14;0?9Mp^cWpJK`QC+S@^5}>_d{;<~DARC<=umqd?tX z|H<2|cPY2QaSJyg3e6-}RBc=YoI3g#!#DrSUp&NzHWw4)r_6;<@HaLb(*XuKqNL*I z2oT5tS*K8})nf7_LE?J~kZcMJ0A@r)!L;l`B(e24CDTM3d{6^6rTb5GhZAlG{k)9J zHev2?F_%-y;=o;GQw=%84DxbLIG3E;ESW6CFK%s~VUd<`F^9{x$xd!&P?Wu}}y#PK1M z9rNVJOfX+)7xM7777lur51PVqyU|{TcWH6fQ=c{MdL!7V!&@CscmfI22m}kk0K9&# z!gATbczuY>J5PMjdvW)E`24%){q@Q5;n{kiIZIaG%G^coV1kwOGiZ_p@5LESITz5B z{)HL7+Sk13Ee>!J444mp!s92od9GKc>VbKiur_I@5alXQGMP>lb671hG%p|R=6tibwK*WqdHrZHBYk+0$*{7+y|nch>|0^G zlWOUZEtqf`5^ zOoL}*!|e|ekekmeL=qcQ`}R#Cr-f*oY`jn1ZZfrh{}fvq?kJz&IpW?M!-Wgw`o^DQ z!+?=F!-l|uhPCrax0XeB_~|AV;UU&s7szM=9pn5V={81&v9Lky`%eB&3Ufd zS2C38%Lg84Gk7rC2y;b>6L(V1I12=JjtCBpY&{7WZInPr8YQEnimVtr5H~5a z5swlzcnNT$anHJ$Df)hj5>zoG72((v}~X;czQ0ZPMmwKl2ZHc3d7l zL!NQRo!DR$ujhUCfB*W|p7%QGnX;P!KU9a-?K12ff7Ze{;WP!tig!VhkOFJ4d4$75 zzH&lg?KJ{6zpPVa%Fzj>YFb|Wn~JyU&9uB#m&ZY>J&UVb26n2+dE6+1WC7F(23)ks zl!6e^gXk7m)-$I*5p{w5W{bJy1HZ#`3nX*k6JJmZ?9-t}rbI}w@Kr=6L3n~bX+%$0 zCXxY8B%zoHeZUwp6c?gC5E(92yQN1O7gy=U1^2)I*`LwZ5r+}4)jhyNb!57ecmgcA zQAk4K$_M_7|l zPL4UwhB1F8PYRJgSjb3X6AC*+mIeeryXWs>#;v2Gq;SPoCWyPB1+9;2#0?lq8O4O3AL2U zRMIUwfo58TO1tH)AdyUQ#*XL+!z~!$|K5VP$UN-~a}?ehhImG)qmRST_JKYJ?)~xJ zW|ktl&0Mry0$o1FPS9!CA!*oDOiJwwN4$CV0_J1KXtrOzfVlql%UEK+j3HaZ(y!Zk z_yx1qOtCsI8kM^hN5WobUtsz#^elHqoGUE5h`TX&rC9AEE~XZ4B~TqxV1h7+xC6nc zcp{3geqSbAC@OY`1-tV~H>VW&jT6p-xlWWX^0fdaJL;hjyP6G@>q!c_gOyYe6fvZG zeXAR!-{vT;?W-f!GPdozi<*a>k7VI=sr$|M%$}1HpwJbCB%O-$J>ig2yp;hlzx5

    xGKKWr)LOIHX|9j|pm3m{#V9uzu%fq9E597(oHCcB;|_!~!{QsuILvV|l5CK@}Kh6VZyy>Se}Y{t-Ts^u!6qK#E$EnO68kp{GwEz0sut zG%@1oy!t`XgD7u-6eamx11F}@b7eq)A25|%ZAmYv+aPD5xbdXd{@GfJ`U9f-o~$OE z6$Da}A|GzM^~M6l@MkFrE`WrR0M?Nv5N3RVA;WrCTs#rx{DOV3lVUEB|&wiJLGM5fJCgIEdxR{ zvuZ{?tEQcbo2EAq1OT~U{r1rpA8$-e{s6DKuinZ^^RP7g=LRan{tK7rzjQ1zIT<;2 zi7*vi&kpWYptf+x`H%&eRp71?bLv~0%L{l4zLnr%E{AQ&T%N_afOdLobDDr&kkG!Z z&3z0dB~;jYd_+78)6y+t(b5RO%wMa|N=z`B$$GUP$Jn()GLxk`jGR?d9)*@dC*1Tv znUn6k;7k^5Bi~{~p%sxEp{b7^AJQy`IKO@l> zU*JX$oW_2IENp&XX*>aBGh5_yTNr>RMkA4Lo!tPuY>bwvia+JA7_d0N^#CKI0lk5K zGQkec_=3uj&ph}maPA^jL(inLpLWaOePGLwfQk|GkWnQ5bQ5%{t`M|jwKiBP!3LNw zJC*C$XCEKA+FOD>OPvD1v&_i`4nHeM2e0pT=XXoae!+U;6!YLU%7Bz&Q{;14ry>F~ z!I*e5VL_Q>zTgtbM(2ibJfpoADsQz^&2&l)R#Fa{9?_AHE4* zB8tF?dY7$_#^BCyU$xq{T8OtABAPaIxEl=hNb~U)9Gw)pc@d(Fib(MfI!C~NJL6n1 zx=lcP-rP}P+@!ajOwAwDu~`#_c?tdv!*8?UsSbD;+&4zp`)Zas9OVnAcf(cbIux*m|<(z;XTVl0?syq+zqU!Q$dU9Sqtv ziJF{Rp<*At8XuO3Om@X`8LJ#Fe0%q)uwpd57WU_h%kBLK){e+XK3_>ymnczaEmf!r zpwpYd6bErb&dYTov<6h@z(g90v9?0>0!{73q-T&igUcd@%v|)#Y!&M)hXl1a6*5`}Zpe+|7m^#3N~HUSUElRf3Pv!u7;h3InM+L1gsd<5-WK^mPcHHqJE44f zlrj%jCXYxTF7#DpTX)Hk2W$Ycm6#+uqR5EVNv9KSM zIh-LvWCgjP|0O(~K?#9nIm~yuRIYA4R;FZ9H9~>`p#X<<#->gP$QHCz6>7Y>1{$tF zvIWl^o=f)0unSm%O{%Rogy0AZxQh~J1A~YV4*#o$0YmQj>5_CoaKdCM7gVSTFOJY< zlL&!^l>r7@a0dw6w8}V~KvZO9oZecMuyL}5`~tKT8&Fa-V16Q{oewO}qBMGCw8Wd> z3SLJNxE;k6W6|FzjgFRhlMxv651UBZnB^;C>POg?u)t|wiwT~cP>n8E4&|gu8sB%y zndh1X)btJ|t+gnl^(Zf~zr0!+6v-3aaNo#Jx#gEx``Pm2r{N@Ck^|Pg1at)IH+YX) z5<^85s*@qdJ}fRG(0e6nZDYtrbOP}Nv3!tW1|xME$&Al0EdkYVEUmCasH8R!O`!6b zmeTud{~DCe$9UQPWruW2yF$+!@PI@LN;?7a*Z2`Hp%wAWm25W0d_QGJN4cM+pG1p- zK5VG!WKC-b-jZ-v!0C%vl~JqtEz0d)s~q0P{gWjC0D)d9n&cv9QmK zT#Y0>hwGk2;l{b31eGN#;g!>Y*uEmF(O7oW}@k>$1U-UDIOHLj+|}? zPE;mpWkLioyQd^(Y`jXg93m>5jGFT@KxK$P(c;i7^xe3ku-eojlx+GyuEsqHQL1(* zvVz3Qlg%$IFV@Go^x8K?9HWc^4_~6yzOswq%X^zq_IWHc2;g7-05`b6>iX*Hx)GrB z8?HM-!^f7U5y)jFj|YKUp=AvGB7={~Z1Vsz_?C&sy*kgF1M z6S@|uER8qKK~pK9&7qWBhYCFit18$wag#76Q^+it`%|kEnH&7_a&mf!&+*ChXn<7K z&+p*&`QS)wS0Z8V!QcGqaDI6P9=P4tu&ZTPrWqfw<8FFxI5q@bTD&v={C71GItRKw z6ZmjJop%bYe~0BSYv-tJJ+VG)0TE2twY53VD!9@GA{6r!i~#?+vb8BhPK9{Tl;#I7 zqE<$T%{t=ZM6D^Uo);9Dsz_jjt-p)O^7PHK?UQKr))G~&7n|P361oWG(+M-`!_!n7 z`kMH6JclHx~UJte=z57NA zrGZ57xJI?#X-|fN-dO9l_a&*{$mEGY*w3##mA&Id5s60T zPV5ODne|>;naCI~ltDt(MlHtN;THD?_H=ZTT@gnZeflSsZCG1W_(>jrUg?e)`fp5^ z@?)we5D_e`vxzaQx~o&=w_!98+En$&2e+OKS}mJFWlEI>HLKFF3hiOa+QPDG(C94n3-2fTVE>u&kAjC!$1km!+CRIQeX{W%L^XAT+IrHO>xKKzt z^DQKE&B{2!?9mT+8?Ve}iAw#;Iq&-}{Z?w^!u)t)V`IU4*%Qt+N*D?~P6csrY*uMn z0uX*)AqAmlYg4&$(y~1ej7YT;T?k^Q(Z2zhm6Uw2;fMI}mTkZd+b14_eB)W~BwiqCAbKiz`BML@l^$Fb z%-^DID768Ty)V4|{kGEgR0U;vsj^_F&>S8*0r($u0)20GtV5kRZRK!K(iCk>XfOz` z9V+YxI0h`@VosuDt;*BXqwLj_%ybxhs%`MHa9_rlSMYD@0uGIeq$1^ni8(duqBtBsbP-25I0+UCKfqKeUGRVPCBypZTNtWl72@%Gu zFu9_Byb?lZyXNh7-RzfzyDVhIu0gg zoe+ZB9YzC?dki_doV{S?EA7FSkS!`8Kbq1!qJ#!!5nJ7I_c*_TIl~D-G=a8_Qm-%u z_vuvM`RD&B@`jTYKL=TkKM1o!n;9E$!+6>l(e&G305IVAvccH|&zP{>Z9;+1tN4lX z0rCu>P1MEuBLIy^1J*Ea^G5_8Yfm?iY&|Aa=H}b~n$@QsVFsKMFuBa%v+~~ZMg>Jv z_j(hPej@<$)PFp)ai+r+#~Y5S&>2Z%K?k3R3(?t0(GU`%M}P$^xDl!z6xJnLQpj2^jc%;W>ln5}Hp4f+YYm^1oy98(B6tKtVde1;4v{XmI z&K6LlQYc`*9245z!e;I0fv7@osVMYNinLFTv`+>l=P!(DMUt5uNFjt(i5ivKz5(c< z@iz=4c4@nc97_AvGsR*C-=v2~4Vhi1O$|@D!B5UVIDh_u)H*#R0@E0t2bqdGt$gYO zccwg#cIia;Mue)&VwrfL2M96%yR9P-LFL_zn<{n-xoR)Ns#`wb(@K`Kl0j!s=sn0} zO>1G)WMvWA^fl_la#<5|(fA#%?KW!JD`YSgnOM3XtmtW&?>^g26`+NbW`1$fDL$?F@)01qX z#TJDm7~#5{tdC%IsN&R}YXr%Vu1dfQ77@3LM54e7By!b86vp|j$CCbQ?(vilri`{|ps z;3b2hJ6n!G&F^FnurREM%%`!n8Ropnp^*#=_7MKOX!inm;LAg#!w<)kGREXe6FQWH zha_Ah=zIb3*E^$SArPcGgayr#3mLQO9W%MG$&JUQC-~XX-o*7H$c%pY;d`Sc^AVE4 z1qV+axq4&|%jkmUVtKs_7{o7WN~WmPp*d_M@lhF@Jn=&7$o=imDM2MbNJGmb0CW^8 z%mbGQAp{!z8l_gGV3kILqhn-pBE9SwuSkClE7{-?{m-!K|84VZk=mO~2FaNnlGeyVe;f4gbOSq_*jEnt9hU$WD!bod3 zlc7s^I$#5Y1@mNkM)oNz65tcSPQ-_*c$3TuW(4eflvn-zfr1Qd9`-2*1KZqu%H%*q zK#3WTuz{ovY;Ht=ghCQH$iWB;@#*tG}?(5eq}zl62v){nv>b8$?FwHo9z&%T)ZTNq83RAQ6;0;-%~(HP{Zy@yT-$H+AL~!`Iw^1kqrIvn-tN zvhORhDr#ZVHicjgFC>Y+_3U>w1kA0T=)6p2fF~;Kbv&IBnnJz91b_(gVE03`dik0a z7Zd=o=@LR6{aGENd-P{9Lot_}?!Bb;tWZ0>8yYg$S}E&2C_@kgCIbyvE)!nSu|UuL z;{W>fuMKCfUiVB@6G~b4?NV^7Dw;<?_kbJJ%H>ae& zT0?K~<+arvf3H%(otto>(}X=MRk!shiIDD#{DVej)mT!ARi9R30E@hB#fBmn)WNXH zEm(MY@vrew*?z7uhBh|WfjzY@WR?0>?Z8`K43d}w{^8;u$(^Wv{ZX*b1w;K5Yi$b z#yWmc2x`PJqkRluyc^xx9PLU3(USXR6*8&>QDsr^uStR^?3)y=B>qHWuQaqpPmv4n zB7rG}h+>JRlH!Z}EC6BHw$_KfDVDvf{=HZab2no!?klubeM=B0fjZBCzIr(bfB6Gn zA{g-aJz-zmm+@xup@KirD9LE=PwyTdsm>prAHItMbleN!j4tjO@&sa$px=uvw#j@f zX?%sT19fj?YGHk$b#`(v@IbSoWOf_usrI(71A7c;GSCS%3S)etF`wVslnn#!kkFAh zBGa@o4lFqHy2^eQaBV1U!Acgixn2!M$eDHCu*DWuppARcP{&VnW1xJ^o`XM@TYAnA zMA3Iy*SyjSLV7~FEF1G3qE&LZs!~h?h2+|-6|jpSI{)-ZaCBO^(7CNA;qsLFRUaXj z7qptF&B0)fvK2H&RxgeUqsNG7hNxBEH7%T#)KUu^0O%ErdI|te+ytQz2kC7KtN_F= zx1s8WAR_UqmBW{bUB~Wm3BUaCUK$U$BChMd{4VaJHwQmE^UEJvDyR4X)1CR0+EN4u z-2UrV+5_s%a$Y@#>jPXBjT^?}$5Z$D0oi% z-7qY<;{DEKshl>uk%F5|veXh~`}AxU5?#{%Uf9`J)uWdyxcQp<00|zr`#U`duorDa z*?D{5|N8GdFFzUewnMG>0;svlUC%&GId{EKbGPX9LQU1bdPn#!)G&p~QuKBA=#V{k z?SJ58M&R&z?M+ryX0c_n*byefJutz*BLk2$F1~cF&$(omQd=1LRePY=r9~3lkVZ^O zX)h$<6(2@iKPF*skKrzpjO;L3Y`g*%t$J2AzCy<8#8^ALy1(EB;2^lZ-0-wlJD+j` z!h>7vPUH=|&!6VpfmPrT3od(>$jsrFo#hPt9>0t<4ypnYAG<7-71;LM*kV(L6;ozA#`t|n7 zCV;$BY)Slxlrqih(nZ-LJf1H)vmBjvIHx zkeY1(Q~~VLN(vm)l>E%NGQBh>o1cAH4$$Aq&)R^c6_COs%3<)hoT9(|N1z^hH`tM5 zP<1Y_nzAx1Z*7V;8brP#esH<-!tO&0^~+wsomUOwqO$b-u>oI&Og-k8tqPupbsbS6 znuL@f>*ddz%%~x|f@)7#atjIOZV|&5-A!{6Fjx2bs@dgi)wkC-$k{YIXlFSK%x&pK z$=GADAX_SBO%r!~2M1aTSl&Zj)FC>Za~45OiCNKx(iroUZbQRORrU502j;D@W5~Qk zAM}9Gt&8(g-)LrOFCl>5-O54#9qR6&D)$@M)}X0Zn8ggj%RwsvAwd=d6|g%qPE#BZ zHl<8^w7XrLmD>2s;~9@0Xp~v(d^*EgS4xcok*de@Sw{nX!#kd~<{T>wCoy=+#uhwdQ`hzYc%aYp zy>vf#VWDOL7)GD%HZA7R;6BaAi_&>=OAwMk(QVb=&U)fL7!VFF=iAFQblX(}Rcuvt z^ab%*IONT(G-vPLfnVK6Gp9fL9Nuq#xN#-%e!6j_ZB~xoy7%@}-WLjHu_XcT4jj<5 z*Yo;Z;$E)Xxc2RTv$cD4&!|S@{y+W6o2_sllW6}uaOE(<^@AKG-dM%-H{geT?;852zorR#eO!T6%AP5XMHj+hE_L(!nt{G&XbTkpmFvp~Q7VUG$J}2z6W}isMZosP= z02_>JpdxQWyiM>X60fL?`q9`xvN$wRYuZ1v7C}@z(HGfl;-j@8gRa2_<#yqgsj?N@ zX||nh#e*0zq5O;#uu9Y(^{~}_J*|53!2TLCg8R#VTqBe0i@Oa1;jjLpMpD-{*=%8S zZz66c>-pWY<8zr=b8EUm6mJd;4Fzj&acJo_Cd4A?J#6)Y^$;sH_z1!rIkQ{`=Jd>7zBMQ|E?69p1ue^cE1<54E z$~u=ChJfd@;hH~Q8|DE2Q+9?KsaxAqU8rggSD1dJzi_>Zdy8SUbRq5 zqsp8LkIJBzuaWISmA^Jw*kq@hQA3l8jao`fE6$o~FhIk;?UX-I-^fE%ef`n8xtGX` z0SZ=VC_|z5yBX26fG;&@0#n)fxH)F7tgf$j$#A@j&u6Ey14MdtZ|B!w{{H;=a5A@+ zf7@^(iIJAWpWQSP-e&c;jY+?=XAm|Au7QelMH=99sx~?G@xkJS5SQE4+&$c{>xWnc z%yTn^-b9Ehy2wJ?MJH_gZ0cm~i>O6?BQfpnK5{ zM#K`?EDvR}3{gaM*+Zm{Ko+X)^0wSog_YiuFO-V^{=b8a5H-yztf zh!dRw%vtQ$Eoj(ym47^gw7>liaZ_i!9Hcvr5P@S{50Rsh^1XU{@1FH;4nOq1P`|FY zTq#mo7j)J-q43jVtTX|{p4lTs=~s+0&`huQZ8*{Fu^)loaWjbspZtHwrzEO-uvm@2XndV?Bgm-Ye zF8}oL=NDV8i=Th|(`9qjZCdxq-fYK3!pHX!yA>&VFN~134QV`c(-joigl-V;JV)5b zVqt~t=##|&6eFAye0Xj6J=!KPt4ovZ1^9_Z-+3%OtLJpXm+tfnEF9k z+bT!jr`sK{f<{ssh@%^L#a>wfO8{Jy`?JHCX{oO*KOz`sA3y4Qq6G_LhBY4d2aJMc zF^ymd4%!e{hojQaT97Iu4z#*}U|g}QNVJ{-P7qD%o&Bex`2zWipuRh42w6YzbaM@ZTj_gqD0SbT92 zmo=dWpRBz2#HEJu^q0XgB7Fvag%<;?AWip|#mE@ghO%wY{bk{!q35!YJq#Y0Xe`pbjpK|5R?B^q^xApE*9O>`ba@_U#Oukfd6e2)o5w1~A1cy%~60})m( z<%6{_00ZX11Y=vs1TW#tF5%T^fMIlY7a=>51O`B1X8Du+Y5eR6e^#{C1gQ~_-{x5z z@b_$L5e=CN=MC&3@6R1SMMlw%4nK*`-qQsVnBZtPK$H{hR_h@vQxG1A7=HmKNaK?% zBS1t|Y`81LQVR+gp2zG_L1StoMQ!Ya)oPB6q1*RL3}YS0y%U8D)q61WRr{ul!Kr;z zm-A0#36D&Tc%#nF@*9d+m`lu?OpWo5pu?1y8)qp{ir$Xz1Ht76Y(gv%d#1H_&tlISd-o`ZJ4}so z-a^f8^sT}20>LuJ6!VI8HMONOxmyTZ>WH*qFs2PfPmXBVct}>DD^T=|3#-RJO0HI5 z{Pb`(_3&Wg`zz@{I{R)G_bcBg4n9m}hlkSn%lHj-d-tY?__MK<<15j*Pt3bAQkfIy ze#(|JL%B>X^Ygh*VnAv#7#?X(!Fb3NV&@MWmMns7h)x1cqK=_<*q?<>nuDg5!#QH!s%3Oy zfpg#oqHME+3YVE{&1Jp}7EMjY)$X^|z7VNwV6$U*8Ln=(n zG;@L4fd;xA@K2~RpA4(8G*az$Lf3AeZX8d!aH}h4H8eS+!tSosz9~{_(?VG^bpqZ6 z%A$zj8Txqp4AHd!^M^c3r6LdZSs43mk74X-RF=HeU==xRyf$2g5h;-Uk(C2%aff>@ zd=;+d8yTIT^|OI(8gB}^9CE&6Ulpn2ggw3pETnn%N3f*@lJnNq>AW>@CVY|S0#of= zV{htiyBT%&ep%BhBW1TjGnN|8(l!czdw4<+v&u?LkqjH8FRKjR!u~@d`fY=^OD)HP zriK9zoAhZ32jjRBINZWtZx<>UCjfNrN3K?Od8m571ZG^rPa=0?1eO3ljz?3m`|;?T zrupW*`)}Msd~i5{J3UOaA)5>W5|>P;i5+bd^@Y7bpU>kbI$g!3PFmoMXCPIJaHtK$ z9>lZh_;+XFXMcywvy%*8H&=3#qq%I!7?0QQjfLU^h`xf07>);hcQ|Gxgv}l%9+9T+{ zf9vt8cDcdL|ZIn8jLUyw{^m$jLsZ4`?VQ${DxLl|xjL|3sKhAct_8J>d z@W9S+OtY1CsurZ-qF~&=3+==mJ9j=I{G;*v1IcLI+z)0d$lESN62qK%K7NCsR==rz z3_sj8ToJ$VqbqIKp}|XRd5ak(z+J&M)EE z0MSG=j3&X#34xe2s17?=arn;q1BNE*y)yo~E)m*S{A46A6aVrQcUB&G&?qYlwU0JBOSEd2f4 zg}=X0119Q1?vqd7AnIZ?F;_XdjKu9w z18hX_@BUF>gc134I?rsQ!DPrgkcQ9mIc{*Itgy(Ip@G3TXpX(aMN2tj%ZW^YBvYA# zYi$qGA6nZ(OhTpn;gn#T?9Fm|Y)FPON@UTBq_r6Bsa0^QNUq|ia0X5|JsI^sdxveD z84rIN?o)ku-u(W5`?dYJ_XC`!b_iipm*qn5k`S?2m=!Sc!Dl%?*s&zFajPbSA$0s< zL76JVNSIMAQDKqG-Wiy`(J5NYV^Vt|1)>>Sv2f%ZZDD)bSiRuimhHQpi;0}!SS5FL zr4{M{2i|p#hSTJF-_}~J(rRy&m?ti&3g%B#QH@6lK5NDBI-`uCxHg%XQ1I)1g$QwD zK-UIp`Lk0s94?E0(`mHtc5DI`fKyVhds*$2eY8W>&h=F7*``AMTyt2u!Ld`n!VdLQ zl+^kGC7E+xn>RvqMN@9CFIhI#)T`7N6|lUS7gp8U{Z`Nj>Dk-!k}Oj1WziJ;n@b$P z;P`N{)dm3scglUsZDhO>Z&tw|==)Y`Egtu0AkAMrd#%eXMN&-1xGP}BCl?OfxcjZ0 zp)bwIT%2E6Sv`6B+I3Bcw5hdl#L2$(6})yN)>qOgzWMh1ouHWs=y#{(G=ZKUwv*#K5y)VN!QI0gRpG6Y4CwvNFf0p7GBbFH_j^x1}~nB@is zVWeyX8aVMWP^TmoKNRPP+|DoHmca8M&(t7%Kb0#?N8-D(#c(>~4Mz)&Tsb)99q{^n6V-go>y4!Y5tyh61R9BGAvpfU z=doHa5=;5g^9`Q~VM+jZr$;Ftwzu|!H;ZOjF8B-WJQ@tAgwA3Q!FuKVO@Or5ah|ih z`NVYMGlZs-o@;mTT)x3O9OYv-juXq1$xpf6+i`AoW+pxUu7$Ie_c>ziS8T09XG5lU z@N+~PZEkB*=6>v}mF3wA?5i@v8ZM5EqVTcw^zr;2F~tXs7kj|nlI8O(DWAt4fCp6& zO!wPaJTEgw02yF~c7Ul{yPf&-vM_jEC?;HtCAPx~=W=yj<`BX=2W&z-Vj@Sxl1xs% zutEqgm~vw7#+th6(>oL197rYQ3(9DuL=cS%kc5HtRoHivElT)-)0R5cpY)xDtcyRZ zLEKptrP6wt2;@c9R16}lb#Q0pcS|iK2NgRwE^Q+`9g+piMI<7Lr<>#UxUR&w(!!vw zxlVUT!^t7o%AgYsVp=b%YO+B+#!D=@!AcP;7S}BWW2l&Nt+~Qefe)BsWCWGC{L9h4 zWiEx5BqoY{2P{0YgsrTH$E)B?x6%lx6BZr|k3&}Y$%cFZ=^f*Q`QRgPIv7q3wJfMu z*>#2&tXNvM6bWjV1Q+L1pwxo}$kf0AqG*klxxJ9Gr5YpvfBF4ieuW3eW!LNZ+io1A zf5o3yXMId5tZn;ACks;VodEpWC%Yw%f?6DdQ0s^zQ#HYA&uItUC^G3YY}4Y_=5aQV z*wov@81O~pz`#k{K9h%}8ASn{@L<8tv)^L9>1vni#&Or?WkoDt!tQdNE1+F6;jM0M zt}=8~LZ`NV(>`@HL@3T%egn2LoMM8G%JT(DSyvNPk+^GGd3Be}e7pAxP1{yRK{%1| z&F-^vi>#7Xnllx=Ma=DN{hpSx97cT7@``&~# zkQ@LLWTMtGW98-;-j&%5FH$P*ViFRn(+}aFsg#>#Jj?U`pG-WSXOJr#oYv85UCx(T zjE=-_U#AmX(B+4y+d}v$Y$FWj%S49LxcHM78Mvg~xS*_t5R)if+vC3y>N3B#3W@ zhvupej~`sAtW7m0Wk+FkFfsgAHrzZij-P!LJZ8SjW(vdgL~;UQxW!ZLx5EC!+(dma zYi=waxVKy^y!S8^d|O`!k9qt@R#M3iE*!gZ@2$xbh;_`g^L0L1m}t29A3j)JU7MK5G57Y8?7+T#$L8(?_Y-R5V7x;P$3&$)C_ll` z#{+HAWr6-WWHrmG=Or=(Ip-M6prEi@WtIiC>DuQ|jS-OCx>hbJtyv`4r`ZhNV8Ydd z_by6r@(YbkP~!qJli0(7WH7MM^pQ>j%dG(J8xCp!a}A1>(m)sf@^_Hg?GJHNSG{(G zWxtt9PJeOy@ZO~>HHwB0tghwXxpn#T*xHfRn|n{~efUM|)V}wH5&O@6h4=sLcbac~ za^kpVQ7G(%=lG$$OYa@HSRcN6Xf^-VXE#2JtsY+=IdSWXCc5~(LWdQC^L;}Y;Si4n zu;H^PDsagx!$@`=8_x{5@puM!CR@9Ky^f%9As(d-ZDNcG>^Y2&55M!?ni)P!Z!CBh zcQ_J6@1>iiwj@9x!xy$&;l)^~s;}@ZUcenTx89Y+hmjY~^oT4;$Y*e3Rg;5NPe|st8W=*CshlLP)=#6X&!~$(ZR~GEMGb0-=_YTThaE^j$KgY+B)+$DVEq zNd$5j)Rmk)r&FXaX$^OQpO`M~*DX_1oD-E%3xUTFM{RcDqI(*_oT~48WYz4`qX`=9 z7<-t^i4|)rtA}*R6+NH~db;73sT8_4#EM3CRQU>3456t4&3Xp7uZngtGucrudJE2J z$dIY7_8|P%P7gN^pP#L;wJ&Vck6qqBO-eJge0pts|Hbws{BRq%-kdDro=ok^js$%N zPQkx^nTUDr{e-y?jN??r_4W;fj|9(O@MUHW-aUNsjODn+gPEEAcdX`F^xXN>waI&) z(bCLdE)WE}HXR}|O>-V!J5eMOZ8#sW6w+W~X@uQICMHNAg^ZT-X#sFKS48xPaBxT_ zstuHhYXga%F*Hb4*|HD`P07<9=ryRv&jzhzBdDtpF|&!S3itr@v8p5ws@{p`z=@Lz zdO7+%I#HWlUeSm+%RVoSHoGiC@WQGPBo3Qx9%2vD^er|6nn(s^*x{t9-5^Zhj0U&^ zE)RbY0_|lEcmkU8oLVcFEp+e2HSyL1bei@bFm2+M4oRC?YsK!B-{R*#WN$N z+{~WnaIT!L#V37YrLMGZ8BG0gj{C)e_pr}56pO;|iw6dxsYn~%6X@?A{C7J&X=~XD zL%t>vB+fpBZh{T^3fQRfF+;-NRo+k7Lk^IqtNXwYdqQ?~X2ebuUOnp5iFib0p&k;- z(ZQR56N9NC+7RYTT-Ka;fZaX9^InDQ$9af?J~+1B@yTjPwsT}4b8m2@jhc`uylg!fV-2zE~ya43RKyN@W*5|3ePib5XTy;rwzDo z3CV&HISE1_4Plr-6AdByJDA|06e+VAtclAU2+i7^0UZ<&C2|5n^w*REI?hp6wQWiY zXf#4bn`0;v6+pW)CeHA97SO>ipvP672D9t5Ux0i^bjOYeHiZXY?18+6G*4{kYk}uL zo^W;Qzlorz;MMgj3sNJw1(0Z}o; z@y=;`ymMO3HVX$l&L71k(1=o4@tcgr9qvpeEaiktKtnpVLLMyubT4?dH2PSXl-eh-0X&*f3I^Si2dLR&Jh7{W{dp~q85d7m>!=P+KmoP+;Wj!2 zbDgV|>uL1f($f#udp3y6o$FRy)8O8HrBQD9-(2mZsC~lL9@7G*j)zga z$Js8O+E=#MzQ6Px81&VU*bZlj-@aG+rl;~83os;{g{CC=xw|+HV1FcA2^cGEE+Peg zNLKz>TA=NvUn~0u3|nkd2d&<(nho6ySHHh&vdH~iWCka8=R`s zJ2uoaRV7q*uIqoSZw~fiFrprqbJ_!OI5O><4e6m`U7}Nk0d|`|mk<02p?W|nLm3=e z;q0;@YvP}jM@M@Z{uC(`ue7LW@=XsYob68LqnZ49YBHqO`~$#zZ-q2OW=NB8UMw79G00%BH|rsC4)yRgIXT zJ4|97!+{YoLta_yaTgatNjAv{nnW#CwwEB~P}8`Ovd&_McFsV;0j+B!Gc&V%i1|(C zO=9DncW{Fv0mL{skz=bjfk#hU_<}u$An(+CcKpXz(mEw)!g+&bw)KV7K&YG{MDfQ& z1k}S`vbyRxDosf2sB)ABi=zbSnZ?Nem(bvxqsRGbRC2bkNz7Eu_1 zw%a2acHSazL^uY}NI!(igOEamAAd*YOsw);yCk}j1HZ1w5MQP5s!x}-P9ELKfGi)EOc zPX~ymEJRZZQMDG@3sJE2wgGhB^9C}4BR`(SdR{?$(;?a31-sQl7n5NTmkv6;(1fH& zbf4VP%BY!_rqA1g=Cz=fv2T75^SQ<$_Z>k^8+~Q zUBF$i8QE}(pYl%7i*Utn}f z;{rZe@`R+@%idL;JTQNXc*1h}fbO`W9elBPSwX*V?pJ z0&2J0fFEpNaI>J#K+i!`9?&)Wir$q8YEf|4)?gdKv1HFY5V2EBA-XR++hB

    ;Iyg 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 DH|yT| literal 0 HcmV?d00001 diff --git a/dependency-check-core/fonts/glyphicons-halflings-regular.woff b/dependency-check-core/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..f824ac15a0ac59d8c236f346f3bd429542cdf8b9 GIT binary patch literal 41793 zcmd75_m^GOwJvxnCsocl=bYoIoO8}O=bR&17_hOyV3TaX7-LMZ!CY_F6OTQ>Ch6tEsZmU}nI7z5o5E zKN?)ALGch9N8kLfva-FwU@+sg215X88oHpWyrNQ{3&LE8nXSRHsVzB8x0b;=JcY~a zKw}Fd%LaovOlIDYvoKZHdyj3dhZqbNJ}}#A6k~yj$>pg9STQ5dHlJvNH5oKDvW8VG zq3L%R3@%giJCnDp4cZ)-Pu!{4AhBixBc(MrlG)w2{ zh4pRNLhxJ<>=9Q9Tp{L{#&CT*R**fBr-9mc7e=XY)y>flxoHrGu9)R zYR%>YK#ZhOu2rJ}-g--SJJ`l(YD@lyz|5tmz@tEJVu&k=;FN7A81s#1x6D5R2ack; zxUQgfVIE4RjaOGsw^;TQ(?v;Oq+>yeX`eg{u?*?~S%G-sQV`JLcKsK7w3`mwIDuii zOzXUuiT2r}mEf1(b=rVn9@{pTSyWAjmIjw$umS>jPGIlS9iph+?)G+G_`O&*A=U!H zs-sh4%9^X7@$>*a?@B$1cO71R8+@S&4A=qn7mD6916daW#%l14wFi#|0sbN!AeKZO zfZ*w;_GPRDcOgjTfdPxmT=3Ov_kcUJdKQQ^ZZa6k5#4IF5k66^vd|D?4hy$A&;r)j zrv=&3+2qF%uI2&Ku?NkHsd4$cqvQEvww=jd6>Y^VnCV;Yc>Pshv4B^DtV6x4_e%>y z-O?EZAS0hQuYK}Zdfi7qfVKtV6hjgL5?DiIff~66z$_K~{kso{V$(Z6DHSofDA@&;)9KUjAKQ zeb+H*UALMz_Ze-7)Id8E368FO`I0y7~lzFOG;}5>s2W?4ISV{fXup#BdYYn zi5{?l%g@cn7Bi=OjbQs39nBE^WPlsf3gG2HJBab{-UQ<%-s;Iv1vT7y%PzesDB2y0 z7cIVz9&ukvy6^-K%8mB$xqzxkXll2UYV+J-zg)w!lG-L^%qf7LJ@r_A-KPBjv~n>9 z`-TpTm*0FTSnWF-X0_82xgwzpa=BNPK2N!z7UXrypz+MI$~nlHGcS5U%+}Ivo#*cJ zOm6SDh5GRWo#4RxFM>7Kc@=U4ix+<>)?N|n9IP;|?>P<@1>(x9AU}|fa8C!(OLY@{ z_iwMgsCt5!w?)*o#LhAxiL5qYzi>(v@b0(<)dVoOaz9u!=#XJ!fJlNwrun}_NjS_b z8^Bk@YVGvd*S>l^(LdYRB9;vi0ZA$-(ab!7l{eE7u;qRm162*ziBb3oh;ER|>cdPi zcRGFWTq)hn9N`D5WCoCXsm(}jV+{d310&D}S}db4fiadJpA-pV1%2=aV+mY%l0h~f zYDteQ+J`poI<6{P=E1|a55Sp$$v2+>|KK_Hf)5@5>)LPu2N(|l`FF)HITgfB^9s{dOxMB!Fdbpg*3<#xB(`T+c5qkE=Gud642|$!tc0=WG ze>}q%5SdmFvES~Msd`~?uc`50xxc~`0bEv}G6W8UvF6osDPpqAjm?FoO0uEW+D4^s z3%xAhYu{&0^nMY{OqD&%xg5Up0p)W>E8Ubrb&i8DbWJ;hN2|&8QfsXFKMoUf>)MN~iHn=fHxP1m!X@!{cVGJLd-3J0n1D zpexTYD|IBhLN$3q^(*Di_^koVny#1fk6b}~~E?O^oPYg*;deSk{*`5x$rs%1ef2ko7IlvyO$W>Ik2 zY|yr&7}c;sMod0#+d6?9DB#9Zd8THS2w$qzG7n%hf`B~{4z6*c2#*SaR9Do9Df=6T z4q@zl=-9C~`>0mPJ-!?S_7H3fg)(I7s`HvcCQ}{C;J|AHM-Wq@ZmAv6ZveBVdWk{w z4jUZn54HDITZ5$v1cZcdxpOl`UDuwUfixY;;b+CeFzj#3A`5@qnM=w9gJHurN-rL1D1|PG|q~gH02doGLgsMH& zL03tZ4z(ZDsY)lwLrrY*zJVj{!CPk@!2nQ!o?H0)2&-Pcm}^bdC-lv2Mr)oV^F|OD^eQ#DRZ*^Ec}B zWAushcQ7HFkRWphXpj5dCoGD$Uyj1I293T^{v&qT2=w?VWG1<6X z{RK4UKG2<3%o1(N2{un^E)A`?sRAUkI?v*I$&8xs0oeAGDi7!@Lua3Y7y#*ToTINw zRg?oRK7$d{IV`gF+?$Xp3SCeS>GgGxxAJT+TUI&o5`Pajw8LmrMZJSQyKYV2zW`YrSGp zT^a+n62_?pv|W1sE#Fx)XgoOc%(=#;`_C^u3T+lNuL4@eCw#i=aGq7nf;n+m!Wd4XYUYtK0T$sjSs<#dwg8P!_2tw|^Ww zvU-8@AqODsYuEfSW=LFG2e?2*om-rB;&t2*^RE*GG=2VxW%rrq`B8)`SOK3E-gt_9SMEz^+pTip_?lC}@Rv@5N1h901MC0gQ*g^c@blpHTWxpt=nP zRh`ot5azxq3F?s;)w#v6_qXnVxioMOzyU2FI~fKo@dCw4zmP z;LYiY(br#q@|WA50qE4Nc0eyrr0dnhg%2i-8dl%r$`9qE`#^zz#sw6AUr8nMG&NJ;%Z77!<>D z03^E&aG(NJl)`n23}USk5hVir)2BtXRtXZX&p7R?)KF*TJyUFqf;ww=+n`b&Q%9rs zp{_#-1{EDzuWh3>a35s<)%+&7Yq)zU_;8)?cR-i1TdW;k}+xX0{iprk99zh*fg1$8z6z*p4${# zK`b4e<_6a3E;C=;3&}-BWjsJTvqi;1tl;~guV1e^8Y6=uMF_JA*ydtfBtgce z%6Ez|RxhxUfUTzrEHIRYxr8aceY+7G6d(=F)&I~aJG5B>L<$7pzN-c9?vWGjG1MPuy z{QHkz4C?060;{?BS!gLBw$1fe9ve_8$d=l}`&j~KegdY0(Exb5;-lTmuYB~1Dq>3} zkHBV|ZU8(%n_QX)15C*}-Nqw^MbSYzd{fP!fAt_&s;C$9+_I%8RXlW#D`N(<7^fKk z?sr)2T_%KwS8WDDiwCXwB!TmT1sBl4EX!0m+sl*=85#-uU$_16A;w402SHD$M?(9@ zcYaSF^38tsmtdu=K$X-*t}dJT7y`AC49>S;`Qe{*i#r_;@CiT=)hw_U8H1m?N7VHb z&3TMCaOMSX<%%q(B9qg$P^Q{NfVb&dge%k=YMC-sv`tYAiK$fEmN9HxZBo^WL3ZZa zT+VtXG=XoTf!D-<3}WekNI7(5{Jg{x!cb`c77EFn^iWyCr>ZRuS~=T{W5~lW<$!V! zlT6?c2-(V$40mj~h>cHW>pkMG1p~Xus_8PgfO0>y0g&H<*#^U-Z)GPY$4TCiz;J6svK%yh;UeKH=lr#3<7r4QRxo8&si8j2VkV7 z|mCfJbZH{aOay!->VB(@kVC$gywH@Xw{qF=~QZ>)09D(l7b?s8JS{;*}nG%wn#y`;%n`cXG0lHN)jFH-00_thX+MiH-2Tx$AzX${WaG2D&picc+7I*9 zM-@t|Wmgu4BeoYGgE#~M^b;2YTFeEdy9&knw zu#ZXQ)(d1b(C#ma1B5s4>sP5;nZa_2GD|qBER{>ZN8G?_N*Gsw*`to~KYbazey=_Y;>@d>pMzLUbPXT%>8oG@ z7Q2n89S|x5s0w)VZZcT*JlOb7ML!3CZ?Q^_lC1I?v$3eSZtK_-E)M+dji>VY4iRYI z$Mu9>CS&c(JE*IxDyH_FW7h+ELoAPsEr$HES{Vn5uy9C%qV*Ip2>-|lpn z4s^A4)UB(~l-r@zocV+5NkRG*Jh6pJ-#(^4u+yYZYu|ui&CIc^|Lf(~W*`_rKou-B z3&WI{B1P=5CV0S3rZf9^##o^bvr8q~l-WlQ@ESq?nFpY7uY0-N*#y1HS0qrvOk}@_ z{NOv_Dqg!vu6g<;MV9$s;_^da0_G5){pbx-L=}1M3_Ah9TutIT1jrBpJ|kpW;tkXTVZzW+^}(@ z%3~oa*5_XFD(-jlzyzQ=H?*km_n%!9qZj)}jB*~=(=p(C&es|6(X(K_RXjnsiUQQJ_PqrN zfE7DICy$GMjS*&i2(0vsRr-&`Rx0;NlmJhNHt`zJPVkAf_TS$ zM)LqvNOv<;fOZ-I_8@?1uVV&U1E>b1Icmun+FtAVUqRG@fVlJ&aL@iCa5s=OYpGSO z26dacw9_#J4qSPHw?&xqbOJLGgFNDuyXXsRvShDl@VzXsEouVR#)Y??`5YYw79r5D zJp~q^8+9dL1wl86!jk;k^LO&jGUqsF4h40aMcdFSm^hKiq2=5tD?j6_ljI=52!t;a z;iDge&4JF{3kLM4KzKPB#UR|rZVL(nsuoenQ>--xnE!Uys~%O5jLiY4fY;OCT_7FC zf%v-RB6eATuW3O0mWaJ7D-YJ>ahM(GBY&qorm`vu=J$NoGPotk)(Z@{{(w@L;5FA? z8-^HW&uQ@hqc;;&=0L5aYchNI`DP6?`tidyAK%?uP!AnQ3~g{ptBE<`4&9f_2^>6| zdG;IMlOf-5U5;R9|G*D(I+%Dt4!L|I0!+bK)+$}CawZQdPkRJf@Xz(U@*60s{GkDT ziHD+CmG+BbEdqQ}r4<*PzVS5p#Bi7^w{A#Ko24iCe8VQof{#i9sVp-;{WOnJ2Z}9@ zz5X~PprRTGwRe<$u@!s2Di;b3`4$ed=W7`0H{`$vv=ZBU| zt}hmQR$L{N@+lb!zxeJh({>hQ)!WKVq@}f{GG~H=2KjQ#+xCp(K>_Z!5!3?Wo`&tg zGQ$~HZw94i1FS&p52{LTXk6C_5=?x3k0{J=wYEN~D~xFz&+G<@Zku7<_0ylhHY+r> z7HGq@q#g6L43xSP{V|(LJrd*)&Y|+j?RhL)5MmE5@-lMk? zWB3e!)dd_mZ__zNH-DDPy`{u~X`w4srO;IR!7pGFjEisxsI00fVC4X%o?wvO`TZ`ArRN^0-MYn->T&il0Cp;KmeZ$ z)Y8NQ z>R?owK+VB7m{GtMh~We58F}RkvDiirnDZcq)vjVtZTfKEJ4_5V^N@@&kf9u0nJnXv z?x^EIfc8S>53{C23_5oo3B37A03DWR?UY*}c9mWja7R&dK`aHHBi+Zxb|S@YOjTKD zsxyqhTxxmLnR|`Unm{-2Reee(!Rvi287gz#kfm$+qHU)_`f!&z#-Lq#P=+7;AZ)F0 z#JwerN9__D%V`dzqD$A9vN(gK#8CAubLGUCNqTT07YyjPVhZt8&L6$t8Qp~K~UaDcTH!?*{OtJ6ZC2nG|_ z)8kX+U>`os@B$3Gaw^XqJU2tvtntCh3=N0{1+Sd`H3VxNm=*yZ%@rwG7XTBDG4N8g zF4j7TItDGYVHKP@VpdHLwbO&Cj!>6BFb>&Gh%!(Mb?yT!_fPPrl)phO# zG4dhIhIQv7)jybcA3nq<0y`k{iEQx6>;y5TB;ERU-kK9PZq>>)hqEeT4D0~_%dKEh zbi?=rl&TUib!aXbC6g2$qPA=?TUCjOiJd|)$e;l?pBvMD6=4rL{RPB#vZ&qIxd1+< zg+2W^g1H|Z?hGK$DA0Zg8tPx}f6`k;*v~rDdXHxk@Ih>9@7>YSpjt!{R}2NI4)O6l z(5>p?{G*tJI@;ZMR=^vStfuDl=}a|qz$ZkqoPE2<5C7x#`?HKt1OpJk`slc#^6jg) zVZ8dh%%~tGv2x5N#Wps_eQ)#N0OOH4RK{98eXp3N=zAS@7M0Lz2c2VTedy4vLzx<* z7r126#ovm>REg{_y`cYi{mB@a6Ru)tSisPQjqFyxE!D50*K1`IrNW3&|IS2r59F%M zT>Fmamwyr!{Ki{gE1;RAvp<5!QGSNX$ZmkLLB}z;etabQfryc!2~15DZ)AA$N2_j1?o0{U1C6UhO#L31OBq9Gf?+0w5Q4)Gbsy`k%S2Y$U^< z;qGTChL+U(M0J+(Lgo;_bW#PkYq{v&p;~iWvkxXB?IR|vJ<{dM4}YF03Uda~e*LYm zndetcfo}p}DBPLbUJ6qe(vR!(K@mvDLW;|Rda&43j^ukYOUlH?jkEUvj1{o@-zVRO z`1t2w?xuvsh_|(OsLevZ_<%BwsxvWB;z9i&fPwey1{-JSZ+!t(9=;!?{d^zYrQ`1} ze4joCVpL)WSetqT6W%D(J7N1!tQb@t!L*wlwO3j?E5Lx%-4thA$Y~jlMTs0Q^kv#_ z$;gyn7+ZqOKuo|T5HK;xbFly>=s~{NC+VwXP#=iP_;$4TB&UZ!18hKrY*eigV9J=@ zJ6TxKiZO5bAMd;d4zN(act~wa#Q`RtM&+D~cgS_FB98Mw4EQ1t%i?*dIfc7|D@_d#*7od2TmB7lK{i(E~@aP)xbGuYWvW*qec+j`0?$rY&mp{ z^6Dbj(SE!j7D{g-Lk?8?f~_-=9mJq>CM`1u;H}AvzN?|lP*fx8pe??i!P1c!(535H zxuT{Wi2RQ?es^76nI@KgKGpI4CuKBr{cZ;qjgEy4U4`=5y^I}j!XZPgEaPs5+jeZj zerFE~JCu)gH8{<@FoEF|eER(wda*#c%(tso?LJ?>g!90@g^eAAueA(KJIV98`SuLs z0O8XNBWn2$YZ(k1XkyFj(oW&m8{^1MI z+(10fL~tm0B+JYa*RUQl|qSW$Z`|3$wuF8z&`B=L7eD3Clw}Tgh zc+&UoHiBEMe(^dRqu{WZH!)yUpa2lF^v3I8I_Mq1GH|pYnlaKgFfp|}!V?~t_w!IE zKsnu`<-C>|LCG^zfdmyC8o1}q9{aY2A+a)Fcs+|6m`m~i=i6{Z<#oS$-L;3Z4Ml9E zxy%jTcpK{FKY$5L$uwBR`a3}{GLZ^gqqZ#Q2!@h}OHqkT7jwO+GB99UgmB}LIk#h` z_9Vtn-`y+JFS_)+^SlgV)kX9HV9o%kz(Zpyt|hWA1ll)`9L@Jf`j>Ru*UyPMsav45 z&UP-)ErJaObyakpM!<#%jN9|YnXvo8Nk_hKEi*&3p_+-blzXy-lq?s7(u*R8M7Dp zsJfM~g_PZVHa4C)3A6|jj2=Sfh^``^C!=Q7jb>RVEsgc82%cPE>yXtbTBB3m>2mIxiud#vXNGPW75Rfnu?<&zMN>O4y^w=I@M)SDp$n$K4g5Y+3HckfdP=Yn46`R9I1K1#FyX(d~5GviE0m<3M zWzp&&*!0dm0M-ebZ)F2fj&tXJ*FXgzKs_hjd*;K(Fsv!$fm2jv@9tpW?hd9Ut@f>9 zKa2uF-vajx6e%xe^kcyNc8I-fInJrUojYs-F+Wms3=9m*dg(g51+WDQ=H9v5+5i|+ zFE%9`TvbObBf#XKM}me`CP8No3F<~557@>6xdY(pFD=_33V1dkJJSk$qHGMa2W&xQ zDfEvZ_|&g-eUYyjl~&N$;Z8V!ZGfieTUQV_4+MzNxg|8^%Z7*@-K>IJ0Rt0cDU2y@ z0pi{PZiM9`;0eER%Fn(F3qv?07kHSi{l_1_BR23O?$BDjB-s;qx!Ob{)Gpd|v=*{^ z0XZUO7eulZ3z|i=l(3LWCz*p*{b0AgpoGeMci1<8NzRp~efIhhxm|aQVMmB@5JN%Bq~AQmsvA43>2YjA zfHP>k&324!(l$x$VIPA$&_9Exswx8uWi)tE*AFsl0dprXWBC95;9Eam@>*mANRa=-g(hU`ih-pD*)CEIptIbWjV%z~wlw z7zH<;fIRr(yV1OT^43p1rQQ0LTaLC%-oyyre48=8^{@A8MkW%9sV28_wW<^oCf# zr&9Cz$^dM28P)ga`({Au3Mi-=qeq3Yf#gN02CjDO3Pz1G#{zxg<9N6b~gNT8DX9Pe2a<<+|`Wf|*0_E;^ar z!JN6KW6hhD=)9gfdHNo&5U8mjZq9zB%qs@ci_Ze6_pxwTh(L{9nf9l8PCe4Kh#{Sq z*agNt&!1@IRed1fK!k8MPrz{?y0<2j8!YMk%vkz>`77WC^VC5O_|PD+mxy2%x`PH~2%aCl zb>_RnGGr4uOuYK)v5}~s-fGkX7!S{Bf5wCR?v`orTu!LoV&^7ize~@rML@MQ9X`_> z<0u}R@9da}5tr=%7uBbtogAZJ{AYZ?4W%&60B^N;`S}+x>S?r@se?=h`GQV>u095~ z#ViUs!Sl9#`UfV9V1UsA`nch_$#1+tR6ykd?H|pd?rdm3Ot0GGJnQPn>FD$Wrhd6V zw*gvf-G|~23SmV6+y0DH$q>3+4JMzDm#6eo=>U=`|9UnW4;~xRU2=y zf-`M(H1t7jO7_tWt6os8WN6o}{PE$lFht$>@${TsXg;^;+ACM+JWjO5-XbXGb?0w~ z$l;tt0NsHy99J zt>fzLl}8x(uh%ddfcaQjwrClt1(ndY6MDcs{114Z9#@%5^%V&op6$Gx@WFl1ju}e}}M#>DhqfOF?3|g!_?FXSUQbVC)1Lwp`PgXFaX9l#mK^tdo`s}N$jAG!6D|il|qP|P}8N+1h4DIdXeByu#!?44SK|i)@#; z9TpA1of|<5D*31b_5nqCOjsS~UlX;1zs!;ME#>%gyQ(>4sw7G4lq&M59{KY=8!Ct&&jC3Ng9cS2PkFseQHf(G`=nG8IMGvfi6 zI!2pAprhD?Z_>AZ6DsYXt6FA8M5$prWOy!^B^jU^gOiMufo@+0l{14_HfDRPd;?6< z5pkt^pFae7986$7!i{kgXul81%^v9{$J}8*?h)`zm=uLR%LB1s_;IHg1gNNVH}EtA zrqWB4>0XB{)ie^;VCe^a{csy|z*a8kF#2SekI>!co)gP)PPYy6>gbVe6*LUo^h^Ae zb6`lm{IZz&Jg)&TRyn{AkRhN|6*A_9DZH5&v7T=Icr}Znuy&Yk?$wq{GB~n z#cr!%GBQ2%{hz`z!-UtNYTVi!7VS&74k**<>@8I+>gvgDaA1ZhuKmF(_Q_DI9`8P@ zacDgtz&2TZ_KB_H4T~Fo-~k6R39d3#MMun?-3|IYlvU97BJ&bp8#%CNF%)nwtdc2E zuR7COOcO@)xg`vfJ3osZN8E}&GE^==Phe28i?zReY}Z=Dy)h2~1Bhz~K6t@#N=14G zmP9h3Z!#Zz0Hlg#Y8U#!`8U9UzVW3tr5QOv2b&Jc1ATmVI(T|gl=klkQ`+Zp9&m=vYU$Q(D>Kxm6U4y0IQyFz8CZ+xilLRh zjq%~NymUfcfA-En1~Dp^FQK?nzSx+)0zQc6{1$j76$@ypRSs07U@)Zp0hP6@_dq}W zb1;VbIJl(O43ns4;ry%nJh~vHD_Fg(FlMO(+TZfC=wsfkrE6d3LaT31W=I7`-La7g zD!;sRYt9J<7*P2sgEjh;pI+z|U(ngNl;QgCq3BQv*vl>#G2;Oq2vWy%U|kqWlA4W> zHQ8Wkpg%u+H=n)HH z3mHY$@D71GSx~Px#!SIHP$OtByAB-SX>Z&a(gG0z@&^G+B6QA|0AL^U!R_X{F?oll z<-q{E&ws^m#JaK|qKDnUU3w2aA%Ia4l`Neg(Y3GLv_H+1o4f*Yee~vhaS%UKfnLD3{1B~FJ@)s9>Ge_53u68nX5cg7*F%n@3cPx#MOF1$8q6J z8Ew#SJy~F-M`wP-C1xz>9)TxUaT!dpdGghWRq@X`PfZNP-~y`j+v8LcQI%d#$l zCyEt|&bOgeMEA*99l835&M9rty+9H^5al<2miGvbBEoN(dh{ zWwx`bat~`?7E-)2gdNU5x`_&!GUXVtRjsKC%X1O26K$VoF=`*76Q7%E@v7bHqp;}&*#oUoxz)k(_ zt{+uHtb^FKxgDl3b>RF<+P{j$nU7)c#p~V)2`qd;VIAEC#Pz8?^E`k9`;W_rO^to4 znf5m`R4&ZGykd$qw_j2Q#zZOr>2Mz8%Fdv)0_!@X*iXL*Nq3w8H8R}G8zJDp>e<_T z3%!)PGng;TBR7zdkK;hl9?j^Gn9=~#m!D#1cK8;hhYfs$CCDsc!<@QbcMv#@mX_Mz zxBKAaN0I7n&I-Q%qbTqJP&{aZH!{I; zK(X3CXOEjf{p;Oy8Bq7Vj)sWZM@30Ir)cKDxGkxha9S5R? zwz2udschQcGc(0$Hkf@A{@dFq$-#trla%x zqoSKyGEg+0$YGD>Yq`R2F>51B`_ukBa^tJ}$zTHwM zPCd)0cg@VYDH{a9+{put()9pmRSNEl1>AB7EYMybCxwUd^5~H)9?(;_i^7L;Q)+*) zkzp7(FuOuPz(H1tDBxaUboZGbUV5<>GCm0`lDW~q%rL63(o1~Voqqg~nE{lvh7>~- zUVhqZKZSeYDlY8(%FqA!(;w=BF$5S0U;xBG&P>TTp9bI%#D=h=x`J4}Co7?F)7%n^ z|Mcr%+=U?h2r|w|`!$Kq7U=%G$hV`PuZK8LItcLK?ih@sb}?{QBaAdZhbDr&{5MM> znC1eGhSzxZVTK}<8(RPsu+L?6Mh`&jA8G$Q3vC^A9L^pX?d5{8({wPic@(e8i9iS- z@%$q>e0H}C!404YZ+)2L%J3=gox895puFq73WbQ=^V@lH}=e}1+zuSjN;_qe2!%FW!w zW{kWh!T3x;2!z%*Vr1Ny!o=tUO;=lhb6=exx_ooA3tWfU2lqg~{%bJpr`NqW>&cyE zZ`}Ir+!&RgW4_MuEp%;=xtGlXWQ!jd7vEF9HHYr>=@Z~Vsp-X$rUX3ulC$=|e8CLB z{yopQW%u?cO;|Ux%>e6x2kb0P+PXmpTWrRPOYcCN;XjXLmMsNtZL@v{aA3UsZv9O}{rrar@M-|LeAAp_hXEL4%+%H=ZOm zhgm!U60jF!iRuf%6F16G_$WlyjOnE8W%YJ7Tk!0UpHK~Z2&3Wi&$C4^$pUzbGlL3bfOhj#GVl>+Uy_OLddOOk_S=yxR)7n> z|F-DhYrTD%vw2u15U-j!GJ@BDfUEC-sVah&$t|CLFtrGROE-b$7>a#XiGUjds(W;c zD7DpUle63U3{MOcmaKx;GaL+_FR04~jIn5D`vML;!1m)3!B4O(?X?Wx27r9!sCas6 z2jn1j@Yeks?^G}ec_(+!owL<>*boLy2OsR~-!;U1)qc7KlG~qRz4A)#xF56u0&?Gt}UDa==Ra zL-lqGri^wkl$mh|^;{1#dXX6e>?bz_LahAvPyfIO`!b-R4JsvSyn{Y}6$Ty6Bf6Sz z^bTT61s3aK234Cr!mut2%nrm={BPa^?gL^{s&)4!N0MAW{V@z}prO1kpZeq^6mR82 zr~sD&#`i=fyRe!7Rx(i8ZSnbQo4gxu?Qd)qpxEv~{!fj&rXZ z7C@a#;##3}Vljx0ortUk*HM{~cjFn=*GplwP$l0z6+GO4@#JtP`?P@j=H2S7**Se7 zscRTpdS!z1fdXrYHft49-FoeIsDA7c+(-8Yof=S*z(zth(Tl*XKSC^{!liCeVvSoB z^tf``DDM(*QzLCRAIgI@jg zfudIYl!0diWEjjKs7{Wtfc0Y!VnV2tD$FfQi~IW5u5C#NFeW;J z^>e!;p6nKpGgct~gK;6j_2=jTJ1(!BX3Hb= z1V(s4FiiGq6{*vZKseK86Eq+DmAYTmEo@V)ka~LmZ@;+ne?9ZYeU@=NrJ$Z43CsWb z+G7yR382w*$Y`;Ex7zz@e~-EWIzQ0u?l)BWK(4XB=m=u`18kWZ^p2fOaA>+r`|^KR zWDCD!MDar&gga4k#&pyXbzu>%5VY~^|(YQuieCqV!&26mkbVnhS4 zG&(k=pZ#^%GFz~qcvkygz^p7|*b@YH08;(UFW4@P9&6WrJM0MBai~nqg>5^DUI#4u zz(TY?>fgn_)9V*_<{n0mbD*5*gAo}i8)IRW@7Mwn0pi(!G!ZJb7ck<(vOxwnHmP<4 z!#3eduP$GBt1ITzz0k}+fI}~sO63VLb%vWoF#Wn6I(;FmL1{58BSEmy)Faz;D+3tE zL@V~=OQ)KxEhp25A-4c&zwzN%w-V#5w#hUb=j~GrxWKHm843ds2wDjB1fS(jQv2v| zz!ZsoI$%4(8JxxGRL>6}#se@%=CckCmQ|Z7fxad)*Pn*8V(UFplMsR%)1 zx!w91AgFvGu&f#wqqP+trTt|IsAt{`>W-)ke*b4Z7f#BBWh}%-P>hq8Sn3&#Z(%9T z$@FBg_O6q=d|A-;AUa*_^7hzbBi@JpfFrh~B_>8F`I1LE&Rd zLG&U^swF{P+*;X*p}_mvcedzaAeZ3+#%4CUMB`}A$eiy50%!Pdq z;B~g5f>%YA^;t4?1dU(5pzBa}!t@c}=9VDSt#sz1b$4tNo0ouLa$IHdq%uCk@AK`n z!E^@FS;E>Mb*laRE~rxr(=uVl7i^GwD7~&am?^rj#i^0)sXLcDFlGcuEyM2iDmO9m zqp1wk1p<6TfYW<}ouS~47a#X-uZD8$o<>Rpk;St2(J zAu~izDG~`DCEA3Sx=q!0UC;q0)TZ={&G|9A0;HlM6TIq3rBz>Tcu_ISB;Fy@GO=_hYgHiR^E^qW{l_-k5~e!S<(P6dFsSd1Nwr!KDNm<8=1*-7z*u?XQYL z3g~5fA9iej51j5b1kKbB#Y>XZ##z6ZQ3`nLv8(4!ISiUM=s5YQP z5SQC5@dh8uFvNG(Ls?E>-Dtm(FyPO^Yplsk))d~55}jHSZ!w!b_5K?e0snFG&4gIS zfsdk>wu^FAxkPYhYqz41r~TbgSOnv`b|@MfldAK%MKP7-FcUk}$3CWcrA+uTrtbL6=YSU3MmiZ%z&5p(iNZjs*j#zMiY4jB3}qNR8Ry(XW~6@;vqgCt8encr9uO`0 z%I`BiJDC%QQ8S3;X9kJ}0V5(@M0|_qA0Ovo5S=WRls?z|5pJRzRB^=4HVhh3j!EoM zPPo;^Ft^D}j^bHaZAsd{azmll1;G&fBmhv&6g69f@X5d}D1QEYYK@q*|H&cL`X#kB z(>o$pt}u$AhnOqC(t=1XCQ#1sE=!-~*xtiS#3o!^UjNrW?l|K;nB;C9Tq@PmMyf@^;= zW8v|^Rvlj8thG&07fbXwSTZ_T8~Fw>?~&$ZuB%?o^m~cL6nLH!7_dFbI%mK}t8zOt zATy1ucfc8B2VzDWLA(v%gR6={=osBZWw%6|X`>jLZp3 z^Ox!O_e`?u4jI&%7Zp^q__)v~=GJX6Ys_wf(gq9CkO8rWgov|stAw>m*h zRXl+X76x7CvjN5q$nq8JiI`^s3b<%3XdlEBxb@?&P??dDAX8`MJE%VstQsWX^9##Z z7{^iF>CoF`Jqgn&Q?0OtHO5+J9J@e0Rocf?HV5vVIeEyf0PA!CKnLZyf;kO$vZ%vV zPv}i&b@5JsorQLmhW6Sk9orc*VgO`=b`l5UAh?qt6&3f(_hAGu8|yMhhS-(P{TOU= z5sdpCc6J9}1qm7$Zf+YG<@vXlxMO9=Vh%PjWdWY1lObPJMPcoRff)$!o9h?lNJQ}- z$78870=EV+8cR!zT@?tJE2#tbl0h*un^9`LM!35bFQFqQiyt^J$J`HZz7g3mNtHDwWo<)C?1>e3*6vj94d z2n_H|JMi;Q)|}ubLg&G(Y>V6(slE@NQuTJ||4$w#v*vfzX`e`wN z&tE+02|@RcbE|RMAK7->bn~7uoyvg^05%dC>*Lto9q78LxqhdQH7{UXnIAyD2;n?M zz6a|WP|LI61*QOo!LU69<^!to;}KU5zyxd@>AmS0OrrXkq=VI2_v=64YQtP%d~ee! zlHL#XV29Z12IG1>9Kf58BMJkx@rw5M@4xX=cAO@;qHNs_N(p_&r(b@eE1D9h3t)w? zBuaN#M~)!o8&8|cCmu&I2JDn*?6El(34J7w~@xVDz`{27E-q!#U z*d9QtI>`2()9uEOe>>JNm#B|hW^R4AXw<=MFAer?X6&wmeuegZe*0-FW_S#UE&&FV zyPZ>H3?5mi;*{>Z7dhN<^*fm|WqLXftJ>X?e%pX(M+}7y<%MBo{N%nIwf5=n;~E>e zF87O6&flHD05U_ixG zM$7j5ELp+T+x80@q1xC6urBNwj|;zG#*IYK4yYFlH0FSM_n0E18b|=MoeeY_q{_+6 z8alw^2(&}i9l zH0~Yr^&4|>pT2m5-oMQ{UvPhqm! zDF(}+Ol5!nH&Ez#?H9Df2wv!v7S8nBJK_8J$!I9tCtxc4mHktXwZal86J8K>Tz~Om zeQQ)ba|DK!S^I!71lM&rw=xrzdzIW z(!Kl^P2lb^!tem4BEZ>~0lSevI`Z7zU^W@Wtk6uZ z5^V%?O$`DETIh0~U~Xlb+Y2dTS_0Ym6{3_wg!-Ji&t8VY)!i7(6@rl(_*~Ucl6e#0 z!e;?V^gR#=I{V%Al3_^y7O*~0ra89-C~;z1Rp8Yh&S<|bQe#W!u*IqpWj>{JgX!qy zhZ!JxmhtIfJ>-vs4?+}H@u64mI(O0;643r&Lq#n#uE1z8e|*or2u_Eo2Es1uyEazN z2m|)6JfjVZ4Nxxj-;g1A4QL{RE1E(tlXN_**{URE} zW=MhdjpEII88~Xc#sHng^3~&F+!c{50^A7t_*t*)og*mRvyJv0C@8+5Gryvlu?DU_ z2R5`PgB;ZcR7kY{{Ss!hw_XaA1RF>2kqWa^cjX&fYx>X-qlW1i0Jhd^gU!qaU`YGv zqHSpH#mnF-BcSol2H+OD2E{MpsuxRB4)q5b7$jNB9GOD3WYCXcs__KOpoSXW2d z|NR4s<$H3UTKSfn76uk zpBRKYW?DpP@3rLjpADKkw1M@&9IUZ2P%g-am^TYK|9}e2SuVchQplli^?u}Zj$8-M z{RQcxZfI5>+4@*z4i_&4Y5(uUGAQ13R~YEuZo5zW!yr)YJ*O%lP9#(@flayOPcLi4 z>IbRiohr799d@_keZX3CXtiif5Jik>oY@GEwkL@&{29-~w#UTc zUA)F-jAhPEje!6kP^zL^e@2EcyK5)G9O_)>?ERU@{G`WVhi`JkHInI`WxwU9W!1hh zTm=c(x40Rj3>i=QHEJ*y+#Zyl2FLfuhB9NdQA_24$ zK1b)#%iKiSe?7v+0I)(2K+YcB9vL3}9;+T0cofD=#ssylYCqiC4+BtHQ9U7=dq*gg zED&An-+uE2wH=vm*@OJ#XEHdfg)9!QRB;lcRufQ}Br70O$uKDeixpGlN;2!hB3FPc_ND*KaKn}|F%rUMdt(lrIY=DKKf;kpo zFqjz(251_&LN^%9VKX;)amtLdhVAPw%Uw)|V#cY-!4JF=#6$tugwNb_RML6oZfH%k zCRu^C+b<-v*6cH71^(Vi2j&Mn`zc-tq=c0)i2xpLe@*oCtwjgz*Yhz90rAt#beYV# ze)6M!M@Gzkk+1L%crTj;z^V!;^kBMicX5=Rd+h~~I&w-6wV(2sIAGWU=(?QR!Va0I zP-!vXVktJA53I54^>B+oKtnrqQdfcDP~Tg<<3F?iMQGWbAd zrN_Q#Tvr``Fon$^yQs{rVqPZ87|oC0VpRuZ|TkNRc|8w8Nzxu~p-+@VU zpi$<6m*~y91~6+-rdYw_S(`woaEW8!aJ_vAQ9anxhVPMFw-KOgF#>>i=awQW;hqo1-Dy*@E7+AVSF`CFQ@S3ov@_A~wZsbJE_T^6K3K z*S-tuwL6X1?x#F?aP2`zy2(QMilXe8uKj5fb_x1m;ENB!(anW_*RZlG%yDSA^9N zq$io97y?CD6hXR^@zVt0FT&=~<7`X2LW_a;en2S^M|2&w*3{&WfUv7L$rHcR_LLCHJ zCOgIdcKFT7Z;o)^aqJ$*Xpnipn5$kdR!-7*;bj>QhzNvW3lEl|aFrD@ID+7f|6gCh z0~BhXhh<;Fzp+)*C5$jXN9p+g#VHd0@$ReGk@jUPWDrREqA@*E`%J~J7zES|bzrvI rud|qO%&t*s9p4=a>C(eVk5+BKxj-=M`2KEQp7wpczxVj6 z%82(zo>Mn(Rh`ow=zx;w2bOz<?4F5Z2E$=)m?+WB{fXWw9-Y3gwh z5wc1Cgow=C`4jA3CwEFyw=bCU)a)`rL?N^vBO=1|Px?}Mcb&SU-x8$xI zW=^fT)GF;Yj9!oRsi&R_!|>jF?~UWw&MgrgKYsl8e((40zyJRI`}f=B$IPh>)#t}u zrTy1x|BIw9=)RbGGT9B~Zh_o&o=lg!u$ehK5_cMtN$9l;+-Kcu$K@J<><4p~v3)>x zIrCMMT7roPU-i^K}# zE(m*rDeIYfJnp6XT*uycFVmTQ-tJUnhmrjj_jKvLjk?p0&bA61yZbR~3bPyBU9LJ=H11H6R}%j*J1?#g zNgT}V;h?q78kej!Nq$e}rPuaIJzCdLx*tjG{$3*jy&iDxY$kW)UOaVvx~`Tx-MJp6 zyJFnA%6+t{>m-hR?jA@vnEkhky8_Z@0PZn@yC0#h{Y@qi0I_@JtkVY~)-;QN03wni zL==-_Zj!0XZpf5VpF6R+&(WRm)V6oe!t9dnWeQV!JL?&xEQ|Xz-J?1+JbUjcb8yq2 z)KbY^Y`yGeAI~v&(bVNR^$3Bx=YmwNw<}Yj^cJ z+k1IQsj>C4%e^*m*5P#?0a`1VTKbI1y6IdvwWCt+N2HX!WR~P6+*#`F5vR9MuNmvL zLQ(;8*3M=l%G59YEpi{<%{^ALenVmtQ@i(8jAO33?;o-D*_F8=MfS*XJ$l!}%FbbG zhI7|gGBfUZpRzOA5hl3DO+DYNpPRc=a$PQW1&WA9B6QxGwHhhkCpms|t$4~4>;(qp zdYY-nlk2PBbj9>CYVODFkznsMJJHN+jOl|XW;cfGLHCc#ZvA$0{g+;Ub-~2k_xExc zdZ9ll*FZ#+Qd#ShwPn4W-(6SHKA`R^$#P1$#<@>0Im_KcJ@;J6?u}eqmiiWV41M6^ zUN$IoIwq^aT^oC#UPNPzYbCSsL9ckwy-u%T+uk z-NogyyE}LLq>k9!d(0g}cJRCQQJ5hE{HIn-?l$PZT-?wp*AMTtZ*Pjf4nhWG};9K z%(Gv85~+7{s3I2|$)Z)p7&orG^~K*ST*yL`{Y`DJ zji1`Q*@Qu_*tyRF&UFv7=X#%TEg4d>JzWR3e~vU4WV~rcSN96U`b2iA9g>^LazoCW zI{&!|!Tz4YO@r%R%e_~2xYr@sYeVL))LcL$`)qQ@lWT%=%~Ssw=(V78r#E+obIoY3 zmyya)-895g8kvfFVEuBmuS?yOaDya4qBRowCbY z?CdTZf;nR)frvmu&lF(_AWnIFxrRRb9J2vwc42gGM1%x{P+|j$vN?)u0)SE7p$Vcw?4X(5d^*|pbmvEK7w&XdtebpGG4lFz=(1}vwaIgRlLUo~<2ZG*u`z%s z-Iy`uwMk-y`%-c9jj7!Q8AR1ih=tUYfB^wS!%UgIoPFqagdIn?%K}VbNyFLkc=Ngm}gT~Y~X*Hg0c8_m#2^X*1X&9j5I~hI ztnMID1b`TYc0I@L_*Iv=N?l9JBG}zR?mT2stt1(eI4`b^=ySH^29=#Z5h(#7L;-^W zBA}JsIk~j3TXbsD9)0G->g@a^3*4Cypzfs%0=Q^bkGyuT6`KoC_IF!)_w8a+g{vw?OpC{=wp#;__1wJFmwv5iueHvWVJSERc#r6TC0MH<%e& z1a}8Uh_Nx0fq-vH1IYC#v+TD%*}q)CJ@)|ag#cvnuH@Twl9zO;2HE(l4+}SCLHeh$ zdcni}p@-b;Z5Eon^||PE_$NqEe{8$EpSx=gx?UwB39$hW$%vo;a>w-(VN^;fMW_Lp zSs>oMLr$Fs04TQ11Vs!0S#U}Kz%UZpj}Ss^Vj{9j(`K3NbF>@G!vDEvQWEQBQI3?Y zOi{9PD763*vj7+n+Ut7s%DLq->2kv;7Qs~DMx>mAE^DL3tRXwUy1SI0 zo1**m%K!EWcj7p97n_Z=Eg{^-I>s37c`hY$k2{v!NN)_P4-zfiIkdA!0tQ8_)8}vr z`WOy3QM0?FrSmvkaKH^y`a6&AshlP4LtY6+pU6Eo_;63?Tdes>T~Md0L9&i+t}ELM z%kP!v$psmEky@cQ72dvRx4jFG_6eD@XMQiDcz+&4ivF_4Wp*4K`>B{ZhC?f5tLPMn zQsgNO$f%SUVx*W&#F4cyBGzg`a&U==5D<|95H=*h2(egiRkYUNtp3;->o3?f;lk>D ziqCRG>D-&`NnH?$5dl#N5Rnov*zs1}cqi-Q=hB1o5n;yy+K($h?iThaK!(m&vjrmT zciCwLVCKYwyJ==Gm5AuIHhM)rxlvRSmcrh09s9ddDvBb{^O#u!a)P}8pdGx{eNvr0 zGv>)(yPmZIv}REdG^qr6=#@IlC7kZ&j=S&NU1@!D!6~;Cde_^ymOYz}yTyc9uYB)K zGn}apY8Nx^6-)NP3bPSwpOj0lz%7@g-G^^@Q(jT8+$PG=PBzFwqnzcfFf>3hM5h^o^@to&+||#A|e5128_j+ zm$t84J8bq?1d;5EB)}j^WNMF%UL3t#`de;sXYOL|!yL4~Bu@RFN$x%)&-0Yl*7{rU zx({7EJI++8n~O7|lT@(-&?&ciuage9TtmIbq7hl>82}9Qqp9`cJob-;`v8u&0?77f zee@~i-mNc$Ov!LAz}JU3k~JuOHsLL@ZTsZ1``D~oFFwoS3AqW)+{BsPq;{5+Ql3IY zR7i+GqyT`l0u}~ABdACr`GFcJlq!WHD)O~riECl2UTfD{3M32>(b$j~l|o->PifCr zM2I9P5QWCD7h)uanb~GSJW`B60z?!GyU|K+Al!=?+6#2%+s?U3#{BmijG#?1D3@JIn#R1#ugAXHrgN=ji~;Xn$g>Q(9A zC%c+LX>ubZyFwD=H*p({F&arD`ARc0BdG4YkpLhtf{576Ns27phZeJ&Xif$X0EkK{ z)h*1ALBzU~(Ao8piCg>A@9jyf0TIwJBT-k51S!vv>Vu!$6dcPn%~^|-@=0@Z%e~ON zUKl6<=xk0cn;7X;4BJa$=cW_ghnwB&gmvcY&+`=eo?V2fl=2wb3OI^8pVw;8_eP2nh*)igC0!&fz(Hl8)o87mxE;0Q&@du; zgc_7mRPe~tgZ$3(&oFbxN&-kXsB|CA zt&ouWWE=9mQ6djX2#3o9cN{w@gv9dA7oJIk2GaS{y;aX?m@H#DZL0Lh%>KjE`=lGI zzI5^YcCBha1i(W&e(>5=h?kx>$;x0)9hZwLUf z*yJ_dvM=WTlL?h{4lNNWYF`jqaYS7JA$KbJ7ZCRXzH;eksrRHj^j<`<{#svIv!gdQ zHgY#l)~m|J7W-2ddlispgXmsmm^UrH?k``KYa(-(vWvjF@UTWeM5R$FMMMfoYpt~^ zX!MjHXcYuh@G0>8An<(8BLZKLR;%&kKx|BCVg^x2K~b%*R+mA3lB8LwDShJlSTW@wq3zVWUVN=wna3e|mJhlQBRzd;Z+Y z%E~U^D1%UEQP*CHqh37cUR(&s6z~E-7=}rFw#%SI3_Sn7JMKEQ|1hv1k(CAMJWhnu zhmSq^!Vj*@-!LE&8^-+N)a;8{c9ah^GJE*;gGWhlabxwR^XEcfVqt_NdEEz*OX#t@TU+m$_;(xg?xEfLNYuS#WBOndsRiV&7*`Z02Oa3rHBxaO<{4j`#aw%gIxS2xEPB17SB!&Tj z0X=3zh+twS#T{w|kf0_-M5^F>3O%I)MLN(*d4cu{8dbp$Jg*Yyfnuo$Snva43I6O! z_0+lg^oTjPaPZ>Nl{@x_ho(n^V)UMe2Od12G@jeuuC-0k2(;SOYL&eL3XBXE+hG$y z#cTqfiheLyDwfJ#po15ldg-_S&F^k(Z2a6W{=x%~JbY>426uEGg+x7Y$KAVy^8#-; zamOpKyrPjpVC!xuz?jfOa#@)^blyM$2E?v%3*jq3%UhHVs}s=hE}c**4~Y>xQU-yn zbdO;nv`&Oi3Z$d`Ggz*~!eBTCVPixDSquU*dq^>eg=`aw9{`}?xI+`#B`}ij5u!)R zrnx}C{`t(Ylizs$`^W-{Mk<3dBjaq7LI?n$3qd(3#2_A$0ntdHXqQr+ko~$bCJD5G zHFVgNyP0k)8z&Ge^reFgTBAcOOb7s)!4N3GQmNEvw*)|Sjk3i(4Z{4j>(*qbZZrx2 z!pt5i1^_@sz#Ux>d$J*eue`V1`_PL+BhS3{ige)%MoFAG(r=;+{Rnx(Qgy=v#OaCSDD>_Y8gwnh``I1s;-NAR_G}vO-@|;CV_Z zzYr7)ej$#0@(Q|GC{od*Vo{d^-!J-=pgdTORRqnierNXcPh(5fx8q=GeL_kxT)v{r z7Wn&~T{-{K!f5EVK6ifW6MtjiSSf0@i$fEeoAoA|wqYNAq}WqjP+|gupo&3IDtblj zoqO@(AN|3nUViE9i4({E#XtP##o_X$Yp-oqYxPDuj0^yv_U<`zM`towgz(hKQ{|wz zu)Y$3wc zyW6#3_l5u{G6@QgD6s*piipbY2}NWiMnNKLBC#864i61`+dK9U>YPsu5efp-hKCmx z7Iq;>W@TeF?$%-hEN-t~S)3C^N?_l_)S0YX^U2z7 zi!dghrZrObP~2+P&n;Y20^9B8(9no19A`u&V26YYzX6nluP5D*X+Cf)Mr9Jo2|5jm%anYOSxV6bfZkC^i-@ zJaqcL$B{AL*wP|Gtcj4Q92D+7d8Sk>+F0R*3+Fbr zHidT8q3mM9u24u4+;vbOfCE!A7p`9cfc=xxyL-T<2&|1@LBzqzz|n(;2D}1v`9S9` zU)-)&L1d^@DGyXMLn~~rZf~;vcII+Wm>3#i02EnRS!TnAaHukP#+Udy(m& z|MN?WFTVPU{r!1<>G20&fBL{tMkyAHb8~adJUTdBDilOyZDZr;!9%4|samhitt`|U z^$0}+9+;ZhH#K8Z_8ax;wHw!KVao>58fkNLb9Hr95TbUtwy_?H@qh$jpj^5A=m|UL z+l|`%)hkUCpb=@EV2okrIF4QQ;;cw$E~nCdbt-0sJpIO`7Cxa2TCg|_ z!%pJh>a}aRG$rbhw#yaE*;9v?f^zb3!#;d2w?N8uODW}J?)7uC$ud{O3?0l^BMFI8 zsu*~hs89+@#bVj_xmYBRwHFNrrGbhX8!8SJ%Rx-#7hWB_u+)5Q-Yl*SdC_=Fa6@*Q zvSKI_Z%7r|2p0k~DKN~zx^BOw^l;=;G=11>6bvuZB`P<)k z+nXM@@EicV^?^71ede2A zv_a@dW$^F(^51;)bq{qOB_aSk@rK9#(f|3+Kl7z8qE-*wb?;BT=R<;kfbV_uEq9%{ zodE4(T)kuMZ~uS)*Nay#6A^j(zX&F~()c3W5^wQN>|o&HeoR{L?>p z#`=aNFj6R=-hae~+uwWU`^@}zfBu(G9Xk$)&%gZAJ!kH)nU~-F^FMy_``=T5fAuGR z>P`1Ql(-Q9P`|VBhoAhDuRi@GGlQZZdE$K^e*B#v^2+7c{=w&d%c992|L~8z`?0qs zh^L4=dd~yD`Op9ND+@QQuPP!x^Wh(T_nY1dX!%kI0B^kafv-OO|8VE2)4%fL zKhv!*>%tTww6KM#aCKs^gZ%}V&Lm?u~04-eO1hp_?il^+Db8}EI<-rev2@qc;g;`twX z$GZVwa%|%8^z5g<{COK4c%B#5n~Xw$kH6_LkWR*iL4@Fc{)JyUfByXEzx*Wz`PcvO ze=k%@$YO)hF6SKo&M*GzSHJmKlh#I zpP3n*Nap*!WsxfY-IPrx4-M9 z^XLBU@BIgf;?Tq_q6E;>p4Nf(wyHb!89)8p4?g(LcZlQ-{klN0K9hj z;%0T{@PUH_xU{l-{o1wBq2a&rGe1`>78!&Pkp&2Vu;Lef^=E$J8$b7*&wlkwKmNgw z%#2S8$b)y@^GAR2=K!FP-uCF@$O43a@|izhUS7WM^c_F@vA+T$*5p}0!w~%3kNxEJ zh52uN_erC1yI!+K;-l~R0AV+=fB+)*-+tFUr|)>`nWtfIKc84wu)8S)!ghOmW79VI z87P(>y8AxMXx&&}Z&YiYygwi_-*fw&mPbV*-+tzMVYBtiKlO9gID!D$`D7^0&5xp})oMj-k~9<|>TZ!<5*^!mu*7~@ zS1~Ju;r@7@m-v;*2NS=~nmny_Vk<3wgS$T|l1x?<-9DEf2wX5!L#AfAW1jOU4&cyq ztqn~8!H!IT+wsKyZZUqx1X^SVyI!+v+d4`Is*Bqv4mtClQcng(K|zxMNy$mI2iX)N z(pvkPJWm&cLQwFEfnO?>h6ntifzr@$d3=0yYIN|>^uf{cD6Y(vmzU!2zYu-l<>|Av z@z4jr6$n;Q)lo)Jj~iG-I#1yY_%X-`>x-mzDA3}aFSYl#bcBKE;tf)zsN9YUtAVhO z^`Ho=bX&+KtgozZ3|68y-*eW{+UO02&6aakWJ@5ao zU-<$VF(hEvu6jUF0{`@P{_UUs#it*>=l;L{xBhlzU;spZ?XUgP7ryf41N&x&%L4=` zDDV66kG^=}-2Ul(Pk!bLz=DYPp1%FU#n(=sy6v5BeycS!|KSsV`0xMo9}JZ%zw=xF zYIbIyfc(r)e*CFtpGgoy5jl71wV(T&zdXOZ_)q@dfB&QJ`2YgGAN%*e|GO2! zON;xbXHFbDJ~K7_z}@%ShyK)aKRA8zl(pSPL@}H=atsAPpw?{s$j|?D-Gpzx@1ei< z>wlXNLE!M=!!MtE<;&mt`d|6r4;z9f9)Ihfed)7`;n<$7_SZd9KlR}s z6=p)ZbmQtj`gi}bUa$Y;M}Fj8kG=%}e)=On`i<{?M+DHYh&^5KcmMPg|K-pB?8u?R zzxBWTX0cR4fkRU>Kkz)eEHd)9{|AL{P@ow*f*<7g`fG+ zAOHP7{)9oX=Pm%eaPH-=JpJUx#>Nl7=lyq|JPiOJdg47lc;%(v`n})&*c0!YnVJ@n zPkrfg*OnGYt21ZLL~N4#wYyPuf85YG#bfEENp6ju{cK97IWcywfwC6BT1hv_lf2p0 zOiDb^j$n`0*2;J2D~C=U&llC`%_YojfYp-$p4W09$vF4Yo^Ydebb+UClf`5Js#6=l zmJ+x-L=vsF=Xu2-C=~sI?^Q~LQlU^R1w-Y+KqZ(M8J!v%t%xtrUL1Pz1z@QCx)5j>ra> zRZTIJcQA&K)?z(H!BBZB2pY=^*I}UYpMK}tU;pMe>&=#}1UYu%(EESriTfYC-wXU} z3)fe-8j)1MgMk4LRe5Ms;+RPQ5j`)^f&Tc%ejF4r$d|tTjp=bW0&&j$d6knX?d zULtzpvA5V|@TDie8OG7!;x_&i^qQo!oJg?ySGm}#` zy4$yJ-)lFn&Q47u;>SMx!w=qhkA2%}b?bHIvW=imoH!u}Oz_M9;O~x&jd`AT=;X0N zp>X2F3F>&XaN@{O5xKlH4}<`6?9k!I9)4u2w)3O!{h-Z2J^k_v$B!Q`dcmEi&)7P} zr(b?yWMpJyWaJ0u&c5r7Zx)23hmJh<=$o4D*38U|9mdk~(%CDo-F@#paU4H;_Qf~8 z?jaz&>-6pa^{ZcWyKxz2Gz^A|eqdYpOpJ_9jEn+zylDVH!L^;O7cXCU_>ngt;?T&j z9r@b!)~naAaGH$L*fLpCw};+5B4nZJ7I$YB!v(z8!}>}~HsfPtX+;rD*v z#>(P>LkDg0dT3cPPw1mmV&}g)Y{(Oe&~&F006&Gum|VZ^knGa%z@ch*e%Fm2dwL( z9|(Pg_ZuhL89O?r39!@Y&c{fl98RG1v4 zmTcm?D;oufXsHI+t!Y6;3Q=qADIFBNf~Nytl?r|_D3tu57)7vCYh5}!e&u`N`8j;P zK6s&dYDevecfG_n#^7kRd8#3=d9($3ko|~t%zTZ^fM~-7)4t`qm4=vyrvJUNLU-JQqzd8Qhl;Q3rpLd{fn<$df|m{U%wbdkuB>ueDwH_{^&>E z`QA4d%YL;PR%^|vS-&!RU|+l42u&P^4%(vakvKXuY%|vcc;v{D|Ie@g1|bHXpG?;; z{p>G1`N9t@WIHl4Vkt91_{0-WxN~Taod4FmN2lkH6*3o%Sh!E3GOGm5$$a`^mfSI5;-dd3-FhM-ELLKA;#1 zg+fw^`Ode$LlBC^A_y?b```TbCmwyXAP`HFqoVQw;T>;#`_=2$Vid!yh>*qeJRv-B z{J1@6j~_q2-K<;I!kgdp*wM*-_O2&pXGVsGfrSa~yXT&n1G7S?kxm>qd|-TPY+$HV zDs|L75P|U2sZ*nq6R2omWqIGk6d?Tg`#<#TmGk$Xxzh%@^{D;2haQ|B7_n(_5P9O! zH^21_k0yixo1}jH@yFM;HfCpM?H1T-)gOHDL0b;J^U zjG##+0%1UCFUug2G0PikugqN;8Xp~IQAnQBHe}nV?~Kh%*~E(ioSB*i1VOAd8Jj^J^_aBVoxLm1pN>DvDF*SK~-vI`($H}AjJYbEPr?jOR4HilxBO|l3 zvk0JAHp50xE_zs0fU)rTl{rfQs1!?@6cCaiAQXc_d2m2t6S0xKvKKDJC0o#(+i@^e z5}wPZgqsN)XUo8Hh3Hc<7R+p8c@fb;5WxS~Pyf2eJ@QJ>X%8#uRCSjFgi3>oF+$6= zu=Ni@3PluY5Y(PVAQU96K*T34h)Bv)D4+NAs1o!2j1dkI z6+jHduc_c%(3)c1lwyl{300FTVXU^4A9JzB&<2ljND4ZFMjY&X@6y>%{?tERUs)IQ z0AsD`jgP+J7k}v&ZolJrsXWw(tD8Hm7MqZbFo9N{35rU<1Tl0ayhMCbkpf~7MVdhczGY1ki1Iy3VvBCiS>N}e z3mFsO=Oo9q0yeq%vqx#m;D1kWeY5$!gbiC7i5IN2kcItEd8k04(B>vN4`b6+$=AySln~ zd1V0w1Yv!BU9eNYZn=ks$eJ)liQ`z>Q7DXvjOZz4M`DcOC`LqM+cvOeabw%Wk(eYR zB!QR>A`$}-Fu~}+5MW2x!=7mhM`ws#OAU^Zz*;lV!Zq(}UdE=XBC#OXu7Un44Y*ejBIZ!IMq7VSU zaJgK$`{0qCW_^8oYi)ZoiXsHmhJmQvZd)%V+_l>fvjOg;K~doOi|6JxR+WHA$HH0@ zW~)t%B~%k3VuWItt;nQdt~KiQW^UNcV1#8) z!4f%H0qi{ME(k@?kxMETi&8}t5D^VD7!++v+Jq6xt}h~l5c77UCS|S;5^h( zLCnenzM-{>OEtn3FDjZ+6DfjH9S7HVql|+s4mPD}umEjrdaYJvexY%;p;uR0*ISL6 zjbiqfjuln$$NuI=*6OWG*XDIl{%>D>^2LjnD+5F01Hp+Cv-@Ty%B4~>j9OY#WEk7b zk^n6l$%;)L-+!o5EL&Ul!lhT^D6%{rJFWMeIE_kyz=;Egug=}*V9$U8aO&WZ^VhEI zG-?QV`>~Vud4yrO)u^33a*P2GVSQ)o2d|z50I%Q=4GoD?C|#@9ZDwp{Y+`nFVqtBC zl)C@)9j6Z*1(EG${g1x*7epios7ShME_P#dJfH4@YqeU%pa24;LUCzjnF&XVmAAj{ z^;^yQ=JwWRy((_N#lpy1Yb(=XWr~=2X?=BI{~_#FEzhs70!!yVLWm6t9GTo_ZRL%% z6D{8+~4oZID*XCsF zlEmdW=5kQro$a-k&eLm`4{g`Vjo9o&je0vO(8jTWkpo_E-_V7iQNB$3Yr1g-t}JsS zh)+~yD5gsux5P7Q;8}n3r0B9hf%G*I56i2%6o*?A7?>EVKI}jtGQpO#){4Gq475twxb5khq!s8{^|x@X*TN?K9~&lAM{U7(}7`svKY1B{m2^&hb#a3KYl4{ zw}PM;w;HA(J8igjqp`krwC@4S`yPGk;@V0(j*d*t+6s(| zH?G=|;9j7Itq2Y7DcwDH_0oN}-2n(EXAcdO%GVa>Z##HocyMUAJUBHv{``e=aU2s1 zgFr_b9gQ(@*FB6ufN*(j_4xinNNA(T<<%9-Te8Uw>%Am-W zM-o)06-VtTv?1HMYnN|7dLrp_d}-lEI|?IV#UP3QtC~eku4vtL? z4Gazs434#$&tH6%2>_8nP=FA1S7S{8EV&95k=F^-kcGjZVe3w^LPkMA)0H(#s$Wui zw1zsNgh5C&&`9vw%Hs6+1c(fm2j2C%N3Jd}%nXj|qJ@27esguBS+mSQ>4qJwu->2#YnL|aJ9ZI>2(x6ZU~WctkN8FRY<8vLvMrQvMbju(lO@+^ zx+XPoNdLR-V;=>S9;ZQm!!yII6fpuJ_^6dnN~wbH`<^POzz@jxb)dATl=3L>eP2;P zKx>=P7rr>Y{2deH80ej~*7~L?M|`xZT2)zYM9mgV)nTIH1HjhV`ux7a(5c`^(OVnA z3lW#%V7TR7kK#Hvj|z?%JR4BR!L~n1rZ#LmEztCFISyJ}Sk(|2iKS>vIPYl*MC+xnzg&{mZXDe&_ujX#pt*g<=o@Ah5)2&R%}aj|cy$ZbThU|#PlVJGyrFo><6?{h;*ZYjOU>2^if1=s5Wb+$#}P#JYO%p_ zYa)hG6Q5OFlhF-DC*n{;#W&HsMhu6xy<(lVN8?fhheFYzC<+H#@ro%f?lcy*&0L$d z=W4G>%^=`Fad3nV51Elu<@*P4xDLF%tkn7 zwk%L0TG`$>cj>jk$^a0S%Vp`x>c=3@oPD7b6iy#L=4nq5UcGwh>(72KYKJij2>!Qk zf9?H`zNJzs3qqq-du{Q?m4&&7ZoAWF%;PvVAeU}j`!ChMc>L}M5~@uYhL@J-zx{)! zn^zU9l~)kUO&b0I;~eni5R<HbhiyHWoJ5wBUMm%K~R{ zcduFgu>rZhI6pKrWI5Y$92;iXTS#ZYWd_*X*|xK{Q?D_zfW#sYu}5lYZS{-KJ@wG> zGb1A-1jry9$LANWy?Xsh%mx6A+SQdn0sBCgcQ(K9^mpz)b$WJmf&@V!gIrr(dim08 zjj$C9Bg;m#`Gse{d)MI;`zNMsj4vq5TkFqVKHqFM0l|R0di8Q8D2@*f3qUJsx1*2% z6``HoU7{Z56h7y)!`o{X2L}f&=9>iCsd~g-WzDWD+9#=<>x%9f-v9hB{_+2V*07KI zxh3K#uw7V`uQYmC@e0b<<)T;ib+KF+Dh|+gedp4JL2qMUsT$5--I!k~v}oTZ4lP4% zuDyJ{ZCWxDY6bebrxr?lFpf?%%pyXSVHlyH{5Io;r1~#=O*|;+@v3M5(@2bpH$?Q{G6RpCwhHJWTC7MPGJlY;)YKUHt1yhQbt4kYv zy+tdvR@I)-gH$;*e0nGxnb7-=`v;>aDjG8?;h=6* z#K>=aaB-z^WxgG71il}X2HLe9#jQh!4v>Q7t)+`|bG1ezY%?=Qz;3yzVnAPG%!WF< z+xk{^SLndE1$jy-jYLF0{P;VkCMFT_`>(wC{c|rda|~idcOWuG*t)1z;D7{B096O{ zL4g=|7oQCqHIUIAL|y}mVIYizZ7pX<6o-M8m3l>+Qt?Oui!Bqjs98YTsyz6lY>u9p z6=1~1Ab?@&Hq~=Q3=>&@o3m0K1$T(CBfFAlzG}gkKp8<_cSIZ*SfPlJ5kpt(Ot(+ot!-c09RHPo;mwsh#kJL6=bq;y<&)fZ6-PZvLS!R4YVRa0w};BdqmEy zP;Qb2VKKs>D52<4UjL$0*WzBf<)==aI)DCrZfhFot;Ucmk(>2iv%1kK{T>m~{X4tg zBC{uHHqh;ZZbU-4|lLBu@_3?8jUGa*zo-VZx0C>gKM7I;E8ozIO%~gK~sgS!mY+u z6&GZ1dv0xRi|0+fVNo`%{XsP}TR3^Bcx2ohAl9DtgR%^_bW>V~W$^$uy|&pZwGKz^ zotOrr)@&5dLmRnTS=|zm@$q17BN`p33=b4;tX0dS!xMv=Rdb`>THW3Z<0y(b1ZFX4 zLsSGnA;1V2qliUFFb45rVeIsKv29F9DPxRPqUM4ZTL~<~NF;`1U|Y5nMX@Ct3o{_v ztbqX_fY`(u&=_OY#yWyv2#8`3ViX;t?G9)JVqpbJx`(?pqcI`cq8CJAL8Z7$^orP6 zHSadZq!cj6ER42yAH-G^%l=D1A;yVB4x&i{q9_(c01%7VzBi!Agpu_HD(PTs*1_c<~n`OqXbD;zPA?g%HBSOc%#3)KIW6G@cnp!{!x#eq zvD;yTg$RL#6ot&hV&a&iSUk@Nvml5u#t?R(RclpMS23Vht9R*W6p77%ca_Zm5H(>e zq7-QcwkMo`z2Kqg*<+KlLaUtCO9oKY?33l*(0c00fzz$g@o-gISBE&-p73@mbKh4lUf_ogtUqSf4p(7)$ILfP+4lxw znuyg^pO&>>j=Z23W!%cU1SVUwbAn1cuorTSIy@j=f=xP`@p#cb9gdhR}1Q>(SfPxqiVib|@ z=_u}`BNT;V;y7mENOtW4bo)vh!&dn*2GD>JaECJ_Vxdnf_iwvLad*udYYlBHY6jK_ zA~AHz0WHAJBHFG?LIhB@tz$=3i5UPp!ju96Nn;rgi3yB|r*uLSv5aUd&`37!CL)0t zg+w}%Wp;}q*i1LEFbivvu0Xedu-R?g*vWts83Y5M1S0DA%)7e<(SV>4Q51m)2r?6Z zrC-^uWHEHMy;X;@ey^=prY>+6nphhnBE(>lx?lw8c9g!U!gMM)M5n+k?&v*Aj9?2x zNx+^cvtyIvgTu+athZ_kFa|~dD`9EYvbG4K4Yy87=*Sshs-Pobv*&(q5D zJf(b3Y1En!NEm@gD`BMoQ3vGfqAF>x7+ly!!wi zLE*m7@YrqUdsu&MVPr>wT2%S{EBnslrJt@|90u(}aMg=8yr6)^fe2TNv{XRdE|}PR zN)O!7n|DX8LR(!fnnG0e*l&6)rg+_p3hYO5`FkEe9JXQ#K5;J%a68rSWQY zZq7W@Uf-(1TB}tDwDP*3Q17oC8PwzB&B^J?QLms%wQ;Wr?7^0-iAWn;+Q%3Qp2!Fq zRW_6L`h=+i%i>m83X!zuMZnM;g9wVH)_WhQ?zA^*TY|K--82&Ws61W1GJj*IR%?b) z7)Qn!B5fb1ZBm#p>TMPhL`0L#d}+WCJEC4n(1<{602M|iQk`HESd@`A#{j@xIb>S_ zMgp;I+hUAC@Q@6`p3Zgv*1uqp*tW;9ePFD}0(J>21hR|fbplLaCZdpyFP5T$Lf!t$ z2*`{?kuY_)pY8O>9bOD1o+FFcF1MbL4f&H+(GjyoicqW^GK&}lPk=#;2oRwnTe#9` zx6p090s;n6e5C{gfb3rh2r-Uht&|OrP1o))0$O8-yHc_Mz=#pB%^KOKW4f}WWZh>( zt+m@zH(`+2h$^*p`?S^UpE7l6E{GV5AR`G3RR)qhd}C>0adFWYW2NNm8j#-A(2(g% z)4z#hwy#-Avg@YQz>H5OSpnJp-KetqkGVOV{sQvJROnl5$FVyRLY_iWOhmp{@I4iH zemU@hg6I1x(7x{x5h)^%JRw084d{_Vt+=+O>lcgHZ_tY`#aFhkZwXwDNco~Yf`QfN zz5lw{dUtvA@%nP?nJFgC;t3i8Ap~Y^ zL=<^l6Qix(s%^1NgaXDIQ|o9@hp!BY%hQDjtt*5?9WD!zi6V^@Ss7{;Q6vCXxgh5X9z}8Fzc;K-aRkB$cGVE?dsQ z8Ii<3Io4amzGB3$JpE+3SOlW2o$Z#1I{eCLPowQ#RPEeO-&tdk?Q(T1M(|cVGhN3vFt0&puntE z{7b+)VS~bTiRRXV8=GSrt=8pQV{Q|RHFdN!Fu=L6&@cs~o3T(da-=RJ8-o|Pyo{uPi*A+1aG5byO)_keQ6vo5rFtp__ z9)<`bT~o3JMrqoF=6qwJN_E6&+srSA*G-#o+qz#Y0u^t#><tqL^->ri#+yElqu(l_ zHyG(LS$*LC(O>*)Yt7oq+D5h3YP4FdI0AzV0?5{x7e*1Z?XX3VjUghJq;1_jTY9Ow zpiHt4tz9D`1^`9&4GbX6wn7O33;{A|Kp?bgS0vz*GB!ifh4T!G5@bTF{ejB%q=2M7 zmN>ynk~HA1z;$H0<+sc%!pO+NgoG$;Y(afTqPZ(}YtcZ{75(Hy^rZ_IYCwZvn3KH{ zizuSl7!7CutiTg7Yisu{v)b*N&06JUgM zdp-5iz0QU9cB9>HjGwEDo!g(emkrIf(#=uM?jeTVzYgWUH>Z+}v!hRu0HXZ`#~qa+ zENH3}ii4GMx#*1y4-W(dG~vSB56b%LzFDsG{UY9LAkZfM zx_`GvxUA7P-eL3g>5s^j*CsjORy8`^|Cj#Omd-pW3zcB0uHeq7vefs+pQ{r zg-vawswaZU$>PBxdxKGN*gse*k0E2ZJtCo2eC>6xrQ_Oy2H(W7Zc?i@4UsR+)!NE_ zobPQ zsn%NC%|;ZOhz*Kiu=%kLg}z&Y#fkrwzf~(h9@k?4<3Hgy$}5Er~kwN zFyY@1Op&M&|!vBEUZ`*pykj2Kq#iu zmZuBsT1hUKLYGq3N^}e%uPg7ZHvvsScp_pHl5P9bZMV}wIlG#Ky&Ama2C%*G#3aX( zn{&^097uI}b*rBHw2I4Zk(PQ}wz*!fjj*wOu|zCjKU^$t*Q%k&zVXSW^;HBk1W4q0UZGIf+1ZIflwcBlGYBZMOlcvs zdMNdFOF_49Jz}X`uGebfxL2L<5JU;=pPad|ya)`25XI(lU~pidTB`v-n~iOdGBG^5 zy1fa^wnLT$2eeXA6hYTO1f&6=5w#J~5`7|&k;1@EvmRPfi?9LlL>Z6>L?I1U2DWR} zL^hZNL@QzTkQjskrbfnBw>B{5m=K+kIJX;JCq(GlJ}d0%vRm96|L=;XQ$4MA_bhix z>;=0zt%z|~#yqhOZd=MeT|#r6R=kBum|XX;mjKUAE0ue>*eQ*Plv+=(AUcazrrL)g zqRuv}&5nZzJcUYQ;CYowVPrU%85=5bY3;^W2TDIUG9_i7wyMSD>*4sm^2Bj}?n+&; z@=g>Nv}}Gi9y+@{wIU;ttSFi*Ks92I2c#Xmieq!d>f`OLB9xHe;kbTIU0Djs1vFp9 zkqvWoJZfKz=jZjs)#4=R+Gex%mB#g^v`j?OG&b8w;FY|fJWwh}Lm_Y>mT@&$D2)u1 z50+_AfR2Rqsi?StrXC$Kh7Zc>A&j><;&^*1^4FjlAb7^(R%;Y%ErZk@ z7O1v`jeD^^V7BK>`*1MhOHB+a-MXh<_d$myI*q`{#iO)#Y^5}{U7r|PIetIyJJ6n- zfb!&8b!&C2wpFWEt5KsBg<%LR){8?0ASl8%#1;TygP_35C^{0y_HlSfwp#A*{M26y zg5ZS<=RWzhFC3oTe{^R5(W%+T?tl32{onum&98g-(9G;_{`~*zo6kP|_2-`csrP

    is;-+%H<5Cp61>wo<9&ohD`G9kyz2*Z_ucRcXO?Bw*y z&gNIX`|aiJjROf(Q0ZKW^Ki* zrJFc%@W*6Ny0|3VtT*(n7|pabLFBG>5ha-Q-j*y0(J$rnWo2(tHj8>&u2d)0Tdc(E z_19j^$1LcX?QfG!*JN?kT)!|Gyv`DcvJt-46!^MSC=3jiXNHHSM}~E@AmL|bMz0T7 z25Z&EV%-cQ4F`p-YjAzDaqvVbYU`ydo8!jYe!;aqBv?uFI=S{DRR&p!JpJMubKXsLjy6P*DEJz*u?oxF(O{g0vdr zu^LtbE%b*=hs*vbtL9;@&Ng9-)x0-I@wgX-fu6rJCc+&h-hN(=u{tJ=5g-*cHOL@( z#XBg38f%?VPw*>(WlxUa!__Tg&x&z0qjY!m!njO%%u2$)7R_8jH#)ff%fY zA0#9Tuu=uCTD$#ewp;)D&;GFJ`G5U~e*zG%U%!5JVeZP({MWz#T|oTWGf%zwzK4GA zbDv6{;}@R#*2}M*|Ipjsb~xe9d;+6Jh3)2amjP@zr{}r2r7|)RAK^ zTzb_uT(h7Ff;q1$KL*bfBKIa?bfgS@W;R4`OPSN=G;p!UVUx2 zSb5JI9y_@Iz{a_=&%W}~1GnAz%9V@v-+t$-b5{+>i35iQ%9Vfi$G#s%mol}WozRr-`oPKCkMBQpZtm(>p>oGcaPq9~liwL7>g_c%{*R>Q)#x`NU*tX|evo*R~HGEERq4!ujou`A`?t z#XCh>1}{bDH@3G~t^&`+7XiGu1uclexD8MOT^Z8xq2WP}1~{(BL}9R9+t(H!3l%EO zQz6o`f#_KL0Jcv1D-(d1bh)Lcy|`#(^8~CP3tJnc>MA%H)rPscL+hh)`=C+F)Hn?| zZ8n!pqYRpeVlSL+drfMHGDl;j8?`A3(BO_&8y3X`I^q#-F_^JhqlCsQC{v`7on{cj z*03DDJ%Ay-t=f}gdVXN&;(?yXX0zRD1%7~rW2?_&c(+|AA|Pr8Luf#3z`L@( zc6fT$7(*;q=B{6HTI0U{j(h(68(+4_6d}I;%-x^<_E$}pT$iL@(8zYZ)(qR%mluG= zmb(GK^yv82<%LJ?yzk73Q#Y0t7+}CJ0Kkiv&Oi3R!w0AKo!Ecq_dfe6WSJZp8yFb) zvA4e$09H3Q*cgojgf~_e5wRJEwoY6C6rvFUk+JgNN8kFc)y<8KM%8XLn*p!Z>uk)8 z)ur*VF-0^pG4-Lx-hN^Jn&$_B1is*rBS)53mUkL8AzWNtw#kImjrCT$y9o+k=lNhGrBNwAU$|;EqVd#PI0ZYZpc2`s&hskG!S*%(qbh5ns7_$!?>G;nBI3 zrDhZ+rJNmvLd0%s)kQzG)~Nu{re&=TtD6JJ31e@@D#;HXEzKY?3RciJ!yigT^jYFg zBBGNU?WVq(nQifMs!S!@HLyb$-Rqnt9La1{?mFFW{M$cs<$gt$H=f&8Ix)UC)u&(v zAXGxJChZ5xFZvbLh+h4(13{}fFf@#QycNE5u38xg$^~z2D?ER710%Dt!+xRo`Q}#J z$l}Vz+`=XR7t3^UiOu>xQd0wC<$Ym%mkJ>Amc^^aqofLo%pFia8u4NqFYrt~EKjKU z$6zPWKn5;)Fwcin!wa#XapBE;{V>OuRACf~lhI03Z%^>%;WlnkG{|s-gP~}>P4x{W zGe$KiJ}B|gX1uQB3i-2KSjTYK$b>PMp>d*a8Xg>pVZ^|kZ}y!~!AS8!n+IRy$yW1f z8E5V*1T+4khox`ThfQ<284pNnx+I|0%jf@9E8{y#5n3S zdZm~TPtUH`cPxKvC9rS*enh;nvS@R-ho@%^!u34s~Ixp=wdgaQ+Ctm-i)y<8adQB9qZfzXdseR%r zpH%|m!=t1WF#v!^%JQqJn|?VsF}<|C5k}F`gNLrJE`H{lUpcn_&;uuL-}T540r9rk z!xyhzF$k|abLV$oeD*spKmXQyADS2)GYIu+b!ud+R4UcuaG+SOHXBMQ145qe6uB0I zk>uS%HtWWLcnzB|h>mg=&JE=d}gF*L_CbxTnjDS|C zNRt{W6b9oT_yenROL3v#f9IRmn{7C_f1tY5)Y1;a_Kl_O{j!Ajt_gDNGpQ)Xp=)S6Hz=CW1HhKA(5tfs66!U(RD5HpI496TRTMR5jFh7 zBlQw)eYQHaP`f@JRDZ5G{O-{eyvG}USo;Iju(i{uH8-yAG+T|3O}kx>!YGQ^K-AUT z>$W?STT~E9g$%Y6p)tnxYu{ZB0zObg^6J$~?|kFqXO5oumw);P*Oumsp8xYd{Nq2k z@XFIKK8J`u_V)KS!getTKK;!vYa|l5|J3dK_s#yN|Mn?VbpP?w&z*lIApqTb{I+La zeo-`8=DB54+iusLH6dWEF2CW(a@CEIC_a1f{DF<4g zd2MxKbo>Kvc=P}DnLj3kvzK4{;G=InI(twMo_zWFQc&=<2LgT&SY`FAn=426AN=We zf2i4RZ8hr!&j;0MJ%<3gTRbBoUbjD2s(+rfkGa0s|A-Q6FP?eI{<@^@tnyf{1?-jJd!ma*x7wBL*l zUVl1L|E=iXbrK)D+aC{1h*iV&cD-G1*Bk9-#I<(46~$pQw*1>}GfC{D*3surIj5Or zV_8rMcEcizOL|Cym4P4#7S~q+01Y4Be{f-CDT<<>eBXzkKmW>Ry*jrrZ;Rd%-3I{h zgWy+w4XZ5y(1KPSwRaX9dUu$T##mxDh)j=+ zqoRei6_r5#)M-wD-C9FMbqbhr($K{ANZc zs`XmEUbnO!TO(){D1>=-d}?K5&DIyQh-NUV^Jsj}8!D7HtJ@FWem4Mo@7#-fs#&@; z8WH*Y=RZF)Gc!CqY`d6>$k^DJQtHBm3vYbm8dDr#{ zck3SexoN$&LzZhvL}$*NId|^dtvJ+KpRw2LS&udMbg@U5?k%atNIC|jI0CKP?RG7U zN>h*X)*rp`?!nEfDVIvxP=#T9(p%f%<}gehET6l+Ge#;H^sd!w^&+;OY}WpHIQ}ve zk=wZVP_=!8WQk;+gE1aFpzGTrHMiTT6GxZ3L)Ndrp_eV}A-Z zHz|6czWiv|TvReBe4tJnDh92NM`{ZUx0|P9_DHRkc!_8#meIDE*J0(Ts?3%zEVM?i z1cRXFRXE;~BH&ITI^^qB?M1%qYx4P%y7g;A#XE*x`T`Gp*5A12j?MSoNAEv6U-Wc1 zUb$}|y0f(tH``G&T&y-i4kHt`+U+Q8#HQVD$8kH1MPiJFMQj1zo@J4AZO;<8ax1rz zg_T4raU2t(?GUV$60il)KtvJqW^D&*9eG-VaBcpEr7;VkHI4>B3s_i92thyr7Crw9 zPkn2vUQIgxe(9-iZPs?Mi<((6@I=7T7V0JYz;v~^5fO-1b~crOPs-M=2>=-uLW(<_ zBr8PN7MWXGh=oCGW4gHr!?s${R##gxHUb#LnrYUS<`Gc?f>s8BQMPK;`L$*2;t$Bu zXf$fwvPcCeMucE#V+|3doAI#6j6|`mcqk!>yuULWMbyN1jRw!d8) zdpdxJ!bud5liHVks|(N!9tT@HKR*Xmqy#oLIoNb5III40f{K){c{O>ZW(E z)6F>9dYw*(Cu%S7aYU1&TWZ!0wDOp@xqC>&Aze!RfyBt#6Hvjt&hC z+3+HcO>S$b|_J=vu5|(qrF4pS?z%jL1jvZWh>Buq)Z3eCjd5sV z>ajup317qZ=Bx7?Un`clx)P3-B82$TVk_{x)-xLu|7N>nxJc$CKOEKZLEOEq}y zwQA)u3f7vHD4g(4&!`DhQOuW?q;fS1pxU}SIC-iJ5#HErR?kJ#4Zkh*l?l1+RIslA zo7asW`X%4H+-|~>9B$JpG`8O0A37bZ8=1ebGkVU9@W|?!%C(24%;OVVjhKE=3vMee zK0Z+&8jzX6p(6+4q0*?YjK{jpfr(naAA3Y1JIzKE$Hr`jZDV#!D`LZuiQ*_SO=c5W zac5&+qzm>a5e)<^fLT7xLvKEg@Qb5cr} zRd;!IkT2@w5Ns_+$6_iK3wzk@tzpk|M30nhG@5jb=?I@lN8GF?=&E`5GV#AK3wF?VE zQC9*kmuTW4ZVAm+UhSv*FB^@6K)cGYfe@QK-Ta=lCP;(u|+?;r?=}N4k?kS*zC=!cwMB`f!i%7`W2-lmnRrq;tbadEKA~Df2lflVY9w(Xy?tvnR|n|_129A2`(09T4sG>yLp?QxTiv5UYzIg z`zKq~cH_0RscWqYde>*h=YQR1InBzrh-{Dx5DAk3A+$Bx9LLE~frcaKh+Gg$gkZa>TEl16 z%#5w_22e<@>IV|}EC$440!gQJ-E}st8|w+O!pI&lB9;bV#bRY|D4jBhiJO+3h1Nty zQPhDf9M3W3Kc>VJ{}NWRzhGLgRC4NVDF$L5)iDLoNfuSi9vi7|%qC}C{fJb{!?eD7 z58>NfDo>U>3B9{%?dGp@((uU_1KJagISNfJjIhy+iVc4&sFjLAIoK!^3WdT*P#Uw6 zcX$#vkKMi@qC9QCzul>s1vODDXhJ;Mh~hT4fYHQIcyp`%b1@GW{6T-S)o!fSD;)Sg z>Mv0(C`O~6G@8+7BN{4AY?T99tCh|!wAxYaIZ!ECq0PkcuOy?jn9qL8$JF|iAJ291cjKCmbB3Qo%vNdpvD>B(g3EwqmCv^Rn zJvOTw^AZsw>dq$ZplO}j+hkpK7c2=u(z-9{mI)nc9A#TdAwaj-wA)fU9lRiPM0z@k zfyuh;{xkJslB*HfffDaID=hOop~YCO$LQys6XAiB$L6N-WKr z++EsHTujtkt?48J5f4E?`5q!;j1jR`60<^Ph|mC&2E`qjM9`f^syQLC`!tg^W9^`8 z6l|@%1-Uw<^j*!tUV&s*ilPs7CbyEhkD5c)IQCK!>&z#M>6$|6I029#?`{S;W$9AR zX|9)=g*a0Zxhcst%Zr3eU+iRy^@*=jh2*ZzH#6&A+U41DaT^HK8N!I$QPgO*gL*sg zl;@Jqm`JW7$j`eqU|k-O&rG&i!mlP5}Mfl;?m6k&^2%(vb#xzTyEN~Dkor{TGanu zZd!Jda}TbYUOy{@m59RkZ)n*IX3CAW`qaa^vy^+yUL$wCs@yZY7v(rt^)Htco$Enl z%}owD4gg3D`bs$F7=Q&7AQ{rc5detgJpvn_L02qLA)VNv+jhjbGeZb-TRwaYD0jXDWN1TDl3(aqo(f zYhWCM7ID%#6TR zZ$g0*145xNq7VQWi975<15p>k>GUR#C6Ryye0;Z}Rav2-ho+`O4lU~NUf4NAXsqQ6p zwP$VHo++S}@`PI~1tqZo5oj}cgdPGbAV8!}yB*yN;7ie!cMG2!k)D+FnVoa$c2-EG zxwFn=F9Wv+H0Ybp$#tD_7i2agoPC>PfD&JXvUVd^Hm%oj;;!(7pq{drxrP#Yv@J}T zpiFWpotSdpqkHua>%}!q(0XG4(S+T;MI?~B&~uaMmfp-Bc?iV71Vm)DMxdkXj$#8? zWDx3t_?;FZR>zc?4ezpTO-IwA=cBzzk=8BvfV~R8`T*g%tnWU|vYQ_4{pIj-W3k+b zDeLki6ufMCe=l&#-IIMJpmSS=q&Q5y!~uJicH~ZoJ6-)%WD-lnB1#aoF8aC=1`2># z2jClw0DwurC=bbY;~_E$b1Qc}q{5VBmUL2Dv)3#pCx_>Gsq(5m^>f)2ZBoD3C-27A=f|1WickpZ!ee5 z-f8CvYUnM)*^Bp+91#Ez$I?ALasvB4DsrmZ1(ap9ch@`!1>m?<{%e`>M+}IouPnmQ%Wf}$UKXks$e83Fd%1!A&;DF6tyjTv${?g( zPx+782X`wy7~Dy=XU4&U2d`bbcI3#Bt5>h4COo<2R1}|!a`qX6^QF7#8vWdJ&*ip2 z%+}&`6ydvcElj)6LZp+W;3~*>@`*|*rL@+b=hZPoUSAhNgFwPCY}aCe=4&rKdF;-I zuD$R~qXBFP$#m1}8ll5)?L}XT}N9wpD&6_^|?_7J^t<%)=0xpJjXPOraH-{%0xYJw!P!Fpj~ zA|MBiNiL;4wfmBMm!6rKxoO9SUis);QbM2F?>$*;$Es!tO1l(42X#)l)45P%GHbb{ zr(CG+Rsfo8Jko1z^{S>ymFxA&;iO!Klm$6B0;7b)z`y+Bmzi0vd_Hr{2mk;gn{0`q zD0|sXKa30#ZU5QPVd{1kvZ6jw6jiI$)Hq#63pgd)$uqKJaFL3Hb8b>3)(pKV%gRoj zBDb<5vcO_49GrbU)qf(puibeF!?0ejr-IR43vk8-jAAa~NU-?Q(J0L08>VtA-p{`#2g|n@SUB@b$DawUe z`$PDB7>?N)NKv5dd$iW}DWoo5uh-}2=To+6x0zz5o;L`BcDtRWF8jXUYPC|w_Vo0$ z^%fJ; zV$Egb=e8Kns($8r(YYH;NH2I2hxm>H&ve8WTbs`!Z9Bj2()oL~I z9E~w+YirZf(*pwo&1N%o%-A3Mx_ccWvUb_^CG83^#w7RaPIB)2*mJ_VoT)Ww-=A$3 zW>fH4e<*=gQwGRhKf5vQ`*Tk|*DiNz)uO0ct@ha_sr{Rja^_|`_by{j0j9YTp&lC> z>*JW*6h!Z1Q*w=IFK%b{xu&dYuEzvDqeuIJjCQEwKHrJdhR&w<}VhDskE{U2DMK2BDG`l zeLoc1lUn~bRkf15Zs$KmQMAu1>z7zYr@M4J#J+A-Wok$%Fs+k5*1B9SXG;u| zlvi#8#cauT-hNNE2K8~UbT*9dlK_RjlGiB^G`DL{E;BjnpZ8(&Wt%sq<}_J1F5RIc zsHJtvI=HqV++*q~C!kVdL{h_c<3x9ySwGHR+}f{fj;%~a^L~A`bIB5M}mnM}=SFeJC+!~?1E=vMs?C}Ot z_`B}q^ks>ZDI1h^*7~y(a>>K6w}RMJg6IXtCs=jLQA&;!H?U0!ez?sm5`n2)%8R{D zVyzOJl2TPlOkP&!E^(2PZ%Gj{S;R`iSb<@Gv(za z|96|lIVVqN#ooMbsr*}97?7T&9tC>w*jaaNL$aSck=rA>@T3M6(-PcFSV*>%q=whbH^WHK2t;!Qz`KAH`lLwc73X+GUn9F+mWxxOp;BzVF-lPZ0`}yqUX$ zQdOAQ<1m%iw)33DN%M*qxL4`Uo>Aqp0kW$+W#Dp!uTy?UF3lx-ytvYM&@JY-=a?I> zxu($O-BMwDk~d5(-*>#@9bf$77qjkdu~@X|Ps$N4l}fc*%_VBsFD;kLJ3BimktGos z9v+Dg*F$)5%X2e-DiQadn?XT6;Y_JiNBH=6bvKQD*%?w^BGaipizZr-;zW7!n(u%G;zi zgL`Xmv%+>4&CL3ksUs?t`sl@=7#$s5UtjNa+~#JMQWX}Er(lo>nkC%WH1gGruiX(Q zg%zn_&e|ipWl|7Lp-`}XdTL0%@4H7=@{u42l4^1HPxi$u+s}?COA_jpUrkM&D@~S- z2~re-UJY>Ep(glgitU$r+{~tH>!lZM0|4;jzws-*QrNvXAK44_5=qNeZe)$78}O&P zRirA1`lRrC$!#IxBab}tX<5?|uB7yl8)a=%I(6dg`g%R9GLfl>6-5dbnQC`ldO(l(o%O z0L-Oox$DF|1$)(5W(lWR%9J}BXU?2Cd-iNELR%k_U@nyGLKe(ityY`OW?~j?lx;H) zzV9cHVy>BRZ$CQ;_Ho>E&pj`_^paZ{(I0?w!>L?9#*IbXgD1P4v+Xvs>7ZT_YPRY( z1t{Hf&pj``_+svXmkL-@9J18fvpiFmK4sM&45UBhZf5|{?!L zQ&Urmi;K->vrs4mL12q6L}X%OVtswxZlo{_TdkIT!_d%>9ZwjB%+9=b7`EGO7k>l*>j$O6z^SRJ)z#JP(QU_{?PzSrlPxxwoSa-*T1pio+V`)nt|snV zvS21BCs$ThQn@b?nVOnP{9kufOioTNE-q%{@u{h)<>h5Jb!Ik1sDT z+d>pKO?T$ZndE-m9iH5;t088e`^w5n@=CJm+<8m>zq7MbE|-^C}B z?qFX}Bct64fyDGA@6Tca#+bzaPtogb4mX?X%_5bq_v&(|ll)pXi;`eT38tA;)Z6C~ z$FcAGHkWE2whi&x?Y5o3VzKCXp8acLNwwCkRx62QEp!luq5Up5ptgTv<}eK1y=o^R znb;IqmZiaGDSmb^xd2cqiVs2cbcku%SN)U5zI28lCt7n`PSr1vl+}3!7Eh}pABE!zH}+XJcUxFm`u4P z-dR?byYk%>b1Ga-OqDwcuK&2F!5L9*No#6s3AHFYw#2Gtag}V;oG^-R5k1SEL#gO0 zg&NzzWb2aMep|^!tffn-9Jw=-s9xSmFGBe?_-^7HrLeP91!1ycT)u_-Xk9z&0=?#Vn|6CA5M&(3DK@XYxLcExT57Hp+tW>DZ`#@pFIhBM7KO#RvZ{i)y79g6yVPls zeB6yEvZ&l{&A-+O7^Jlx9UWa+St*yxMAT?BMn*=KmX^xpau5UnV7ZW%uQxI>va_>e zRUQh3g6DbFYIR^>z{YD@>q@1vy}dm&G}LT16a3e8@rH+olPPkaT1P@B z((LzI7Dci#3WY+d3eARH7NfMr(f&W#V^I{P>XZ|sV0WGCx!8+9My}b7985AR?_+%a-NYJWa-*uw@f_ zlLMCQ_Q4 zc5K~AvpTi}dtJy*hj)is)ZzEIvz$v{%r=Bd)HNVa!O&eUuFZ9GwW%$X)h2MecBFu< zWa?AUhLw#Z3=YDrHrQh%_P3F<4o=%`AFgyqzIC>gmz$Hz}mHukrDd_-}eEa z*=#nO%}S+W9VH?f85yylp@_8G?Xj^ji>rE`Xa7$`7KvwOTesV8x2+{@wOWINgZ6MT z##l!zN%9m5g=EpE3b|5xS*cBuMHuY%&epMH>t1_BTS;0hj^nMZtvHUOD6%xVWM8%0 z?I?NnC}a=>J3BkcVBFlC&D$nB!KO8XAlTmCPCXsOg_!@~$ZK^`y)TvV!E?l@3wV@O(F=ee%uh?H&tya6;c1@mA$}%e~ zev&Ki=GKH{MXlU-+QIi~?%FGBk!!`W#KtVno+x2wDFKuwYuT2#m$sY|p9TQsV7|Sy z1QYn{@ZrNRzW8FUL_>d>h*YxIzPVbh+H;h<%RcL|CZu>Dci=rZMjH^t2sk(oe#EYI=IwB4VBN4k$)efRi)R zXHFg;Z^l7nfItL7jaBVEfA#X>;-Vk`i)}h)uW9cqb^0azzHAl2)YR0%!h*A5I)~oG z#Dsm09bZp6&CYJS?Y385c|}pO2|EY!%*;%pA)l-jJD=|SCr>$<{}d!YGc&Waw3L-J zw)5j|?16y+BCKsZ@B8*14;(mP^@LI?c2iSR_WG`32oa5q zjb(X}larG>J3E$V>bk~OmniYs-F0Pok>E&bSMM(d7N^N7B4w5vA1R)RX{hY;5e}Lf!cp8yj=$%3S_(!dF#FS?5*}jf{-6+iggm zqm$2ZL63yF*kRWsfNK_;OI}a8^lo-3n<4FXe>K@se>b(4ByHVfViu81g$#*HpJH9P z$>Ln~fh2ZjJCbf6F(=iV$KSc4$fWt5>m&+D>wBz(VuUsxC4162d zCUxi{QmfTmkUCpSlU3Dqw}T5(XB}-fEuM;(JLgax4 zHWagFP)0No$4mebN!yQLxG7(@E045{>5n%;N40oEOI$bN+;juBZcEPEXvWTmq zn)Uk?ielIudZp@@yV zjERVd1lV5IFh{Xc3Pb>eY-E>!AjxGAvcnS*+r=9JOL1I`jY0%a2t>dvpqMLRq>Mx; zT2O)N@(MCiS^{W8VHQm)IhU<U8 zdy-L3aLS0p3~o(J^59%R)1^!&e6$puFx#KUzP`D+83cjt_mFLTw6?ZpU6o{Rx3{8)B-*>*=6(oE^NxoNl8hTbLJk#Nj^74sI*Dpg!kimLzXs>)xNf^ z4sro&m#pfhab4TzCc*6Ck#aQ>zD|lS>3Rt+^6ui2?sY8kkge2AB}LuC&&|8K1fb+~ zSIf%X*Y5l$9!X+wQ~Uuts)%DEGQyFG!#GNop8^r<9aknYA|gWSPYshe;C z5Qz=4i2W0Qpdg|WK)^7H5-O!~>9~ zHJAF6nDYdeN%5+(_3-w)T;8%3m`g|)cITw{!x|~jN<=*EC0LksKx}>)tmz?CNQhV} z6ibDoOGLL1yWj^3iKVl87=!^qK_P4cDkBCNjiOi>7*Vm;ZmB3@g$5DPcJc0X`bO@6 z#vN1WbePyhrpT^5iP;!ozz(2Dq&tT{Qq0orjfNF4)&!XU{cTsiQYr1l^|& zBAYFAGtMdYxc#fWL01l-OoQ1tjG}h9>sjOODcIpWbX{C=2 z_aMr8oi5iYd8jEWOzLn>czM})ImKy8blC0v@Aik0P6tGZ4H&kQjtIg=DFtGTiBchk zOaJcR9U>4jDzMBUi%Ph(02|rac&#%b3bj#2B7xY%v5)`~umKPd5EkY*f{0mnJb%03 zL}FvYyp~T<6zw4`nGV`5hQ;jSCNX!`w249#wr(biASxo_XjdnOWBa|GX^h*U2_pay z!cJxh(Z=J+K5@0<+@h&uQziaawry78eHNTBUqup-Daa<~u#>U31 zKWOVO2L}gjg|EdZnR$44*gg(p%;@Oo>guZ2ItT*WkYH$ND5DpfxI5s4yxnnur2|ZJ6uUXMAjVv3<4Fg4lVgY0@94ViO1ON>y1O^Zy z5?1JYKy5+-vHqXfN_eG|gQu9i?c}qyF0M4MOEGbCofg(%j)_Pi*xU>tAa?vy>!ndwOTnHik{=qqAxTZdJR*os=Q~ z@U`dQMUa%Rr20t^AOI*NPiar>4vC?26eWDbR2{90v+W^rAZb#}EFhfh+-^x_LJbzf ziYVqzUPQY$mMR&{>JGW_Y3lcs^3V_nyOCCcDzMIGGYvOkU@l!Hwql$d zv!YF{+91e6A}DC6bNwi4+eXInAcAmAC?G~G@*>>_$1!2& z!~_7Au0pkwG_!b(U7$&<)G@3qdl{hVUKCm8L{ju=w?s-;$(0yL=HDvltgo-T5<$sY za(NCHE?jV_d>1ZUNH#eluCA^&n@#(aqbN$=oDB8q)vK-xcIC>IX0w^_G*axP)WYZ` z7wziR=kA>>bJlKtOD%E*x7`j3u0myU_CQ`oRu>X+Ete}%><-&ipm6(Gx$dWXHCK1i z^=~YW-%*)Fa3wt4O3lPBC%h#95W}wTylYz=BAP}g=yWiaq?C@CDe)2nIyO{k_gK=T z6cPX+rQzm|aj;|~LL=P-35!Cq<{LD{Y?5MY{EdJ0PqI9$0oa!Qk~>7c68kA#$@H5|gde8qI9ARaOQx%K+`waVb?Y>@L*1@4owm7hdS~6}^Nkvw8(t?nDBTbR0c794pX?cRZ#1?xokrSqxT_+l~LAd?QZ5kvn;zbZ6hnm`i=gyuZ zBAf74%!1&S2JB`IkP@JLk7vU;?OtJMX^dr59clj$v;P%N%Y$ zcAuEfd%67Y5t5#hwSI^DO**DG3&L%uW_hIkbx6k$kPL&oVyhRs_ zw0uU(Lrl@9Q`bpaxFx*B?)d}EtN>?c4_v=~9Z`}!PXa_VJ3D**`c+NJNOwjI+wm{X zFLb8Z9?k?HL;_0-i&=+s-@bhd-S0)`na#}1EX>a%TL09tUOKPO&o2-Wm^}^oT>hXi zBQh8uQj_~;{^Zl2Do9v1QGvM)e%(_|<;~8_E?=K#1i?K^cHh2zOACw6*<(}5I6bp( zd10~R(*h!O0Opx}vx^IJs0g?NLfbo^nwnZ%oC6!S@2OHStIJD9?6RgrUw+@dee?5+ zmMP{sL6g%n%gf8moqo-zZP-o;@3j+NAutjk&P-3k+F~UVU;~H@QsM2Ervr%_J5>>3 zOvq=QERE$?CRw`_4>z?GE$=e%a}#IB@Pu#Ot|fY%?pN53 ziFTYR%b4g?red`&zmmJ@L1F|Vm>L;_oocBa`xf>A@dU_MzQl{Go4~>fJwfbdX~xIL zH#fJkawM+qy=$G5*Au&@kOXLaY;1LPl|>YRWd{pTtJPo=t*@^$7y@Jvg_`&BF}o!X zY`v3&AKJCZowH|jbaZQT(@2LZ*Rh)b76ebqXOKvBod9EuPSrDIyP+pM0N1@w5+fCcoH`9glQ;XQicqD{JRGk7zQ3~zxW*cL=px8W={A4iV}OT z1rQ+)L6D4y2%``Y$({lpAC=`FB-0NfA`BuRjIj-(*%(nuNo<%I3>y|@<82TUVM0KG z&dCAR!YU#`v{qGj_?u2)7K=TttbGUU;*216s*wl)x*Uku7)OU0F%|$26e-5hWM~Y; zfWSzKS(Fsb|F5pE|B~Y>vb;B5R_R+ptuA$Ubz69_B-FBjSuf*(gJI$99`iBt-vW{> zb1X|T1H;F7nOTqrn6qHDEbGHqwq+Z2WyGBy;$>ELw(#j6?CNq=cIJEWB5vG!!`J`% z*@qBl4O~GHBa4CI6u{nh@~Lu;VV(Ze2~eYwdDLkgO3j`sd44L+KGK^GL-YQ@I3ptA ze#^^D)(y8J=qHy}yUEU*S4(qZsogJ3>sCCDmt90MOtu2|xN|F>M{J;<_lG^bco|hXYlu<`!%4OZAWT7{37&68Wa`84Y^fl3 zLVl5)h`bB|1=*zxgbWOihL)&Va(v7nd8W5r)ffVr#xe=054TC+AV|o)$>H@qhrIpvStFt7sOdc7m+k8kI%CNp0O=jqbeXpcin@=N&LRv{$Bo)7t2_g>c{B44 zSj7be&u{<%0WB6!+!sl&$+mF9J=w2^LVM(@%s42;uww`y!Xw;-MRrSokb-c8w+n;= zfR$ZvLMmKsOL^=rU=2tjvc;?jE*E!8mh940-j*CBV3r+ufFAB41(L5r1nF&1^$o#X zG>B+X%*bfHTc$=L;R;Fch^`tEmS%3*?u><#ETr!)hFp5GB=NGiw*?2EJYKkHD4+rk zQ!AP^pM5-C?C!Gc7MUhFcewZa+V9Ca^s^Z*!k&seGz}Xf+9RXDemx}1^{I}NqmIg` zf6~)dMoq}xuXB`7^v!`j$sG|4dl85|%?N7brS`WbHw^vCuy0c4C@l6DJk($LK!e}k zX$cgJ0$B^bWwDcHS4-IXZf#_L11%0+i zE~hPKa_5jkmJndY7ffJSf!q;H*rH8NoVy}w-%Fyw0;-NFZDMl_1*HJV0x||5H!45e z>e*PaPDze1E4fXLlt-<)J6sta0c5uX#Vk}<;A#P*5us=s(BW1l#SATwf|k1LoGd;6 zri&m8z=|1(aL?9ENHiG;Bh*S!41r9BOK!Yn4mI3ettY=Smv7$SK70Ux2TQN*N2ncn z@I|-h8(Kq?rA8|NYbkRaa%IvPAuud#VNei3>@M0OF0ea|64v)6M$XSYv#O^M4Yzu} zJ{p$L^Pfi%a3r-F#;LRm8m{yHaNTde*nh>)ysJ;~hGey&Z_UsWZ5YSX__B9?>@T~o ztAH|Dc18*!)rx7tNlOGdZyGzHwE0TBe7uF6p3Eq8Z)Qj86l z5vg`X^BOAKL=>RJ?psetC3<~9*FsoEZFdb2Ve1Wm2MRZDTTv3d%EusZ$=5+j*Oa;W z(uXu3-_ZQH^~K(1BWqsTQVm4HBt|Vz0W>s4zCKP2MPFOu-v}n=Addb03%%Zx1231raG?Qvx z%rXsx2ZSv8C1g@C+;Xiiveh6d7H(!T0$#!b{)vi;s|8uaK*?l1WCg~sVxUD^v7(6K z{vS=;U5dR1f`yR+bw9CYKM!mq(;Ce}c`AKkKh1VzDl?i5u-_EDU;o2>F|tn{O^)s( zU9DXPemo=Ro?d4$7*v~Inz+aET&X=cG8Vg8pAkTwXL10GCx7)t>wPda8W@y=@Ng4g zL=l`Uigpod=>fCWgI$lVyF~?^a4%A~8m5}5_Un`>S>-vl;BXil*TFT)%#39t-^|dkIw`iJS)zCkWVIe#ezzjzk zjgHy zp92DsmG8u8o!pQ#V@NP?YK2lUi)c$B;55p0fMsgk=O~I03YsXN5bj=R6fKEFv0kb#tovjB)BifYe<)jXLxvW1asDM_Cm zI7Fu`2n7s`qDf%!csgw-(^5r~Q!qyETO-57(NK+%aCpCTBypPzG2i*lck-iNfBp5Z ze)X%5A3rv;YuBy;`1ZHI{l*(_nAwXjzL-Mq>({UMukW9TFs!UcK99pPf5?FwQRVuh zWoXFQ=Y9JJtbg;H-^@?DapMMn7hinw(xprJvETT{H{N{nO#m;y{PN+$hd=%F)0;PM zO8VBfzV*`^*L&K=k}=*ok-`xfh{#b?j0myw?r!!7=Tgi?@QD?b348&%Me1nXWPdG_ z1+wW8YQ3sjNrq}hlAEX>1JymgmtK157r*$0L0|v+*CKTE=+SG}u1WgZ*Z%S6KmR#H zFMa*%MjkqR_}c5QH?;rx(m(w2m%lK{Ju>}c1ad_RJ#K4)TJP;Dj8xkqX%_C*pPE2~ zgYQxQ^%|JQxFo1sex7SMT^i# zGlQ;!yk|ZaEh$m?^V*eHGlpiLB=hwGzIx?~nKd*syL$C%o*@~R)85jArfCXTN|{(` zN|`jxbTTPsnK~I+I{NfvQiv#pg=mb8q3IarlBSI{hWs(JQidF{y6hUrpxn#(nT5d; z1~pKV7C)gWOQEbp1DeoC2ycv3n9zWRC?FM$v4N(Ikt(!nuU#$RL6ZS*T)k}I0l5jU zy?WKm3@l`!HD*&|QxYaLc@&^9Q%Gcouyn0D6AI9f1)w-7lf2IpD`wV|`Z>$FPJ)4@ zOw1aiN+}1d`E1IEhYzwCOon2ROi!BW!$ZdwvL<;Utc?9^!t@f=-U)G7u0Azd4Lc;g z1ZC(iaQ*uAo*{hw`t|+vvOY3)Ii>^27j{zlV^)dH$>8hJfIjaVHeN=+)NrE4h_OHX zRUg)eY?6%B!)e#c;ML`u$>Zsb_e&|$0exCh-Ty`rB2tIihA+Go_cn0K(tbaDp=izd zg!ZTquz-aqu~mF(cr-mAl!@3fj9vC8K?-+tyEvmxgiF!7x9%VpZJQOt&wlo^{%_C5 zZ@3fs=}+IRc#gNs4qoPWkagTOML-emxnXkwXJwtypnu&mP$aHTWyo%530Zc3Y=nEb z7pss{{x67@@}wujy*YDctGlz2|30E>1M$o=o5Q(|9WvE!Y^*I0uHMHmd~0KUJmOtI zXg;6sL2#C zM~)oXoX_FdTHiQ!^yoA5c@RgApV-=%1E6ee?X-!BmRLuX^@zNl1U|DLVqi$?r#A{1 zM4?!Bk`7eFx;KAwk3op**>leQKKW6Le&wuHK)3eQsFKmmG z+3NiH=eGj}g4vti_-%Kwzs!eS68;TzgWQ4)zym^FXp_n?d|QAm6h}7 z&jVOpJ-xmCJb*)oj$FL>!jeoA%NEC}&z+Eztm9lj`MmObvx1Q^p*;$#Cr-i`19@*Y zbB-TBx(u4AIfPB7D=RA@t&OESpc(@lMjy{o2{Je z|MT3rbAZiOW)Dt0SUIt>%v7>54FSmewub^G062N#b2aly-f>b~$vcl8eIP&F`ZQVq zyViU%nH)a3@`aNpGwm=!D9Je?aQyi3y-x}Z$aw77G188oTseR49H5m`tLLA4?$E&_ zXV0E3jFT&~3un)PJh`&=#k1$9(}Q0;dp1I!J9+y27oN*eFvm}<9zTBK#IX~S5|Ruo z7tGOP$H&AKsg!c$=&`XSisi`JlY2(YgAoDavEwJ|9%M#jLXq%5bLX8qdCSh6IkR(n zXTOVb|N6*ZWOH-#_U+sIbx6-V^UUqre_pP$O1Q(;*4EC>PR~@T04%V%xw*5m!>(K0 zzkhRcYiH*+LqRs^ zU-`;3CPBa(doz#pJO?EU)ztgX$~*XIu({^jjkx6VHI+}hgOg9q>b z;qCuShs59C`W=9?fA{SAZ1pb>?*HNKTL3oK*Z%W&zcsTjeEv+nGGhE}Y;5%Yr$gS` zkaw8}nKgBOclt2qV$PiE$&)9u*(~= z9?7-U)j$8&9}t|KURzn4ee&tYfBNGe6}u;Ar~m8!|B_8!|IrwDQ)_aedTrMgW8x$j(ENrW9Hb z(V*h8lGLgsU=f-MxsJ>X^2`t#U<%}#`^n|Y2|^o1;OeCxF=W8iAN^1gOVbqo?9Dgt z?%XCz5}027@ehee7HDGyFv>#!+sJbst)ZpSK&4HDO8^xG>csKgl>zd$RPu^f^^&(K z!9kK1yXvM!e?(Il5s)`Vh*A`If#_}J9u=vL3KTD#E<^1I1>1_5n~We~z_lxvC>J>~ z{QAvn_ipcqoC4Rc{7`{BW2fP7T>3GJ5JB*bD?e&byUj&yVW|=ts^&OC>58SMSVus~ zQ%a@u_?ksTF(!qL1mqE^<%TN_Rdy>WHImOBNjfuCNsmLOs1_;E9)BvpXyI;(^gfWJ zHpr4SR711Wj+3D<7y!^@#{p#2E?%m7HPx9u?oB5eo@AIZoS=IAQa4kaWL>sBBEV9*{hzc z4rc`w+qE#k8*&mVZSv$;&2A!O9Vvx^*PGI3q|qkR(=CIG$xs+hZvp)4zx>p~Mf~de zHL|Rno}qm*5&!M_zZ8=gzkKt$q}BCJ$_f1Z=5w{42duV5eUJOl3JyH6S53ylgRFk zP{g8obAhhQ6ly}nBP*7kkWIp%shLccRE5R>xG*VZ@UB1S)8t9WEl?DI6)H_Gh!!vd z%}fly;4-sfaM8>fQ%b&b2+@-841zR2YBQ zDYp;>*@VTwo_B4X{{@9oMYXxQTd?dOHaVOG+0y_=!sn6iq4z$iMsb8NR{29j+bhpZ zr4J?14*V8bS82zWKt9E))fEcOz>%$4#cHr8sjU6w*4y31XuL#)8r6neh)`IWh(T+X zwm<<$F%bR_`2$TUc}c|#%c6Mc=bEGiGX!JL1gG!r; zm@yO<28uSR>sW*F|^S)amy%$?c8_X?hv42ESKX)actGjnx@0v&sTI3q4n3wPGmYQLY zL0-Zr9%wqf9X-rN1Yt!G7nCS8zOYyn5(%7pF@;&cgPui2E&`_Z$Uzl!CR+Z8{=;SafP|WoJ5bVQp}1X>MmNW?^G= lZ*l+tc-k|pFw`-GU;q(s0_UCn9+?0D002ovPDHLkV1fc}Yajps literal 33442 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 - + - dependency-check-core - About - + dependency-check-core – About + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@

  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +

    About

    Dependency-check-core is the primary library that contains analyzers used to scan (java) application dependencies. The purpose of the analysis is to identify the library used and subsequently report on any CVE entries related to the library.

    @@ -168,15 +168,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/integration.html b/dependency-check-core/integration.html new file mode 100644 index 000000000..2ad5fbccf --- /dev/null +++ b/dependency-check-core/integration.html @@ -0,0 +1,228 @@ + + + + + + + + + dependency-check-core – Continuous Integration + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +
    +

    Overview

    +

    This project uses Continuous Integration System.

    +
    +

    Access

    +

    The following is a link to the continuous integration system used by the project:

    +
    +
    +

    Notifiers

    +

    No notifiers are defined. Please check back at a later date.

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-core/issue-tracking.html b/dependency-check-core/issue-tracking.html index 7b99c717a..5cd916eac 100644 --- a/dependency-check-core/issue-tracking.html +++ b/dependency-check-core/issue-tracking.html @@ -1,21 +1,21 @@ - + - dependency-check-core - Issue Tracking - + dependency-check-core – Issue Tracking + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Overview

    +

    Overview

    This project uses github to manage its issues.

    -

    Issue Tracking

    +

    Issue Tracking

    Issues, bugs, and feature requests should be submitted to the following issue tracking system for this project.

    -
    +
    @@ -205,15 +211,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/js/apache-maven-fluido-1.4.min.js b/dependency-check-core/js/apache-maven-fluido-1.4.min.js new file mode 100644 index 000000000..0537c09d6 --- /dev/null +++ b/dependency-check-core/js/apache-maven-fluido-1.4.min.js @@ -0,0 +1,25 @@ +/*! + * jQuery JavaScript Library v1.11.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-17T15:27Z + */ +(function(b,a){if(typeof module==="object"&&typeof module.exports==="object"){module.exports=b.document?a(b,true):function(c){if(!c.document){throw new Error("jQuery requires a window with a document")}return a(c)}}else{a(b)}}(typeof window!=="undefined"?window:this,function(a5,av){var aP=[];var P=aP.slice;var az=aP.concat;var x=aP.push;var bU=aP.indexOf;var ac={};var y=ac.toString;var K=ac.hasOwnProperty;var D={};var ai="1.11.2",bI=function(e,i){return new bI.fn.init(e,i)},E=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bS=/^-ms-/,aW=/-([\da-z])/gi,O=function(e,i){return i.toUpperCase()};bI.fn=bI.prototype={jquery:ai,constructor:bI,selector:"",length:0,toArray:function(){return P.call(this)},get:function(e){return e!=null?(e<0?this[e+this.length]:this[e]):P.call(this)},pushStack:function(e){var i=bI.merge(this.constructor(),e);i.prevObject=this;i.context=this.context;return i},each:function(i,e){return bI.each(this,i,e)},map:function(e){return this.pushStack(bI.map(this,function(b7,b6){return e.call(b7,b6,b7)}))},slice:function(){return this.pushStack(P.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(b7){var e=this.length,b6=+b7+(b7<0?e:0);return this.pushStack(b6>=0&&b6=0},isEmptyObject:function(i){var e;for(e in i){return false}return true},isPlainObject:function(b7){var i;if(!b7||bI.type(b7)!=="object"||b7.nodeType||bI.isWindow(b7)){return false}try{if(b7.constructor&&!K.call(b7,"constructor")&&!K.call(b7.constructor.prototype,"isPrototypeOf")){return false}}catch(b6){return false}if(D.ownLast){for(i in b7){return K.call(b7,i)}}for(i in b7){}return i===undefined||K.call(b7,i)},type:function(e){if(e==null){return e+""}return typeof e==="object"||typeof e==="function"?ac[y.call(e)]||"object":typeof e},globalEval:function(e){if(e&&bI.trim(e)){(a5.execScript||function(i){a5["eval"].call(a5,i)})(e)}},camelCase:function(e){return e.replace(bS,"ms-").replace(aW,O)},nodeName:function(i,e){return i.nodeName&&i.nodeName.toLowerCase()===e.toLowerCase()},each:function(ca,cb,b6){var b9,b7=0,b8=ca.length,e=ad(ca);if(b6){if(e){for(;b70&&(i-1) in b6}var m= +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function(de){var cy,dh,cn,cH,cK,ci,cW,dg,dm,cI,cX,cZ,cC,co,c8,c3,df,ce,cF,da="sizzle"+1*new Date(),cJ=de.document,di=0,c4=0,b9=cA(),c9=cA(),cG=cA(),cE=function(i,e){if(i===e){cX=true}return 0},cQ=1<<31,cO=({}).hasOwnProperty,dc=[],dd=dc.pop,cM=dc.push,b7=dc.push,cm=dc.slice,cd=function(dq,dp){var dn=0,e=dq.length;for(;dn+~]|"+cp+")"+cp+"*"),ct=new RegExp("="+cp+"*([^\\]'\"]*?)"+cp+"*\\]","g"),cS=new RegExp(ck),cU=new RegExp("^"+cL+"$"),c2={ID:new RegExp("^#("+b6+")"),CLASS:new RegExp("^\\.("+b6+")"),TAG:new RegExp("^("+b6.replace("w","w*")+")"),ATTR:new RegExp("^"+c6),PSEUDO:new RegExp("^"+ck),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+cp+"*(even|odd|(([+-]|)(\\d*)n|)"+cp+"*(?:([+-]|)"+cp+"*(\\d+)|))"+cp+"*\\)|)","i"),bool:new RegExp("^(?:"+b8+")$","i"),needsContext:new RegExp("^"+cp+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+cp+"*((?:-\\d)?\\d*)"+cp+"*\\)|)(?=[^-]|$)","i")},cc=/^(?:input|select|textarea|button)$/i,cl=/^h\d$/i,cP=/^[^{]+\{\s*\[native \w/,cR=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,c1=/[+~]/,cN=/'|\\/g,cs=new RegExp("\\\\([\\da-f]{1,6}"+cp+"?|("+cp+")|.)","ig"),c5=function(e,dp,i){var dn="0x"+dp-65536;return dn!==dn||i?dp:dn<0?String.fromCharCode(dn+65536):String.fromCharCode(dn>>10|55296,dn&1023|56320)},dl=function(){cZ()};try{b7.apply((dc=cm.call(cJ.childNodes)),cJ.childNodes);dc[cJ.childNodes.length].nodeType}catch(cD){b7={apply:dc.length?function(i,e){cM.apply(i,cm.call(e))}:function(dq,dp){var e=dq.length,dn=0;while((dq[e++]=dp[dn++])){}dq.length=e-1}}}function cw(dv,dn,dz,dB){var dA,ds,dt,dx,dy,dr,dq,e,dp,dw;if((dn?dn.ownerDocument||dn:cJ)!==cC){cZ(dn)}dn=dn||cC;dz=dz||[];dx=dn.nodeType;if(typeof dv!=="string"||!dv||dx!==1&&dx!==9&&dx!==11){return dz}if(!dB&&c8){if(dx!==11&&(dA=cR.exec(dv))){if((dt=dA[1])){if(dx===9){ds=dn.getElementById(dt);if(ds&&ds.parentNode){if(ds.id===dt){dz.push(ds);return dz}}else{return dz}}else{if(dn.ownerDocument&&(ds=dn.ownerDocument.getElementById(dt))&&cF(dn,ds)&&ds.id===dt){dz.push(ds);return dz}}}else{if(dA[2]){b7.apply(dz,dn.getElementsByTagName(dv));return dz}else{if((dt=dA[3])&&dh.getElementsByClassName){b7.apply(dz,dn.getElementsByClassName(dt));return dz}}}}if(dh.qsa&&(!c3||!c3.test(dv))){e=dq=da;dp=dn;dw=dx!==1&&dv;if(dx===1&&dn.nodeName.toLowerCase()!=="object"){dr=ci(dv);if((dq=dn.getAttribute("id"))){e=dq.replace(cN,"\\$&")}else{dn.setAttribute("id",e)}e="[id='"+e+"'] ";dy=dr.length;while(dy--){dr[dy]=e+ch(dr[dy])}dp=c1.test(dv)&&cT(dn.parentNode)||dn;dw=dr.join(",")}if(dw){try{b7.apply(dz,dp.querySelectorAll(dw));return dz}catch(du){}finally{if(!dq){dn.removeAttribute("id")}}}}}return dg(dv.replace(cr,"$1"),dn,dz,dB)}function cA(){var i=[];function e(dn,dp){if(i.push(dn+" ")>cn.cacheLength){delete e[i.shift()]}return(e[dn+" "]=dp)}return e}function cj(e){e[da]=true;return e}function cf(i){var dp=cC.createElement("div");try{return !!i(dp)}catch(dn){return false}finally{if(dp.parentNode){dp.parentNode.removeChild(dp)}dp=null}}function dj(dn,dq){var e=dn.split("|"),dp=dn.length;while(dp--){cn.attrHandle[e[dp]]=dq}}function ca(i,e){var dp=e&&i,dn=dp&&i.nodeType===1&&e.nodeType===1&&(~e.sourceIndex||cQ)-(~i.sourceIndex||cQ);if(dn){return dn}if(dp){while((dp=dp.nextSibling)){if(dp===e){return -1}}}return i?1:-1}function cx(e){return function(dn){var i=dn.nodeName.toLowerCase();return i==="input"&&dn.type===e}}function cb(e){return function(dn){var i=dn.nodeName.toLowerCase();return(i==="input"||i==="button")&&dn.type===e}}function c7(e){return cj(function(i){i=+i;return cj(function(dn,ds){var dq,dp=e([],dn.length,i),dr=dp.length;while(dr--){if(dn[(dq=dp[dr])]){dn[dq]=!(ds[dq]=dn[dq])}}})})}function cT(e){return e&&typeof e.getElementsByTagName!=="undefined"&&e}dh=cw.support={};cK=cw.isXML=function(e){var i=e&&(e.ownerDocument||e).documentElement;return i?i.nodeName!=="HTML":false};cZ=cw.setDocument=function(dn){var e,i,dp=dn?dn.ownerDocument||dn:cJ;if(dp===cC||dp.nodeType!==9||!dp.documentElement){return cC}cC=dp;co=dp.documentElement;i=dp.defaultView;if(i&&i!==i.top){if(i.addEventListener){i.addEventListener("unload",dl,false)}else{if(i.attachEvent){i.attachEvent("onunload",dl)}}}c8=!cK(dp);dh.attributes=cf(function(dq){dq.className="i";return !dq.getAttribute("className")});dh.getElementsByTagName=cf(function(dq){dq.appendChild(dp.createComment(""));return !dq.getElementsByTagName("*").length});dh.getElementsByClassName=cP.test(dp.getElementsByClassName);dh.getById=cf(function(dq){co.appendChild(dq).id=da;return !dp.getElementsByName||!dp.getElementsByName(da).length});if(dh.getById){cn.find.ID=function(ds,dr){if(typeof dr.getElementById!=="undefined"&&c8){var dq=dr.getElementById(ds);return dq&&dq.parentNode?[dq]:[]}};cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(ds){return ds.getAttribute("id")===dq}}}else{delete cn.find.ID;cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(dt){var ds=typeof dt.getAttributeNode!=="undefined"&&dt.getAttributeNode("id");return ds&&ds.value===dq}}}cn.find.TAG=dh.getElementsByTagName?function(dq,dr){if(typeof dr.getElementsByTagName!=="undefined"){return dr.getElementsByTagName(dq)}else{if(dh.qsa){return dr.querySelectorAll(dq)}}}:function(dq,du){var dv,dt=[],ds=0,dr=du.getElementsByTagName(dq);if(dq==="*"){while((dv=dr[ds++])){if(dv.nodeType===1){dt.push(dv)}}return dt}return dr};cn.find.CLASS=dh.getElementsByClassName&&function(dr,dq){if(c8){return dq.getElementsByClassName(dr)}};df=[];c3=[];if((dh.qsa=cP.test(dp.querySelectorAll))){cf(function(dq){co.appendChild(dq).innerHTML="";if(dq.querySelectorAll("[msallowcapture^='']").length){c3.push("[*^$]="+cp+"*(?:''|\"\")")}if(!dq.querySelectorAll("[selected]").length){c3.push("\\["+cp+"*(?:value|"+b8+")")}if(!dq.querySelectorAll("[id~="+da+"-]").length){c3.push("~=")}if(!dq.querySelectorAll(":checked").length){c3.push(":checked")}if(!dq.querySelectorAll("a#"+da+"+*").length){c3.push(".#.+[+~]")}});cf(function(dr){var dq=dp.createElement("input");dq.setAttribute("type","hidden");dr.appendChild(dq).setAttribute("name","D");if(dr.querySelectorAll("[name=d]").length){c3.push("name"+cp+"*[*^$|!~]?=")}if(!dr.querySelectorAll(":enabled").length){c3.push(":enabled",":disabled")}dr.querySelectorAll("*,:x");c3.push(",.*:")})}if((dh.matchesSelector=cP.test((ce=co.matches||co.webkitMatchesSelector||co.mozMatchesSelector||co.oMatchesSelector||co.msMatchesSelector)))){cf(function(dq){dh.disconnectedMatch=ce.call(dq,"div");ce.call(dq,"[s!='']:x");df.push("!=",ck)})}c3=c3.length&&new RegExp(c3.join("|"));df=df.length&&new RegExp(df.join("|"));e=cP.test(co.compareDocumentPosition);cF=e||cP.test(co.contains)?function(dr,dq){var dt=dr.nodeType===9?dr.documentElement:dr,ds=dq&&dq.parentNode;return dr===ds||!!(ds&&ds.nodeType===1&&(dt.contains?dt.contains(ds):dr.compareDocumentPosition&&dr.compareDocumentPosition(ds)&16))}:function(dr,dq){if(dq){while((dq=dq.parentNode)){if(dq===dr){return true}}}return false};cE=e?function(dr,dq){if(dr===dq){cX=true;return 0}var ds=!dr.compareDocumentPosition-!dq.compareDocumentPosition;if(ds){return ds}ds=(dr.ownerDocument||dr)===(dq.ownerDocument||dq)?dr.compareDocumentPosition(dq):1;if(ds&1||(!dh.sortDetached&&dq.compareDocumentPosition(dr)===ds)){if(dr===dp||dr.ownerDocument===cJ&&cF(cJ,dr)){return -1}if(dq===dp||dq.ownerDocument===cJ&&cF(cJ,dq)){return 1}return cI?(cd(cI,dr)-cd(cI,dq)):0}return ds&4?-1:1}:function(dr,dq){if(dr===dq){cX=true;return 0}var dx,du=0,dw=dr.parentNode,dt=dq.parentNode,ds=[dr],dv=[dq];if(!dw||!dt){return dr===dp?-1:dq===dp?1:dw?-1:dt?1:cI?(cd(cI,dr)-cd(cI,dq)):0}else{if(dw===dt){return ca(dr,dq)}}dx=dr;while((dx=dx.parentNode)){ds.unshift(dx)}dx=dq;while((dx=dx.parentNode)){dv.unshift(dx)}while(ds[du]===dv[du]){du++}return du?ca(ds[du],dv[du]):ds[du]===cJ?-1:dv[du]===cJ?1:0};return dp};cw.matches=function(i,e){return cw(i,null,null,e)};cw.matchesSelector=function(dn,dq){if((dn.ownerDocument||dn)!==cC){cZ(dn)}dq=dq.replace(ct,"='$1']");if(dh.matchesSelector&&c8&&(!df||!df.test(dq))&&(!c3||!c3.test(dq))){try{var i=ce.call(dn,dq);if(i||dh.disconnectedMatch||dn.document&&dn.document.nodeType!==11){return i}}catch(dp){}}return cw(dq,cC,null,[dn]).length>0};cw.contains=function(e,i){if((e.ownerDocument||e)!==cC){cZ(e)}return cF(e,i)};cw.attr=function(dn,e){if((dn.ownerDocument||dn)!==cC){cZ(dn)}var i=cn.attrHandle[e.toLowerCase()],dp=i&&cO.call(cn.attrHandle,e.toLowerCase())?i(dn,e,!c8):undefined;return dp!==undefined?dp:dh.attributes||!c8?dn.getAttribute(e):(dp=dn.getAttributeNode(e))&&dp.specified?dp.value:null};cw.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};cw.uniqueSort=function(dp){var dq,dr=[],e=0,dn=0;cX=!dh.detectDuplicates;cI=!dh.sortStable&&dp.slice(0);dp.sort(cE);if(cX){while((dq=dp[dn++])){if(dq===dp[dn]){e=dr.push(dn)}}while(e--){dp.splice(dr[e],1)}}cI=null;return dp};cH=cw.getText=function(dr){var dq,dn="",dp=0,e=dr.nodeType;if(!e){while((dq=dr[dp++])){dn+=cH(dq)}}else{if(e===1||e===9||e===11){if(typeof dr.textContent==="string"){return dr.textContent}else{for(dr=dr.firstChild;dr;dr=dr.nextSibling){dn+=cH(dr)}}}else{if(e===3||e===4){return dr.nodeValue}}}return dn};cn=cw.selectors={cacheLength:50,createPseudo:cj,match:c2,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){e[1]=e[1].replace(cs,c5);e[3]=(e[3]||e[4]||e[5]||"").replace(cs,c5);if(e[2]==="~="){e[3]=" "+e[3]+" "}return e.slice(0,4)},CHILD:function(e){e[1]=e[1].toLowerCase();if(e[1].slice(0,3)==="nth"){if(!e[3]){cw.error(e[0])}e[4]=+(e[4]?e[5]+(e[6]||1):2*(e[3]==="even"||e[3]==="odd"));e[5]=+((e[7]+e[8])||e[3]==="odd")}else{if(e[3]){cw.error(e[0])}}return e},PSEUDO:function(i){var e,dn=!i[6]&&i[2];if(c2.CHILD.test(i[0])){return null}if(i[3]){i[2]=i[4]||i[5]||""}else{if(dn&&cS.test(dn)&&(e=ci(dn,true))&&(e=dn.indexOf(")",dn.length-e)-dn.length)){i[0]=i[0].slice(0,e);i[2]=dn.slice(0,e)}}return i.slice(0,3)}},filter:{TAG:function(i){var e=i.replace(cs,c5).toLowerCase();return i==="*"?function(){return true}:function(dn){return dn.nodeName&&dn.nodeName.toLowerCase()===e}},CLASS:function(e){var i=b9[e+" "];return i||(i=new RegExp("(^|"+cp+")"+e+"("+cp+"|$)"))&&b9(e,function(dn){return i.test(typeof dn.className==="string"&&dn.className||typeof dn.getAttribute!=="undefined"&&dn.getAttribute("class")||"")})},ATTR:function(dn,i,e){return function(dq){var dp=cw.attr(dq,dn);if(dp==null){return i==="!="}if(!i){return true}dp+="";return i==="="?dp===e:i==="!="?dp!==e:i==="^="?e&&dp.indexOf(e)===0:i==="*="?e&&dp.indexOf(e)>-1:i==="$="?e&&dp.slice(-e.length)===e:i==="~="?(" "+dp.replace(cu," ")+" ").indexOf(e)>-1:i==="|="?dp===e||dp.slice(0,e.length+1)===e+"-":false}},CHILD:function(i,dq,dp,dr,dn){var dt=i.slice(0,3)!=="nth",e=i.slice(-4)!=="last",ds=dq==="of-type";return dr===1&&dn===0?function(du){return !!du.parentNode}:function(dA,dy,dD){var du,dG,dB,dF,dC,dx,dz=dt!==e?"nextSibling":"previousSibling",dE=dA.parentNode,dw=ds&&dA.nodeName.toLowerCase(),dv=!dD&&!ds;if(dE){if(dt){while(dz){dB=dA;while((dB=dB[dz])){if(ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1){return false}}dx=dz=i==="only"&&!dx&&"nextSibling"}return true}dx=[e?dE.firstChild:dE.lastChild];if(e&&dv){dG=dE[da]||(dE[da]={});du=dG[i]||[];dC=du[0]===di&&du[1];dF=du[0]===di&&du[2];dB=dC&&dE.childNodes[dC];while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if(dB.nodeType===1&&++dF&&dB===dA){dG[i]=[di,dC,dF];break}}}else{if(dv&&(du=(dA[da]||(dA[da]={}))[i])&&du[0]===di){dF=du[1]}else{while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if((ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1)&&++dF){if(dv){(dB[da]||(dB[da]={}))[i]=[di,dF]}if(dB===dA){break}}}}}dF-=dn;return dF===dr||(dF%dr===0&&dF/dr>=0)}}},PSEUDO:function(dp,dn){var e,i=cn.pseudos[dp]||cn.setFilters[dp.toLowerCase()]||cw.error("unsupported pseudo: "+dp);if(i[da]){return i(dn)}if(i.length>1){e=[dp,dp,"",dn];return cn.setFilters.hasOwnProperty(dp.toLowerCase())?cj(function(ds,du){var dr,dq=i(ds,dn),dt=dq.length;while(dt--){dr=cd(ds,dq[dt]);ds[dr]=!(du[dr]=dq[dt])}}):function(dq){return i(dq,0,e)}}return i}},pseudos:{not:cj(function(e){var i=[],dn=[],dp=cW(e.replace(cr,"$1"));return dp[da]?cj(function(dr,dw,du,ds){var dv,dq=dp(dr,null,ds,[]),dt=dr.length;while(dt--){if((dv=dq[dt])){dr[dt]=!(dw[dt]=dv)}}}):function(ds,dr,dq){i[0]=ds;dp(i,null,dq,dn);i[0]=null;return !dn.pop()}}),has:cj(function(e){return function(i){return cw(e,i).length>0}}),contains:cj(function(e){e=e.replace(cs,c5);return function(i){return(i.textContent||i.innerText||cH(i)).indexOf(e)>-1}}),lang:cj(function(e){if(!cU.test(e||"")){cw.error("unsupported lang: "+e)}e=e.replace(cs,c5).toLowerCase();return function(dn){var i;do{if((i=c8?dn.lang:dn.getAttribute("xml:lang")||dn.getAttribute("lang"))){i=i.toLowerCase();return i===e||i.indexOf(e+"-")===0}}while((dn=dn.parentNode)&&dn.nodeType===1);return false}}),target:function(e){var i=de.location&&de.location.hash;return i&&i.slice(1)===e.id},root:function(e){return e===co},focus:function(e){return e===cC.activeElement&&(!cC.hasFocus||cC.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===false},disabled:function(e){return e.disabled===true},checked:function(e){var i=e.nodeName.toLowerCase();return(i==="input"&&!!e.checked)||(i==="option"&&!!e.selected)},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling){if(e.nodeType<6){return false}}return true},parent:function(e){return !cn.pseudos.empty(e)},header:function(e){return cl.test(e.nodeName)},input:function(e){return cc.test(e.nodeName)},button:function(i){var e=i.nodeName.toLowerCase();return e==="input"&&i.type==="button"||e==="button"},text:function(i){var e;return i.nodeName.toLowerCase()==="input"&&i.type==="text"&&((e=i.getAttribute("type"))==null||e.toLowerCase()==="text")},first:c7(function(){return[0]}),last:c7(function(e,i){return[i-1]}),eq:c7(function(e,dn,i){return[i<0?i+dn:i]}),even:c7(function(e,dp){var dn=0;for(;dn=0;){e.push(dn)}return e}),gt:c7(function(e,dq,dp){var dn=dp<0?dp+dq:dp;for(;++dn1?function(dr,dq,dn){var dp=e.length;while(dp--){if(!e[dp](dr,dq,dn)){return false}}return true}:e[0]}function cz(dn,dr,dq){var dp=0,e=dr.length;for(;dp-1){dC[dE]=!(dz[dE]=dw)}}}}else{dy=c0(dy===dz?dy.splice(dt,dy.length):dy);if(dr){dr(null,dz,dy,dB)}else{b7.apply(dz,dy)}}})}function db(dt){var dn,dr,dp,ds=dt.length,dw=cn.relative[dt[0].type],dx=dw||cn.relative[" "],dq=dw?1:0,du=cq(function(i){return i===dn},dx,true),dv=cq(function(i){return cd(dn,i)>-1},dx,true),e=[function(dA,dz,dy){var i=(!dw&&(dy||dz!==dm))||((dn=dz).nodeType?du(dA,dz,dy):dv(dA,dz,dy));dn=null;return i}];for(;dq1&&dk(e),dq>1&&ch(dt.slice(0,dq-1).concat({value:dt[dq-2].type===" "?"*":""})).replace(cr,"$1"),dr,dq0,dq=dp.length>0,i=function(dA,du,dz,dy,dD){var dv,dw,dB,dF=0,dx="0",dr=dA&&[],dG=[],dE=dm,dt=dA||dq&&cn.find.TAG("*",dD),ds=(di+=dE==null?1:Math.random()||0.1),dC=dt.length;if(dD){dm=du!==cC&&du}for(;dx!==dC&&(dv=dt[dx])!=null;dx++){if(dq&&dv){dw=0;while((dB=dp[dw++])){if(dB(dv,du,dz)){dy.push(dv);break}}if(dD){di=ds}}if(e){if((dv=!dB&&dv)){dF--}if(dA){dr.push(dv)}}}dF+=dx;if(e&&dx!==dF){dw=0;while((dB=dn[dw++])){dB(dr,dG,du,dz)}if(dA){if(dF>0){while(dx--){if(!(dr[dx]||dG[dx])){dG[dx]=dd.call(dy)}}}dG=c0(dG)}b7.apply(dy,dG);if(dD&&!dA&&dG.length>0&&(dF+dn.length)>1){cw.uniqueSort(dy)}}if(dD){di=ds;dm=dE}return dr};return e?cj(i):i}cW=cw.compile=function(e,dp){var dq,dn=[],ds=[],dr=cG[e+" "];if(!dr){if(!dp){dp=ci(e)}dq=dp.length;while(dq--){dr=db(dp[dq]);if(dr[da]){dn.push(dr)}else{ds.push(dr)}}dr=cG(e,cY(ds,dn));dr.selector=e}return dr};dg=cw.select=function(dp,e,dq,dt){var dr,dw,dn,dx,du,dv=typeof dp==="function"&&dp,ds=!dt&&ci((dp=dv.selector||dp));dq=dq||[];if(ds.length===1){dw=ds[0]=ds[0].slice(0);if(dw.length>2&&(dn=dw[0]).type==="ID"&&dh.getById&&e.nodeType===9&&c8&&cn.relative[dw[1].type]){e=(cn.find.ID(dn.matches[0].replace(cs,c5),e)||[])[0];if(!e){return dq}else{if(dv){e=e.parentNode}}dp=dp.slice(dw.shift().value.length)}dr=c2.needsContext.test(dp)?0:dw.length;while(dr--){dn=dw[dr];if(cn.relative[(dx=dn.type)]){break}if((du=cn.find[dx])){if((dt=du(dn.matches[0].replace(cs,c5),c1.test(dw[0].type)&&cT(e.parentNode)||e))){dw.splice(dr,1);dp=dt.length&&ch(dw);if(!dp){b7.apply(dq,dt);return dq}break}}}}(dv||cW(dp,ds))(dt,e,!c8,dq,c1.test(dp)&&cT(e.parentNode)||e);return dq};dh.sortStable=da.split("").sort(cE).join("")===da;dh.detectDuplicates=!!cX;cZ();dh.sortDetached=cf(function(e){return e.compareDocumentPosition(cC.createElement("div"))&1});if(!cf(function(e){e.innerHTML="";return e.firstChild.getAttribute("href")==="#"})){dj("type|href|height|width",function(i,e,dn){if(!dn){return i.getAttribute(e,e.toLowerCase()==="type"?1:2)}})}if(!dh.attributes||!cf(function(e){e.innerHTML="";e.firstChild.setAttribute("value","");return e.firstChild.getAttribute("value")===""})){dj("value",function(i,e,dn){if(!dn&&i.nodeName.toLowerCase()==="input"){return i.defaultValue}})}if(!cf(function(e){return e.getAttribute("disabled")==null})){dj(b8,function(i,e,dp){var dn;if(!dp){return i[e]===true?e.toLowerCase():(dn=i.getAttributeNode(e))&&dn.specified?dn.value:null}})}return cw})(a5);bI.find=m;bI.expr=m.selectors;bI.expr[":"]=bI.expr.pseudos;bI.unique=m.uniqueSort;bI.text=m.getText;bI.isXMLDoc=m.isXML;bI.contains=m.contains;var A=bI.expr.match.needsContext;var a=(/^<(\w+)\s*\/?>(?:<\/\1>|)$/);var aL=/^.[^:#\[\.,]*$/;function aR(b6,e,i){if(bI.isFunction(e)){return bI.grep(b6,function(b8,b7){return !!e.call(b8,b7,b8)!==i})}if(e.nodeType){return bI.grep(b6,function(b7){return(b7===e)!==i})}if(typeof e==="string"){if(aL.test(e)){return bI.filter(e,b6,i)}e=bI.filter(e,b6)}return bI.grep(b6,function(b7){return(bI.inArray(b7,e)>=0)!==i})}bI.filter=function(b7,e,b6){var i=e[0];if(b6){b7=":not("+b7+")"}return e.length===1&&i.nodeType===1?bI.find.matchesSelector(i,b7)?[i]:[]:bI.find.matches(b7,bI.grep(e,function(b8){return b8.nodeType===1}))};bI.fn.extend({find:function(b6){var b9,b8=[],b7=this,e=b7.length;if(typeof b6!=="string"){return this.pushStack(bI(b6).filter(function(){for(b9=0;b91?bI.unique(b8):b8);b8.selector=this.selector?this.selector+" "+b6:b6;return b8},filter:function(e){return this.pushStack(aR(this,e||[],false))},not:function(e){return this.pushStack(aR(this,e||[],true))},is:function(e){return !!aR(this,typeof e==="string"&&A.test(e)?bI(e):e||[],false).length}});var z,n=a5.document,bt=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,bV=bI.fn.init=function(e,b6){var i,b7;if(!e){return this}if(typeof e==="string"){if(e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3){i=[null,e,null]}else{i=bt.exec(e)}if(i&&(i[1]||!b6)){if(i[1]){b6=b6 instanceof bI?b6[0]:b6;bI.merge(this,bI.parseHTML(i[1],b6&&b6.nodeType?b6.ownerDocument||b6:n,true));if(a.test(i[1])&&bI.isPlainObject(b6)){for(i in b6){if(bI.isFunction(this[i])){this[i](b6[i])}else{this.attr(i,b6[i])}}}return this}else{b7=n.getElementById(i[2]);if(b7&&b7.parentNode){if(b7.id!==i[2]){return z.find(e)}this.length=1;this[0]=b7}this.context=n;this.selector=e;return this}}else{if(!b6||b6.jquery){return(b6||z).find(e)}else{return this.constructor(b6).find(e)}}}else{if(e.nodeType){this.context=this[0]=e;this.length=1;return this}else{if(bI.isFunction(e)){return typeof z.ready!=="undefined"?z.ready(e):e(bI)}}}if(e.selector!==undefined){this.selector=e.selector;this.context=e.context}return bI.makeArray(e,this)};bV.prototype=bI.fn;z=bI(n);var bv=/^(?:parents|prev(?:Until|All))/,bz={children:true,contents:true,next:true,prev:true};bI.extend({dir:function(b6,i,b8){var e=[],b7=b6[i];while(b7&&b7.nodeType!==9&&(b8===undefined||b7.nodeType!==1||!bI(b7).is(b8))){if(b7.nodeType===1){e.push(b7)}b7=b7[i]}return e},sibling:function(b6,i){var e=[];for(;b6;b6=b6.nextSibling){if(b6.nodeType===1&&b6!==i){e.push(b6)}}return e}});bI.fn.extend({has:function(b8){var b7,b6=bI(b8,this),e=b6.length;return this.filter(function(){for(b7=0;b7-1:ca.nodeType===1&&bI.find.matchesSelector(ca,b9))){e.push(ca);break}}}return this.pushStack(e.length>1?bI.unique(e):e)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.first().prevAll().length:-1}if(typeof e==="string"){return bI.inArray(this[0],bI(e))}return bI.inArray(e.jquery?e[0]:e,this)},add:function(e,i){return this.pushStack(bI.unique(bI.merge(this.get(),bI(e,i))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}});function aY(i,e){do{i=i[e]}while(i&&i.nodeType!==1);return i}bI.each({parent:function(i){var e=i.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return bI.dir(e,"parentNode")},parentsUntil:function(b6,e,b7){return bI.dir(b6,"parentNode",b7)},next:function(e){return aY(e,"nextSibling")},prev:function(e){return aY(e,"previousSibling")},nextAll:function(e){return bI.dir(e,"nextSibling")},prevAll:function(e){return bI.dir(e,"previousSibling")},nextUntil:function(b6,e,b7){return bI.dir(b6,"nextSibling",b7)},prevUntil:function(b6,e,b7){return bI.dir(b6,"previousSibling",b7)},siblings:function(e){return bI.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return bI.sibling(e.firstChild)},contents:function(e){return bI.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:bI.merge([],e.childNodes)}},function(e,i){bI.fn[e]=function(b8,b6){var b7=bI.map(this,i,b8);if(e.slice(-5)!=="Until"){b6=b8}if(b6&&typeof b6==="string"){b7=bI.filter(b6,b7)}if(this.length>1){if(!bz[e]){b7=bI.unique(b7)}if(bv.test(e)){b7=b7.reverse()}}return this.pushStack(b7)}});var aF=(/\S+/g);var b2={};function af(i){var e=b2[i]={};bI.each(i.match(aF)||[],function(b7,b6){e[b6]=true});return e}bI.Callbacks=function(ce){ce=typeof ce==="string"?(b2[ce]||af(ce)):bI.extend({},ce);var b8,b7,e,b9,ca,b6,cb=[],cc=!ce.once&&[],i=function(cf){b7=ce.memory&&cf;e=true;ca=b6||0;b6=0;b9=cb.length;b8=true;for(;cb&&ca-1){cb.splice(cg,1);if(b8){if(cg<=b9){b9--}if(cg<=ca){ca--}}}})}return this},has:function(cf){return cf?bI.inArray(cf,cb)>-1:!!(cb&&cb.length)},empty:function(){cb=[];b9=0;return this},disable:function(){cb=cc=b7=undefined;return this},disabled:function(){return !cb},lock:function(){cc=undefined;if(!b7){cd.disable()}return this},locked:function(){return !cc},fireWith:function(cg,cf){if(cb&&(!e||cc)){cf=cf||[];cf=[cg,cf.slice?cf.slice():cf];if(b8){cc.push(cf)}else{i(cf)}}return this},fire:function(){cd.fireWith(this,arguments);return this},fired:function(){return !!e}};return cd};bI.extend({Deferred:function(b6){var i=[["resolve","done",bI.Callbacks("once memory"),"resolved"],["reject","fail",bI.Callbacks("once memory"),"rejected"],["notify","progress",bI.Callbacks("memory")]],b7="pending",b8={state:function(){return b7},always:function(){e.done(arguments).fail(arguments);return this},then:function(){var b9=arguments;return bI.Deferred(function(ca){bI.each(i,function(cc,cb){var cd=bI.isFunction(b9[cc])&&b9[cc];e[cb[1]](function(){var ce=cd&&cd.apply(this,arguments);if(ce&&bI.isFunction(ce.promise)){ce.promise().done(ca.resolve).fail(ca.reject).progress(ca.notify)}else{ca[cb[0]+"With"](this===b8?ca.promise():this,cd?[ce]:arguments)}})});b9=null}).promise()},promise:function(b9){return b9!=null?bI.extend(b9,b8):b8}},e={};b8.pipe=b8.then;bI.each(i,function(ca,b9){var cc=b9[2],cb=b9[3];b8[b9[1]]=cc.add;if(cb){cc.add(function(){b7=cb},i[ca^1][2].disable,i[2][2].lock)}e[b9[0]]=function(){e[b9[0]+"With"](this===e?b8:this,arguments);return this};e[b9[0]+"With"]=cc.fireWith});b8.promise(e);if(b6){b6.call(e,e)}return e},when:function(b9){var b7=0,cb=P.call(arguments),e=cb.length,b6=e!==1||(b9&&bI.isFunction(b9.promise))?e:0,ce=b6===1?b9:bI.Deferred(),b8=function(cg,ch,cf){return function(i){ch[cg]=this;cf[cg]=arguments.length>1?P.call(arguments):i;if(cf===cd){ce.notifyWith(ch,cf)}else{if(!(--b6)){ce.resolveWith(ch,cf)}}}},cd,ca,cc;if(e>1){cd=new Array(e);ca=new Array(e);cc=new Array(e);for(;b70){return}ak.resolveWith(n,[bI]);if(bI.fn.triggerHandler){bI(n).triggerHandler("ready");bI(n).off("ready")}}});function bm(){if(n.addEventListener){n.removeEventListener("DOMContentLoaded",bZ,false);a5.removeEventListener("load",bZ,false)}else{n.detachEvent("onreadystatechange",bZ);a5.detachEvent("onload",bZ)}}function bZ(){if(n.addEventListener||event.type==="load"||n.readyState==="complete"){bm();bI.ready()}}bI.ready.promise=function(b8){if(!ak){ak=bI.Deferred();if(n.readyState==="complete"){setTimeout(bI.ready)}else{if(n.addEventListener){n.addEventListener("DOMContentLoaded",bZ,false);a5.addEventListener("load",bZ,false)}else{n.attachEvent("onreadystatechange",bZ);a5.attachEvent("onload",bZ);var b7=false;try{b7=a5.frameElement==null&&n.documentElement}catch(b6){}if(b7&&b7.doScroll){(function i(){if(!bI.isReady){try{b7.doScroll("left")}catch(b9){return setTimeout(i,50)}bm();bI.ready()}})()}}}}return ak.promise(b8)};var aC=typeof undefined;var bh;for(bh in bI(D)){break}D.ownLast=bh!=="0";D.inlineBlockNeedsLayout=false;bI(function(){var b6,b7,e,i;e=n.getElementsByTagName("body")[0];if(!e||!e.style){return}b7=n.createElement("div");i=n.createElement("div");i.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";e.appendChild(i).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";D.inlineBlockNeedsLayout=b6=b7.offsetWidth===3;if(b6){e.style.zoom=1}}e.removeChild(i)});(function(){var b6=n.createElement("div");if(D.deleteExpando==null){D.deleteExpando=true;try{delete b6.test}catch(i){D.deleteExpando=false}}b6=null})();bI.acceptData=function(b6){var i=bI.noData[(b6.nodeName+" ").toLowerCase()],e=+b6.nodeType||1;return e!==1&&e!==9?false:!i||i!==true&&b6.getAttribute("classid")===i};var by=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,aQ=/([A-Z])/g;function bA(b7,b6,b8){if(b8===undefined&&b7.nodeType===1){var i="data-"+b6.replace(aQ,"-$1").toLowerCase();b8=b7.getAttribute(i);if(typeof b8==="string"){try{b8=b8==="true"?true:b8==="false"?false:b8==="null"?null:+b8+""===b8?+b8:by.test(b8)?bI.parseJSON(b8):b8}catch(b9){}bI.data(b7,b6,b8)}else{b8=undefined}}return b8}function Q(i){var e;for(e in i){if(e==="data"&&bI.isEmptyObject(i[e])){continue}if(e!=="toJSON"){return false}}return true}function bc(b7,i,b9,b8){if(!bI.acceptData(b7)){return}var cb,ca,cc=bI.expando,cd=b7.nodeType,e=cd?bI.cache:b7,b6=cd?b7[cc]:b7[cc]&&cc;if((!b6||!e[b6]||(!b8&&!e[b6].data))&&b9===undefined&&typeof i==="string"){return}if(!b6){if(cd){b6=b7[cc]=aP.pop()||bI.guid++}else{b6=cc}}if(!e[b6]){e[b6]=cd?{}:{toJSON:bI.noop}}if(typeof i==="object"||typeof i==="function"){if(b8){e[b6]=bI.extend(e[b6],i)}else{e[b6].data=bI.extend(e[b6].data,i)}}ca=e[b6];if(!b8){if(!ca.data){ca.data={}}ca=ca.data}if(b9!==undefined){ca[bI.camelCase(i)]=b9}if(typeof i==="string"){cb=ca[i];if(cb==null){cb=ca[bI.camelCase(i)]}}else{cb=ca}return cb}function ab(b9,b7,e){if(!bI.acceptData(b9)){return}var cb,b8,ca=b9.nodeType,b6=ca?bI.cache:b9,cc=ca?b9[bI.expando]:bI.expando;if(!b6[cc]){return}if(b7){cb=e?b6[cc]:b6[cc].data;if(cb){if(!bI.isArray(b7)){if(b7 in cb){b7=[b7]}else{b7=bI.camelCase(b7);if(b7 in cb){b7=[b7]}else{b7=b7.split(" ")}}}else{b7=b7.concat(bI.map(b7,bI.camelCase))}b8=b7.length;while(b8--){delete cb[b7[b8]]}if(e?!Q(cb):!bI.isEmptyObject(cb)){return}}}if(!e){delete b6[cc].data;if(!Q(b6[cc])){return}}if(ca){bI.cleanData([b9],true)}else{if(D.deleteExpando||b6!=b6.window){delete b6[cc]}else{b6[cc]=null}}}bI.extend({cache:{},noData:{"applet ":true,"embed ":true,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){e=e.nodeType?bI.cache[e[bI.expando]]:e[bI.expando];return !!e&&!Q(e)},data:function(i,e,b6){return bc(i,e,b6)},removeData:function(i,e){return ab(i,e)},_data:function(i,e,b6){return bc(i,e,b6,true)},_removeData:function(i,e){return ab(i,e,true)}});bI.fn.extend({data:function(b8,cb){var b7,b6,ca,b9=this[0],e=b9&&b9.attributes;if(b8===undefined){if(this.length){ca=bI.data(b9);if(b9.nodeType===1&&!bI._data(b9,"parsedAttrs")){b7=e.length;while(b7--){if(e[b7]){b6=e[b7].name;if(b6.indexOf("data-")===0){b6=bI.camelCase(b6.slice(5));bA(b9,b6,ca[b6])}}}bI._data(b9,"parsedAttrs",true)}}return ca}if(typeof b8==="object"){return this.each(function(){bI.data(this,b8)})}return arguments.length>1?this.each(function(){bI.data(this,b8,cb)}):b9?bA(b9,b8,bI.data(b9,b8)):undefined},removeData:function(e){return this.each(function(){bI.removeData(this,e)})}});bI.extend({queue:function(b6,i,b7){var e;if(b6){i=(i||"fx")+"queue";e=bI._data(b6,i);if(b7){if(!e||bI.isArray(b7)){e=bI._data(b6,i,bI.makeArray(b7))}else{e.push(b7)}}return e||[]}},dequeue:function(b9,b8){b8=b8||"fx";var i=bI.queue(b9,b8),ca=i.length,b7=i.shift(),e=bI._queueHooks(b9,b8),b6=function(){bI.dequeue(b9,b8)};if(b7==="inprogress"){b7=i.shift();ca--}if(b7){if(b8==="fx"){i.unshift("inprogress")}delete e.stop;b7.call(b9,b6,e)}if(!ca&&e){e.empty.fire()}},_queueHooks:function(b6,i){var e=i+"queueHooks";return bI._data(b6,e)||bI._data(b6,e,{empty:bI.Callbacks("once memory").add(function(){bI._removeData(b6,i+"queue");bI._removeData(b6,e)})})}});bI.fn.extend({queue:function(e,i){var b6=2;if(typeof e!=="string"){i=e;e="fx";b6--}if(arguments.length
    a";D.leadingWhitespace=b8.firstChild.nodeType===3;D.tbody=!b8.getElementsByTagName("tbody").length;D.htmlSerialize=!!b8.getElementsByTagName("link").length;D.html5Clone=n.createElement("nav").cloneNode(true).outerHTML!=="<:nav>";i.type="checkbox";i.checked=true;b6.appendChild(i);D.appendChecked=i.checked;b8.innerHTML="";D.noCloneChecked=!!b8.cloneNode(true).lastChild.defaultValue;b6.appendChild(b8);b8.innerHTML="";D.checkClone=b8.cloneNode(true).cloneNode(true).lastChild.checked;D.noCloneEvent=true;if(b8.attachEvent){b8.attachEvent("onclick",function(){D.noCloneEvent=false});b8.cloneNode(true).click()}if(D.deleteExpando==null){D.deleteExpando=true;try{delete b8.test}catch(b7){D.deleteExpando=false}}})();(function(){var b6,e,b7=n.createElement("div");for(b6 in {submit:true,change:true,focusin:true}){e="on"+b6;if(!(D[b6+"Bubbles"]=e in a5)){b7.setAttribute(e,"t");D[b6+"Bubbles"]=b7.attributes[e].expando===false}}b7=null})();var bG=/^(?:input|select|textarea)$/i,a6=/^key/,bM=/^(?:mouse|pointer|contextmenu)|click/,bC=/^(?:focusinfocus|focusoutblur)$/,bx=/^([^.]*)(?:\.(.+)|)$/;function U(){return true}function Z(){return false}function am(){try{return n.activeElement}catch(e){}}bI.event={global:{},add:function(b8,cd,ci,ca,b9){var cb,cj,ck,b6,cf,cc,ch,b7,cg,e,i,ce=bI._data(b8);if(!ce){return}if(ci.handler){b6=ci;ci=b6.handler;b9=b6.selector}if(!ci.guid){ci.guid=bI.guid++}if(!(cj=ce.events)){cj=ce.events={}}if(!(cc=ce.handle)){cc=ce.handle=function(cl){return typeof bI!==aC&&(!cl||bI.event.triggered!==cl.type)?bI.event.dispatch.apply(cc.elem,arguments):undefined};cc.elem=b8}cd=(cd||"").match(aF)||[""];ck=cd.length;while(ck--){cb=bx.exec(cd[ck])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){continue}cf=bI.event.special[cg]||{};cg=(b9?cf.delegateType:cf.bindType)||cg;cf=bI.event.special[cg]||{};ch=bI.extend({type:cg,origType:i,data:ca,handler:ci,guid:ci.guid,selector:b9,needsContext:b9&&bI.expr.match.needsContext.test(b9),namespace:e.join(".")},b6);if(!(b7=cj[cg])){b7=cj[cg]=[];b7.delegateCount=0;if(!cf.setup||cf.setup.call(b8,ca,e,cc)===false){if(b8.addEventListener){b8.addEventListener(cg,cc,false)}else{if(b8.attachEvent){b8.attachEvent("on"+cg,cc)}}}}if(cf.add){cf.add.call(b8,ch);if(!ch.handler.guid){ch.handler.guid=ci.guid}}if(b9){b7.splice(b7.delegateCount++,0,ch)}else{b7.push(ch)}bI.event.global[cg]=true}b8=null},remove:function(b7,cd,ck,b8,cc){var ca,ch,cb,b9,cj,ci,cf,b6,cg,e,i,ce=bI.hasData(b7)&&bI._data(b7);if(!ce||!(ci=ce.events)){return}cd=(cd||"").match(aF)||[""];cj=cd.length;while(cj--){cb=bx.exec(cd[cj])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){for(cg in ci){bI.event.remove(b7,cg+cd[cj],ck,b8,true)}continue}cf=bI.event.special[cg]||{};cg=(b8?cf.delegateType:cf.bindType)||cg;b6=ci[cg]||[];cb=cb[2]&&new RegExp("(^|\\.)"+e.join("\\.(?:.*\\.|)")+"(\\.|$)");b9=ca=b6.length;while(ca--){ch=b6[ca];if((cc||i===ch.origType)&&(!ck||ck.guid===ch.guid)&&(!cb||cb.test(ch.namespace))&&(!b8||b8===ch.selector||b8==="**"&&ch.selector)){b6.splice(ca,1);if(ch.selector){b6.delegateCount--}if(cf.remove){cf.remove.call(b7,ch)}}}if(b9&&!b6.length){if(!cf.teardown||cf.teardown.call(b7,e,ce.handle)===false){bI.removeEvent(b7,cg,ce.handle)}delete ci[cg]}}if(bI.isEmptyObject(ci)){delete ce.handle;bI._removeData(b7,"events")}},trigger:function(b6,cd,b9,ck){var ce,b8,ci,cj,cg,cc,cb,ca=[b9||n],ch=K.call(b6,"type")?b6.type:b6,b7=K.call(b6,"namespace")?b6.namespace.split("."):[];ci=cc=b9=b9||n;if(b9.nodeType===3||b9.nodeType===8){return}if(bC.test(ch+bI.event.triggered)){return}if(ch.indexOf(".")>=0){b7=ch.split(".");ch=b7.shift();b7.sort()}b8=ch.indexOf(":")<0&&"on"+ch;b6=b6[bI.expando]?b6:new bI.Event(ch,typeof b6==="object"&&b6);b6.isTrigger=ck?2:3;b6.namespace=b7.join(".");b6.namespace_re=b6.namespace?new RegExp("(^|\\.)"+b7.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;b6.result=undefined;if(!b6.target){b6.target=b9}cd=cd==null?[b6]:bI.makeArray(cd,[b6]);cg=bI.event.special[ch]||{};if(!ck&&cg.trigger&&cg.trigger.apply(b9,cd)===false){return}if(!ck&&!cg.noBubble&&!bI.isWindow(b9)){cj=cg.delegateType||ch;if(!bC.test(cj+ch)){ci=ci.parentNode}for(;ci;ci=ci.parentNode){ca.push(ci);cc=ci}if(cc===(b9.ownerDocument||n)){ca.push(cc.defaultView||cc.parentWindow||a5)}}cb=0;while((ci=ca[cb++])&&!b6.isPropagationStopped()){b6.type=cb>1?cj:cg.bindType||ch;ce=(bI._data(ci,"events")||{})[b6.type]&&bI._data(ci,"handle");if(ce){ce.apply(ci,cd)}ce=b8&&ci[b8];if(ce&&ce.apply&&bI.acceptData(ci)){b6.result=ce.apply(ci,cd);if(b6.result===false){b6.preventDefault()}}}b6.type=ch;if(!ck&&!b6.isDefaultPrevented()){if((!cg._default||cg._default.apply(ca.pop(),cd)===false)&&bI.acceptData(b9)){if(b8&&b9[ch]&&!bI.isWindow(b9)){cc=b9[b8];if(cc){b9[b8]=null}bI.event.triggered=ch;try{b9[ch]()}catch(cf){}bI.event.triggered=undefined;if(cc){b9[b8]=cc}}}}return b6.result},dispatch:function(e){e=bI.event.fix(e);var b9,ca,ce,b6,b8,cd=[],cc=P.call(arguments),b7=(bI._data(this,"events")||{})[e.type]||[],cb=bI.event.special[e.type]||{};cc[0]=e;e.delegateTarget=this;if(cb.preDispatch&&cb.preDispatch.call(this,e)===false){return}cd=bI.event.handlers.call(this,e,b7);b9=0;while((b6=cd[b9++])&&!e.isPropagationStopped()){e.currentTarget=b6.elem;b8=0;while((ce=b6.handlers[b8++])&&!e.isImmediatePropagationStopped()){if(!e.namespace_re||e.namespace_re.test(ce.namespace)){e.handleObj=ce;e.data=ce.data;ca=((bI.event.special[ce.origType]||{}).handle||ce.handler).apply(b6.elem,cc);if(ca!==undefined){if((e.result=ca)===false){e.preventDefault();e.stopPropagation()}}}}}if(cb.postDispatch){cb.postDispatch.call(this,e)}return e.result},handlers:function(e,b7){var b6,cc,ca,b9,cb=[],b8=b7.delegateCount,cd=e.target;if(b8&&cd.nodeType&&(!e.button||e.type!=="click")){for(;cd!=this;cd=cd.parentNode||this){if(cd.nodeType===1&&(cd.disabled!==true||e.type!=="click")){ca=[];for(b9=0;b9=0:bI.find(b6,this,null,[cd]).length}if(ca[b6]){ca.push(cc)}}if(ca.length){cb.push({elem:cd,handlers:ca})}}}}if(b8]","i"),b5=/^\s+/,aH=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,o=/<([\w:]+)/,b0=/\s*$/g,W={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:D.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},aT=B(n),k=aT.appendChild(n.createElement("div"));W.optgroup=W.option;W.tbody=W.tfoot=W.colgroup=W.caption=W.thead;W.th=W.td;function l(b8,e){var b6,b9,b7=0,ca=typeof b8.getElementsByTagName!==aC?b8.getElementsByTagName(e||"*"):typeof b8.querySelectorAll!==aC?b8.querySelectorAll(e||"*"):undefined;if(!ca){for(ca=[],b6=b8.childNodes||b8;(b9=b6[b7])!=null;b7++){if(!e||bI.nodeName(b9,e)){ca.push(b9)}else{bI.merge(ca,l(b9,e))}}}return e===undefined||e&&bI.nodeName(b8,e)?bI.merge([b8],ca):ca}function bY(e){if(aM.test(e.type)){e.defaultChecked=e.checked}}function a3(i,e){return bI.nodeName(i,"table")&&bI.nodeName(e.nodeType!==11?e:e.firstChild,"tr")?i.getElementsByTagName("tbody")[0]||i.appendChild(i.ownerDocument.createElement("tbody")):i}function u(e){e.type=(bI.find.attr(e,"type")!==null)+"/"+e.type;return e}function bf(i){var e=ar.exec(i.type);if(e){i.type=e[1]}else{i.removeAttribute("type")}return i}function bu(e,b7){var b8,b6=0;for(;(b8=e[b6])!=null;b6++){bI._data(b8,"globalEval",!b7||bI._data(b7[b6],"globalEval"))}}function at(cc,b6){if(b6.nodeType!==1||!bI.hasData(cc)){return}var b9,b8,e,cb=bI._data(cc),ca=bI._data(b6,cb),b7=cb.events;if(b7){delete ca.handle;ca.events={};for(b9 in b7){for(b8=0,e=b7[b9].length;b8")){cd=b6.cloneNode(true)}else{k.innerHTML=b6.outerHTML;k.removeChild(cd=k.firstChild)}if((!D.noCloneEvent||!D.noCloneChecked)&&(b6.nodeType===1||b6.nodeType===11)&&!bI.isXMLDoc(b6)){ca=l(cd);cb=l(b6);for(b9=0;(b7=cb[b9])!=null;++b9){if(ca[b9]){T(b7,ca[b9])}}}if(b8){if(e){cb=cb||l(b6);ca=ca||l(cd);for(b9=0;(b7=cb[b9])!=null;b9++){at(b7,ca[b9])}}else{at(b6,cd)}}ca=l(cd,"script");if(ca.length>0){bu(ca,!cc&&l(b6,"script"))}ca=cb=b7=null;return cd},buildFragment:function(b6,b8,cd,ci){var ce,ca,cc,ch,cj,cg,b7,cb=b6.length,b9=B(b8),e=[],cf=0;for(;cf")+b7[2];ce=b7[0];while(ce--){ch=ch.lastChild}if(!D.leadingWhitespace&&b5.test(ca)){e.push(b8.createTextNode(b5.exec(ca)[0]))}if(!D.tbody){ca=cj==="table"&&!b0.test(ca)?ch.firstChild:b7[1]===""&&!b0.test(ca)?ch:0;ce=ca&&ca.childNodes.length;while(ce--){if(bI.nodeName((cg=ca.childNodes[ce]),"tbody")&&!cg.childNodes.length){ca.removeChild(cg)}}}bI.merge(e,ch.childNodes);ch.textContent="";while(ch.firstChild){ch.removeChild(ch.firstChild)}ch=b9.lastChild}}}}if(ch){b9.removeChild(ch)}if(!D.appendChecked){bI.grep(l(e,"input"),bY)}cf=0;while((ca=e[cf++])){if(ci&&bI.inArray(ca,ci)!==-1){continue}cc=bI.contains(ca.ownerDocument,ca);ch=l(b9.appendChild(ca),"script");if(cc){bu(ch)}if(cd){ce=0;while((ca=ch[ce++])){if(bB.test(ca.type||"")){cd.push(ca)}}}}ch=null;return b9},cleanData:function(b6,ce){var b8,cd,b7,b9,ca=0,cf=bI.expando,e=bI.cache,cb=D.deleteExpando,cc=bI.event.special;for(;(b8=b6[ca])!=null;ca++){if(ce||bI.acceptData(b8)){b7=b8[cf];b9=b7&&e[b7];if(b9){if(b9.events){for(cd in b9.events){if(cc[cd]){bI.event.remove(b8,cd)}else{bI.removeEvent(b8,cd,b9.handle)}}}if(e[b7]){delete e[b7];if(cb){delete b8[cf]}else{if(typeof b8.removeAttribute!==aC){b8.removeAttribute(cf)}else{b8[cf]=null}}aP.push(b7)}}}}}});bI.fn.extend({text:function(e){return aB(this,function(i){return i===undefined?bI.text(this):this.empty().append((this[0]&&this[0].ownerDocument||n).createTextNode(i))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.insertBefore(e,i.firstChild)}})},before:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this)}})},after:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this.nextSibling)}})},remove:function(e,b9){var b8,b6=e?bI.filter(e,this):this,b7=0;for(;(b8=b6[b7])!=null;b7++){if(!b9&&b8.nodeType===1){bI.cleanData(l(b8))}if(b8.parentNode){if(b9&&bI.contains(b8.ownerDocument,b8)){bu(l(b8,"script"))}b8.parentNode.removeChild(b8)}}return this},empty:function(){var b6,e=0;for(;(b6=this[e])!=null;e++){if(b6.nodeType===1){bI.cleanData(l(b6,false))}while(b6.firstChild){b6.removeChild(b6.firstChild)}if(b6.options&&bI.nodeName(b6,"select")){b6.options.length=0}}return this},clone:function(i,e){i=i==null?false:i;e=e==null?i:e;return this.map(function(){return bI.clone(this,i,e)})},html:function(e){return aB(this,function(b9){var b8=this[0]||{},b7=0,b6=this.length;if(b9===undefined){return b8.nodeType===1?b8.innerHTML.replace(aD,""):undefined}if(typeof b9==="string"&&!an.test(b9)&&(D.htmlSerialize||!M.test(b9))&&(D.leadingWhitespace||!b5.test(b9))&&!W[(o.exec(b9)||["",""])[1].toLowerCase()]){b9=b9.replace(aH,"<$1>");try{for(;b71&&typeof ce==="string"&&!D.checkClone&&bW.test(ce))){return this.each(function(cj){var i=cf.eq(cj);if(b6){cd[0]=ce.call(this,cj,i.html())}i.domManip(cd,ci)})}if(b8){cc=bI.buildFragment(cd,this[0].ownerDocument,false,this);cb=cc.firstChild;if(cc.childNodes.length===1){cc=cb}if(cb){b9=bI.map(l(cc,"script"),u);e=b9.length;for(;ca")).appendTo(i.documentElement);i=(aI[0].contentWindow||aI[0].contentDocument).document;i.write();i.close();e=a4(b6,i);aI.detach()}bl[b6]=e}return e}(function(){var e;D.shrinkWrapBlocks=function(){if(e!=null){return e}e=false;var b7,i,b6;i=n.getElementsByTagName("body")[0];if(!i||!i.style){return}b7=n.createElement("div");b6=n.createElement("div");b6.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";i.appendChild(b6).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1";b7.appendChild(n.createElement("div")).style.width="5px";e=b7.offsetWidth!==3}i.removeChild(b6);return e}})();var aZ=(/^margin/);var Y=new RegExp("^("+aE+")(?!px)[a-z%]+$","i");var bq,G,bo=/^(top|right|bottom|left)$/;if(a5.getComputedStyle){bq=function(e){if(e.ownerDocument.defaultView.opener){return e.ownerDocument.defaultView.getComputedStyle(e,null)}return a5.getComputedStyle(e,null)};G=function(cb,i,ca){var b8,b7,b9,e,b6=cb.style;ca=ca||bq(cb);e=ca?ca.getPropertyValue(i)||ca[i]:undefined;if(ca){if(e===""&&!bI.contains(cb.ownerDocument,cb)){e=bI.style(cb,i)}if(Y.test(e)&&aZ.test(i)){b8=b6.width;b7=b6.minWidth;b9=b6.maxWidth;b6.minWidth=b6.maxWidth=b6.width=e;e=ca.width;b6.width=b8;b6.minWidth=b7;b6.maxWidth=b9}}return e===undefined?e:e+""}}else{if(n.documentElement.currentStyle){bq=function(e){return e.currentStyle};G=function(ca,b7,b9){var cb,i,e,b6,b8=ca.style;b9=b9||bq(ca);b6=b9?b9[b7]:undefined;if(b6==null&&b8&&b8[b7]){b6=b8[b7]}if(Y.test(b6)&&!bo.test(b7)){cb=b8.left;i=ca.runtimeStyle;e=i&&i.left;if(e){i.left=ca.currentStyle.left}b8.left=b7==="fontSize"?"1em":b6;b6=b8.pixelLeft+"px";b8.left=cb;if(e){i.left=e}}return b6===undefined?b6:b6+""||"auto"}}}function a7(e,i){return{get:function(){var b6=e();if(b6==null){return}if(b6){delete this.get;return}return(this.get=i).apply(this,arguments)}}}(function(){var cb,b9,b7,ca,b6,b8,i;cb=n.createElement("div");cb.innerHTML="
    a";b7=cb.getElementsByTagName("a")[0];b9=b7&&b7.style;if(!b9){return}b9.cssText="float:left;opacity:.5";D.opacity=b9.opacity==="0.5";D.cssFloat=!!b9.cssFloat;cb.style.backgroundClip="content-box";cb.cloneNode(true).style.backgroundClip="";D.clearCloneStyle=cb.style.backgroundClip==="content-box";D.boxSizing=b9.boxSizing===""||b9.MozBoxSizing===""||b9.WebkitBoxSizing==="";bI.extend(D,{reliableHiddenOffsets:function(){if(b8==null){e()}return b8},boxSizingReliable:function(){if(b6==null){e()}return b6},pixelPosition:function(){if(ca==null){e()}return ca},reliableMarginRight:function(){if(i==null){e()}return i}});function e(){var cf,cc,cd,ce;cc=n.getElementsByTagName("body")[0];if(!cc||!cc.style){return}cf=n.createElement("div");cd=n.createElement("div");cd.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";cc.appendChild(cd).appendChild(cf);cf.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute";ca=b6=false;i=true;if(a5.getComputedStyle){ca=(a5.getComputedStyle(cf,null)||{}).top!=="1%";b6=(a5.getComputedStyle(cf,null)||{width:"4px"}).width==="4px";ce=cf.appendChild(n.createElement("div"));ce.style.cssText=cf.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0";ce.style.marginRight=ce.style.width="0";cf.style.width="1px";i=!parseFloat((a5.getComputedStyle(ce,null)||{}).marginRight);cf.removeChild(ce)}cf.innerHTML="
    t
    ";ce=cf.getElementsByTagName("td");ce[0].style.cssText="margin:0;border:0;padding:0;display:none";b8=ce[0].offsetHeight===0;if(b8){ce[0].style.display="";ce[1].style.display="none";b8=ce[0].offsetHeight===0}cc.removeChild(cd)}})();bI.swap=function(b9,b8,ca,b7){var b6,i,e={};for(i in b8){e[i]=b9.style[i];b9.style[i]=b8[i]}b6=ca.apply(b9,b7||[]);for(i in b8){b9.style[i]=e[i]}return b6};var bj=/alpha\([^)]*\)/i,aU=/opacity\s*=\s*([^)]*)/,H=/^(none|table(?!-c[ea]).+)/,bb=new RegExp("^("+aE+")(.*)$","i"),V=new RegExp("^([+-])=("+aE+")","i"),be={position:"absolute",visibility:"hidden",display:"block"},bD={letterSpacing:"0",fontWeight:"400"},aw=["Webkit","O","Moz","ms"];function c(b8,b6){if(b6 in b8){return b6}var b9=b6.charAt(0).toUpperCase()+b6.slice(1),e=b6,b7=aw.length;while(b7--){b6=aw[b7]+b9;if(b6 in b8){return b6}}return e}function s(ca,e){var cb,b8,b9,i=[],b6=0,b7=ca.length;for(;b6=1||b9==="")&&bI.trim(b6.replace(bj,""))===""&&b7.removeAttribute){b7.removeAttribute("filter");if(b9===""||i&&!i.filter){return}}b7.filter=bj.test(b6)?b6.replace(bj,e):b6+" "+e}}}bI.cssHooks.marginRight=a7(D.reliableMarginRight,function(i,e){if(e){return bI.swap(i,{display:"inline-block"},G,[i,"marginRight"])}});bI.each({margin:"",padding:"",border:"Width"},function(e,i){bI.cssHooks[e+i]={expand:function(b8){var b7=0,b6={},b9=typeof b8==="string"?b8.split(" "):[b8];for(;b7<4;b7++){b6[e+bT[b7]+i]=b9[b7]||b9[b7-2]||b9[0]}return b6}};if(!aZ.test(e)){bI.cssHooks[e+i].set=aN}});bI.fn.extend({css:function(e,i){return aB(this,function(ca,b7,cb){var b9,b6,cc={},b8=0;if(bI.isArray(b7)){b9=bq(ca);b6=b7.length;for(;b81)},show:function(){return s(this,true)},hide:function(){return s(this)},toggle:function(e){if(typeof e==="boolean"){return e?this.show():this.hide()}return this.each(function(){if(S(this)){bI(this).show()}else{bI(this).hide()}})}});function J(b6,i,b8,e,b7){return new J.prototype.init(b6,i,b8,e,b7)}bI.Tween=J;J.prototype={constructor:J,init:function(b7,i,b9,e,b8,b6){this.elem=b7;this.prop=b9;this.easing=b8||"swing";this.options=i;this.start=this.now=this.cur();this.end=e;this.unit=b6||(bI.cssNumber[b9]?"":"px")},cur:function(){var e=J.propHooks[this.prop];return e&&e.get?e.get(this):J.propHooks._default.get(this)},run:function(b6){var i,e=J.propHooks[this.prop];if(this.options.duration){this.pos=i=bI.easing[this.easing](b6,this.options.duration*b6,0,1,this.options.duration)}else{this.pos=i=b6}this.now=(this.end-this.start)*i+this.start;if(this.options.step){this.options.step.call(this.elem,this.now,this)}if(e&&e.set){e.set(this)}else{J.propHooks._default.set(this)}return this}};J.prototype.init.prototype=J.prototype;J.propHooks={_default:{get:function(i){var e;if(i.elem[i.prop]!=null&&(!i.elem.style||i.elem.style[i.prop]==null)){return i.elem[i.prop]}e=bI.css(i.elem,i.prop,"");return !e||e==="auto"?0:e},set:function(e){if(bI.fx.step[e.prop]){bI.fx.step[e.prop](e)}else{if(e.elem.style&&(e.elem.style[bI.cssProps[e.prop]]!=null||bI.cssHooks[e.prop])){bI.style(e.elem,e.prop,e.now+e.unit)}else{e.elem[e.prop]=e.now}}}}};J.propHooks.scrollTop=J.propHooks.scrollLeft={set:function(e){if(e.elem.nodeType&&e.elem.parentNode){e.elem[e.prop]=e.now}}};bI.easing={linear:function(e){return e},swing:function(e){return 0.5-Math.cos(e*Math.PI)/2}};bI.fx=J.prototype.init;bI.fx.step={};var N,ae,bR=/^(?:toggle|show|hide)$/,bJ=new RegExp("^(?:([+-])=|)("+aE+")([a-z%]*)$","i"),bP=/queueHooks$/,aG=[h],a2={"*":[function(e,ca){var cc=this.createTween(e,ca),b8=cc.cur(),b7=bJ.exec(ca),cb=b7&&b7[3]||(bI.cssNumber[e]?"":"px"),i=(bI.cssNumber[e]||cb!=="px"&&+b8)&&bJ.exec(bI.css(cc.elem,e)),b6=1,b9=20;if(i&&i[3]!==cb){cb=cb||i[3];b7=b7||[];i=+b8||1;do{b6=b6||".5";i=i/b6;bI.style(cc.elem,e,i+cb)}while(b6!==(b6=cc.cur()/b8)&&b6!==1&&--b9)}if(b7){i=cc.start=+i||+b8||0;cc.unit=cb;cc.end=b7[1]?i+(b7[1]+1)*b7[2]:+b7[2]}return cc}]};function bn(){setTimeout(function(){N=undefined});return(N=bI.now())}function bH(b7,b9){var b8,e={height:b7},b6=0;b9=b9?1:0;for(;b6<4;b6+=2-b9){b8=bT[b6];e["margin"+b8]=e["padding"+b8]=b7}if(b9){e.opacity=e.width=b7}return e}function bd(b8,ca,b7){var i,b9=(a2[ca]||[]).concat(a2["*"]),e=0,b6=b9.length;for(;e
    a";i=b8.getElementsByTagName("a")[0];e=n.createElement("select");b7=e.appendChild(n.createElement("option"));b6=b8.getElementsByTagName("input")[0];i.style.cssText="top:1px";D.getSetAttribute=b8.className!=="t";D.style=/top/.test(i.getAttribute("style"));D.hrefNormalized=i.getAttribute("href")==="/a";D.checkOn=!!b6.value;D.optSelected=b7.selected;D.enctype=!!n.createElement("form").enctype;e.disabled=true;D.optDisabled=!b7.disabled;b6=n.createElement("input");b6.setAttribute("value","");D.input=b6.getAttribute("value")==="";b6.value="t";b6.setAttribute("type","radio");D.radioValue=b6.value==="t"})();var al=/\r/g;bI.fn.extend({val:function(b7){var e,i,b8,b6=this[0];if(!arguments.length){if(b6){e=bI.valHooks[b6.type]||bI.valHooks[b6.nodeName.toLowerCase()];if(e&&"get" in e&&(i=e.get(b6,"value"))!==undefined){return i}i=b6.value;return typeof i==="string"?i.replace(al,""):i==null?"":i}return}b8=bI.isFunction(b7);return this.each(function(b9){var ca;if(this.nodeType!==1){return}if(b8){ca=b7.call(this,b9,bI(this).val())}else{ca=b7}if(ca==null){ca=""}else{if(typeof ca==="number"){ca+=""}else{if(bI.isArray(ca)){ca=bI.map(ca,function(cb){return cb==null?"":cb+""})}}}e=bI.valHooks[this.type]||bI.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,ca,"value")===undefined){this.value=ca}})}});bI.extend({valHooks:{option:{get:function(e){var i=bI.find.attr(e,"value");return i!=null?i:bI.trim(bI.text(e))}},select:{get:function(e){var cb,b7,cd=e.options,b9=e.selectedIndex,b8=e.type==="select-one"||b9<0,cc=b8?null:[],ca=b8?b9+1:cd.length,b6=b9<0?ca:b8?b9:0;for(;b6=0){try{b9.selected=cc=true}catch(b6){b9.scrollHeight}}else{b9.selected=false}}if(!cc){ca.selectedIndex=-1}return b7}}}});bI.each(["radio","checkbox"],function(){bI.valHooks[this]={set:function(e,i){if(bI.isArray(i)){return(e.checked=bI.inArray(bI(e).val(),i)>=0)}}};if(!D.checkOn){bI.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value}}});var ba,b3,bO=bI.expr.attrHandle,aq=/^(?:checked|selected)$/i,bN=D.getSetAttribute,bF=D.input;bI.fn.extend({attr:function(e,i){return aB(this,bI.attr,e,i,arguments.length>1)},removeAttr:function(e){return this.each(function(){bI.removeAttr(this,e)})}});bI.extend({attr:function(b8,b7,b9){var e,b6,i=b8.nodeType;if(!b8||i===3||i===8||i===2){return}if(typeof b8.getAttribute===aC){return bI.prop(b8,b7,b9)}if(i!==1||!bI.isXMLDoc(b8)){b7=b7.toLowerCase();e=bI.attrHooks[b7]||(bI.expr.match.bool.test(b7)?b3:ba)}if(b9!==undefined){if(b9===null){bI.removeAttr(b8,b7)}else{if(e&&"set" in e&&(b6=e.set(b8,b9,b7))!==undefined){return b6}else{b8.setAttribute(b7,b9+"");return b9}}}else{if(e&&"get" in e&&(b6=e.get(b8,b7))!==null){return b6}else{b6=bI.find.attr(b8,b7);return b6==null?undefined:b6}}},removeAttr:function(b7,b9){var e,b8,b6=0,ca=b9&&b9.match(aF);if(ca&&b7.nodeType===1){while((e=ca[b6++])){b8=bI.propFix[e]||e;if(bI.expr.match.bool.test(e)){if(bF&&bN||!aq.test(e)){b7[b8]=false}else{b7[bI.camelCase("default-"+e)]=b7[b8]=false}}else{bI.attr(b7,e,"")}b7.removeAttribute(bN?e:b8)}}},attrHooks:{type:{set:function(e,i){if(!D.radioValue&&i==="radio"&&bI.nodeName(e,"input")){var b6=e.value;e.setAttribute("type",i);if(b6){e.value=b6}return i}}}}});b3={set:function(i,b6,e){if(b6===false){bI.removeAttr(i,e)}else{if(bF&&bN||!aq.test(e)){i.setAttribute(!bN&&bI.propFix[e]||e,e)}else{i[bI.camelCase("default-"+e)]=i[e]=true}}return e}};bI.each(bI.expr.match.bool.source.match(/\w+/g),function(b7,b6){var e=bO[b6]||bI.find.attr;bO[b6]=bF&&bN||!aq.test(b6)?function(b9,b8,cb){var i,ca;if(!cb){ca=bO[b8];bO[b8]=i;i=e(b9,b8,cb)!=null?b8.toLowerCase():null;bO[b8]=ca}return i}:function(b8,i,b9){if(!b9){return b8[bI.camelCase("default-"+i)]?i.toLowerCase():null}}});if(!bF||!bN){bI.attrHooks.value={set:function(i,b6,e){if(bI.nodeName(i,"input")){i.defaultValue=b6}else{return ba&&ba.set(i,b6,e)}}}}if(!bN){ba={set:function(b6,b7,i){var e=b6.getAttributeNode(i);if(!e){b6.setAttributeNode((e=b6.ownerDocument.createAttribute(i)))}e.value=b7+="";if(i==="value"||b7===b6.getAttribute(i)){return b7}}};bO.id=bO.name=bO.coords=function(b6,i,b7){var e;if(!b7){return(e=b6.getAttributeNode(i))&&e.value!==""?e.value:null}};bI.valHooks.button={get:function(b6,i){var e=b6.getAttributeNode(i);if(e&&e.specified){return e.value}},set:ba.set};bI.attrHooks.contenteditable={set:function(i,b6,e){ba.set(i,b6===""?false:b6,e)}};bI.each(["width","height"],function(b6,e){bI.attrHooks[e]={set:function(i,b7){if(b7===""){i.setAttribute(e,"auto");return b7}}}})}if(!D.style){bI.attrHooks.style={get:function(e){return e.style.cssText||undefined},set:function(e,i){return(e.style.cssText=i+"")}}}var aJ=/^(?:input|select|textarea|button|object)$/i,F=/^(?:a|area)$/i;bI.fn.extend({prop:function(e,i){return aB(this,bI.prop,e,i,arguments.length>1)},removeProp:function(e){e=bI.propFix[e]||e;return this.each(function(){try{this[e]=undefined;delete this[e]}catch(i){}})}});bI.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(b9,b7,ca){var b6,e,b8,i=b9.nodeType;if(!b9||i===3||i===8||i===2){return}b8=i!==1||!bI.isXMLDoc(b9);if(b8){b7=bI.propFix[b7]||b7;e=bI.propHooks[b7]}if(ca!==undefined){return e&&"set" in e&&(b6=e.set(b9,ca,b7))!==undefined?b6:(b9[b7]=ca)}else{return e&&"get" in e&&(b6=e.get(b9,b7))!==null?b6:b9[b7]}},propHooks:{tabIndex:{get:function(i){var e=bI.find.attr(i,"tabindex");return e?parseInt(e,10):aJ.test(i.nodeName)||F.test(i.nodeName)&&i.href?0:-1}}}});if(!D.hrefNormalized){bI.each(["href","src"],function(b6,e){bI.propHooks[e]={get:function(i){return i.getAttribute(e,4)}}})}if(!D.optSelected){bI.propHooks.selected={get:function(i){var e=i.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}}}bI.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){bI.propFix[this.toLowerCase()]=this});if(!D.enctype){bI.propFix.enctype="encoding"}var bL=/[\t\r\n\f]/g;bI.fn.extend({addClass:function(cd){var b7,b6,ce,cb,b8,e,b9=0,ca=this.length,cc=typeof cd==="string"&&cd;if(bI.isFunction(cd)){return this.each(function(i){bI(this).addClass(cd.call(this,i,this.className))})}if(cc){b7=(cd||"").match(aF)||[];for(;b9=0){ce=ce.replace(" "+cb+" "," ")}}e=cd?bI.trim(ce):"";if(b6.className!==e){b6.className=e}}}}return this},toggleClass:function(b6,e){var i=typeof b6;if(typeof e==="boolean"&&i==="string"){return e?this.addClass(b6):this.removeClass(b6)}if(bI.isFunction(b6)){return this.each(function(b7){bI(this).toggleClass(b6.call(this,b7,this.className,e),e)})}return this.each(function(){if(i==="string"){var b9,b8=0,b7=bI(this),ca=b6.match(aF)||[];while((b9=ca[b8++])){if(b7.hasClass(b9)){b7.removeClass(b9)}else{b7.addClass(b9)}}}else{if(i===aC||i==="boolean"){if(this.className){bI._data(this,"__className__",this.className)}this.className=this.className||b6===false?"":bI._data(this,"__className__")||""}}})},hasClass:function(e){var b8=" "+e+" ",b7=0,b6=this.length;for(;b7=0){return true}}return false}});bI.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(b6,e){bI.fn[e]=function(b7,i){return arguments.length>0?this.on(e,null,b7,i):this.trigger(e)}});bI.fn.extend({hover:function(e,i){return this.mouseenter(e).mouseleave(i||e)},bind:function(e,b6,i){return this.on(e,null,b6,i)},unbind:function(e,i){return this.off(e,null,i)},delegate:function(e,i,b7,b6){return this.on(i,e,b7,b6)},undelegate:function(e,i,b6){return arguments.length===1?this.off(e,"**"):this.off(i,e||"**",b6)}});var bp=bI.now();var bQ=(/\?/);var a1=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;bI.parseJSON=function(e){if(a5.JSON&&a5.JSON.parse){return a5.JSON.parse(e+"")}var b7,b6=null,i=bI.trim(e+"");return i&&!bI.trim(i.replace(a1,function(ca,b8,b9,cb){if(b7&&b8){b6=0}if(b6===0){return ca}b7=b9||b8;b6+=!cb-!b9;return""}))?(Function("return "+i))():bI.error("Invalid JSON: "+e)};bI.parseXML=function(b7){var i,b6;if(!b7||typeof b7!=="string"){return null}try{if(a5.DOMParser){b6=new DOMParser();i=b6.parseFromString(b7,"text/xml")}else{i=new ActiveXObject("Microsoft.XMLDOM");i.async="false";i.loadXML(b7)}}catch(b8){i=undefined}if(!i||!i.documentElement||i.getElementsByTagName("parsererror").length){bI.error("Invalid XML: "+b7)}return i};var b4,aa,ap=/#.*$/,R=/([?&])_=[^&]*/,ah=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,C=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,r=/^(?:GET|HEAD)$/,aK=/^\/\//,aV=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,w={},a9={},aX="*/".concat("*");try{aa=location.href}catch(bi){aa=n.createElement("a");aa.href="";aa=aa.href}b4=aV.exec(aa.toLowerCase())||[];function bK(e){return function(b9,ca){if(typeof b9!=="string"){ca=b9;b9="*"}var b6,b7=0,b8=b9.toLowerCase().match(aF)||[];if(bI.isFunction(ca)){while((b6=b8[b7++])){if(b6.charAt(0)==="+"){b6=b6.slice(1)||"*";(e[b6]=e[b6]||[]).unshift(ca)}else{(e[b6]=e[b6]||[]).push(ca)}}}}}function p(e,b6,ca,b7){var i={},b8=(e===a9);function b9(cb){var cc;i[cb]=true;bI.each(e[cb]||[],function(ce,cd){var cf=cd(b6,ca,b7);if(typeof cf==="string"&&!b8&&!i[cf]){b6.dataTypes.unshift(cf);b9(cf);return false}else{if(b8){return !(cc=cf)}}});return cc}return b9(b6.dataTypes[0])||!i["*"]&&b9("*")}function t(b6,b7){var e,i,b8=bI.ajaxSettings.flatOptions||{};for(i in b7){if(b7[i]!==undefined){(b8[i]?b6:(e||(e={})))[i]=b7[i]}}if(e){bI.extend(true,b6,e)}return b6}function g(cc,cb,b8){var e,b7,b6,b9,i=cc.contents,ca=cc.dataTypes;while(ca[0]==="*"){ca.shift();if(b7===undefined){b7=cc.mimeType||cb.getResponseHeader("Content-Type")}}if(b7){for(b9 in i){if(i[b9]&&i[b9].test(b7)){ca.unshift(b9);break}}}if(ca[0] in b8){b6=ca[0]}else{for(b9 in b8){if(!ca[0]||cc.converters[b9+" "+ca[0]]){b6=b9;break}if(!e){e=b9}}b6=b6||e}if(b6){if(b6!==ca[0]){ca.unshift(b6)}return b8[b6]}}function ag(cg,b8,cd,b6){var i,cb,ce,b9,b7,cf={},cc=cg.dataTypes.slice();if(cc[1]){for(ce in cg.converters){cf[ce.toLowerCase()]=cg.converters[ce]}}cb=cc.shift();while(cb){if(cg.responseFields[cb]){cd[cg.responseFields[cb]]=b8}if(!b7&&b6&&cg.dataFilter){b8=cg.dataFilter(b8,cg.dataType)}b7=cb;cb=cc.shift();if(cb){if(cb==="*"){cb=b7}else{if(b7!=="*"&&b7!==cb){ce=cf[b7+" "+cb]||cf["* "+cb];if(!ce){for(i in cf){b9=i.split(" ");if(b9[1]===cb){ce=cf[b7+" "+b9[0]]||cf["* "+b9[0]];if(ce){if(ce===true){ce=cf[i]}else{if(cf[i]!==true){cb=b9[0];cc.unshift(b9[1])}}break}}}}if(ce!==true){if(ce&&cg["throws"]){b8=ce(b8)}else{try{b8=ce(b8)}catch(ca){return{state:"parsererror",error:ce?ca:"No conversion from "+b7+" to "+cb}}}}}}}}return{state:"success",data:b8}}bI.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:aa,type:"GET",isLocal:C.test(b4[1]),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":aX,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":bI.parseJSON,"text xml":bI.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(i,e){return e?t(t(i,bI.ajaxSettings),e):t(bI.ajaxSettings,i)},ajaxPrefilter:bK(w),ajaxTransport:bK(a9),ajax:function(ca,b7){if(typeof ca==="object"){b7=ca;ca=undefined}b7=b7||{};var cj,cl,cb,cq,cf,b6,cm,b8,ce=bI.ajaxSetup({},b7),cs=ce.context||ce,ch=ce.context&&(cs.nodeType||cs.jquery)?bI(cs):bI.event,cr=bI.Deferred(),co=bI.Callbacks("once memory"),cc=ce.statusCode||{},ci={},cp={},b9=0,cd="canceled",ck={readyState:0,getResponseHeader:function(i){var e;if(b9===2){if(!b8){b8={};while((e=ah.exec(cq))){b8[e[1].toLowerCase()]=e[2]}}e=b8[i.toLowerCase()]}return e==null?null:e},getAllResponseHeaders:function(){return b9===2?cq:null},setRequestHeader:function(i,ct){var e=i.toLowerCase();if(!b9){i=cp[e]=cp[e]||i;ci[i]=ct}return this},overrideMimeType:function(e){if(!b9){ce.mimeType=e}return this},statusCode:function(i){var e;if(i){if(b9<2){for(e in i){cc[e]=[cc[e],i[e]]}}else{ck.always(i[ck.status])}}return this},abort:function(i){var e=i||cd;if(cm){cm.abort(e)}cg(0,e);return this}};cr.promise(ck).complete=co.add;ck.success=ck.done;ck.error=ck.fail;ce.url=((ca||ce.url||aa)+"").replace(ap,"").replace(aK,b4[1]+"//");ce.type=b7.method||b7.type||ce.method||ce.type;ce.dataTypes=bI.trim(ce.dataType||"*").toLowerCase().match(aF)||[""];if(ce.crossDomain==null){cj=aV.exec(ce.url.toLowerCase());ce.crossDomain=!!(cj&&(cj[1]!==b4[1]||cj[2]!==b4[2]||(cj[3]||(cj[1]==="http:"?"80":"443"))!==(b4[3]||(b4[1]==="http:"?"80":"443"))))}if(ce.data&&ce.processData&&typeof ce.data!=="string"){ce.data=bI.param(ce.data,ce.traditional)}p(w,ce,b7,ck);if(b9===2){return ck}b6=bI.event&&ce.global;if(b6&&bI.active++===0){bI.event.trigger("ajaxStart")}ce.type=ce.type.toUpperCase();ce.hasContent=!r.test(ce.type);cb=ce.url;if(!ce.hasContent){if(ce.data){cb=(ce.url+=(bQ.test(cb)?"&":"?")+ce.data);delete ce.data}if(ce.cache===false){ce.url=R.test(cb)?cb.replace(R,"$1_="+bp++):cb+(bQ.test(cb)?"&":"?")+"_="+bp++}}if(ce.ifModified){if(bI.lastModified[cb]){ck.setRequestHeader("If-Modified-Since",bI.lastModified[cb])}if(bI.etag[cb]){ck.setRequestHeader("If-None-Match",bI.etag[cb])}}if(ce.data&&ce.hasContent&&ce.contentType!==false||b7.contentType){ck.setRequestHeader("Content-Type",ce.contentType)}ck.setRequestHeader("Accept",ce.dataTypes[0]&&ce.accepts[ce.dataTypes[0]]?ce.accepts[ce.dataTypes[0]]+(ce.dataTypes[0]!=="*"?", "+aX+"; q=0.01":""):ce.accepts["*"]);for(cl in ce.headers){ck.setRequestHeader(cl,ce.headers[cl])}if(ce.beforeSend&&(ce.beforeSend.call(cs,ck,ce)===false||b9===2)){return ck.abort()}cd="abort";for(cl in {success:1,error:1,complete:1}){ck[cl](ce[cl])}cm=p(a9,ce,b7,ck);if(!cm){cg(-1,"No Transport")}else{ck.readyState=1;if(b6){ch.trigger("ajaxSend",[ck,ce])}if(ce.async&&ce.timeout>0){cf=setTimeout(function(){ck.abort("timeout")},ce.timeout)}try{b9=1;cm.send(ci,cg)}catch(cn){if(b9<2){cg(-1,cn)}else{throw cn}}}function cg(cw,i,cx,cu){var e,cA,cy,cv,cz,ct=i;if(b9===2){return}b9=2;if(cf){clearTimeout(cf)}cm=undefined;cq=cu||"";ck.readyState=cw>0?4:0;e=cw>=200&&cw<300||cw===304;if(cx){cv=g(ce,ck,cx)}cv=ag(ce,cv,ck,e);if(e){if(ce.ifModified){cz=ck.getResponseHeader("Last-Modified");if(cz){bI.lastModified[cb]=cz}cz=ck.getResponseHeader("etag");if(cz){bI.etag[cb]=cz}}if(cw===204||ce.type==="HEAD"){ct="nocontent"}else{if(cw===304){ct="notmodified"}else{ct=cv.state;cA=cv.data;cy=cv.error;e=!cy}}}else{cy=ct;if(cw||!ct){ct="error";if(cw<0){cw=0}}}ck.status=cw;ck.statusText=(i||ct)+"";if(e){cr.resolveWith(cs,[cA,ct,ck])}else{cr.rejectWith(cs,[ck,ct,cy])}ck.statusCode(cc);cc=undefined;if(b6){ch.trigger(e?"ajaxSuccess":"ajaxError",[ck,ce,e?cA:cy])}co.fireWith(cs,[ck,ct]);if(b6){ch.trigger("ajaxComplete",[ck,ce]);if(!(--bI.active)){bI.event.trigger("ajaxStop")}}}return ck},getJSON:function(e,i,b6){return bI.get(e,i,b6,"json")},getScript:function(e,i){return bI.get(e,undefined,i,"script")}});bI.each(["get","post"],function(e,b6){bI[b6]=function(i,b8,b9,b7){if(bI.isFunction(b8)){b7=b7||b9;b9=b8;b8=undefined}return bI.ajax({url:i,type:b6,dataType:b7,data:b8,success:b9})}});bI._evalUrl=function(e){return bI.ajax({url:e,type:"GET",dataType:"script",async:false,global:false,"throws":true})};bI.fn.extend({wrapAll:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapAll(e.call(this,b6))})}if(this[0]){var i=bI(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){i.insertBefore(this[0])}i.map(function(){var b6=this;while(b6.firstChild&&b6.firstChild.nodeType===1){b6=b6.firstChild}return b6}).append(this)}return this},wrapInner:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapInner(e.call(this,b6))})}return this.each(function(){var i=bI(this),b6=i.contents();if(b6.length){b6.wrapAll(e)}else{i.append(e)}})},wrap:function(e){var i=bI.isFunction(e);return this.each(function(b6){bI(this).wrapAll(i?e.call(this,b6):e)})},unwrap:function(){return this.parent().each(function(){if(!bI.nodeName(this,"body")){bI(this).replaceWith(this.childNodes)}}).end()}});bI.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||(!D.reliableHiddenOffsets()&&((e.style&&e.style.display)||bI.css(e,"display"))==="none")};bI.expr.filters.visible=function(e){return !bI.expr.filters.hidden(e)};var bw=/%20/g,aS=/\[\]$/,X=/\r?\n/g,b=/^(?:submit|button|image|reset|file)$/i,au=/^(?:input|select|textarea|keygen)/i;function j(b6,b8,i,b7){var e;if(bI.isArray(b8)){bI.each(b8,function(ca,b9){if(i||aS.test(b6)){b7(b6,b9)}else{j(b6+"["+(typeof b9==="object"?ca:"")+"]",b9,i,b7)}})}else{if(!i&&bI.type(b8)==="object"){for(e in b8){j(b6+"["+e+"]",b8[e],i,b7)}}else{b7(b6,b8)}}}bI.param=function(e,b6){var b7,i=[],b8=function(b9,ca){ca=bI.isFunction(ca)?ca():(ca==null?"":ca);i[i.length]=encodeURIComponent(b9)+"="+encodeURIComponent(ca)};if(b6===undefined){b6=bI.ajaxSettings&&bI.ajaxSettings.traditional}if(bI.isArray(e)||(e.jquery&&!bI.isPlainObject(e))){bI.each(e,function(){b8(this.name,this.value)})}else{for(b7 in e){j(b7,e[b7],b6,b8)}}return i.join("&").replace(bw,"+")};bI.fn.extend({serialize:function(){return bI.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=bI.prop(this,"elements");return e?bI.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!bI(this).is(":disabled")&&au.test(this.nodeName)&&!b.test(e)&&(this.checked||!aM.test(e))}).map(function(e,b6){var b7=bI(this).val();return b7==null?null:bI.isArray(b7)?bI.map(b7,function(i){return{name:b6.name,value:i.replace(X,"\r\n")}}):{name:b6.name,value:b7.replace(X,"\r\n")}}).get()}});bI.ajaxSettings.xhr=a5.ActiveXObject!==undefined?function(){return !this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&bE()||bg()}:bE;var aA=0,aj={},ay=bI.ajaxSettings.xhr();if(a5.attachEvent){a5.attachEvent("onunload",function(){for(var e in aj){aj[e](undefined,true)}})}D.cors=!!ay&&("withCredentials" in ay);ay=D.ajax=!!ay;if(ay){bI.ajaxTransport(function(e){if(!e.crossDomain||D.cors){var i;return{send:function(b9,b6){var b7,b8=e.xhr(),ca=++aA;b8.open(e.type,e.url,e.async,e.username,e.password);if(e.xhrFields){for(b7 in e.xhrFields){b8[b7]=e.xhrFields[b7]}}if(e.mimeType&&b8.overrideMimeType){b8.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!b9["X-Requested-With"]){b9["X-Requested-With"]="XMLHttpRequest"}for(b7 in b9){if(b9[b7]!==undefined){b8.setRequestHeader(b7,b9[b7]+"")}}b8.send((e.hasContent&&e.data)||null);i=function(cd,cc){var cb,cg,ce;if(i&&(cc||b8.readyState===4)){delete aj[ca];i=undefined;b8.onreadystatechange=bI.noop;if(cc){if(b8.readyState!==4){b8.abort()}}else{ce={};cb=b8.status;if(typeof b8.responseText==="string"){ce.text=b8.responseText}try{cg=b8.statusText}catch(cf){cg=""}if(!cb&&e.isLocal&&!e.crossDomain){cb=ce.text?200:404}else{if(cb===1223){cb=204}}}}if(ce){b6(cb,cg,ce,b8.getAllResponseHeaders())}};if(!e.async){i()}else{if(b8.readyState===4){setTimeout(i)}else{b8.onreadystatechange=aj[ca]=i}}},abort:function(){if(i){i(undefined,true)}}}}})}function bE(){try{return new a5.XMLHttpRequest()}catch(i){}}function bg(){try{return new a5.ActiveXObject("Microsoft.XMLHTTP")}catch(i){}}bI.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){bI.globalEval(e);return e}}});bI.ajaxPrefilter("script",function(e){if(e.cache===undefined){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});bI.ajaxTransport("script",function(b6){if(b6.crossDomain){var e,i=n.head||bI("head")[0]||n.documentElement;return{send:function(b7,b8){e=n.createElement("script");e.async=true;if(b6.scriptCharset){e.charset=b6.scriptCharset}e.src=b6.url;e.onload=e.onreadystatechange=function(ca,b9){if(b9||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(e.parentNode){e.parentNode.removeChild(e)}e=null;if(!b9){b8(200,"success")}}};i.insertBefore(e,i.firstChild)},abort:function(){if(e){e.onload(undefined,true)}}}}});var bs=[],a8=/(=)\?(?=&|$)|\?\?/;bI.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=bs.pop()||(bI.expando+"_"+(bp++));this[e]=true;return e}});bI.ajaxPrefilter("json jsonp",function(b7,e,b8){var ca,i,b6,b9=b7.jsonp!==false&&(a8.test(b7.url)?"url":typeof b7.data==="string"&&!(b7.contentType||"").indexOf("application/x-www-form-urlencoded")&&a8.test(b7.data)&&"data");if(b9||b7.dataTypes[0]==="jsonp"){ca=b7.jsonpCallback=bI.isFunction(b7.jsonpCallback)?b7.jsonpCallback():b7.jsonpCallback;if(b9){b7[b9]=b7[b9].replace(a8,"$1"+ca)}else{if(b7.jsonp!==false){b7.url+=(bQ.test(b7.url)?"&":"?")+b7.jsonp+"="+ca}}b7.converters["script json"]=function(){if(!b6){bI.error(ca+" was not called")}return b6[0]};b7.dataTypes[0]="json";i=a5[ca];a5[ca]=function(){b6=arguments};b8.always(function(){a5[ca]=i;if(b7[ca]){b7.jsonpCallback=e.jsonpCallback;bs.push(ca)}if(b6&&bI.isFunction(i)){i(b6[0])}b6=i=undefined});return"script"}});bI.parseHTML=function(b8,b6,b7){if(!b8||typeof b8!=="string"){return null}if(typeof b6==="boolean"){b7=b6;b6=false}b6=b6||n;var i=a.exec(b8),e=!b7&&[];if(i){return[b6.createElement(i[1])]}i=bI.buildFragment([b8],b6,e);if(e&&e.length){bI(e).remove()}return bI.merge([],i.childNodes)};var b1=bI.fn.load;bI.fn.load=function(b7,ca,cb){if(typeof b7!=="string"&&b1){return b1.apply(this,arguments)}var e,b6,b8,i=this,b9=b7.indexOf(" ");if(b9>=0){e=bI.trim(b7.slice(b9,b7.length));b7=b7.slice(0,b9)}if(bI.isFunction(ca)){cb=ca;ca=undefined}else{if(ca&&typeof ca==="object"){b8="POST"}}if(i.length>0){bI.ajax({url:b7,type:b8,dataType:"html",data:ca}).done(function(cc){b6=arguments;i.html(e?bI("
    ").append(bI.parseHTML(cc)).find(e):cc)}).complete(cb&&function(cd,cc){i.each(cb,b6||[cd.responseText,cc,cd])})}return this};bI.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,b6){bI.fn[b6]=function(i){return this.on(b6,i)}});bI.expr.filters.animated=function(e){return bI.grep(bI.timers,function(i){return e===i.elem}).length};var bX=a5.document.documentElement;function br(e){return bI.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}bI.offset={setOffset:function(b7,ch,cb){var cd,ca,e,b8,b6,cf,cg,cc=bI.css(b7,"position"),b9=bI(b7),ce={};if(cc==="static"){b7.style.position="relative"}b6=b9.offset();e=bI.css(b7,"top");cf=bI.css(b7,"left");cg=(cc==="absolute"||cc==="fixed")&&bI.inArray("auto",[e,cf])>-1;if(cg){cd=b9.position();b8=cd.top;ca=cd.left}else{b8=parseFloat(e)||0;ca=parseFloat(cf)||0}if(bI.isFunction(ch)){ch=ch.call(b7,cb,b6)}if(ch.top!=null){ce.top=(ch.top-b6.top)+b8}if(ch.left!=null){ce.left=(ch.left-b6.left)+ca}if("using" in ch){ch.using.call(b7,ce)}else{b9.css(ce)}}};bI.fn.extend({offset:function(i){if(arguments.length){return i===undefined?this:this.each(function(ca){bI.offset.setOffset(this,i,ca)})}var e,b9,b7={top:0,left:0},b6=this[0],b8=b6&&b6.ownerDocument;if(!b8){return}e=b8.documentElement;if(!bI.contains(e,b6)){return b7}if(typeof b6.getBoundingClientRect!==aC){b7=b6.getBoundingClientRect()}b9=br(b8);return{top:b7.top+(b9.pageYOffset||e.scrollTop)-(e.clientTop||0),left:b7.left+(b9.pageXOffset||e.scrollLeft)-(e.clientLeft||0)}},position:function(){if(!this[0]){return}var b6,b7,e={top:0,left:0},i=this[0];if(bI.css(i,"position")==="fixed"){b7=i.getBoundingClientRect()}else{b6=this.offsetParent();b7=this.offset();if(!bI.nodeName(b6[0],"html")){e=b6.offset()}e.top+=bI.css(b6[0],"borderTopWidth",true);e.left+=bI.css(b6[0],"borderLeftWidth",true)}return{top:b7.top-e.top-bI.css(i,"marginTop",true),left:b7.left-e.left-bI.css(i,"marginLeft",true)}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||bX;while(e&&(!bI.nodeName(e,"html")&&bI.css(e,"position")==="static")){e=e.offsetParent}return e||bX})}});bI.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b6,i){var e=/Y/.test(i);bI.fn[b6]=function(b7){return aB(this,function(b8,cb,ca){var b9=br(b8);if(ca===undefined){return b9?(i in b9)?b9[i]:b9.document.documentElement[cb]:b8[cb]}if(b9){b9.scrollTo(!e?ca:bI(b9).scrollLeft(),e?ca:bI(b9).scrollTop())}else{b8[cb]=ca}},b6,b7,arguments.length,null)}});bI.each(["top","left"],function(e,b6){bI.cssHooks[b6]=a7(D.pixelPosition,function(b7,i){if(i){i=G(b7,b6);return Y.test(i)?bI(b7).position()[b6]+"px":i}})});bI.each({Height:"height",Width:"width"},function(e,i){bI.each({padding:"inner"+e,content:i,"":"outer"+e},function(b6,b7){bI.fn[b7]=function(cb,ca){var b9=arguments.length&&(b6||typeof cb!=="boolean"),b8=b6||(cb===true||ca===true?"margin":"border");return aB(this,function(cd,cc,ce){var cf;if(bI.isWindow(cd)){return cd.document.documentElement["client"+e]}if(cd.nodeType===9){cf=cd.documentElement;return Math.max(cd.body["scroll"+e],cf["scroll"+e],cd.body["offset"+e],cf["offset"+e],cf["client"+e])}return ce===undefined?bI.css(cd,cc,b8):bI.style(cd,cc,ce,b8)},i,b9?cb:undefined,b9,null)}})});bI.fn.size=function(){return this.length};bI.fn.andSelf=bI.fn.addBack;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return bI})}var bk=a5.jQuery,I=a5.$;bI.noConflict=function(e){if(a5.$===bI){a5.$=I}if(e&&a5.jQuery===bI){a5.jQuery=bk}return bI};if(typeof av===aC){a5.jQuery=a5.$=bI}return bI}));!function(a){a(function(){a.support.transition=(function(){var b=(function(){var e=document.createElement("bootstrap"),d={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in d){if(e.style[c]!==undefined){return d[c]}}}());return b&&{end:b}})()})}(window.jQuery);!function(d){var c='[data-dismiss="alert"]',b=function(e){d(e).on("click",c,this.close)};b.prototype.close=function(j){var i=d(this),g=i.attr("data-target"),h;if(!g){g=i.attr("href");g=g&&g.replace(/.*(?=#[^\s]*$)/,"")}h=d(g);j&&j.preventDefault();h.length||(h=i.hasClass("alert")?i:i.parent());h.trigger(j=d.Event("close"));if(j.isDefaultPrevented()){return}h.removeClass("in");function f(){h.trigger("closed").remove()}d.support.transition&&h.hasClass("fade")?h.on(d.support.transition.end,f):f()};var a=d.fn.alert;d.fn.alert=function(e){return this.each(function(){var g=d(this),f=g.data("alert");if(!f){g.data("alert",(f=new b(this)))}if(typeof e=="string"){f[e].call(g)}})};d.fn.alert.Constructor=b;d.fn.alert.noConflict=function(){d.fn.alert=a;return this};d(document).on("click.alert.data-api",c,b.prototype.close)}(window.jQuery);!function(c){var b=function(e,d){this.$element=c(e);this.options=c.extend({},c.fn.button.defaults,d)};b.prototype.setState=function(g){var i="disabled",e=this.$element,f=e.data(),h=e.is("input")?"val":"html";g=g+"Text";f.resetText||e.data("resetText",e[h]());e[h](f[g]||this.options[g]);setTimeout(function(){g=="loadingText"?e.addClass(i).attr(i,i):e.removeClass(i).removeAttr(i)},0)};b.prototype.toggle=function(){var d=this.$element.closest('[data-toggle="buttons-radio"]');d&&d.find(".active").removeClass("active");this.$element.toggleClass("active")};var a=c.fn.button;c.fn.button=function(d){return this.each(function(){var g=c(this),f=g.data("button"),e=typeof d=="object"&&d;if(!f){g.data("button",(f=new b(this,e)))}if(d=="toggle"){f.toggle()}else{if(d){f.setState(d)}}})};c.fn.button.defaults={loadingText:"loading..."};c.fn.button.Constructor=b;c.fn.button.noConflict=function(){c.fn.button=a;return this};c(document).on("click.button.data-api","[data-toggle^=button]",function(f){var d=c(f.target);if(!d.hasClass("btn")){d=d.closest(".btn")}d.button("toggle")})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.$indicators=this.$element.find(".carousel-indicators");this.options=d;this.options.pause=="hover"&&this.$element.on("mouseenter",b.proxy(this.pause,this)).on("mouseleave",b.proxy(this.cycle,this))};c.prototype={cycle:function(d){if(!d){this.paused=false}if(this.interval){clearInterval(this.interval)}this.options.interval&&!this.paused&&(this.interval=setInterval(b.proxy(this.next,this),this.options.interval));return this},getActiveIndex:function(){this.$active=this.$element.find(".item.active");this.$items=this.$active.parent().children();return this.$items.index(this.$active)},to:function(f){var d=this.getActiveIndex(),e=this;if(f>(this.$items.length-1)||f<0){return}if(this.sliding){return this.$element.one("slid",function(){e.to(f)})}if(d==f){return this.pause().cycle()}return this.slide(f>d?"next":"prev",b(this.$items[f]))},pause:function(d){if(!d){this.paused=true}if(this.$element.find(".next, .prev").length&&b.support.transition.end){this.$element.trigger(b.support.transition.end);this.cycle(true)}clearInterval(this.interval);this.interval=null;return this},next:function(){if(this.sliding){return}return this.slide("next")},prev:function(){if(this.sliding){return}return this.slide("prev")},slide:function(k,f){var m=this.$element.find(".item.active"),d=f||m[k](),j=this.interval,l=k=="next"?"left":"right",g=k=="next"?"first":"last",h=this,i;this.sliding=true;j&&this.pause();d=d.length?d:this.$element.find(".item")[g]();i=b.Event("slide",{relatedTarget:d[0],direction:l});if(d.hasClass("active")){return}if(this.$indicators.length){this.$indicators.find(".active").removeClass("active");this.$element.one("slid",function(){var e=b(h.$indicators.children()[h.getActiveIndex()]);e&&e.addClass("active")})}if(b.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(i);if(i.isDefaultPrevented()){return}d.addClass(k);d[0].offsetWidth;m.addClass(l);d.addClass(l);this.$element.one(b.support.transition.end,function(){d.removeClass([k,l].join(" ")).addClass("active");m.removeClass(["active",l].join(" "));h.sliding=false;setTimeout(function(){h.$element.trigger("slid")},0)})}else{this.$element.trigger(i);if(i.isDefaultPrevented()){return}m.removeClass("active");d.addClass("active");this.sliding=false;this.$element.trigger("slid")}j&&this.cycle();return this}};var a=b.fn.carousel;b.fn.carousel=function(d){return this.each(function(){var h=b(this),g=h.data("carousel"),e=b.extend({},b.fn.carousel.defaults,typeof d=="object"&&d),f=typeof d=="string"?d:e.slide;if(!g){h.data("carousel",(g=new c(this,e)))}if(typeof d=="number"){g.to(d)}else{if(f){g[f]()}else{if(e.interval){g.pause().cycle()}}}})};b.fn.carousel.defaults={interval:5000,pause:"hover"};b.fn.carousel.Constructor=c;b.fn.carousel.noConflict=function(){b.fn.carousel=a;return this};b(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(j){var i=b(this),f,d=b(i.attr("data-target")||(f=i.attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")),g=b.extend({},d.data(),i.data()),h;d.carousel(g);if(h=i.attr("data-slide-to")){d.data("carousel").pause().to(h).cycle()}j.preventDefault()})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.options=b.extend({},b.fn.collapse.defaults,d);if(this.options.parent){this.$parent=b(this.options.parent)}this.options.toggle&&this.toggle()};c.prototype={constructor:c,dimension:function(){var d=this.$element.hasClass("width");return d?"width":"height"},show:function(){var g,d,f,e;if(this.transitioning||this.$element.hasClass("in")){return}g=this.dimension();d=b.camelCase(["scroll",g].join("-"));f=this.$parent&&this.$parent.find("> .accordion-group > .in");if(f&&f.length){e=f.data("collapse");if(e&&e.transitioning){return}f.collapse("hide");e||f.data("collapse",null)}this.$element[g](0);this.transition("addClass",b.Event("show"),"shown");b.support.transition&&this.$element[g](this.$element[0][d])},hide:function(){var d;if(this.transitioning||!this.$element.hasClass("in")){return}d=this.dimension();this.reset(this.$element[d]());this.transition("removeClass",b.Event("hide"),"hidden");this.$element[d](0)},reset:function(d){var e=this.dimension();this.$element.removeClass("collapse")[e](d||"auto")[0].offsetWidth;this.$element[d!==null?"addClass":"removeClass"]("collapse");return this},transition:function(h,e,f){var g=this,d=function(){if(e.type=="show"){g.reset()}g.transitioning=0;g.$element.trigger(f)};this.$element.trigger(e);if(e.isDefaultPrevented()){return}this.transitioning=1;this.$element[h]("in");b.support.transition&&this.$element.hasClass("collapse")?this.$element.one(b.support.transition.end,d):d()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var a=b.fn.collapse;b.fn.collapse=function(d){return this.each(function(){var g=b(this),f=g.data("collapse"),e=b.extend({},b.fn.collapse.defaults,g.data(),typeof d=="object"&&d);if(!f){g.data("collapse",(f=new c(this,e)))}if(typeof d=="string"){f[d]()}})};b.fn.collapse.defaults={toggle:true};b.fn.collapse.Constructor=c;b.fn.collapse.noConflict=function(){b.fn.collapse=a;return this};b(document).on("click.collapse.data-api","[data-toggle=collapse]",function(i){var h=b(this),d,g=h.attr("data-target")||i.preventDefault()||(d=h.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=b(g).data("collapse")?"toggle":h.data();h[b(g).hasClass("in")?"addClass":"removeClass"]("collapsed");b(g).collapse(f)})}(window.jQuery);!function(f){var b="[data-toggle=dropdown]",a=function(h){var g=f(h).on("click.dropdown.data-api",this.toggle);f("html").on("click.dropdown.data-api",function(){g.parent().removeClass("open")})};a.prototype={constructor:a,toggle:function(j){var i=f(this),h,g;if(i.is(".disabled, :disabled")){return}h=e(i);g=h.hasClass("open");d();if(!g){if("ontouchstart" in document.documentElement){f(' @@ -527,15 +525,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/project-info.html b/dependency-check-core/project-info.html index 165c7006f..8efa35152 100644 --- a/dependency-check-core/project-info.html +++ b/dependency-check-core/project-info.html @@ -1,21 +1,21 @@ - + - dependency-check-core - Project Information - + dependency-check-core – Project Information + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Project Information

    +

    Project Information

    This document provides an overview of the various documents and links that are part of this project's general information. All of this content is automatically generated by Maven on behalf of the project.

    -

    Overview

    +

    Overview

    + + + - - - - + -
    Document Description
    Continuous IntegrationThis is a link to the definitions of all continuous integration processes that builds and tests code on a frequent, regular basis.
    Project Summary This document lists other related information of this project
    Project LicenseThis is a link to the definitions of project licenses.
    Mailing Lists This document provides subscription and archive information for this project's mailing lists.
    Issue TrackingThis is a link to the issue management system for this project. Issues (bugs, features, change requests) can be created and queried using this link.
    This document provides information on the issue management system used in this project.
    Project Team This document provides information on the members of this project. These are the individuals who have contributed to the project in one form or another.
    Source RepositoryThis is a link to the online source repository that can be viewed via a web browser.
    +This document lists ways to access the online source repository. + +Project License +This document lists the project license(s).
    @@ -224,15 +234,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/project-reports.html b/dependency-check-core/project-reports.html index ccaae7bbc..c661ace4a 100644 --- a/dependency-check-core/project-reports.html +++ b/dependency-check-core/project-reports.html @@ -1,21 +1,21 @@ - + - dependency-check-core - Generated Reports - + dependency-check-core – Generated Reports + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Generated Reports

    +

    Generated Reports

    This document provides an overview of the various reports that are automatically generated by Maven . Each report is briefly described below.

    -

    Overview

    +

    Overview

    + + + - - - - - - - - - - - + + @@ -271,20 +272,29 @@ + + + + + + + + + + + + - + - - - - -
    Document Description
    Dependency AnalysisDependency analysis of the project (used declared, used undeclared, unused declared)
    JavaDocs JavaDoc API documentation.
    Dependency Updates ReportProvides details of the dependencies which have updated versions available.
    Plugin Updates ReportProvides details of the plugins used by this project which have newer versions available.
    Test Source XrefHTML based, cross-reference version of Java test source code.
    Source Xref HTML based, cross-reference version of Java source code.
    Cobertura Test CoverageCobertura Test Coverage Report.
    Test Source XrefHTML based, cross-reference version of Java test source code.
    Surefire Report Report on the test results of the project.
    Failsafe Report Report on the integration test results of the project.
    Cobertura Test CoverageCobertura Test Coverage Report.
    FindBugsGenerates a source code report with the FindBugs Library.
    Tag List Report on various tags found in the code.
    Dependency Updates ReportProvides details of the dependencies which have updated versions available.
    Plugin Updates ReportProvides details of the plugins used by this project which have newer versions available.
    Checkstyle Report on coding style conventions.
    CPD ReportCPD Duplicate code detection.
    PMD ReportVerification of coding rules.
    FindBugs ReportGenerates a source code report with the FindBugs Library.
    +PMD +Verification of coding rules.
    @@ -294,15 +304,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/project-summary.html b/dependency-check-core/project-summary.html index 36b684c4e..aa37c20e4 100644 --- a/dependency-check-core/project-summary.html +++ b/dependency-check-core/project-summary.html @@ -1,21 +1,21 @@ - + - dependency-check-core - Project Summary - + dependency-check-core – Project Summary + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Project Summary

    +

    Project Summary

    -

    Project Information

    +

    Project Information

    @@ -206,7 +213,7 @@
    FieldHomepage https://github.com/jeremylong/DependencyCheck.git/dependency-check-core
    -

    Project Organization

    +

    Project Organization

    @@ -218,7 +225,7 @@
    FieldURL http://www.owasp.org
    -

    Build Information

    +

    Build Information

    @@ -231,12 +238,12 @@ - + - +
    Fielddependency-check-core
    Version1.3.0
    1.3.1
    Type jar
    JDK RevJava Version 1.6
    @@ -247,15 +254,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/source-repository.html b/dependency-check-core/source-repository.html index 4099fb31c..4c2e96116 100644 --- a/dependency-check-core/source-repository.html +++ b/dependency-check-core/source-repository.html @@ -1,21 +1,21 @@ - + - dependency-check-core - Source Repository - + dependency-check-core – Source Repository + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Overview

    -

    This project uses GIT to manage its source code. Instructions on GIT use can be found at http://git-scm.com/documentation.

    +

    Overview

    +

    This project uses Git to manage its source code. Instructions on Git use can be found at http://git-scm.com/documentation.

    -

    Web Access

    -

    The following is a link to the online source repository.

    -
    +

    Web Browser Access

    +

    The following is a link to a browsable version of the source repository:

    +
    -

    Anonymous access

    -

    The source can be checked out anonymously from GIT with this command (See http://git-scm.com/docs/git-clone):

    -
    -
    $ git clone git@github.com:jeremylong/DependencyCheck.git/dependency-check-core
    +

    Anonymous Access

    +

    The source can be checked out anonymously from Git with this command (See http://git-scm.com/docs/git-clone):

    +
    $ git clone git@github.com:jeremylong/DependencyCheck.git
    -

    Developer access

    -

    Only project developers can access the GIT tree via this method (See http://git-scm.com/docs/git-clone).

    -
    -
    $ git clone git@github.com:jeremylong/DependencyCheck.git/dependency-check-core
    +

    Developer Access

    +

    Only project developers can access the Git tree via this method (See http://git-scm.com/docs/git-clone).

    +
    $ git clone git@github.com:jeremylong/DependencyCheck.git
    -

    Access from behind a firewall

    +

    Access from Behind a Firewall

    Refer to the documentation of the SCM used for more information about access behind a firewall.

    @@ -218,15 +222,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/surefire-report.html b/dependency-check-core/surefire-report.html index 9f5b582dc..76f9c13cf 100644 --- a/dependency-check-core/surefire-report.html +++ b/dependency-check-core/surefire-report.html @@ -1,21 +1,21 @@ - + - dependency-check-core - Surefire Report - + dependency-check-core – Surefire Report + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Surefire Report

    +

    Surefire Report

    -

    Summary

    +

    Summary

    [Summary] [Package List] [Test Cases]


    @@ -268,15 +275,15 @@ function toggleDisplay(elementId) { - + - -
    Success Rate Time
    207220 0 0 597.585%54.396

    +97.727% +13.223

    Note: failures are anticipated and checked for with assertions while errors are unanticipated.


    -

    Package List

    +

    Package List

    [Summary] [Package List] [Test Cases]


    @@ -288,6 +295,14 @@ function toggleDisplay(elementId) { + + + + + + + + @@ -295,7 +310,7 @@ function toggleDisplay(elementId) { - + @@ -303,47 +318,47 @@ function toggleDisplay(elementId) { - + - - + + - - + + - - + + - + - - - + + + - - + + @@ -351,15 +366,15 @@ function toggleDisplay(elementId) { - + - - + + @@ -367,41 +382,62 @@ function toggleDisplay(elementId) { - + - - + + - - + + - - + + -
    Success Rate Time
    org.owasp.dependencycheck.data.composer4000100%0.031
    org.owasp.dependencycheck.data.cwe 1 00 100% 0
    org.owasp.dependencycheck.data.nexus 4 04 0% 0
    org.owasp.dependencycheck.data.update.nvd 13 0 0 0 100%41.271
    1.079
    org.owasp.dependencycheck.dependency 26 0 0 0 100%0.027
    0.032
    org.owasp.dependencycheck.data.central 5 0 0 0 100%0.461
    0.267
    org.owasp.dependencycheck.analyzer5968 0 0 198.305%9.28
    98.529%8.916
    org.owasp.dependencycheck.data.update 6 0 0 0 100%2.204
    1.808
    org.owasp.dependencycheck.suppression 37 00 100% 0.001
    org.owasp.dependencycheck.xml.pom 23 0 0 0 100%0
    0.001
    org.owasp.dependencycheck.data.cpe 1 00 100% 0
    org.owasp.dependencycheck.data.nuget 3 0 0 0 100%0.024
    0.032
    org.owasp.dependencycheck.utils 13 0 0 0 100%0.001
    0
    org.owasp.dependencycheck.data.nvdcve 6 0 0 0 100%0.175
    0.11
    org.owasp.dependencycheck.data.lucene 10 0 0 0 100%0.952

    +0.946

    Note: package statistics are not computed recursively, they only sum up all of its testsuites numbers.

    -

    org.owasp.dependencycheck.data.cwe

    +

    org.owasp.dependencycheck.data.composer

    + + + + + + + + + + + + + + + + + + +
    ClassTestsErrors FailuresSkippedSuccess RateTime
    ComposerLockParserTest4000100%0.031
    +
    +

    org.owasp.dependencycheck.data.cwe

    @@ -422,7 +458,7 @@ function toggleDisplay(elementId) {
    100% 0
    -

    org.owasp.dependencycheck.data.nexus

    +

    org.owasp.dependencycheck.data.nexus

    @@ -443,7 +479,7 @@ function toggleDisplay(elementId) {
    0% 0
    -

    org.owasp.dependencycheck.data.update.nvd

    +

    org.owasp.dependencycheck.data.update.nvd

    @@ -462,7 +498,7 @@ function toggleDisplay(elementId) { - + @@ -480,7 +516,7 @@ function toggleDisplay(elementId) { - + @@ -489,7 +525,7 @@ function toggleDisplay(elementId) { - + @@ -500,7 +536,7 @@ function toggleDisplay(elementId) {
    0 0 100%41.168
    0.954
    NvdCveInfoTest0 0 100%0.024
    0.031
    NvdCve_2_0_HandlerTest0 0 100%0.079
    0.094
    UpdateableNvdCveTest100% 0
    -

    org.owasp.dependencycheck.dependency

    +

    org.owasp.dependencycheck.dependency

    @@ -519,7 +555,7 @@ function toggleDisplay(elementId) { - + @@ -539,7 +575,7 @@ function toggleDisplay(elementId) {
    0 0 100%0.027
    0.032
    EvidenceTest100% 0
    -

    org.owasp.dependencycheck.data.central

    +

    org.owasp.dependencycheck.data.central

    @@ -558,9 +594,9 @@ function toggleDisplay(elementId) { -
    0 0 100%0.461
    +0.267
    -

    org.owasp.dependencycheck.analyzer

    +

    org.owasp.dependencycheck.analyzer

    @@ -579,7 +615,7 @@ function toggleDisplay(elementId) { - + @@ -588,7 +624,7 @@ function toggleDisplay(elementId) { - + @@ -597,7 +633,7 @@ function toggleDisplay(elementId) { - + @@ -606,7 +642,7 @@ function toggleDisplay(elementId) { - + @@ -615,7 +651,7 @@ function toggleDisplay(elementId) { - + @@ -624,8 +660,17 @@ function toggleDisplay(elementId) { - + + + + + + + + + + @@ -634,7 +679,7 @@ function toggleDisplay(elementId) { - + @@ -643,7 +688,7 @@ function toggleDisplay(elementId) { - + @@ -651,8 +696,8 @@ function toggleDisplay(elementId) { - - + + @@ -660,8 +705,8 @@ function toggleDisplay(elementId) { - - + + @@ -669,7 +714,16 @@ function toggleDisplay(elementId) { - + + + + + + + + + + @@ -687,7 +741,7 @@ function toggleDisplay(elementId) { - + @@ -696,7 +750,7 @@ function toggleDisplay(elementId) { - + @@ -705,9 +759,18 @@ function toggleDisplay(elementId) { + + + + + + + + +
    0 0 100%0.031
    0.015
    AbstractSuppressionAnalyzerTest0 0 100%0.516
    0.438
    AnalyzerServiceTest0 0 100%0.075
    0.063
    AssemblyAnalyzerTest0 1 80%0.766
    0.797
    AutoconfAnalyzerTest0 0 100%0.113
    0.172
    CMakeAnalyzerTest0 0 100%0.988
    1.011
    ComposerLockAnalyzerTest3000100%0.141
    DependencyBundlingAnalyzerTest 50 100% 0
    FalsePositiveAnalyzerTest 30 100% 0
    FileNameAnalyzerTest 50 0 100%0
    0.01
    HintAnalyzerTest 30 0 100%6.634
    6.05
    JarAnalyzerTest 30 0 100%0.097
    0.156
    NodePackageAnalyzerTest3000100%0
    NuspecAnalyzerTest0 0 100%0.001
    0
    PythonDistributionAnalyzerTest0 0 100%0.059
    0.063
    PythonPackageAnalyzerTest0 0 100%0
    RubyGemspecAnalyzerTest3000100% 0
    -

    org.owasp.dependencycheck.data.update

    +

    org.owasp.dependencycheck.data.update

    @@ -726,7 +789,7 @@ function toggleDisplay(elementId) { - + @@ -735,9 +798,9 @@ function toggleDisplay(elementId) { -
    0 0 100%1.659
    1.667
    EngineVersionCheckTest0 0 100%0.545
    +0.141
    -

    org.owasp.dependencycheck.suppression

    +

    org.owasp.dependencycheck.suppression

    @@ -785,7 +848,7 @@ function toggleDisplay(elementId) {
    100% 0.001
    -

    org.owasp.dependencycheck.xml.pom

    +

    org.owasp.dependencycheck.xml.pom

    @@ -804,7 +867,7 @@ function toggleDisplay(elementId) { - + @@ -815,7 +878,7 @@ function toggleDisplay(elementId) {
    0 0 100%0
    0.001
    PomUtilsTest100% 0
    -

    org.owasp.dependencycheck.data.cpe

    +

    org.owasp.dependencycheck.data.cpe

    @@ -836,7 +899,7 @@ function toggleDisplay(elementId) {
    100% 0
    -

    org.owasp.dependencycheck.data.nuget

    +

    org.owasp.dependencycheck.data.nuget

    @@ -855,9 +918,9 @@ function toggleDisplay(elementId) { -
    0 0 100%0.024
    +0.032
    -

    org.owasp.dependencycheck.utils

    +

    org.owasp.dependencycheck.utils

    @@ -903,9 +966,9 @@ function toggleDisplay(elementId) { -
    0 0 100%0.001
    +0
    -

    org.owasp.dependencycheck.data.nvdcve

    +

    org.owasp.dependencycheck.data.nvdcve

    @@ -924,9 +987,9 @@ function toggleDisplay(elementId) { -
    0 0 100%0.175
    +0.11
    -

    org.owasp.dependencycheck.data.lucene

    +

    org.owasp.dependencycheck.data.lucene

    @@ -963,7 +1026,7 @@ function toggleDisplay(elementId) { - + @@ -972,58 +1035,58 @@ function toggleDisplay(elementId) { -
    0 0 100%0.069
    0.055
    UrlTokenizingFilterTest0 0 100%0.883

    +0.891

    -

    Test Cases

    +

    Test Cases

    [Summary] [Package List] [Test Cases]

    -

    AbstractFileTypeAnalyzerTest

    +

    AbstractFileTypeAnalyzerTest

    -
    testNewHashSet0.031
    +0.015
    -

    AbstractSuppressionAnalyzerTest

    +

    AbstractSuppressionAnalyzerTest

    - + - + - + -
    testFailureToLocateSuppressionFileAnywhere0.299
    0.274
    testGetRulesFromSuppressionFileFromURL0.182
    0.133
    testGetRulesFromSuppressionFileInClasspath0.034
    0.031
    testGetSupportedExtensions0.001
    +0
    -

    AnalyzerServiceTest

    +

    AnalyzerServiceTest

    -
    testGetAnalyzers0.075
    +0.063
    -

    AssemblyAnalyzerTest

    +

    AssemblyAnalyzerTest

    - + - + + @@ -1032,40 +1095,40 @@ function toggleDisplay(elementId) { - + -
    testGetName0.322
    0.312
    testAnalysis0.139
    0.156
    testWithSettingMono - 0
    testNonexistent0.097
    0.094
    testLog4Net0.208
    +0.235
    -

    AutoconfAnalyzerTest

    +

    AutoconfAnalyzerTest

    - + - + - + - + - + -
    testAnalyzeReadableConfigureScript0.033
    0.063
    testGetName0.001
    0
    testSupportsFileExtension0.001
    0
    testAnalyzeConfigureScript0.071
    0.093
    testAnalyzeConfigureAC10.003
    0.016
    testAnalyzeConfigureAC20.004
    +0
    -

    CMakeAnalyzerTest

    +

    CMakeAnalyzerTest

    @@ -1074,21 +1137,36 @@ function toggleDisplay(elementId) { - + - + - + -
    testAnalyzeCMakeListsOpenCV0.008
    0.015
    testGetName0.002
    0
    testAnalyzeCMakeListsOpenCV3rdParty0.977
    0.996
    testAccept0.001
    +0
    -

    DependencyBundlingAnalyzerTest

    +

    ComposerLockAnalyzerTest

    + + + + + + + + + + + + +
    testGetName0
    testAnalyzePackageJson0.141
    testSupportsFiles0
    +
    +

    DependencyBundlingAnalyzerTest

    @@ -1111,7 +1189,7 @@ function toggleDisplay(elementId) {
    testIsCore 0
    -

    FalsePositiveAnalyzerTest

    +

    FalsePositiveAnalyzerTest

    @@ -1126,12 +1204,12 @@ function toggleDisplay(elementId) {
    testGetName 0
    -

    FileNameAnalyzerTest

    +

    FileNameAnalyzerTest

    - + @@ -1139,7 +1217,7 @@ function toggleDisplay(elementId) { - + @@ -1149,27 +1227,27 @@ function toggleDisplay(elementId) {
    testAnalyze0
    0.009
    testClose
    testGetAnalysisPhase0
    0.001
    testGetNametestInitialize 0
    -

    HintAnalyzerTest

    +

    HintAnalyzerTest

    - + - + -
    testAnalyze6.632
    6.05
    testGetAnalysisPhase0.001
    0
    testGetName0.001
    +0
    -

    JarAnalyzerTest

    +

    JarAnalyzerTest

    - + @@ -1179,7 +1257,22 @@ function toggleDisplay(elementId) {
    testAnalyze0.097
    0.156
    testGetNametestAcceptSupportedExtensions 0
    -

    NuspecAnalyzerTest

    +

    NodePackageAnalyzerTest

    + + + + + + + + + + + + +
    testGetName0
    testAnalyzePackageJson0
    testSupportsFiles0
    +
    +

    NuspecAnalyzerTest

    @@ -1194,7 +1287,7 @@ function toggleDisplay(elementId) {
    testGetAnalyzerName 0
    -

    OpenSSLAnalyzerTest

    +

    OpenSSLAnalyzerTest

    @@ -1211,44 +1304,44 @@ function toggleDisplay(elementId) { -
    testAccept0.001
    +0
    -

    PythonDistributionAnalyzerTest

    +

    PythonDistributionAnalyzerTest

    - - - - - - - - + + + + + + + + - + - + - + - + -
    testAnalyzeEggFolder0.002
    testGetName0.003
    testAnalyzeEggArchive 0.016
    testGetName0
    testAnalyzeEggArchive0
    testAnalyzeEggArchiveNamedZip0.012
    0.016
    testAnalyzeWheel0.014
    0.015
    testAnalyzeEggInfoFolder0.005
    0
    testAnalyzeSitePackage0.005
    0
    testSupportsFiles0.002
    +0.016
    -

    PythonPackageAnalyzerTest

    +

    PythonPackageAnalyzerTest

    @@ -1263,12 +1356,27 @@ function toggleDisplay(elementId) {
    testSupportsFileExtension 0
    -

    CentralSearchTest

    +

    RubyGemspecAnalyzerTest

    + + + + + + + + + + + + +
    testGetName0
    testAnalyzePackageJson0
    testSupportsFiles0
    +
    +

    CentralSearchTest

    - + @@ -1276,38 +1384,57 @@ function toggleDisplay(elementId) { - + - + -
    testMultipleReturns0.292
    0.189
    testNullSha1
    testMalformedSha10.001
    0
    testValidSha10.095
    0.046
    testMissingSha10.073
    +0.032
    -

    IndexEntryTest

    +

    ComposerLockParserTest

    + + + + + + + + + + + + + + + + +
    testNotPackagesArray0
    testValidComposerLock0.015
    testNotComposer0
    testNotJSON0.016
    +
    +

    IndexEntryTest

    testSetName 0
    -

    CweDBTest

    +

    CweDBTest

    testGetCweName 0
    -

    FieldAnalyzerTest

    +

    FieldAnalyzerTest

    testAnalyzers 0
    -

    LuceneUtilsTest

    +

    LuceneUtilsTest

    @@ -1326,38 +1453,38 @@ function toggleDisplay(elementId) {
    testAppendEscapedLuceneQuery_null 0
    -

    TokenPairConcatenatingFilterTest

    +

    TokenPairConcatenatingFilterTest

    - + -
    testExamples0.059
    0.048
    testClear0.01
    +0.007
    -

    UrlTokenizingFilterTest

    +

    UrlTokenizingFilterTest

    - + - + -
    testEmptyTerm0.014
    0
    testExamples0.051
    0.047
    testRandomStrings0.818
    +0.844
    -

    NexusSearchTest

    +

    NexusSearchTest

    + @@ -1366,7 +1493,7 @@ function toggleDisplay(elementId) { + @@ -1375,7 +1502,7 @@ function toggleDisplay(elementId) { + @@ -1384,29 +1511,29 @@ function toggleDisplay(elementId) { +
    testNullSha1 - 0
    testMalformedSha1 - 0
    testValidSha1 - 0
    testMissingSha1 - 0
    skipped
    -

    XPathNuspecParserTest

    +

    XPathNuspecParserTest

    - + - + -
    testGoodDocument0.003
    0.016
    testMissingDocument0.014
    0
    testNotNuspec0.007
    +0.016
    -

    DriverLoaderTest

    +

    DriverLoaderTest

    @@ -1427,13 +1554,13 @@ function toggleDisplay(elementId) { - + -
    testLoad_String_String0.027
    0.032
    testLoad_String_String_multiple_paths0.148
    +0.078
    -

    BaseUpdaterTest

    +

    BaseUpdaterTest

    @@ -1442,35 +1569,35 @@ function toggleDisplay(elementId) { - + - +
    testOpenDataStores0.588
    0.57
    testGetProperties0.539
    0.565
    testCloseDataStores 0.532
    -

    EngineVersionCheckTest

    +

    EngineVersionCheckTest

    - + -
    testShouldUpdate0.458
    0.125
    testGetCurrentReleaseVersion0.087
    +0.016
    -

    DownloadTaskTest

    +

    DownloadTaskTest

    -
    testCall41.168
    +0.954
    -

    NvdCveInfoTest

    +

    NvdCveInfoTest

    @@ -1493,21 +1620,21 @@ function toggleDisplay(elementId) {
    testSetGetId 0
    -

    NvdCve_1_2_HandlerTest

    +

    NvdCve_1_2_HandlerTest

    -
    testParse0.024
    +0.031
    -

    NvdCve_2_0_HandlerTest

    +

    NvdCve_2_0_HandlerTest

    -
    testParse0.079
    +0.094
    -

    UpdateableNvdCveTest

    +

    UpdateableNvdCveTest

    @@ -1530,7 +1657,7 @@ function toggleDisplay(elementId) {
    testIterator 0
    -

    DependencyTest

    +

    DependencyTest

    @@ -1539,11 +1666,11 @@ function toggleDisplay(elementId) { - + - + @@ -1551,11 +1678,11 @@ function toggleDisplay(elementId) { - + - + @@ -1583,7 +1710,7 @@ function toggleDisplay(elementId) { - + @@ -1595,7 +1722,7 @@ function toggleDisplay(elementId) { - + @@ -1611,9 +1738,9 @@ function toggleDisplay(elementId) { -
    testGetSha1sum0.009
    0.016
    testGetProductEvidence0.001
    0
    testGetActualFilePath
    testAddAsEvidence0.001
    0
    testAddAsEvidenceWithEmptyArtefact0.001
    0
    testGetIdentifiers
    testGetFileName0.001
    0
    testGetFilePath
    testGetMd5sum0.013
    0.016
    testGetEvidence
    testSetActualFilePath0.001
    +0
    -

    EvidenceTest

    +

    EvidenceTest

    @@ -1628,7 +1755,7 @@ function toggleDisplay(elementId) {
    testEquals 0
    -

    VulnerableSoftwareTest

    +

    VulnerableSoftwareTest

    @@ -1643,7 +1770,7 @@ function toggleDisplay(elementId) {
    testEquals 0
    -

    PropertyTypeTest

    +

    PropertyTypeTest

    @@ -1662,21 +1789,21 @@ function toggleDisplay(elementId) {
    testIsCaseSensitive 0
    -

    SuppressionHandlerTest

    +

    SuppressionHandlerTest

    testHandler 0
    -

    SuppressionParserTest

    +

    SuppressionParserTest

    testParseSuppressionRules 0
    -

    SuppressionRuleTest

    +

    SuppressionRuleTest

    @@ -1769,7 +1896,7 @@ function toggleDisplay(elementId) { - + @@ -1777,7 +1904,7 @@ function toggleDisplay(elementId) { - + @@ -1803,14 +1930,14 @@ function toggleDisplay(elementId) {
    testHasCpe0.001
    0
    testHasCve
    testHasCwe0
    0.001
    testSetCvssBelowtestCountCharacter 0
    -

    DateUtilTest

    +

    DateUtilTest

    testWithinDateRange 0
    -

    DependencyVersionTest

    +

    DependencyVersionTest

    @@ -1849,25 +1976,25 @@ function toggleDisplay(elementId) {
    testIterator 0
    -

    DependencyVersionUtilTest

    +

    DependencyVersionUtilTest

    testParseVersion 0
    -

    FilterTest

    +

    FilterTest

    - +
    testFilter_Iterable0.001
    0
    testPasses 0
    -

    ModelTest

    +

    ModelTest

    @@ -1940,7 +2067,7 @@ function toggleDisplay(elementId) { - + @@ -1958,14 +2085,14 @@ function toggleDisplay(elementId) {
    testSetParentGroupId0
    0.001
    testSetParentVersiontestGetArtifactId 0
    -

    PomUtilsTest

    +

    PomUtilsTest

    testReadPom_File 0

    -

    Failure Details

    +

    Failure Details

    [Summary] [Package List] [Test Cases]


    @@ -2007,15 +2134,14 @@ function toggleDisplay(elementId) {
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/taglist.html b/dependency-check-core/taglist.html index 4563e5357..8c9299a39 100644 --- a/dependency-check-core/taglist.html +++ b/dependency-check-core/taglist.html @@ -1,21 +1,21 @@ - + - dependency-check-core - Tag List report - + dependency-check-core – Tag List report + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Tag List Report

    +

    Tag List Report

    The following document contains the listing of user tags found in the code. Below is the summary of the occurrences per tag.

    @@ -247,40 +254,40 @@ - +
    Tag strings used by tag class
    Todo Work2021 todo, FIXME

    Each tag is detailed below:

    -

    Todo Work

    -

    Number of occurrences found in the code: 20

    +

    Todo Work

    +

    Number of occurrences found in the code: 21

    - + - + - + - + - + - + @@ -292,25 +299,25 @@ - + - + - + - + - + - + @@ -322,7 +329,7 @@ - + @@ -334,13 +341,19 @@ - + - + + + + + + + @@ -359,15 +372,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/team-list.html b/dependency-check-core/team-list.html index fad3e9b7c..8213a9848 100644 --- a/dependency-check-core/team-list.html +++ b/dependency-check-core/team-list.html @@ -1,21 +1,21 @@ - + - dependency-check-core - Team list - + dependency-check-core – Project Team + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -63,13 +63,13 @@ dependency-check/ -
  • Team list
  • +
  • Project Team
  • -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    The Team

    +

    The Team

    A successful project requires many people to play many roles. Some members write code or documentation, while others are valuable as testers, submitting patches and suggestions.

    The team is comprised of Members and Contributors. Members have direct access to the source of a project and actively evolve the code-base. Contributors improve the project through submission of patches and suggestions to the Members. The number of Contributors to the project is unbounded. Get involved today. All contributions to the project are greatly appreciated.

    -

    Members

    +

    Members

    The following is a list of developers with commit privileges that have directly contributed to the project in one way or another.

    org.owasp.dependencycheck.analyzer.ArchiveAnalyzer Line
    - can we get more evidence from the parent? EAR contains module name, etc. analyze the dependency (i.e. extract files) if it is a supported type.238
    232
    org.owasp.dependencycheck.analyzer.CMakeAnalyzer Line
    - refactor so we do not assign to the parameter (checkstyle)193
    192
    org.owasp.dependencycheck.analyzer.CPEAnalyzer Line
    test dojo-war against this. we shold get dojo-toolkit:dojo-toolkit AND dojo-toolkit:toolkit179
    180
    - does this nullify some of the fuzzy matching that happens in the lucene search? for instance CPE some-component and in the evidence we have SomeComponent.409
    410
    - likely need to change the split... not sure if this will work for CPE with special chars427
    428
    the following isn't quite right is it? need to think about this guessing game a bit more.531
    532
    org.owasp.dependencycheck.analyzer.DependencyBundlingAnalyzerTest Line
    Line
    fix the version problem below174
    175
    - can we utilize the pom's groupid and artifactId to filter??? most of these are due to low quality data. Other idea would be to say any CPE found based on LOW confidence evidence should have a different CPE type? (this might be a better solution then just removing the URL for "best-guess" matches).275
    276
    move this startsWith expression to the base suppression file284
    285
    move this to the hint analyzer381
    382
    org.owasp.dependencycheck.analyzer.JarAnalyzer Line
    remove weighting604
    593
    change this to a regex?728
    717
    org.owasp.dependencycheck.data.nvdcve.ConnectionFactory Line
    Line
    - move this to a util class as it is duplicative of (copy of) code in the DownloadTask155
    157
    org.owasp.dependencycheck.data.update.NvdCveUpdaterIntegrationTest Line
    Line
    consider changing the regex to only compare alpha-numeric (i.e. strip everything else)238
    248
    org.owasp.dependencycheck.utils.DependencyVersion Line
    steal better version of code from compareTo137
    138
    org.owasp.dependencycheck.utils.DependencyVersionTestLine
    (code review): should this be here/do something? assertEquals("0", parts.get(2));53
    org.owasp.dependencycheck.xml.pom.PomHandler Line
    @@ -232,7 +239,7 @@
    https://www.ida.org/ developer
    -

    Contributors

    +

    Contributors

    The following additional people have contributed to this project through the way of suggestions, patches or documentation.

    @@ -244,22 +251,7 @@ -
    Hugo Costa OWASP https://www.owasp.org/logo design
    +logo design @@ -269,15 +261,14 @@ window.onLoad = init();
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-core/xref-test/allclasses-frame.html b/dependency-check-core/xref-test/allclasses-frame.html index 3f77682ce..118666280 100644 --- a/dependency-check-core/xref-test/allclasses-frame.html +++ b/dependency-check-core/xref-test/allclasses-frame.html @@ -55,6 +55,12 @@
  • CentralSearchTest +
  • +
  • + ComposerLockAnalyzerTest +
  • +
  • + ComposerLockParserTest
  • CpeUpdaterIntegrationTest @@ -133,6 +139,9 @@
  • NexusSearchTest +
  • +
  • + NodePackageAnalyzerTest
  • NuspecAnalyzerTest @@ -166,6 +175,9 @@
  • ReportGeneratorIntegrationTest +
  • +
  • + RubyGemspecAnalyzerTest
  • SuppressionHandlerTest diff --git a/dependency-check-core/xref-test/index.html b/dependency-check-core/xref-test/index.html index a5edb35ba..a9688a502 100644 --- a/dependency-check-core/xref-test/index.html +++ b/dependency-check-core/xref-test/index.html @@ -4,7 +4,7 @@ - Dependency-Check Core 1.3.0 Reference + Dependency-Check Core 1.3.1 Reference diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/ArchiveAnalyzerIntegrationTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/ArchiveAnalyzerIntegrationTest.html index 6b84ed976..212f17b0a 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/ArchiveAnalyzerIntegrationTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/ArchiveAnalyzerIntegrationTest.html @@ -59,235 +59,265 @@ 51 expResult.add("tar"); 52 expResult.add("gz"); 53 expResult.add("tgz"); -54 for (String ext : expResult) { -55 assertTrue(ext, instance.accept(new File("test." + ext))); -56 } -57 } -58 -59 /** -60 * Test of getName method, of class ArchiveAnalyzer. -61 */ -62 @Test -63 public void testGetName() { -64 ArchiveAnalyzer instance = new ArchiveAnalyzer(); -65 String expResult = "Archive Analyzer"; -66 String result = instance.getName(); -67 assertEquals(expResult, result); -68 } -69 -70 /** -71 * Test of supportsExtension method, of class ArchiveAnalyzer. -72 */ -73 @Test -74 public void testSupportsExtension() { -75 String extension = "test.7z"; //not supported -76 ArchiveAnalyzer instance = new ArchiveAnalyzer(); -77 assertFalse(extension, instance.accept(new File(extension))); -78 } -79 -80 /** -81 * Test of getAnalysisPhase method, of class ArchiveAnalyzer. -82 */ -83 @Test -84 public void testGetAnalysisPhase() { -85 ArchiveAnalyzer instance = new ArchiveAnalyzer(); -86 AnalysisPhase expResult = AnalysisPhase.INITIAL; -87 AnalysisPhase result = instance.getAnalysisPhase(); -88 assertEquals(expResult, result); -89 } -90 -91 /** -92 * Test of initialize and close methods, of class ArchiveAnalyzer. -93 */ -94 @Test -95 public void testInitialize() throws Exception { -96 ArchiveAnalyzer instance = new ArchiveAnalyzer(); -97 instance.setEnabled(true); -98 instance.setFilesMatched(true); -99 instance.initialize(); -100 -101 instance.close(); +54 expResult.add("bz2"); +55 expResult.add("tbz2"); +56 for (String ext : expResult) { +57 assertTrue(ext, instance.accept(new File("test." + ext))); +58 } +59 } +60 +61 /** +62 * Test of getName method, of class ArchiveAnalyzer. +63 */ +64 @Test +65 public void testGetName() { +66 ArchiveAnalyzer instance = new ArchiveAnalyzer(); +67 String expResult = "Archive Analyzer"; +68 String result = instance.getName(); +69 assertEquals(expResult, result); +70 } +71 +72 /** +73 * Test of supportsExtension method, of class ArchiveAnalyzer. +74 */ +75 @Test +76 public void testSupportsExtension() { +77 String extension = "test.7z"; //not supported +78 ArchiveAnalyzer instance = new ArchiveAnalyzer(); +79 assertFalse(extension, instance.accept(new File(extension))); +80 } +81 +82 /** +83 * Test of getAnalysisPhase method, of class ArchiveAnalyzer. +84 */ +85 @Test +86 public void testGetAnalysisPhase() { +87 ArchiveAnalyzer instance = new ArchiveAnalyzer(); +88 AnalysisPhase expResult = AnalysisPhase.INITIAL; +89 AnalysisPhase result = instance.getAnalysisPhase(); +90 assertEquals(expResult, result); +91 } +92 +93 /** +94 * Test of initialize and close methods, of class ArchiveAnalyzer. +95 */ +96 @Test +97 public void testInitialize() throws Exception { +98 ArchiveAnalyzer instance = new ArchiveAnalyzer(); +99 instance.setEnabled(true); +100 instance.setFilesMatched(true); +101 instance.initialize(); 102 -103 //no exception means things worked. -104 } -105 -106 /** -107 * Test of analyze method, of class ArchiveAnalyzer. -108 */ -109 @Test -110 public void testAnalyze() throws Exception { -111 ArchiveAnalyzer instance = new ArchiveAnalyzer(); -112 //trick the analyzer into thinking it is active. -113 instance.accept(new File("test.ear")); -114 try { -115 instance.initialize(); -116 File file = BaseTest.getResourceAsFile(this, "daytrader-ear-2.1.7.ear"); -117 //File file = new File(this.getClass().getClassLoader().getResource("daytrader-ear-2.1.7.ear").getPath()); -118 Dependency dependency = new Dependency(file); -119 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); -120 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); -121 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); -122 Engine engine = new Engine(); -123 -124 int initial_size = engine.getDependencies().size(); -125 instance.analyze(dependency, engine); -126 int ending_size = engine.getDependencies().size(); -127 -128 engine.cleanup(); +103 instance.close(); +104 +105 //no exception means things worked. +106 } +107 +108 /** +109 * Test of analyze method, of class ArchiveAnalyzer. +110 */ +111 @Test +112 public void testAnalyze() throws Exception { +113 ArchiveAnalyzer instance = new ArchiveAnalyzer(); +114 //trick the analyzer into thinking it is active. +115 instance.accept(new File("test.ear")); +116 try { +117 instance.initialize(); +118 File file = BaseTest.getResourceAsFile(this, "daytrader-ear-2.1.7.ear"); +119 //File file = new File(this.getClass().getClassLoader().getResource("daytrader-ear-2.1.7.ear").getPath()); +120 Dependency dependency = new Dependency(file); +121 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); +122 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); +123 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); +124 Engine engine = new Engine(); +125 +126 int initial_size = engine.getDependencies().size(); +127 instance.analyze(dependency, engine); +128 int ending_size = engine.getDependencies().size(); 129 -130 assertTrue(initial_size < ending_size); +130 engine.cleanup(); 131 -132 } finally { -133 instance.close(); -134 } -135 } -136 -137 /** -138 * Test of analyze method, of class ArchiveAnalyzer. -139 */ -140 @Test -141 public void testAnalyzeTar() throws Exception { -142 ArchiveAnalyzer instance = new ArchiveAnalyzer(); -143 //trick the analyzer into thinking it is active so that it will initialize -144 instance.accept(new File("test.tar")); -145 try { -146 instance.initialize(); -147 -148 //File file = new File(this.getClass().getClassLoader().getResource("file.tar").getPath()); -149 //File file = new File(this.getClass().getClassLoader().getResource("stagedhttp-modified.tar").getPath()); -150 File file = BaseTest.getResourceAsFile(this, "stagedhttp-modified.tar"); -151 Dependency dependency = new Dependency(file); -152 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); -153 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); -154 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); -155 Engine engine = new Engine(); -156 -157 int initial_size = engine.getDependencies().size(); -158 instance.analyze(dependency, engine); -159 int ending_size = engine.getDependencies().size(); -160 engine.cleanup(); -161 -162 assertTrue(initial_size < ending_size); +132 assertTrue(initial_size < ending_size); +133 +134 } finally { +135 instance.close(); +136 } +137 } +138 +139 /** +140 * Test of analyze method, of class ArchiveAnalyzer. +141 */ +142 @Test +143 public void testAnalyzeTar() throws Exception { +144 ArchiveAnalyzer instance = new ArchiveAnalyzer(); +145 //trick the analyzer into thinking it is active so that it will initialize +146 instance.accept(new File("test.tar")); +147 try { +148 instance.initialize(); +149 +150 //File file = new File(this.getClass().getClassLoader().getResource("file.tar").getPath()); +151 //File file = new File(this.getClass().getClassLoader().getResource("stagedhttp-modified.tar").getPath()); +152 File file = BaseTest.getResourceAsFile(this, "stagedhttp-modified.tar"); +153 Dependency dependency = new Dependency(file); +154 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); +155 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); +156 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); +157 Engine engine = new Engine(); +158 +159 int initial_size = engine.getDependencies().size(); +160 instance.analyze(dependency, engine); +161 int ending_size = engine.getDependencies().size(); +162 engine.cleanup(); 163 -164 } finally { -165 instance.close(); -166 } -167 } -168 -169 /** -170 * Test of analyze method, of class ArchiveAnalyzer. -171 */ -172 @Test -173 public void testAnalyzeTarGz() throws Exception { -174 ArchiveAnalyzer instance = new ArchiveAnalyzer(); -175 instance.accept(new File("zip")); //ensure analyzer is "enabled" -176 try { -177 instance.initialize(); -178 -179 //File file = new File(this.getClass().getClassLoader().getResource("file.tar.gz").getPath()); -180 File file = BaseTest.getResourceAsFile(this, "file.tar.gz"); -181 //Dependency dependency = new Dependency(file); -182 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); -183 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); -184 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); -185 Engine engine = new Engine(); -186 -187 int initial_size = engine.getDependencies().size(); -188 //instance.analyze(dependency, engine); -189 engine.scan(file); -190 engine.analyzeDependencies(); -191 int ending_size = engine.getDependencies().size(); -192 engine.cleanup(); -193 assertTrue(initial_size < ending_size); -194 -195 } finally { -196 instance.close(); -197 } -198 } -199 -200 // /** -201 // * Test of analyze method, of class ArchiveAnalyzer. -202 // */ -203 // @Test -204 // public void testNestedZipFolder() throws Exception { -205 // ArchiveAnalyzer instance = new ArchiveAnalyzer(); -206 // try { -207 // instance.initialize(); -208 // -209 // File file = new File(this.getClass().getClassLoader().getResource("nested.zip").getPath()); -210 // Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); -211 // Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); -212 // Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); -213 // Engine engine = new Engine(); -214 // -215 // engine.scan(file); -216 // engine.analyzeDependencies(); -217 // -218 // } finally { -219 // instance.close(); -220 // } -221 // } -222 /** -223 * Test of analyze method, of class ArchiveAnalyzer. -224 */ -225 @Test -226 public void testAnalyzeTgz() throws Exception { -227 ArchiveAnalyzer instance = new ArchiveAnalyzer(); -228 instance.accept(new File("zip")); //ensure analyzer is "enabled" -229 try { -230 instance.initialize(); -231 -232 //File file = new File(this.getClass().getClassLoader().getResource("file.tgz").getPath()); -233 File file = BaseTest.getResourceAsFile(this, "file.tgz"); -234 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); -235 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); -236 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); -237 Engine engine = new Engine(); -238 -239 int initial_size = engine.getDependencies().size(); -240 engine.scan(file); -241 engine.analyzeDependencies(); -242 int ending_size = engine.getDependencies().size(); -243 engine.cleanup(); -244 assertTrue(initial_size < ending_size); -245 -246 } finally { -247 instance.close(); -248 } -249 } +164 assertTrue(initial_size < ending_size); +165 +166 } finally { +167 instance.close(); +168 } +169 } +170 +171 /** +172 * Test of analyze method, of class ArchiveAnalyzer. +173 */ +174 @Test +175 public void testAnalyzeTarGz() throws Exception { +176 ArchiveAnalyzer instance = new ArchiveAnalyzer(); +177 instance.accept(new File("zip")); //ensure analyzer is "enabled" +178 try { +179 instance.initialize(); +180 +181 //File file = new File(this.getClass().getClassLoader().getResource("file.tar.gz").getPath()); +182 File file = BaseTest.getResourceAsFile(this, "file.tar.gz"); +183 //Dependency dependency = new Dependency(file); +184 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); +185 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); +186 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); +187 Engine engine = new Engine(); +188 +189 int initial_size = engine.getDependencies().size(); +190 //instance.analyze(dependency, engine); +191 engine.scan(file); +192 engine.analyzeDependencies(); +193 int ending_size = engine.getDependencies().size(); +194 engine.cleanup(); +195 assertTrue(initial_size < ending_size); +196 +197 } finally { +198 instance.close(); +199 } +200 } +201 +202 /** +203 * Test of analyze method, of class ArchiveAnalyzer. +204 */ +205 @Test +206 public void testAnalyzeTarBz2() throws Exception { +207 ArchiveAnalyzer instance = new ArchiveAnalyzer(); +208 instance.accept(new File("zip")); //ensure analyzer is "enabled" +209 try { +210 instance.initialize(); +211 File file = BaseTest.getResourceAsFile(this, "file.tar.bz2"); +212 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); +213 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); +214 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); +215 Engine engine = new Engine(); +216 int initial_size = engine.getDependencies().size(); +217 engine.scan(file); +218 engine.analyzeDependencies(); +219 int ending_size = engine.getDependencies().size(); +220 engine.cleanup(); +221 assertTrue(initial_size < ending_size); +222 } finally { +223 instance.close(); +224 } +225 } +226 +227 /** +228 * Test of analyze method, of class ArchiveAnalyzer. +229 */ +230 @Test +231 public void testAnalyzeTgz() throws Exception { +232 ArchiveAnalyzer instance = new ArchiveAnalyzer(); +233 instance.accept(new File("zip")); //ensure analyzer is "enabled" +234 try { +235 instance.initialize(); +236 +237 //File file = new File(this.getClass().getClassLoader().getResource("file.tgz").getPath()); +238 File file = BaseTest.getResourceAsFile(this, "file.tgz"); +239 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); +240 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); +241 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); +242 Engine engine = new Engine(); +243 +244 int initial_size = engine.getDependencies().size(); +245 engine.scan(file); +246 engine.analyzeDependencies(); +247 int ending_size = engine.getDependencies().size(); +248 engine.cleanup(); +249 assertTrue(initial_size < ending_size); 250 -251 /** -252 * Test of analyze method, of class ArchiveAnalyzer. -253 */ -254 @Test -255 public void testAnalyze_badZip() throws Exception { -256 ArchiveAnalyzer instance = new ArchiveAnalyzer(); -257 try { -258 instance.initialize(); -259 -260 //File file = new File(this.getClass().getClassLoader().getResource("test.zip").getPath()); -261 File file = BaseTest.getResourceAsFile(this, "test.zip"); -262 Dependency dependency = new Dependency(file); -263 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); -264 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); -265 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); -266 Engine engine = new Engine(); -267 int initial_size = engine.getDependencies().size(); -268 // boolean failed = false; -269 // try { -270 instance.analyze(dependency, engine); -271 // } catch (java.lang.UnsupportedClassVersionError ex) { -272 // failed = true; -273 // } -274 // assertTrue(failed); -275 int ending_size = engine.getDependencies().size(); -276 engine.cleanup(); -277 assertEquals(initial_size, ending_size); -278 } finally { -279 instance.close(); -280 } -281 } -282 } +251 } finally { +252 instance.close(); +253 } +254 } +255 +256 /** +257 * Test of analyze method, of class ArchiveAnalyzer. +258 */ +259 @Test +260 public void testAnalyzeTbz2() throws Exception { +261 ArchiveAnalyzer instance = new ArchiveAnalyzer(); +262 instance.accept(new File("zip")); //ensure analyzer is "enabled" +263 try { +264 instance.initialize(); +265 File file = BaseTest.getResourceAsFile(this, "file.tbz2"); +266 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); +267 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); +268 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); +269 Engine engine = new Engine(); +270 int initial_size = engine.getDependencies().size(); +271 engine.scan(file); +272 engine.analyzeDependencies(); +273 int ending_size = engine.getDependencies().size(); +274 engine.cleanup(); +275 assertTrue(initial_size < ending_size); +276 } finally { +277 instance.close(); +278 } +279 } +280 +281 /** +282 * Test of analyze method, of class ArchiveAnalyzer. +283 */ +284 @Test +285 public void testAnalyze_badZip() throws Exception { +286 ArchiveAnalyzer instance = new ArchiveAnalyzer(); +287 try { +288 instance.initialize(); +289 +290 //File file = new File(this.getClass().getClassLoader().getResource("test.zip").getPath()); +291 File file = BaseTest.getResourceAsFile(this, "test.zip"); +292 Dependency dependency = new Dependency(file); +293 Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); +294 Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); +295 Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); +296 Engine engine = new Engine(); +297 int initial_size = engine.getDependencies().size(); +298 // boolean failed = false; +299 // try { +300 instance.analyze(dependency, engine); +301 // } catch (java.lang.UnsupportedClassVersionError ex) { +302 // failed = true; +303 // } +304 // assertTrue(failed); +305 int ending_size = engine.getDependencies().size(); +306 engine.cleanup(); +307 assertEquals(initial_size, ending_size); +308 } finally { +309 instance.close(); +310 } +311 } +312 }
    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/CMakeAnalyzerTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/CMakeAnalyzerTest.html index 964ec5142..504ad0a83 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/CMakeAnalyzerTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/CMakeAnalyzerTest.html @@ -60,104 +60,105 @@ 52 * 53 * @throws Exception if there is a problem 54 */ -55 @Before -56 public void setUp() throws Exception { -57 super.setUp(); -58 analyzer = new CMakeAnalyzer(); -59 analyzer.setFilesMatched(true); -60 analyzer.initialize(); -61 } -62 -63 /** -64 * Cleanup any resources used. -65 * -66 * @throws Exception if there is a problem -67 */ -68 @After -69 public void tearDown() throws Exception { -70 analyzer.close(); -71 analyzer = null; -72 } -73 -74 /** -75 * Test of getName method, of class PythonPackageAnalyzer. -76 */ -77 @Test -78 public void testGetName() { -79 assertThat(analyzer.getName(), is(equalTo("CMake Analyzer"))); -80 } -81 -82 /** -83 * Test of supportsExtension method, of class PythonPackageAnalyzer. -84 */ -85 @Test -86 public void testAccept() { -87 assertTrue("Should support \"CMakeLists.txt\" name.", -88 analyzer.accept(new File("CMakeLists.txt"))); -89 assertTrue("Should support \"cmake\" extension.", -90 analyzer.accept(new File("test.cmake"))); -91 } -92 -93 /** -94 * Test whether expected evidence is gathered from OpenCV's CMakeLists.txt. -95 * -96 * @throws AnalysisException is thrown when an exception occurs. -97 */ -98 @Test -99 public void testAnalyzeCMakeListsOpenCV() throws AnalysisException { -100 final Dependency result = new Dependency(BaseTest.getResourceAsFile( -101 this, "cmake/opencv/CMakeLists.txt")); -102 analyzer.analyze(result, null); -103 final String product = "OpenCV"; -104 assertProductEvidence(result, product); -105 } -106 -107 /** -108 * Test whether expected evidence is gathered from OpenCV's CMakeLists.txt. -109 * -110 * @throws AnalysisException is thrown when an exception occurs. -111 */ -112 @Test -113 public void testAnalyzeCMakeListsZlib() throws AnalysisException { -114 final Dependency result = new Dependency(BaseTest.getResourceAsFile( -115 this, "cmake/zlib/CMakeLists.txt")); -116 analyzer.analyze(result, null); -117 final String product = "zlib"; -118 assertProductEvidence(result, product); -119 } -120 -121 private void assertProductEvidence(Dependency result, String product) { -122 assertTrue("Expected product evidence to contain \"" + product + "\".", -123 result.getProductEvidence().toString().contains(product)); -124 } -125 -126 /** -127 * Test whether expected version evidence is gathered from OpenCV's third party cmake files. -128 * -129 * @throws AnalysisException is thrown when an exception occurs. -130 */ -131 @Test -132 public void testAnalyzeCMakeListsOpenCV3rdParty() throws AnalysisException, DatabaseException { -133 final Dependency result = new Dependency(BaseTest.getResourceAsFile( -134 this, "cmake/opencv/3rdparty/ffmpeg/ffmpeg_version.cmake")); -135 final Engine engine = new Engine(); -136 analyzer.analyze(result, engine); -137 assertProductEvidence(result, "libavcodec"); -138 assertVersionEvidence(result, "55.18.102"); -139 assertFalse("ALIASOF_ prefix shouldn't be present.", -140 Pattern.compile("\\bALIASOF_\\w+").matcher(result.getProductEvidence().toString()).find()); -141 final List<Dependency> dependencies = engine.getDependencies(); -142 assertEquals("Number of additional dependencies should be 4.", 4, dependencies.size()); -143 final Dependency last = dependencies.get(3); -144 assertProductEvidence(last, "libavresample"); -145 assertVersionEvidence(last, "1.0.1"); -146 } -147 -148 private void assertVersionEvidence(Dependency result, String version) { -149 assertTrue("Expected version evidence to contain \"" + version + "\".", -150 result.getVersionEvidence().toString().contains(version)); -151 } -152 } +55 @Override +56 @Before +57 public void setUp() throws Exception { +58 super.setUp(); +59 analyzer = new CMakeAnalyzer(); +60 analyzer.setFilesMatched(true); +61 analyzer.initialize(); +62 } +63 +64 /** +65 * Cleanup any resources used. +66 * +67 * @throws Exception if there is a problem +68 */ +69 @After +70 public void tearDown() throws Exception { +71 analyzer.close(); +72 analyzer = null; +73 } +74 +75 /** +76 * Test of getName method, of class PythonPackageAnalyzer. +77 */ +78 @Test +79 public void testGetName() { +80 assertThat(analyzer.getName(), is(equalTo("CMake Analyzer"))); +81 } +82 +83 /** +84 * Test of supportsExtension method, of class PythonPackageAnalyzer. +85 */ +86 @Test +87 public void testAccept() { +88 assertTrue("Should support \"CMakeLists.txt\" name.", +89 analyzer.accept(new File("CMakeLists.txt"))); +90 assertTrue("Should support \"cmake\" extension.", +91 analyzer.accept(new File("test.cmake"))); +92 } +93 +94 /** +95 * Test whether expected evidence is gathered from OpenCV's CMakeLists.txt. +96 * +97 * @throws AnalysisException is thrown when an exception occurs. +98 */ +99 @Test +100 public void testAnalyzeCMakeListsOpenCV() throws AnalysisException { +101 final Dependency result = new Dependency(BaseTest.getResourceAsFile( +102 this, "cmake/opencv/CMakeLists.txt")); +103 analyzer.analyze(result, null); +104 final String product = "OpenCV"; +105 assertProductEvidence(result, product); +106 } +107 +108 /** +109 * Test whether expected evidence is gathered from OpenCV's CMakeLists.txt. +110 * +111 * @throws AnalysisException is thrown when an exception occurs. +112 */ +113 @Test +114 public void testAnalyzeCMakeListsZlib() throws AnalysisException { +115 final Dependency result = new Dependency(BaseTest.getResourceAsFile( +116 this, "cmake/zlib/CMakeLists.txt")); +117 analyzer.analyze(result, null); +118 final String product = "zlib"; +119 assertProductEvidence(result, product); +120 } +121 +122 private void assertProductEvidence(Dependency result, String product) { +123 assertTrue("Expected product evidence to contain \"" + product + "\".", +124 result.getProductEvidence().toString().contains(product)); +125 } +126 +127 /** +128 * Test whether expected version evidence is gathered from OpenCV's third party cmake files. +129 * +130 * @throws AnalysisException is thrown when an exception occurs. +131 */ +132 @Test +133 public void testAnalyzeCMakeListsOpenCV3rdParty() throws AnalysisException, DatabaseException { +134 final Dependency result = new Dependency(BaseTest.getResourceAsFile( +135 this, "cmake/opencv/3rdparty/ffmpeg/ffmpeg_version.cmake")); +136 final Engine engine = new Engine(); +137 analyzer.analyze(result, engine); +138 assertProductEvidence(result, "libavcodec"); +139 assertVersionEvidence(result, "55.18.102"); +140 assertFalse("ALIASOF_ prefix shouldn't be present.", +141 Pattern.compile("\\bALIASOF_\\w+").matcher(result.getProductEvidence().toString()).find()); +142 final List<Dependency> dependencies = engine.getDependencies(); +143 assertEquals("Number of additional dependencies should be 4.", 4, dependencies.size()); +144 final Dependency last = dependencies.get(3); +145 assertProductEvidence(last, "libavresample"); +146 assertVersionEvidence(last, "1.0.1"); +147 } +148 +149 private void assertVersionEvidence(Dependency result, String version) { +150 assertTrue("Expected version evidence to contain \"" + version + "\".", +151 result.getVersionEvidence().toString().contains(version)); +152 } +153 }
    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/ComposerLockAnalyzerTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/ComposerLockAnalyzerTest.html new file mode 100644 index 000000000..200d19a4b --- /dev/null +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/ComposerLockAnalyzerTest.html @@ -0,0 +1,114 @@ + + + +ComposerLockAnalyzerTest xref + + + +
    +1   /*
    +2    * This file is part of dependency-check-core.
    +3    *
    +4    * Licensed under the Apache License, Version 2.0 (the "License");
    +5    * you may not use this file except in compliance with the License.
    +6    * You may obtain a copy of the License at
    +7    *
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
    +9    *
    +10   * Unless required by applicable law or agreed to in writing, software
    +11   * distributed under the License is distributed on an "AS IS" BASIS,
    +12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +13   * See the License for the specific language governing permissions and
    +14   * limitations under the License.
    +15   *
    +16   * Copyright (c) 2015 The OWASP Foundatio. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.analyzer;
    +19  
    +20  import org.junit.After;
    +21  import org.junit.Before;
    +22  import org.junit.Test;
    +23  import org.owasp.dependencycheck.BaseTest;
    +24  import org.owasp.dependencycheck.Engine;
    +25  import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
    +26  import org.owasp.dependencycheck.dependency.Confidence;
    +27  import org.owasp.dependencycheck.dependency.Dependency;
    +28  import org.owasp.dependencycheck.dependency.Evidence;
    +29  
    +30  import java.io.File;
    +31  
    +32  import static org.hamcrest.CoreMatchers.containsString;
    +33  import static org.hamcrest.CoreMatchers.is;
    +34  import static org.junit.Assert.assertEquals;
    +35  import static org.junit.Assert.assertThat;
    +36  import static org.junit.Assert.assertTrue;
    +37  
    +38  /**
    +39   * Unit tests for NodePackageAnalyzer.
    +40   *
    +41   * @author Dale Visser <dvisser@ida.org>
    +42   */
    +43  public class ComposerLockAnalyzerTest extends BaseTest {
    +44  
    +45      /**
    +46       * The analyzer to test.
    +47       */
    +48      ComposerLockAnalyzer analyzer;
    +49  
    +50      /**
    +51       * Correctly setup the analyzer for testing.
    +52       *
    +53       * @throws Exception thrown if there is a problem
    +54       */
    +55      @Before
    +56      public void setUp() throws Exception {
    +57          analyzer = new ComposerLockAnalyzer();
    +58          analyzer.setFilesMatched(true);
    +59          analyzer.initialize();
    +60      }
    +61  
    +62      /**
    +63       * Cleanup the analyzer's temp files, etc.
    +64       *
    +65       * @throws Exception thrown if there is a problem
    +66       */
    +67      @After
    +68      public void tearDown() throws Exception {
    +69          analyzer.close();
    +70          analyzer = null;
    +71      }
    +72  
    +73      /**
    +74       * Test of getName method, of class ComposerLockAnalyzer.
    +75       */
    +76      @Test
    +77      public void testGetName() {
    +78          assertEquals("Composer.lock analyzer", analyzer.getName());
    +79      }
    +80  
    +81      /**
    +82       * Test of supportsExtension method, of class ComposerLockAnalyzer.
    +83       */
    +84      @Test
    +85      public void testSupportsFiles() {
    +86          assertTrue(analyzer.accept(new File("composer.lock")));
    +87      }
    +88  
    +89      /**
    +90       * Test of inspect method, of class PythonDistributionAnalyzer.
    +91       *
    +92       * @throws AnalysisException is thrown when an exception occurs.
    +93       */
    +94      @Test
    +95      public void testAnalyzePackageJson() throws Exception {
    +96          final Engine engine = new Engine();
    +97          final Dependency result = new Dependency(BaseTest.getResourceAsFile(this,
    +98                  "composer.lock"));
    +99          analyzer.analyze(result, engine);
    +100     }
    +101 }
    +
    +
    + + + diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/DependencyBundlingAnalyzerIntegrationTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/DependencyBundlingAnalyzerIntegrationTest.html index fc8bc6b46..3b03449d7 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/DependencyBundlingAnalyzerIntegrationTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/DependencyBundlingAnalyzerIntegrationTest.html @@ -25,92 +25,86 @@ 17 */ 18 package org.owasp.dependencycheck.analyzer; 19 -20 import java.io.File; -21 import static org.junit.Assert.assertEquals; -22 import org.junit.Test; -23 import org.owasp.dependencycheck.BaseTest; -24 import org.owasp.dependencycheck.Engine; -25 import org.owasp.dependencycheck.data.cpe.AbstractDatabaseTestCase; -26 import org.owasp.dependencycheck.dependency.Dependency; -27 import org.owasp.dependencycheck.utils.Settings; +20 import org.junit.Test; +21 import org.owasp.dependencycheck.data.cpe.AbstractDatabaseTestCase; +22 +23 /** +24 * +25 * @author Jeremy Long +26 */ +27 public class DependencyBundlingAnalyzerIntegrationTest extends AbstractDatabaseTestCase { 28 -29 /** -30 * -31 * @author Jeremy Long -32 */ -33 public class DependencyBundlingAnalyzerIntegrationTest extends AbstractDatabaseTestCase { -34 -35 /** -36 * Test of analyze method, of class DependencyBundlingAnalyzer. -37 */ -38 @Test -39 public void testAnalyze() throws Exception { -40 // Engine engine = null; -41 // JarAnalyzer ja = null; -42 // FileNameAnalyzer fna = null; -43 // CPEAnalyzer cpea = null; -44 // DependencyBundlingAnalyzer instance = null; -45 // try { -46 // //Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); -47 // Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); -48 // //Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); -49 // engine = new Engine(); -50 // engine.doUpdates(); -51 // -52 // File file1 = new File("C:\\Users\\jeremy\\Projects\\testCases\\batlik\\app1.war"); -53 // File file2 = new File("C:\\Users\\jeremy\\Projects\\testCases\\batlik\\app2.war"); -54 // Dependency dependency1 = new Dependency(file1); -55 // Dependency dependency2 = new Dependency(file2); -56 // engine.getDependencies().add(dependency1); -57 // engine.getDependencies().add(dependency2); -58 // ArchiveAnalyzer aa = new ArchiveAnalyzer(); -59 // aa.setEnabled(true); -60 // aa.setFilesMatched(true); -61 // aa.initialize(); -62 // ja = new JarAnalyzer(); -63 // ja.setFilesMatched(true); -64 // ja.setEnabled(true); -65 // ja.initialize(); -66 // fna = new FileNameAnalyzer(); -67 // fna.initialize(); -68 // cpea = new CPEAnalyzer(); -69 // cpea.initialize(); -70 // -71 // aa.analyze(dependency1, engine); -72 // aa.analyze(dependency2, engine); +29 /** +30 * Test of analyze method, of class DependencyBundlingAnalyzer. +31 */ +32 @Test +33 public void testAnalyze() throws Exception { +34 // Engine engine = null; +35 // JarAnalyzer ja = null; +36 // FileNameAnalyzer fna = null; +37 // CPEAnalyzer cpea = null; +38 // DependencyBundlingAnalyzer instance = null; +39 // try { +40 // //Settings.setBoolean(Settings.KEYS.AUTO_UPDATE, false); +41 // Settings.setBoolean(Settings.KEYS.ANALYZER_NEXUS_ENABLED, false); +42 // //Settings.setBoolean(Settings.KEYS.ANALYZER_CENTRAL_ENABLED, false); +43 // engine = new Engine(); +44 // engine.doUpdates(); +45 // +46 // File file1 = new File("C:\\Users\\jeremy\\Projects\\testCases\\batlik\\app1.war"); +47 // File file2 = new File("C:\\Users\\jeremy\\Projects\\testCases\\batlik\\app2.war"); +48 // Dependency dependency1 = new Dependency(file1); +49 // Dependency dependency2 = new Dependency(file2); +50 // engine.getDependencies().add(dependency1); +51 // engine.getDependencies().add(dependency2); +52 // ArchiveAnalyzer aa = new ArchiveAnalyzer(); +53 // aa.setEnabled(true); +54 // aa.setFilesMatched(true); +55 // aa.initialize(); +56 // ja = new JarAnalyzer(); +57 // ja.setFilesMatched(true); +58 // ja.setEnabled(true); +59 // ja.initialize(); +60 // fna = new FileNameAnalyzer(); +61 // fna.initialize(); +62 // cpea = new CPEAnalyzer(); +63 // cpea.initialize(); +64 // +65 // aa.analyze(dependency1, engine); +66 // aa.analyze(dependency2, engine); +67 // +68 // for (Dependency d : engine.getDependencies()) { +69 // fna.analyze(d, engine); +70 // ja.analyze(d, engine); +71 // cpea.analyze(d, engine); +72 // } 73 // -74 // for (Dependency d : engine.getDependencies()) { -75 // fna.analyze(d, engine); -76 // ja.analyze(d, engine); -77 // cpea.analyze(d, engine); -78 // } -79 // -80 // instance = new DependencyBundlingAnalyzer(); -81 // instance.initialize(); -82 // instance.analyze(null, engine); -83 // System.out.println(engine.getDependencies().size()); -84 // for (Dependency d : engine.getDependencies()) { -85 // System.out.println(d.getDisplayFileName()); -86 // } -87 // } finally { -88 // if (ja != null) { -89 // ja.close(); +74 // instance = new DependencyBundlingAnalyzer(); +75 // instance.initialize(); +76 // instance.analyze(null, engine); +77 // System.out.println(engine.getDependencies().size()); +78 // for (Dependency d : engine.getDependencies()) { +79 // System.out.println(d.getDisplayFileName()); +80 // } +81 // } finally { +82 // if (ja != null) { +83 // ja.close(); +84 // } +85 // if (fna != null) { +86 // fna.close(); +87 // } +88 // if (cpea != null) { +89 // cpea.close(); 90 // } -91 // if (fna != null) { -92 // fna.close(); +91 // if (instance != null) { +92 // instance.close(); 93 // } -94 // if (cpea != null) { -95 // cpea.close(); +94 // if (engine != null) { +95 // engine.cleanup(); 96 // } -97 // if (instance != null) { -98 // instance.close(); -99 // } -100 // if (engine != null) { -101 // engine.cleanup(); -102 // } -103 // } -104 } -105 } +97 // } +98 } +99 }
    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/JarAnalyzerTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/JarAnalyzerTest.html index 34c28ba63..ec573511c 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/JarAnalyzerTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/JarAnalyzerTest.html @@ -31,99 +31,97 @@ 23 import org.owasp.dependencycheck.dependency.Evidence; 24 25 import java.io.File; -26 import java.util.HashSet; -27 import java.util.Set; -28 -29 import static org.junit.Assert.assertEquals; -30 import static org.junit.Assert.assertTrue; -31 -32 /** -33 * @author Jeremy Long -34 */ -35 public class JarAnalyzerTest extends BaseTest { -36 -37 /** -38 * Test of inspect method, of class JarAnalyzer. -39 * -40 * @throws Exception is thrown when an exception occurs. -41 */ -42 @Test -43 public void testAnalyze() throws Exception { -44 //File file = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath()); -45 File file = BaseTest.getResourceAsFile(this, "struts2-core-2.1.2.jar"); -46 Dependency result = new Dependency(file); -47 JarAnalyzer instance = new JarAnalyzer(); -48 instance.analyze(result, null); -49 assertTrue(result.getVendorEvidence().toString().toLowerCase().contains("apache")); -50 assertTrue(result.getVendorEvidence().getWeighting().contains("apache")); -51 -52 //file = new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath()); -53 file = BaseTest.getResourceAsFile(this, "org.mortbay.jetty.jar"); -54 result = new Dependency(file); -55 instance.analyze(result, null); -56 boolean found = false; -57 for (Evidence e : result.getProductEvidence()) { -58 if (e.getName().equalsIgnoreCase("package-title") -59 && e.getValue().equalsIgnoreCase("org.mortbay.http")) { -60 found = true; -61 break; -62 } -63 } -64 assertTrue("package-title of org.mortbay.http not found in org.mortbay.jetty.jar", found); -65 -66 found = false; -67 for (Evidence e : result.getVendorEvidence()) { -68 if (e.getName().equalsIgnoreCase("implementation-url") -69 && e.getValue().equalsIgnoreCase("http://jetty.mortbay.org")) { -70 found = true; -71 break; -72 } -73 } -74 assertTrue("implementation-url of http://jetty.mortbay.org not found in org.mortbay.jetty.jar", found); -75 -76 found = false; -77 for (Evidence e : result.getVersionEvidence()) { -78 if (e.getName().equalsIgnoreCase("Implementation-Version") -79 && e.getValue().equalsIgnoreCase("4.2.27")) { -80 found = true; -81 break; -82 } -83 } -84 assertTrue("implementation-version of 4.2.27 not found in org.mortbay.jetty.jar", found); -85 -86 //file = new File(this.getClass().getClassLoader().getResource("org.mortbay.jmx.jar").getPath()); -87 file = BaseTest.getResourceAsFile(this, "org.mortbay.jmx.jar"); -88 result = new Dependency(file); -89 instance.analyze(result, null); -90 assertEquals("org.mortbar.jmx.jar has version evidence?", result.getVersionEvidence().size(), 0); -91 } -92 -93 /** -94 * Test of getSupportedExtensions method, of class JarAnalyzer. -95 */ -96 @Test -97 public void testAcceptSupportedExtensions() throws Exception { -98 JarAnalyzer instance = new JarAnalyzer(); -99 instance.initialize(); -100 instance.setEnabled(true); -101 String[] files = {"test.jar", "test.war"}; -102 for (String name : files) { -103 assertTrue(name, instance.accept(new File(name))); -104 } -105 } -106 -107 /** -108 * Test of getName method, of class JarAnalyzer. -109 */ -110 @Test -111 public void testGetName() { -112 JarAnalyzer instance = new JarAnalyzer(); -113 String expResult = "Jar Analyzer"; -114 String result = instance.getName(); -115 assertEquals(expResult, result); -116 } -117 -118 } +26 +27 import static org.junit.Assert.assertEquals; +28 import static org.junit.Assert.assertTrue; +29 +30 /** +31 * @author Jeremy Long +32 */ +33 public class JarAnalyzerTest extends BaseTest { +34 +35 /** +36 * Test of inspect method, of class JarAnalyzer. +37 * +38 * @throws Exception is thrown when an exception occurs. +39 */ +40 @Test +41 public void testAnalyze() throws Exception { +42 //File file = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath()); +43 File file = BaseTest.getResourceAsFile(this, "struts2-core-2.1.2.jar"); +44 Dependency result = new Dependency(file); +45 JarAnalyzer instance = new JarAnalyzer(); +46 instance.analyze(result, null); +47 assertTrue(result.getVendorEvidence().toString().toLowerCase().contains("apache")); +48 assertTrue(result.getVendorEvidence().getWeighting().contains("apache")); +49 +50 //file = new File(this.getClass().getClassLoader().getResource("org.mortbay.jetty.jar").getPath()); +51 file = BaseTest.getResourceAsFile(this, "org.mortbay.jetty.jar"); +52 result = new Dependency(file); +53 instance.analyze(result, null); +54 boolean found = false; +55 for (Evidence e : result.getProductEvidence()) { +56 if (e.getName().equalsIgnoreCase("package-title") +57 && e.getValue().equalsIgnoreCase("org.mortbay.http")) { +58 found = true; +59 break; +60 } +61 } +62 assertTrue("package-title of org.mortbay.http not found in org.mortbay.jetty.jar", found); +63 +64 found = false; +65 for (Evidence e : result.getVendorEvidence()) { +66 if (e.getName().equalsIgnoreCase("implementation-url") +67 && e.getValue().equalsIgnoreCase("http://jetty.mortbay.org")) { +68 found = true; +69 break; +70 } +71 } +72 assertTrue("implementation-url of http://jetty.mortbay.org not found in org.mortbay.jetty.jar", found); +73 +74 found = false; +75 for (Evidence e : result.getVersionEvidence()) { +76 if (e.getName().equalsIgnoreCase("Implementation-Version") +77 && e.getValue().equalsIgnoreCase("4.2.27")) { +78 found = true; +79 break; +80 } +81 } +82 assertTrue("implementation-version of 4.2.27 not found in org.mortbay.jetty.jar", found); +83 +84 //file = new File(this.getClass().getClassLoader().getResource("org.mortbay.jmx.jar").getPath()); +85 file = BaseTest.getResourceAsFile(this, "org.mortbay.jmx.jar"); +86 result = new Dependency(file); +87 instance.analyze(result, null); +88 assertEquals("org.mortbar.jmx.jar has version evidence?", result.getVersionEvidence().size(), 0); +89 } +90 +91 /** +92 * Test of getSupportedExtensions method, of class JarAnalyzer. +93 */ +94 @Test +95 public void testAcceptSupportedExtensions() throws Exception { +96 JarAnalyzer instance = new JarAnalyzer(); +97 instance.initialize(); +98 instance.setEnabled(true); +99 String[] files = {"test.jar", "test.war"}; +100 for (String name : files) { +101 assertTrue(name, instance.accept(new File(name))); +102 } +103 } +104 +105 /** +106 * Test of getName method, of class JarAnalyzer. +107 */ +108 @Test +109 public void testGetName() { +110 JarAnalyzer instance = new JarAnalyzer(); +111 String expResult = "Jar Analyzer"; +112 String result = instance.getName(); +113 assertEquals(expResult, result); +114 } +115 +116 }
    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/NodePackageAnalyzerTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/NodePackageAnalyzerTest.html new file mode 100644 index 000000000..26b1d9fc9 --- /dev/null +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/NodePackageAnalyzerTest.html @@ -0,0 +1,113 @@ + + + +NodePackageAnalyzerTest xref + + + +
    +1   /*
    +2    * This file is part of dependency-check-core.
    +3    *
    +4    * Licensed under the Apache License, Version 2.0 (the "License");
    +5    * you may not use this file except in compliance with the License.
    +6    * You may obtain a copy of the License at
    +7    *
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
    +9    *
    +10   * Unless required by applicable law or agreed to in writing, software
    +11   * distributed under the License is distributed on an "AS IS" BASIS,
    +12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +13   * See the License for the specific language governing permissions and
    +14   * limitations under the License.
    +15   *
    +16   * Copyright (c) 2015 Institute for Defense Analyses. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.analyzer;
    +19  
    +20  import org.junit.After;
    +21  import org.junit.Before;
    +22  import org.junit.Test;
    +23  import org.owasp.dependencycheck.BaseTest;
    +24  import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
    +25  import org.owasp.dependencycheck.dependency.Dependency;
    +26  
    +27  import java.io.File;
    +28  
    +29  import static org.hamcrest.CoreMatchers.containsString;
    +30  import static org.hamcrest.CoreMatchers.is;
    +31  import static org.junit.Assert.*;
    +32  
    +33  /**
    +34   * Unit tests for NodePackageAnalyzer.
    +35   *
    +36   * @author Dale Visser <dvisser@ida.org>
    +37   */
    +38  public class NodePackageAnalyzerTest extends BaseTest {
    +39  
    +40      /**
    +41       * The analyzer to test.
    +42       */
    +43      NodePackageAnalyzer analyzer;
    +44  
    +45      /**
    +46       * Correctly setup the analyzer for testing.
    +47       *
    +48       * @throws Exception thrown if there is a problem
    +49       */
    +50      @Before
    +51      public void setUp() throws Exception {
    +52          analyzer = new NodePackageAnalyzer();
    +53          analyzer.setFilesMatched(true);
    +54          analyzer.initialize();
    +55      }
    +56  
    +57      /**
    +58       * Cleanup the analyzer's temp files, etc.
    +59       *
    +60       * @throws Exception thrown if there is a problem
    +61       */
    +62      @After
    +63      public void tearDown() throws Exception {
    +64          analyzer.close();
    +65          analyzer = null;
    +66      }
    +67  
    +68      /**
    +69       * Test of getName method, of class PythonDistributionAnalyzer.
    +70       */
    +71      @Test
    +72      public void testGetName() {
    +73          assertThat(analyzer.getName(), is("Node.js Package Analyzer"));
    +74      }
    +75  
    +76      /**
    +77       * Test of supportsExtension method, of class PythonDistributionAnalyzer.
    +78       */
    +79      @Test
    +80      public void testSupportsFiles() {
    +81          assertThat(analyzer.accept(new File("package.json")), is(true));
    +82      }
    +83  
    +84      /**
    +85       * Test of inspect method, of class PythonDistributionAnalyzer.
    +86       *
    +87       * @throws AnalysisException is thrown when an exception occurs.
    +88       */
    +89      @Test
    +90      public void testAnalyzePackageJson() throws AnalysisException {
    +91          final Dependency result = new Dependency(BaseTest.getResourceAsFile(this,
    +92                  "nodejs/node_modules/dns-sync/package.json"));
    +93          analyzer.analyze(result, null);
    +94          final String vendorString = result.getVendorEvidence().toString();
    +95          assertThat(vendorString, containsString("Sanjeev Koranga"));
    +96          assertThat(vendorString, containsString("dns-sync_project"));
    +97          assertThat(result.getProductEvidence().toString(), containsString("dns-sync"));
    +98          assertThat(result.getVersionEvidence().toString(), containsString("0.1.0"));
    +99      }
    +100 }
    +
    +
    + + + diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/OpenSSLAnalyzerTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/OpenSSLAnalyzerTest.html index e96a47e6e..75cc1ef94 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/OpenSSLAnalyzerTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/OpenSSLAnalyzerTest.html @@ -47,10 +47,10 @@ 39 /** 40 * The package analyzer to test. 41 */ -42 OpenSSLAnalyzer analyzer; +42 private OpenSSLAnalyzer analyzer; 43 44 /** -45 * Setup the PtyhonPackageAnalyzer. +45 * Setup the {@link OpenSSLAnalyzer}. 46 * 47 * @throws Exception if there is a problem 48 */ diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/PythonDistributionAnalyzerTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/PythonDistributionAnalyzerTest.html index 434e98e25..eee200bd8 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/PythonDistributionAnalyzerTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/PythonDistributionAnalyzerTest.html @@ -48,7 +48,7 @@ 40 /** 41 * The analyzer to test. 42 */ -43 PythonDistributionAnalyzer analyzer; +43 private PythonDistributionAnalyzer analyzer; 44 45 /** 46 * Correctly setup the analyzer for testing. diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/PythonPackageAnalyzerTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/PythonPackageAnalyzerTest.html index 0ce16e4e6..6a7bad426 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/PythonPackageAnalyzerTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/PythonPackageAnalyzerTest.html @@ -48,10 +48,10 @@ 40 /** 41 * The package analyzer to test. 42 */ -43 PythonPackageAnalyzer analyzer; +43 private PythonPackageAnalyzer analyzer; 44 45 /** -46 * Setup the PtyhonPackageAnalyzer. +46 * Setup the {@link PythonPackageAnalyzer}. 47 * 48 * @throws Exception if there is a problem 49 */ @@ -93,26 +93,22 @@ 85 86 @Test 87 public void testAnalyzeSourceMetadata() throws AnalysisException { -88 eggtestAssertions(this, -89 "python/eggtest/__init__.py"); -90 } -91 -92 public void eggtestAssertions(Object context, final String resource) throws AnalysisException { -93 boolean found = false; -94 final Dependency result = new Dependency(BaseTest.getResourceAsFile( -95 context, resource)); -96 analyzer.analyze(result, null); -97 assertTrue("Expected vendor evidence to contain \"example\".", result -98 .getVendorEvidence().toString().contains("example")); -99 for (final Evidence e : result.getVersionEvidence()) { -100 if ("0.0.1".equals(e.getValue())) { -101 found = true; -102 break; -103 } -104 } -105 assertTrue("Version 0.0.1 not found in EggTest dependency.", found); -106 } -107 } +88 boolean found = false; +89 final Dependency result = new Dependency(BaseTest.getResourceAsFile( +90 this, "python/eggtest/__init__.py")); +91 analyzer.analyze(result, null); +92 assertTrue("Expected vendor evidence to contain \"example\".", result +93 .getVendorEvidence().toString().contains("example")); +94 for (final Evidence e : result.getVersionEvidence()) { +95 if ("0.0.1".equals(e.getValue())) { +96 found = true; +97 break; +98 } +99 } +100 assertTrue("Version 0.0.1 not found in EggTest dependency.", found); +101 } +102 +103 }
    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/RubyGemspecAnalyzerTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/RubyGemspecAnalyzerTest.html new file mode 100644 index 000000000..43b76a407 --- /dev/null +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/RubyGemspecAnalyzerTest.html @@ -0,0 +1,116 @@ + + + +RubyGemspecAnalyzerTest xref + + + +
    +1   /*
    +2    * This file is part of dependency-check-core.
    +3    *
    +4    * Licensed under the Apache License, Version 2.0 (the "License");
    +5    * you may not use this file except in compliance with the License.
    +6    * You may obtain a copy of the License at
    +7    *
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
    +9    *
    +10   * Unless required by applicable law or agreed to in writing, software
    +11   * distributed under the License is distributed on an "AS IS" BASIS,
    +12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +13   * See the License for the specific language governing permissions and
    +14   * limitations under the License.
    +15   *
    +16   * Copyright (c) 2015 Institute for Defense Analyses. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.analyzer;
    +19  
    +20  import org.junit.After;
    +21  import org.junit.Before;
    +22  import org.junit.Test;
    +23  import org.owasp.dependencycheck.BaseTest;
    +24  import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
    +25  import org.owasp.dependencycheck.dependency.Dependency;
    +26  
    +27  import java.io.File;
    +28  
    +29  import static org.hamcrest.CoreMatchers.containsString;
    +30  import static org.hamcrest.CoreMatchers.is;
    +31  import static org.junit.Assert.*;
    +32  
    +33  /**
    +34   * Unit tests for {@link RubyGemspecAnalyzer}.
    +35   *
    +36   * @author Dale Visser <dvisser@ida.org>
    +37   */
    +38  public class RubyGemspecAnalyzerTest extends BaseTest {
    +39  
    +40      /**
    +41       * The analyzer to test.
    +42       */
    +43      RubyGemspecAnalyzer analyzer;
    +44  
    +45      /**
    +46       * Correctly setup the analyzer for testing.
    +47       *
    +48       * @throws Exception thrown if there is a problem
    +49       */
    +50      @Before
    +51      public void setUp() throws Exception {
    +52          analyzer = new RubyGemspecAnalyzer();
    +53          analyzer.setFilesMatched(true);
    +54          analyzer.initialize();
    +55      }
    +56  
    +57      /**
    +58       * Cleanup the analyzer's temp files, etc.
    +59       *
    +60       * @throws Exception thrown if there is a problem
    +61       */
    +62      @After
    +63      public void tearDown() throws Exception {
    +64          analyzer.close();
    +65          analyzer = null;
    +66      }
    +67  
    +68      /**
    +69       * Test of getName method, of class PythonDistributionAnalyzer.
    +70       */
    +71      @Test
    +72      public void testGetName() {
    +73          assertThat(analyzer.getName(), is("Ruby Gemspec Analyzer"));
    +74      }
    +75  
    +76      /**
    +77       * Test of supportsExtension method, of class PythonDistributionAnalyzer.
    +78       */
    +79      @Test
    +80      public void testSupportsFiles() {
    +81          assertThat(analyzer.accept(new File("test.gemspec")), is(true));
    +82          assertThat(analyzer.accept(new File("Rakefile")), is(true));
    +83      }
    +84  
    +85      /**
    +86       * Test of inspect method, of class PythonDistributionAnalyzer.
    +87       *
    +88       * @throws AnalysisException is thrown when an exception occurs.
    +89       */
    +90      @Test
    +91      public void testAnalyzePackageJson() throws AnalysisException {
    +92          final Dependency result = new Dependency(BaseTest.getResourceAsFile(this,
    +93                  "ruby/gems/specifications/rest-client-1.7.2.gemspec"));
    +94          analyzer.analyze(result, null);
    +95          final String vendorString = result.getVendorEvidence().toString();
    +96          assertThat(vendorString, containsString("REST Client Team"));
    +97          assertThat(vendorString, containsString("rest-client_project"));
    +98          assertThat(vendorString, containsString("rest.client@librelist.com"));
    +99          assertThat(vendorString, containsString("https://github.com/rest-client/rest-client"));
    +100         assertThat(result.getProductEvidence().toString(), containsString("rest-client"));
    +101         assertThat(result.getVersionEvidence().toString(), containsString("1.7.2"));
    +102     }
    +103 }
    +
    +
    + + + diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/package-frame.html index bada47fc7..52955a2fb 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.analyzer + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.analyzer @@ -41,6 +41,9 @@
  • CPEAnalyzerIntegrationTest +
  • +
  • + ComposerLockAnalyzerTest
  • DependencyBundlingAnalyzerIntegrationTest @@ -59,6 +62,9 @@
  • JarAnalyzerTest +
  • +
  • + NodePackageAnalyzerTest
  • NuspecAnalyzerTest @@ -71,6 +77,9 @@
  • PythonPackageAnalyzerTest +
  • +
  • + RubyGemspecAnalyzerTest
  • VulnerabilitySuppressionAnalyzerIntegrationTest diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/package-summary.html index a41d076a3..7a11f61ff 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/analyzer/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.analyzer + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.analyzer @@ -79,6 +79,11 @@ CPEAnalyzerIntegrationTest + + + + ComposerLockAnalyzerTest + @@ -109,6 +114,11 @@ JarAnalyzerTest + + + + NodePackageAnalyzerTest + @@ -129,6 +139,11 @@ PythonPackageAnalyzerTest + + + + RubyGemspecAnalyzerTest + diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/central/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/central/package-frame.html index 681a9304b..3d9f18666 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/central/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/central/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.central + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.central diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/central/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/central/package-summary.html index c2befb328..11b99c44c 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/central/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/central/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.central + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.central diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/composer/ComposerLockParserTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/composer/ComposerLockParserTest.html new file mode 100644 index 000000000..b04372709 --- /dev/null +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/composer/ComposerLockParserTest.html @@ -0,0 +1,82 @@ + + + +ComposerLockParserTest xref + + + +
    +1   /*
    +2    * This file is part of dependency-check-core.
    +3    *
    +4    * Licensed under the Apache License, Version 2.0 (the "License");
    +5    * you may not use this file except in compliance with the License.
    +6    * You may obtain a copy of the License at
    +7    *
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
    +9    *
    +10   * Unless required by applicable law or agreed to in writing, software
    +11   * distributed under the License is distributed on an "AS IS" BASIS,
    +12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +13   * See the License for the specific language governing permissions and
    +14   * limitations under the License.
    +15   *
    +16   * Copyright (c) 2015 The OWASP Foundatio. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.data.composer;
    +19  
    +20  import org.junit.Before;
    +21  import org.junit.Test;
    +22  
    +23  import java.io.ByteArrayInputStream;
    +24  import java.io.InputStream;
    +25  import java.nio.charset.Charset;
    +26  
    +27  import static org.junit.Assert.*;
    +28  
    +29  /**
    +30   * Created by colezlaw on 9/5/15.
    +31   */
    +32  public class ComposerLockParserTest {
    +33  
    +34      private InputStream inputStream;
    +35  
    +36      @Before
    +37      public void setUp() {
    +38          inputStream = this.getClass().getClassLoader().getResourceAsStream("composer.lock");
    +39      }
    +40  
    +41      @Test
    +42      public void testValidComposerLock() {
    +43          ComposerLockParser clp = new ComposerLockParser(inputStream);
    +44          clp.process();
    +45          assertEquals(30, clp.getDependencies().size());
    +46          assertTrue(clp.getDependencies().contains(new ComposerDependency("symfony", "translation", "2.7.3")));
    +47      }
    +48  
    +49      @Test(expected = ComposerException.class)
    +50      public void testNotJSON() throws Exception {
    +51          String input = "NOT VALID JSON";
    +52          ComposerLockParser clp = new ComposerLockParser(new ByteArrayInputStream(input.getBytes(Charset.defaultCharset())));
    +53          clp.process();
    +54      }
    +55  
    +56      @Test(expected = ComposerException.class)
    +57      public void testNotComposer() throws Exception {
    +58          String input = "[\"ham\",\"eggs\"]";
    +59          ComposerLockParser clp = new ComposerLockParser(new ByteArrayInputStream(input.getBytes(Charset.defaultCharset())));
    +60          clp.process();
    +61      }
    +62  
    +63      @Test(expected = ComposerException.class)
    +64      public void testNotPackagesArray() throws Exception {
    +65          String input = "{\"packages\":\"eleventy\"}";
    +66          ComposerLockParser clp = new ComposerLockParser(new ByteArrayInputStream(input.getBytes(Charset.defaultCharset())));
    +67          clp.process();
    +68      }
    +69  }
    +
    +
    + + + diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/composer/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/composer/package-frame.html new file mode 100644 index 000000000..0f9b8da14 --- /dev/null +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/composer/package-frame.html @@ -0,0 +1,24 @@ + + + + + + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.composer + + + + +

    + org.owasp.dependencycheck.data.composer +

    + +

    Classes

    + + + + + \ No newline at end of file diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/composer/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/composer/package-summary.html new file mode 100644 index 000000000..19d39f5a0 --- /dev/null +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/composer/package-summary.html @@ -0,0 +1,69 @@ + + + + + + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.composer + + + +
    + +
    +
    + +
    + +

    Package org.owasp.dependencycheck.data.composer

    + + + + + + + + + + + + +
    Class Summary
    + ComposerLockParserTest +
    + +
    + +
    +
    + +
    +
    + + + \ No newline at end of file diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cpe/IndexEntryTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cpe/IndexEntryTest.html index f1f7ca39d..0334646e7 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cpe/IndexEntryTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cpe/IndexEntryTest.html @@ -25,56 +25,31 @@ 17 */ 18 package org.owasp.dependencycheck.data.cpe; 19 -20 import junit.framework.TestCase; -21 import org.junit.After; -22 import org.junit.AfterClass; -23 import org.junit.Assert; -24 import org.junit.Before; -25 import org.junit.BeforeClass; -26 import org.junit.Test; -27 -28 /** -29 * -30 * @author Jeremy Long -31 */ -32 public class IndexEntryTest extends TestCase { -33 -34 @BeforeClass -35 public static void setUpClass() throws Exception { -36 } +20 import org.junit.Assert; +21 import org.junit.Test; +22 +23 /** +24 * +25 * @author Jeremy Long +26 */ +27 public class IndexEntryTest { +28 +29 /** +30 * Test of setName method, of class IndexEntry. +31 * +32 * @throws Exception is thrown when an exception occurs. +33 */ +34 @Test +35 public void testSetName() throws Exception { +36 String name = "cpe:/a:apache:struts:1.1:rc2"; 37 -38 @AfterClass -39 public static void tearDownClass() throws Exception { -40 } -41 -42 @Before -43 @Override -44 public void setUp() throws Exception { -45 super.setUp(); -46 } -47 -48 @After -49 @Override -50 public void tearDown() throws Exception { -51 super.tearDown(); -52 } -53 -54 /** -55 * Test of setName method, of class IndexEntry. -56 * -57 * @throws Exception is thrown when an exception occurs. -58 */ -59 @Test -60 public void testSetName() throws Exception { -61 String name = "cpe:/a:apache:struts:1.1:rc2"; -62 -63 IndexEntry instance = new IndexEntry(); -64 instance.parseName(name); -65 -66 Assert.assertEquals("apache", instance.getVendor()); -67 Assert.assertEquals("struts", instance.getProduct()); -68 } -69 } +38 IndexEntry instance = new IndexEntry(); +39 instance.parseName(name); +40 +41 Assert.assertEquals("apache", instance.getVendor()); +42 Assert.assertEquals("struts", instance.getProduct()); +43 } +44 }
    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cpe/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cpe/package-frame.html index d5b70160f..f54254c31 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cpe/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cpe/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.cpe + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.cpe diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cpe/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cpe/package-summary.html index 7379ffcc3..59d86cea8 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cpe/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cpe/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.cpe + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.cpe diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cwe/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cwe/package-frame.html index 0a61186fb..dcd76c33f 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cwe/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cwe/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.cwe + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.cwe diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cwe/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cwe/package-summary.html index d6730d807..14ed2ff33 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cwe/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/cwe/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.cwe + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.cwe diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/lucene/TokenPairConcatenatingFilterTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/lucene/TokenPairConcatenatingFilterTest.html index b0d50ab02..637eb971f 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/lucene/TokenPairConcatenatingFilterTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/lucene/TokenPairConcatenatingFilterTest.html @@ -55,44 +55,46 @@ 47 public static void tearDownClass() { 48 } 49 -50 @Before -51 public void setUp() throws Exception { -52 super.setUp(); -53 } -54 -55 @After -56 public void tearDown() throws Exception { -57 super.tearDown(); -58 } -59 -60 /** -61 * test some examples -62 */ -63 public void testExamples() throws IOException { -64 Tokenizer wsTokenizer = new WhitespaceTokenizer(LuceneUtils.CURRENT_VERSION, new StringReader("one two three")); -65 TokenStream filter = new TokenPairConcatenatingFilter(wsTokenizer); -66 assertTokenStreamContents(filter, -67 new String[]{"one", "onetwo", "two", "twothree", "three"}); -68 } -69 -70 /** -71 * Test of clear method, of class TokenPairConcatenatingFilter. -72 * -73 * @throws java.io.IOException -74 */ -75 @Test -76 public void testClear() throws IOException { -77 -78 TokenStream ts = new WhitespaceTokenizer(LuceneUtils.CURRENT_VERSION, new StringReader("one two three")); -79 TokenPairConcatenatingFilter filter = new TokenPairConcatenatingFilter(ts); -80 assertTokenStreamContents(filter, new String[]{"one", "onetwo", "two", "twothree", "three"}); -81 -82 assertNotNull(filter.getPreviousWord()); -83 filter.clear(); -84 assertNull(filter.getPreviousWord()); -85 assertTrue(filter.getWords().isEmpty()); -86 } -87 } +50 @Override +51 @Before +52 public void setUp() throws Exception { +53 super.setUp(); +54 } +55 +56 @Override +57 @After +58 public void tearDown() throws Exception { +59 super.tearDown(); +60 } +61 +62 /** +63 * test some examples +64 */ +65 public void testExamples() throws IOException { +66 Tokenizer wsTokenizer = new WhitespaceTokenizer(LuceneUtils.CURRENT_VERSION, new StringReader("one two three")); +67 TokenStream filter = new TokenPairConcatenatingFilter(wsTokenizer); +68 assertTokenStreamContents(filter, +69 new String[]{"one", "onetwo", "two", "twothree", "three"}); +70 } +71 +72 /** +73 * Test of clear method, of class TokenPairConcatenatingFilter. +74 * +75 * @throws java.io.IOException +76 */ +77 @Test +78 public void testClear() throws IOException { +79 +80 TokenStream ts = new WhitespaceTokenizer(LuceneUtils.CURRENT_VERSION, new StringReader("one two three")); +81 TokenPairConcatenatingFilter filter = new TokenPairConcatenatingFilter(ts); +82 assertTokenStreamContents(filter, new String[]{"one", "onetwo", "two", "twothree", "three"}); +83 +84 assertNotNull(filter.getPreviousWord()); +85 filter.clear(); +86 assertNull(filter.getPreviousWord()); +87 assertTrue(filter.getWords().isEmpty()); +88 } +89 }
    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/lucene/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/lucene/package-frame.html index 0fa23e4d2..a09ea38cf 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/lucene/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/lucene/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.lucene + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.lucene diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/lucene/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/lucene/package-summary.html index cb36ef9be..6bc5b2c7e 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/lucene/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/lucene/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.lucene + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.lucene diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nexus/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nexus/package-frame.html index c43c301de..f76f82fae 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nexus/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nexus/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.nexus + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.nexus diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nexus/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nexus/package-summary.html index 4e00d7c80..00f848881 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nexus/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nexus/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.nexus + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.nexus diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nuget/XPathNuspecParserTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nuget/XPathNuspecParserTest.html index 2968f77b1..6eba7bdb5 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nuget/XPathNuspecParserTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nuget/XPathNuspecParserTest.html @@ -26,70 +26,69 @@ 18 package org.owasp.dependencycheck.data.nuget; 19 20 import java.io.ByteArrayOutputStream; -21 import java.io.File; -22 import java.io.InputStream; -23 import java.io.PrintStream; -24 import static org.junit.Assert.assertEquals; -25 import org.junit.Test; -26 import org.owasp.dependencycheck.BaseTest; -27 -28 /** -29 * -30 * @author colezlaw -31 * -32 */ -33 public class XPathNuspecParserTest extends BaseTest { -34 -35 /** -36 * Test all the valid components. -37 * -38 * @throws Exception if anything goes sideways. -39 */ -40 @Test -41 public void testGoodDocument() throws Exception { -42 NuspecParser parser = new XPathNuspecParser(); -43 //InputStream is = XPathNuspecParserTest.class.getClassLoader().getResourceAsStream("log4net.2.0.3.nuspec"); -44 InputStream is = BaseTest.getResourceAsStream(this, "log4net.2.0.3.nuspec"); -45 NugetPackage np = parser.parse(is); -46 assertEquals("log4net", np.getId()); -47 assertEquals("2.0.3", np.getVersion()); -48 assertEquals("log4net [1.2.13]", np.getTitle()); -49 assertEquals("Apache Software Foundation", np.getAuthors()); -50 assertEquals("Apache Software Foundation", np.getOwners()); -51 assertEquals("http://logging.apache.org/log4net/license.html", np.getLicenseUrl()); -52 } -53 -54 /** -55 * Expect a NuspecParseException when what we pass isn't even XML. -56 * -57 * @throws Exception we expect this. -58 */ -59 @Test(expected = NuspecParseException.class) -60 public void testMissingDocument() throws Exception { -61 NuspecParser parser = new XPathNuspecParser(); -62 //InputStream is = XPathNuspecParserTest.class.getClassLoader().getResourceAsStream("dependencycheck.properties"); -63 InputStream is = BaseTest.getResourceAsStream(this, "dependencycheck.properties"); -64 -65 //hide the fatal message from the core parser -66 final ByteArrayOutputStream myOut = new ByteArrayOutputStream(); -67 System.setErr(new PrintStream(myOut)); -68 -69 NugetPackage np = parser.parse(is); -70 } -71 -72 /** -73 * Expect a NuspecParseException when it's valid XML, but not a Nuspec. -74 * -75 * @throws Exception we expect this. -76 */ -77 @Test(expected = NuspecParseException.class) -78 public void testNotNuspec() throws Exception { -79 NuspecParser parser = new XPathNuspecParser(); -80 //InputStream is = XPathNuspecParserTest.class.getClassLoader().getResourceAsStream("suppressions.xml"); -81 InputStream is = BaseTest.getResourceAsStream(this, "suppressions.xml"); -82 NugetPackage np = parser.parse(is); -83 } -84 } +21 import java.io.InputStream; +22 import java.io.PrintStream; +23 import static org.junit.Assert.assertEquals; +24 import org.junit.Test; +25 import org.owasp.dependencycheck.BaseTest; +26 +27 /** +28 * +29 * @author colezlaw +30 * +31 */ +32 public class XPathNuspecParserTest extends BaseTest { +33 +34 /** +35 * Test all the valid components. +36 * +37 * @throws Exception if anything goes sideways. +38 */ +39 @Test +40 public void testGoodDocument() throws Exception { +41 NuspecParser parser = new XPathNuspecParser(); +42 //InputStream is = XPathNuspecParserTest.class.getClassLoader().getResourceAsStream("log4net.2.0.3.nuspec"); +43 InputStream is = BaseTest.getResourceAsStream(this, "log4net.2.0.3.nuspec"); +44 NugetPackage np = parser.parse(is); +45 assertEquals("log4net", np.getId()); +46 assertEquals("2.0.3", np.getVersion()); +47 assertEquals("log4net [1.2.13]", np.getTitle()); +48 assertEquals("Apache Software Foundation", np.getAuthors()); +49 assertEquals("Apache Software Foundation", np.getOwners()); +50 assertEquals("http://logging.apache.org/log4net/license.html", np.getLicenseUrl()); +51 } +52 +53 /** +54 * Expect a NuspecParseException when what we pass isn't even XML. +55 * +56 * @throws Exception we expect this. +57 */ +58 @Test(expected = NuspecParseException.class) +59 public void testMissingDocument() throws Exception { +60 NuspecParser parser = new XPathNuspecParser(); +61 //InputStream is = XPathNuspecParserTest.class.getClassLoader().getResourceAsStream("dependencycheck.properties"); +62 InputStream is = BaseTest.getResourceAsStream(this, "dependencycheck.properties"); +63 +64 //hide the fatal message from the core parser +65 final ByteArrayOutputStream myOut = new ByteArrayOutputStream(); +66 System.setErr(new PrintStream(myOut)); +67 +68 NugetPackage np = parser.parse(is); +69 } +70 +71 /** +72 * Expect a NuspecParseException when it's valid XML, but not a Nuspec. +73 * +74 * @throws Exception we expect this. +75 */ +76 @Test(expected = NuspecParseException.class) +77 public void testNotNuspec() throws Exception { +78 NuspecParser parser = new XPathNuspecParser(); +79 //InputStream is = XPathNuspecParserTest.class.getClassLoader().getResourceAsStream("suppressions.xml"); +80 InputStream is = BaseTest.getResourceAsStream(this, "suppressions.xml"); +81 NugetPackage np = parser.parse(is); +82 } +83 }
    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nuget/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nuget/package-frame.html index af1158741..f2b02f8a7 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nuget/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nuget/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.nuget + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.nuget diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nuget/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nuget/package-summary.html index 8bb24b61d..814999581 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nuget/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nuget/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.nuget + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.nuget diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nvdcve/CveDBIntegrationTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nvdcve/CveDBIntegrationTest.html index ddafb15eb..86cd991e1 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nvdcve/CveDBIntegrationTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nvdcve/CveDBIntegrationTest.html @@ -27,165 +27,166 @@ 19 20 import java.util.HashMap; 21 import java.util.List; -22 import java.util.Map.Entry; -23 import java.util.Set; -24 import org.junit.Assert; -25 import static org.junit.Assert.assertTrue; -26 import org.junit.Test; -27 import org.owasp.dependencycheck.dependency.Vulnerability; -28 import org.owasp.dependencycheck.dependency.VulnerableSoftware; -29 import org.owasp.dependencycheck.utils.DependencyVersion; -30 -31 /** -32 * -33 * @author Jeremy Long -34 */ -35 public class CveDBIntegrationTest extends BaseDBTestCase { -36 -37 /** -38 * Pretty useless tests of open, commit, and close methods, of class CveDB. -39 */ -40 @Test -41 public void testOpen() throws Exception { -42 CveDB instance = null; -43 try { -44 instance = new CveDB(); -45 instance.open(); -46 instance.commit(); -47 } finally { -48 if (instance != null) { -49 instance.close(); -50 } -51 } -52 } -53 -54 /** -55 * Test of getCPEs method, of class CveDB. -56 */ -57 @Test -58 public void testGetCPEs() throws Exception { -59 CveDB instance = null; -60 try { -61 instance = new CveDB(); -62 String vendor = "apache"; -63 String product = "struts"; -64 instance.open(); -65 Set<VulnerableSoftware> result = instance.getCPEs(vendor, product); -66 assertTrue(result.size() > 5); -67 } finally { -68 if (instance != null) { -69 instance.close(); -70 } -71 } -72 } -73 -74 /** -75 * Test of getVulnerabilities method, of class CveDB. -76 */ -77 @Test -78 public void testGetVulnerabilities() throws Exception { -79 String cpeStr = "cpe:/a:apache:struts:2.1.2"; -80 CveDB instance = null; -81 List<Vulnerability> results; -82 try { -83 instance = new CveDB(); -84 instance.open(); -85 results = instance.getVulnerabilities(cpeStr); -86 assertTrue(results.size() > 5); -87 cpeStr = "cpe:/a:jruby:jruby:1.6.3"; -88 results = instance.getVulnerabilities(cpeStr); -89 assertTrue(results.size() > 1); -90 -91 boolean found = false; -92 String expected = "CVE-2011-4838"; -93 for (Vulnerability v : results) { -94 if (expected.equals(v.getName())) { -95 found = true; -96 break; -97 } -98 } -99 assertTrue("Expected " + expected + ", but was not identified", found); -100 -101 found = false; -102 expected = "CVE-2012-5370"; -103 for (Vulnerability v : results) { -104 if (expected.equals(v.getName())) { -105 found = true; -106 break; -107 } -108 } -109 assertTrue("Expected " + expected + ", but was not identified", found); -110 -111 } finally { -112 if (instance != null) { -113 instance.close(); -114 } -115 } -116 } -117 -118 /** -119 * Test of getMatchingSoftware method, of class CveDB. -120 */ -121 @Test -122 public void testGetMatchingSoftware() throws Exception { -123 CveDB instance = null; -124 HashMap<String, Boolean> versions = new HashMap<String, Boolean>(); -125 DependencyVersion identifiedVersion = new DependencyVersion("1.0.1o"); -126 versions.put("cpe:/a:openssl:openssl:1.0.1e", Boolean.FALSE); -127 try { -128 instance = new CveDB(); -129 Entry<String, Boolean> results = instance.getMatchingSoftware(versions, "openssl", "openssl", identifiedVersion); -130 Assert.assertNull(results); -131 versions.put("cpe:/a:openssl:openssl:1.0.1p", Boolean.FALSE); -132 results = instance.getMatchingSoftware(versions, "openssl", "openssl", identifiedVersion); -133 Assert.assertNull(results); -134 -135 versions.put("cpe:/a:openssl:openssl:1.0.1q", Boolean.TRUE); -136 results = instance.getMatchingSoftware(versions, "openssl", "openssl", identifiedVersion); -137 Assert.assertNotNull(results); -138 Assert.assertEquals("cpe:/a:openssl:openssl:1.0.1q", results.getKey()); -139 -140 versions.clear(); -141 -142 versions.put("cpe:/a:springsource:spring_framework:3.2.5", Boolean.FALSE); -143 versions.put("cpe:/a:springsource:spring_framework:3.2.6", Boolean.FALSE); -144 versions.put("cpe:/a:springsource:spring_framework:3.2.7", Boolean.TRUE); -145 -146 versions.put("cpe:/a:springsource:spring_framework:4.0.1", Boolean.TRUE); -147 versions.put("cpe:/a:springsource:spring_framework:4.0.0:m1", Boolean.FALSE); -148 versions.put("cpe:/a:springsource:spring_framework:4.0.0:m2", Boolean.FALSE); -149 versions.put("cpe:/a:springsource:spring_framework:4.0.0:rc1", Boolean.FALSE); -150 -151 identifiedVersion = new DependencyVersion("3.2.2"); -152 results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion); -153 Assert.assertEquals("cpe:/a:springsource:spring_framework:3.2.7", results.getKey()); -154 Assert.assertTrue(results.getValue()); -155 identifiedVersion = new DependencyVersion("3.2.12"); -156 results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion); -157 Assert.assertNull(results); -158 -159 identifiedVersion = new DependencyVersion("4.0.0"); -160 results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion); -161 Assert.assertEquals("cpe:/a:springsource:spring_framework:4.0.1", results.getKey()); -162 Assert.assertTrue(results.getValue()); -163 identifiedVersion = new DependencyVersion("4.1.0"); -164 results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion); -165 Assert.assertNull(results); -166 -167 versions.clear(); -168 -169 versions.put("cpe:/a:jruby:jruby:-", Boolean.FALSE); -170 identifiedVersion = new DependencyVersion("1.6.3"); -171 results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion); -172 Assert.assertNotNull(results); -173 } finally { -174 if (instance != null) { -175 instance.close(); -176 } -177 } -178 } -179 -180 } +22 import java.util.Map; +23 import java.util.Map.Entry; +24 import java.util.Set; +25 import org.junit.Assert; +26 import static org.junit.Assert.assertTrue; +27 import org.junit.Test; +28 import org.owasp.dependencycheck.dependency.Vulnerability; +29 import org.owasp.dependencycheck.dependency.VulnerableSoftware; +30 import org.owasp.dependencycheck.utils.DependencyVersion; +31 +32 /** +33 * +34 * @author Jeremy Long +35 */ +36 public class CveDBIntegrationTest extends BaseDBTestCase { +37 +38 /** +39 * Pretty useless tests of open, commit, and close methods, of class CveDB. +40 */ +41 @Test +42 public void testOpen() throws Exception { +43 CveDB instance = null; +44 try { +45 instance = new CveDB(); +46 instance.open(); +47 instance.commit(); +48 } finally { +49 if (instance != null) { +50 instance.close(); +51 } +52 } +53 } +54 +55 /** +56 * Test of getCPEs method, of class CveDB. +57 */ +58 @Test +59 public void testGetCPEs() throws Exception { +60 CveDB instance = null; +61 try { +62 instance = new CveDB(); +63 String vendor = "apache"; +64 String product = "struts"; +65 instance.open(); +66 Set<VulnerableSoftware> result = instance.getCPEs(vendor, product); +67 assertTrue(result.size() > 5); +68 } finally { +69 if (instance != null) { +70 instance.close(); +71 } +72 } +73 } +74 +75 /** +76 * Test of getVulnerabilities method, of class CveDB. +77 */ +78 @Test +79 public void testGetVulnerabilities() throws Exception { +80 String cpeStr = "cpe:/a:apache:struts:2.1.2"; +81 CveDB instance = null; +82 List<Vulnerability> results; +83 try { +84 instance = new CveDB(); +85 instance.open(); +86 results = instance.getVulnerabilities(cpeStr); +87 assertTrue(results.size() > 5); +88 cpeStr = "cpe:/a:jruby:jruby:1.6.3"; +89 results = instance.getVulnerabilities(cpeStr); +90 assertTrue(results.size() > 1); +91 +92 boolean found = false; +93 String expected = "CVE-2011-4838"; +94 for (Vulnerability v : results) { +95 if (expected.equals(v.getName())) { +96 found = true; +97 break; +98 } +99 } +100 assertTrue("Expected " + expected + ", but was not identified", found); +101 +102 found = false; +103 expected = "CVE-2012-5370"; +104 for (Vulnerability v : results) { +105 if (expected.equals(v.getName())) { +106 found = true; +107 break; +108 } +109 } +110 assertTrue("Expected " + expected + ", but was not identified", found); +111 +112 } finally { +113 if (instance != null) { +114 instance.close(); +115 } +116 } +117 } +118 +119 /** +120 * Test of getMatchingSoftware method, of class CveDB. +121 */ +122 @Test +123 public void testGetMatchingSoftware() throws Exception { +124 CveDB instance = null; +125 Map<String, Boolean> versions = new HashMap<String, Boolean>(); +126 DependencyVersion identifiedVersion = new DependencyVersion("1.0.1o"); +127 versions.put("cpe:/a:openssl:openssl:1.0.1e", Boolean.FALSE); +128 try { +129 instance = new CveDB(); +130 Entry<String, Boolean> results = instance.getMatchingSoftware(versions, "openssl", "openssl", identifiedVersion); +131 Assert.assertNull(results); +132 versions.put("cpe:/a:openssl:openssl:1.0.1p", Boolean.FALSE); +133 results = instance.getMatchingSoftware(versions, "openssl", "openssl", identifiedVersion); +134 Assert.assertNull(results); +135 +136 versions.put("cpe:/a:openssl:openssl:1.0.1q", Boolean.TRUE); +137 results = instance.getMatchingSoftware(versions, "openssl", "openssl", identifiedVersion); +138 Assert.assertNotNull(results); +139 Assert.assertEquals("cpe:/a:openssl:openssl:1.0.1q", results.getKey()); +140 +141 versions.clear(); +142 +143 versions.put("cpe:/a:springsource:spring_framework:3.2.5", Boolean.FALSE); +144 versions.put("cpe:/a:springsource:spring_framework:3.2.6", Boolean.FALSE); +145 versions.put("cpe:/a:springsource:spring_framework:3.2.7", Boolean.TRUE); +146 +147 versions.put("cpe:/a:springsource:spring_framework:4.0.1", Boolean.TRUE); +148 versions.put("cpe:/a:springsource:spring_framework:4.0.0:m1", Boolean.FALSE); +149 versions.put("cpe:/a:springsource:spring_framework:4.0.0:m2", Boolean.FALSE); +150 versions.put("cpe:/a:springsource:spring_framework:4.0.0:rc1", Boolean.FALSE); +151 +152 identifiedVersion = new DependencyVersion("3.2.2"); +153 results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion); +154 Assert.assertEquals("cpe:/a:springsource:spring_framework:3.2.7", results.getKey()); +155 Assert.assertTrue(results.getValue()); +156 identifiedVersion = new DependencyVersion("3.2.12"); +157 results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion); +158 Assert.assertNull(results); +159 +160 identifiedVersion = new DependencyVersion("4.0.0"); +161 results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion); +162 Assert.assertEquals("cpe:/a:springsource:spring_framework:4.0.1", results.getKey()); +163 Assert.assertTrue(results.getValue()); +164 identifiedVersion = new DependencyVersion("4.1.0"); +165 results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion); +166 Assert.assertNull(results); +167 +168 versions.clear(); +169 +170 versions.put("cpe:/a:jruby:jruby:-", Boolean.FALSE); +171 identifiedVersion = new DependencyVersion("1.6.3"); +172 results = instance.getMatchingSoftware(versions, "springsource", "spring_framework", identifiedVersion); +173 Assert.assertNotNull(results); +174 } finally { +175 if (instance != null) { +176 instance.close(); +177 } +178 } +179 } +180 +181 }
    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nvdcve/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nvdcve/package-frame.html index 019c2d20f..9b7c40910 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nvdcve/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nvdcve/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.nvdcve + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.nvdcve diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nvdcve/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nvdcve/package-summary.html index 2bcd4116a..197d8a6c4 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nvdcve/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/nvdcve/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.nvdcve + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.nvdcve diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/CpeUpdaterIntegrationTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/CpeUpdaterIntegrationTest.html index 0d09b25d3..3a2f1691a 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/CpeUpdaterIntegrationTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/CpeUpdaterIntegrationTest.html @@ -7,48 +7,45 @@
     1   /*
    -2    * Copyright 2015 OWASP.
    +2    * This file is part of dependency-check-core.
     3    *
     4    * Licensed under the Apache License, Version 2.0 (the "License");
     5    * you may not use this file except in compliance with the License.
     6    * You may obtain a copy of the License at
     7    *
    -8    *      http://www.apache.org/licenses/LICENSE-2.0
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
     9    *
     10   * Unless required by applicable law or agreed to in writing, software
     11   * distributed under the License is distributed on an "AS IS" BASIS,
     12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13   * See the License for the specific language governing permissions and
     14   * limitations under the License.
    -15   */
    -16  package org.owasp.dependencycheck.data.update;
    -17  
    -18  import org.junit.After;
    -19  import org.junit.AfterClass;
    -20  import org.junit.Before;
    -21  import org.junit.BeforeClass;
    -22  import org.junit.Test;
    -23  import static org.junit.Assert.*;
    -24  import org.owasp.dependencycheck.BaseTest;
    -25  
    -26  /**
    -27   *
    -28   * @author jeremy
    -29   */
    -30  public class CpeUpdaterIntegrationTest extends BaseTest {
    -31  
    -32      /**
    -33       * Test of update method, of class CpeUpdater.
    -34       */
    -35      @Test
    -36      public void testUpdate() throws Exception {
    -37          //commented out as the current code base does not utilize the CpeU[pdater.
    -38  
    -39  //        CpeUpdater instance = new CpeUpdater();
    -40  //        instance.update();
    -41      }
    -42  
    -43  }
    +15   *
    +16   * Copyright (c) 2015 The OWASP Foundatio. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.data.update;
    +19  
    +20  import org.junit.Test;
    +21  import org.owasp.dependencycheck.BaseTest;
    +22  
    +23  /**
    +24   *
    +25   * @author jeremy
    +26   */
    +27  public class CpeUpdaterIntegrationTest extends BaseTest {
    +28  
    +29      /**
    +30       * Test of update method, of class CpeUpdater.
    +31       */
    +32      @Test
    +33      public void testUpdate() throws Exception {
    +34          //commented out as the current code base does not utilize the CpeU[pdater.
    +35  
    +36  //        CpeUpdater instance = new CpeUpdater();
    +37  //        instance.update();
    +38      }
    +39  
    +40  }
     

    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/nvd/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/nvd/package-frame.html index 158e41b78..fee06151f 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/nvd/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/nvd/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.update.nvd + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.update.nvd diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/nvd/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/nvd/package-summary.html index 66f743979..c2d2d9ce6 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/nvd/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/nvd/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.update.nvd + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.update.nvd diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/package-frame.html index b9ac9a36b..e3d49fe80 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.update + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.update diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/package-summary.html index 0dc62b971..d0aa57ffb 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/data/update/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.update + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.update diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/dependency/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/dependency/package-frame.html index 50478956c..16f19aa27 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/dependency/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/dependency/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.dependency + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.dependency diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/dependency/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/dependency/package-summary.html index 9ca867445..d51b4d833 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/dependency/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/dependency/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.dependency + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.dependency diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/package-frame.html index f93fefcd0..03fc34f71 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/package-summary.html index bced1de2a..1b88397b6 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/reporting/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/reporting/package-frame.html index 69c8a9afe..ae2733607 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/reporting/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/reporting/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.reporting + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.reporting diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/reporting/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/reporting/package-summary.html index c3c12477d..ab6ce8f23 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/reporting/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/reporting/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.reporting + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.reporting diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/suppression/SuppressionRuleTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/suppression/SuppressionRuleTest.html index 1fcde4ecc..8ba5311e9 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/suppression/SuppressionRuleTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/suppression/SuppressionRuleTest.html @@ -28,530 +28,507 @@ 20 import java.io.File; 21 import java.util.ArrayList; 22 import java.util.List; -23 import org.junit.After; -24 import org.junit.AfterClass; -25 import static org.junit.Assert.assertEquals; -26 import static org.junit.Assert.assertFalse; -27 import static org.junit.Assert.assertTrue; -28 import org.junit.Before; -29 import org.junit.BeforeClass; -30 import org.junit.Test; -31 import org.owasp.dependencycheck.BaseTest; -32 import org.owasp.dependencycheck.dependency.Dependency; -33 import org.owasp.dependencycheck.dependency.Identifier; -34 import org.owasp.dependencycheck.dependency.Vulnerability; -35 -36 /** -37 * Test of the suppression rule. -38 * -39 * @author Jeremy Long -40 */ -41 public class SuppressionRuleTest { -42 -43 public SuppressionRuleTest() { -44 } -45 -46 @BeforeClass -47 public static void setUpClass() { -48 } -49 -50 @AfterClass -51 public static void tearDownClass() { -52 } -53 -54 @Before -55 public void setUp() { -56 } -57 -58 @After -59 public void tearDown() { -60 } -61 -62 //<editor-fold defaultstate="collapsed" desc="Stupid tests of properties"> -63 /** -64 * Test of FilePath property, of class SuppressionRule. -65 */ -66 @Test -67 public void testFilePath() { -68 SuppressionRule instance = new SuppressionRule(); -69 PropertyType expResult = new PropertyType(); -70 expResult.setValue("test"); -71 instance.setFilePath(expResult); -72 PropertyType result = instance.getFilePath(); -73 assertEquals(expResult, result); -74 } -75 -76 /** -77 * Test of Sha1 property, of class SuppressionRule. -78 */ -79 @Test -80 public void testSha1() { -81 SuppressionRule instance = new SuppressionRule(); -82 String expResult = "384FAA82E193D4E4B0546059CA09572654BC3970"; -83 instance.setSha1(expResult); -84 String result = instance.getSha1(); -85 assertEquals(expResult, result); -86 } -87 -88 /** -89 * Test of Cpe property, of class SuppressionRule. -90 */ -91 @Test -92 public void testCpe() { -93 SuppressionRule instance = new SuppressionRule(); -94 ArrayList<PropertyType> cpe = new ArrayList<PropertyType>(); -95 instance.setCpe(cpe); -96 assertFalse(instance.hasCpe()); -97 PropertyType pt = new PropertyType(); -98 pt.setValue("one"); -99 instance.addCpe(pt); -100 assertTrue(instance.hasCpe()); -101 List<PropertyType> result = instance.getCpe(); -102 assertEquals(cpe, result); -103 -104 } -105 -106 /** -107 * Test of CvssBelow property, of class SuppressionRule. -108 */ -109 @Test -110 public void testGetCvssBelow() { -111 SuppressionRule instance = new SuppressionRule(); -112 ArrayList<Float> cvss = new ArrayList<Float>(); -113 instance.setCvssBelow(cvss); -114 assertFalse(instance.hasCvssBelow()); -115 instance.addCvssBelow(0.7f); -116 assertTrue(instance.hasCvssBelow()); -117 List<Float> result = instance.getCvssBelow(); -118 assertEquals(cvss, result); -119 } -120 -121 /** -122 * Test of Cwe property, of class SuppressionRule. -123 */ -124 @Test -125 public void testCwe() { -126 SuppressionRule instance = new SuppressionRule(); -127 ArrayList<String> cwe = new ArrayList<String>(); -128 instance.setCwe(cwe); -129 assertFalse(instance.hasCwe()); -130 instance.addCwe("2"); -131 assertTrue(instance.hasCwe()); -132 List<String> result = instance.getCwe(); -133 assertEquals(cwe, result); -134 } -135 -136 /** -137 * Test of Cve property, of class SuppressionRule. -138 */ -139 @Test -140 public void testCve() { -141 SuppressionRule instance = new SuppressionRule(); -142 ArrayList<String> cve = new ArrayList<String>(); -143 instance.setCve(cve); -144 assertFalse(instance.hasCve()); -145 instance.addCve("CVE-2013-1337"); -146 assertTrue(instance.hasCve()); -147 List<String> result = instance.getCve(); -148 assertEquals(cve, result); -149 } -150 -151 /** -152 * Test of base property, of class SuppressionRule. -153 */ -154 @Test -155 public void testBase() { -156 SuppressionRule instance = new SuppressionRule(); -157 assertFalse(instance.isBase()); -158 instance.setBase(true); -159 assertTrue(instance.isBase()); -160 } -161 //</editor-fold> -162 -163 //<editor-fold defaultstate="collapsed" desc="Ignored duplicate tests, left in, as empty tests, so IDE doesn't re-generate them"> -164 /** -165 * Test of getFilePath method, of class SuppressionRule. -166 */ -167 @Test -168 public void testGetFilePath() { -169 //already tested, this is just left so the IDE doesn't recreate it. -170 } -171 -172 /** -173 * Test of setFilePath method, of class SuppressionRule. -174 */ -175 @Test -176 public void testSetFilePath() { -177 //already tested, this is just left so the IDE doesn't recreate it. -178 } -179 -180 /** -181 * Test of getSha1 method, of class SuppressionRule. -182 */ -183 @Test -184 public void testGetSha1() { -185 //already tested, this is just left so the IDE doesn't recreate it. -186 } -187 -188 /** -189 * Test of setSha1 method, of class SuppressionRule. -190 */ -191 @Test -192 public void testSetSha1() { -193 //already tested, this is just left so the IDE doesn't recreate it. -194 } -195 -196 /** -197 * Test of getCpe method, of class SuppressionRule. -198 */ -199 @Test -200 public void testGetCpe() { -201 //already tested, this is just left so the IDE doesn't recreate it. -202 } -203 -204 /** -205 * Test of setCpe method, of class SuppressionRule. -206 */ -207 @Test -208 public void testSetCpe() { -209 //already tested, this is just left so the IDE doesn't recreate it. -210 } -211 -212 /** -213 * Test of addCpe method, of class SuppressionRule. -214 */ -215 @Test -216 public void testAddCpe() { -217 //already tested, this is just left so the IDE doesn't recreate it. -218 } -219 -220 /** -221 * Test of hasCpe method, of class SuppressionRule. -222 */ -223 @Test -224 public void testHasCpe() { -225 //already tested, this is just left so the IDE doesn't recreate it. -226 } -227 -228 /** -229 * Test of setCvssBelow method, of class SuppressionRule. -230 */ -231 @Test -232 public void testSetCvssBelow() { -233 //already tested, this is just left so the IDE doesn't recreate it. -234 } -235 -236 /** -237 * Test of addCvssBelow method, of class SuppressionRule. -238 */ -239 @Test -240 public void testAddCvssBelow() { -241 //already tested, this is just left so the IDE doesn't recreate it. -242 } -243 -244 /** -245 * Test of hasCvssBelow method, of class SuppressionRule. -246 */ -247 @Test -248 public void testHasCvssBelow() { -249 //already tested, this is just left so the IDE doesn't recreate it. -250 } -251 -252 /** -253 * Test of getCwe method, of class SuppressionRule. -254 */ -255 @Test -256 public void testGetCwe() { -257 //already tested, this is just left so the IDE doesn't recreate it. -258 } -259 -260 /** -261 * Test of setCwe method, of class SuppressionRule. -262 */ -263 @Test -264 public void testSetCwe() { -265 //already tested, this is just left so the IDE doesn't recreate it. -266 } -267 -268 /** -269 * Test of addCwe method, of class SuppressionRule. -270 */ -271 @Test -272 public void testAddCwe() { -273 //already tested, this is just left so the IDE doesn't recreate it. -274 } -275 -276 /** -277 * Test of hasCwe method, of class SuppressionRule. -278 */ -279 @Test -280 public void testHasCwe() { -281 //already tested, this is just left so the IDE doesn't recreate it. -282 } -283 -284 /** -285 * Test of getCve method, of class SuppressionRule. -286 */ -287 @Test -288 public void testGetCve() { -289 //already tested, this is just left so the IDE doesn't recreate it. -290 } -291 -292 /** -293 * Test of setCve method, of class SuppressionRule. -294 */ -295 @Test -296 public void testSetCve() { -297 //already tested, this is just left so the IDE doesn't recreate it. -298 } -299 -300 /** -301 * Test of addCve method, of class SuppressionRule. -302 */ -303 @Test -304 public void testAddCve() { -305 //already tested, this is just left so the IDE doesn't recreate it. -306 } -307 -308 /** -309 * Test of hasCve method, of class SuppressionRule. -310 */ -311 @Test -312 public void testHasCve() { -313 //already tested, this is just left so the IDE doesn't recreate it. -314 } -315 //</editor-fold> -316 -317 /** -318 * Test of cpeHasNoVersion method, of class SuppressionRule. -319 */ -320 @Test -321 public void testCpeHasNoVersion() { -322 PropertyType c = new PropertyType(); -323 c.setValue("cpe:/a:microsoft:.net_framework:4.5"); -324 SuppressionRule instance = new SuppressionRule(); -325 assertFalse(instance.cpeHasNoVersion(c)); -326 c.setValue("cpe:/a:microsoft:.net_framework:"); -327 assertFalse(instance.cpeHasNoVersion(c)); -328 c.setValue("cpe:/a:microsoft:.net_framework"); -329 assertTrue(instance.cpeHasNoVersion(c)); -330 } -331 -332 /** -333 * Test of countCharacter method, of class SuppressionRule. -334 */ -335 @Test -336 public void testCountCharacter() { -337 String str = "cpe:/a:microsoft:.net_framework:4.5"; -338 char c = ':'; -339 SuppressionRule instance = new SuppressionRule(); -340 int expResult = 4; -341 int result = instance.countCharacter(str, c); -342 assertEquals(expResult, result); -343 str = "::"; -344 expResult = 2; -345 result = instance.countCharacter(str, c); -346 assertEquals(expResult, result); -347 str = "these are not the characters you are looking for"; -348 expResult = 0; -349 result = instance.countCharacter(str, c); -350 assertEquals(expResult, result); -351 } -352 -353 /** -354 * Test of identifierMatches method, of class SuppressionRule. -355 */ -356 @Test -357 public void testCpeMatches() { -358 Identifier identifier = new Identifier("cpe", "cpe:/a:microsoft:.net_framework:4.5", "some url not needed for this test"); -359 -360 PropertyType cpe = new PropertyType(); -361 cpe.setValue("cpe:/a:microsoft:.net_framework:4.5"); -362 -363 SuppressionRule instance = new SuppressionRule(); -364 boolean expResult = true; -365 boolean result = instance.identifierMatches("cpe", cpe, identifier); +23 import static org.junit.Assert.assertEquals; +24 import static org.junit.Assert.assertFalse; +25 import static org.junit.Assert.assertTrue; +26 import org.junit.Test; +27 import org.owasp.dependencycheck.BaseTest; +28 import org.owasp.dependencycheck.dependency.Dependency; +29 import org.owasp.dependencycheck.dependency.Identifier; +30 import org.owasp.dependencycheck.dependency.Vulnerability; +31 +32 /** +33 * Test of the suppression rule. +34 * +35 * @author Jeremy Long +36 */ +37 public class SuppressionRuleTest { +38 +39 //<editor-fold defaultstate="collapsed" desc="Stupid tests of properties"> +40 /** +41 * Test of FilePath property, of class SuppressionRule. +42 */ +43 @Test +44 public void testFilePath() { +45 SuppressionRule instance = new SuppressionRule(); +46 PropertyType expResult = new PropertyType(); +47 expResult.setValue("test"); +48 instance.setFilePath(expResult); +49 PropertyType result = instance.getFilePath(); +50 assertEquals(expResult, result); +51 } +52 +53 /** +54 * Test of Sha1 property, of class SuppressionRule. +55 */ +56 @Test +57 public void testSha1() { +58 SuppressionRule instance = new SuppressionRule(); +59 String expResult = "384FAA82E193D4E4B0546059CA09572654BC3970"; +60 instance.setSha1(expResult); +61 String result = instance.getSha1(); +62 assertEquals(expResult, result); +63 } +64 +65 /** +66 * Test of Cpe property, of class SuppressionRule. +67 */ +68 @Test +69 public void testCpe() { +70 SuppressionRule instance = new SuppressionRule(); +71 List<PropertyType> cpe = new ArrayList<PropertyType>(); +72 instance.setCpe(cpe); +73 assertFalse(instance.hasCpe()); +74 PropertyType pt = new PropertyType(); +75 pt.setValue("one"); +76 instance.addCpe(pt); +77 assertTrue(instance.hasCpe()); +78 List<PropertyType> result = instance.getCpe(); +79 assertEquals(cpe, result); +80 +81 } +82 +83 /** +84 * Test of CvssBelow property, of class SuppressionRule. +85 */ +86 @Test +87 public void testGetCvssBelow() { +88 SuppressionRule instance = new SuppressionRule(); +89 List<Float> cvss = new ArrayList<Float>(); +90 instance.setCvssBelow(cvss); +91 assertFalse(instance.hasCvssBelow()); +92 instance.addCvssBelow(0.7f); +93 assertTrue(instance.hasCvssBelow()); +94 List<Float> result = instance.getCvssBelow(); +95 assertEquals(cvss, result); +96 } +97 +98 /** +99 * Test of Cwe property, of class SuppressionRule. +100 */ +101 @Test +102 public void testCwe() { +103 SuppressionRule instance = new SuppressionRule(); +104 List<String> cwe = new ArrayList<String>(); +105 instance.setCwe(cwe); +106 assertFalse(instance.hasCwe()); +107 instance.addCwe("2"); +108 assertTrue(instance.hasCwe()); +109 List<String> result = instance.getCwe(); +110 assertEquals(cwe, result); +111 } +112 +113 /** +114 * Test of Cve property, of class SuppressionRule. +115 */ +116 @Test +117 public void testCve() { +118 SuppressionRule instance = new SuppressionRule(); +119 List<String> cve = new ArrayList<String>(); +120 instance.setCve(cve); +121 assertFalse(instance.hasCve()); +122 instance.addCve("CVE-2013-1337"); +123 assertTrue(instance.hasCve()); +124 List<String> result = instance.getCve(); +125 assertEquals(cve, result); +126 } +127 +128 /** +129 * Test of base property, of class SuppressionRule. +130 */ +131 @Test +132 public void testBase() { +133 SuppressionRule instance = new SuppressionRule(); +134 assertFalse(instance.isBase()); +135 instance.setBase(true); +136 assertTrue(instance.isBase()); +137 } +138 //</editor-fold> +139 +140 //<editor-fold defaultstate="collapsed" desc="Ignored duplicate tests, left in, as empty tests, so IDE doesn't re-generate them"> +141 /** +142 * Test of getFilePath method, of class SuppressionRule. +143 */ +144 @Test +145 public void testGetFilePath() { +146 //already tested, this is just left so the IDE doesn't recreate it. +147 } +148 +149 /** +150 * Test of setFilePath method, of class SuppressionRule. +151 */ +152 @Test +153 public void testSetFilePath() { +154 //already tested, this is just left so the IDE doesn't recreate it. +155 } +156 +157 /** +158 * Test of getSha1 method, of class SuppressionRule. +159 */ +160 @Test +161 public void testGetSha1() { +162 //already tested, this is just left so the IDE doesn't recreate it. +163 } +164 +165 /** +166 * Test of setSha1 method, of class SuppressionRule. +167 */ +168 @Test +169 public void testSetSha1() { +170 //already tested, this is just left so the IDE doesn't recreate it. +171 } +172 +173 /** +174 * Test of getCpe method, of class SuppressionRule. +175 */ +176 @Test +177 public void testGetCpe() { +178 //already tested, this is just left so the IDE doesn't recreate it. +179 } +180 +181 /** +182 * Test of setCpe method, of class SuppressionRule. +183 */ +184 @Test +185 public void testSetCpe() { +186 //already tested, this is just left so the IDE doesn't recreate it. +187 } +188 +189 /** +190 * Test of addCpe method, of class SuppressionRule. +191 */ +192 @Test +193 public void testAddCpe() { +194 //already tested, this is just left so the IDE doesn't recreate it. +195 } +196 +197 /** +198 * Test of hasCpe method, of class SuppressionRule. +199 */ +200 @Test +201 public void testHasCpe() { +202 //already tested, this is just left so the IDE doesn't recreate it. +203 } +204 +205 /** +206 * Test of setCvssBelow method, of class SuppressionRule. +207 */ +208 @Test +209 public void testSetCvssBelow() { +210 //already tested, this is just left so the IDE doesn't recreate it. +211 } +212 +213 /** +214 * Test of addCvssBelow method, of class SuppressionRule. +215 */ +216 @Test +217 public void testAddCvssBelow() { +218 //already tested, this is just left so the IDE doesn't recreate it. +219 } +220 +221 /** +222 * Test of hasCvssBelow method, of class SuppressionRule. +223 */ +224 @Test +225 public void testHasCvssBelow() { +226 //already tested, this is just left so the IDE doesn't recreate it. +227 } +228 +229 /** +230 * Test of getCwe method, of class SuppressionRule. +231 */ +232 @Test +233 public void testGetCwe() { +234 //already tested, this is just left so the IDE doesn't recreate it. +235 } +236 +237 /** +238 * Test of setCwe method, of class SuppressionRule. +239 */ +240 @Test +241 public void testSetCwe() { +242 //already tested, this is just left so the IDE doesn't recreate it. +243 } +244 +245 /** +246 * Test of addCwe method, of class SuppressionRule. +247 */ +248 @Test +249 public void testAddCwe() { +250 //already tested, this is just left so the IDE doesn't recreate it. +251 } +252 +253 /** +254 * Test of hasCwe method, of class SuppressionRule. +255 */ +256 @Test +257 public void testHasCwe() { +258 //already tested, this is just left so the IDE doesn't recreate it. +259 } +260 +261 /** +262 * Test of getCve method, of class SuppressionRule. +263 */ +264 @Test +265 public void testGetCve() { +266 //already tested, this is just left so the IDE doesn't recreate it. +267 } +268 +269 /** +270 * Test of setCve method, of class SuppressionRule. +271 */ +272 @Test +273 public void testSetCve() { +274 //already tested, this is just left so the IDE doesn't recreate it. +275 } +276 +277 /** +278 * Test of addCve method, of class SuppressionRule. +279 */ +280 @Test +281 public void testAddCve() { +282 //already tested, this is just left so the IDE doesn't recreate it. +283 } +284 +285 /** +286 * Test of hasCve method, of class SuppressionRule. +287 */ +288 @Test +289 public void testHasCve() { +290 //already tested, this is just left so the IDE doesn't recreate it. +291 } +292 //</editor-fold> +293 +294 /** +295 * Test of cpeHasNoVersion method, of class SuppressionRule. +296 */ +297 @Test +298 public void testCpeHasNoVersion() { +299 PropertyType c = new PropertyType(); +300 c.setValue("cpe:/a:microsoft:.net_framework:4.5"); +301 SuppressionRule instance = new SuppressionRule(); +302 assertFalse(instance.cpeHasNoVersion(c)); +303 c.setValue("cpe:/a:microsoft:.net_framework:"); +304 assertFalse(instance.cpeHasNoVersion(c)); +305 c.setValue("cpe:/a:microsoft:.net_framework"); +306 assertTrue(instance.cpeHasNoVersion(c)); +307 } +308 +309 /** +310 * Test of countCharacter method, of class SuppressionRule. +311 */ +312 @Test +313 public void testCountCharacter() { +314 String str = "cpe:/a:microsoft:.net_framework:4.5"; +315 char c = ':'; +316 SuppressionRule instance = new SuppressionRule(); +317 int expResult = 4; +318 int result = instance.countCharacter(str, c); +319 assertEquals(expResult, result); +320 str = "::"; +321 expResult = 2; +322 result = instance.countCharacter(str, c); +323 assertEquals(expResult, result); +324 str = "these are not the characters you are looking for"; +325 expResult = 0; +326 result = instance.countCharacter(str, c); +327 assertEquals(expResult, result); +328 } +329 +330 /** +331 * Test of identifierMatches method, of class SuppressionRule. +332 */ +333 @Test +334 public void testCpeMatches() { +335 Identifier identifier = new Identifier("cpe", "cpe:/a:microsoft:.net_framework:4.5", "some url not needed for this test"); +336 +337 PropertyType cpe = new PropertyType(); +338 cpe.setValue("cpe:/a:microsoft:.net_framework:4.5"); +339 +340 SuppressionRule instance = new SuppressionRule(); +341 boolean expResult = true; +342 boolean result = instance.identifierMatches("cpe", cpe, identifier); +343 assertEquals(expResult, result); +344 +345 cpe.setValue("cpe:/a:microsoft:.net_framework:4.0"); +346 expResult = false; +347 result = instance.identifierMatches("cpe", cpe, identifier); +348 assertEquals(expResult, result); +349 +350 cpe.setValue("CPE:/a:microsoft:.net_framework:4.5"); +351 cpe.setCaseSensitive(true); +352 expResult = false; +353 result = instance.identifierMatches("cpe", cpe, identifier); +354 assertEquals(expResult, result); +355 +356 cpe.setValue("cpe:/a:microsoft:.net_framework"); +357 cpe.setCaseSensitive(false); +358 expResult = true; +359 result = instance.identifierMatches("cpe", cpe, identifier); +360 assertEquals(expResult, result); +361 +362 cpe.setValue("cpe:/a:microsoft:.*"); +363 cpe.setRegex(true); +364 expResult = true; +365 result = instance.identifierMatches("cpe", cpe, identifier); 366 assertEquals(expResult, result); 367 -368 cpe.setValue("cpe:/a:microsoft:.net_framework:4.0"); -369 expResult = false; -370 result = instance.identifierMatches("cpe", cpe, identifier); -371 assertEquals(expResult, result); -372 -373 cpe.setValue("CPE:/a:microsoft:.net_framework:4.5"); -374 cpe.setCaseSensitive(true); -375 expResult = false; -376 result = instance.identifierMatches("cpe", cpe, identifier); -377 assertEquals(expResult, result); -378 -379 cpe.setValue("cpe:/a:microsoft:.net_framework"); -380 cpe.setCaseSensitive(false); -381 expResult = true; -382 result = instance.identifierMatches("cpe", cpe, identifier); -383 assertEquals(expResult, result); -384 -385 cpe.setValue("cpe:/a:microsoft:.*"); -386 cpe.setRegex(true); -387 expResult = true; -388 result = instance.identifierMatches("cpe", cpe, identifier); -389 assertEquals(expResult, result); -390 -391 cpe.setValue("CPE:/a:microsoft:.*"); -392 cpe.setRegex(true); -393 cpe.setCaseSensitive(true); -394 expResult = false; -395 result = instance.identifierMatches("cpe", cpe, identifier); -396 assertEquals(expResult, result); +368 cpe.setValue("CPE:/a:microsoft:.*"); +369 cpe.setRegex(true); +370 cpe.setCaseSensitive(true); +371 expResult = false; +372 result = instance.identifierMatches("cpe", cpe, identifier); +373 assertEquals(expResult, result); +374 +375 cpe.setValue("cpe:/a:apache:.*"); +376 cpe.setRegex(true); +377 cpe.setCaseSensitive(false); +378 expResult = false; +379 result = instance.identifierMatches("cpe", cpe, identifier); +380 assertEquals(expResult, result); +381 +382 identifier = new Identifier("maven", "org.springframework:spring-core:2.5.5", "https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.springframework&a=spring-core&v=2.5.5&e=jar"); +383 cpe.setValue("org.springframework:spring-core:2.5.5"); +384 cpe.setRegex(false); +385 cpe.setCaseSensitive(false); +386 expResult = true; +387 result = instance.identifierMatches("maven", cpe, identifier); +388 assertEquals(expResult, result); +389 +390 cpe.setValue("org\\.springframework\\.security:spring.*"); +391 cpe.setRegex(true); +392 cpe.setCaseSensitive(false); +393 expResult = false; +394 result = instance.identifierMatches("maven", cpe, identifier); +395 assertEquals(expResult, result); +396 } 397 -398 cpe.setValue("cpe:/a:apache:.*"); -399 cpe.setRegex(true); -400 cpe.setCaseSensitive(false); -401 expResult = false; -402 result = instance.identifierMatches("cpe", cpe, identifier); -403 assertEquals(expResult, result); -404 -405 identifier = new Identifier("maven", "org.springframework:spring-core:2.5.5", "https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.springframework&a=spring-core&v=2.5.5&e=jar"); -406 cpe.setValue("org.springframework:spring-core:2.5.5"); -407 cpe.setRegex(false); -408 cpe.setCaseSensitive(false); -409 expResult = true; -410 result = instance.identifierMatches("maven", cpe, identifier); -411 assertEquals(expResult, result); -412 -413 cpe.setValue("org\\.springframework\\.security:spring.*"); -414 cpe.setRegex(true); -415 cpe.setCaseSensitive(false); -416 expResult = false; -417 result = instance.identifierMatches("maven", cpe, identifier); -418 assertEquals(expResult, result); -419 } -420 -421 /** -422 * Test of process method, of class SuppressionRule. -423 */ -424 @Test -425 public void testProcess() { -426 //File struts = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath()); -427 File struts = BaseTest.getResourceAsFile(this, "struts2-core-2.1.2.jar"); -428 Dependency dependency = new Dependency(struts); -429 dependency.addIdentifier("cpe", "cpe:/a:microsoft:.net_framework:4.5", "some url not needed for this test"); -430 String sha1 = dependency.getSha1sum(); -431 dependency.setSha1sum("384FAA82E193D4E4B0546059CA09572654BC3970"); -432 Vulnerability v = createVulnerability(); -433 dependency.addVulnerability(v); -434 -435 //cwe -436 SuppressionRule instance = new SuppressionRule(); -437 instance.setSha1(sha1); -438 instance.addCwe("287"); -439 instance.process(dependency); -440 assertEquals(1, dependency.getVulnerabilities().size()); -441 dependency.setSha1sum(sha1); -442 instance.process(dependency); -443 assertTrue(dependency.getVulnerabilities().isEmpty()); -444 assertEquals(1, dependency.getSuppressedVulnerabilities().size()); -445 -446 //cvss -447 dependency.addVulnerability(v); -448 instance = new SuppressionRule(); -449 instance.addCvssBelow(5f); +398 /** +399 * Test of process method, of class SuppressionRule. +400 */ +401 @Test +402 public void testProcess() { +403 //File struts = new File(this.getClass().getClassLoader().getResource("struts2-core-2.1.2.jar").getPath()); +404 File struts = BaseTest.getResourceAsFile(this, "struts2-core-2.1.2.jar"); +405 Dependency dependency = new Dependency(struts); +406 dependency.addIdentifier("cpe", "cpe:/a:microsoft:.net_framework:4.5", "some url not needed for this test"); +407 String sha1 = dependency.getSha1sum(); +408 dependency.setSha1sum("384FAA82E193D4E4B0546059CA09572654BC3970"); +409 Vulnerability v = createVulnerability(); +410 dependency.addVulnerability(v); +411 +412 //cwe +413 SuppressionRule instance = new SuppressionRule(); +414 instance.setSha1(sha1); +415 instance.addCwe("287"); +416 instance.process(dependency); +417 assertEquals(1, dependency.getVulnerabilities().size()); +418 dependency.setSha1sum(sha1); +419 instance.process(dependency); +420 assertTrue(dependency.getVulnerabilities().isEmpty()); +421 assertEquals(1, dependency.getSuppressedVulnerabilities().size()); +422 +423 //cvss +424 dependency.addVulnerability(v); +425 instance = new SuppressionRule(); +426 instance.addCvssBelow(5f); +427 instance.process(dependency); +428 assertEquals(1, dependency.getVulnerabilities().size()); +429 instance.addCvssBelow(8f); +430 instance.process(dependency); +431 assertTrue(dependency.getVulnerabilities().isEmpty()); +432 assertEquals(1, dependency.getSuppressedVulnerabilities().size()); +433 +434 //cve +435 dependency.addVulnerability(v); +436 instance = new SuppressionRule(); +437 instance.addCve("CVE-2012-1337"); +438 instance.process(dependency); +439 assertEquals(1, dependency.getVulnerabilities().size()); +440 instance.addCve("CVE-2013-1337"); +441 instance.process(dependency); +442 assertTrue(dependency.getVulnerabilities().isEmpty()); +443 assertEquals(1, dependency.getSuppressedVulnerabilities().size()); +444 +445 //cpe +446 instance = new SuppressionRule(); +447 PropertyType pt = new PropertyType(); +448 pt.setValue("cpe:/a:microsoft:.net_framework:4.0"); +449 instance.addCpe(pt); 450 instance.process(dependency); -451 assertEquals(1, dependency.getVulnerabilities().size()); -452 instance.addCvssBelow(8f); -453 instance.process(dependency); -454 assertTrue(dependency.getVulnerabilities().isEmpty()); -455 assertEquals(1, dependency.getSuppressedVulnerabilities().size()); -456 -457 //cve -458 dependency.addVulnerability(v); -459 instance = new SuppressionRule(); -460 instance.addCve("CVE-2012-1337"); -461 instance.process(dependency); -462 assertEquals(1, dependency.getVulnerabilities().size()); -463 instance.addCve("CVE-2013-1337"); -464 instance.process(dependency); -465 assertTrue(dependency.getVulnerabilities().isEmpty()); -466 assertEquals(1, dependency.getSuppressedVulnerabilities().size()); -467 -468 //cpe -469 instance = new SuppressionRule(); -470 PropertyType pt = new PropertyType(); -471 pt.setValue("cpe:/a:microsoft:.net_framework:4.0"); -472 instance.addCpe(pt); +451 assertTrue(dependency.getIdentifiers().size() == 1); +452 pt = new PropertyType(); +453 pt.setValue("cpe:/a:microsoft:.net_framework:4.5"); +454 instance.addCpe(pt); +455 pt = new PropertyType(); +456 pt.setValue(".*"); +457 pt.setRegex(true); +458 instance.setFilePath(pt); +459 instance.process(dependency); +460 assertTrue(dependency.getIdentifiers().isEmpty()); +461 assertEquals(1, dependency.getSuppressedIdentifiers().size()); +462 +463 instance = new SuppressionRule(); +464 dependency.addIdentifier("cpe", "cpe:/a:microsoft:.net_framework:4.0", "some url not needed for this test"); +465 dependency.addIdentifier("cpe", "cpe:/a:microsoft:.net_framework:4.5", "some url not needed for this test"); +466 dependency.addIdentifier("cpe", "cpe:/a:microsoft:.net_framework:5.0", "some url not needed for this test"); +467 pt = new PropertyType(); +468 pt.setValue("cpe:/a:microsoft:.net_framework"); +469 instance.addCpe(pt); +470 instance.setBase(true); +471 assertEquals(3, dependency.getIdentifiers().size()); +472 assertEquals(1, dependency.getSuppressedIdentifiers().size()); 473 instance.process(dependency); -474 assertTrue(dependency.getIdentifiers().size() == 1); -475 pt = new PropertyType(); -476 pt.setValue("cpe:/a:microsoft:.net_framework:4.5"); -477 instance.addCpe(pt); -478 pt = new PropertyType(); -479 pt.setValue(".*"); -480 pt.setRegex(true); -481 instance.setFilePath(pt); -482 instance.process(dependency); -483 assertTrue(dependency.getIdentifiers().isEmpty()); -484 assertEquals(1, dependency.getSuppressedIdentifiers().size()); -485 -486 instance = new SuppressionRule(); -487 dependency.addIdentifier("cpe", "cpe:/a:microsoft:.net_framework:4.0", "some url not needed for this test"); -488 dependency.addIdentifier("cpe", "cpe:/a:microsoft:.net_framework:4.5", "some url not needed for this test"); -489 dependency.addIdentifier("cpe", "cpe:/a:microsoft:.net_framework:5.0", "some url not needed for this test"); -490 pt = new PropertyType(); -491 pt.setValue("cpe:/a:microsoft:.net_framework"); -492 instance.addCpe(pt); -493 instance.setBase(true); -494 assertEquals(3, dependency.getIdentifiers().size()); -495 assertEquals(1, dependency.getSuppressedIdentifiers().size()); -496 instance.process(dependency); -497 assertTrue(dependency.getIdentifiers().isEmpty()); -498 assertEquals(1, dependency.getSuppressedIdentifiers().size()); -499 } +474 assertTrue(dependency.getIdentifiers().isEmpty()); +475 assertEquals(1, dependency.getSuppressedIdentifiers().size()); +476 } +477 +478 /** +479 * Test of process method, of class SuppressionRule. +480 */ +481 @Test +482 public void testProcessGAV() { +483 //File spring = new File(this.getClass().getClassLoader().getResource("spring-security-web-3.0.0.RELEASE.jar").getPath()); +484 File spring = BaseTest.getResourceAsFile(this, "spring-security-web-3.0.0.RELEASE.jar"); +485 Dependency dependency = new Dependency(spring); +486 dependency.addIdentifier("cpe", "cpe:/a:vmware:springsource_spring_framework:3.0.0", "some url not needed for this test"); +487 dependency.addIdentifier("cpe", "cpe:/a:springsource:spring_framework:3.0.0", "some url not needed for this test"); +488 dependency.addIdentifier("cpe", "cpe:/a:mod_security:mod_security:3.0.0", "some url not needed for this test"); +489 dependency.addIdentifier("cpe", "cpe:/a:vmware:springsource_spring_security:3.0.0", "some url not needed for this test"); +490 dependency.addIdentifier("maven", "org.springframework.security:spring-security-web:3.0.0.RELEASE", "some url not needed for this test"); +491 +492 //cpe +493 SuppressionRule instance = new SuppressionRule(); +494 PropertyType pt = new PropertyType(); +495 +496 pt.setValue("org\\.springframework\\.security:spring.*"); +497 pt.setRegex(true); +498 pt.setCaseSensitive(false); +499 instance.setGav(pt); 500 -501 /** -502 * Test of process method, of class SuppressionRule. -503 */ -504 @Test -505 public void testProcessGAV() { -506 //File spring = new File(this.getClass().getClassLoader().getResource("spring-security-web-3.0.0.RELEASE.jar").getPath()); -507 File spring = BaseTest.getResourceAsFile(this, "spring-security-web-3.0.0.RELEASE.jar"); -508 Dependency dependency = new Dependency(spring); -509 dependency.addIdentifier("cpe", "cpe:/a:vmware:springsource_spring_framework:3.0.0", "some url not needed for this test"); -510 dependency.addIdentifier("cpe", "cpe:/a:springsource:spring_framework:3.0.0", "some url not needed for this test"); -511 dependency.addIdentifier("cpe", "cpe:/a:mod_security:mod_security:3.0.0", "some url not needed for this test"); -512 dependency.addIdentifier("cpe", "cpe:/a:vmware:springsource_spring_security:3.0.0", "some url not needed for this test"); -513 dependency.addIdentifier("maven", "org.springframework.security:spring-security-web:3.0.0.RELEASE", "some url not needed for this test"); -514 -515 //cpe -516 SuppressionRule instance = new SuppressionRule(); -517 PropertyType pt = new PropertyType(); -518 -519 pt.setValue("org\\.springframework\\.security:spring.*"); -520 pt.setRegex(true); -521 pt.setCaseSensitive(false); -522 instance.setGav(pt); -523 -524 pt = new PropertyType(); -525 pt.setValue("cpe:/a:mod_security:mod_security"); -526 instance.addCpe(pt); -527 pt = new PropertyType(); -528 pt.setValue("cpe:/a:springsource:spring_framework"); -529 instance.addCpe(pt); -530 pt = new PropertyType(); -531 pt.setValue("cpe:/a:vmware:springsource_spring_framework"); -532 instance.addCpe(pt); -533 -534 instance.process(dependency); -535 assertEquals(2, dependency.getIdentifiers().size()); -536 -537 } -538 -539 private Vulnerability createVulnerability() { -540 Vulnerability v = new Vulnerability(); -541 v.setCwe("CWE-287 Improper Authentication"); -542 v.setName("CVE-2013-1337"); -543 v.setCvssScore(7.5f); -544 return v; -545 } -546 } +501 pt = new PropertyType(); +502 pt.setValue("cpe:/a:mod_security:mod_security"); +503 instance.addCpe(pt); +504 pt = new PropertyType(); +505 pt.setValue("cpe:/a:springsource:spring_framework"); +506 instance.addCpe(pt); +507 pt = new PropertyType(); +508 pt.setValue("cpe:/a:vmware:springsource_spring_framework"); +509 instance.addCpe(pt); +510 +511 instance.process(dependency); +512 assertEquals(2, dependency.getIdentifiers().size()); +513 +514 } +515 +516 private Vulnerability createVulnerability() { +517 Vulnerability v = new Vulnerability(); +518 v.setCwe("CWE-287 Improper Authentication"); +519 v.setName("CVE-2013-1337"); +520 v.setCvssScore(7.5f); +521 return v; +522 } +523 }
    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/suppression/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/suppression/package-frame.html index 44f20f803..afa4b9875 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/suppression/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/suppression/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.suppression + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.suppression diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/suppression/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/suppression/package-summary.html index 3d14480e6..538f937a8 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/suppression/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/suppression/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.suppression + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.suppression diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/DependencyVersionTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/DependencyVersionTest.html index 30af162f0..65e29e39b 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/DependencyVersionTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/DependencyVersionTest.html @@ -28,205 +28,183 @@ 20 import java.util.Arrays; 21 import java.util.Iterator; 22 import java.util.List; -23 import org.junit.After; -24 import org.junit.AfterClass; -25 import static org.junit.Assert.assertArrayEquals; -26 import static org.junit.Assert.assertEquals; -27 import static org.junit.Assert.assertTrue; -28 import org.junit.Before; -29 import org.junit.BeforeClass; -30 import org.junit.Test; -31 -32 /** -33 * -34 * @author Jeremy Long -35 */ -36 public class DependencyVersionTest { -37 -38 public DependencyVersionTest() { -39 } -40 -41 @BeforeClass -42 public static void setUpClass() { -43 } -44 -45 @AfterClass -46 public static void tearDownClass() { -47 } -48 -49 @Before -50 public void setUp() { -51 } -52 -53 @After -54 public void tearDown() { -55 } -56 -57 /** -58 * Test of parseVersion method, of class DependencyVersion. -59 */ -60 @Test -61 public void testParseVersion() { -62 String version = "1.2r1"; -63 DependencyVersion instance = new DependencyVersion(); -64 instance.parseVersion(version); -65 List<String> parts = instance.getVersionParts(); -66 assertEquals(3, parts.size()); -67 assertEquals("1", parts.get(0)); -68 assertEquals("2", parts.get(1)); -69 assertEquals("r1", parts.get(2)); -70 -71 instance.parseVersion("x6.0"); -72 parts = instance.getVersionParts(); -73 assertEquals(2, parts.size()); -74 assertEquals("x6", parts.get(0)); -75 assertEquals("0", parts.get(1)); -76 //assertEquals("0", parts.get(2)); -77 -78 } -79 -80 /** -81 * Test of iterator method, of class DependencyVersion. -82 */ -83 @Test -84 public void testIterator() { -85 DependencyVersion instance = new DependencyVersion("1.2.3"); -86 Iterator result = instance.iterator(); -87 int count = 1; -88 while (result.hasNext()) { -89 String v = (String) result.next(); -90 assertTrue(String.valueOf(count++).equals(v)); -91 } -92 } -93 -94 /** -95 * Test of toString method, of class DependencyVersion. -96 */ -97 @Test -98 public void testToString() { -99 DependencyVersion instance = new DependencyVersion("1.2.3r1"); -100 String expResult = "1.2.3.r1"; -101 String result = instance.toString(); -102 assertEquals(expResult, result); -103 } -104 -105 /** -106 * Test of equals method, of class DependencyVersion. -107 */ -108 @Test -109 public void testEquals() { -110 DependencyVersion obj = new DependencyVersion("1.2.3.r1"); -111 DependencyVersion instance = new DependencyVersion("1.2.3"); -112 boolean expResult = false; -113 boolean result = instance.equals(obj); -114 assertEquals(expResult, result); -115 obj = new DependencyVersion("1.2.3"); -116 expResult = true; -117 result = instance.equals(obj); -118 assertEquals(expResult, result); -119 } -120 -121 /** -122 * Test of hashCode method, of class DependencyVersion. -123 */ -124 @Test -125 public void testHashCode() { -126 DependencyVersion instance = new DependencyVersion("3.2.1"); -127 int expResult = 80756; -128 int result = instance.hashCode(); -129 assertEquals(expResult, result); -130 } -131 -132 /** -133 * Test of matchesAtLeastThreeLevels method, of class DependencyVersion. -134 */ -135 @Test -136 public void testMatchesAtLeastThreeLevels() { -137 -138 DependencyVersion instance = new DependencyVersion("2.3.16.3"); -139 DependencyVersion version = new DependencyVersion("2.3.16.4"); -140 //true tests -141 assertEquals(true, instance.matchesAtLeastThreeLevels(version)); -142 version = new DependencyVersion("2.3"); -143 assertEquals(true, instance.matchesAtLeastThreeLevels(version)); -144 //false tests -145 version = new DependencyVersion("2.3.16.1"); -146 assertEquals(false, instance.matchesAtLeastThreeLevels(version)); -147 version = new DependencyVersion("2"); -148 assertEquals(false, instance.matchesAtLeastThreeLevels(version)); -149 } -150 -151 /** -152 * Test of compareTo method, of class DependencyVersion. -153 */ -154 @Test -155 public void testCompareTo() { -156 DependencyVersion instance = new DependencyVersion("1.2.3"); -157 DependencyVersion version = new DependencyVersion("1.2.3"); -158 int expResult = 0; -159 assertEquals(0, instance.compareTo(version)); -160 version = new DependencyVersion("1.1"); -161 assertEquals(1, instance.compareTo(version)); -162 version = new DependencyVersion("1.2"); -163 assertEquals(1, instance.compareTo(version)); -164 version = new DependencyVersion("1.3"); -165 assertEquals(-1, instance.compareTo(version)); -166 version = new DependencyVersion("1.2.3.1"); -167 assertEquals(-1, instance.compareTo(version)); -168 -169 instance = new DependencyVersion("1.0.1n"); -170 version = new DependencyVersion("1.0.1m"); -171 assertEquals(1, instance.compareTo(version)); -172 version = new DependencyVersion("1.0.1n"); -173 assertEquals(0, instance.compareTo(version)); -174 version = new DependencyVersion("1.0.1o"); -175 assertEquals(-1, instance.compareTo(version)); +23 import static org.junit.Assert.assertArrayEquals; +24 import static org.junit.Assert.assertEquals; +25 import static org.junit.Assert.assertTrue; +26 import org.junit.Test; +27 +28 /** +29 * +30 * @author Jeremy Long +31 */ +32 public class DependencyVersionTest { +33 +34 /** +35 * Test of parseVersion method, of class DependencyVersion. +36 */ +37 @Test +38 public void testParseVersion() { +39 String version = "1.2r1"; +40 DependencyVersion instance = new DependencyVersion(); +41 instance.parseVersion(version); +42 List<String> parts = instance.getVersionParts(); +43 assertEquals(3, parts.size()); +44 assertEquals("1", parts.get(0)); +45 assertEquals("2", parts.get(1)); +46 assertEquals("r1", parts.get(2)); +47 +48 instance.parseVersion("x6.0"); +49 parts = instance.getVersionParts(); +50 assertEquals(2, parts.size()); +51 assertEquals("x6", parts.get(0)); +52 assertEquals("0", parts.get(1)); +53 // TODO(code review): should this be here/do something? +54 //assertEquals("0", parts.get(2)); +55 +56 } +57 +58 /** +59 * Test of iterator method, of class DependencyVersion. +60 */ +61 @Test +62 public void testIterator() { +63 DependencyVersion instance = new DependencyVersion("1.2.3"); +64 Iterator result = instance.iterator(); +65 assertTrue(result.hasNext()); +66 int count = 1; +67 while (result.hasNext()) { +68 String v = (String) result.next(); +69 assertTrue(String.valueOf(count++).equals(v)); +70 } +71 } +72 +73 /** +74 * Test of toString method, of class DependencyVersion. +75 */ +76 @Test +77 public void testToString() { +78 DependencyVersion instance = new DependencyVersion("1.2.3r1"); +79 String expResult = "1.2.3.r1"; +80 String result = instance.toString(); +81 assertEquals(expResult, result); +82 } +83 +84 /** +85 * Test of equals method, of class DependencyVersion. +86 */ +87 @Test +88 public void testEquals() { +89 DependencyVersion obj = new DependencyVersion("1.2.3.r1"); +90 DependencyVersion instance = new DependencyVersion("1.2.3"); +91 boolean expResult = false; +92 boolean result = instance.equals(obj); +93 assertEquals(expResult, result); +94 obj = new DependencyVersion("1.2.3"); +95 expResult = true; +96 result = instance.equals(obj); +97 assertEquals(expResult, result); +98 } +99 +100 /** +101 * Test of hashCode method, of class DependencyVersion. +102 */ +103 @Test +104 public void testHashCode() { +105 DependencyVersion instance = new DependencyVersion("3.2.1"); +106 int expResult = 80756; +107 int result = instance.hashCode(); +108 assertEquals(expResult, result); +109 } +110 +111 /** +112 * Test of matchesAtLeastThreeLevels method, of class DependencyVersion. +113 */ +114 @Test +115 public void testMatchesAtLeastThreeLevels() { +116 +117 DependencyVersion instance = new DependencyVersion("2.3.16.3"); +118 DependencyVersion version = new DependencyVersion("2.3.16.4"); +119 //true tests +120 assertEquals(true, instance.matchesAtLeastThreeLevels(version)); +121 version = new DependencyVersion("2.3"); +122 assertEquals(true, instance.matchesAtLeastThreeLevels(version)); +123 //false tests +124 version = new DependencyVersion("2.3.16.1"); +125 assertEquals(false, instance.matchesAtLeastThreeLevels(version)); +126 version = new DependencyVersion("2"); +127 assertEquals(false, instance.matchesAtLeastThreeLevels(version)); +128 } +129 +130 /** +131 * Test of compareTo method, of class DependencyVersion. +132 */ +133 @Test +134 public void testCompareTo() { +135 DependencyVersion instance = new DependencyVersion("1.2.3"); +136 DependencyVersion version = new DependencyVersion("1.2.3"); +137 assertEquals(0, instance.compareTo(version)); +138 version = new DependencyVersion("1.1"); +139 assertEquals(1, instance.compareTo(version)); +140 version = new DependencyVersion("1.2"); +141 assertEquals(1, instance.compareTo(version)); +142 version = new DependencyVersion("1.3"); +143 assertEquals(-1, instance.compareTo(version)); +144 version = new DependencyVersion("1.2.3.1"); +145 assertEquals(-1, instance.compareTo(version)); +146 +147 instance = new DependencyVersion("1.0.1n"); +148 version = new DependencyVersion("1.0.1m"); +149 assertEquals(1, instance.compareTo(version)); +150 version = new DependencyVersion("1.0.1n"); +151 assertEquals(0, instance.compareTo(version)); +152 version = new DependencyVersion("1.0.1o"); +153 assertEquals(-1, instance.compareTo(version)); +154 +155 DependencyVersion[] dv = new DependencyVersion[7]; +156 dv[0] = new DependencyVersion("2.1.3"); +157 dv[1] = new DependencyVersion("2.1.3.r2"); +158 dv[2] = new DependencyVersion("2.1.3.r1"); +159 dv[3] = new DependencyVersion("1.2.3.1"); +160 dv[4] = new DependencyVersion("1.2.3"); +161 dv[5] = new DependencyVersion("2"); +162 dv[6] = new DependencyVersion("-"); +163 +164 DependencyVersion[] expected = new DependencyVersion[7]; +165 expected[0] = new DependencyVersion("-"); +166 expected[1] = new DependencyVersion("1.2.3"); +167 expected[2] = new DependencyVersion("1.2.3.1"); +168 expected[3] = new DependencyVersion("2"); +169 expected[4] = new DependencyVersion("2.1.3"); +170 expected[5] = new DependencyVersion("2.1.3.r1"); +171 expected[6] = new DependencyVersion("2.1.3.r2"); +172 java.util.Arrays.sort(dv); +173 +174 assertArrayEquals(expected, dv); +175 } 176 -177 DependencyVersion[] dv = new DependencyVersion[7]; -178 dv[0] = new DependencyVersion("2.1.3"); -179 dv[1] = new DependencyVersion("2.1.3.r2"); -180 dv[2] = new DependencyVersion("2.1.3.r1"); -181 dv[3] = new DependencyVersion("1.2.3.1"); -182 dv[4] = new DependencyVersion("1.2.3"); -183 dv[5] = new DependencyVersion("2"); -184 dv[6] = new DependencyVersion("-"); -185 -186 DependencyVersion[] expected = new DependencyVersion[7]; -187 expected[0] = new DependencyVersion("-"); -188 expected[1] = new DependencyVersion("1.2.3"); -189 expected[2] = new DependencyVersion("1.2.3.1"); -190 expected[3] = new DependencyVersion("2"); -191 expected[4] = new DependencyVersion("2.1.3"); -192 expected[5] = new DependencyVersion("2.1.3.r1"); -193 expected[6] = new DependencyVersion("2.1.3.r2"); -194 java.util.Arrays.sort(dv); -195 -196 assertArrayEquals(expected, dv); -197 } -198 -199 /** -200 * Test of getVersionParts method, of class DependencyVersion. -201 */ -202 @Test -203 public void testGetVersionParts() { -204 DependencyVersion instance = new DependencyVersion(); -205 List<String> versionParts = Arrays.asList("1", "1", "1"); -206 instance.setVersionParts(versionParts); -207 List<String> expResult = Arrays.asList("1", "1", "1");; -208 List<String> result = instance.getVersionParts(); -209 assertEquals(expResult, result); -210 } -211 -212 /** -213 * Test of setVersionParts method, of class DependencyVersion. -214 */ -215 @Test -216 public void testSetVersionParts() { -217 List<String> versionParts = Arrays.asList("1", "1", "1"); -218 DependencyVersion instance = new DependencyVersion(); -219 instance.setVersionParts(versionParts); -220 } -221 } +177 /** +178 * Test of getVersionParts method, of class DependencyVersion. +179 */ +180 @Test +181 public void testGetVersionParts() { +182 DependencyVersion instance = new DependencyVersion(); +183 List<String> versionParts = Arrays.asList("1", "1", "1"); +184 instance.setVersionParts(versionParts); +185 List<String> expResult = Arrays.asList("1", "1", "1"); +186 List<String> result = instance.getVersionParts(); +187 assertEquals(expResult, result); +188 } +189 +190 /** +191 * Test of setVersionParts method, of class DependencyVersion. +192 */ +193 @Test +194 public void testSetVersionParts() { +195 List<String> versionParts = Arrays.asList("1", "1", "1"); +196 DependencyVersion instance = new DependencyVersion(); +197 instance.setVersionParts(versionParts); +198 } +199 }
    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/FilterTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/FilterTest.html index 227c10a42..042009a26 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/FilterTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/FilterTest.html @@ -72,11 +72,12 @@ 64 } 65 private static final Filter<String> TEST_FILTER 66 = new Filter<String>() { -67 public boolean passes(String str) { -68 return str.contains("keep"); -69 } -70 }; -71 } +67 @Override +68 public boolean passes(String str) { +69 return str.contains("keep"); +70 } +71 }; +72 }
    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/package-frame.html index 6f91a2d4c..3a11669f1 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.utils + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.utils diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/package-summary.html index 996a2dced..86e324532 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/utils/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.utils + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.utils diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/ModelTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/ModelTest.html index f9afe84aa..939990f94 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/ModelTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/ModelTest.html @@ -7,291 +7,290 @@
     1   /*
    -2    * Copyright 2015 OWASP.
    +2    * This file is part of dependency-check-core.
     3    *
     4    * Licensed under the Apache License, Version 2.0 (the "License");
     5    * you may not use this file except in compliance with the License.
     6    * You may obtain a copy of the License at
     7    *
    -8    *      http://www.apache.org/licenses/LICENSE-2.0
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
     9    *
     10   * Unless required by applicable law or agreed to in writing, software
     11   * distributed under the License is distributed on an "AS IS" BASIS,
     12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13   * See the License for the specific language governing permissions and
     14   * limitations under the License.
    -15   */
    -16  package org.owasp.dependencycheck.xml.pom;
    -17  
    -18  import java.util.ArrayList;
    -19  import java.util.List;
    -20  import java.util.Properties;
    -21  import org.junit.After;
    -22  import org.junit.AfterClass;
    -23  import org.junit.Before;
    -24  import org.junit.BeforeClass;
    -25  import org.junit.Test;
    -26  import static org.junit.Assert.*;
    -27  
    -28  /**
    -29   *
    -30   * @author jeremy
    -31   */
    -32  public class ModelTest {
    -33  
    -34      /**
    -35       * Test of getName method, of class Model.
    -36       */
    -37      @Test
    -38      public void testGetName() {
    -39          Model instance = new Model();
    -40          instance.setName("");
    -41          String expResult = "";
    -42          String result = instance.getName();
    -43          assertEquals(expResult, result);
    -44      }
    -45  
    -46      /**
    -47       * Test of setName method, of class Model.
    -48       */
    -49      @Test
    -50      public void testSetName() {
    -51          String name = "";
    -52          Model instance = new Model();
    -53          instance.setName(name);
    -54      }
    -55  
    -56      /**
    -57       * Test of getOrganization method, of class Model.
    -58       */
    -59      @Test
    -60      public void testGetOrganization() {
    -61          Model instance = new Model();
    -62          instance.setOrganization("");
    -63          String expResult = "";
    -64          String result = instance.getOrganization();
    -65          assertEquals(expResult, result);
    -66      }
    -67  
    -68      /**
    -69       * Test of setOrganization method, of class Model.
    -70       */
    -71      @Test
    -72      public void testSetOrganization() {
    -73          String organization = "";
    -74          Model instance = new Model();
    -75          instance.setOrganization(organization);
    -76      }
    -77  
    -78      /**
    -79       * Test of getDescription method, of class Model.
    -80       */
    -81      @Test
    -82      public void testGetDescription() {
    -83          Model instance = new Model();
    -84          instance.setDescription("");
    -85          String expResult = "";
    -86          String result = instance.getDescription();
    -87          assertEquals(expResult, result);
    -88      }
    -89  
    -90      /**
    -91       * Test of setDescription method, of class Model.
    -92       */
    -93      @Test
    -94      public void testSetDescription() {
    -95          String description = "";
    -96          Model instance = new Model();
    -97          instance.setDescription(description);
    -98      }
    -99  
    -100     /**
    -101      * Test of getGroupId method, of class Model.
    -102      */
    -103     @Test
    -104     public void testGetGroupId() {
    -105         Model instance = new Model();
    -106         instance.setGroupId("");
    -107         String expResult = "";
    -108         String result = instance.getGroupId();
    -109         assertEquals(expResult, result);
    -110     }
    -111 
    -112     /**
    -113      * Test of setGroupId method, of class Model.
    -114      */
    -115     @Test
    -116     public void testSetGroupId() {
    -117         String groupId = "";
    -118         Model instance = new Model();
    -119         instance.setGroupId(groupId);
    -120     }
    -121 
    -122     /**
    -123      * Test of getArtifactId method, of class Model.
    -124      */
    -125     @Test
    -126     public void testGetArtifactId() {
    -127         Model instance = new Model();
    -128         instance.setArtifactId("");
    -129         String expResult = "";
    -130         String result = instance.getArtifactId();
    -131         assertEquals(expResult, result);
    -132     }
    -133 
    -134     /**
    -135      * Test of setArtifactId method, of class Model.
    -136      */
    -137     @Test
    -138     public void testSetArtifactId() {
    -139         String artifactId = "";
    -140         Model instance = new Model();
    -141         instance.setArtifactId(artifactId);
    -142     }
    -143 
    -144     /**
    -145      * Test of getVersion method, of class Model.
    -146      */
    -147     @Test
    -148     public void testGetVersion() {
    -149         Model instance = new Model();
    -150         instance.setVersion("");
    -151         String expResult = "";
    -152         String result = instance.getVersion();
    -153         assertEquals(expResult, result);
    -154     }
    -155 
    -156     /**
    -157      * Test of setVersion method, of class Model.
    -158      */
    -159     @Test
    -160     public void testSetVersion() {
    -161         String version = "";
    -162         Model instance = new Model();
    -163         instance.setVersion(version);
    -164     }
    -165 
    -166     /**
    -167      * Test of getParentGroupId method, of class Model.
    -168      */
    -169     @Test
    -170     public void testGetParentGroupId() {
    -171         Model instance = new Model();
    -172         instance.setParentGroupId("");
    -173         String expResult = "";
    -174         String result = instance.getParentGroupId();
    -175         assertEquals(expResult, result);
    -176     }
    -177 
    -178     /**
    -179      * Test of setParentGroupId method, of class Model.
    -180      */
    -181     @Test
    -182     public void testSetParentGroupId() {
    -183         String parentGroupId = "";
    -184         Model instance = new Model();
    -185         instance.setParentGroupId(parentGroupId);
    -186     }
    -187 
    -188     /**
    -189      * Test of getParentArtifactId method, of class Model.
    -190      */
    -191     @Test
    -192     public void testGetParentArtifactId() {
    -193         Model instance = new Model();
    -194         instance.setParentArtifactId("");
    -195         String expResult = "";
    -196         String result = instance.getParentArtifactId();
    -197         assertEquals(expResult, result);
    -198     }
    -199 
    -200     /**
    -201      * Test of setParentArtifactId method, of class Model.
    -202      */
    -203     @Test
    -204     public void testSetParentArtifactId() {
    -205         String parentArtifactId = "";
    -206         Model instance = new Model();
    -207         instance.setParentArtifactId(parentArtifactId);
    -208     }
    -209 
    -210     /**
    -211      * Test of getParentVersion method, of class Model.
    -212      */
    -213     @Test
    -214     public void testGetParentVersion() {
    -215         Model instance = new Model();
    -216         instance.setParentVersion("");
    -217         String expResult = "";
    -218         String result = instance.getParentVersion();
    -219         assertEquals(expResult, result);
    -220     }
    -221 
    -222     /**
    -223      * Test of setParentVersion method, of class Model.
    -224      */
    -225     @Test
    -226     public void testSetParentVersion() {
    -227         String parentVersion = "";
    -228         Model instance = new Model();
    -229         instance.setParentVersion(parentVersion);
    -230     }
    -231 
    -232     /**
    -233      * Test of getLicenses method, of class Model.
    -234      */
    -235     @Test
    -236     public void testGetLicenses() {
    -237         Model instance = new Model();
    -238         instance.addLicense(new License("name", "url"));
    -239         List<License> expResult = new ArrayList<License>();
    -240         expResult.add(new License("name", "url"));
    -241         List<License> result = instance.getLicenses();
    -242         assertEquals(expResult, result);
    -243     }
    -244 
    -245     /**
    -246      * Test of addLicense method, of class Model.
    -247      */
    -248     @Test
    -249     public void testAddLicense() {
    -250         License license = new License("name", "url");
    -251         Model instance = new Model();
    -252         instance.addLicense(license);
    -253     }
    -254 
    -255     /**
    -256      * Test of processProperties method, of class Model.
    -257      */
    -258     @Test
    -259     public void testProcessProperties() {
    -260         Properties prop = new Properties();
    -261         prop.setProperty("key", "value");
    -262         prop.setProperty("nested", "nested ${key}");
    -263         String text = "This is a test of '${key}' '${nested}'";
    -264 
    -265         Model instance = new Model();
    -266         instance.setName(text);
    -267         instance.processProperties(prop);
    -268         String expResults = "This is a test of 'value' 'nested value'";
    -269         assertEquals(expResults, instance.getName());
    -270     }
    -271 
    -272     /**
    -273      * Test of interpolateString method, of class Model.
    -274      */
    -275     @Test
    -276     public void testInterpolateString() {
    -277         Properties prop = new Properties();
    -278         prop.setProperty("key", "value");
    -279         prop.setProperty("nested", "nested ${key}");
    -280         String text = "This is a test of '${key}' '${nested}'";
    -281         String expResults = "This is a test of 'value' 'nested value'";
    -282         String results = Model.interpolateString(text, prop);
    -283         assertEquals(expResults, results);
    -284     }
    -285 
    -286 }
    +15   *
    +16   * Copyright (c) 2015 The OWASP Foundatio. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.xml.pom;
    +19  
    +20  import java.util.ArrayList;
    +21  import java.util.List;
    +22  import java.util.Properties;
    +23  
    +24  import org.junit.Test;
    +25  import static org.junit.Assert.*;
    +26  
    +27  /**
    +28   *
    +29   * @author jeremy
    +30   */
    +31  public class ModelTest {
    +32  
    +33      /**
    +34       * Test of getName method, of class Model.
    +35       */
    +36      @Test
    +37      public void testGetName() {
    +38          Model instance = new Model();
    +39          instance.setName("");
    +40          String expResult = "";
    +41          String result = instance.getName();
    +42          assertEquals(expResult, result);
    +43      }
    +44  
    +45      /**
    +46       * Test of setName method, of class Model.
    +47       */
    +48      @Test
    +49      public void testSetName() {
    +50          String name = "";
    +51          Model instance = new Model();
    +52          instance.setName(name);
    +53      }
    +54  
    +55      /**
    +56       * Test of getOrganization method, of class Model.
    +57       */
    +58      @Test
    +59      public void testGetOrganization() {
    +60          Model instance = new Model();
    +61          instance.setOrganization("");
    +62          String expResult = "";
    +63          String result = instance.getOrganization();
    +64          assertEquals(expResult, result);
    +65      }
    +66  
    +67      /**
    +68       * Test of setOrganization method, of class Model.
    +69       */
    +70      @Test
    +71      public void testSetOrganization() {
    +72          String organization = "";
    +73          Model instance = new Model();
    +74          instance.setOrganization(organization);
    +75      }
    +76  
    +77      /**
    +78       * Test of getDescription method, of class Model.
    +79       */
    +80      @Test
    +81      public void testGetDescription() {
    +82          Model instance = new Model();
    +83          instance.setDescription("");
    +84          String expResult = "";
    +85          String result = instance.getDescription();
    +86          assertEquals(expResult, result);
    +87      }
    +88  
    +89      /**
    +90       * Test of setDescription method, of class Model.
    +91       */
    +92      @Test
    +93      public void testSetDescription() {
    +94          String description = "";
    +95          Model instance = new Model();
    +96          instance.setDescription(description);
    +97      }
    +98  
    +99      /**
    +100      * Test of getGroupId method, of class Model.
    +101      */
    +102     @Test
    +103     public void testGetGroupId() {
    +104         Model instance = new Model();
    +105         instance.setGroupId("");
    +106         String expResult = "";
    +107         String result = instance.getGroupId();
    +108         assertEquals(expResult, result);
    +109     }
    +110 
    +111     /**
    +112      * Test of setGroupId method, of class Model.
    +113      */
    +114     @Test
    +115     public void testSetGroupId() {
    +116         String groupId = "";
    +117         Model instance = new Model();
    +118         instance.setGroupId(groupId);
    +119     }
    +120 
    +121     /**
    +122      * Test of getArtifactId method, of class Model.
    +123      */
    +124     @Test
    +125     public void testGetArtifactId() {
    +126         Model instance = new Model();
    +127         instance.setArtifactId("");
    +128         String expResult = "";
    +129         String result = instance.getArtifactId();
    +130         assertEquals(expResult, result);
    +131     }
    +132 
    +133     /**
    +134      * Test of setArtifactId method, of class Model.
    +135      */
    +136     @Test
    +137     public void testSetArtifactId() {
    +138         String artifactId = "";
    +139         Model instance = new Model();
    +140         instance.setArtifactId(artifactId);
    +141     }
    +142 
    +143     /**
    +144      * Test of getVersion method, of class Model.
    +145      */
    +146     @Test
    +147     public void testGetVersion() {
    +148         Model instance = new Model();
    +149         instance.setVersion("");
    +150         String expResult = "";
    +151         String result = instance.getVersion();
    +152         assertEquals(expResult, result);
    +153     }
    +154 
    +155     /**
    +156      * Test of setVersion method, of class Model.
    +157      */
    +158     @Test
    +159     public void testSetVersion() {
    +160         String version = "";
    +161         Model instance = new Model();
    +162         instance.setVersion(version);
    +163     }
    +164 
    +165     /**
    +166      * Test of getParentGroupId method, of class Model.
    +167      */
    +168     @Test
    +169     public void testGetParentGroupId() {
    +170         Model instance = new Model();
    +171         instance.setParentGroupId("");
    +172         String expResult = "";
    +173         String result = instance.getParentGroupId();
    +174         assertEquals(expResult, result);
    +175     }
    +176 
    +177     /**
    +178      * Test of setParentGroupId method, of class Model.
    +179      */
    +180     @Test
    +181     public void testSetParentGroupId() {
    +182         String parentGroupId = "";
    +183         Model instance = new Model();
    +184         instance.setParentGroupId(parentGroupId);
    +185     }
    +186 
    +187     /**
    +188      * Test of getParentArtifactId method, of class Model.
    +189      */
    +190     @Test
    +191     public void testGetParentArtifactId() {
    +192         Model instance = new Model();
    +193         instance.setParentArtifactId("");
    +194         String expResult = "";
    +195         String result = instance.getParentArtifactId();
    +196         assertEquals(expResult, result);
    +197     }
    +198 
    +199     /**
    +200      * Test of setParentArtifactId method, of class Model.
    +201      */
    +202     @Test
    +203     public void testSetParentArtifactId() {
    +204         String parentArtifactId = "";
    +205         Model instance = new Model();
    +206         instance.setParentArtifactId(parentArtifactId);
    +207     }
    +208 
    +209     /**
    +210      * Test of getParentVersion method, of class Model.
    +211      */
    +212     @Test
    +213     public void testGetParentVersion() {
    +214         Model instance = new Model();
    +215         instance.setParentVersion("");
    +216         String expResult = "";
    +217         String result = instance.getParentVersion();
    +218         assertEquals(expResult, result);
    +219     }
    +220 
    +221     /**
    +222      * Test of setParentVersion method, of class Model.
    +223      */
    +224     @Test
    +225     public void testSetParentVersion() {
    +226         String parentVersion = "";
    +227         Model instance = new Model();
    +228         instance.setParentVersion(parentVersion);
    +229     }
    +230 
    +231     /**
    +232      * Test of getLicenses method, of class Model.
    +233      */
    +234     @Test
    +235     public void testGetLicenses() {
    +236         Model instance = new Model();
    +237         instance.addLicense(new License("name", "url"));
    +238         List<License> expResult = new ArrayList<License>();
    +239         expResult.add(new License("name", "url"));
    +240         List<License> result = instance.getLicenses();
    +241         assertEquals(expResult, result);
    +242     }
    +243 
    +244     /**
    +245      * Test of addLicense method, of class Model.
    +246      */
    +247     @Test
    +248     public void testAddLicense() {
    +249         License license = new License("name", "url");
    +250         Model instance = new Model();
    +251         instance.addLicense(license);
    +252     }
    +253 
    +254     /**
    +255      * Test of processProperties method, of class Model.
    +256      */
    +257     @Test
    +258     public void testProcessProperties() {
    +259         Properties prop = new Properties();
    +260         prop.setProperty("key", "value");
    +261         prop.setProperty("nested", "nested ${key}");
    +262         String text = "This is a test of '${key}' '${nested}'";
    +263 
    +264         Model instance = new Model();
    +265         instance.setName(text);
    +266         instance.processProperties(prop);
    +267         String expResults = "This is a test of 'value' 'nested value'";
    +268         assertEquals(expResults, instance.getName());
    +269     }
    +270 
    +271     /**
    +272      * Test of interpolateString method, of class Model.
    +273      */
    +274     @Test
    +275     public void testInterpolateString() {
    +276         Properties prop = new Properties();
    +277         prop.setProperty("key", "value");
    +278         prop.setProperty("nested", "nested ${key}");
    +279         String text = "This is a test of '${key}' '${nested}'";
    +280         String expResults = "This is a test of 'value' 'nested value'";
    +281         String results = Model.interpolateString(text, prop);
    +282         assertEquals(expResults, results);
    +283     }
    +284 
    +285 }
     

    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/PomUtilsTest.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/PomUtilsTest.html index b4ffac207..4541cf35b 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/PomUtilsTest.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/PomUtilsTest.html @@ -7,72 +7,48 @@
     1   /*
    -2    * Copyright 2015 OWASP.
    +2    * This file is part of dependency-check-core.
     3    *
     4    * Licensed under the Apache License, Version 2.0 (the "License");
     5    * you may not use this file except in compliance with the License.
     6    * You may obtain a copy of the License at
     7    *
    -8    *      http://www.apache.org/licenses/LICENSE-2.0
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
     9    *
     10   * Unless required by applicable law or agreed to in writing, software
     11   * distributed under the License is distributed on an "AS IS" BASIS,
     12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13   * See the License for the specific language governing permissions and
     14   * limitations under the License.
    -15   */
    -16  package org.owasp.dependencycheck.xml.pom;
    -17  
    -18  import org.owasp.dependencycheck.xml.pom.PomUtils;
    -19  import java.io.File;
    -20  import javax.xml.transform.sax.SAXSource;
    -21  import org.junit.After;
    -22  import org.junit.AfterClass;
    -23  import org.junit.Before;
    -24  import org.junit.BeforeClass;
    -25  import org.junit.Test;
    -26  import static org.junit.Assert.*;
    -27  import org.owasp.dependencycheck.BaseTest;
    -28  import org.owasp.dependencycheck.dependency.Dependency;
    -29  import org.owasp.dependencycheck.xml.pom.Model;
    -30  
    -31  /**
    -32   *
    -33   * @author jeremy
    -34   */
    -35  public class PomUtilsTest {
    -36  
    -37      public PomUtilsTest() {
    -38      }
    -39  
    -40      @BeforeClass
    -41      public static void setUpClass() {
    -42      }
    -43  
    -44      @AfterClass
    -45      public static void tearDownClass() {
    -46      }
    -47  
    -48      @Before
    -49      public void setUp() {
    -50      }
    -51  
    -52      @After
    -53      public void tearDown() {
    -54      }
    -55  
    -56      /**
    -57       * Test of readPom method, of class PomUtils.
    -58       */
    -59      @Test
    -60      public void testReadPom_File() throws Exception {
    -61          File file = BaseTest.getResourceAsFile(this, "dwr-pom.xml");
    -62          String expResult = "Direct Web Remoting";
    -63          Model result = PomUtils.readPom(file);
    -64          assertEquals(expResult, result.getName());
    -65      }
    -66  
    -67  }
    +15   *
    +16   * Copyright (c) 2015 The OWASP Foundatio. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.xml.pom;
    +19  
    +20  import java.io.File;
    +21  
    +22  import org.junit.Test;
    +23  import static org.junit.Assert.*;
    +24  import org.owasp.dependencycheck.BaseTest;
    +25  
    +26  /**
    +27   *
    +28   * @author jeremy
    +29   */
    +30  public class PomUtilsTest {
    +31  
    +32      /**
    +33       * Test of readPom method, of class PomUtils.
    +34       */
    +35      @Test
    +36      public void testReadPom_File() throws Exception {
    +37          File file = BaseTest.getResourceAsFile(this, "dwr-pom.xml");
    +38          String expResult = "Direct Web Remoting";
    +39          Model result = PomUtils.readPom(file);
    +40          assertEquals(expResult, result.getName());
    +41      }
    +42  
    +43  }
     

    diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/package-frame.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/package-frame.html index a705b6579..c7c9ccd3d 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/package-frame.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.xml.pom + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.xml.pom diff --git a/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/package-summary.html b/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/package-summary.html index 1160369e7..34a0a4267 100644 --- a/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/package-summary.html +++ b/dependency-check-core/xref-test/org/owasp/dependencycheck/xml/pom/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.xml.pom + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.xml.pom diff --git a/dependency-check-core/xref-test/overview-frame.html b/dependency-check-core/xref-test/overview-frame.html index 5ca72c9f3..8706d120f 100644 --- a/dependency-check-core/xref-test/overview-frame.html +++ b/dependency-check-core/xref-test/overview-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference + Dependency-Check Core 1.3.1 Reference @@ -23,6 +23,9 @@
  • org.owasp.dependencycheck.data.central +
  • +
  • + org.owasp.dependencycheck.data.composer
  • org.owasp.dependencycheck.data.cpe diff --git a/dependency-check-core/xref-test/overview-summary.html b/dependency-check-core/xref-test/overview-summary.html index f7cbbbce3..68729816c 100644 --- a/dependency-check-core/xref-test/overview-summary.html +++ b/dependency-check-core/xref-test/overview-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference + Dependency-Check Core 1.3.1 Reference @@ -24,7 +24,7 @@ -

    Dependency-Check Core 1.3.0 Reference

    +

    Dependency-Check Core 1.3.1 Reference

    @@ -47,6 +47,11 @@ + + + + + + + + + + + + + + +
    org.owasp.dependencycheck.data.central
    + org.owasp.dependencycheck.data.composer +
    diff --git a/dependency-check-core/xref/allclasses-frame.html b/dependency-check-core/xref/allclasses-frame.html index 01548d678..c23b7e045 100644 --- a/dependency-check-core/xref/allclasses-frame.html +++ b/dependency-check-core/xref/allclasses-frame.html @@ -73,6 +73,18 @@
  • ClassNameInformation +
  • +
  • + ComposerDependency +
  • +
  • + ComposerException +
  • +
  • + ComposerLockAnalyzer +
  • +
  • + ComposerLockParser
  • Confidence @@ -238,6 +250,9 @@
  • NoDataException +
  • +
  • + NodePackageAnalyzer
  • NonClosingStream @@ -304,6 +319,9 @@
  • ReportGenerator +
  • +
  • + RubyGemspecAnalyzer
  • ScanAgentException diff --git a/dependency-check-core/xref/index.html b/dependency-check-core/xref/index.html index a5edb35ba..a9688a502 100644 --- a/dependency-check-core/xref/index.html +++ b/dependency-check-core/xref/index.html @@ -4,7 +4,7 @@ - Dependency-Check Core 1.3.0 Reference + Dependency-Check Core 1.3.1 Reference diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/Engine.html b/dependency-check-core/xref/org/owasp/dependencycheck/Engine.html index 58ee0ce1a..5afcee9c2 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/Engine.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/Engine.html @@ -50,483 +50,486 @@ 42 import java.util.HashSet; 43 import java.util.Iterator; 44 import java.util.List; -45 import java.util.Set; -46 -47 /** -48 * Scans files, directories, etc. for Dependencies. Analyzers are loaded and used to process the files found by the scan, if a -49 * file is encountered and an Analyzer is associated with the file type then the file is turned into a dependency. -50 * -51 * @author Jeremy Long -52 */ -53 public class Engine implements FileFilter { -54 -55 /** -56 * The list of dependencies. -57 */ -58 private List<Dependency> dependencies = new ArrayList<Dependency>(); -59 /** -60 * A Map of analyzers grouped by Analysis phase. -61 */ -62 private EnumMap<AnalysisPhase, List<Analyzer>> analyzers = new EnumMap<AnalysisPhase, List<Analyzer>>(AnalysisPhase.class); -63 -64 /** -65 * A Map of analyzers grouped by Analysis phase. -66 */ -67 private Set<FileTypeAnalyzer> fileTypeAnalyzers = new HashSet<FileTypeAnalyzer>(); -68 -69 /** -70 * The ClassLoader to use when dynamically loading Analyzer and Update services. -71 */ -72 private ClassLoader serviceClassLoader = Thread.currentThread().getContextClassLoader(); -73 /** -74 * The Logger for use throughout the class. -75 */ -76 private static final Logger LOGGER = LoggerFactory.getLogger(Engine.class); -77 -78 /** -79 * Creates a new Engine. -80 * -81 * @throws DatabaseException thrown if there is an error connecting to the database -82 */ -83 public Engine() throws DatabaseException { -84 initializeEngine(); -85 } -86 -87 /** -88 * Creates a new Engine. -89 * -90 * @param serviceClassLoader a reference the class loader being used -91 * @throws DatabaseException thrown if there is an error connecting to the database -92 */ -93 public Engine(ClassLoader serviceClassLoader) throws DatabaseException { -94 this.serviceClassLoader = serviceClassLoader; -95 initializeEngine(); -96 } -97 -98 /** -99 * Creates a new Engine using the specified classloader to dynamically load Analyzer and Update services. -100 * -101 * @throws DatabaseException thrown if there is an error connecting to the database -102 */ -103 protected final void initializeEngine() throws DatabaseException { -104 ConnectionFactory.initialize(); -105 loadAnalyzers(); -106 } -107 -108 /** -109 * Properly cleans up resources allocated during analysis. -110 */ -111 public void cleanup() { -112 ConnectionFactory.cleanup(); -113 } -114 -115 /** -116 * Loads the analyzers specified in the configuration file (or system properties). -117 */ -118 private void loadAnalyzers() { -119 if (!analyzers.isEmpty()) { -120 return; -121 } -122 for (AnalysisPhase phase : AnalysisPhase.values()) { -123 analyzers.put(phase, new ArrayList<Analyzer>()); -124 } -125 -126 final AnalyzerService service = new AnalyzerService(serviceClassLoader); -127 final Iterator<Analyzer> iterator = service.getAnalyzers(); -128 while (iterator.hasNext()) { -129 final Analyzer a = iterator.next(); -130 analyzers.get(a.getAnalysisPhase()).add(a); -131 if (a instanceof FileTypeAnalyzer) { -132 this.fileTypeAnalyzers.add((FileTypeAnalyzer) a); -133 } -134 } -135 } -136 -137 /** -138 * Get the List of the analyzers for a specific phase of analysis. -139 * -140 * @param phase the phase to get the configured analyzers. -141 * @return the analyzers loaded -142 */ -143 public List<Analyzer> getAnalyzers(AnalysisPhase phase) { -144 return analyzers.get(phase); -145 } -146 -147 /** -148 * Get the dependencies identified. -149 * -150 * @return the dependencies identified -151 */ -152 public List<Dependency> getDependencies() { -153 return dependencies; -154 } -155 -156 /** -157 * Sets the dependencies. -158 * -159 * @param dependencies the dependencies -160 */ -161 public void setDependencies(List<Dependency> dependencies) { -162 this.dependencies = dependencies; -163 } -164 -165 /** -166 * Scans an array of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies -167 * identified are added to the dependency collection. -168 * -169 * @param paths an array of paths to files or directories to be analyzed -170 * @return the list of dependencies scanned -171 * @since v0.3.2.5 -172 */ -173 public List<Dependency> scan(String[] paths) { -174 final List<Dependency> deps = new ArrayList<Dependency>(); -175 for (String path : paths) { -176 final File file = new File(path); -177 final List<Dependency> d = scan(file); -178 if (d != null) { -179 deps.addAll(d); -180 } -181 } -182 return deps; -183 } -184 -185 /** -186 * Scans a given file or directory. If a directory is specified, it will be scanned recursively. Any dependencies identified -187 * are added to the dependency collection. -188 * -189 * @param path the path to a file or directory to be analyzed -190 * @return the list of dependencies scanned -191 */ -192 public List<Dependency> scan(String path) { -193 final File file = new File(path); -194 return scan(file); -195 } -196 -197 /** -198 * Scans an array of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies -199 * identified are added to the dependency collection. -200 * -201 * @param files an array of paths to files or directories to be analyzed. -202 * @return the list of dependencies -203 * @since v0.3.2.5 -204 */ -205 public List<Dependency> scan(File[] files) { -206 final List<Dependency> deps = new ArrayList<Dependency>(); -207 for (File file : files) { -208 final List<Dependency> d = scan(file); -209 if (d != null) { -210 deps.addAll(d); -211 } -212 } -213 return deps; -214 } -215 -216 /** -217 * Scans a list of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies -218 * identified are added to the dependency collection. -219 * -220 * @param files a set of paths to files or directories to be analyzed -221 * @return the list of dependencies scanned -222 * @since v0.3.2.5 -223 */ -224 public List<Dependency> scan(Set<File> files) { -225 final List<Dependency> deps = new ArrayList<Dependency>(); -226 for (File file : files) { -227 final List<Dependency> d = scan(file); -228 if (d != null) { -229 deps.addAll(d); -230 } -231 } -232 return deps; -233 } -234 -235 /** -236 * Scans a list of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies -237 * identified are added to the dependency collection. -238 * -239 * @param files a set of paths to files or directories to be analyzed -240 * @return the list of dependencies scanned -241 * @since v0.3.2.5 -242 */ -243 public List<Dependency> scan(List<File> files) { -244 final List<Dependency> deps = new ArrayList<Dependency>(); -245 for (File file : files) { -246 final List<Dependency> d = scan(file); -247 if (d != null) { -248 deps.addAll(d); -249 } -250 } -251 return deps; -252 } -253 -254 /** -255 * Scans a given file or directory. If a directory is specified, it will be scanned recursively. Any dependencies identified -256 * are added to the dependency collection. -257 * -258 * @param file the path to a file or directory to be analyzed -259 * @return the list of dependencies scanned -260 * @since v0.3.2.4 -261 */ -262 public List<Dependency> scan(File file) { -263 if (file.exists()) { -264 if (file.isDirectory()) { -265 return scanDirectory(file); -266 } else { -267 final Dependency d = scanFile(file); -268 if (d != null) { -269 final List<Dependency> deps = new ArrayList<Dependency>(); -270 deps.add(d); -271 return deps; -272 } -273 } -274 } -275 return null; -276 } -277 -278 /** -279 * Recursively scans files and directories. Any dependencies identified are added to the dependency collection. -280 * -281 * @param dir the directory to scan -282 * @return the list of Dependency objects scanned -283 */ -284 protected List<Dependency> scanDirectory(File dir) { -285 final File[] files = dir.listFiles(); -286 final List<Dependency> deps = new ArrayList<Dependency>(); -287 if (files != null) { -288 for (File f : files) { -289 if (f.isDirectory()) { -290 final List<Dependency> d = scanDirectory(f); -291 if (d != null) { -292 deps.addAll(d); -293 } -294 } else { -295 final Dependency d = scanFile(f); -296 deps.add(d); -297 } -298 } -299 } -300 return deps; -301 } -302 -303 /** -304 * Scans a specified file. If a dependency is identified it is added to the dependency collection. -305 * -306 * @param file The file to scan -307 * @return the scanned dependency -308 */ -309 protected Dependency scanFile(File file) { -310 Dependency dependency = null; -311 if (file.isFile()) { -312 if (accept(file)) { -313 dependency = new Dependency(file); -314 dependencies.add(dependency); -315 } -316 } else { -317 LOGGER.debug("Path passed to scanFile(File) is not a file: {}. Skipping the file.", file); -318 } -319 return dependency; -320 } -321 -322 /** -323 * Runs the analyzers against all of the dependencies. Since the mutable dependencies list is exposed via -324 * {@link #getDependencies()}, this method iterates over a copy of the dependencies list. Thus, the potential for -325 * {@link java.util.ConcurrentModificationException}s is avoided, and analyzers may safely add or remove entries from the -326 * dependencies list. -327 */ -328 public void analyzeDependencies() { -329 boolean autoUpdate = true; -330 try { -331 autoUpdate = Settings.getBoolean(Settings.KEYS.AUTO_UPDATE); -332 } catch (InvalidSettingException ex) { -333 LOGGER.debug("Invalid setting for auto-update; using true."); -334 } -335 if (autoUpdate) { -336 doUpdates(); -337 } -338 -339 //need to ensure that data exists -340 try { -341 ensureDataExists(); -342 } catch (NoDataException ex) { -343 LOGGER.error("{}\n\nUnable to continue dependency-check analysis.", ex.getMessage()); -344 LOGGER.debug("", ex); -345 return; -346 } catch (DatabaseException ex) { -347 LOGGER.error("{}\n\nUnable to continue dependency-check analysis.", ex.getMessage()); -348 LOGGER.debug("", ex); -349 return; -350 -351 } -352 -353 LOGGER.debug("\n----------------------------------------------------\nBEGIN ANALYSIS\n----------------------------------------------------"); -354 LOGGER.info("Analysis Starting"); -355 -356 // analysis phases -357 for (AnalysisPhase phase : AnalysisPhase.values()) { -358 final List<Analyzer> analyzerList = analyzers.get(phase); -359 -360 for (Analyzer a : analyzerList) { -361 a = initializeAnalyzer(a); -362 -363 /* need to create a copy of the collection because some of the -364 * analyzers may modify it. This prevents ConcurrentModificationExceptions. -365 * This is okay for adds/deletes because it happens per analyzer. -366 */ -367 LOGGER.debug("Begin Analyzer '{}'", a.getName()); -368 final Set<Dependency> dependencySet = new HashSet<Dependency>(); -369 dependencySet.addAll(dependencies); -370 for (Dependency d : dependencySet) { -371 boolean shouldAnalyze = true; -372 if (a instanceof FileTypeAnalyzer) { -373 final FileTypeAnalyzer fAnalyzer = (FileTypeAnalyzer) a; -374 shouldAnalyze = fAnalyzer.accept(d.getActualFile()); -375 } -376 if (shouldAnalyze) { -377 LOGGER.debug("Begin Analysis of '{}'", d.getActualFilePath()); -378 try { -379 a.analyze(d, this); -380 } catch (AnalysisException ex) { -381 LOGGER.warn("An error occurred while analyzing '{}'.", d.getActualFilePath()); -382 LOGGER.debug("", ex); -383 } catch (Throwable ex) { -384 //final AnalysisException ax = new AnalysisException(axMsg, ex); -385 LOGGER.warn("An unexpected error occurred during analysis of '{}'", d.getActualFilePath()); -386 LOGGER.debug("", ex); -387 } -388 } -389 } -390 } -391 } -392 for (AnalysisPhase phase : AnalysisPhase.values()) { -393 final List<Analyzer> analyzerList = analyzers.get(phase); -394 -395 for (Analyzer a : analyzerList) { -396 closeAnalyzer(a); -397 } -398 } -399 -400 LOGGER.debug("\n----------------------------------------------------\nEND ANALYSIS\n----------------------------------------------------"); -401 LOGGER.info("Analysis Complete"); -402 } -403 -404 /** -405 * Initializes the given analyzer. -406 * -407 * @param analyzer the analyzer to initialize -408 * @return the initialized analyzer -409 */ -410 protected Analyzer initializeAnalyzer(Analyzer analyzer) { -411 try { -412 LOGGER.debug("Initializing {}", analyzer.getName()); -413 analyzer.initialize(); -414 } catch (Throwable ex) { -415 LOGGER.error("Exception occurred initializing {}.", analyzer.getName()); -416 LOGGER.debug("", ex); -417 try { -418 analyzer.close(); -419 } catch (Throwable ex1) { -420 LOGGER.trace("", ex1); -421 } -422 } -423 return analyzer; -424 } -425 -426 /** -427 * Closes the given analyzer. -428 * -429 * @param analyzer the analyzer to close -430 */ -431 protected void closeAnalyzer(Analyzer analyzer) { -432 LOGGER.debug("Closing Analyzer '{}'", analyzer.getName()); -433 try { -434 analyzer.close(); -435 } catch (Throwable ex) { -436 LOGGER.trace("", ex); -437 } -438 } -439 -440 /** -441 * Cycles through the cached web data sources and calls update on all of them. -442 */ -443 public void doUpdates() { -444 LOGGER.info("Checking for updates"); -445 final UpdateService service = new UpdateService(serviceClassLoader); -446 final Iterator<CachedWebDataSource> iterator = service.getDataSources(); -447 while (iterator.hasNext()) { -448 final CachedWebDataSource source = iterator.next(); -449 try { -450 source.update(); -451 } catch (UpdateException ex) { -452 LOGGER.warn( -453 "Unable to update Cached Web DataSource, using local data instead. Results may not include recent vulnerabilities."); -454 LOGGER.debug("Unable to update details for {}", source.getClass().getName(), ex); -455 } -456 } -457 LOGGER.info("Check for updates complete"); -458 } -459 -460 /** -461 * Returns a full list of all of the analyzers. This is useful for reporting which analyzers where used. -462 * -463 * @return a list of Analyzers -464 */ -465 public List<Analyzer> getAnalyzers() { -466 final List<Analyzer> ret = new ArrayList<Analyzer>(); -467 for (AnalysisPhase phase : AnalysisPhase.values()) { -468 final List<Analyzer> analyzerList = analyzers.get(phase); -469 ret.addAll(analyzerList); -470 } -471 return ret; -472 } -473 -474 /** -475 * Checks all analyzers to see if an extension is supported. -476 * -477 * @param file a file extension -478 * @return true or false depending on whether or not the file extension is supported -479 */ -480 public boolean accept(File file) { -481 if (file == null) { -482 return false; -483 } -484 boolean scan = false; -485 for (FileTypeAnalyzer a : this.fileTypeAnalyzers) { -486 /* note, we can't break early on this loop as the analyzers need to know if -487 they have files to work on prior to initialization */ -488 scan |= a.accept(file); -489 } -490 return scan; -491 } -492 -493 /** -494 * Returns the set of file type analyzers. -495 * -496 * @return the set of file type analyzers -497 */ -498 public Set<FileTypeAnalyzer> getFileTypeAnalyzers() { -499 return this.fileTypeAnalyzers; -500 } -501 -502 /** -503 * Checks the CPE Index to ensure documents exists. If none exist a NoDataException is thrown. -504 * -505 * @throws NoDataException thrown if no data exists in the CPE Index -506 * @throws DatabaseException thrown if there is an exception opening the database -507 */ -508 private void ensureDataExists() throws NoDataException, DatabaseException { -509 final CveDB cve = new CveDB(); -510 try { -511 cve.open(); -512 if (!cve.dataExists()) { -513 throw new NoDataException("No documents exist"); -514 } -515 } catch (DatabaseException ex) { -516 throw new NoDataException(ex.getMessage(), ex); -517 } finally { -518 cve.close(); -519 } -520 } -521 } +45 import java.util.Map; +46 import java.util.Set; +47 +48 /** +49 * Scans files, directories, etc. for Dependencies. Analyzers are loaded and used to process the files found by the scan, if a +50 * file is encountered and an Analyzer is associated with the file type then the file is turned into a dependency. +51 * +52 * @author Jeremy Long +53 */ +54 public class Engine implements FileFilter { +55 +56 /** +57 * The list of dependencies. +58 */ +59 private List<Dependency> dependencies = new ArrayList<Dependency>(); +60 /** +61 * A Map of analyzers grouped by Analysis phase. +62 */ +63 private Map<AnalysisPhase, List<Analyzer>> analyzers = new EnumMap<AnalysisPhase, List<Analyzer>>(AnalysisPhase.class); +64 +65 /** +66 * A Map of analyzers grouped by Analysis phase. +67 */ +68 private Set<FileTypeAnalyzer> fileTypeAnalyzers = new HashSet<FileTypeAnalyzer>(); +69 +70 /** +71 * The ClassLoader to use when dynamically loading Analyzer and Update services. +72 */ +73 private ClassLoader serviceClassLoader = Thread.currentThread().getContextClassLoader(); +74 /** +75 * The Logger for use throughout the class. +76 */ +77 private static final Logger LOGGER = LoggerFactory.getLogger(Engine.class); +78 +79 /** +80 * Creates a new Engine. +81 * +82 * @throws DatabaseException thrown if there is an error connecting to the database +83 */ +84 public Engine() throws DatabaseException { +85 initializeEngine(); +86 } +87 +88 /** +89 * Creates a new Engine. +90 * +91 * @param serviceClassLoader a reference the class loader being used +92 * @throws DatabaseException thrown if there is an error connecting to the database +93 */ +94 public Engine(ClassLoader serviceClassLoader) throws DatabaseException { +95 this.serviceClassLoader = serviceClassLoader; +96 initializeEngine(); +97 } +98 +99 /** +100 * Creates a new Engine using the specified classloader to dynamically load Analyzer and Update services. +101 * +102 * @throws DatabaseException thrown if there is an error connecting to the database +103 */ +104 protected final void initializeEngine() throws DatabaseException { +105 ConnectionFactory.initialize(); +106 loadAnalyzers(); +107 } +108 +109 /** +110 * Properly cleans up resources allocated during analysis. +111 */ +112 public void cleanup() { +113 ConnectionFactory.cleanup(); +114 } +115 +116 /** +117 * Loads the analyzers specified in the configuration file (or system properties). +118 */ +119 private void loadAnalyzers() { +120 if (!analyzers.isEmpty()) { +121 return; +122 } +123 for (AnalysisPhase phase : AnalysisPhase.values()) { +124 analyzers.put(phase, new ArrayList<Analyzer>()); +125 } +126 +127 final AnalyzerService service = new AnalyzerService(serviceClassLoader); +128 final Iterator<Analyzer> iterator = service.getAnalyzers(); +129 while (iterator.hasNext()) { +130 final Analyzer a = iterator.next(); +131 analyzers.get(a.getAnalysisPhase()).add(a); +132 if (a instanceof FileTypeAnalyzer) { +133 this.fileTypeAnalyzers.add((FileTypeAnalyzer) a); +134 } +135 } +136 } +137 +138 /** +139 * Get the List of the analyzers for a specific phase of analysis. +140 * +141 * @param phase the phase to get the configured analyzers. +142 * @return the analyzers loaded +143 */ +144 public List<Analyzer> getAnalyzers(AnalysisPhase phase) { +145 return analyzers.get(phase); +146 } +147 +148 /** +149 * Get the dependencies identified. +150 * +151 * @return the dependencies identified +152 */ +153 public List<Dependency> getDependencies() { +154 return dependencies; +155 } +156 +157 /** +158 * Sets the dependencies. +159 * +160 * @param dependencies the dependencies +161 */ +162 public void setDependencies(List<Dependency> dependencies) { +163 this.dependencies = dependencies; +164 } +165 +166 /** +167 * Scans an array of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies +168 * identified are added to the dependency collection. +169 * +170 * @param paths an array of paths to files or directories to be analyzed +171 * @return the list of dependencies scanned +172 * @since v0.3.2.5 +173 */ +174 public List<Dependency> scan(String[] paths) { +175 final List<Dependency> deps = new ArrayList<Dependency>(); +176 for (String path : paths) { +177 final File file = new File(path); +178 final List<Dependency> d = scan(file); +179 if (d != null) { +180 deps.addAll(d); +181 } +182 } +183 return deps; +184 } +185 +186 /** +187 * Scans a given file or directory. If a directory is specified, it will be scanned recursively. Any dependencies identified +188 * are added to the dependency collection. +189 * +190 * @param path the path to a file or directory to be analyzed +191 * @return the list of dependencies scanned +192 */ +193 public List<Dependency> scan(String path) { +194 final File file = new File(path); +195 return scan(file); +196 } +197 +198 /** +199 * Scans an array of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies +200 * identified are added to the dependency collection. +201 * +202 * @param files an array of paths to files or directories to be analyzed. +203 * @return the list of dependencies +204 * @since v0.3.2.5 +205 */ +206 public List<Dependency> scan(File[] files) { +207 final List<Dependency> deps = new ArrayList<Dependency>(); +208 for (File file : files) { +209 final List<Dependency> d = scan(file); +210 if (d != null) { +211 deps.addAll(d); +212 } +213 } +214 return deps; +215 } +216 +217 /** +218 * Scans a list of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies +219 * identified are added to the dependency collection. +220 * +221 * @param files a set of paths to files or directories to be analyzed +222 * @return the list of dependencies scanned +223 * @since v0.3.2.5 +224 */ +225 public List<Dependency> scan(Set<File> files) { +226 final List<Dependency> deps = new ArrayList<Dependency>(); +227 for (File file : files) { +228 final List<Dependency> d = scan(file); +229 if (d != null) { +230 deps.addAll(d); +231 } +232 } +233 return deps; +234 } +235 +236 /** +237 * Scans a list of files or directories. If a directory is specified, it will be scanned recursively. Any dependencies +238 * identified are added to the dependency collection. +239 * +240 * @param files a set of paths to files or directories to be analyzed +241 * @return the list of dependencies scanned +242 * @since v0.3.2.5 +243 */ +244 public List<Dependency> scan(List<File> files) { +245 final List<Dependency> deps = new ArrayList<Dependency>(); +246 for (File file : files) { +247 final List<Dependency> d = scan(file); +248 if (d != null) { +249 deps.addAll(d); +250 } +251 } +252 return deps; +253 } +254 +255 /** +256 * Scans a given file or directory. If a directory is specified, it will be scanned recursively. Any dependencies identified +257 * are added to the dependency collection. +258 * +259 * @param file the path to a file or directory to be analyzed +260 * @return the list of dependencies scanned +261 * @since v0.3.2.4 +262 */ +263 public List<Dependency> scan(File file) { +264 if (file.exists()) { +265 if (file.isDirectory()) { +266 return scanDirectory(file); +267 } else { +268 final Dependency d = scanFile(file); +269 if (d != null) { +270 final List<Dependency> deps = new ArrayList<Dependency>(); +271 deps.add(d); +272 return deps; +273 } +274 } +275 } +276 return null; +277 } +278 +279 /** +280 * Recursively scans files and directories. Any dependencies identified are added to the dependency collection. +281 * +282 * @param dir the directory to scan +283 * @return the list of Dependency objects scanned +284 */ +285 protected List<Dependency> scanDirectory(File dir) { +286 final File[] files = dir.listFiles(); +287 final List<Dependency> deps = new ArrayList<Dependency>(); +288 if (files != null) { +289 for (File f : files) { +290 if (f.isDirectory()) { +291 final List<Dependency> d = scanDirectory(f); +292 if (d != null) { +293 deps.addAll(d); +294 } +295 } else { +296 final Dependency d = scanFile(f); +297 deps.add(d); +298 } +299 } +300 } +301 return deps; +302 } +303 +304 /** +305 * Scans a specified file. If a dependency is identified it is added to the dependency collection. +306 * +307 * @param file The file to scan +308 * @return the scanned dependency +309 */ +310 protected Dependency scanFile(File file) { +311 Dependency dependency = null; +312 if (file.isFile()) { +313 if (accept(file)) { +314 dependency = new Dependency(file); +315 dependencies.add(dependency); +316 } +317 } else { +318 LOGGER.debug("Path passed to scanFile(File) is not a file: {}. Skipping the file.", file); +319 } +320 return dependency; +321 } +322 +323 /** +324 * Runs the analyzers against all of the dependencies. Since the mutable dependencies list is exposed via +325 * {@link #getDependencies()}, this method iterates over a copy of the dependencies list. Thus, the potential for +326 * {@link java.util.ConcurrentModificationException}s is avoided, and analyzers may safely add or remove entries from the +327 * dependencies list. +328 */ +329 public void analyzeDependencies() { +330 boolean autoUpdate = true; +331 try { +332 autoUpdate = Settings.getBoolean(Settings.KEYS.AUTO_UPDATE); +333 } catch (InvalidSettingException ex) { +334 LOGGER.debug("Invalid setting for auto-update; using true."); +335 } +336 if (autoUpdate) { +337 doUpdates(); +338 } +339 +340 //need to ensure that data exists +341 try { +342 ensureDataExists(); +343 } catch (NoDataException ex) { +344 LOGGER.error("{}\n\nUnable to continue dependency-check analysis.", ex.getMessage()); +345 LOGGER.debug("", ex); +346 return; +347 } catch (DatabaseException ex) { +348 LOGGER.error("{}\n\nUnable to continue dependency-check analysis.", ex.getMessage()); +349 LOGGER.debug("", ex); +350 return; +351 +352 } +353 +354 LOGGER.debug("\n----------------------------------------------------\nBEGIN ANALYSIS\n----------------------------------------------------"); +355 LOGGER.info("Analysis Starting"); +356 final long analysisStart = System.currentTimeMillis(); +357 +358 // analysis phases +359 for (AnalysisPhase phase : AnalysisPhase.values()) { +360 final List<Analyzer> analyzerList = analyzers.get(phase); +361 +362 for (Analyzer a : analyzerList) { +363 a = initializeAnalyzer(a); +364 +365 /* need to create a copy of the collection because some of the +366 * analyzers may modify it. This prevents ConcurrentModificationExceptions. +367 * This is okay for adds/deletes because it happens per analyzer. +368 */ +369 LOGGER.debug("Begin Analyzer '{}'", a.getName()); +370 final Set<Dependency> dependencySet = new HashSet<Dependency>(dependencies); +371 for (Dependency d : dependencySet) { +372 boolean shouldAnalyze = true; +373 if (a instanceof FileTypeAnalyzer) { +374 final FileTypeAnalyzer fAnalyzer = (FileTypeAnalyzer) a; +375 shouldAnalyze = fAnalyzer.accept(d.getActualFile()); +376 } +377 if (shouldAnalyze) { +378 LOGGER.debug("Begin Analysis of '{}'", d.getActualFilePath()); +379 try { +380 a.analyze(d, this); +381 } catch (AnalysisException ex) { +382 LOGGER.warn("An error occurred while analyzing '{}'.", d.getActualFilePath()); +383 LOGGER.debug("", ex); +384 } catch (Throwable ex) { +385 //final AnalysisException ax = new AnalysisException(axMsg, ex); +386 LOGGER.warn("An unexpected error occurred during analysis of '{}'", d.getActualFilePath()); +387 LOGGER.debug("", ex); +388 } +389 } +390 } +391 } +392 } +393 for (AnalysisPhase phase : AnalysisPhase.values()) { +394 final List<Analyzer> analyzerList = analyzers.get(phase); +395 +396 for (Analyzer a : analyzerList) { +397 closeAnalyzer(a); +398 } +399 } +400 +401 LOGGER.debug("\n----------------------------------------------------\nEND ANALYSIS\n----------------------------------------------------"); +402 LOGGER.info("Analysis Complete ({} ms)", System.currentTimeMillis() - analysisStart); +403 } +404 +405 /** +406 * Initializes the given analyzer. +407 * +408 * @param analyzer the analyzer to initialize +409 * @return the initialized analyzer +410 */ +411 protected Analyzer initializeAnalyzer(Analyzer analyzer) { +412 try { +413 LOGGER.debug("Initializing {}", analyzer.getName()); +414 analyzer.initialize(); +415 } catch (Throwable ex) { +416 LOGGER.error("Exception occurred initializing {}.", analyzer.getName()); +417 LOGGER.debug("", ex); +418 try { +419 analyzer.close(); +420 } catch (Throwable ex1) { +421 LOGGER.trace("", ex1); +422 } +423 } +424 return analyzer; +425 } +426 +427 /** +428 * Closes the given analyzer. +429 * +430 * @param analyzer the analyzer to close +431 */ +432 protected void closeAnalyzer(Analyzer analyzer) { +433 LOGGER.debug("Closing Analyzer '{}'", analyzer.getName()); +434 try { +435 analyzer.close(); +436 } catch (Throwable ex) { +437 LOGGER.trace("", ex); +438 } +439 } +440 +441 /** +442 * Cycles through the cached web data sources and calls update on all of them. +443 */ +444 public void doUpdates() { +445 LOGGER.info("Checking for updates"); +446 final long updateStart = System.currentTimeMillis(); +447 final UpdateService service = new UpdateService(serviceClassLoader); +448 final Iterator<CachedWebDataSource> iterator = service.getDataSources(); +449 while (iterator.hasNext()) { +450 final CachedWebDataSource source = iterator.next(); +451 try { +452 source.update(); +453 } catch (UpdateException ex) { +454 LOGGER.warn( +455 "Unable to update Cached Web DataSource, using local data instead. Results may not include recent vulnerabilities."); +456 LOGGER.debug("Unable to update details for {}", source.getClass().getName(), ex); +457 } +458 } +459 LOGGER.info("Check for updates complete ({} ms)", System.currentTimeMillis() - updateStart); +460 } +461 +462 /** +463 * Returns a full list of all of the analyzers. This is useful for reporting which analyzers where used. +464 * +465 * @return a list of Analyzers +466 */ +467 public List<Analyzer> getAnalyzers() { +468 final List<Analyzer> ret = new ArrayList<Analyzer>(); +469 for (AnalysisPhase phase : AnalysisPhase.values()) { +470 final List<Analyzer> analyzerList = analyzers.get(phase); +471 ret.addAll(analyzerList); +472 } +473 return ret; +474 } +475 +476 /** +477 * Checks all analyzers to see if an extension is supported. +478 * +479 * @param file a file extension +480 * @return true or false depending on whether or not the file extension is supported +481 */ +482 @Override +483 public boolean accept(File file) { +484 if (file == null) { +485 return false; +486 } +487 boolean scan = false; +488 for (FileTypeAnalyzer a : this.fileTypeAnalyzers) { +489 /* note, we can't break early on this loop as the analyzers need to know if +490 they have files to work on prior to initialization */ +491 scan |= a.accept(file); +492 } +493 return scan; +494 } +495 +496 /** +497 * Returns the set of file type analyzers. +498 * +499 * @return the set of file type analyzers +500 */ +501 public Set<FileTypeAnalyzer> getFileTypeAnalyzers() { +502 return this.fileTypeAnalyzers; +503 } +504 +505 /** +506 * Checks the CPE Index to ensure documents exists. If none exist a NoDataException is thrown. +507 * +508 * @throws NoDataException thrown if no data exists in the CPE Index +509 * @throws DatabaseException thrown if there is an exception opening the database +510 */ +511 private void ensureDataExists() throws NoDataException, DatabaseException { +512 final CveDB cve = new CveDB(); +513 try { +514 cve.open(); +515 if (!cve.dataExists()) { +516 throw new NoDataException("No documents exist"); +517 } +518 } catch (DatabaseException ex) { +519 throw new NoDataException(ex.getMessage(), ex); +520 } finally { +521 cve.close(); +522 } +523 } +524 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/agent/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/agent/package-frame.html index b489abcc2..3b026ec93 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/agent/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/agent/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.agent + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.agent diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/agent/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/agent/package-summary.html index 5b159260e..83eb14727 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/agent/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/agent/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.agent + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.agent diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/ArchiveAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/ArchiveAnalyzer.html index 4a850967c..94bf4b6ed 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/ArchiveAnalyzer.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/ArchiveAnalyzer.html @@ -26,7 +26,7 @@ 18 package org.owasp.dependencycheck.analyzer; 19 20 import java.io.BufferedInputStream; -21 import java.io.BufferedOutputStream; +21 import java.io.Closeable; 22 import java.io.File; 23 import java.io.FileFilter; 24 import java.io.FileInputStream; @@ -34,49 +34,49 @@ 26 import java.io.FileOutputStream; 27 import java.io.IOException; 28 import java.util.ArrayList; -29 import java.util.Arrays; -30 import java.util.Collections; -31 import java.util.Enumeration; -32 import java.util.HashSet; -33 import java.util.List; -34 import java.util.Set; -35 -36 import org.apache.commons.compress.archivers.ArchiveEntry; -37 import org.apache.commons.compress.archivers.ArchiveInputStream; -38 import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; -39 import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; -40 import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; -41 import org.apache.commons.compress.archivers.zip.ZipFile; -42 import org.apache.commons.compress.compressors.CompressorInputStream; -43 import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; -44 import org.apache.commons.compress.compressors.gzip.GzipUtils; -45 import org.owasp.dependencycheck.Engine; -46 import org.owasp.dependencycheck.analyzer.exception.AnalysisException; -47 import org.owasp.dependencycheck.analyzer.exception.ArchiveExtractionException; -48 import org.owasp.dependencycheck.dependency.Dependency; -49 import org.owasp.dependencycheck.utils.FileFilterBuilder; -50 import org.owasp.dependencycheck.utils.FileUtils; -51 import org.owasp.dependencycheck.utils.Settings; -52 import org.slf4j.Logger; -53 import org.slf4j.LoggerFactory; -54 -55 /** -56 * <p> -57 * An analyzer that extracts files from archives and ensures any supported files contained within the archive are added to the -58 * dependency list.</p> -59 * -60 * @author Jeremy Long -61 */ -62 public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer { -63 -64 /** -65 * The logger. -66 */ -67 private static final Logger LOGGER = LoggerFactory.getLogger(ArchiveAnalyzer.class); +29 import java.util.Collections; +30 import java.util.Enumeration; +31 import java.util.HashSet; +32 import java.util.List; +33 import java.util.Set; +34 +35 import org.apache.commons.compress.archivers.ArchiveEntry; +36 import org.apache.commons.compress.archivers.ArchiveInputStream; +37 import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +38 import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; +39 import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; +40 import org.apache.commons.compress.archivers.zip.ZipFile; +41 import org.apache.commons.compress.compressors.CompressorInputStream; +42 import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream; +43 import org.apache.commons.compress.compressors.bzip2.BZip2Utils; +44 import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; +45 import org.apache.commons.compress.compressors.gzip.GzipUtils; +46 import org.apache.commons.compress.utils.IOUtils; +47 +48 import org.owasp.dependencycheck.Engine; +49 import org.owasp.dependencycheck.analyzer.exception.AnalysisException; +50 import org.owasp.dependencycheck.analyzer.exception.ArchiveExtractionException; +51 import org.owasp.dependencycheck.dependency.Dependency; +52 import org.owasp.dependencycheck.utils.FileFilterBuilder; +53 import org.owasp.dependencycheck.utils.FileUtils; +54 import org.owasp.dependencycheck.utils.Settings; +55 +56 import org.slf4j.Logger; +57 import org.slf4j.LoggerFactory; +58 +59 /** +60 * <p> +61 * An analyzer that extracts files from archives and ensures any supported files contained within the archive are added to the +62 * dependency list.</p> +63 * +64 * @author Jeremy Long +65 */ +66 public class ArchiveAnalyzer extends AbstractFileTypeAnalyzer { +67 68 /** -69 * The buffer size to use when extracting files from the archive. +69 * The logger. 70 */ -71 private static final int BUFFER_SIZE = 4096; +71 private static final Logger LOGGER = LoggerFactory.getLogger(ArchiveAnalyzer.class); 72 /** 73 * The count of directories created during analysis. This is used for creating temporary directories. 74 */ @@ -109,354 +109,354 @@ 101 private static final Set<String> ZIPPABLES = newHashSet("zip", "ear", "war", "jar", "sar", "apk", "nupkg"); 102 /** 103 * The set of file extensions supported by this analyzer. Note for developers, any additions to this list will need to be -104 * explicitly handled in extractFiles(). +104 * explicitly handled in {@link #extractFiles(File, File, Engine)}. 105 */ -106 private static final Set<String> EXTENSIONS = newHashSet("tar", "gz", "tgz"); +106 private static final Set<String> EXTENSIONS = newHashSet("tar", "gz", "tgz", "bz2", "tbz2"); 107 108 /** 109 * Detects files with extensions to remove from the engine's collection of dependencies. 110 */ -111 private static final FileFilter REMOVE_FROM_ANALYSIS = FileFilterBuilder.newInstance().addExtensions("zip", "tar", "gz", "tgz").build(); -112 -113 static { -114 final String additionalZipExt = Settings.getString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS); -115 if (additionalZipExt != null) { -116 final Set<String> ext = new HashSet<String>(Arrays.asList(additionalZipExt)); -117 ZIPPABLES.addAll(ext); -118 } -119 EXTENSIONS.addAll(ZIPPABLES); -120 } -121 -122 /** -123 * The file filter used to filter supported files. -124 */ -125 private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build(); -126 -127 @Override -128 protected FileFilter getFileFilter() { -129 return FILTER; -130 } -131 -132 /** -133 * Detects files with .zip extension. -134 */ -135 private static final FileFilter ZIP_FILTER = FileFilterBuilder.newInstance().addExtensions("zip").build(); -136 -137 /** -138 * Returns the name of the analyzer. -139 * -140 * @return the name of the analyzer. -141 */ -142 @Override -143 public String getName() { -144 return ANALYZER_NAME; -145 } -146 -147 /** -148 * Returns the phase that the analyzer is intended to run in. -149 * -150 * @return the phase that the analyzer is intended to run in. -151 */ -152 @Override -153 public AnalysisPhase getAnalysisPhase() { -154 return ANALYSIS_PHASE; -155 } -156 //</editor-fold> -157 -158 /** -159 * Returns the key used in the properties file to reference the analyzer's enabled property. -160 * -161 * @return the analyzer's enabled property setting key -162 */ -163 @Override -164 protected String getAnalyzerEnabledSettingKey() { -165 return Settings.KEYS.ANALYZER_ARCHIVE_ENABLED; -166 } -167 -168 /** -169 * The initialize method does nothing for this Analyzer. -170 * -171 * @throws Exception is thrown if there is an exception deleting or creating temporary files -172 */ -173 @Override -174 public void initializeFileTypeAnalyzer() throws Exception { -175 final File baseDir = Settings.getTempDirectory(); -176 tempFileLocation = File.createTempFile("check", "tmp", baseDir); -177 if (!tempFileLocation.delete()) { -178 final String msg = String.format("Unable to delete temporary file '%s'.", tempFileLocation.getAbsolutePath()); -179 throw new AnalysisException(msg); -180 } -181 if (!tempFileLocation.mkdirs()) { -182 final String msg = String.format("Unable to create directory '%s'.", tempFileLocation.getAbsolutePath()); -183 throw new AnalysisException(msg); -184 } -185 } -186 -187 /** -188 * The close method deletes any temporary files and directories created during analysis. -189 * -190 * @throws Exception thrown if there is an exception deleting temporary files -191 */ -192 @Override -193 public void close() throws Exception { -194 if (tempFileLocation != null && tempFileLocation.exists()) { -195 LOGGER.debug("Attempting to delete temporary files"); -196 final boolean success = FileUtils.delete(tempFileLocation); -197 if (!success && tempFileLocation != null && tempFileLocation.exists() && tempFileLocation.list().length > 0) { -198 LOGGER.warn("Failed to delete some temporary files, see the log for more details"); -199 } -200 } -201 } -202 -203 /** -204 * Analyzes a given dependency. If the dependency is an archive, such as a WAR or EAR, the contents are extracted, scanned, -205 * and added to the list of dependencies within the engine. -206 * -207 * @param dependency the dependency to analyze -208 * @param engine the engine scanning -209 * @throws AnalysisException thrown if there is an analysis exception -210 */ -211 @Override -212 public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException { -213 final File f = new File(dependency.getActualFilePath()); -214 final File tmpDir = getNextTempDirectory(); -215 extractFiles(f, tmpDir, engine); -216 -217 //make a copy -218 List<Dependency> dependencies = new ArrayList<Dependency>(engine.getDependencies()); -219 engine.scan(tmpDir); -220 List<Dependency> newDependencies = engine.getDependencies(); -221 if (dependencies.size() != newDependencies.size()) { -222 //get the new dependencies -223 final Set<Dependency> dependencySet = new HashSet<Dependency>(); -224 dependencySet.addAll(newDependencies); -225 dependencySet.removeAll(dependencies); -226 -227 for (Dependency d : dependencySet) { -228 //fix the dependency's display name and path -229 final String displayPath = String.format("%s%s", -230 dependency.getFilePath(), -231 d.getActualFilePath().substring(tmpDir.getAbsolutePath().length())); -232 final String displayName = String.format("%s: %s", -233 dependency.getFileName(), -234 d.getFileName()); -235 d.setFilePath(displayPath); -236 d.setFileName(displayName); -237 -238 //TODO - can we get more evidence from the parent? EAR contains module name, etc. -239 //analyze the dependency (i.e. extract files) if it is a supported type. -240 if (this.accept(d.getActualFile()) && scanDepth < MAX_SCAN_DEPTH) { -241 scanDepth += 1; -242 analyze(d, engine); -243 scanDepth -= 1; -244 } -245 } -246 } -247 if (REMOVE_FROM_ANALYSIS.accept(dependency.getActualFile())) { -248 if (ZIP_FILTER.accept(dependency.getActualFile()) && isZipFileActuallyJarFile(dependency)) { -249 final File tdir = getNextTempDirectory(); -250 final String fileName = dependency.getFileName(); -251 -252 LOGGER.info(String.format("The zip file '%s' appears to be a JAR file, making a copy and analyzing it as a JAR.", fileName)); -253 -254 final File tmpLoc = new File(tdir, fileName.substring(0, fileName.length() - 3) + "jar"); -255 try { -256 org.apache.commons.io.FileUtils.copyFile(tdir, tmpLoc); -257 dependencies = new ArrayList<Dependency>(engine.getDependencies()); -258 engine.scan(tmpLoc); -259 newDependencies = engine.getDependencies(); -260 if (dependencies.size() != newDependencies.size()) { -261 //get the new dependencies -262 final Set<Dependency> dependencySet = new HashSet<Dependency>(); -263 dependencySet.addAll(newDependencies); -264 dependencySet.removeAll(dependencies); -265 if (dependencySet.size() != 1) { -266 LOGGER.info("Deep copy of ZIP to JAR file resulted in more then one dependency?"); -267 } -268 for (Dependency d : dependencySet) { -269 //fix the dependency's display name and path -270 d.setFilePath(dependency.getFilePath()); -271 d.setDisplayFileName(dependency.getFileName()); -272 } -273 } -274 } catch (IOException ex) { -275 LOGGER.debug("Unable to perform deep copy on '{}'", dependency.getActualFile().getPath(), ex); -276 } -277 } -278 engine.getDependencies().remove(dependency); +111 private static final FileFilter REMOVE_FROM_ANALYSIS = FileFilterBuilder.newInstance().addExtensions("zip", "tar", "gz", "tgz", "bz2", "tbz2") +112 .build(); +113 +114 static { +115 final String additionalZipExt = Settings.getString(Settings.KEYS.ADDITIONAL_ZIP_EXTENSIONS); +116 if (additionalZipExt != null) { +117 final Set<String> ext = new HashSet<String>(Collections.singletonList(additionalZipExt)); +118 ZIPPABLES.addAll(ext); +119 } +120 EXTENSIONS.addAll(ZIPPABLES); +121 } +122 +123 /** +124 * The file filter used to filter supported files. +125 */ +126 private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build(); +127 +128 @Override +129 protected FileFilter getFileFilter() { +130 return FILTER; +131 } +132 +133 /** +134 * Detects files with .zip extension. +135 */ +136 private static final FileFilter ZIP_FILTER = FileFilterBuilder.newInstance().addExtensions("zip").build(); +137 +138 /** +139 * Returns the name of the analyzer. +140 * +141 * @return the name of the analyzer. +142 */ +143 @Override +144 public String getName() { +145 return ANALYZER_NAME; +146 } +147 +148 /** +149 * Returns the phase that the analyzer is intended to run in. +150 * +151 * @return the phase that the analyzer is intended to run in. +152 */ +153 @Override +154 public AnalysisPhase getAnalysisPhase() { +155 return ANALYSIS_PHASE; +156 } +157 //</editor-fold> +158 +159 /** +160 * Returns the key used in the properties file to reference the analyzer's enabled property. +161 * +162 * @return the analyzer's enabled property setting key +163 */ +164 @Override +165 protected String getAnalyzerEnabledSettingKey() { +166 return Settings.KEYS.ANALYZER_ARCHIVE_ENABLED; +167 } +168 +169 /** +170 * The initialize method does nothing for this Analyzer. +171 * +172 * @throws Exception is thrown if there is an exception deleting or creating temporary files +173 */ +174 @Override +175 public void initializeFileTypeAnalyzer() throws Exception { +176 final File baseDir = Settings.getTempDirectory(); +177 tempFileLocation = File.createTempFile("check", "tmp", baseDir); +178 if (!tempFileLocation.delete()) { +179 final String msg = String.format("Unable to delete temporary file '%s'.", tempFileLocation.getAbsolutePath()); +180 throw new AnalysisException(msg); +181 } +182 if (!tempFileLocation.mkdirs()) { +183 final String msg = String.format("Unable to create directory '%s'.", tempFileLocation.getAbsolutePath()); +184 throw new AnalysisException(msg); +185 } +186 } +187 +188 /** +189 * The close method deletes any temporary files and directories created during analysis. +190 * +191 * @throws Exception thrown if there is an exception deleting temporary files +192 */ +193 @Override +194 public void close() throws Exception { +195 if (tempFileLocation != null && tempFileLocation.exists()) { +196 LOGGER.debug("Attempting to delete temporary files"); +197 final boolean success = FileUtils.delete(tempFileLocation); +198 if (!success && tempFileLocation.exists() && tempFileLocation.list().length > 0) { +199 LOGGER.warn("Failed to delete some temporary files, see the log for more details"); +200 } +201 } +202 } +203 +204 /** +205 * Analyzes a given dependency. If the dependency is an archive, such as a WAR or EAR, the contents are extracted, scanned, +206 * and added to the list of dependencies within the engine. +207 * +208 * @param dependency the dependency to analyze +209 * @param engine the engine scanning +210 * @throws AnalysisException thrown if there is an analysis exception +211 */ +212 @Override +213 public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException { +214 final File f = new File(dependency.getActualFilePath()); +215 final File tmpDir = getNextTempDirectory(); +216 extractFiles(f, tmpDir, engine); +217 +218 //make a copy +219 final Set<Dependency> dependencySet = findMoreDependencies(engine, tmpDir); +220 if (!dependencySet.isEmpty()) { +221 for (Dependency d : dependencySet) { +222 //fix the dependency's display name and path +223 final String displayPath = String.format("%s%s", +224 dependency.getFilePath(), +225 d.getActualFilePath().substring(tmpDir.getAbsolutePath().length())); +226 final String displayName = String.format("%s: %s", +227 dependency.getFileName(), +228 d.getFileName()); +229 d.setFilePath(displayPath); +230 d.setFileName(displayName); +231 +232 //TODO - can we get more evidence from the parent? EAR contains module name, etc. +233 //analyze the dependency (i.e. extract files) if it is a supported type. +234 if (this.accept(d.getActualFile()) && scanDepth < MAX_SCAN_DEPTH) { +235 scanDepth += 1; +236 analyze(d, engine); +237 scanDepth -= 1; +238 } +239 } +240 } +241 if (REMOVE_FROM_ANALYSIS.accept(dependency.getActualFile())) { +242 addDisguisedJarsToDependencies(dependency, engine); +243 engine.getDependencies().remove(dependency); +244 } +245 Collections.sort(engine.getDependencies()); +246 } +247 +248 /** +249 * If a zip file was identified as a possible JAR, this method will add the zip to the list of dependencies. +250 * +251 * @param dependency the zip file +252 * @param engine the engine +253 * @throws AnalysisException thrown if there is an issue +254 */ +255 private void addDisguisedJarsToDependencies(Dependency dependency, Engine engine) throws AnalysisException { +256 if (ZIP_FILTER.accept(dependency.getActualFile()) && isZipFileActuallyJarFile(dependency)) { +257 final File tdir = getNextTempDirectory(); +258 final String fileName = dependency.getFileName(); +259 +260 LOGGER.info("The zip file '{}' appears to be a JAR file, making a copy and analyzing it as a JAR.", fileName); +261 +262 final File tmpLoc = new File(tdir, fileName.substring(0, fileName.length() - 3) + "jar"); +263 try { +264 org.apache.commons.io.FileUtils.copyFile(tdir, tmpLoc); +265 final Set<Dependency> dependencySet = findMoreDependencies(engine, tmpLoc); +266 if (!dependencySet.isEmpty()) { +267 if (dependencySet.size() != 1) { +268 LOGGER.info("Deep copy of ZIP to JAR file resulted in more than one dependency?"); +269 } +270 for (Dependency d : dependencySet) { +271 //fix the dependency's display name and path +272 d.setFilePath(dependency.getFilePath()); +273 d.setDisplayFileName(dependency.getFileName()); +274 } +275 } +276 } catch (IOException ex) { +277 LOGGER.debug("Unable to perform deep copy on '{}'", dependency.getActualFile().getPath(), ex); +278 } 279 } -280 Collections.sort(engine.getDependencies()); -281 } -282 -283 /** -284 * Retrieves the next temporary directory to extract an archive too. -285 * -286 * @return a directory -287 * @throws AnalysisException thrown if unable to create temporary directory -288 */ -289 private File getNextTempDirectory() throws AnalysisException { -290 dirCount += 1; -291 final File directory = new File(tempFileLocation, String.valueOf(dirCount)); -292 //getting an exception for some directories not being able to be created; might be because the directory already exists? -293 if (directory.exists()) { -294 return getNextTempDirectory(); -295 } -296 if (!directory.mkdirs()) { -297 final String msg = String.format("Unable to create temp directory '%s'.", directory.getAbsolutePath()); -298 throw new AnalysisException(msg); -299 } -300 return directory; -301 } -302 -303 /** -304 * Extracts the contents of an archive into the specified directory. -305 * -306 * @param archive an archive file such as a WAR or EAR -307 * @param destination a directory to extract the contents to -308 * @param engine the scanning engine -309 * @throws AnalysisException thrown if the archive is not found -310 */ -311 private void extractFiles(File archive, File destination, Engine engine) throws AnalysisException { -312 if (archive == null || destination == null) { -313 return; -314 } -315 -316 FileInputStream fis = null; -317 try { -318 fis = new FileInputStream(archive); -319 } catch (FileNotFoundException ex) { -320 LOGGER.debug("", ex); -321 throw new AnalysisException("Archive file was not found.", ex); -322 } -323 final String archiveExt = FileUtils.getFileExtension(archive.getName()).toLowerCase(); -324 try { -325 if (ZIPPABLES.contains(archiveExt)) { -326 extractArchive(new ZipArchiveInputStream(new BufferedInputStream(fis)), destination, engine); -327 } else if ("tar".equals(archiveExt)) { -328 extractArchive(new TarArchiveInputStream(new BufferedInputStream(fis)), destination, engine); -329 } else if ("gz".equals(archiveExt) || "tgz".equals(archiveExt)) { -330 final String uncompressedName = GzipUtils.getUncompressedFilename(archive.getName()); -331 final File f = new File(destination, uncompressedName); -332 if (engine.accept(f)) { -333 decompressFile(new GzipCompressorInputStream(new BufferedInputStream(fis)), f); -334 } -335 } -336 } catch (ArchiveExtractionException ex) { -337 LOGGER.warn("Exception extracting archive '{}'.", archive.getName()); -338 LOGGER.debug("", ex); -339 } catch (IOException ex) { -340 LOGGER.warn("Exception reading archive '{}'.", archive.getName()); -341 LOGGER.debug("", ex); -342 } finally { -343 try { -344 fis.close(); -345 } catch (IOException ex) { -346 LOGGER.debug("", ex); -347 } -348 } -349 } -350 -351 /** -352 * Extracts files from an archive. -353 * -354 * @param input the archive to extract files from -355 * @param destination the location to write the files too -356 * @param engine the dependency-check engine -357 * @throws ArchiveExtractionException thrown if there is an exception extracting files from the archive -358 */ -359 private void extractArchive(ArchiveInputStream input, File destination, Engine engine) throws ArchiveExtractionException { -360 ArchiveEntry entry; -361 try { -362 while ((entry = input.getNextEntry()) != null) { -363 if (entry.isDirectory()) { -364 final File d = new File(destination, entry.getName()); -365 if (!d.exists()) { -366 if (!d.mkdirs()) { -367 final String msg = String.format("Unable to create directory '%s'.", d.getAbsolutePath()); -368 throw new AnalysisException(msg); -369 } -370 } -371 } else { -372 final File file = new File(destination, entry.getName()); -373 if (engine.accept(file)) { -374 LOGGER.debug("Extracting '{}'", file.getPath()); -375 BufferedOutputStream bos = null; -376 FileOutputStream fos = null; -377 try { -378 final File parent = file.getParentFile(); -379 if (!parent.isDirectory()) { -380 if (!parent.mkdirs()) { -381 final String msg = String.format("Unable to build directory '%s'.", parent.getAbsolutePath()); -382 throw new AnalysisException(msg); -383 } -384 } -385 fos = new FileOutputStream(file); -386 bos = new BufferedOutputStream(fos, BUFFER_SIZE); -387 int count; -388 final byte[] data = new byte[BUFFER_SIZE]; -389 while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) { -390 bos.write(data, 0, count); -391 } -392 bos.flush(); -393 } catch (FileNotFoundException ex) { -394 LOGGER.debug("", ex); -395 final String msg = String.format("Unable to find file '%s'.", file.getName()); -396 throw new AnalysisException(msg, ex); -397 } catch (IOException ex) { -398 LOGGER.debug("", ex); -399 final String msg = String.format("IO Exception while parsing file '%s'.", file.getName()); -400 throw new AnalysisException(msg, ex); -401 } finally { -402 if (bos != null) { -403 try { -404 bos.close(); -405 } catch (IOException ex) { -406 LOGGER.trace("", ex); -407 } -408 } -409 if (fos != null) { -410 try { -411 fos.close(); -412 } catch (IOException ex) { -413 LOGGER.trace("", ex); -414 } -415 } -416 } -417 } -418 } -419 } -420 } catch (IOException ex) { -421 throw new ArchiveExtractionException(ex); -422 } catch (Throwable ex) { -423 throw new ArchiveExtractionException(ex); -424 } finally { -425 if (input != null) { -426 try { -427 input.close(); -428 } catch (IOException ex) { -429 LOGGER.trace("", ex); -430 } -431 } -432 } -433 } -434 -435 /** -436 * Decompresses a file. -437 * -438 * @param inputStream the compressed file -439 * @param outputFile the location to write the decompressed file -440 * @throws ArchiveExtractionException thrown if there is an exception decompressing the file -441 */ -442 private void decompressFile(CompressorInputStream inputStream, File outputFile) throws ArchiveExtractionException { -443 LOGGER.debug("Decompressing '{}'", outputFile.getPath()); -444 FileOutputStream out = null; -445 try { -446 out = new FileOutputStream(outputFile); -447 final byte[] buffer = new byte[BUFFER_SIZE]; -448 int n = 0; -449 while (-1 != (n = inputStream.read(buffer))) { -450 out.write(buffer, 0, n); -451 } +280 } +281 /** +282 * An empty dependency set. +283 */ +284 private static final Set<Dependency> EMPTY_DEPENDENCY_SET = Collections.emptySet(); +285 +286 /** +287 * Scan the given file/folder, and return any new dependencies found. +288 * +289 * @param engine used to scan +290 * @param file target of scanning +291 * @return any dependencies that weren't known to the engine before +292 */ +293 private static Set<Dependency> findMoreDependencies(Engine engine, File file) { +294 final List<Dependency> before = new ArrayList<Dependency>(engine.getDependencies()); +295 engine.scan(file); +296 final List<Dependency> after = engine.getDependencies(); +297 final boolean sizeChanged = before.size() != after.size(); +298 final Set<Dependency> newDependencies; +299 if (sizeChanged) { +300 //get the new dependencies +301 newDependencies = new HashSet<Dependency>(after); +302 newDependencies.removeAll(before); +303 } else { +304 newDependencies = EMPTY_DEPENDENCY_SET; +305 } +306 return newDependencies; +307 } +308 +309 /** +310 * Retrieves the next temporary directory to extract an archive too. +311 * +312 * @return a directory +313 * @throws AnalysisException thrown if unable to create temporary directory +314 */ +315 private File getNextTempDirectory() throws AnalysisException { +316 dirCount += 1; +317 final File directory = new File(tempFileLocation, String.valueOf(dirCount)); +318 //getting an exception for some directories not being able to be created; might be because the directory already exists? +319 if (directory.exists()) { +320 return getNextTempDirectory(); +321 } +322 if (!directory.mkdirs()) { +323 final String msg = String.format("Unable to create temp directory '%s'.", directory.getAbsolutePath()); +324 throw new AnalysisException(msg); +325 } +326 return directory; +327 } +328 +329 /** +330 * Extracts the contents of an archive into the specified directory. +331 * +332 * @param archive an archive file such as a WAR or EAR +333 * @param destination a directory to extract the contents to +334 * @param engine the scanning engine +335 * @throws AnalysisException thrown if the archive is not found +336 */ +337 private void extractFiles(File archive, File destination, Engine engine) throws AnalysisException { +338 if (archive != null && destination != null) { +339 FileInputStream fis; +340 try { +341 fis = new FileInputStream(archive); +342 } catch (FileNotFoundException ex) { +343 LOGGER.debug("", ex); +344 throw new AnalysisException("Archive file was not found.", ex); +345 } +346 final String archiveExt = FileUtils.getFileExtension(archive.getName()).toLowerCase(); +347 try { +348 if (ZIPPABLES.contains(archiveExt)) { +349 extractArchive(new ZipArchiveInputStream(new BufferedInputStream(fis)), destination, engine); +350 } else if ("tar".equals(archiveExt)) { +351 extractArchive(new TarArchiveInputStream(new BufferedInputStream(fis)), destination, engine); +352 } else if ("gz".equals(archiveExt) || "tgz".equals(archiveExt)) { +353 final String uncompressedName = GzipUtils.getUncompressedFilename(archive.getName()); +354 final File f = new File(destination, uncompressedName); +355 if (engine.accept(f)) { +356 decompressFile(new GzipCompressorInputStream(new BufferedInputStream(fis)), f); +357 } +358 } else if ("bz2".equals(archiveExt) || "tbz2".equals(archiveExt)) { +359 final String uncompressedName = BZip2Utils.getUncompressedFilename(archive.getName()); +360 final File f = new File(destination, uncompressedName); +361 if (engine.accept(f)) { +362 decompressFile(new BZip2CompressorInputStream(new BufferedInputStream(fis)), f); +363 } +364 } +365 } catch (ArchiveExtractionException ex) { +366 LOGGER.warn("Exception extracting archive '{}'.", archive.getName()); +367 LOGGER.debug("", ex); +368 } catch (IOException ex) { +369 LOGGER.warn("Exception reading archive '{}'.", archive.getName()); +370 LOGGER.debug("", ex); +371 } finally { +372 close(fis); +373 } +374 } +375 } +376 +377 /** +378 * Extracts files from an archive. +379 * +380 * @param input the archive to extract files from +381 * @param destination the location to write the files too +382 * @param engine the dependency-check engine +383 * @throws ArchiveExtractionException thrown if there is an exception extracting files from the archive +384 */ +385 private void extractArchive(ArchiveInputStream input, File destination, Engine engine) throws ArchiveExtractionException { +386 ArchiveEntry entry; +387 try { +388 while ((entry = input.getNextEntry()) != null) { +389 final File file = new File(destination, entry.getName()); +390 if (entry.isDirectory()) { +391 if (!file.exists() && !file.mkdirs()) { +392 final String msg = String.format("Unable to create directory '%s'.", file.getAbsolutePath()); +393 throw new AnalysisException(msg); +394 } +395 } else if (engine.accept(file)) { +396 extractAcceptedFile(input, file); +397 } +398 } +399 } catch (Throwable ex) { +400 throw new ArchiveExtractionException(ex); +401 } finally { +402 close(input); +403 } +404 } +405 +406 /** +407 * Extracts a file from an archive. +408 * +409 * @param input the archives input stream +410 * @param file the file to extract +411 * @throws AnalysisException thrown if there is an error +412 */ +413 private static void extractAcceptedFile(ArchiveInputStream input, File file) throws AnalysisException { +414 LOGGER.debug("Extracting '{}'", file.getPath()); +415 FileOutputStream fos = null; +416 try { +417 final File parent = file.getParentFile(); +418 if (!parent.isDirectory()) { +419 if (!parent.mkdirs()) { +420 final String msg = String.format("Unable to build directory '%s'.", parent.getAbsolutePath()); +421 throw new AnalysisException(msg); +422 } +423 } +424 fos = new FileOutputStream(file); +425 IOUtils.copy(input, fos); +426 } catch (FileNotFoundException ex) { +427 LOGGER.debug("", ex); +428 final String msg = String.format("Unable to find file '%s'.", file.getName()); +429 throw new AnalysisException(msg, ex); +430 } catch (IOException ex) { +431 LOGGER.debug("", ex); +432 final String msg = String.format("IO Exception while parsing file '%s'.", file.getName()); +433 throw new AnalysisException(msg, ex); +434 } finally { +435 close(fos); +436 } +437 } +438 +439 /** +440 * Decompresses a file. +441 * +442 * @param inputStream the compressed file +443 * @param outputFile the location to write the decompressed file +444 * @throws ArchiveExtractionException thrown if there is an exception decompressing the file +445 */ +446 private void decompressFile(CompressorInputStream inputStream, File outputFile) throws ArchiveExtractionException { +447 LOGGER.debug("Decompressing '{}'", outputFile.getPath()); +448 FileOutputStream out = null; +449 try { +450 out = new FileOutputStream(outputFile); +451 IOUtils.copy(inputStream, out); 452 } catch (FileNotFoundException ex) { 453 LOGGER.debug("", ex); 454 throw new ArchiveExtractionException(ex); @@ -464,50 +464,59 @@ 456 LOGGER.debug("", ex); 457 throw new ArchiveExtractionException(ex); 458 } finally { -459 if (out != null) { -460 try { -461 out.close(); -462 } catch (IOException ex) { -463 LOGGER.trace("", ex); -464 } -465 } -466 } -467 } -468 -469 /** -470 * Attempts to determine if a zip file is actually a JAR file. -471 * -472 * @param dependency the dependency to check -473 * @return true if the dependency appears to be a JAR file; otherwise false -474 */ -475 private boolean isZipFileActuallyJarFile(Dependency dependency) { -476 boolean isJar = false; -477 ZipFile zip = null; -478 try { -479 zip = new ZipFile(dependency.getActualFilePath()); -480 if (zip.getEntry("META-INF/MANIFEST.MF") != null -481 || zip.getEntry("META-INF/maven") != null) { -482 final Enumeration<ZipArchiveEntry> entries = zip.getEntries(); -483 while (entries.hasMoreElements()) { -484 final ZipArchiveEntry entry = entries.nextElement(); -485 if (!entry.isDirectory()) { -486 final String name = entry.getName().toLowerCase(); -487 if (name.endsWith(".class")) { -488 isJar = true; -489 break; -490 } -491 } -492 } -493 } -494 } catch (IOException ex) { -495 LOGGER.debug("Unable to unzip zip file '{}'", dependency.getFilePath(), ex); -496 } finally { -497 ZipFile.closeQuietly(zip); -498 } -499 -500 return isJar; -501 } -502 } +459 close(out); +460 } +461 } +462 +463 /** +464 * Close the given {@link Closeable} instance, ignoring nulls, and logging any thrown {@link IOException}. +465 * +466 * @param closeable to be closed +467 */ +468 private static void close(Closeable closeable) { +469 if (null != closeable) { +470 try { +471 closeable.close(); +472 } catch (IOException ex) { +473 LOGGER.trace("", ex); +474 } +475 } +476 } +477 +478 /** +479 * Attempts to determine if a zip file is actually a JAR file. +480 * +481 * @param dependency the dependency to check +482 * @return true if the dependency appears to be a JAR file; otherwise false +483 */ +484 private boolean isZipFileActuallyJarFile(Dependency dependency) { +485 boolean isJar = false; +486 ZipFile zip = null; +487 try { +488 zip = new ZipFile(dependency.getActualFilePath()); +489 if (zip.getEntry("META-INF/MANIFEST.MF") != null +490 || zip.getEntry("META-INF/maven") != null) { +491 final Enumeration<ZipArchiveEntry> entries = zip.getEntries(); +492 while (entries.hasMoreElements()) { +493 final ZipArchiveEntry entry = entries.nextElement(); +494 if (!entry.isDirectory()) { +495 final String name = entry.getName().toLowerCase(); +496 if (name.endsWith(".class")) { +497 isJar = true; +498 break; +499 } +500 } +501 } +502 } +503 } catch (IOException ex) { +504 LOGGER.debug("Unable to unzip zip file '{}'", dependency.getFilePath(), ex); +505 } finally { +506 ZipFile.closeQuietly(zip); +507 } +508 +509 return isJar; +510 } +511 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/AssemblyAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/AssemblyAnalyzer.html index 94fe7682b..de7540863 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/AssemblyAnalyzer.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/AssemblyAnalyzer.html @@ -25,329 +25,322 @@ 17 */ 18 package org.owasp.dependencycheck.analyzer; 19 -20 import ch.qos.cal10n.IMessageConveyor; -21 import ch.qos.cal10n.MessageConveyor; -22 import java.io.BufferedReader; -23 import java.io.File; -24 import java.io.FileFilter; -25 import java.io.FileOutputStream; -26 import java.io.IOException; -27 import java.io.InputStream; -28 import java.io.InputStreamReader; -29 import org.owasp.dependencycheck.Engine; -30 import org.owasp.dependencycheck.analyzer.exception.AnalysisException; -31 import org.owasp.dependencycheck.dependency.Confidence; -32 import org.owasp.dependencycheck.dependency.Dependency; -33 import org.owasp.dependencycheck.dependency.Evidence; -34 import org.owasp.dependencycheck.utils.FileFilterBuilder; -35 import org.owasp.dependencycheck.utils.Settings; -36 import org.slf4j.Logger; -37 import org.slf4j.LoggerFactory; -38 import org.w3c.dom.Document; -39 import org.xml.sax.SAXException; -40 -41 import javax.xml.parsers.DocumentBuilder; -42 import javax.xml.parsers.DocumentBuilderFactory; -43 import javax.xml.xpath.XPath; -44 import javax.xml.xpath.XPathExpressionException; -45 import javax.xml.xpath.XPathFactory; -46 import java.util.ArrayList; -47 import java.util.List; -48 import java.util.Locale; -49 -50 /** -51 * Analyzer for getting company, product, and version information from a .NET assembly. -52 * -53 * @author colezlaw -54 * -55 */ -56 public class AssemblyAnalyzer extends AbstractFileTypeAnalyzer { -57 -58 /** -59 * The analyzer name -60 */ -61 private static final String ANALYZER_NAME = "Assembly Analyzer"; -62 /** -63 * The analysis phase -64 */ -65 private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION; -66 /** -67 * The list of supported extensions -68 */ -69 private static final String[] SUPPORTED_EXTENSIONS = {"dll", "exe"}; -70 /** -71 * The temp value for GrokAssembly.exe -72 */ -73 private File grokAssemblyExe = null; -74 /** -75 * The DocumentBuilder for parsing the XML -76 */ -77 private DocumentBuilder builder; -78 /** -79 * Message Conveyer -80 */ -81 private static final IMessageConveyor MESSAGE_CONVERYOR = new MessageConveyor(Locale.getDefault()); -82 /** -83 * Logger +20 import java.io.BufferedReader; +21 import java.io.File; +22 import java.io.FileFilter; +23 import java.io.FileOutputStream; +24 import java.io.IOException; +25 import java.io.InputStream; +26 import java.io.InputStreamReader; +27 import org.owasp.dependencycheck.Engine; +28 import org.owasp.dependencycheck.analyzer.exception.AnalysisException; +29 import org.owasp.dependencycheck.dependency.Confidence; +30 import org.owasp.dependencycheck.dependency.Dependency; +31 import org.owasp.dependencycheck.dependency.Evidence; +32 import org.owasp.dependencycheck.utils.FileFilterBuilder; +33 import org.owasp.dependencycheck.utils.Settings; +34 import org.slf4j.Logger; +35 import org.slf4j.LoggerFactory; +36 import org.w3c.dom.Document; +37 import org.xml.sax.SAXException; +38 +39 import javax.xml.parsers.DocumentBuilder; +40 import javax.xml.parsers.DocumentBuilderFactory; +41 import javax.xml.xpath.XPath; +42 import javax.xml.xpath.XPathExpressionException; +43 import javax.xml.xpath.XPathFactory; +44 import java.util.ArrayList; +45 import java.util.List; +46 +47 /** +48 * Analyzer for getting company, product, and version information from a .NET assembly. +49 * +50 * @author colezlaw +51 * +52 */ +53 public class AssemblyAnalyzer extends AbstractFileTypeAnalyzer { +54 +55 /** +56 * The analyzer name +57 */ +58 private static final String ANALYZER_NAME = "Assembly Analyzer"; +59 /** +60 * The analysis phase +61 */ +62 private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION; +63 /** +64 * The list of supported extensions +65 */ +66 private static final String[] SUPPORTED_EXTENSIONS = {"dll", "exe"}; +67 /** +68 * The temp value for GrokAssembly.exe +69 */ +70 private File grokAssemblyExe = null; +71 /** +72 * The DocumentBuilder for parsing the XML +73 */ +74 private DocumentBuilder builder; +75 /** +76 * Logger +77 */ +78 private static final Logger LOGGER = LoggerFactory.getLogger(AssemblyAnalyzer.class); +79 +80 /** +81 * Builds the beginnings of a List for ProcessBuilder +82 * +83 * @return the list of arguments to begin populating the ProcessBuilder 84 */ -85 private static final Logger LOGGER = LoggerFactory.getLogger(AssemblyAnalyzer.class); -86 -87 /** -88 * Builds the beginnings of a List for ProcessBuilder -89 * -90 * @return the list of arguments to begin populating the ProcessBuilder -91 */ -92 private List<String> buildArgumentList() { -93 // Use file.separator as a wild guess as to whether this is Windows -94 final List<String> args = new ArrayList<String>(); -95 if (!"\\".equals(System.getProperty("file.separator"))) { -96 if (Settings.getString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH) != null) { -97 args.add(Settings.getString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH)); -98 } else { -99 args.add("mono"); -100 } -101 } -102 args.add(grokAssemblyExe.getPath()); -103 -104 return args; -105 } -106 -107 /** -108 * Performs the analysis on a single Dependency. -109 * -110 * @param dependency the dependency to analyze -111 * @param engine the engine to perform the analysis under -112 * @throws AnalysisException if anything goes sideways -113 */ -114 @Override -115 public void analyzeFileType(Dependency dependency, Engine engine) -116 throws AnalysisException { -117 if (grokAssemblyExe == null) { -118 LOGGER.warn("GrokAssembly didn't get deployed"); -119 return; -120 } -121 -122 final List<String> args = buildArgumentList(); -123 args.add(dependency.getActualFilePath()); -124 final ProcessBuilder pb = new ProcessBuilder(args); -125 BufferedReader rdr = null; -126 Document doc = null; -127 try { -128 final Process proc = pb.start(); -129 // Try evacuating the error stream -130 rdr = new BufferedReader(new InputStreamReader(proc.getErrorStream(), "UTF-8")); -131 String line = null; -132 // CHECKSTYLE:OFF -133 while (rdr.ready() && (line = rdr.readLine()) != null) { -134 LOGGER.warn("Error from GrokAssembly: {}", line); -135 } -136 // CHECKSTYLE:ON -137 int rc = 0; -138 doc = builder.parse(proc.getInputStream()); -139 -140 try { -141 rc = proc.waitFor(); -142 } catch (InterruptedException ie) { -143 return; +85 private List<String> buildArgumentList() { +86 // Use file.separator as a wild guess as to whether this is Windows +87 final List<String> args = new ArrayList<String>(); +88 if (!"\\".equals(System.getProperty("file.separator"))) { +89 if (Settings.getString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH) != null) { +90 args.add(Settings.getString(Settings.KEYS.ANALYZER_ASSEMBLY_MONO_PATH)); +91 } else { +92 args.add("mono"); +93 } +94 } +95 args.add(grokAssemblyExe.getPath()); +96 +97 return args; +98 } +99 +100 /** +101 * Performs the analysis on a single Dependency. +102 * +103 * @param dependency the dependency to analyze +104 * @param engine the engine to perform the analysis under +105 * @throws AnalysisException if anything goes sideways +106 */ +107 @Override +108 public void analyzeFileType(Dependency dependency, Engine engine) +109 throws AnalysisException { +110 if (grokAssemblyExe == null) { +111 LOGGER.warn("GrokAssembly didn't get deployed"); +112 return; +113 } +114 +115 final List<String> args = buildArgumentList(); +116 args.add(dependency.getActualFilePath()); +117 final ProcessBuilder pb = new ProcessBuilder(args); +118 BufferedReader rdr = null; +119 Document doc = null; +120 try { +121 final Process proc = pb.start(); +122 // Try evacuating the error stream +123 rdr = new BufferedReader(new InputStreamReader(proc.getErrorStream(), "UTF-8")); +124 String line = null; +125 // CHECKSTYLE:OFF +126 while (rdr.ready() && (line = rdr.readLine()) != null) { +127 LOGGER.warn("Error from GrokAssembly: {}", line); +128 } +129 // CHECKSTYLE:ON +130 int rc = 0; +131 doc = builder.parse(proc.getInputStream()); +132 +133 try { +134 rc = proc.waitFor(); +135 } catch (InterruptedException ie) { +136 return; +137 } +138 if (rc == 3) { +139 LOGGER.debug("{} is not a .NET assembly or executable and as such cannot be analyzed by dependency-check", +140 dependency.getActualFilePath()); +141 return; +142 } else if (rc != 0) { +143 LOGGER.warn("Return code {} from GrokAssembly", rc); 144 } -145 if (rc == 3) { -146 LOGGER.debug("{} is not a .NET assembly or executable and as such cannot be analyzed by dependency-check", -147 dependency.getActualFilePath()); -148 return; -149 } else if (rc != 0) { -150 LOGGER.warn("Return code {} from GrokAssembly", rc); -151 } -152 -153 final XPath xpath = XPathFactory.newInstance().newXPath(); -154 -155 // First, see if there was an error -156 final String error = xpath.evaluate("/assembly/error", doc); -157 if (error != null && !"".equals(error)) { -158 throw new AnalysisException(error); -159 } -160 -161 final String version = xpath.evaluate("/assembly/version", doc); -162 if (version != null) { -163 dependency.getVersionEvidence().addEvidence(new Evidence("grokassembly", "version", -164 version, Confidence.HIGHEST)); -165 } -166 -167 final String vendor = xpath.evaluate("/assembly/company", doc); -168 if (vendor != null) { -169 dependency.getVendorEvidence().addEvidence(new Evidence("grokassembly", "vendor", -170 vendor, Confidence.HIGH)); -171 } -172 -173 final String product = xpath.evaluate("/assembly/product", doc); -174 if (product != null) { -175 dependency.getProductEvidence().addEvidence(new Evidence("grokassembly", "product", -176 product, Confidence.HIGH)); -177 } -178 -179 } catch (IOException ioe) { -180 throw new AnalysisException(ioe); -181 } catch (SAXException saxe) { -182 throw new AnalysisException("Couldn't parse GrokAssembly result", saxe); -183 } catch (XPathExpressionException xpe) { -184 // This shouldn't happen -185 throw new AnalysisException(xpe); -186 } finally { -187 if (rdr != null) { -188 try { -189 rdr.close(); -190 } catch (IOException ex) { -191 LOGGER.debug("ignore", ex); -192 } -193 } -194 } -195 } -196 -197 /** -198 * Initialize the analyzer. In this case, extract GrokAssembly.exe to a temporary location. -199 * -200 * @throws Exception if anything goes wrong -201 */ -202 @Override -203 public void initializeFileTypeAnalyzer() throws Exception { -204 final File tempFile = File.createTempFile("GKA", ".exe", Settings.getTempDirectory()); -205 FileOutputStream fos = null; -206 InputStream is = null; -207 try { -208 fos = new FileOutputStream(tempFile); -209 is = AssemblyAnalyzer.class.getClassLoader().getResourceAsStream("GrokAssembly.exe"); -210 final byte[] buff = new byte[4096]; -211 int bread = -1; -212 while ((bread = is.read(buff)) >= 0) { -213 fos.write(buff, 0, bread); -214 } -215 grokAssemblyExe = tempFile; -216 // Set the temp file to get deleted when we're done -217 grokAssemblyExe.deleteOnExit(); -218 LOGGER.debug("Extracted GrokAssembly.exe to {}", grokAssemblyExe.getPath()); -219 } catch (IOException ioe) { -220 this.setEnabled(false); -221 LOGGER.warn("Could not extract GrokAssembly.exe: {}", ioe.getMessage()); -222 throw new AnalysisException("Could not extract GrokAssembly.exe", ioe); -223 } finally { -224 if (fos != null) { +145 +146 final XPath xpath = XPathFactory.newInstance().newXPath(); +147 +148 // First, see if there was an error +149 final String error = xpath.evaluate("/assembly/error", doc); +150 if (error != null && !error.isEmpty()) { +151 throw new AnalysisException(error); +152 } +153 +154 final String version = xpath.evaluate("/assembly/version", doc); +155 if (version != null) { +156 dependency.getVersionEvidence().addEvidence(new Evidence("grokassembly", "version", +157 version, Confidence.HIGHEST)); +158 } +159 +160 final String vendor = xpath.evaluate("/assembly/company", doc); +161 if (vendor != null) { +162 dependency.getVendorEvidence().addEvidence(new Evidence("grokassembly", "vendor", +163 vendor, Confidence.HIGH)); +164 } +165 +166 final String product = xpath.evaluate("/assembly/product", doc); +167 if (product != null) { +168 dependency.getProductEvidence().addEvidence(new Evidence("grokassembly", "product", +169 product, Confidence.HIGH)); +170 } +171 +172 } catch (IOException ioe) { +173 throw new AnalysisException(ioe); +174 } catch (SAXException saxe) { +175 throw new AnalysisException("Couldn't parse GrokAssembly result", saxe); +176 } catch (XPathExpressionException xpe) { +177 // This shouldn't happen +178 throw new AnalysisException(xpe); +179 } finally { +180 if (rdr != null) { +181 try { +182 rdr.close(); +183 } catch (IOException ex) { +184 LOGGER.debug("ignore", ex); +185 } +186 } +187 } +188 } +189 +190 /** +191 * Initialize the analyzer. In this case, extract GrokAssembly.exe to a temporary location. +192 * +193 * @throws Exception if anything goes wrong +194 */ +195 @Override +196 public void initializeFileTypeAnalyzer() throws Exception { +197 final File tempFile = File.createTempFile("GKA", ".exe", Settings.getTempDirectory()); +198 FileOutputStream fos = null; +199 InputStream is = null; +200 try { +201 fos = new FileOutputStream(tempFile); +202 is = AssemblyAnalyzer.class.getClassLoader().getResourceAsStream("GrokAssembly.exe"); +203 final byte[] buff = new byte[4096]; +204 int bread = -1; +205 while ((bread = is.read(buff)) >= 0) { +206 fos.write(buff, 0, bread); +207 } +208 grokAssemblyExe = tempFile; +209 // Set the temp file to get deleted when we're done +210 grokAssemblyExe.deleteOnExit(); +211 LOGGER.debug("Extracted GrokAssembly.exe to {}", grokAssemblyExe.getPath()); +212 } catch (IOException ioe) { +213 this.setEnabled(false); +214 LOGGER.warn("Could not extract GrokAssembly.exe: {}", ioe.getMessage()); +215 throw new AnalysisException("Could not extract GrokAssembly.exe", ioe); +216 } finally { +217 if (fos != null) { +218 try { +219 fos.close(); +220 } catch (Throwable e) { +221 LOGGER.debug("Error closing output stream"); +222 } +223 } +224 if (is != null) { 225 try { -226 fos.close(); +226 is.close(); 227 } catch (Throwable e) { -228 LOGGER.debug("Error closing output stream"); +228 LOGGER.debug("Error closing input stream"); 229 } 230 } -231 if (is != null) { -232 try { -233 is.close(); -234 } catch (Throwable e) { -235 LOGGER.debug("Error closing input stream"); -236 } -237 } -238 } -239 -240 // Now, need to see if GrokAssembly actually runs from this location. -241 final List<String> args = buildArgumentList(); -242 BufferedReader rdr = null; -243 try { -244 final ProcessBuilder pb = new ProcessBuilder(args); -245 final Process p = pb.start(); -246 // Try evacuating the error stream -247 rdr = new BufferedReader(new InputStreamReader(p.getErrorStream(), "UTF-8")); -248 // CHECKSTYLE:OFF -249 while (rdr.ready() && rdr.readLine() != null) { -250 // We expect this to complain -251 } -252 // CHECKSTYLE:ON -253 final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(p.getInputStream()); -254 final XPath xpath = XPathFactory.newInstance().newXPath(); -255 final String error = xpath.evaluate("/assembly/error", doc); -256 if (p.waitFor() != 1 || error == null || "".equals(error)) { -257 LOGGER.warn("An error occurred with the .NET AssemblyAnalyzer, please see the log for more details."); -258 LOGGER.debug("GrokAssembly.exe is not working properly"); -259 grokAssemblyExe = null; -260 this.setEnabled(false); -261 throw new AnalysisException("Could not execute .NET AssemblyAnalyzer"); -262 } -263 } catch (Throwable e) { -264 if (e instanceof AnalysisException) { -265 throw (AnalysisException) e; -266 } else { -267 LOGGER.warn("An error occurred with the .NET AssemblyAnalyzer;\n" -268 + "this can be ignored unless you are scanning .NET DLLs. Please see the log for more details."); -269 LOGGER.debug("Could not execute GrokAssembly {}", e.getMessage()); -270 this.setEnabled(false); -271 throw new AnalysisException("An error occured with the .NET AssemblyAnalyzer", e); -272 } -273 } finally { -274 if (rdr != null) { -275 try { -276 rdr.close(); -277 } catch (IOException ex) { -278 LOGGER.trace("ignore", ex); -279 } -280 } -281 } -282 builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); -283 } -284 -285 /** -286 * Removes resources used from the local file system. -287 * -288 * @throws Exception thrown if there is a problem closing the analyzer -289 */ -290 @Override -291 public void close() throws Exception { -292 super.close(); -293 try { -294 if (grokAssemblyExe != null && !grokAssemblyExe.delete()) { -295 grokAssemblyExe.deleteOnExit(); -296 } -297 } catch (SecurityException se) { -298 LOGGER.debug("Can't delete temporary GrokAssembly.exe"); -299 } -300 } -301 -302 /** -303 * The File Filter used to filter supported extensions. -304 */ -305 private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions( -306 SUPPORTED_EXTENSIONS).build(); -307 -308 @Override -309 protected FileFilter getFileFilter() { -310 return FILTER; -311 } -312 -313 /** -314 * Gets this analyzer's name. -315 * -316 * @return the analyzer name -317 */ -318 @Override -319 public String getName() { -320 return ANALYZER_NAME; -321 } -322 -323 /** -324 * Returns the phase this analyzer runs under. -325 * -326 * @return the phase this runs under -327 */ -328 @Override -329 public AnalysisPhase getAnalysisPhase() { -330 return ANALYSIS_PHASE; -331 } -332 -333 /** -334 * Returns the key used in the properties file to reference the analyzer's enabled property. -335 * -336 * @return the analyzer's enabled property setting key -337 */ -338 @Override -339 protected String getAnalyzerEnabledSettingKey() { -340 return Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED; -341 } -342 } +231 } +232 +233 // Now, need to see if GrokAssembly actually runs from this location. +234 final List<String> args = buildArgumentList(); +235 BufferedReader rdr = null; +236 try { +237 final ProcessBuilder pb = new ProcessBuilder(args); +238 final Process p = pb.start(); +239 // Try evacuating the error stream +240 rdr = new BufferedReader(new InputStreamReader(p.getErrorStream(), "UTF-8")); +241 // CHECKSTYLE:OFF +242 while (rdr.ready() && rdr.readLine() != null) { +243 // We expect this to complain +244 } +245 // CHECKSTYLE:ON +246 final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(p.getInputStream()); +247 final XPath xpath = XPathFactory.newInstance().newXPath(); +248 final String error = xpath.evaluate("/assembly/error", doc); +249 if (p.waitFor() != 1 || error == null || error.isEmpty()) { +250 LOGGER.warn("An error occurred with the .NET AssemblyAnalyzer, please see the log for more details."); +251 LOGGER.debug("GrokAssembly.exe is not working properly"); +252 grokAssemblyExe = null; +253 this.setEnabled(false); +254 throw new AnalysisException("Could not execute .NET AssemblyAnalyzer"); +255 } +256 } catch (Throwable e) { +257 if (e instanceof AnalysisException) { +258 throw (AnalysisException) e; +259 } else { +260 LOGGER.warn("An error occurred with the .NET AssemblyAnalyzer;\n" +261 + "this can be ignored unless you are scanning .NET DLLs. Please see the log for more details."); +262 LOGGER.debug("Could not execute GrokAssembly {}", e.getMessage()); +263 this.setEnabled(false); +264 throw new AnalysisException("An error occured with the .NET AssemblyAnalyzer", e); +265 } +266 } finally { +267 if (rdr != null) { +268 try { +269 rdr.close(); +270 } catch (IOException ex) { +271 LOGGER.trace("ignore", ex); +272 } +273 } +274 } +275 builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); +276 } +277 +278 /** +279 * Removes resources used from the local file system. +280 * +281 * @throws Exception thrown if there is a problem closing the analyzer +282 */ +283 @Override +284 public void close() throws Exception { +285 super.close(); +286 try { +287 if (grokAssemblyExe != null && !grokAssemblyExe.delete()) { +288 grokAssemblyExe.deleteOnExit(); +289 } +290 } catch (SecurityException se) { +291 LOGGER.debug("Can't delete temporary GrokAssembly.exe"); +292 } +293 } +294 +295 /** +296 * The File Filter used to filter supported extensions. +297 */ +298 private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions( +299 SUPPORTED_EXTENSIONS).build(); +300 +301 @Override +302 protected FileFilter getFileFilter() { +303 return FILTER; +304 } +305 +306 /** +307 * Gets this analyzer's name. +308 * +309 * @return the analyzer name +310 */ +311 @Override +312 public String getName() { +313 return ANALYZER_NAME; +314 } +315 +316 /** +317 * Returns the phase this analyzer runs under. +318 * +319 * @return the phase this runs under +320 */ +321 @Override +322 public AnalysisPhase getAnalysisPhase() { +323 return ANALYSIS_PHASE; +324 } +325 +326 /** +327 * Returns the key used in the properties file to reference the analyzer's enabled property. +328 * +329 * @return the analyzer's enabled property setting key +330 */ +331 @Override +332 protected String getAnalyzerEnabledSettingKey() { +333 return Settings.KEYS.ANALYZER_ASSEMBLY_ENABLED; +334 } +335 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/AutoconfAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/AutoconfAnalyzer.html index 3e773c55c..01af9f349 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/AutoconfAnalyzer.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/AutoconfAnalyzer.html @@ -181,10 +181,10 @@ 173 } 174 } else { 175 // copy, alter and set in case some other thread is iterating over -176 final List<Dependency> deps = new ArrayList<Dependency>( +176 final List<Dependency> dependencies = new ArrayList<Dependency>( 177 engine.getDependencies()); -178 deps.remove(dependency); -179 engine.setDependencies(deps); +178 dependencies.remove(dependency); +179 engine.setDependencies(dependencies); 180 } 181 } 182 @@ -233,7 +233,7 @@ 225 contents = FileUtils.readFileToString(actualFile).trim(); 226 } catch (IOException e) { 227 throw new AnalysisException( -228 "Problem occured while reading dependency file.", e); +228 "Problem occurred while reading dependency file.", e); 229 } 230 return contents; 231 } diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/CMakeAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/CMakeAnalyzer.html index 73566e2e5..879698ad8 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/CMakeAnalyzer.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/CMakeAnalyzer.html @@ -26,7 +26,7 @@ 18 package org.owasp.dependencycheck.analyzer; 19 20 import org.apache.commons.io.FileUtils; -21 import org.apache.commons.lang.StringUtils; +21 import org.apache.commons.lang3.StringUtils; 22 import org.owasp.dependencycheck.Engine; 23 import org.owasp.dependencycheck.analyzer.exception.AnalysisException; 24 import org.owasp.dependencycheck.dependency.Confidence; @@ -175,7 +175,7 @@ 167 dependency.getProductEvidence().addEvidence(name, "Project", 168 group, Confidence.HIGH); 169 } -170 LOGGER.debug(String.format("Found %d matches.", count)); +170 LOGGER.debug("Found {} matches.", count); 171 analyzeSetVersionCommand(dependency, engine, contents); 172 } 173 } @@ -186,42 +186,41 @@ 178 int count = 0; 179 while (m.find()) { 180 count++; -181 LOGGER.debug(String.format( -182 "Found project command match with %d groups: %s", -183 m.groupCount(), m.group(0))); -184 String product = m.group(1); -185 final String version = m.group(2); -186 LOGGER.debug("Group 1: " + product); -187 LOGGER.debug("Group 2: " + version); -188 final String aliasPrefix = "ALIASOF_"; -189 if (product.startsWith(aliasPrefix)) { -190 product = product.replaceFirst(aliasPrefix, ""); -191 } -192 if (count > 1) { -193 //TODO - refactor so we do not assign to the parameter (checkstyle) -194 dependency = new Dependency(orig.getActualFile()); -195 dependency.setDisplayFileName(String.format("%s:%s", orig.getDisplayFileName(), product)); -196 final String filePath = String.format("%s:%s", orig.getFilePath(), product); -197 dependency.setFilePath(filePath); -198 -199 // prevents coalescing into the dependency provided by engine -200 dependency.setSha1sum(Checksum.getHex(sha1.digest(filePath.getBytes()))); -201 engine.getDependencies().add(dependency); -202 } -203 final String source = dependency.getDisplayFileName(); -204 dependency.getProductEvidence().addEvidence(source, "Product", -205 product, Confidence.MEDIUM); -206 dependency.getVersionEvidence().addEvidence(source, "Version", -207 version, Confidence.MEDIUM); -208 } -209 LOGGER.debug(String.format("Found %d matches.", count)); -210 } -211 -212 @Override -213 protected String getAnalyzerEnabledSettingKey() { -214 return Settings.KEYS.ANALYZER_CMAKE_ENABLED; -215 } -216 } +181 LOGGER.debug("Found project command match with {} groups: {}", +182 m.groupCount(), m.group(0)); +183 String product = m.group(1); +184 final String version = m.group(2); +185 LOGGER.debug("Group 1: " + product); +186 LOGGER.debug("Group 2: " + version); +187 final String aliasPrefix = "ALIASOF_"; +188 if (product.startsWith(aliasPrefix)) { +189 product = product.replaceFirst(aliasPrefix, ""); +190 } +191 if (count > 1) { +192 //TODO - refactor so we do not assign to the parameter (checkstyle) +193 dependency = new Dependency(orig.getActualFile()); +194 dependency.setDisplayFileName(String.format("%s:%s", orig.getDisplayFileName(), product)); +195 final String filePath = String.format("%s:%s", orig.getFilePath(), product); +196 dependency.setFilePath(filePath); +197 +198 // prevents coalescing into the dependency provided by engine +199 dependency.setSha1sum(Checksum.getHex(sha1.digest(filePath.getBytes()))); +200 engine.getDependencies().add(dependency); +201 } +202 final String source = dependency.getDisplayFileName(); +203 dependency.getProductEvidence().addEvidence(source, "Product", +204 product, Confidence.MEDIUM); +205 dependency.getVersionEvidence().addEvidence(source, "Version", +206 version, Confidence.MEDIUM); +207 } +208 LOGGER.debug(String.format("Found %d matches.", count)); +209 } +210 +211 @Override +212 protected String getAnalyzerEnabledSettingKey() { +213 return Settings.KEYS.ANALYZER_CMAKE_ENABLED; +214 } +215 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/CPEAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/CPEAnalyzer.html index ce4c77c18..f2de7ed0f 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/CPEAnalyzer.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/CPEAnalyzer.html @@ -142,633 +142,634 @@ 134 * process. 135 */ 136 public void open() throws IOException, DatabaseException { -137 LOGGER.debug("Opening the CVE Database"); -138 cve = new CveDB(); -139 cve.open(); -140 LOGGER.debug("Creating the Lucene CPE Index"); -141 cpe = CpeMemoryIndex.getInstance(); -142 try { +137 cve = new CveDB(); +138 cve.open(); +139 cpe = CpeMemoryIndex.getInstance(); +140 try { +141 LOGGER.info("Creating the CPE Index"); +142 final long creationStart = System.currentTimeMillis(); 143 cpe.open(cve); -144 } catch (IndexException ex) { -145 LOGGER.debug("IndexException", ex); -146 throw new DatabaseException(ex); -147 } -148 } -149 -150 /** -151 * Closes the data sources. -152 */ -153 @Override -154 public void close() { -155 if (cpe != null) { -156 cpe.close(); -157 cpe = null; -158 } -159 if (cve != null) { -160 cve.close(); -161 cve = null; -162 } -163 } -164 -165 public boolean isOpen() { -166 return cpe != null && cpe.isOpen(); -167 } -168 -169 /** -170 * Searches the data store of CPE entries, trying to identify the CPE for the given dependency based on the evidence contained -171 * within. The dependency passed in is updated with any identified CPE values. -172 * -173 * @param dependency the dependency to search for CPE entries on. -174 * @throws CorruptIndexException is thrown when the Lucene index is corrupt. -175 * @throws IOException is thrown when an IOException occurs. -176 * @throws ParseException is thrown when the Lucene query cannot be parsed. -177 */ -178 protected void determineCPE(Dependency dependency) throws CorruptIndexException, IOException, ParseException { -179 //TODO test dojo-war against this. we shold get dojo-toolkit:dojo-toolkit AND dojo-toolkit:toolkit -180 String vendors = ""; -181 String products = ""; -182 for (Confidence confidence : Confidence.values()) { -183 if (dependency.getVendorEvidence().contains(confidence)) { -184 vendors = addEvidenceWithoutDuplicateTerms(vendors, dependency.getVendorEvidence(), confidence); -185 LOGGER.debug("vendor search: {}", vendors); -186 } -187 if (dependency.getProductEvidence().contains(confidence)) { -188 products = addEvidenceWithoutDuplicateTerms(products, dependency.getProductEvidence(), confidence); -189 LOGGER.debug("product search: {}", products); -190 } -191 if (!vendors.isEmpty() && !products.isEmpty()) { -192 final List<IndexEntry> entries = searchCPE(vendors, products, dependency.getProductEvidence().getWeighting(), -193 dependency.getVendorEvidence().getWeighting()); -194 if (entries == null) { -195 continue; -196 } -197 boolean identifierAdded = false; -198 for (IndexEntry e : entries) { -199 LOGGER.debug("Verifying entry: {}", e); -200 if (verifyEntry(e, dependency)) { -201 final String vendor = e.getVendor(); -202 final String product = e.getProduct(); -203 LOGGER.debug("identified vendor/product: {}/{}", vendor, product); -204 identifierAdded |= determineIdentifiers(dependency, vendor, product, confidence); -205 } -206 } -207 if (identifierAdded) { -208 break; -209 } -210 } -211 } -212 } -213 -214 /** -215 * Returns the text created by concatenating the text and the values from the EvidenceCollection (filtered for a specific -216 * confidence). This attempts to prevent duplicate terms from being added.<br/<br/> Note, if the evidence is longer then 200 -217 * characters it will be truncated. -218 * -219 * @param text the base text. -220 * @param ec an EvidenceCollection -221 * @param confidenceFilter a Confidence level to filter the evidence by. -222 * @return the new evidence text -223 */ -224 private String addEvidenceWithoutDuplicateTerms(final String text, final EvidenceCollection ec, Confidence confidenceFilter) { -225 final String txt = (text == null) ? "" : text; -226 final StringBuilder sb = new StringBuilder(txt.length() + (20 * ec.size())); -227 sb.append(' ').append(txt).append(' '); -228 for (Evidence e : ec.iterator(confidenceFilter)) { -229 String value = e.getValue(); -230 -231 //hack to get around the fact that lucene does a really good job of recognizing domains and not -232 // splitting them. TODO - put together a better lucene analyzer specific to the domain. -233 if (value.startsWith("http://")) { -234 value = value.substring(7).replaceAll("\\.", " "); -235 } -236 if (value.startsWith("https://")) { -237 value = value.substring(8).replaceAll("\\.", " "); -238 } -239 if (sb.indexOf(" " + value + " ") < 0) { -240 sb.append(value).append(' '); -241 } -242 } -243 return sb.toString().trim(); -244 } -245 -246 /** -247 * <p> -248 * Searches the Lucene CPE index to identify possible CPE entries associated with the supplied vendor, product, and -249 * version.</p> -250 * -251 * <p> -252 * If either the vendorWeightings or productWeightings lists have been populated this data is used to add weighting factors to -253 * the search.</p> -254 * -255 * @param vendor the text used to search the vendor field -256 * @param product the text used to search the product field -257 * @param vendorWeightings a list of strings to use to add weighting factors to the vendor field -258 * @param productWeightings Adds a list of strings that will be used to add weighting factors to the product search -259 * @return a list of possible CPE values -260 */ -261 protected List<IndexEntry> searchCPE(String vendor, String product, -262 Set<String> vendorWeightings, Set<String> productWeightings) { -263 -264 final List<IndexEntry> ret = new ArrayList<IndexEntry>(MAX_QUERY_RESULTS); -265 -266 final String searchString = buildSearch(vendor, product, vendorWeightings, productWeightings); -267 if (searchString == null) { -268 return ret; -269 } -270 try { -271 final TopDocs docs = cpe.search(searchString, MAX_QUERY_RESULTS); -272 for (ScoreDoc d : docs.scoreDocs) { -273 if (d.score >= 0.08) { -274 final Document doc = cpe.getDocument(d.doc); -275 final IndexEntry entry = new IndexEntry(); -276 entry.setVendor(doc.get(Fields.VENDOR)); -277 entry.setProduct(doc.get(Fields.PRODUCT)); -278 entry.setSearchScore(d.score); -279 if (!ret.contains(entry)) { -280 ret.add(entry); -281 } -282 } -283 } -284 return ret; -285 } catch (ParseException ex) { -286 LOGGER.warn("An error occured querying the CPE data. See the log for more details."); -287 LOGGER.info("Unable to parse: {}", searchString, ex); -288 } catch (IOException ex) { -289 LOGGER.warn("An error occured reading CPE data. See the log for more details."); -290 LOGGER.info("IO Error with search string: {}", searchString, ex); -291 } -292 return null; -293 } -294 -295 /** -296 * <p> -297 * Builds a Lucene search string by properly escaping data and constructing a valid search query.</p> -298 * -299 * <p> -300 * If either the possibleVendor or possibleProducts lists have been populated this data is used to add weighting factors to -301 * the search string generated.</p> -302 * -303 * @param vendor text to search the vendor field -304 * @param product text to search the product field -305 * @param vendorWeighting a list of strings to apply to the vendor to boost the terms weight -306 * @param productWeightings a list of strings to apply to the product to boost the terms weight -307 * @return the Lucene query -308 */ -309 protected String buildSearch(String vendor, String product, -310 Set<String> vendorWeighting, Set<String> productWeightings) { -311 final String v = vendor; //.replaceAll("[^\\w\\d]", " "); -312 final String p = product; //.replaceAll("[^\\w\\d]", " "); -313 final StringBuilder sb = new StringBuilder(v.length() + p.length() -314 + Fields.PRODUCT.length() + Fields.VENDOR.length() + STRING_BUILDER_BUFFER); -315 -316 if (!appendWeightedSearch(sb, Fields.PRODUCT, p, productWeightings)) { -317 return null; -318 } -319 sb.append(" AND "); -320 if (!appendWeightedSearch(sb, Fields.VENDOR, v, vendorWeighting)) { -321 return null; -322 } -323 return sb.toString(); -324 } -325 -326 /** -327 * This method constructs a Lucene query for a given field. The searchText is split into separate words and if the word is -328 * within the list of weighted words then an additional weighting is applied to the term as it is appended into the query. -329 * -330 * @param sb a StringBuilder that the query text will be appended to. -331 * @param field the field within the Lucene index that the query is searching. -332 * @param searchText text used to construct the query. -333 * @param weightedText a list of terms that will be considered higher importance when searching. -334 * @return if the append was successful. -335 */ -336 private boolean appendWeightedSearch(StringBuilder sb, String field, String searchText, Set<String> weightedText) { -337 sb.append(" ").append(field).append(":( "); -338 -339 final String cleanText = cleanseText(searchText); -340 -341 if ("".equals(cleanText)) { -342 return false; -343 } -344 -345 if (weightedText == null || weightedText.isEmpty()) { -346 LuceneUtils.appendEscapedLuceneQuery(sb, cleanText); -347 } else { -348 final StringTokenizer tokens = new StringTokenizer(cleanText); -349 while (tokens.hasMoreElements()) { -350 final String word = tokens.nextToken(); -351 String temp = null; -352 for (String weighted : weightedText) { -353 final String weightedStr = cleanseText(weighted); -354 if (equalsIgnoreCaseAndNonAlpha(word, weightedStr)) { -355 temp = LuceneUtils.escapeLuceneQuery(word) + WEIGHTING_BOOST; -356 if (!word.equalsIgnoreCase(weightedStr)) { -357 temp += " " + LuceneUtils.escapeLuceneQuery(weightedStr) + WEIGHTING_BOOST; -358 } -359 } -360 } -361 if (temp == null) { -362 temp = LuceneUtils.escapeLuceneQuery(word); -363 } -364 sb.append(" ").append(temp); -365 } -366 } -367 sb.append(" ) "); -368 return true; -369 } -370 -371 /** -372 * Removes characters from the input text that are not used within the CPE index. -373 * -374 * @param text is the text to remove the characters from. -375 * @return the text having removed some characters. -376 */ -377 private String cleanseText(String text) { -378 return text.replaceAll(CLEANSE_CHARACTER_RX, " "); -379 } -380 -381 /** -382 * Compares two strings after lower casing them and removing the non-alpha characters. -383 * -384 * @param l string one to compare. -385 * @param r string two to compare. -386 * @return whether or not the two strings are similar. -387 */ -388 private boolean equalsIgnoreCaseAndNonAlpha(String l, String r) { -389 if (l == null || r == null) { -390 return false; -391 } -392 -393 final String left = l.replaceAll(CLEANSE_NONALPHA_RX, ""); -394 final String right = r.replaceAll(CLEANSE_NONALPHA_RX, ""); -395 return left.equalsIgnoreCase(right); -396 } -397 -398 /** -399 * Ensures that the CPE Identified matches the dependency. This validates that the product, vendor, and version information -400 * for the CPE are contained within the dependencies evidence. -401 * -402 * @param entry a CPE entry. -403 * @param dependency the dependency that the CPE entries could be for. -404 * @return whether or not the entry is valid. -405 */ -406 private boolean verifyEntry(final IndexEntry entry, final Dependency dependency) { -407 boolean isValid = false; -408 -409 //TODO - does this nullify some of the fuzzy matching that happens in the lucene search? -410 // for instance CPE some-component and in the evidence we have SomeComponent. -411 if (collectionContainsString(dependency.getProductEvidence(), entry.getProduct()) -412 && collectionContainsString(dependency.getVendorEvidence(), entry.getVendor())) { -413 //&& collectionContainsVersion(dependency.getVersionEvidence(), entry.getVersion()) -414 isValid = true; -415 } -416 return isValid; -417 } -418 -419 /** -420 * Used to determine if the EvidenceCollection contains a specific string. -421 * -422 * @param ec an EvidenceCollection -423 * @param text the text to search for -424 * @return whether or not the EvidenceCollection contains the string -425 */ -426 private boolean collectionContainsString(EvidenceCollection ec, String text) { -427 //TODO - likely need to change the split... not sure if this will work for CPE with special chars -428 if (text == null) { -429 return false; -430 } -431 final String[] words = text.split("[\\s_-]"); -432 final List<String> list = new ArrayList<String>(); -433 String tempWord = null; -434 for (String word : words) { -435 /* -436 single letter words should be concatenated with the next word. -437 so { "m", "core", "sample" } -> { "mcore", "sample" } -438 */ -439 if (tempWord != null) { -440 list.add(tempWord + word); -441 tempWord = null; -442 } else if (word.length() <= 2) { -443 tempWord = word; -444 } else { -445 list.add(word); -446 } -447 } -448 if (tempWord != null) { -449 if (!list.isEmpty()) { -450 final String tmp = list.get(list.size() - 1) + tempWord; -451 list.add(tmp); -452 } else { -453 list.add(tempWord); -454 } -455 } -456 if (list.isEmpty()) { -457 return false; -458 } -459 boolean contains = true; -460 for (String word : list) { -461 contains &= ec.containsUsedString(word); -462 } -463 return contains; -464 } -465 -466 /** -467 * Analyzes a dependency and attempts to determine if there are any CPE identifiers for this dependency. -468 * -469 * @param dependency The Dependency to analyze. -470 * @param engine The analysis engine -471 * @throws AnalysisException is thrown if there is an issue analyzing the dependency. -472 */ -473 @Override -474 public void analyze(Dependency dependency, Engine engine) throws AnalysisException { -475 try { -476 determineCPE(dependency); -477 } catch (CorruptIndexException ex) { -478 throw new AnalysisException("CPE Index is corrupt.", ex); -479 } catch (IOException ex) { -480 throw new AnalysisException("Failure opening the CPE Index.", ex); -481 } catch (ParseException ex) { -482 throw new AnalysisException("Unable to parse the generated Lucene query for this dependency.", ex); -483 } -484 } -485 -486 /** -487 * Retrieves a list of CPE values from the CveDB based on the vendor and product passed in. The list is then validated to find -488 * only CPEs that are valid for the given dependency. It is possible that the CPE identified is a best effort "guess" based on -489 * the vendor, product, and version information. -490 * -491 * @param dependency the Dependency being analyzed -492 * @param vendor the vendor for the CPE being analyzed -493 * @param product the product for the CPE being analyzed -494 * @param currentConfidence the current confidence being used during analysis -495 * @return <code>true</code> if an identifier was added to the dependency; otherwise <code>false</code> -496 * @throws UnsupportedEncodingException is thrown if UTF-8 is not supported -497 */ -498 protected boolean determineIdentifiers(Dependency dependency, String vendor, String product, -499 Confidence currentConfidence) throws UnsupportedEncodingException { -500 final Set<VulnerableSoftware> cpes = cve.getCPEs(vendor, product); -501 DependencyVersion bestGuess = new DependencyVersion("-"); -502 Confidence bestGuessConf = null; -503 boolean hasBroadMatch = false; -504 final List<IdentifierMatch> collected = new ArrayList<IdentifierMatch>(); -505 for (Confidence conf : Confidence.values()) { -506 // if (conf.compareTo(currentConfidence) > 0) { -507 // break; -508 // } -509 for (Evidence evidence : dependency.getVersionEvidence().iterator(conf)) { -510 final DependencyVersion evVer = DependencyVersionUtil.parseVersion(evidence.getValue()); -511 if (evVer == null) { -512 continue; -513 } -514 for (VulnerableSoftware vs : cpes) { -515 DependencyVersion dbVer; -516 if (vs.getUpdate() != null && !vs.getUpdate().isEmpty()) { -517 dbVer = DependencyVersionUtil.parseVersion(vs.getVersion() + "." + vs.getUpdate()); -518 } else { -519 dbVer = DependencyVersionUtil.parseVersion(vs.getVersion()); -520 } -521 if (dbVer == null) { //special case, no version specified - everything is vulnerable -522 hasBroadMatch = true; -523 final String url = String.format(NVD_SEARCH_URL, URLEncoder.encode(vs.getName(), "UTF-8")); -524 final IdentifierMatch match = new IdentifierMatch("cpe", vs.getName(), url, IdentifierConfidence.BROAD_MATCH, conf); -525 collected.add(match); -526 } else if (evVer.equals(dbVer)) { //yeah! exact match -527 final String url = String.format(NVD_SEARCH_URL, URLEncoder.encode(vs.getName(), "UTF-8")); -528 final IdentifierMatch match = new IdentifierMatch("cpe", vs.getName(), url, IdentifierConfidence.EXACT_MATCH, conf); -529 collected.add(match); -530 } else { -531 //TODO the following isn't quite right is it? need to think about this guessing game a bit more. -532 if (evVer.getVersionParts().size() <= dbVer.getVersionParts().size() -533 && evVer.matchesAtLeastThreeLevels(dbVer)) { -534 if (bestGuessConf == null || bestGuessConf.compareTo(conf) > 0) { -535 if (bestGuess.getVersionParts().size() < dbVer.getVersionParts().size()) { -536 bestGuess = dbVer; -537 bestGuessConf = conf; -538 } -539 } -540 } -541 } -542 } -543 if (bestGuessConf == null || bestGuessConf.compareTo(conf) > 0) { -544 if (bestGuess.getVersionParts().size() < evVer.getVersionParts().size()) { -545 bestGuess = evVer; -546 bestGuessConf = conf; -547 } -548 } -549 } -550 } -551 final String cpeName = String.format("cpe:/a:%s:%s:%s", vendor, product, bestGuess.toString()); -552 String url = null; -553 if (hasBroadMatch) { //if we have a broad match we can add the URL to the best guess. -554 final String cpeUrlName = String.format("cpe:/a:%s:%s", vendor, product); -555 url = String.format(NVD_SEARCH_URL, URLEncoder.encode(cpeUrlName, "UTF-8")); -556 } -557 if (bestGuessConf == null) { -558 bestGuessConf = Confidence.LOW; -559 } -560 final IdentifierMatch match = new IdentifierMatch("cpe", cpeName, url, IdentifierConfidence.BEST_GUESS, bestGuessConf); -561 collected.add(match); -562 -563 Collections.sort(collected); -564 final IdentifierConfidence bestIdentifierQuality = collected.get(0).getConfidence(); -565 final Confidence bestEvidenceQuality = collected.get(0).getEvidenceConfidence(); -566 boolean identifierAdded = false; -567 for (IdentifierMatch m : collected) { -568 if (bestIdentifierQuality.equals(m.getConfidence()) -569 && bestEvidenceQuality.equals(m.getEvidenceConfidence())) { -570 final Identifier i = m.getIdentifier(); -571 if (bestIdentifierQuality == IdentifierConfidence.BEST_GUESS) { -572 i.setConfidence(Confidence.LOW); -573 } else { -574 i.setConfidence(bestEvidenceQuality); -575 } -576 dependency.addIdentifier(i); -577 identifierAdded = true; -578 } -579 } -580 return identifierAdded; -581 } -582 -583 /** -584 * The confidence whether the identifier is an exact match, or a best guess. -585 */ -586 private enum IdentifierConfidence { -587 -588 /** -589 * An exact match for the CPE. -590 */ -591 EXACT_MATCH, -592 /** -593 * A best guess for the CPE. -594 */ -595 BEST_GUESS, -596 /** -597 * The entire vendor/product group must be added (without a guess at version) because there is a CVE with a VS that only -598 * specifies vendor/product. -599 */ -600 BROAD_MATCH -601 } -602 -603 /** -604 * A simple object to hold an identifier and carry information about the confidence in the identifier. -605 */ -606 private static class IdentifierMatch implements Comparable<IdentifierMatch> { -607 -608 /** -609 * Constructs an IdentifierMatch. -610 * -611 * @param type the type of identifier (such as CPE) -612 * @param value the value of the identifier -613 * @param url the URL of the identifier -614 * @param identifierConfidence the confidence in the identifier: best guess or exact match -615 * @param evidenceConfidence the confidence of the evidence used to find the identifier -616 */ -617 IdentifierMatch(String type, String value, String url, IdentifierConfidence identifierConfidence, Confidence evidenceConfidence) { -618 this.identifier = new Identifier(type, value, url); -619 this.confidence = identifierConfidence; -620 this.evidenceConfidence = evidenceConfidence; -621 } -622 //<editor-fold defaultstate="collapsed" desc="Property implementations: evidenceConfidence, confidence, identifier"> -623 /** -624 * The confidence in the evidence used to identify this match. -625 */ -626 private Confidence evidenceConfidence; -627 -628 /** -629 * Get the value of evidenceConfidence -630 * -631 * @return the value of evidenceConfidence -632 */ -633 public Confidence getEvidenceConfidence() { -634 return evidenceConfidence; -635 } -636 -637 /** -638 * Set the value of evidenceConfidence -639 * -640 * @param evidenceConfidence new value of evidenceConfidence -641 */ -642 public void setEvidenceConfidence(Confidence evidenceConfidence) { -643 this.evidenceConfidence = evidenceConfidence; -644 } -645 /** -646 * The confidence whether this is an exact match, or a best guess. -647 */ -648 private IdentifierConfidence confidence; -649 -650 /** -651 * Get the value of confidence. -652 * -653 * @return the value of confidence -654 */ -655 public IdentifierConfidence getConfidence() { -656 return confidence; -657 } -658 -659 /** -660 * Set the value of confidence. -661 * -662 * @param confidence new value of confidence -663 */ -664 public void setConfidence(IdentifierConfidence confidence) { -665 this.confidence = confidence; -666 } -667 /** -668 * The CPE identifier. -669 */ -670 private Identifier identifier; -671 -672 /** -673 * Get the value of identifier. -674 * -675 * @return the value of identifier -676 */ -677 public Identifier getIdentifier() { -678 return identifier; -679 } -680 -681 /** -682 * Set the value of identifier. -683 * -684 * @param identifier new value of identifier -685 */ -686 public void setIdentifier(Identifier identifier) { -687 this.identifier = identifier; -688 } -689 //</editor-fold> -690 //<editor-fold defaultstate="collapsed" desc="Standard implementations of toString, hashCode, and equals"> -691 -692 /** -693 * Standard toString() implementation. -694 * -695 * @return the string representation of the object -696 */ -697 @Override -698 public String toString() { -699 return "IdentifierMatch{" + "evidenceConfidence=" + evidenceConfidence -700 + ", confidence=" + confidence + ", identifier=" + identifier + '}'; -701 } -702 -703 /** -704 * Standard hashCode() implementation. -705 * -706 * @return the hashCode -707 */ -708 @Override -709 public int hashCode() { -710 int hash = 5; -711 hash = 97 * hash + (this.evidenceConfidence != null ? this.evidenceConfidence.hashCode() : 0); -712 hash = 97 * hash + (this.confidence != null ? this.confidence.hashCode() : 0); -713 hash = 97 * hash + (this.identifier != null ? this.identifier.hashCode() : 0); -714 return hash; -715 } -716 -717 /** -718 * Standard equals implementation. -719 * -720 * @param obj the object to compare -721 * @return true if the objects are equal, otherwise false -722 */ -723 @Override -724 public boolean equals(Object obj) { -725 if (obj == null) { -726 return false; -727 } -728 if (getClass() != obj.getClass()) { -729 return false; -730 } -731 final IdentifierMatch other = (IdentifierMatch) obj; -732 if (this.evidenceConfidence != other.evidenceConfidence) { -733 return false; -734 } -735 if (this.confidence != other.confidence) { -736 return false; -737 } -738 if (this.identifier != other.identifier && (this.identifier == null || !this.identifier.equals(other.identifier))) { -739 return false; -740 } -741 return true; -742 } -743 //</editor-fold> -744 -745 /** -746 * Standard implementation of compareTo that compares identifier confidence, evidence confidence, and then the identifier. -747 * -748 * @param o the IdentifierMatch to compare to -749 * @return the natural ordering of IdentifierMatch -750 */ -751 @Override -752 public int compareTo(IdentifierMatch o) { -753 int conf = this.confidence.compareTo(o.confidence); -754 if (conf == 0) { -755 conf = this.evidenceConfidence.compareTo(o.evidenceConfidence); -756 if (conf == 0) { -757 conf = identifier.compareTo(o.identifier); -758 } -759 } -760 return conf; -761 } -762 } -763 } +144 LOGGER.info("CPE Index Created ({} ms)", System.currentTimeMillis() - creationStart); +145 } catch (IndexException ex) { +146 LOGGER.debug("IndexException", ex); +147 throw new DatabaseException(ex); +148 } +149 } +150 +151 /** +152 * Closes the data sources. +153 */ +154 @Override +155 public void close() { +156 if (cpe != null) { +157 cpe.close(); +158 cpe = null; +159 } +160 if (cve != null) { +161 cve.close(); +162 cve = null; +163 } +164 } +165 +166 public boolean isOpen() { +167 return cpe != null && cpe.isOpen(); +168 } +169 +170 /** +171 * Searches the data store of CPE entries, trying to identify the CPE for the given dependency based on the evidence contained +172 * within. The dependency passed in is updated with any identified CPE values. +173 * +174 * @param dependency the dependency to search for CPE entries on. +175 * @throws CorruptIndexException is thrown when the Lucene index is corrupt. +176 * @throws IOException is thrown when an IOException occurs. +177 * @throws ParseException is thrown when the Lucene query cannot be parsed. +178 */ +179 protected void determineCPE(Dependency dependency) throws CorruptIndexException, IOException, ParseException { +180 //TODO test dojo-war against this. we shold get dojo-toolkit:dojo-toolkit AND dojo-toolkit:toolkit +181 String vendors = ""; +182 String products = ""; +183 for (Confidence confidence : Confidence.values()) { +184 if (dependency.getVendorEvidence().contains(confidence)) { +185 vendors = addEvidenceWithoutDuplicateTerms(vendors, dependency.getVendorEvidence(), confidence); +186 LOGGER.debug("vendor search: {}", vendors); +187 } +188 if (dependency.getProductEvidence().contains(confidence)) { +189 products = addEvidenceWithoutDuplicateTerms(products, dependency.getProductEvidence(), confidence); +190 LOGGER.debug("product search: {}", products); +191 } +192 if (!vendors.isEmpty() && !products.isEmpty()) { +193 final List<IndexEntry> entries = searchCPE(vendors, products, dependency.getProductEvidence().getWeighting(), +194 dependency.getVendorEvidence().getWeighting()); +195 if (entries == null) { +196 continue; +197 } +198 boolean identifierAdded = false; +199 for (IndexEntry e : entries) { +200 LOGGER.debug("Verifying entry: {}", e); +201 if (verifyEntry(e, dependency)) { +202 final String vendor = e.getVendor(); +203 final String product = e.getProduct(); +204 LOGGER.debug("identified vendor/product: {}/{}", vendor, product); +205 identifierAdded |= determineIdentifiers(dependency, vendor, product, confidence); +206 } +207 } +208 if (identifierAdded) { +209 break; +210 } +211 } +212 } +213 } +214 +215 /** +216 * Returns the text created by concatenating the text and the values from the EvidenceCollection (filtered for a specific +217 * confidence). This attempts to prevent duplicate terms from being added.<br/<br/> Note, if the evidence is longer then 200 +218 * characters it will be truncated. +219 * +220 * @param text the base text. +221 * @param ec an EvidenceCollection +222 * @param confidenceFilter a Confidence level to filter the evidence by. +223 * @return the new evidence text +224 */ +225 private String addEvidenceWithoutDuplicateTerms(final String text, final EvidenceCollection ec, Confidence confidenceFilter) { +226 final String txt = (text == null) ? "" : text; +227 final StringBuilder sb = new StringBuilder(txt.length() + (20 * ec.size())); +228 sb.append(' ').append(txt).append(' '); +229 for (Evidence e : ec.iterator(confidenceFilter)) { +230 String value = e.getValue(); +231 +232 //hack to get around the fact that lucene does a really good job of recognizing domains and not +233 // splitting them. TODO - put together a better lucene analyzer specific to the domain. +234 if (value.startsWith("http://")) { +235 value = value.substring(7).replaceAll("\\.", " "); +236 } +237 if (value.startsWith("https://")) { +238 value = value.substring(8).replaceAll("\\.", " "); +239 } +240 if (sb.indexOf(" " + value + " ") < 0) { +241 sb.append(value).append(' '); +242 } +243 } +244 return sb.toString().trim(); +245 } +246 +247 /** +248 * <p> +249 * Searches the Lucene CPE index to identify possible CPE entries associated with the supplied vendor, product, and +250 * version.</p> +251 * +252 * <p> +253 * If either the vendorWeightings or productWeightings lists have been populated this data is used to add weighting factors to +254 * the search.</p> +255 * +256 * @param vendor the text used to search the vendor field +257 * @param product the text used to search the product field +258 * @param vendorWeightings a list of strings to use to add weighting factors to the vendor field +259 * @param productWeightings Adds a list of strings that will be used to add weighting factors to the product search +260 * @return a list of possible CPE values +261 */ +262 protected List<IndexEntry> searchCPE(String vendor, String product, +263 Set<String> vendorWeightings, Set<String> productWeightings) { +264 +265 final List<IndexEntry> ret = new ArrayList<IndexEntry>(MAX_QUERY_RESULTS); +266 +267 final String searchString = buildSearch(vendor, product, vendorWeightings, productWeightings); +268 if (searchString == null) { +269 return ret; +270 } +271 try { +272 final TopDocs docs = cpe.search(searchString, MAX_QUERY_RESULTS); +273 for (ScoreDoc d : docs.scoreDocs) { +274 if (d.score >= 0.08) { +275 final Document doc = cpe.getDocument(d.doc); +276 final IndexEntry entry = new IndexEntry(); +277 entry.setVendor(doc.get(Fields.VENDOR)); +278 entry.setProduct(doc.get(Fields.PRODUCT)); +279 entry.setSearchScore(d.score); +280 if (!ret.contains(entry)) { +281 ret.add(entry); +282 } +283 } +284 } +285 return ret; +286 } catch (ParseException ex) { +287 LOGGER.warn("An error occured querying the CPE data. See the log for more details."); +288 LOGGER.info("Unable to parse: {}", searchString, ex); +289 } catch (IOException ex) { +290 LOGGER.warn("An error occured reading CPE data. See the log for more details."); +291 LOGGER.info("IO Error with search string: {}", searchString, ex); +292 } +293 return null; +294 } +295 +296 /** +297 * <p> +298 * Builds a Lucene search string by properly escaping data and constructing a valid search query.</p> +299 * +300 * <p> +301 * If either the possibleVendor or possibleProducts lists have been populated this data is used to add weighting factors to +302 * the search string generated.</p> +303 * +304 * @param vendor text to search the vendor field +305 * @param product text to search the product field +306 * @param vendorWeighting a list of strings to apply to the vendor to boost the terms weight +307 * @param productWeightings a list of strings to apply to the product to boost the terms weight +308 * @return the Lucene query +309 */ +310 protected String buildSearch(String vendor, String product, +311 Set<String> vendorWeighting, Set<String> productWeightings) { +312 final String v = vendor; //.replaceAll("[^\\w\\d]", " "); +313 final String p = product; //.replaceAll("[^\\w\\d]", " "); +314 final StringBuilder sb = new StringBuilder(v.length() + p.length() +315 + Fields.PRODUCT.length() + Fields.VENDOR.length() + STRING_BUILDER_BUFFER); +316 +317 if (!appendWeightedSearch(sb, Fields.PRODUCT, p, productWeightings)) { +318 return null; +319 } +320 sb.append(" AND "); +321 if (!appendWeightedSearch(sb, Fields.VENDOR, v, vendorWeighting)) { +322 return null; +323 } +324 return sb.toString(); +325 } +326 +327 /** +328 * This method constructs a Lucene query for a given field. The searchText is split into separate words and if the word is +329 * within the list of weighted words then an additional weighting is applied to the term as it is appended into the query. +330 * +331 * @param sb a StringBuilder that the query text will be appended to. +332 * @param field the field within the Lucene index that the query is searching. +333 * @param searchText text used to construct the query. +334 * @param weightedText a list of terms that will be considered higher importance when searching. +335 * @return if the append was successful. +336 */ +337 private boolean appendWeightedSearch(StringBuilder sb, String field, String searchText, Set<String> weightedText) { +338 sb.append(" ").append(field).append(":( "); +339 +340 final String cleanText = cleanseText(searchText); +341 +342 if (cleanText.isEmpty()) { +343 return false; +344 } +345 +346 if (weightedText == null || weightedText.isEmpty()) { +347 LuceneUtils.appendEscapedLuceneQuery(sb, cleanText); +348 } else { +349 final StringTokenizer tokens = new StringTokenizer(cleanText); +350 while (tokens.hasMoreElements()) { +351 final String word = tokens.nextToken(); +352 String temp = null; +353 for (String weighted : weightedText) { +354 final String weightedStr = cleanseText(weighted); +355 if (equalsIgnoreCaseAndNonAlpha(word, weightedStr)) { +356 temp = LuceneUtils.escapeLuceneQuery(word) + WEIGHTING_BOOST; +357 if (!word.equalsIgnoreCase(weightedStr)) { +358 temp += " " + LuceneUtils.escapeLuceneQuery(weightedStr) + WEIGHTING_BOOST; +359 } +360 } +361 } +362 if (temp == null) { +363 temp = LuceneUtils.escapeLuceneQuery(word); +364 } +365 sb.append(" ").append(temp); +366 } +367 } +368 sb.append(" ) "); +369 return true; +370 } +371 +372 /** +373 * Removes characters from the input text that are not used within the CPE index. +374 * +375 * @param text is the text to remove the characters from. +376 * @return the text having removed some characters. +377 */ +378 private String cleanseText(String text) { +379 return text.replaceAll(CLEANSE_CHARACTER_RX, " "); +380 } +381 +382 /** +383 * Compares two strings after lower casing them and removing the non-alpha characters. +384 * +385 * @param l string one to compare. +386 * @param r string two to compare. +387 * @return whether or not the two strings are similar. +388 */ +389 private boolean equalsIgnoreCaseAndNonAlpha(String l, String r) { +390 if (l == null || r == null) { +391 return false; +392 } +393 +394 final String left = l.replaceAll(CLEANSE_NONALPHA_RX, ""); +395 final String right = r.replaceAll(CLEANSE_NONALPHA_RX, ""); +396 return left.equalsIgnoreCase(right); +397 } +398 +399 /** +400 * Ensures that the CPE Identified matches the dependency. This validates that the product, vendor, and version information +401 * for the CPE are contained within the dependencies evidence. +402 * +403 * @param entry a CPE entry. +404 * @param dependency the dependency that the CPE entries could be for. +405 * @return whether or not the entry is valid. +406 */ +407 private boolean verifyEntry(final IndexEntry entry, final Dependency dependency) { +408 boolean isValid = false; +409 +410 //TODO - does this nullify some of the fuzzy matching that happens in the lucene search? +411 // for instance CPE some-component and in the evidence we have SomeComponent. +412 if (collectionContainsString(dependency.getProductEvidence(), entry.getProduct()) +413 && collectionContainsString(dependency.getVendorEvidence(), entry.getVendor())) { +414 //&& collectionContainsVersion(dependency.getVersionEvidence(), entry.getVersion()) +415 isValid = true; +416 } +417 return isValid; +418 } +419 +420 /** +421 * Used to determine if the EvidenceCollection contains a specific string. +422 * +423 * @param ec an EvidenceCollection +424 * @param text the text to search for +425 * @return whether or not the EvidenceCollection contains the string +426 */ +427 private boolean collectionContainsString(EvidenceCollection ec, String text) { +428 //TODO - likely need to change the split... not sure if this will work for CPE with special chars +429 if (text == null) { +430 return false; +431 } +432 final String[] words = text.split("[\\s_-]"); +433 final List<String> list = new ArrayList<String>(); +434 String tempWord = null; +435 for (String word : words) { +436 /* +437 single letter words should be concatenated with the next word. +438 so { "m", "core", "sample" } -> { "mcore", "sample" } +439 */ +440 if (tempWord != null) { +441 list.add(tempWord + word); +442 tempWord = null; +443 } else if (word.length() <= 2) { +444 tempWord = word; +445 } else { +446 list.add(word); +447 } +448 } +449 if (tempWord != null) { +450 if (!list.isEmpty()) { +451 final String tmp = list.get(list.size() - 1) + tempWord; +452 list.add(tmp); +453 } else { +454 list.add(tempWord); +455 } +456 } +457 if (list.isEmpty()) { +458 return false; +459 } +460 boolean contains = true; +461 for (String word : list) { +462 contains &= ec.containsUsedString(word); +463 } +464 return contains; +465 } +466 +467 /** +468 * Analyzes a dependency and attempts to determine if there are any CPE identifiers for this dependency. +469 * +470 * @param dependency The Dependency to analyze. +471 * @param engine The analysis engine +472 * @throws AnalysisException is thrown if there is an issue analyzing the dependency. +473 */ +474 @Override +475 public void analyze(Dependency dependency, Engine engine) throws AnalysisException { +476 try { +477 determineCPE(dependency); +478 } catch (CorruptIndexException ex) { +479 throw new AnalysisException("CPE Index is corrupt.", ex); +480 } catch (IOException ex) { +481 throw new AnalysisException("Failure opening the CPE Index.", ex); +482 } catch (ParseException ex) { +483 throw new AnalysisException("Unable to parse the generated Lucene query for this dependency.", ex); +484 } +485 } +486 +487 /** +488 * Retrieves a list of CPE values from the CveDB based on the vendor and product passed in. The list is then validated to find +489 * only CPEs that are valid for the given dependency. It is possible that the CPE identified is a best effort "guess" based on +490 * the vendor, product, and version information. +491 * +492 * @param dependency the Dependency being analyzed +493 * @param vendor the vendor for the CPE being analyzed +494 * @param product the product for the CPE being analyzed +495 * @param currentConfidence the current confidence being used during analysis +496 * @return <code>true</code> if an identifier was added to the dependency; otherwise <code>false</code> +497 * @throws UnsupportedEncodingException is thrown if UTF-8 is not supported +498 */ +499 protected boolean determineIdentifiers(Dependency dependency, String vendor, String product, +500 Confidence currentConfidence) throws UnsupportedEncodingException { +501 final Set<VulnerableSoftware> cpes = cve.getCPEs(vendor, product); +502 DependencyVersion bestGuess = new DependencyVersion("-"); +503 Confidence bestGuessConf = null; +504 boolean hasBroadMatch = false; +505 final List<IdentifierMatch> collected = new ArrayList<IdentifierMatch>(); +506 for (Confidence conf : Confidence.values()) { +507 // if (conf.compareTo(currentConfidence) > 0) { +508 // break; +509 // } +510 for (Evidence evidence : dependency.getVersionEvidence().iterator(conf)) { +511 final DependencyVersion evVer = DependencyVersionUtil.parseVersion(evidence.getValue()); +512 if (evVer == null) { +513 continue; +514 } +515 for (VulnerableSoftware vs : cpes) { +516 DependencyVersion dbVer; +517 if (vs.getUpdate() != null && !vs.getUpdate().isEmpty()) { +518 dbVer = DependencyVersionUtil.parseVersion(vs.getVersion() + "." + vs.getUpdate()); +519 } else { +520 dbVer = DependencyVersionUtil.parseVersion(vs.getVersion()); +521 } +522 if (dbVer == null) { //special case, no version specified - everything is vulnerable +523 hasBroadMatch = true; +524 final String url = String.format(NVD_SEARCH_URL, URLEncoder.encode(vs.getName(), "UTF-8")); +525 final IdentifierMatch match = new IdentifierMatch("cpe", vs.getName(), url, IdentifierConfidence.BROAD_MATCH, conf); +526 collected.add(match); +527 } else if (evVer.equals(dbVer)) { //yeah! exact match +528 final String url = String.format(NVD_SEARCH_URL, URLEncoder.encode(vs.getName(), "UTF-8")); +529 final IdentifierMatch match = new IdentifierMatch("cpe", vs.getName(), url, IdentifierConfidence.EXACT_MATCH, conf); +530 collected.add(match); +531 } else { +532 //TODO the following isn't quite right is it? need to think about this guessing game a bit more. +533 if (evVer.getVersionParts().size() <= dbVer.getVersionParts().size() +534 && evVer.matchesAtLeastThreeLevels(dbVer)) { +535 if (bestGuessConf == null || bestGuessConf.compareTo(conf) > 0) { +536 if (bestGuess.getVersionParts().size() < dbVer.getVersionParts().size()) { +537 bestGuess = dbVer; +538 bestGuessConf = conf; +539 } +540 } +541 } +542 } +543 } +544 if (bestGuessConf == null || bestGuessConf.compareTo(conf) > 0) { +545 if (bestGuess.getVersionParts().size() < evVer.getVersionParts().size()) { +546 bestGuess = evVer; +547 bestGuessConf = conf; +548 } +549 } +550 } +551 } +552 final String cpeName = String.format("cpe:/a:%s:%s:%s", vendor, product, bestGuess.toString()); +553 String url = null; +554 if (hasBroadMatch) { //if we have a broad match we can add the URL to the best guess. +555 final String cpeUrlName = String.format("cpe:/a:%s:%s", vendor, product); +556 url = String.format(NVD_SEARCH_URL, URLEncoder.encode(cpeUrlName, "UTF-8")); +557 } +558 if (bestGuessConf == null) { +559 bestGuessConf = Confidence.LOW; +560 } +561 final IdentifierMatch match = new IdentifierMatch("cpe", cpeName, url, IdentifierConfidence.BEST_GUESS, bestGuessConf); +562 collected.add(match); +563 +564 Collections.sort(collected); +565 final IdentifierConfidence bestIdentifierQuality = collected.get(0).getConfidence(); +566 final Confidence bestEvidenceQuality = collected.get(0).getEvidenceConfidence(); +567 boolean identifierAdded = false; +568 for (IdentifierMatch m : collected) { +569 if (bestIdentifierQuality.equals(m.getConfidence()) +570 && bestEvidenceQuality.equals(m.getEvidenceConfidence())) { +571 final Identifier i = m.getIdentifier(); +572 if (bestIdentifierQuality == IdentifierConfidence.BEST_GUESS) { +573 i.setConfidence(Confidence.LOW); +574 } else { +575 i.setConfidence(bestEvidenceQuality); +576 } +577 dependency.addIdentifier(i); +578 identifierAdded = true; +579 } +580 } +581 return identifierAdded; +582 } +583 +584 /** +585 * The confidence whether the identifier is an exact match, or a best guess. +586 */ +587 private enum IdentifierConfidence { +588 +589 /** +590 * An exact match for the CPE. +591 */ +592 EXACT_MATCH, +593 /** +594 * A best guess for the CPE. +595 */ +596 BEST_GUESS, +597 /** +598 * The entire vendor/product group must be added (without a guess at version) because there is a CVE with a VS that only +599 * specifies vendor/product. +600 */ +601 BROAD_MATCH +602 } +603 +604 /** +605 * A simple object to hold an identifier and carry information about the confidence in the identifier. +606 */ +607 private static class IdentifierMatch implements Comparable<IdentifierMatch> { +608 +609 /** +610 * Constructs an IdentifierMatch. +611 * +612 * @param type the type of identifier (such as CPE) +613 * @param value the value of the identifier +614 * @param url the URL of the identifier +615 * @param identifierConfidence the confidence in the identifier: best guess or exact match +616 * @param evidenceConfidence the confidence of the evidence used to find the identifier +617 */ +618 IdentifierMatch(String type, String value, String url, IdentifierConfidence identifierConfidence, Confidence evidenceConfidence) { +619 this.identifier = new Identifier(type, value, url); +620 this.confidence = identifierConfidence; +621 this.evidenceConfidence = evidenceConfidence; +622 } +623 //<editor-fold defaultstate="collapsed" desc="Property implementations: evidenceConfidence, confidence, identifier"> +624 /** +625 * The confidence in the evidence used to identify this match. +626 */ +627 private Confidence evidenceConfidence; +628 +629 /** +630 * Get the value of evidenceConfidence +631 * +632 * @return the value of evidenceConfidence +633 */ +634 public Confidence getEvidenceConfidence() { +635 return evidenceConfidence; +636 } +637 +638 /** +639 * Set the value of evidenceConfidence +640 * +641 * @param evidenceConfidence new value of evidenceConfidence +642 */ +643 public void setEvidenceConfidence(Confidence evidenceConfidence) { +644 this.evidenceConfidence = evidenceConfidence; +645 } +646 /** +647 * The confidence whether this is an exact match, or a best guess. +648 */ +649 private IdentifierConfidence confidence; +650 +651 /** +652 * Get the value of confidence. +653 * +654 * @return the value of confidence +655 */ +656 public IdentifierConfidence getConfidence() { +657 return confidence; +658 } +659 +660 /** +661 * Set the value of confidence. +662 * +663 * @param confidence new value of confidence +664 */ +665 public void setConfidence(IdentifierConfidence confidence) { +666 this.confidence = confidence; +667 } +668 /** +669 * The CPE identifier. +670 */ +671 private Identifier identifier; +672 +673 /** +674 * Get the value of identifier. +675 * +676 * @return the value of identifier +677 */ +678 public Identifier getIdentifier() { +679 return identifier; +680 } +681 +682 /** +683 * Set the value of identifier. +684 * +685 * @param identifier new value of identifier +686 */ +687 public void setIdentifier(Identifier identifier) { +688 this.identifier = identifier; +689 } +690 //</editor-fold> +691 //<editor-fold defaultstate="collapsed" desc="Standard implementations of toString, hashCode, and equals"> +692 +693 /** +694 * Standard toString() implementation. +695 * +696 * @return the string representation of the object +697 */ +698 @Override +699 public String toString() { +700 return "IdentifierMatch{" + "evidenceConfidence=" + evidenceConfidence +701 + ", confidence=" + confidence + ", identifier=" + identifier + '}'; +702 } +703 +704 /** +705 * Standard hashCode() implementation. +706 * +707 * @return the hashCode +708 */ +709 @Override +710 public int hashCode() { +711 int hash = 5; +712 hash = 97 * hash + (this.evidenceConfidence != null ? this.evidenceConfidence.hashCode() : 0); +713 hash = 97 * hash + (this.confidence != null ? this.confidence.hashCode() : 0); +714 hash = 97 * hash + (this.identifier != null ? this.identifier.hashCode() : 0); +715 return hash; +716 } +717 +718 /** +719 * Standard equals implementation. +720 * +721 * @param obj the object to compare +722 * @return true if the objects are equal, otherwise false +723 */ +724 @Override +725 public boolean equals(Object obj) { +726 if (obj == null) { +727 return false; +728 } +729 if (getClass() != obj.getClass()) { +730 return false; +731 } +732 final IdentifierMatch other = (IdentifierMatch) obj; +733 if (this.evidenceConfidence != other.evidenceConfidence) { +734 return false; +735 } +736 if (this.confidence != other.confidence) { +737 return false; +738 } +739 if (this.identifier != other.identifier && (this.identifier == null || !this.identifier.equals(other.identifier))) { +740 return false; +741 } +742 return true; +743 } +744 //</editor-fold> +745 +746 /** +747 * Standard implementation of compareTo that compares identifier confidence, evidence confidence, and then the identifier. +748 * +749 * @param o the IdentifierMatch to compare to +750 * @return the natural ordering of IdentifierMatch +751 */ +752 @Override +753 public int compareTo(IdentifierMatch o) { +754 int conf = this.confidence.compareTo(o.confidence); +755 if (conf == 0) { +756 conf = this.evidenceConfidence.compareTo(o.evidenceConfidence); +757 if (conf == 0) { +758 conf = identifier.compareTo(o.identifier); +759 } +760 } +761 return conf; +762 } +763 } +764 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/ComposerLockAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/ComposerLockAnalyzer.html new file mode 100644 index 000000000..5d00f0bae --- /dev/null +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/ComposerLockAnalyzer.html @@ -0,0 +1,175 @@ + + + +ComposerLockAnalyzer xref + + + +
    +1   /*
    +2    * This file is part of dependency-check-core.
    +3    *
    +4    * Licensed under the Apache License, Version 2.0 (the "License");
    +5    * you may not use this file except in compliance with the License.
    +6    * You may obtain a copy of the License at
    +7    *
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
    +9    *
    +10   * Unless required by applicable law or agreed to in writing, software
    +11   * distributed under the License is distributed on an "AS IS" BASIS,
    +12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +13   * See the License for the specific language governing permissions and
    +14   * limitations under the License.
    +15   *
    +16   * Copyright (c) 2015 The OWASP Foundation. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.analyzer;
    +19  
    +20  import org.owasp.dependencycheck.Engine;
    +21  import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
    +22  import org.owasp.dependencycheck.data.composer.ComposerDependency;
    +23  import org.owasp.dependencycheck.data.composer.ComposerException;
    +24  import org.owasp.dependencycheck.data.composer.ComposerLockParser;
    +25  import org.owasp.dependencycheck.dependency.Confidence;
    +26  import org.owasp.dependencycheck.dependency.Dependency;
    +27  import org.owasp.dependencycheck.utils.Checksum;
    +28  import org.owasp.dependencycheck.utils.FileFilterBuilder;
    +29  import org.owasp.dependencycheck.utils.Settings;
    +30  import org.slf4j.Logger;
    +31  import org.slf4j.LoggerFactory;
    +32  
    +33  import java.io.FileFilter;
    +34  import java.io.FileInputStream;
    +35  import java.io.FileNotFoundException;
    +36  import java.nio.charset.Charset;
    +37  import java.security.MessageDigest;
    +38  
    +39  /**
    +40   * Used to analyze a composer.lock file for a composer PHP app.
    +41   *
    +42   * @author colezlaw
    +43   */
    +44  public class ComposerLockAnalyzer extends AbstractFileTypeAnalyzer {
    +45  
    +46      /**
    +47       * The logger
    +48       */
    +49      private static final Logger LOGGER = LoggerFactory.getLogger(ComposerLockAnalyzer.class);
    +50  
    +51      /**
    +52       * The analyzer name
    +53       */
    +54      private static final String ANALYZER_NAME = "Composer.lock analyzer";
    +55  
    +56      /**
    +57       * composer.json
    +58       */
    +59      private static final String COMPOSER_LOCK = "composer.lock";
    +60  
    +61      /**
    +62       * The FileFilter
    +63       */
    +64      private static final FileFilter FILE_FILTER = FileFilterBuilder.newInstance().addFilenames(COMPOSER_LOCK).build();
    +65  
    +66      /**
    +67       * Returns the FileFilter
    +68       *
    +69       * @return the FileFilter
    +70       */
    +71      @Override
    +72      protected FileFilter getFileFilter() {
    +73          return FILE_FILTER;
    +74      }
    +75  
    +76      /**
    +77       * Initializes the analyzer
    +78       *
    +79       * @throws Exception
    +80       */
    +81      @Override
    +82      protected void initializeFileTypeAnalyzer() throws Exception {
    +83          sha1 = MessageDigest.getInstance("SHA1");
    +84      }
    +85  
    +86      /**
    +87       * The MessageDigest for calculating a new digest for the new dependencies added
    +88       */
    +89      private MessageDigest sha1 = null;
    +90  
    +91      /**
    +92       * Entry point for the analyzer.
    +93       *
    +94       * @param dependency the dependency to analyze
    +95       * @param engine the engine scanning
    +96       * @throws AnalysisException if there's a failure during analysis
    +97       */
    +98      @Override
    +99      protected void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException {
    +100         FileInputStream fis = null;
    +101         try {
    +102             fis = new FileInputStream(dependency.getActualFile());
    +103             final ComposerLockParser clp = new ComposerLockParser(fis);
    +104             LOGGER.info("Checking composer.lock file {}", dependency.getActualFilePath());
    +105             clp.process();
    +106             for (ComposerDependency dep : clp.getDependencies()) {
    +107                 final Dependency d = new Dependency(dependency.getActualFile());
    +108                 d.setDisplayFileName(String.format("%s:%s/%s", dependency.getDisplayFileName(), dep.getGroup(), dep.getProject()));
    +109                 final String filePath = String.format("%s:%s/%s", dependency.getFilePath(), dep.getGroup(), dep.getProject());
    +110                 d.setFilePath(filePath);
    +111                 d.setSha1sum(Checksum.getHex(sha1.digest(filePath.getBytes(Charset.defaultCharset()))));
    +112                 d.getVendorEvidence().addEvidence(COMPOSER_LOCK, "vendor", dep.getGroup(), Confidence.HIGHEST);
    +113                 d.getProductEvidence().addEvidence(COMPOSER_LOCK, "product", dep.getProject(), Confidence.HIGHEST);
    +114                 d.getVersionEvidence().addEvidence(COMPOSER_LOCK, "version", dep.getVersion(), Confidence.HIGHEST);
    +115                 LOGGER.info("Adding dependency {}", d);
    +116                 engine.getDependencies().add(d);
    +117             }
    +118         } catch (FileNotFoundException fnfe) {
    +119             LOGGER.warn("Error opening dependency {}", dependency.getActualFilePath());
    +120         } catch (ComposerException ce) {
    +121             LOGGER.warn("Error parsing composer.json {}", dependency.getActualFilePath(), ce);
    +122         } finally {
    +123             if (fis != null) {
    +124                 try {
    +125                     fis.close();
    +126                 } catch (Exception e) {
    +127                     LOGGER.debug("Unable to close file", e);
    +128                 }
    +129             }
    +130         }
    +131     }
    +132 
    +133     /**
    +134      * Gets the key to determine whether the analyzer is enabled.
    +135      *
    +136      * @return the key specifying whether the analyzer is enabled
    +137      */
    +138     @Override
    +139     protected String getAnalyzerEnabledSettingKey() {
    +140         return Settings.KEYS.ANALYZER_COMPOSER_LOCK_ENABLED;
    +141     }
    +142 
    +143     /**
    +144      * Returns the analyzer's name.
    +145      *
    +146      * @return the analyzer's name
    +147      */
    +148     @Override
    +149     public String getName() {
    +150         return ANALYZER_NAME;
    +151     }
    +152 
    +153     /**
    +154      * Returns the phase this analyzer should run under.
    +155      *
    +156      * @return the analysis phase
    +157      */
    +158     @Override
    +159     public AnalysisPhase getAnalysisPhase() {
    +160         return AnalysisPhase.INFORMATION_COLLECTION;
    +161     }
    +162 }
    +
    +
    + + + diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/DependencyBundlingAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/DependencyBundlingAnalyzer.html index 406003c9a..510a8935b 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/DependencyBundlingAnalyzer.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/DependencyBundlingAnalyzer.html @@ -83,357 +83,359 @@ 75 * 76 * @return the name of the analyzer. 77 */ -78 public String getName() { -79 return ANALYZER_NAME; -80 } -81 -82 /** -83 * Returns the phase that the analyzer is intended to run in. -84 * -85 * @return the phase that the analyzer is intended to run in. -86 */ -87 public AnalysisPhase getAnalysisPhase() { -88 return ANALYSIS_PHASE; -89 } -90 //</editor-fold> -91 -92 /** -93 * Analyzes a set of dependencies. If they have been found to have the same base path and the same set of identifiers they are -94 * likely related. The related dependencies are bundled into a single reportable item. -95 * -96 * @param ignore this analyzer ignores the dependency being analyzed -97 * @param engine the engine that is scanning the dependencies -98 * @throws AnalysisException is thrown if there is an error reading the JAR file. -99 */ -100 @Override -101 public void analyze(Dependency ignore, Engine engine) throws AnalysisException { -102 if (!analyzed) { -103 analyzed = true; -104 final Set<Dependency> dependenciesToRemove = new HashSet<Dependency>(); -105 final ListIterator<Dependency> mainIterator = engine.getDependencies().listIterator(); -106 //for (Dependency nextDependency : engine.getDependencies()) { -107 while (mainIterator.hasNext()) { -108 final Dependency dependency = mainIterator.next(); -109 if (mainIterator.hasNext() && !dependenciesToRemove.contains(dependency)) { -110 final ListIterator<Dependency> subIterator = engine.getDependencies().listIterator(mainIterator.nextIndex()); -111 while (subIterator.hasNext()) { -112 final Dependency nextDependency = subIterator.next(); -113 if (hashesMatch(dependency, nextDependency) && !containedInWar(dependency.getFilePath()) -114 && !containedInWar(nextDependency.getFilePath())) { -115 if (firstPathIsShortest(dependency.getFilePath(), nextDependency.getFilePath())) { -116 mergeDependencies(dependency, nextDependency, dependenciesToRemove); -117 } else { -118 mergeDependencies(nextDependency, dependency, dependenciesToRemove); -119 break; //since we merged into the next dependency - skip forward to the next in mainIterator -120 } -121 } else if (isShadedJar(dependency, nextDependency)) { -122 if (dependency.getFileName().toLowerCase().endsWith("pom.xml")) { -123 mergeDependencies(nextDependency, dependency, dependenciesToRemove); -124 nextDependency.getRelatedDependencies().remove(dependency); -125 break; -126 } else { -127 mergeDependencies(dependency, nextDependency, dependenciesToRemove); -128 dependency.getRelatedDependencies().remove(nextDependency); -129 } -130 } else if (cpeIdentifiersMatch(dependency, nextDependency) -131 && hasSameBasePath(dependency, nextDependency) -132 && fileNameMatch(dependency, nextDependency)) { -133 if (isCore(dependency, nextDependency)) { -134 mergeDependencies(dependency, nextDependency, dependenciesToRemove); -135 } else { -136 mergeDependencies(nextDependency, dependency, dependenciesToRemove); -137 break; //since we merged into the next dependency - skip forward to the next in mainIterator -138 } -139 } -140 } -141 } -142 } -143 //removing dependencies here as ensuring correctness and avoiding ConcurrentUpdateExceptions -144 // was difficult because of the inner iterator. -145 engine.getDependencies().removeAll(dependenciesToRemove); -146 } -147 } -148 -149 /** -150 * Adds the relatedDependency to the dependency's related dependencies. -151 * -152 * @param dependency the main dependency -153 * @param relatedDependency a collection of dependencies to be removed from the main analysis loop, this is the source of -154 * dependencies to remove -155 * @param dependenciesToRemove a collection of dependencies that will be removed from the main analysis loop, this function -156 * adds to this collection -157 */ -158 private void mergeDependencies(final Dependency dependency, final Dependency relatedDependency, final Set<Dependency> dependenciesToRemove) { -159 dependency.addRelatedDependency(relatedDependency); -160 final Iterator<Dependency> i = relatedDependency.getRelatedDependencies().iterator(); -161 while (i.hasNext()) { -162 dependency.addRelatedDependency(i.next()); -163 i.remove(); -164 } -165 if (dependency.getSha1sum().equals(relatedDependency.getSha1sum())) { -166 dependency.addAllProjectReferences(relatedDependency.getProjectReferences()); -167 } -168 dependenciesToRemove.add(relatedDependency); -169 } -170 -171 /** -172 * Attempts to trim a maven repo to a common base path. This is typically [drive]\[repo_location]\repository\[path1]\[path2]. -173 * -174 * @param path the path to trim -175 * @return a string representing the base path. -176 */ -177 private String getBaseRepoPath(final String path) { -178 int pos = path.indexOf("repository" + File.separator) + 11; -179 if (pos < 0) { -180 return path; -181 } -182 int tmp = path.indexOf(File.separator, pos); -183 if (tmp <= 0) { -184 return path; -185 } -186 if (tmp > 0) { -187 pos = tmp + 1; -188 } -189 tmp = path.indexOf(File.separator, pos); -190 if (tmp > 0) { -191 pos = tmp + 1; -192 } -193 return path.substring(0, pos); -194 } -195 -196 /** -197 * Returns true if the file names (and version if it exists) of the two dependencies are sufficiently similar. -198 * -199 * @param dependency1 a dependency2 to compare -200 * @param dependency2 a dependency2 to compare -201 * @return true if the identifiers in the two supplied dependencies are equal -202 */ -203 private boolean fileNameMatch(Dependency dependency1, Dependency dependency2) { -204 if (dependency1 == null || dependency1.getFileName() == null -205 || dependency2 == null || dependency2.getFileName() == null) { -206 return false; -207 } -208 final String fileName1 = dependency1.getActualFile().getName(); -209 final String fileName2 = dependency2.getActualFile().getName(); -210 -211 //version check -212 final DependencyVersion version1 = DependencyVersionUtil.parseVersion(fileName1); -213 final DependencyVersion version2 = DependencyVersionUtil.parseVersion(fileName2); -214 if (version1 != null && version2 != null) { -215 if (!version1.equals(version2)) { -216 return false; -217 } -218 } -219 -220 //filename check -221 final Matcher match1 = STARTING_TEXT_PATTERN.matcher(fileName1); -222 final Matcher match2 = STARTING_TEXT_PATTERN.matcher(fileName2); -223 if (match1.find() && match2.find()) { -224 return match1.group().equals(match2.group()); -225 } -226 -227 return false; -228 } -229 -230 /** -231 * Returns true if the CPE identifiers in the two supplied dependencies are equal. -232 * -233 * @param dependency1 a dependency2 to compare -234 * @param dependency2 a dependency2 to compare -235 * @return true if the identifiers in the two supplied dependencies are equal -236 */ -237 private boolean cpeIdentifiersMatch(Dependency dependency1, Dependency dependency2) { -238 if (dependency1 == null || dependency1.getIdentifiers() == null -239 || dependency2 == null || dependency2.getIdentifiers() == null) { -240 return false; -241 } -242 boolean matches = false; -243 int cpeCount1 = 0; -244 int cpeCount2 = 0; -245 for (Identifier i : dependency1.getIdentifiers()) { -246 if ("cpe".equals(i.getType())) { -247 cpeCount1 += 1; -248 } -249 } -250 for (Identifier i : dependency2.getIdentifiers()) { -251 if ("cpe".equals(i.getType())) { -252 cpeCount2 += 1; -253 } -254 } -255 if (cpeCount1 > 0 && cpeCount1 == cpeCount2) { -256 for (Identifier i : dependency1.getIdentifiers()) { -257 if ("cpe".equals(i.getType())) { -258 matches |= dependency2.getIdentifiers().contains(i); -259 if (!matches) { -260 break; -261 } -262 } -263 } -264 } -265 LOGGER.debug("IdentifiersMatch={} ({}, {})", matches, dependency1.getFileName(), dependency2.getFileName()); -266 return matches; -267 } -268 -269 /** -270 * Determines if the two dependencies have the same base path. -271 * -272 * @param dependency1 a Dependency object -273 * @param dependency2 a Dependency object -274 * @return true if the base paths of the dependencies are identical -275 */ -276 private boolean hasSameBasePath(Dependency dependency1, Dependency dependency2) { -277 if (dependency1 == null || dependency2 == null) { -278 return false; -279 } -280 final File lFile = new File(dependency1.getFilePath()); -281 String left = lFile.getParent(); -282 final File rFile = new File(dependency2.getFilePath()); -283 String right = rFile.getParent(); -284 if (left == null) { -285 return right == null; -286 } -287 if (left.equalsIgnoreCase(right)) { -288 return true; -289 } -290 if (left.matches(".*[/\\\\]repository[/\\\\].*") && right.matches(".*[/\\\\]repository[/\\\\].*")) { -291 left = getBaseRepoPath(left); -292 right = getBaseRepoPath(right); -293 } -294 if (left.equalsIgnoreCase(right)) { -295 return true; -296 } -297 //new code -298 for (Dependency child : dependency2.getRelatedDependencies()) { -299 if (hasSameBasePath(dependency1, child)) { -300 return true; -301 } -302 } -303 return false; -304 } -305 -306 /** -307 * This is likely a very broken attempt at determining if the 'left' dependency is the 'core' library in comparison to the -308 * 'right' library. -309 * -310 * @param left the dependency to test -311 * @param right the dependency to test against -312 * @return a boolean indicating whether or not the left dependency should be considered the "core" version. -313 */ -314 boolean isCore(Dependency left, Dependency right) { -315 final String leftName = left.getFileName().toLowerCase(); -316 final String rightName = right.getFileName().toLowerCase(); -317 -318 final boolean returnVal; -319 if (!rightName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+") && leftName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+") -320 || rightName.contains("core") && !leftName.contains("core") -321 || rightName.contains("kernel") && !leftName.contains("kernel")) { -322 returnVal = false; -323 } else if (rightName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+") && !leftName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+") -324 || !rightName.contains("core") && leftName.contains("core") -325 || !rightName.contains("kernel") && leftName.contains("kernel")) { -326 returnVal = true; -327 // } else if (leftName.matches(".*struts2\\-core.*") && rightName.matches(".*xwork\\-core.*")) { -328 // returnVal = true; -329 // } else if (rightName.matches(".*struts2\\-core.*") && leftName.matches(".*xwork\\-core.*")) { -330 // returnVal = false; -331 } else { -332 /* -333 * considered splitting the names up and comparing the components, -334 * but decided that the file name length should be sufficient as the -335 * "core" component, if this follows a normal naming protocol should -336 * be shorter: -337 * axis2-saaj-1.4.1.jar -338 * axis2-1.4.1.jar <----- -339 * axis2-kernel-1.4.1.jar -340 */ -341 returnVal = leftName.length() <= rightName.length(); -342 } -343 LOGGER.debug("IsCore={} ({}, {})", returnVal, left.getFileName(), right.getFileName()); -344 return returnVal; -345 } -346 -347 /** -348 * Compares the SHA1 hashes of two dependencies to determine if they are equal. -349 * -350 * @param dependency1 a dependency object to compare -351 * @param dependency2 a dependency object to compare -352 * @return true if the sha1 hashes of the two dependencies match; otherwise false -353 */ -354 private boolean hashesMatch(Dependency dependency1, Dependency dependency2) { -355 if (dependency1 == null || dependency2 == null || dependency1.getSha1sum() == null || dependency2.getSha1sum() == null) { -356 return false; -357 } -358 return dependency1.getSha1sum().equals(dependency2.getSha1sum()); -359 } -360 -361 /** -362 * Determines if the jar is shaded and the created pom.xml identified the same CPE as the jar - if so, the pom.xml dependency -363 * should be removed. -364 * -365 * @param dependency a dependency to check -366 * @param nextDependency another dependency to check -367 * @return true if on of the dependencies is a pom.xml and the identifiers between the two collections match; otherwise false -368 */ -369 private boolean isShadedJar(Dependency dependency, Dependency nextDependency) { -370 final String mainName = dependency.getFileName().toLowerCase(); -371 final String nextName = nextDependency.getFileName().toLowerCase(); -372 if (mainName.endsWith(".jar") && nextName.endsWith("pom.xml")) { -373 return dependency.getIdentifiers().containsAll(nextDependency.getIdentifiers()); -374 } else if (nextName.endsWith(".jar") && mainName.endsWith("pom.xml")) { -375 return nextDependency.getIdentifiers().containsAll(dependency.getIdentifiers()); -376 } -377 return false; -378 } -379 -380 /** -381 * Determines which path is shortest; if path lengths are equal then we use compareTo of the string method to determine if the -382 * first path is smaller. -383 * -384 * @param left the first path to compare -385 * @param right the second path to compare -386 * @return <code>true</code> if the leftPath is the shortest; otherwise <code>false</code> -387 */ -388 protected boolean firstPathIsShortest(String left, String right) { -389 final String leftPath = left.replace('\\', '/'); -390 final String rightPath = right.replace('\\', '/'); -391 -392 final int leftCount = countChar(leftPath, '/'); -393 final int rightCount = countChar(rightPath, '/'); -394 if (leftCount == rightCount) { -395 return leftPath.compareTo(rightPath) <= 0; -396 } else { -397 return leftCount < rightCount; -398 } -399 } -400 -401 /** -402 * Counts the number of times the character is present in the string. -403 * -404 * @param string the string to count the characters in -405 * @param c the character to count -406 * @return the number of times the character is present in the string -407 */ -408 private int countChar(String string, char c) { -409 int count = 0; -410 final int max = string.length(); -411 for (int i = 0; i < max; i++) { -412 if (c == string.charAt(i)) { -413 count++; -414 } -415 } -416 return count; -417 } -418 -419 /** -420 * Checks if the given file path is contained within a war or ear file. -421 * -422 * @param filePath the file path to check -423 * @return true if the path contains '.war\' or '.ear\'. -424 */ -425 private boolean containedInWar(String filePath) { -426 return filePath == null ? false : filePath.matches(".*\\.(ear|war)[\\\\/].*"); -427 } -428 } +78 @Override +79 public String getName() { +80 return ANALYZER_NAME; +81 } +82 +83 /** +84 * Returns the phase that the analyzer is intended to run in. +85 * +86 * @return the phase that the analyzer is intended to run in. +87 */ +88 @Override +89 public AnalysisPhase getAnalysisPhase() { +90 return ANALYSIS_PHASE; +91 } +92 //</editor-fold> +93 +94 /** +95 * Analyzes a set of dependencies. If they have been found to have the same base path and the same set of identifiers they are +96 * likely related. The related dependencies are bundled into a single reportable item. +97 * +98 * @param ignore this analyzer ignores the dependency being analyzed +99 * @param engine the engine that is scanning the dependencies +100 * @throws AnalysisException is thrown if there is an error reading the JAR file. +101 */ +102 @Override +103 public void analyze(Dependency ignore, Engine engine) throws AnalysisException { +104 if (!analyzed) { +105 analyzed = true; +106 final Set<Dependency> dependenciesToRemove = new HashSet<Dependency>(); +107 final ListIterator<Dependency> mainIterator = engine.getDependencies().listIterator(); +108 //for (Dependency nextDependency : engine.getDependencies()) { +109 while (mainIterator.hasNext()) { +110 final Dependency dependency = mainIterator.next(); +111 if (mainIterator.hasNext() && !dependenciesToRemove.contains(dependency)) { +112 final ListIterator<Dependency> subIterator = engine.getDependencies().listIterator(mainIterator.nextIndex()); +113 while (subIterator.hasNext()) { +114 final Dependency nextDependency = subIterator.next(); +115 if (hashesMatch(dependency, nextDependency) && !containedInWar(dependency.getFilePath()) +116 && !containedInWar(nextDependency.getFilePath())) { +117 if (firstPathIsShortest(dependency.getFilePath(), nextDependency.getFilePath())) { +118 mergeDependencies(dependency, nextDependency, dependenciesToRemove); +119 } else { +120 mergeDependencies(nextDependency, dependency, dependenciesToRemove); +121 break; //since we merged into the next dependency - skip forward to the next in mainIterator +122 } +123 } else if (isShadedJar(dependency, nextDependency)) { +124 if (dependency.getFileName().toLowerCase().endsWith("pom.xml")) { +125 mergeDependencies(nextDependency, dependency, dependenciesToRemove); +126 nextDependency.getRelatedDependencies().remove(dependency); +127 break; +128 } else { +129 mergeDependencies(dependency, nextDependency, dependenciesToRemove); +130 dependency.getRelatedDependencies().remove(nextDependency); +131 } +132 } else if (cpeIdentifiersMatch(dependency, nextDependency) +133 && hasSameBasePath(dependency, nextDependency) +134 && fileNameMatch(dependency, nextDependency)) { +135 if (isCore(dependency, nextDependency)) { +136 mergeDependencies(dependency, nextDependency, dependenciesToRemove); +137 } else { +138 mergeDependencies(nextDependency, dependency, dependenciesToRemove); +139 break; //since we merged into the next dependency - skip forward to the next in mainIterator +140 } +141 } +142 } +143 } +144 } +145 //removing dependencies here as ensuring correctness and avoiding ConcurrentUpdateExceptions +146 // was difficult because of the inner iterator. +147 engine.getDependencies().removeAll(dependenciesToRemove); +148 } +149 } +150 +151 /** +152 * Adds the relatedDependency to the dependency's related dependencies. +153 * +154 * @param dependency the main dependency +155 * @param relatedDependency a collection of dependencies to be removed from the main analysis loop, this is the source of +156 * dependencies to remove +157 * @param dependenciesToRemove a collection of dependencies that will be removed from the main analysis loop, this function +158 * adds to this collection +159 */ +160 private void mergeDependencies(final Dependency dependency, final Dependency relatedDependency, final Set<Dependency> dependenciesToRemove) { +161 dependency.addRelatedDependency(relatedDependency); +162 final Iterator<Dependency> i = relatedDependency.getRelatedDependencies().iterator(); +163 while (i.hasNext()) { +164 dependency.addRelatedDependency(i.next()); +165 i.remove(); +166 } +167 if (dependency.getSha1sum().equals(relatedDependency.getSha1sum())) { +168 dependency.addAllProjectReferences(relatedDependency.getProjectReferences()); +169 } +170 dependenciesToRemove.add(relatedDependency); +171 } +172 +173 /** +174 * Attempts to trim a maven repo to a common base path. This is typically [drive]\[repo_location]\repository\[path1]\[path2]. +175 * +176 * @param path the path to trim +177 * @return a string representing the base path. +178 */ +179 private String getBaseRepoPath(final String path) { +180 int pos = path.indexOf("repository" + File.separator) + 11; +181 if (pos < 0) { +182 return path; +183 } +184 int tmp = path.indexOf(File.separator, pos); +185 if (tmp <= 0) { +186 return path; +187 } +188 if (tmp > 0) { +189 pos = tmp + 1; +190 } +191 tmp = path.indexOf(File.separator, pos); +192 if (tmp > 0) { +193 pos = tmp + 1; +194 } +195 return path.substring(0, pos); +196 } +197 +198 /** +199 * Returns true if the file names (and version if it exists) of the two dependencies are sufficiently similar. +200 * +201 * @param dependency1 a dependency2 to compare +202 * @param dependency2 a dependency2 to compare +203 * @return true if the identifiers in the two supplied dependencies are equal +204 */ +205 private boolean fileNameMatch(Dependency dependency1, Dependency dependency2) { +206 if (dependency1 == null || dependency1.getFileName() == null +207 || dependency2 == null || dependency2.getFileName() == null) { +208 return false; +209 } +210 final String fileName1 = dependency1.getActualFile().getName(); +211 final String fileName2 = dependency2.getActualFile().getName(); +212 +213 //version check +214 final DependencyVersion version1 = DependencyVersionUtil.parseVersion(fileName1); +215 final DependencyVersion version2 = DependencyVersionUtil.parseVersion(fileName2); +216 if (version1 != null && version2 != null) { +217 if (!version1.equals(version2)) { +218 return false; +219 } +220 } +221 +222 //filename check +223 final Matcher match1 = STARTING_TEXT_PATTERN.matcher(fileName1); +224 final Matcher match2 = STARTING_TEXT_PATTERN.matcher(fileName2); +225 if (match1.find() && match2.find()) { +226 return match1.group().equals(match2.group()); +227 } +228 +229 return false; +230 } +231 +232 /** +233 * Returns true if the CPE identifiers in the two supplied dependencies are equal. +234 * +235 * @param dependency1 a dependency2 to compare +236 * @param dependency2 a dependency2 to compare +237 * @return true if the identifiers in the two supplied dependencies are equal +238 */ +239 private boolean cpeIdentifiersMatch(Dependency dependency1, Dependency dependency2) { +240 if (dependency1 == null || dependency1.getIdentifiers() == null +241 || dependency2 == null || dependency2.getIdentifiers() == null) { +242 return false; +243 } +244 boolean matches = false; +245 int cpeCount1 = 0; +246 int cpeCount2 = 0; +247 for (Identifier i : dependency1.getIdentifiers()) { +248 if ("cpe".equals(i.getType())) { +249 cpeCount1 += 1; +250 } +251 } +252 for (Identifier i : dependency2.getIdentifiers()) { +253 if ("cpe".equals(i.getType())) { +254 cpeCount2 += 1; +255 } +256 } +257 if (cpeCount1 > 0 && cpeCount1 == cpeCount2) { +258 for (Identifier i : dependency1.getIdentifiers()) { +259 if ("cpe".equals(i.getType())) { +260 matches |= dependency2.getIdentifiers().contains(i); +261 if (!matches) { +262 break; +263 } +264 } +265 } +266 } +267 LOGGER.debug("IdentifiersMatch={} ({}, {})", matches, dependency1.getFileName(), dependency2.getFileName()); +268 return matches; +269 } +270 +271 /** +272 * Determines if the two dependencies have the same base path. +273 * +274 * @param dependency1 a Dependency object +275 * @param dependency2 a Dependency object +276 * @return true if the base paths of the dependencies are identical +277 */ +278 private boolean hasSameBasePath(Dependency dependency1, Dependency dependency2) { +279 if (dependency1 == null || dependency2 == null) { +280 return false; +281 } +282 final File lFile = new File(dependency1.getFilePath()); +283 String left = lFile.getParent(); +284 final File rFile = new File(dependency2.getFilePath()); +285 String right = rFile.getParent(); +286 if (left == null) { +287 return right == null; +288 } +289 if (left.equalsIgnoreCase(right)) { +290 return true; +291 } +292 if (left.matches(".*[/\\\\]repository[/\\\\].*") && right.matches(".*[/\\\\]repository[/\\\\].*")) { +293 left = getBaseRepoPath(left); +294 right = getBaseRepoPath(right); +295 } +296 if (left.equalsIgnoreCase(right)) { +297 return true; +298 } +299 //new code +300 for (Dependency child : dependency2.getRelatedDependencies()) { +301 if (hasSameBasePath(dependency1, child)) { +302 return true; +303 } +304 } +305 return false; +306 } +307 +308 /** +309 * This is likely a very broken attempt at determining if the 'left' dependency is the 'core' library in comparison to the +310 * 'right' library. +311 * +312 * @param left the dependency to test +313 * @param right the dependency to test against +314 * @return a boolean indicating whether or not the left dependency should be considered the "core" version. +315 */ +316 boolean isCore(Dependency left, Dependency right) { +317 final String leftName = left.getFileName().toLowerCase(); +318 final String rightName = right.getFileName().toLowerCase(); +319 +320 final boolean returnVal; +321 if (!rightName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+") && leftName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+") +322 || rightName.contains("core") && !leftName.contains("core") +323 || rightName.contains("kernel") && !leftName.contains("kernel")) { +324 returnVal = false; +325 } else if (rightName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+") && !leftName.matches(".*\\.(tar|tgz|gz|zip|ear|war).+") +326 || !rightName.contains("core") && leftName.contains("core") +327 || !rightName.contains("kernel") && leftName.contains("kernel")) { +328 returnVal = true; +329 // } else if (leftName.matches(".*struts2\\-core.*") && rightName.matches(".*xwork\\-core.*")) { +330 // returnVal = true; +331 // } else if (rightName.matches(".*struts2\\-core.*") && leftName.matches(".*xwork\\-core.*")) { +332 // returnVal = false; +333 } else { +334 /* +335 * considered splitting the names up and comparing the components, +336 * but decided that the file name length should be sufficient as the +337 * "core" component, if this follows a normal naming protocol should +338 * be shorter: +339 * axis2-saaj-1.4.1.jar +340 * axis2-1.4.1.jar <----- +341 * axis2-kernel-1.4.1.jar +342 */ +343 returnVal = leftName.length() <= rightName.length(); +344 } +345 LOGGER.debug("IsCore={} ({}, {})", returnVal, left.getFileName(), right.getFileName()); +346 return returnVal; +347 } +348 +349 /** +350 * Compares the SHA1 hashes of two dependencies to determine if they are equal. +351 * +352 * @param dependency1 a dependency object to compare +353 * @param dependency2 a dependency object to compare +354 * @return true if the sha1 hashes of the two dependencies match; otherwise false +355 */ +356 private boolean hashesMatch(Dependency dependency1, Dependency dependency2) { +357 if (dependency1 == null || dependency2 == null || dependency1.getSha1sum() == null || dependency2.getSha1sum() == null) { +358 return false; +359 } +360 return dependency1.getSha1sum().equals(dependency2.getSha1sum()); +361 } +362 +363 /** +364 * Determines if the jar is shaded and the created pom.xml identified the same CPE as the jar - if so, the pom.xml dependency +365 * should be removed. +366 * +367 * @param dependency a dependency to check +368 * @param nextDependency another dependency to check +369 * @return true if on of the dependencies is a pom.xml and the identifiers between the two collections match; otherwise false +370 */ +371 private boolean isShadedJar(Dependency dependency, Dependency nextDependency) { +372 final String mainName = dependency.getFileName().toLowerCase(); +373 final String nextName = nextDependency.getFileName().toLowerCase(); +374 if (mainName.endsWith(".jar") && nextName.endsWith("pom.xml")) { +375 return dependency.getIdentifiers().containsAll(nextDependency.getIdentifiers()); +376 } else if (nextName.endsWith(".jar") && mainName.endsWith("pom.xml")) { +377 return nextDependency.getIdentifiers().containsAll(dependency.getIdentifiers()); +378 } +379 return false; +380 } +381 +382 /** +383 * Determines which path is shortest; if path lengths are equal then we use compareTo of the string method to determine if the +384 * first path is smaller. +385 * +386 * @param left the first path to compare +387 * @param right the second path to compare +388 * @return <code>true</code> if the leftPath is the shortest; otherwise <code>false</code> +389 */ +390 protected boolean firstPathIsShortest(String left, String right) { +391 final String leftPath = left.replace('\\', '/'); +392 final String rightPath = right.replace('\\', '/'); +393 +394 final int leftCount = countChar(leftPath, '/'); +395 final int rightCount = countChar(rightPath, '/'); +396 if (leftCount == rightCount) { +397 return leftPath.compareTo(rightPath) <= 0; +398 } else { +399 return leftCount < rightCount; +400 } +401 } +402 +403 /** +404 * Counts the number of times the character is present in the string. +405 * +406 * @param string the string to count the characters in +407 * @param c the character to count +408 * @return the number of times the character is present in the string +409 */ +410 private int countChar(String string, char c) { +411 int count = 0; +412 final int max = string.length(); +413 for (int i = 0; i < max; i++) { +414 if (c == string.charAt(i)) { +415 count++; +416 } +417 } +418 return count; +419 } +420 +421 /** +422 * Checks if the given file path is contained within a war or ear file. +423 * +424 * @param filePath the file path to check +425 * @return true if the path contains '.war\' or '.ear\'. +426 */ +427 private boolean containedInWar(String filePath) { +428 return filePath == null ? false : filePath.matches(".*\\.(ear|war)[\\\\/].*"); +429 } +430 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/FalsePositiveAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/FalsePositiveAnalyzer.html index 37e338928..e4b842ee7 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/FalsePositiveAnalyzer.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/FalsePositiveAnalyzer.html @@ -77,419 +77,418 @@ 69 * 70 * @return the name of the analyzer. 71 */ -72 public String getName() { -73 return ANALYZER_NAME; -74 } -75 -76 /** -77 * Returns the phase that the analyzer is intended to run in. -78 * -79 * @return the phase that the analyzer is intended to run in. -80 */ -81 public AnalysisPhase getAnalysisPhase() { -82 return ANALYSIS_PHASE; -83 } -84 //</editor-fold> -85 -86 /** -87 * Analyzes the dependencies and removes bad/incorrect CPE associations based on various heuristics. -88 * -89 * @param dependency the dependency to analyze. -90 * @param engine the engine that is scanning the dependencies -91 * @throws AnalysisException is thrown if there is an error reading the JAR file. -92 */ -93 @Override -94 public void analyze(Dependency dependency, Engine engine) throws AnalysisException { -95 removeJreEntries(dependency); -96 removeBadMatches(dependency); -97 removeBadSpringMatches(dependency); -98 removeWrongVersionMatches(dependency); -99 removeSpuriousCPE(dependency); -100 removeDuplicativeEntriesFromJar(dependency, engine); -101 addFalseNegativeCPEs(dependency); -102 } -103 -104 /** -105 * Removes inaccurate matches on springframework CPEs. -106 * -107 * @param dependency the dependency to test for and remove known inaccurate CPE matches -108 */ -109 private void removeBadSpringMatches(Dependency dependency) { -110 String mustContain = null; -111 for (Identifier i : dependency.getIdentifiers()) { -112 if ("maven".contains(i.getType())) { -113 if (i.getValue() != null && i.getValue().startsWith("org.springframework.")) { -114 final int endPoint = i.getValue().indexOf(":", 19); -115 if (endPoint >= 0) { -116 mustContain = i.getValue().substring(19, endPoint).toLowerCase(); -117 break; -118 } -119 } -120 } -121 } -122 if (mustContain != null) { -123 final Iterator<Identifier> itr = dependency.getIdentifiers().iterator(); -124 while (itr.hasNext()) { -125 final Identifier i = itr.next(); -126 if ("cpe".contains(i.getType()) -127 && i.getValue() != null -128 && i.getValue().startsWith("cpe:/a:springsource:") -129 && !i.getValue().toLowerCase().contains(mustContain)) { -130 itr.remove(); -131 //dependency.getIdentifiers().remove(i); -132 } -133 } -134 } -135 } -136 -137 /** -138 * <p> -139 * Intended to remove spurious CPE entries. By spurious we mean duplicate, less specific CPE entries.</p> +72 @Override +73 public String getName() { +74 return ANALYZER_NAME; +75 } +76 +77 /** +78 * Returns the phase that the analyzer is intended to run in. +79 * +80 * @return the phase that the analyzer is intended to run in. +81 */ +82 @Override +83 public AnalysisPhase getAnalysisPhase() { +84 return ANALYSIS_PHASE; +85 } +86 //</editor-fold> +87 +88 /** +89 * Analyzes the dependencies and removes bad/incorrect CPE associations based on various heuristics. +90 * +91 * @param dependency the dependency to analyze. +92 * @param engine the engine that is scanning the dependencies +93 * @throws AnalysisException is thrown if there is an error reading the JAR file. +94 */ +95 @Override +96 public void analyze(Dependency dependency, Engine engine) throws AnalysisException { +97 removeJreEntries(dependency); +98 removeBadMatches(dependency); +99 removeBadSpringMatches(dependency); +100 removeWrongVersionMatches(dependency); +101 removeSpuriousCPE(dependency); +102 removeDuplicativeEntriesFromJar(dependency, engine); +103 addFalseNegativeCPEs(dependency); +104 } +105 +106 /** +107 * Removes inaccurate matches on springframework CPEs. +108 * +109 * @param dependency the dependency to test for and remove known inaccurate CPE matches +110 */ +111 private void removeBadSpringMatches(Dependency dependency) { +112 String mustContain = null; +113 for (Identifier i : dependency.getIdentifiers()) { +114 if ("maven".contains(i.getType())) { +115 if (i.getValue() != null && i.getValue().startsWith("org.springframework.")) { +116 final int endPoint = i.getValue().indexOf(":", 19); +117 if (endPoint >= 0) { +118 mustContain = i.getValue().substring(19, endPoint).toLowerCase(); +119 break; +120 } +121 } +122 } +123 } +124 if (mustContain != null) { +125 final Iterator<Identifier> itr = dependency.getIdentifiers().iterator(); +126 while (itr.hasNext()) { +127 final Identifier i = itr.next(); +128 if ("cpe".contains(i.getType()) +129 && i.getValue() != null +130 && i.getValue().startsWith("cpe:/a:springsource:") +131 && !i.getValue().toLowerCase().contains(mustContain)) { +132 itr.remove(); +133 //dependency.getIdentifiers().remove(i); +134 } +135 } +136 } +137 } +138 +139 /** 140 * <p> -141 * Example:</p> -142 * <code> -143 * cpe:/a:some-vendor:some-product -144 * cpe:/a:some-vendor:some-product:1.5 -145 * cpe:/a:some-vendor:some-product:1.5.2 -146 * </code> -147 * <p> -148 * Should be trimmed to:</p> -149 * <code> -150 * cpe:/a:some-vendor:some-product:1.5.2 -151 * </code> -152 * -153 * @param dependency the dependency being analyzed -154 */ -155 @SuppressWarnings("null") -156 private void removeSpuriousCPE(Dependency dependency) { -157 final List<Identifier> ids = new ArrayList<Identifier>(); -158 ids.addAll(dependency.getIdentifiers()); -159 Collections.sort(ids); -160 final ListIterator<Identifier> mainItr = ids.listIterator(); -161 while (mainItr.hasNext()) { -162 final Identifier currentId = mainItr.next(); -163 final VulnerableSoftware currentCpe = parseCpe(currentId.getType(), currentId.getValue()); -164 if (currentCpe == null) { -165 continue; -166 } -167 final ListIterator<Identifier> subItr = ids.listIterator(mainItr.nextIndex()); -168 while (subItr.hasNext()) { -169 final Identifier nextId = subItr.next(); -170 final VulnerableSoftware nextCpe = parseCpe(nextId.getType(), nextId.getValue()); -171 if (nextCpe == null) { -172 continue; -173 } -174 //TODO fix the version problem below -175 if (currentCpe.getVendor().equals(nextCpe.getVendor())) { -176 if (currentCpe.getProduct().equals(nextCpe.getProduct())) { -177 // see if one is contained in the other.. remove the contained one from dependency.getIdentifier -178 final String currentVersion = currentCpe.getVersion(); -179 final String nextVersion = nextCpe.getVersion(); -180 if (currentVersion == null && nextVersion == null) { -181 //how did we get here? -182 LOGGER.debug("currentVersion and nextVersion are both null?"); -183 } else if (currentVersion == null && nextVersion != null) { -184 dependency.getIdentifiers().remove(currentId); -185 } else if (nextVersion == null && currentVersion != null) { -186 dependency.getIdentifiers().remove(nextId); -187 } else if (currentVersion.length() < nextVersion.length()) { -188 if (nextVersion.startsWith(currentVersion) || "-".equals(currentVersion)) { -189 dependency.getIdentifiers().remove(currentId); -190 } -191 } else { -192 if (currentVersion.startsWith(nextVersion) || "-".equals(nextVersion)) { -193 dependency.getIdentifiers().remove(nextId); -194 } -195 } -196 } -197 } -198 } -199 } -200 } -201 /** -202 * Regex to identify core java libraries and a few other commonly misidentified ones. -203 */ -204 public static final Pattern CORE_JAVA = Pattern.compile("^cpe:/a:(sun|oracle|ibm):(j2[ems]e|" -205 + "java(_platform_micro_edition|_runtime_environment|_se|virtual_machine|se_development_kit|fx)?|" -206 + "jdk|jre|jsse)($|:.*)"); -207 -208 /** -209 * Regex to identify core jsf libraries. -210 */ -211 public static final Pattern CORE_JAVA_JSF = Pattern.compile("^cpe:/a:(sun|oracle|ibm):jsf($|:.*)"); -212 /** -213 * Regex to identify core java library files. This is currently incomplete. -214 */ -215 public static final Pattern CORE_FILES = Pattern.compile("(^|/)((alt[-])?rt|jsse|jfxrt|jfr|jce|javaws|deploy|charsets)\\.jar$"); -216 /** -217 * Regex to identify core jsf java library files. This is currently incomplete. -218 */ -219 public static final Pattern CORE_JSF_FILES = Pattern.compile("(^|/)jsf[-][^/]*\\.jar$"); -220 -221 /** -222 * Removes any CPE entries for the JDK/JRE unless the filename ends with rt.jar -223 * -224 * @param dependency the dependency to remove JRE CPEs from -225 */ -226 private void removeJreEntries(Dependency dependency) { -227 final Set<Identifier> identifiers = dependency.getIdentifiers(); -228 final Iterator<Identifier> itr = identifiers.iterator(); -229 while (itr.hasNext()) { -230 final Identifier i = itr.next(); -231 final Matcher coreCPE = CORE_JAVA.matcher(i.getValue()); -232 final Matcher coreFiles = CORE_FILES.matcher(dependency.getFileName()); -233 if (coreCPE.matches() && !coreFiles.matches()) { -234 itr.remove(); -235 } -236 final Matcher coreJsfCPE = CORE_JAVA_JSF.matcher(i.getValue()); -237 final Matcher coreJsfFiles = CORE_JSF_FILES.matcher(dependency.getFileName()); -238 if (coreJsfCPE.matches() && !coreJsfFiles.matches()) { -239 itr.remove(); -240 } -241 } -242 } -243 -244 /** -245 * Parses a CPE string into an IndexEntry. -246 * -247 * @param type the type of identifier -248 * @param value the cpe identifier to parse -249 * @return an VulnerableSoftware object constructed from the identifier -250 */ -251 private VulnerableSoftware parseCpe(String type, String value) { -252 if (!"cpe".equals(type)) { -253 return null; -254 } -255 final VulnerableSoftware cpe = new VulnerableSoftware(); -256 try { -257 cpe.parseName(value); -258 } catch (UnsupportedEncodingException ex) { -259 LOGGER.trace("", ex); -260 return null; -261 } -262 return cpe; -263 } -264 -265 /** -266 * Removes bad CPE matches for a dependency. Unfortunately, right now these are hard-coded patches for specific problems -267 * identified when testing this on a LARGE volume of jar files. -268 * -269 * @param dependency the dependency to analyze -270 */ -271 private void removeBadMatches(Dependency dependency) { -272 final Set<Identifier> identifiers = dependency.getIdentifiers(); -273 final Iterator<Identifier> itr = identifiers.iterator(); -274 -275 /* TODO - can we utilize the pom's groupid and artifactId to filter??? most of -276 * these are due to low quality data. Other idea would be to say any CPE -277 * found based on LOW confidence evidence should have a different CPE type? (this -278 * might be a better solution then just removing the URL for "best-guess" matches). -279 */ -280 //Set<Evidence> groupId = dependency.getVendorEvidence().getEvidence("pom", "groupid"); -281 //Set<Evidence> artifactId = dependency.getVendorEvidence().getEvidence("pom", "artifactid"); -282 while (itr.hasNext()) { -283 final Identifier i = itr.next(); -284 //TODO move this startsWith expression to the base suppression file -285 if ("cpe".equals(i.getType())) { -286 if ((i.getValue().matches(".*c\\+\\+.*") -287 || i.getValue().startsWith("cpe:/a:file:file") -288 || i.getValue().startsWith("cpe:/a:mozilla:mozilla") -289 || i.getValue().startsWith("cpe:/a:cvs:cvs") -290 || i.getValue().startsWith("cpe:/a:ftp:ftp") -291 || i.getValue().startsWith("cpe:/a:tcp:tcp") -292 || i.getValue().startsWith("cpe:/a:ssh:ssh") -293 || i.getValue().startsWith("cpe:/a:lookup:lookup")) -294 && (dependency.getFileName().toLowerCase().endsWith(".jar") -295 || dependency.getFileName().toLowerCase().endsWith("pom.xml") -296 || dependency.getFileName().toLowerCase().endsWith(".dll") -297 || dependency.getFileName().toLowerCase().endsWith(".exe") -298 || dependency.getFileName().toLowerCase().endsWith(".nuspec") -299 || dependency.getFileName().toLowerCase().endsWith(".zip") -300 || dependency.getFileName().toLowerCase().endsWith(".sar") -301 || dependency.getFileName().toLowerCase().endsWith(".apk") -302 || dependency.getFileName().toLowerCase().endsWith(".tar") -303 || dependency.getFileName().toLowerCase().endsWith(".gz") -304 || dependency.getFileName().toLowerCase().endsWith(".tgz") -305 || dependency.getFileName().toLowerCase().endsWith(".ear") -306 || dependency.getFileName().toLowerCase().endsWith(".war"))) { -307 itr.remove(); -308 } else if ((i.getValue().startsWith("cpe:/a:jquery:jquery") -309 || i.getValue().startsWith("cpe:/a:prototypejs:prototype") -310 || i.getValue().startsWith("cpe:/a:yahoo:yui")) -311 && (dependency.getFileName().toLowerCase().endsWith(".jar") -312 || dependency.getFileName().toLowerCase().endsWith("pom.xml") -313 || dependency.getFileName().toLowerCase().endsWith(".dll") -314 || dependency.getFileName().toLowerCase().endsWith(".exe"))) { -315 itr.remove(); -316 } else if ((i.getValue().startsWith("cpe:/a:microsoft:excel") -317 || i.getValue().startsWith("cpe:/a:microsoft:word") -318 || i.getValue().startsWith("cpe:/a:microsoft:visio") -319 || i.getValue().startsWith("cpe:/a:microsoft:powerpoint") -320 || i.getValue().startsWith("cpe:/a:microsoft:office") -321 || i.getValue().startsWith("cpe:/a:core_ftp:core_ftp")) -322 && (dependency.getFileName().toLowerCase().endsWith(".jar") -323 || dependency.getFileName().toLowerCase().endsWith(".ear") -324 || dependency.getFileName().toLowerCase().endsWith(".war") -325 || dependency.getFileName().toLowerCase().endsWith("pom.xml"))) { -326 itr.remove(); -327 } else if (i.getValue().startsWith("cpe:/a:apache:maven") -328 && !dependency.getFileName().toLowerCase().matches("maven-core-[\\d\\.]+\\.jar")) { -329 itr.remove(); -330 } else if (i.getValue().startsWith("cpe:/a:m-core:m-core") -331 && !dependency.getEvidenceUsed().containsUsedString("m-core")) { -332 itr.remove(); -333 } else if (i.getValue().startsWith("cpe:/a:jboss:jboss") -334 && !dependency.getFileName().toLowerCase().matches("jboss-?[\\d\\.-]+(GA)?\\.jar")) { -335 itr.remove(); -336 } -337 } -338 } -339 } -340 -341 /** -342 * Removes CPE matches for the wrong version of a dependency. Currently, this only covers Axis 1 & 2. -343 * -344 * @param dependency the dependency to analyze -345 */ -346 private void removeWrongVersionMatches(Dependency dependency) { -347 final Set<Identifier> identifiers = dependency.getIdentifiers(); -348 final Iterator<Identifier> itr = identifiers.iterator(); -349 -350 final String fileName = dependency.getFileName(); -351 if (fileName != null && fileName.contains("axis2")) { -352 while (itr.hasNext()) { -353 final Identifier i = itr.next(); -354 if ("cpe".equals(i.getType())) { -355 final String cpe = i.getValue(); -356 if (cpe != null && (cpe.startsWith("cpe:/a:apache:axis:") || "cpe:/a:apache:axis".equals(cpe))) { -357 itr.remove(); -358 } -359 } -360 } -361 } else if (fileName != null && fileName.contains("axis")) { -362 while (itr.hasNext()) { -363 final Identifier i = itr.next(); -364 if ("cpe".equals(i.getType())) { -365 final String cpe = i.getValue(); -366 if (cpe != null && (cpe.startsWith("cpe:/a:apache:axis2:") || "cpe:/a:apache:axis2".equals(cpe))) { -367 itr.remove(); -368 } -369 } -370 } -371 } -372 } -373 -374 /** -375 * There are some known CPE entries, specifically regarding sun and oracle products due to the acquisition and changes in -376 * product names, that based on given evidence we can add the related CPE entries to ensure a complete list of CVE entries. -377 * -378 * @param dependency the dependency being analyzed -379 */ -380 private void addFalseNegativeCPEs(Dependency dependency) { -381 //TODO move this to the hint analyzer -382 final Iterator<Identifier> itr = dependency.getIdentifiers().iterator(); -383 while (itr.hasNext()) { -384 final Identifier i = itr.next(); -385 if ("cpe".equals(i.getType()) && i.getValue() != null -386 && (i.getValue().startsWith("cpe:/a:oracle:opensso:") -387 || i.getValue().startsWith("cpe:/a:oracle:opensso_enterprise:") -388 || i.getValue().startsWith("cpe:/a:sun:opensso_enterprise:") -389 || i.getValue().startsWith("cpe:/a:sun:opensso:"))) { -390 final String newCpe = String.format("cpe:/a:sun:opensso_enterprise:%s", i.getValue().substring(22)); -391 final String newCpe2 = String.format("cpe:/a:oracle:opensso_enterprise:%s", i.getValue().substring(22)); -392 final String newCpe3 = String.format("cpe:/a:sun:opensso:%s", i.getValue().substring(22)); -393 final String newCpe4 = String.format("cpe:/a:oracle:opensso:%s", i.getValue().substring(22)); -394 try { -395 dependency.addIdentifier("cpe", -396 newCpe, -397 String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe, "UTF-8"))); -398 dependency.addIdentifier("cpe", -399 newCpe2, -400 String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe2, "UTF-8"))); -401 dependency.addIdentifier("cpe", -402 newCpe3, -403 String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe3, "UTF-8"))); -404 dependency.addIdentifier("cpe", -405 newCpe4, -406 String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe4, "UTF-8"))); -407 } catch (UnsupportedEncodingException ex) { -408 LOGGER.debug("", ex); -409 } -410 } -411 } -412 } -413 -414 /** -415 * Removes duplicate entries identified that are contained within JAR files. These occasionally crop up due to POM entries or -416 * other types of files (such as DLLs and EXEs) being contained within the JAR. -417 * -418 * @param dependency the dependency that might be a duplicate -419 * @param engine the engine used to scan all dependencies -420 */ -421 private void removeDuplicativeEntriesFromJar(Dependency dependency, Engine engine) { -422 if (dependency.getFileName().toLowerCase().endsWith("pom.xml") -423 || DLL_EXE_FILTER.accept(dependency.getActualFile())) { -424 String parentPath = dependency.getFilePath().toLowerCase(); -425 if (parentPath.contains(".jar")) { -426 parentPath = parentPath.substring(0, parentPath.indexOf(".jar") + 4); -427 final Dependency parent = findDependency(parentPath, engine.getDependencies()); -428 if (parent != null) { -429 boolean remove = false; -430 for (Identifier i : dependency.getIdentifiers()) { -431 if ("cpe".equals(i.getType())) { -432 final String trimmedCPE = trimCpeToVendor(i.getValue()); -433 for (Identifier parentId : parent.getIdentifiers()) { -434 if ("cpe".equals(parentId.getType()) && parentId.getValue().startsWith(trimmedCPE)) { -435 remove |= true; -436 } -437 } -438 } -439 if (!remove) { //we can escape early -440 return; -441 } -442 } -443 if (remove) { -444 engine.getDependencies().remove(dependency); -445 } -446 } -447 } -448 -449 } -450 } -451 -452 /** -453 * Retrieves a given dependency, based on a given path, from a list of dependencies. -454 * -455 * @param dependencyPath the path of the dependency to return -456 * @param dependencies the collection of dependencies to search -457 * @return the dependency object for the given path, otherwise null -458 */ -459 private Dependency findDependency(String dependencyPath, List<Dependency> dependencies) { -460 for (Dependency d : dependencies) { -461 if (d.getFilePath().equalsIgnoreCase(dependencyPath)) { -462 return d; -463 } -464 } -465 return null; -466 } -467 -468 /** -469 * Takes a full CPE and returns the CPE trimmed to include only vendor and product. -470 * -471 * @param value the CPE value to trim -472 * @return a CPE value that only includes the vendor and product -473 */ -474 private String trimCpeToVendor(String value) { -475 //cpe:/a:jruby:jruby:1.0.8 -476 final int pos1 = value.indexOf(":", 7); //right of vendor -477 final int pos2 = value.indexOf(":", pos1 + 1); //right of product -478 if (pos2 < 0) { -479 return value; -480 } else { -481 return value.substring(0, pos2); -482 } -483 } -484 } +141 * Intended to remove spurious CPE entries. By spurious we mean duplicate, less specific CPE entries.</p> +142 * <p> +143 * Example:</p> +144 * <code> +145 * cpe:/a:some-vendor:some-product +146 * cpe:/a:some-vendor:some-product:1.5 +147 * cpe:/a:some-vendor:some-product:1.5.2 +148 * </code> +149 * <p> +150 * Should be trimmed to:</p> +151 * <code> +152 * cpe:/a:some-vendor:some-product:1.5.2 +153 * </code> +154 * +155 * @param dependency the dependency being analyzed +156 */ +157 @SuppressWarnings("null") +158 private void removeSpuriousCPE(Dependency dependency) { +159 final List<Identifier> ids = new ArrayList<Identifier>(dependency.getIdentifiers()); +160 Collections.sort(ids); +161 final ListIterator<Identifier> mainItr = ids.listIterator(); +162 while (mainItr.hasNext()) { +163 final Identifier currentId = mainItr.next(); +164 final VulnerableSoftware currentCpe = parseCpe(currentId.getType(), currentId.getValue()); +165 if (currentCpe == null) { +166 continue; +167 } +168 final ListIterator<Identifier> subItr = ids.listIterator(mainItr.nextIndex()); +169 while (subItr.hasNext()) { +170 final Identifier nextId = subItr.next(); +171 final VulnerableSoftware nextCpe = parseCpe(nextId.getType(), nextId.getValue()); +172 if (nextCpe == null) { +173 continue; +174 } +175 //TODO fix the version problem below +176 if (currentCpe.getVendor().equals(nextCpe.getVendor())) { +177 if (currentCpe.getProduct().equals(nextCpe.getProduct())) { +178 // see if one is contained in the other.. remove the contained one from dependency.getIdentifier +179 final String currentVersion = currentCpe.getVersion(); +180 final String nextVersion = nextCpe.getVersion(); +181 if (currentVersion == null && nextVersion == null) { +182 //how did we get here? +183 LOGGER.debug("currentVersion and nextVersion are both null?"); +184 } else if (currentVersion == null && nextVersion != null) { +185 dependency.getIdentifiers().remove(currentId); +186 } else if (nextVersion == null && currentVersion != null) { +187 dependency.getIdentifiers().remove(nextId); +188 } else if (currentVersion.length() < nextVersion.length()) { +189 if (nextVersion.startsWith(currentVersion) || "-".equals(currentVersion)) { +190 dependency.getIdentifiers().remove(currentId); +191 } +192 } else { +193 if (currentVersion.startsWith(nextVersion) || "-".equals(nextVersion)) { +194 dependency.getIdentifiers().remove(nextId); +195 } +196 } +197 } +198 } +199 } +200 } +201 } +202 /** +203 * Regex to identify core java libraries and a few other commonly misidentified ones. +204 */ +205 public static final Pattern CORE_JAVA = Pattern.compile("^cpe:/a:(sun|oracle|ibm):(j2[ems]e|" +206 + "java(_platform_micro_edition|_runtime_environment|_se|virtual_machine|se_development_kit|fx)?|" +207 + "jdk|jre|jsse)($|:.*)"); +208 +209 /** +210 * Regex to identify core jsf libraries. +211 */ +212 public static final Pattern CORE_JAVA_JSF = Pattern.compile("^cpe:/a:(sun|oracle|ibm):jsf($|:.*)"); +213 /** +214 * Regex to identify core java library files. This is currently incomplete. +215 */ +216 public static final Pattern CORE_FILES = Pattern.compile("(^|/)((alt[-])?rt|jsse|jfxrt|jfr|jce|javaws|deploy|charsets)\\.jar$"); +217 /** +218 * Regex to identify core jsf java library files. This is currently incomplete. +219 */ +220 public static final Pattern CORE_JSF_FILES = Pattern.compile("(^|/)jsf[-][^/]*\\.jar$"); +221 +222 /** +223 * Removes any CPE entries for the JDK/JRE unless the filename ends with rt.jar +224 * +225 * @param dependency the dependency to remove JRE CPEs from +226 */ +227 private void removeJreEntries(Dependency dependency) { +228 final Set<Identifier> identifiers = dependency.getIdentifiers(); +229 final Iterator<Identifier> itr = identifiers.iterator(); +230 while (itr.hasNext()) { +231 final Identifier i = itr.next(); +232 final Matcher coreCPE = CORE_JAVA.matcher(i.getValue()); +233 final Matcher coreFiles = CORE_FILES.matcher(dependency.getFileName()); +234 if (coreCPE.matches() && !coreFiles.matches()) { +235 itr.remove(); +236 } +237 final Matcher coreJsfCPE = CORE_JAVA_JSF.matcher(i.getValue()); +238 final Matcher coreJsfFiles = CORE_JSF_FILES.matcher(dependency.getFileName()); +239 if (coreJsfCPE.matches() && !coreJsfFiles.matches()) { +240 itr.remove(); +241 } +242 } +243 } +244 +245 /** +246 * Parses a CPE string into an IndexEntry. +247 * +248 * @param type the type of identifier +249 * @param value the cpe identifier to parse +250 * @return an VulnerableSoftware object constructed from the identifier +251 */ +252 private VulnerableSoftware parseCpe(String type, String value) { +253 if (!"cpe".equals(type)) { +254 return null; +255 } +256 final VulnerableSoftware cpe = new VulnerableSoftware(); +257 try { +258 cpe.parseName(value); +259 } catch (UnsupportedEncodingException ex) { +260 LOGGER.trace("", ex); +261 return null; +262 } +263 return cpe; +264 } +265 +266 /** +267 * Removes bad CPE matches for a dependency. Unfortunately, right now these are hard-coded patches for specific problems +268 * identified when testing this on a LARGE volume of jar files. +269 * +270 * @param dependency the dependency to analyze +271 */ +272 private void removeBadMatches(Dependency dependency) { +273 final Set<Identifier> identifiers = dependency.getIdentifiers(); +274 final Iterator<Identifier> itr = identifiers.iterator(); +275 +276 /* TODO - can we utilize the pom's groupid and artifactId to filter??? most of +277 * these are due to low quality data. Other idea would be to say any CPE +278 * found based on LOW confidence evidence should have a different CPE type? (this +279 * might be a better solution then just removing the URL for "best-guess" matches). +280 */ +281 //Set<Evidence> groupId = dependency.getVendorEvidence().getEvidence("pom", "groupid"); +282 //Set<Evidence> artifactId = dependency.getVendorEvidence().getEvidence("pom", "artifactid"); +283 while (itr.hasNext()) { +284 final Identifier i = itr.next(); +285 //TODO move this startsWith expression to the base suppression file +286 if ("cpe".equals(i.getType())) { +287 if ((i.getValue().matches(".*c\\+\\+.*") +288 || i.getValue().startsWith("cpe:/a:file:file") +289 || i.getValue().startsWith("cpe:/a:mozilla:mozilla") +290 || i.getValue().startsWith("cpe:/a:cvs:cvs") +291 || i.getValue().startsWith("cpe:/a:ftp:ftp") +292 || i.getValue().startsWith("cpe:/a:tcp:tcp") +293 || i.getValue().startsWith("cpe:/a:ssh:ssh") +294 || i.getValue().startsWith("cpe:/a:lookup:lookup")) +295 && (dependency.getFileName().toLowerCase().endsWith(".jar") +296 || dependency.getFileName().toLowerCase().endsWith("pom.xml") +297 || dependency.getFileName().toLowerCase().endsWith(".dll") +298 || dependency.getFileName().toLowerCase().endsWith(".exe") +299 || dependency.getFileName().toLowerCase().endsWith(".nuspec") +300 || dependency.getFileName().toLowerCase().endsWith(".zip") +301 || dependency.getFileName().toLowerCase().endsWith(".sar") +302 || dependency.getFileName().toLowerCase().endsWith(".apk") +303 || dependency.getFileName().toLowerCase().endsWith(".tar") +304 || dependency.getFileName().toLowerCase().endsWith(".gz") +305 || dependency.getFileName().toLowerCase().endsWith(".tgz") +306 || dependency.getFileName().toLowerCase().endsWith(".ear") +307 || dependency.getFileName().toLowerCase().endsWith(".war"))) { +308 itr.remove(); +309 } else if ((i.getValue().startsWith("cpe:/a:jquery:jquery") +310 || i.getValue().startsWith("cpe:/a:prototypejs:prototype") +311 || i.getValue().startsWith("cpe:/a:yahoo:yui")) +312 && (dependency.getFileName().toLowerCase().endsWith(".jar") +313 || dependency.getFileName().toLowerCase().endsWith("pom.xml") +314 || dependency.getFileName().toLowerCase().endsWith(".dll") +315 || dependency.getFileName().toLowerCase().endsWith(".exe"))) { +316 itr.remove(); +317 } else if ((i.getValue().startsWith("cpe:/a:microsoft:excel") +318 || i.getValue().startsWith("cpe:/a:microsoft:word") +319 || i.getValue().startsWith("cpe:/a:microsoft:visio") +320 || i.getValue().startsWith("cpe:/a:microsoft:powerpoint") +321 || i.getValue().startsWith("cpe:/a:microsoft:office") +322 || i.getValue().startsWith("cpe:/a:core_ftp:core_ftp")) +323 && (dependency.getFileName().toLowerCase().endsWith(".jar") +324 || dependency.getFileName().toLowerCase().endsWith(".ear") +325 || dependency.getFileName().toLowerCase().endsWith(".war") +326 || dependency.getFileName().toLowerCase().endsWith("pom.xml"))) { +327 itr.remove(); +328 } else if (i.getValue().startsWith("cpe:/a:apache:maven") +329 && !dependency.getFileName().toLowerCase().matches("maven-core-[\\d\\.]+\\.jar")) { +330 itr.remove(); +331 } else if (i.getValue().startsWith("cpe:/a:m-core:m-core") +332 && !dependency.getEvidenceUsed().containsUsedString("m-core")) { +333 itr.remove(); +334 } else if (i.getValue().startsWith("cpe:/a:jboss:jboss") +335 && !dependency.getFileName().toLowerCase().matches("jboss-?[\\d\\.-]+(GA)?\\.jar")) { +336 itr.remove(); +337 } +338 } +339 } +340 } +341 +342 /** +343 * Removes CPE matches for the wrong version of a dependency. Currently, this only covers Axis 1 & 2. +344 * +345 * @param dependency the dependency to analyze +346 */ +347 private void removeWrongVersionMatches(Dependency dependency) { +348 final Set<Identifier> identifiers = dependency.getIdentifiers(); +349 final Iterator<Identifier> itr = identifiers.iterator(); +350 +351 final String fileName = dependency.getFileName(); +352 if (fileName != null && fileName.contains("axis2")) { +353 while (itr.hasNext()) { +354 final Identifier i = itr.next(); +355 if ("cpe".equals(i.getType())) { +356 final String cpe = i.getValue(); +357 if (cpe != null && (cpe.startsWith("cpe:/a:apache:axis:") || "cpe:/a:apache:axis".equals(cpe))) { +358 itr.remove(); +359 } +360 } +361 } +362 } else if (fileName != null && fileName.contains("axis")) { +363 while (itr.hasNext()) { +364 final Identifier i = itr.next(); +365 if ("cpe".equals(i.getType())) { +366 final String cpe = i.getValue(); +367 if (cpe != null && (cpe.startsWith("cpe:/a:apache:axis2:") || "cpe:/a:apache:axis2".equals(cpe))) { +368 itr.remove(); +369 } +370 } +371 } +372 } +373 } +374 +375 /** +376 * There are some known CPE entries, specifically regarding sun and oracle products due to the acquisition and changes in +377 * product names, that based on given evidence we can add the related CPE entries to ensure a complete list of CVE entries. +378 * +379 * @param dependency the dependency being analyzed +380 */ +381 private void addFalseNegativeCPEs(Dependency dependency) { +382 //TODO move this to the hint analyzer +383 for (final Identifier identifier : dependency.getIdentifiers()) { +384 if ("cpe".equals(identifier.getType()) && identifier.getValue() != null +385 && (identifier.getValue().startsWith("cpe:/a:oracle:opensso:") +386 || identifier.getValue().startsWith("cpe:/a:oracle:opensso_enterprise:") +387 || identifier.getValue().startsWith("cpe:/a:sun:opensso_enterprise:") +388 || identifier.getValue().startsWith("cpe:/a:sun:opensso:"))) { +389 final String newCpe = String.format("cpe:/a:sun:opensso_enterprise:%s", identifier.getValue().substring(22)); +390 final String newCpe2 = String.format("cpe:/a:oracle:opensso_enterprise:%s", identifier.getValue().substring(22)); +391 final String newCpe3 = String.format("cpe:/a:sun:opensso:%s", identifier.getValue().substring(22)); +392 final String newCpe4 = String.format("cpe:/a:oracle:opensso:%s", identifier.getValue().substring(22)); +393 try { +394 dependency.addIdentifier("cpe", +395 newCpe, +396 String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe, "UTF-8"))); +397 dependency.addIdentifier("cpe", +398 newCpe2, +399 String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe2, "UTF-8"))); +400 dependency.addIdentifier("cpe", +401 newCpe3, +402 String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe3, "UTF-8"))); +403 dependency.addIdentifier("cpe", +404 newCpe4, +405 String.format(CPEAnalyzer.NVD_SEARCH_URL, URLEncoder.encode(newCpe4, "UTF-8"))); +406 } catch (UnsupportedEncodingException ex) { +407 LOGGER.debug("", ex); +408 } +409 } +410 } +411 } +412 +413 /** +414 * Removes duplicate entries identified that are contained within JAR files. These occasionally crop up due to POM entries or +415 * other types of files (such as DLLs and EXEs) being contained within the JAR. +416 * +417 * @param dependency the dependency that might be a duplicate +418 * @param engine the engine used to scan all dependencies +419 */ +420 private void removeDuplicativeEntriesFromJar(Dependency dependency, Engine engine) { +421 if (dependency.getFileName().toLowerCase().endsWith("pom.xml") +422 || DLL_EXE_FILTER.accept(dependency.getActualFile())) { +423 String parentPath = dependency.getFilePath().toLowerCase(); +424 if (parentPath.contains(".jar")) { +425 parentPath = parentPath.substring(0, parentPath.indexOf(".jar") + 4); +426 final Dependency parent = findDependency(parentPath, engine.getDependencies()); +427 if (parent != null) { +428 boolean remove = false; +429 for (Identifier i : dependency.getIdentifiers()) { +430 if ("cpe".equals(i.getType())) { +431 final String trimmedCPE = trimCpeToVendor(i.getValue()); +432 for (Identifier parentId : parent.getIdentifiers()) { +433 if ("cpe".equals(parentId.getType()) && parentId.getValue().startsWith(trimmedCPE)) { +434 remove |= true; +435 } +436 } +437 } +438 if (!remove) { //we can escape early +439 return; +440 } +441 } +442 if (remove) { +443 engine.getDependencies().remove(dependency); +444 } +445 } +446 } +447 +448 } +449 } +450 +451 /** +452 * Retrieves a given dependency, based on a given path, from a list of dependencies. +453 * +454 * @param dependencyPath the path of the dependency to return +455 * @param dependencies the collection of dependencies to search +456 * @return the dependency object for the given path, otherwise null +457 */ +458 private Dependency findDependency(String dependencyPath, List<Dependency> dependencies) { +459 for (Dependency d : dependencies) { +460 if (d.getFilePath().equalsIgnoreCase(dependencyPath)) { +461 return d; +462 } +463 } +464 return null; +465 } +466 +467 /** +468 * Takes a full CPE and returns the CPE trimmed to include only vendor and product. +469 * +470 * @param value the CPE value to trim +471 * @return a CPE value that only includes the vendor and product +472 */ +473 private String trimCpeToVendor(String value) { +474 //cpe:/a:jruby:jruby:1.0.8 +475 final int pos1 = value.indexOf(":", 7); //right of vendor +476 final int pos2 = value.indexOf(":", pos1 + 1); //right of product +477 if (pos2 < 0) { +478 return value; +479 } else { +480 return value.substring(0, pos2); +481 } +482 } +483 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/FileNameAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/FileNameAnalyzer.html index af9cf08dd..03187253c 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/FileNameAnalyzer.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/FileNameAnalyzer.html @@ -56,71 +56,73 @@ 48 * 49 * @return the name of the analyzer. 50 */ -51 public String getName() { -52 return ANALYZER_NAME; -53 } -54 -55 /** -56 * Returns the phase that the analyzer is intended to run in. -57 * -58 * @return the phase that the analyzer is intended to run in. -59 */ -60 public AnalysisPhase getAnalysisPhase() { -61 return ANALYSIS_PHASE; -62 } -63 //</editor-fold> -64 -65 /** -66 * Collects information about the file name. -67 * -68 * @param dependency the dependency to analyze. -69 * @param engine the engine that is scanning the dependencies -70 * @throws AnalysisException is thrown if there is an error reading the JAR file. -71 */ -72 @Override -73 public void analyze(Dependency dependency, Engine engine) throws AnalysisException { -74 -75 //strip any path information that may get added by ArchiveAnalyzer, etc. -76 final File f = dependency.getActualFile(); -77 String fileName = f.getName(); -78 -79 //remove file extension -80 final int pos = fileName.lastIndexOf("."); -81 if (pos > 0) { -82 fileName = fileName.substring(0, pos); -83 } -84 -85 //add version evidence -86 final DependencyVersion version = DependencyVersionUtil.parseVersion(fileName); -87 if (version != null) { -88 // If the version number is just a number like 2 or 23, reduce the confidence -89 // a shade. This should hopefully correct for cases like log4j.jar or -90 // struts2-core.jar -91 if (version.getVersionParts() == null || version.getVersionParts().size() < 2) { -92 dependency.getVersionEvidence().addEvidence("file", "name", -93 version.toString(), Confidence.MEDIUM); -94 } else { -95 dependency.getVersionEvidence().addEvidence("file", "name", -96 version.toString(), Confidence.HIGHEST); -97 } -98 dependency.getVersionEvidence().addEvidence("file", "name", -99 fileName, Confidence.MEDIUM); -100 } -101 -102 //add as vendor and product evidence -103 if (fileName.contains("-")) { -104 dependency.getProductEvidence().addEvidence("file", "name", -105 fileName, Confidence.HIGHEST); -106 dependency.getVendorEvidence().addEvidence("file", "name", +51 @Override +52 public String getName() { +53 return ANALYZER_NAME; +54 } +55 +56 /** +57 * Returns the phase that the analyzer is intended to run in. +58 * +59 * @return the phase that the analyzer is intended to run in. +60 */ +61 @Override +62 public AnalysisPhase getAnalysisPhase() { +63 return ANALYSIS_PHASE; +64 } +65 //</editor-fold> +66 +67 /** +68 * Collects information about the file name. +69 * +70 * @param dependency the dependency to analyze. +71 * @param engine the engine that is scanning the dependencies +72 * @throws AnalysisException is thrown if there is an error reading the JAR file. +73 */ +74 @Override +75 public void analyze(Dependency dependency, Engine engine) throws AnalysisException { +76 +77 //strip any path information that may get added by ArchiveAnalyzer, etc. +78 final File f = dependency.getActualFile(); +79 String fileName = f.getName(); +80 +81 //remove file extension +82 final int pos = fileName.lastIndexOf("."); +83 if (pos > 0) { +84 fileName = fileName.substring(0, pos); +85 } +86 +87 //add version evidence +88 final DependencyVersion version = DependencyVersionUtil.parseVersion(fileName); +89 if (version != null) { +90 // If the version number is just a number like 2 or 23, reduce the confidence +91 // a shade. This should hopefully correct for cases like log4j.jar or +92 // struts2-core.jar +93 if (version.getVersionParts() == null || version.getVersionParts().size() < 2) { +94 dependency.getVersionEvidence().addEvidence("file", "name", +95 version.toString(), Confidence.MEDIUM); +96 } else { +97 dependency.getVersionEvidence().addEvidence("file", "name", +98 version.toString(), Confidence.HIGHEST); +99 } +100 dependency.getVersionEvidence().addEvidence("file", "name", +101 fileName, Confidence.MEDIUM); +102 } +103 +104 //add as vendor and product evidence +105 if (fileName.contains("-")) { +106 dependency.getProductEvidence().addEvidence("file", "name", 107 fileName, Confidence.HIGHEST); -108 } else { -109 dependency.getProductEvidence().addEvidence("file", "name", -110 fileName, Confidence.HIGH); -111 dependency.getVendorEvidence().addEvidence("file", "name", +108 dependency.getVendorEvidence().addEvidence("file", "name", +109 fileName, Confidence.HIGHEST); +110 } else { +111 dependency.getProductEvidence().addEvidence("file", "name", 112 fileName, Confidence.HIGH); -113 } -114 } -115 } +113 dependency.getVendorEvidence().addEvidence("file", "name", +114 fileName, Confidence.HIGH); +115 } +116 } +117 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/HintAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/HintAnalyzer.html index e033d284a..6751bd133 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/HintAnalyzer.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/HintAnalyzer.html @@ -112,49 +112,76 @@ 104 "spring-security-core", 105 Confidence.HIGH); 106 -107 //springsource/vware problem -108 final Set<Evidence> product = dependency.getProductEvidence().getEvidence(); -109 final Set<Evidence> vendor = dependency.getVendorEvidence().getEvidence(); -110 -111 if (product.contains(springTest1) || product.contains(springTest2) || product.contains(springTest3) -112 || (dependency.getFileName().contains("spring") && product.contains(springTest4))) { -113 dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource spring framework", Confidence.HIGH); -114 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "SpringSource", Confidence.HIGH); -115 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH); -116 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "pivotal", Confidence.HIGH); -117 } -118 -119 if (vendor.contains(springTest4)) { -120 dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource_spring_framework", Confidence.HIGH); -121 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH); -122 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "pivotal", Confidence.HIGH); -123 } -124 -125 if (product.contains(springSecurityTest1) || product.contains(springSecurityTest2)) { -126 dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource_spring_security", Confidence.HIGH); -127 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "SpringSource", Confidence.HIGH); -128 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH); -129 } -130 -131 //sun/oracle problem -132 final Iterator<Evidence> itr = dependency.getVendorEvidence().iterator(); -133 final List<Evidence> newEntries = new ArrayList<Evidence>(); -134 while (itr.hasNext()) { -135 final Evidence e = itr.next(); -136 if ("sun".equalsIgnoreCase(e.getValue(false))) { -137 final Evidence newEvidence = new Evidence(e.getSource() + " (hint)", e.getName(), "oracle", e.getConfidence()); -138 newEntries.add(newEvidence); -139 } else if ("oracle".equalsIgnoreCase(e.getValue(false))) { -140 final Evidence newEvidence = new Evidence(e.getSource() + " (hint)", e.getName(), "sun", e.getConfidence()); -141 newEntries.add(newEvidence); -142 } -143 } -144 for (Evidence e : newEntries) { -145 dependency.getVendorEvidence().addEvidence(e); -146 } -147 -148 } -149 } +107 final Evidence symfony = new Evidence("composer.lock", +108 "vendor", +109 "symfony", +110 Confidence.HIGHEST); +111 +112 final Evidence zendframeworkVendor = new Evidence("composer.lock", +113 "vendor", +114 "zendframework", +115 Confidence.HIGHEST); +116 +117 final Evidence zendframeworkProduct = new Evidence("composer.lock", +118 "product", +119 "zendframework", +120 Confidence.HIGHEST); +121 +122 //springsource/vware problem +123 final Set<Evidence> product = dependency.getProductEvidence().getEvidence(); +124 final Set<Evidence> vendor = dependency.getVendorEvidence().getEvidence(); +125 +126 if (product.contains(springTest1) || product.contains(springTest2) || product.contains(springTest3) +127 || (dependency.getFileName().contains("spring") && product.contains(springTest4))) { +128 dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource spring framework", Confidence.HIGH); +129 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "SpringSource", Confidence.HIGH); +130 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH); +131 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "pivotal", Confidence.HIGH); +132 } +133 +134 if (vendor.contains(springTest4)) { +135 dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource_spring_framework", Confidence.HIGH); +136 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH); +137 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "pivotal", Confidence.HIGH); +138 } +139 +140 if (product.contains(springSecurityTest1) || product.contains(springSecurityTest2)) { +141 dependency.getProductEvidence().addEvidence("hint analyzer", "product", "springsource_spring_security", Confidence.HIGH); +142 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "SpringSource", Confidence.HIGH); +143 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "vmware", Confidence.HIGH); +144 } +145 +146 if (vendor.contains(symfony)) { +147 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "sensiolabs", Confidence.HIGHEST); +148 } +149 +150 if (vendor.contains(zendframeworkVendor)) { +151 dependency.getVendorEvidence().addEvidence("hint analyzer", "vendor", "zend", Confidence.HIGHEST); +152 } +153 +154 if (product.contains(zendframeworkProduct)) { +155 dependency.getProductEvidence().addEvidence("hint analyzer", "vendor", "zend_framework", Confidence.HIGHEST); +156 } +157 +158 //sun/oracle problem +159 final Iterator<Evidence> itr = dependency.getVendorEvidence().iterator(); +160 final List<Evidence> newEntries = new ArrayList<Evidence>(); +161 while (itr.hasNext()) { +162 final Evidence e = itr.next(); +163 if ("sun".equalsIgnoreCase(e.getValue(false))) { +164 final Evidence newEvidence = new Evidence(e.getSource() + " (hint)", e.getName(), "oracle", e.getConfidence()); +165 newEntries.add(newEvidence); +166 } else if ("oracle".equalsIgnoreCase(e.getValue(false))) { +167 final Evidence newEvidence = new Evidence(e.getSource() + " (hint)", e.getName(), "sun", e.getConfidence()); +168 newEntries.add(newEvidence); +169 } +170 } +171 for (Evidence e : newEntries) { +172 dependency.getVendorEvidence().addEvidence(e); +173 } +174 +175 } +176 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/JarAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/JarAnalyzer.html index 0eebc2360..0892bcde7 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/JarAnalyzer.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/JarAnalyzer.html @@ -25,31 +25,31 @@ 17 */ 18 package org.owasp.dependencycheck.analyzer; 19 -20 import java.io.BufferedOutputStream; -21 import java.io.File; -22 import java.io.FileFilter; -23 import java.io.FileOutputStream; -24 import java.io.IOException; -25 import java.io.InputStream; -26 import java.io.InputStreamReader; -27 import java.io.OutputStream; -28 import java.io.Reader; -29 import java.util.ArrayList; -30 import java.util.Collections; -31 import java.util.Enumeration; -32 import java.util.HashMap; -33 import java.util.List; -34 import java.util.Map; -35 import java.util.Map.Entry; -36 import java.util.Properties; -37 import java.util.Set; -38 import java.util.StringTokenizer; -39 import java.util.jar.Attributes; -40 import java.util.jar.JarEntry; -41 import java.util.jar.JarFile; -42 import java.util.jar.Manifest; -43 import java.util.regex.Pattern; -44 import java.util.zip.ZipEntry; +20 import java.io.File; +21 import java.io.FileFilter; +22 import java.io.FileOutputStream; +23 import java.io.IOException; +24 import java.io.InputStream; +25 import java.io.InputStreamReader; +26 import java.io.OutputStream; +27 import java.io.Reader; +28 import java.util.ArrayList; +29 import java.util.Collections; +30 import java.util.Enumeration; +31 import java.util.HashMap; +32 import java.util.List; +33 import java.util.Map; +34 import java.util.Map.Entry; +35 import java.util.Properties; +36 import java.util.Set; +37 import java.util.StringTokenizer; +38 import java.util.jar.Attributes; +39 import java.util.jar.JarEntry; +40 import java.util.jar.JarFile; +41 import java.util.jar.Manifest; +42 import java.util.regex.Pattern; +43 import java.util.zip.ZipEntry; +44 import org.apache.commons.compress.utils.IOUtils; 45 import org.jsoup.Jsoup; 46 import org.owasp.dependencycheck.Engine; 47 import org.owasp.dependencycheck.analyzer.exception.AnalysisException; @@ -78,1125 +78,1114 @@ 70 */ 71 private static final Logger LOGGER = LoggerFactory.getLogger(JarAnalyzer.class); 72 /** -73 * The buffer size to use when extracting files from the archive. +73 * The count of directories created during analysis. This is used for creating temporary directories. 74 */ -75 private static final int BUFFER_SIZE = 4096; +75 private static int dirCount = 0; 76 /** -77 * The count of directories created during analysis. This is used for creating temporary directories. +77 * The system independent newline character. 78 */ -79 private static int dirCount = 0; +79 private static final String NEWLINE = System.getProperty("line.separator"); 80 /** -81 * The system independent newline character. +81 * A list of values in the manifest to ignore as they only result in false positives. 82 */ -83 private static final String NEWLINE = System.getProperty("line.separator"); -84 /** -85 * A list of values in the manifest to ignore as they only result in false positives. -86 */ -87 private static final Set<String> IGNORE_VALUES = newHashSet( -88 "Sun Java System Application Server"); -89 /** -90 * A list of elements in the manifest to ignore. -91 */ -92 private static final Set<String> IGNORE_KEYS = newHashSet( -93 "built-by", -94 "created-by", -95 "builtby", -96 "createdby", -97 "build-jdk", -98 "buildjdk", -99 "ant-version", -100 "antversion", -101 "dynamicimportpackage", -102 "dynamicimport-package", -103 "dynamic-importpackage", -104 "dynamic-import-package", -105 "import-package", -106 "ignore-package", -107 "export-package", -108 "importpackage", -109 "ignorepackage", -110 "exportpackage", -111 "sealed", -112 "manifest-version", -113 "archiver-version", -114 "manifestversion", -115 "archiverversion", -116 "classpath", -117 "class-path", -118 "tool", -119 "bundle-manifestversion", -120 "bundlemanifestversion", -121 "bundle-vendor", -122 "include-resource", -123 "embed-dependency", -124 "ipojo-components", -125 "ipojo-extension", -126 "eclipse-sourcereferences"); -127 /** -128 * Deprecated Jar manifest attribute, that is, nonetheless, useful for analysis. -129 */ -130 @SuppressWarnings("deprecation") -131 private static final String IMPLEMENTATION_VENDOR_ID = Attributes.Name.IMPLEMENTATION_VENDOR_ID -132 .toString(); +83 private static final Set<String> IGNORE_VALUES = newHashSet( +84 "Sun Java System Application Server"); +85 /** +86 * A list of elements in the manifest to ignore. +87 */ +88 private static final Set<String> IGNORE_KEYS = newHashSet( +89 "built-by", +90 "created-by", +91 "builtby", +92 "createdby", +93 "build-jdk", +94 "buildjdk", +95 "ant-version", +96 "antversion", +97 "dynamicimportpackage", +98 "dynamicimport-package", +99 "dynamic-importpackage", +100 "dynamic-import-package", +101 "import-package", +102 "ignore-package", +103 "export-package", +104 "importpackage", +105 "ignorepackage", +106 "exportpackage", +107 "sealed", +108 "manifest-version", +109 "archiver-version", +110 "manifestversion", +111 "archiverversion", +112 "classpath", +113 "class-path", +114 "tool", +115 "bundle-manifestversion", +116 "bundlemanifestversion", +117 "bundle-vendor", +118 "include-resource", +119 "embed-dependency", +120 "ipojo-components", +121 "ipojo-extension", +122 "eclipse-sourcereferences"); +123 /** +124 * Deprecated Jar manifest attribute, that is, nonetheless, useful for analysis. +125 */ +126 @SuppressWarnings("deprecation") +127 private static final String IMPLEMENTATION_VENDOR_ID = Attributes.Name.IMPLEMENTATION_VENDOR_ID +128 .toString(); +129 /** +130 * item in some manifest, should be considered medium confidence. +131 */ +132 private static final String BUNDLE_VERSION = "Bundle-Version"; //: 2.1.2 133 /** 134 * item in some manifest, should be considered medium confidence. 135 */ -136 private static final String BUNDLE_VERSION = "Bundle-Version"; //: 2.1.2 +136 private static final String BUNDLE_DESCRIPTION = "Bundle-Description"; //: Apache Struts 2 137 /** 138 * item in some manifest, should be considered medium confidence. 139 */ -140 private static final String BUNDLE_DESCRIPTION = "Bundle-Description"; //: Apache Struts 2 +140 private static final String BUNDLE_NAME = "Bundle-Name"; //: Struts 2 Core 141 /** -142 * item in some manifest, should be considered medium confidence. +142 * A pattern to detect HTML within text. 143 */ -144 private static final String BUNDLE_NAME = "Bundle-Name"; //: Struts 2 Core -145 /** -146 * A pattern to detect HTML within text. -147 */ -148 private static final Pattern HTML_DETECTION_PATTERN = Pattern.compile("\\<[a-z]+.*/?\\>", Pattern.CASE_INSENSITIVE); -149 -150 //</editor-fold> -151 /** -152 * Constructs a new JarAnalyzer. -153 */ -154 public JarAnalyzer() { -155 } -156 -157 //<editor-fold defaultstate="collapsed" desc="All standard implmentation details of Analyzer"> +144 private static final Pattern HTML_DETECTION_PATTERN = Pattern.compile("\\<[a-z]+.*/?\\>", Pattern.CASE_INSENSITIVE); +145 +146 //</editor-fold> +147 /** +148 * Constructs a new JarAnalyzer. +149 */ +150 public JarAnalyzer() { +151 } +152 +153 //<editor-fold defaultstate="collapsed" desc="All standard implmentation details of Analyzer"> +154 /** +155 * The name of the analyzer. +156 */ +157 private static final String ANALYZER_NAME = "Jar Analyzer"; 158 /** -159 * The name of the analyzer. +159 * The phase that this analyzer is intended to run in. 160 */ -161 private static final String ANALYZER_NAME = "Jar Analyzer"; +161 private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION; 162 /** -163 * The phase that this analyzer is intended to run in. +163 * The set of file extensions supported by this analyzer. 164 */ -165 private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION; -166 /** -167 * The set of file extensions supported by this analyzer. -168 */ -169 private static final String[] EXTENSIONS = {"jar", "war"}; -170 -171 /** -172 * The file filter used to determine which files this analyzer supports. -173 */ -174 private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build(); -175 -176 /** -177 * Returns the FileFilter. -178 * -179 * @return the FileFilter -180 */ -181 @Override -182 protected FileFilter getFileFilter() { -183 return FILTER; -184 } -185 -186 /** -187 * Returns the name of the analyzer. -188 * -189 * @return the name of the analyzer. -190 */ -191 @Override -192 public String getName() { -193 return ANALYZER_NAME; -194 } -195 -196 /** -197 * Returns the phase that the analyzer is intended to run in. -198 * -199 * @return the phase that the analyzer is intended to run in. -200 */ -201 public AnalysisPhase getAnalysisPhase() { -202 return ANALYSIS_PHASE; -203 } -204 //</editor-fold> -205 -206 /** -207 * Returns the key used in the properties file to reference the analyzer's enabled property. -208 * -209 * @return the analyzer's enabled property setting key -210 */ -211 @Override -212 protected String getAnalyzerEnabledSettingKey() { -213 return Settings.KEYS.ANALYZER_JAR_ENABLED; -214 } -215 -216 /** -217 * Loads a specified JAR file and collects information from the manifest and checksums to identify the correct CPE -218 * information. -219 * -220 * @param dependency the dependency to analyze. -221 * @param engine the engine that is scanning the dependencies -222 * @throws AnalysisException is thrown if there is an error reading the JAR file. -223 */ -224 @Override -225 public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException { -226 try { -227 final List<ClassNameInformation> classNames = collectClassNames(dependency); -228 final String fileName = dependency.getFileName().toLowerCase(); -229 if (classNames.isEmpty() -230 && (fileName.endsWith("-sources.jar") -231 || fileName.endsWith("-javadoc.jar") -232 || fileName.endsWith("-src.jar") -233 || fileName.endsWith("-doc.jar"))) { -234 engine.getDependencies().remove(dependency); -235 } -236 final boolean hasManifest = parseManifest(dependency, classNames); -237 final boolean hasPOM = analyzePOM(dependency, classNames, engine); -238 final boolean addPackagesAsEvidence = !(hasManifest && hasPOM); -239 analyzePackageNames(classNames, dependency, addPackagesAsEvidence); -240 } catch (IOException ex) { -241 throw new AnalysisException("Exception occurred reading the JAR file.", ex); -242 } -243 } -244 -245 /** -246 * Attempts to find a pom.xml within the JAR file. If found it extracts information and adds it to the evidence. This will -247 * attempt to interpolate the strings contained within the pom.properties if one exists. -248 * -249 * @param dependency the dependency being analyzed -250 * @param classes a collection of class name information -251 * @param engine the analysis engine, used to add additional dependencies -252 * @throws AnalysisException is thrown if there is an exception parsing the pom -253 * @return whether or not evidence was added to the dependency -254 */ -255 protected boolean analyzePOM(Dependency dependency, List<ClassNameInformation> classes, Engine engine) throws AnalysisException { -256 boolean foundSomething = false; -257 final JarFile jar; -258 try { -259 jar = new JarFile(dependency.getActualFilePath()); -260 } catch (IOException ex) { -261 LOGGER.warn("Unable to read JarFile '{}'.", dependency.getActualFilePath()); -262 LOGGER.trace("", ex); -263 return false; -264 } -265 List<String> pomEntries; -266 try { -267 pomEntries = retrievePomListing(jar); -268 } catch (IOException ex) { -269 LOGGER.warn("Unable to read Jar file entries in '{}'.", dependency.getActualFilePath()); -270 LOGGER.trace("", ex); -271 return false; -272 } -273 File externalPom = null; -274 if (pomEntries.isEmpty()) { -275 String pomPath = dependency.getActualFilePath(); -276 pomPath = pomPath.substring(0, pomPath.lastIndexOf('.')) + ".pom"; -277 externalPom = new File(pomPath); -278 if (externalPom.isFile()) { -279 pomEntries.add(pomPath); -280 } else { -281 return false; -282 } -283 } -284 for (String path : pomEntries) { -285 LOGGER.debug("Reading pom entry: {}", path); -286 Properties pomProperties = null; -287 try { -288 if (externalPom == null) { -289 pomProperties = retrievePomProperties(path, jar); -290 } -291 } catch (IOException ex) { -292 LOGGER.trace("ignore this, failed reading a non-existent pom.properties", ex); -293 } -294 Model pom = null; -295 try { -296 if (pomEntries.size() > 1) { -297 //extract POM to its own directory and add it as its own dependency -298 final Dependency newDependency = new Dependency(); -299 pom = extractPom(path, jar, newDependency); -300 -301 final String displayPath = String.format("%s%s%s", -302 dependency.getFilePath(), -303 File.separator, -304 path); -305 final String displayName = String.format("%s%s%s", -306 dependency.getFileName(), -307 File.separator, -308 path); -309 -310 newDependency.setFileName(displayName); -311 newDependency.setFilePath(displayPath); -312 pom.processProperties(pomProperties); -313 setPomEvidence(newDependency, pom, null); -314 engine.getDependencies().add(newDependency); -315 Collections.sort(engine.getDependencies()); -316 } else { -317 if (externalPom == null) { -318 pom = PomUtils.readPom(path, jar); -319 } else { -320 pom = PomUtils.readPom(externalPom); -321 } -322 pom.processProperties(pomProperties); -323 foundSomething |= setPomEvidence(dependency, pom, classes); -324 } -325 } catch (AnalysisException ex) { -326 LOGGER.warn("An error occured while analyzing '{}'.", dependency.getActualFilePath()); -327 LOGGER.trace("", ex); -328 } -329 } -330 return foundSomething; -331 } -332 -333 /** -334 * Given a path to a pom.xml within a JarFile, this method attempts to load a sibling pom.properties if one exists. -335 * -336 * @param path the path to the pom.xml within the JarFile -337 * @param jar the JarFile to load the pom.properties from -338 * @return a Properties object or null if no pom.properties was found -339 * @throws IOException thrown if there is an exception reading the pom.properties -340 */ -341 private Properties retrievePomProperties(String path, final JarFile jar) throws IOException { -342 Properties pomProperties = null; -343 final String propPath = path.substring(0, path.length() - 7) + "pom.properies"; -344 final ZipEntry propEntry = jar.getEntry(propPath); -345 if (propEntry != null) { -346 Reader reader = null; -347 try { -348 reader = new InputStreamReader(jar.getInputStream(propEntry), "UTF-8"); -349 pomProperties = new Properties(); -350 pomProperties.load(reader); -351 LOGGER.debug("Read pom.properties: {}", propPath); -352 } finally { -353 if (reader != null) { -354 try { -355 reader.close(); -356 } catch (IOException ex) { -357 LOGGER.trace("close error", ex); -358 } -359 } -360 } -361 } -362 return pomProperties; -363 } -364 -365 /** -366 * Searches a JarFile for pom.xml entries and returns a listing of these entries. -367 * -368 * @param jar the JarFile to search -369 * @return a list of pom.xml entries -370 * @throws IOException thrown if there is an exception reading a JarEntry -371 */ -372 private List<String> retrievePomListing(final JarFile jar) throws IOException { -373 final List<String> pomEntries = new ArrayList<String>(); -374 final Enumeration<JarEntry> entries = jar.entries(); -375 while (entries.hasMoreElements()) { -376 final JarEntry entry = entries.nextElement(); -377 final String entryName = (new File(entry.getName())).getName().toLowerCase(); -378 if (!entry.isDirectory() && "pom.xml".equals(entryName)) { -379 LOGGER.trace("POM Entry found: {}", entry.getName()); -380 pomEntries.add(entry.getName()); -381 } -382 } -383 return pomEntries; -384 } -385 -386 /** -387 * Retrieves the specified POM from a jar file and converts it to a Model. -388 * -389 * @param path the path to the pom.xml file within the jar file -390 * @param jar the jar file to extract the pom from -391 * @param dependency the dependency being analyzed -392 * @return returns the POM object -393 * @throws AnalysisException is thrown if there is an exception extracting or parsing the POM -394 * {@link org.owasp.dependencycheck.xml.pom.Model} object -395 */ -396 private Model extractPom(String path, JarFile jar, Dependency dependency) throws AnalysisException { -397 InputStream input = null; -398 FileOutputStream fos = null; -399 BufferedOutputStream bos = null; -400 final File tmpDir = getNextTempDirectory(); -401 final File file = new File(tmpDir, "pom.xml"); -402 try { -403 final ZipEntry entry = jar.getEntry(path); -404 input = jar.getInputStream(entry); -405 fos = new FileOutputStream(file); -406 bos = new BufferedOutputStream(fos, BUFFER_SIZE); -407 int count; -408 final byte[] data = new byte[BUFFER_SIZE]; -409 while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) { -410 bos.write(data, 0, count); -411 } -412 bos.flush(); -413 dependency.setActualFilePath(file.getAbsolutePath()); -414 } catch (IOException ex) { -415 LOGGER.warn("An error occurred reading '{}' from '{}'.", path, dependency.getFilePath()); -416 LOGGER.error("", ex); -417 } finally { -418 closeStream(bos); -419 closeStream(fos); -420 closeStream(input); -421 } -422 return PomUtils.readPom(file); -423 } -424 -425 /** -426 * Silently closes an input stream ignoring errors. -427 * -428 * @param stream an input stream to close -429 */ -430 private void closeStream(InputStream stream) { -431 if (stream != null) { -432 try { -433 stream.close(); -434 } catch (IOException ex) { -435 LOGGER.trace("", ex); -436 } -437 } -438 } -439 -440 /** -441 * Silently closes an output stream ignoring errors. -442 * -443 * @param stream an output stream to close -444 */ -445 private void closeStream(OutputStream stream) { -446 if (stream != null) { -447 try { -448 stream.close(); -449 } catch (IOException ex) { -450 LOGGER.trace("", ex); -451 } -452 } -453 } -454 -455 /** -456 * Sets evidence from the pom on the supplied dependency. -457 * -458 * @param dependency the dependency to set data on -459 * @param pom the information from the pom -460 * @param classes a collection of ClassNameInformation - containing data about the fully qualified class names within the JAR -461 * file being analyzed -462 * @return true if there was evidence within the pom that we could use; otherwise false -463 */ -464 public static boolean setPomEvidence(Dependency dependency, Model pom, List<ClassNameInformation> classes) { -465 boolean foundSomething = false; -466 boolean addAsIdentifier = true; -467 if (pom == null) { -468 return foundSomething; -469 } -470 String groupid = pom.getGroupId(); -471 String parentGroupId = pom.getParentGroupId(); -472 String artifactid = pom.getArtifactId(); -473 String parentArtifactId = pom.getParentArtifactId(); -474 String version = pom.getVersion(); -475 String parentVersion = pom.getParentVersion(); -476 -477 if ("org.sonatype.oss".equals(parentGroupId) && "oss-parent".equals(parentArtifactId)) { -478 parentGroupId = null; -479 parentArtifactId = null; -480 parentVersion = null; -481 } -482 -483 if ((groupid == null || groupid.isEmpty()) && parentGroupId != null && !parentGroupId.isEmpty()) { -484 groupid = parentGroupId; -485 } -486 -487 final String originalGroupID = groupid; -488 if (groupid.startsWith("org.") || groupid.startsWith("com.")) { -489 groupid = groupid.substring(4); -490 } -491 -492 if ((artifactid == null || artifactid.isEmpty()) && parentArtifactId != null && !parentArtifactId.isEmpty()) { -493 artifactid = parentArtifactId; -494 } -495 -496 final String originalArtifactID = artifactid; -497 if (artifactid.startsWith("org.") || artifactid.startsWith("com.")) { -498 artifactid = artifactid.substring(4); -499 } -500 -501 if ((version == null || version.isEmpty()) && parentVersion != null && !parentVersion.isEmpty()) { -502 version = parentVersion; -503 } -504 -505 if (groupid != null && !groupid.isEmpty()) { -506 foundSomething = true; -507 dependency.getVendorEvidence().addEvidence("pom", "groupid", groupid, Confidence.HIGHEST); -508 dependency.getProductEvidence().addEvidence("pom", "groupid", groupid, Confidence.LOW); -509 addMatchingValues(classes, groupid, dependency.getVendorEvidence()); -510 addMatchingValues(classes, groupid, dependency.getProductEvidence()); -511 if (parentGroupId != null && !parentGroupId.isEmpty() && !parentGroupId.equals(groupid)) { -512 dependency.getVendorEvidence().addEvidence("pom", "parent-groupid", parentGroupId, Confidence.MEDIUM); -513 dependency.getProductEvidence().addEvidence("pom", "parent-groupid", parentGroupId, Confidence.LOW); -514 addMatchingValues(classes, parentGroupId, dependency.getVendorEvidence()); -515 addMatchingValues(classes, parentGroupId, dependency.getProductEvidence()); -516 } -517 } else { -518 addAsIdentifier = false; -519 } -520 -521 if (artifactid != null && !artifactid.isEmpty()) { -522 foundSomething = true; -523 dependency.getProductEvidence().addEvidence("pom", "artifactid", artifactid, Confidence.HIGHEST); -524 dependency.getVendorEvidence().addEvidence("pom", "artifactid", artifactid, Confidence.LOW); -525 addMatchingValues(classes, artifactid, dependency.getVendorEvidence()); -526 addMatchingValues(classes, artifactid, dependency.getProductEvidence()); -527 if (parentArtifactId != null && !parentArtifactId.isEmpty() && !parentArtifactId.equals(artifactid)) { -528 dependency.getProductEvidence().addEvidence("pom", "parent-artifactid", parentArtifactId, Confidence.MEDIUM); -529 dependency.getVendorEvidence().addEvidence("pom", "parent-artifactid", parentArtifactId, Confidence.LOW); -530 addMatchingValues(classes, parentArtifactId, dependency.getVendorEvidence()); -531 addMatchingValues(classes, parentArtifactId, dependency.getProductEvidence()); -532 } -533 } else { -534 addAsIdentifier = false; -535 } -536 -537 if (version != null && !version.isEmpty()) { -538 foundSomething = true; -539 dependency.getVersionEvidence().addEvidence("pom", "version", version, Confidence.HIGHEST); -540 if (parentVersion != null && !parentVersion.isEmpty() && !parentVersion.equals(version)) { -541 dependency.getVersionEvidence().addEvidence("pom", "parent-version", version, Confidence.LOW); -542 } -543 } else { -544 addAsIdentifier = false; -545 } -546 -547 if (addAsIdentifier) { -548 dependency.addIdentifier("maven", String.format("%s:%s:%s", originalGroupID, originalArtifactID, version), null, Confidence.HIGH); -549 } -550 -551 // org name -552 final String org = pom.getOrganization(); -553 if (org != null && !org.isEmpty()) { -554 dependency.getVendorEvidence().addEvidence("pom", "organization name", org, Confidence.HIGH); -555 dependency.getProductEvidence().addEvidence("pom", "organization name", org, Confidence.LOW); -556 addMatchingValues(classes, org, dependency.getVendorEvidence()); -557 addMatchingValues(classes, org, dependency.getProductEvidence()); -558 } -559 //pom name -560 final String pomName = pom.getName(); -561 if (pomName -562 != null && !pomName.isEmpty()) { -563 foundSomething = true; -564 dependency.getProductEvidence().addEvidence("pom", "name", pomName, Confidence.HIGH); -565 dependency.getVendorEvidence().addEvidence("pom", "name", pomName, Confidence.HIGH); -566 addMatchingValues(classes, pomName, dependency.getVendorEvidence()); -567 addMatchingValues(classes, pomName, dependency.getProductEvidence()); -568 } -569 -570 //Description -571 final String description = pom.getDescription(); -572 if (description != null && !description.isEmpty() && !description.startsWith("POM was created by")) { -573 foundSomething = true; -574 final String trimmedDescription = addDescription(dependency, description, "pom", "description"); -575 addMatchingValues(classes, trimmedDescription, dependency.getVendorEvidence()); -576 addMatchingValues(classes, trimmedDescription, dependency.getProductEvidence()); -577 } -578 -579 extractLicense(pom, dependency); -580 return foundSomething; -581 } -582 -583 /** -584 * Analyzes the path information of the classes contained within the JarAnalyzer to try and determine possible vendor or -585 * product names. If any are found they are stored in the packageVendor and packageProduct hashSets. -586 * -587 * @param classNames a list of class names -588 * @param dependency a dependency to analyze -589 * @param addPackagesAsEvidence a flag indicating whether or not package names should be added as evidence. -590 */ -591 protected void analyzePackageNames(List<ClassNameInformation> classNames, -592 Dependency dependency, boolean addPackagesAsEvidence) { -593 final Map<String, Integer> vendorIdentifiers = new HashMap<String, Integer>(); -594 final Map<String, Integer> productIdentifiers = new HashMap<String, Integer>(); -595 analyzeFullyQualifiedClassNames(classNames, vendorIdentifiers, productIdentifiers); -596 -597 final int classCount = classNames.size(); -598 final EvidenceCollection vendor = dependency.getVendorEvidence(); -599 final EvidenceCollection product = dependency.getProductEvidence(); -600 -601 for (Map.Entry<String, Integer> entry : vendorIdentifiers.entrySet()) { -602 final float ratio = entry.getValue() / (float) classCount; -603 if (ratio > 0.5) { -604 //TODO remove weighting -605 vendor.addWeighting(entry.getKey()); -606 if (addPackagesAsEvidence && entry.getKey().length() > 1) { -607 vendor.addEvidence("jar", "package name", entry.getKey(), Confidence.LOW); -608 } -609 } -610 } -611 for (Map.Entry<String, Integer> entry : productIdentifiers.entrySet()) { -612 final float ratio = entry.getValue() / (float) classCount; -613 if (ratio > 0.5) { -614 product.addWeighting(entry.getKey()); -615 if (addPackagesAsEvidence && entry.getKey().length() > 1) { -616 product.addEvidence("jar", "package name", entry.getKey(), Confidence.LOW); -617 } -618 } -619 } -620 } -621 -622 /** -623 * <p> -624 * Reads the manifest from the JAR file and collects the entries. Some vendorKey entries are:</p> -625 * <ul><li>Implementation Title</li> -626 * <li>Implementation Version</li> <li>Implementation Vendor</li> -627 * <li>Implementation VendorId</li> <li>Bundle Name</li> <li>Bundle Version</li> <li>Bundle Vendor</li> <li>Bundle -628 * Description</li> <li>Main Class</li> </ul> -629 * However, all but a handful of specific entries are read in. -630 * -631 * @param dependency A reference to the dependency -632 * @param classInformation a collection of class information -633 * @return whether evidence was identified parsing the manifest -634 * @throws IOException if there is an issue reading the JAR file -635 */ -636 protected boolean parseManifest(Dependency dependency, List<ClassNameInformation> classInformation) throws IOException { -637 boolean foundSomething = false; -638 JarFile jar = null; -639 try { -640 jar = new JarFile(dependency.getActualFilePath()); -641 -642 final Manifest manifest = jar.getManifest(); -643 -644 if (manifest == null) { -645 //don't log this for javadoc or sources jar files -646 if (!dependency.getFileName().toLowerCase().endsWith("-sources.jar") -647 && !dependency.getFileName().toLowerCase().endsWith("-javadoc.jar") -648 && !dependency.getFileName().toLowerCase().endsWith("-src.jar") -649 && !dependency.getFileName().toLowerCase().endsWith("-doc.jar")) { -650 LOGGER.debug("Jar file '{}' does not contain a manifest.", -651 dependency.getFileName()); -652 } -653 return false; -654 } -655 final Attributes atts = manifest.getMainAttributes(); -656 -657 final EvidenceCollection vendorEvidence = dependency.getVendorEvidence(); -658 final EvidenceCollection productEvidence = dependency.getProductEvidence(); -659 final EvidenceCollection versionEvidence = dependency.getVersionEvidence(); -660 -661 final String source = "Manifest"; -662 -663 String specificationVersion = null; -664 boolean hasImplementationVersion = false; -665 -666 for (Entry<Object, Object> entry : atts.entrySet()) { -667 String key = entry.getKey().toString(); -668 String value = atts.getValue(key); -669 if (HTML_DETECTION_PATTERN.matcher(value).find()) { -670 value = Jsoup.parse(value).text(); -671 } -672 if (IGNORE_VALUES.contains(value)) { -673 continue; -674 } else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_TITLE.toString())) { -675 foundSomething = true; -676 productEvidence.addEvidence(source, key, value, Confidence.HIGH); -677 addMatchingValues(classInformation, value, productEvidence); -678 } else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_VERSION.toString())) { -679 hasImplementationVersion = true; -680 foundSomething = true; -681 versionEvidence.addEvidence(source, key, value, Confidence.HIGH); -682 } else if ("specification-version".equalsIgnoreCase(key)) { -683 specificationVersion = key; -684 } else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_VENDOR.toString())) { -685 foundSomething = true; -686 vendorEvidence.addEvidence(source, key, value, Confidence.HIGH); -687 addMatchingValues(classInformation, value, vendorEvidence); -688 } else if (key.equalsIgnoreCase(IMPLEMENTATION_VENDOR_ID)) { -689 foundSomething = true; -690 vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM); -691 addMatchingValues(classInformation, value, vendorEvidence); -692 } else if (key.equalsIgnoreCase(BUNDLE_DESCRIPTION)) { -693 foundSomething = true; -694 addDescription(dependency, value, "manifest", key); -695 //productEvidence.addEvidence(source, key, value, Confidence.MEDIUM); -696 addMatchingValues(classInformation, value, productEvidence); -697 } else if (key.equalsIgnoreCase(BUNDLE_NAME)) { -698 foundSomething = true; -699 productEvidence.addEvidence(source, key, value, Confidence.MEDIUM); -700 addMatchingValues(classInformation, value, productEvidence); -701 // //the following caused false positives. -702 // } else if (key.equalsIgnoreCase(BUNDLE_VENDOR)) { +165 private static final String[] EXTENSIONS = {"jar", "war"}; +166 +167 /** +168 * The file filter used to determine which files this analyzer supports. +169 */ +170 private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build(); +171 +172 /** +173 * Returns the FileFilter. +174 * +175 * @return the FileFilter +176 */ +177 @Override +178 protected FileFilter getFileFilter() { +179 return FILTER; +180 } +181 +182 /** +183 * Returns the name of the analyzer. +184 * +185 * @return the name of the analyzer. +186 */ +187 @Override +188 public String getName() { +189 return ANALYZER_NAME; +190 } +191 +192 /** +193 * Returns the phase that the analyzer is intended to run in. +194 * +195 * @return the phase that the analyzer is intended to run in. +196 */ +197 @Override +198 public AnalysisPhase getAnalysisPhase() { +199 return ANALYSIS_PHASE; +200 } +201 //</editor-fold> +202 +203 /** +204 * Returns the key used in the properties file to reference the analyzer's enabled property. +205 * +206 * @return the analyzer's enabled property setting key +207 */ +208 @Override +209 protected String getAnalyzerEnabledSettingKey() { +210 return Settings.KEYS.ANALYZER_JAR_ENABLED; +211 } +212 +213 /** +214 * Loads a specified JAR file and collects information from the manifest and checksums to identify the correct CPE +215 * information. +216 * +217 * @param dependency the dependency to analyze. +218 * @param engine the engine that is scanning the dependencies +219 * @throws AnalysisException is thrown if there is an error reading the JAR file. +220 */ +221 @Override +222 public void analyzeFileType(Dependency dependency, Engine engine) throws AnalysisException { +223 try { +224 final List<ClassNameInformation> classNames = collectClassNames(dependency); +225 final String fileName = dependency.getFileName().toLowerCase(); +226 if (classNames.isEmpty() +227 && (fileName.endsWith("-sources.jar") +228 || fileName.endsWith("-javadoc.jar") +229 || fileName.endsWith("-src.jar") +230 || fileName.endsWith("-doc.jar"))) { +231 engine.getDependencies().remove(dependency); +232 } +233 final boolean hasManifest = parseManifest(dependency, classNames); +234 final boolean hasPOM = analyzePOM(dependency, classNames, engine); +235 final boolean addPackagesAsEvidence = !(hasManifest && hasPOM); +236 analyzePackageNames(classNames, dependency, addPackagesAsEvidence); +237 } catch (IOException ex) { +238 throw new AnalysisException("Exception occurred reading the JAR file.", ex); +239 } +240 } +241 +242 /** +243 * Attempts to find a pom.xml within the JAR file. If found it extracts information and adds it to the evidence. This will +244 * attempt to interpolate the strings contained within the pom.properties if one exists. +245 * +246 * @param dependency the dependency being analyzed +247 * @param classes a collection of class name information +248 * @param engine the analysis engine, used to add additional dependencies +249 * @throws AnalysisException is thrown if there is an exception parsing the pom +250 * @return whether or not evidence was added to the dependency +251 */ +252 protected boolean analyzePOM(Dependency dependency, List<ClassNameInformation> classes, Engine engine) throws AnalysisException { +253 boolean foundSomething = false; +254 final JarFile jar; +255 try { +256 jar = new JarFile(dependency.getActualFilePath()); +257 } catch (IOException ex) { +258 LOGGER.warn("Unable to read JarFile '{}'.", dependency.getActualFilePath()); +259 LOGGER.trace("", ex); +260 return false; +261 } +262 List<String> pomEntries; +263 try { +264 pomEntries = retrievePomListing(jar); +265 } catch (IOException ex) { +266 LOGGER.warn("Unable to read Jar file entries in '{}'.", dependency.getActualFilePath()); +267 LOGGER.trace("", ex); +268 return false; +269 } +270 File externalPom = null; +271 if (pomEntries.isEmpty()) { +272 String pomPath = dependency.getActualFilePath(); +273 pomPath = pomPath.substring(0, pomPath.lastIndexOf('.')) + ".pom"; +274 externalPom = new File(pomPath); +275 if (externalPom.isFile()) { +276 pomEntries.add(pomPath); +277 } else { +278 return false; +279 } +280 } +281 for (String path : pomEntries) { +282 LOGGER.debug("Reading pom entry: {}", path); +283 Properties pomProperties = null; +284 try { +285 if (externalPom == null) { +286 pomProperties = retrievePomProperties(path, jar); +287 } +288 } catch (IOException ex) { +289 LOGGER.trace("ignore this, failed reading a non-existent pom.properties", ex); +290 } +291 Model pom = null; +292 try { +293 if (pomEntries.size() > 1) { +294 //extract POM to its own directory and add it as its own dependency +295 final Dependency newDependency = new Dependency(); +296 pom = extractPom(path, jar, newDependency); +297 +298 final String displayPath = String.format("%s%s%s", +299 dependency.getFilePath(), +300 File.separator, +301 path); +302 final String displayName = String.format("%s%s%s", +303 dependency.getFileName(), +304 File.separator, +305 path); +306 +307 newDependency.setFileName(displayName); +308 newDependency.setFilePath(displayPath); +309 pom.processProperties(pomProperties); +310 setPomEvidence(newDependency, pom, null); +311 engine.getDependencies().add(newDependency); +312 Collections.sort(engine.getDependencies()); +313 } else { +314 if (externalPom == null) { +315 pom = PomUtils.readPom(path, jar); +316 } else { +317 pom = PomUtils.readPom(externalPom); +318 } +319 pom.processProperties(pomProperties); +320 foundSomething |= setPomEvidence(dependency, pom, classes); +321 } +322 } catch (AnalysisException ex) { +323 LOGGER.warn("An error occured while analyzing '{}'.", dependency.getActualFilePath()); +324 LOGGER.trace("", ex); +325 } +326 } +327 return foundSomething; +328 } +329 +330 /** +331 * Given a path to a pom.xml within a JarFile, this method attempts to load a sibling pom.properties if one exists. +332 * +333 * @param path the path to the pom.xml within the JarFile +334 * @param jar the JarFile to load the pom.properties from +335 * @return a Properties object or null if no pom.properties was found +336 * @throws IOException thrown if there is an exception reading the pom.properties +337 */ +338 private Properties retrievePomProperties(String path, final JarFile jar) throws IOException { +339 Properties pomProperties = null; +340 final String propPath = path.substring(0, path.length() - 7) + "pom.properies"; +341 final ZipEntry propEntry = jar.getEntry(propPath); +342 if (propEntry != null) { +343 Reader reader = null; +344 try { +345 reader = new InputStreamReader(jar.getInputStream(propEntry), "UTF-8"); +346 pomProperties = new Properties(); +347 pomProperties.load(reader); +348 LOGGER.debug("Read pom.properties: {}", propPath); +349 } finally { +350 if (reader != null) { +351 try { +352 reader.close(); +353 } catch (IOException ex) { +354 LOGGER.trace("close error", ex); +355 } +356 } +357 } +358 } +359 return pomProperties; +360 } +361 +362 /** +363 * Searches a JarFile for pom.xml entries and returns a listing of these entries. +364 * +365 * @param jar the JarFile to search +366 * @return a list of pom.xml entries +367 * @throws IOException thrown if there is an exception reading a JarEntry +368 */ +369 private List<String> retrievePomListing(final JarFile jar) throws IOException { +370 final List<String> pomEntries = new ArrayList<String>(); +371 final Enumeration<JarEntry> entries = jar.entries(); +372 while (entries.hasMoreElements()) { +373 final JarEntry entry = entries.nextElement(); +374 final String entryName = (new File(entry.getName())).getName().toLowerCase(); +375 if (!entry.isDirectory() && "pom.xml".equals(entryName)) { +376 LOGGER.trace("POM Entry found: {}", entry.getName()); +377 pomEntries.add(entry.getName()); +378 } +379 } +380 return pomEntries; +381 } +382 +383 /** +384 * Retrieves the specified POM from a jar file and converts it to a Model. +385 * +386 * @param path the path to the pom.xml file within the jar file +387 * @param jar the jar file to extract the pom from +388 * @param dependency the dependency being analyzed +389 * @return returns the POM object +390 * @throws AnalysisException is thrown if there is an exception extracting or parsing the POM +391 * {@link org.owasp.dependencycheck.xml.pom.Model} object +392 */ +393 private Model extractPom(String path, JarFile jar, Dependency dependency) throws AnalysisException { +394 InputStream input = null; +395 FileOutputStream fos = null; +396 final File tmpDir = getNextTempDirectory(); +397 final File file = new File(tmpDir, "pom.xml"); +398 try { +399 final ZipEntry entry = jar.getEntry(path); +400 input = jar.getInputStream(entry); +401 fos = new FileOutputStream(file); +402 IOUtils.copy(input, fos); +403 dependency.setActualFilePath(file.getAbsolutePath()); +404 } catch (IOException ex) { +405 LOGGER.warn("An error occurred reading '{}' from '{}'.", path, dependency.getFilePath()); +406 LOGGER.error("", ex); +407 } finally { +408 closeStream(fos); +409 closeStream(input); +410 } +411 return PomUtils.readPom(file); +412 } +413 +414 /** +415 * Silently closes an input stream ignoring errors. +416 * +417 * @param stream an input stream to close +418 */ +419 private void closeStream(InputStream stream) { +420 if (stream != null) { +421 try { +422 stream.close(); +423 } catch (IOException ex) { +424 LOGGER.trace("", ex); +425 } +426 } +427 } +428 +429 /** +430 * Silently closes an output stream ignoring errors. +431 * +432 * @param stream an output stream to close +433 */ +434 private void closeStream(OutputStream stream) { +435 if (stream != null) { +436 try { +437 stream.close(); +438 } catch (IOException ex) { +439 LOGGER.trace("", ex); +440 } +441 } +442 } +443 +444 /** +445 * Sets evidence from the pom on the supplied dependency. +446 * +447 * @param dependency the dependency to set data on +448 * @param pom the information from the pom +449 * @param classes a collection of ClassNameInformation - containing data about the fully qualified class names within the JAR +450 * file being analyzed +451 * @return true if there was evidence within the pom that we could use; otherwise false +452 */ +453 public static boolean setPomEvidence(Dependency dependency, Model pom, List<ClassNameInformation> classes) { +454 boolean foundSomething = false; +455 boolean addAsIdentifier = true; +456 if (pom == null) { +457 return foundSomething; +458 } +459 String groupid = pom.getGroupId(); +460 String parentGroupId = pom.getParentGroupId(); +461 String artifactid = pom.getArtifactId(); +462 String parentArtifactId = pom.getParentArtifactId(); +463 String version = pom.getVersion(); +464 String parentVersion = pom.getParentVersion(); +465 +466 if ("org.sonatype.oss".equals(parentGroupId) && "oss-parent".equals(parentArtifactId)) { +467 parentGroupId = null; +468 parentArtifactId = null; +469 parentVersion = null; +470 } +471 +472 if ((groupid == null || groupid.isEmpty()) && parentGroupId != null && !parentGroupId.isEmpty()) { +473 groupid = parentGroupId; +474 } +475 +476 final String originalGroupID = groupid; +477 if (groupid.startsWith("org.") || groupid.startsWith("com.")) { +478 groupid = groupid.substring(4); +479 } +480 +481 if ((artifactid == null || artifactid.isEmpty()) && parentArtifactId != null && !parentArtifactId.isEmpty()) { +482 artifactid = parentArtifactId; +483 } +484 +485 final String originalArtifactID = artifactid; +486 if (artifactid.startsWith("org.") || artifactid.startsWith("com.")) { +487 artifactid = artifactid.substring(4); +488 } +489 +490 if ((version == null || version.isEmpty()) && parentVersion != null && !parentVersion.isEmpty()) { +491 version = parentVersion; +492 } +493 +494 if (groupid != null && !groupid.isEmpty()) { +495 foundSomething = true; +496 dependency.getVendorEvidence().addEvidence("pom", "groupid", groupid, Confidence.HIGHEST); +497 dependency.getProductEvidence().addEvidence("pom", "groupid", groupid, Confidence.LOW); +498 addMatchingValues(classes, groupid, dependency.getVendorEvidence()); +499 addMatchingValues(classes, groupid, dependency.getProductEvidence()); +500 if (parentGroupId != null && !parentGroupId.isEmpty() && !parentGroupId.equals(groupid)) { +501 dependency.getVendorEvidence().addEvidence("pom", "parent-groupid", parentGroupId, Confidence.MEDIUM); +502 dependency.getProductEvidence().addEvidence("pom", "parent-groupid", parentGroupId, Confidence.LOW); +503 addMatchingValues(classes, parentGroupId, dependency.getVendorEvidence()); +504 addMatchingValues(classes, parentGroupId, dependency.getProductEvidence()); +505 } +506 } else { +507 addAsIdentifier = false; +508 } +509 +510 if (artifactid != null && !artifactid.isEmpty()) { +511 foundSomething = true; +512 dependency.getProductEvidence().addEvidence("pom", "artifactid", artifactid, Confidence.HIGHEST); +513 dependency.getVendorEvidence().addEvidence("pom", "artifactid", artifactid, Confidence.LOW); +514 addMatchingValues(classes, artifactid, dependency.getVendorEvidence()); +515 addMatchingValues(classes, artifactid, dependency.getProductEvidence()); +516 if (parentArtifactId != null && !parentArtifactId.isEmpty() && !parentArtifactId.equals(artifactid)) { +517 dependency.getProductEvidence().addEvidence("pom", "parent-artifactid", parentArtifactId, Confidence.MEDIUM); +518 dependency.getVendorEvidence().addEvidence("pom", "parent-artifactid", parentArtifactId, Confidence.LOW); +519 addMatchingValues(classes, parentArtifactId, dependency.getVendorEvidence()); +520 addMatchingValues(classes, parentArtifactId, dependency.getProductEvidence()); +521 } +522 } else { +523 addAsIdentifier = false; +524 } +525 +526 if (version != null && !version.isEmpty()) { +527 foundSomething = true; +528 dependency.getVersionEvidence().addEvidence("pom", "version", version, Confidence.HIGHEST); +529 if (parentVersion != null && !parentVersion.isEmpty() && !parentVersion.equals(version)) { +530 dependency.getVersionEvidence().addEvidence("pom", "parent-version", version, Confidence.LOW); +531 } +532 } else { +533 addAsIdentifier = false; +534 } +535 +536 if (addAsIdentifier) { +537 dependency.addIdentifier("maven", String.format("%s:%s:%s", originalGroupID, originalArtifactID, version), null, Confidence.HIGH); +538 } +539 +540 // org name +541 final String org = pom.getOrganization(); +542 if (org != null && !org.isEmpty()) { +543 dependency.getVendorEvidence().addEvidence("pom", "organization name", org, Confidence.HIGH); +544 dependency.getProductEvidence().addEvidence("pom", "organization name", org, Confidence.LOW); +545 addMatchingValues(classes, org, dependency.getVendorEvidence()); +546 addMatchingValues(classes, org, dependency.getProductEvidence()); +547 } +548 //pom name +549 final String pomName = pom.getName(); +550 if (pomName +551 != null && !pomName.isEmpty()) { +552 foundSomething = true; +553 dependency.getProductEvidence().addEvidence("pom", "name", pomName, Confidence.HIGH); +554 dependency.getVendorEvidence().addEvidence("pom", "name", pomName, Confidence.HIGH); +555 addMatchingValues(classes, pomName, dependency.getVendorEvidence()); +556 addMatchingValues(classes, pomName, dependency.getProductEvidence()); +557 } +558 +559 //Description +560 final String description = pom.getDescription(); +561 if (description != null && !description.isEmpty() && !description.startsWith("POM was created by")) { +562 foundSomething = true; +563 final String trimmedDescription = addDescription(dependency, description, "pom", "description"); +564 addMatchingValues(classes, trimmedDescription, dependency.getVendorEvidence()); +565 addMatchingValues(classes, trimmedDescription, dependency.getProductEvidence()); +566 } +567 +568 extractLicense(pom, dependency); +569 return foundSomething; +570 } +571 +572 /** +573 * Analyzes the path information of the classes contained within the JarAnalyzer to try and determine possible vendor or +574 * product names. If any are found they are stored in the packageVendor and packageProduct hashSets. +575 * +576 * @param classNames a list of class names +577 * @param dependency a dependency to analyze +578 * @param addPackagesAsEvidence a flag indicating whether or not package names should be added as evidence. +579 */ +580 protected void analyzePackageNames(List<ClassNameInformation> classNames, +581 Dependency dependency, boolean addPackagesAsEvidence) { +582 final Map<String, Integer> vendorIdentifiers = new HashMap<String, Integer>(); +583 final Map<String, Integer> productIdentifiers = new HashMap<String, Integer>(); +584 analyzeFullyQualifiedClassNames(classNames, vendorIdentifiers, productIdentifiers); +585 +586 final int classCount = classNames.size(); +587 final EvidenceCollection vendor = dependency.getVendorEvidence(); +588 final EvidenceCollection product = dependency.getProductEvidence(); +589 +590 for (Map.Entry<String, Integer> entry : vendorIdentifiers.entrySet()) { +591 final float ratio = entry.getValue() / (float) classCount; +592 if (ratio > 0.5) { +593 //TODO remove weighting +594 vendor.addWeighting(entry.getKey()); +595 if (addPackagesAsEvidence && entry.getKey().length() > 1) { +596 vendor.addEvidence("jar", "package name", entry.getKey(), Confidence.LOW); +597 } +598 } +599 } +600 for (Map.Entry<String, Integer> entry : productIdentifiers.entrySet()) { +601 final float ratio = entry.getValue() / (float) classCount; +602 if (ratio > 0.5) { +603 product.addWeighting(entry.getKey()); +604 if (addPackagesAsEvidence && entry.getKey().length() > 1) { +605 product.addEvidence("jar", "package name", entry.getKey(), Confidence.LOW); +606 } +607 } +608 } +609 } +610 +611 /** +612 * <p> +613 * Reads the manifest from the JAR file and collects the entries. Some vendorKey entries are:</p> +614 * <ul><li>Implementation Title</li> +615 * <li>Implementation Version</li> <li>Implementation Vendor</li> +616 * <li>Implementation VendorId</li> <li>Bundle Name</li> <li>Bundle Version</li> <li>Bundle Vendor</li> <li>Bundle +617 * Description</li> <li>Main Class</li> </ul> +618 * However, all but a handful of specific entries are read in. +619 * +620 * @param dependency A reference to the dependency +621 * @param classInformation a collection of class information +622 * @return whether evidence was identified parsing the manifest +623 * @throws IOException if there is an issue reading the JAR file +624 */ +625 protected boolean parseManifest(Dependency dependency, List<ClassNameInformation> classInformation) throws IOException { +626 boolean foundSomething = false; +627 JarFile jar = null; +628 try { +629 jar = new JarFile(dependency.getActualFilePath()); +630 +631 final Manifest manifest = jar.getManifest(); +632 +633 if (manifest == null) { +634 //don't log this for javadoc or sources jar files +635 if (!dependency.getFileName().toLowerCase().endsWith("-sources.jar") +636 && !dependency.getFileName().toLowerCase().endsWith("-javadoc.jar") +637 && !dependency.getFileName().toLowerCase().endsWith("-src.jar") +638 && !dependency.getFileName().toLowerCase().endsWith("-doc.jar")) { +639 LOGGER.debug("Jar file '{}' does not contain a manifest.", +640 dependency.getFileName()); +641 } +642 return false; +643 } +644 final Attributes atts = manifest.getMainAttributes(); +645 +646 final EvidenceCollection vendorEvidence = dependency.getVendorEvidence(); +647 final EvidenceCollection productEvidence = dependency.getProductEvidence(); +648 final EvidenceCollection versionEvidence = dependency.getVersionEvidence(); +649 +650 final String source = "Manifest"; +651 +652 String specificationVersion = null; +653 boolean hasImplementationVersion = false; +654 +655 for (Entry<Object, Object> entry : atts.entrySet()) { +656 String key = entry.getKey().toString(); +657 String value = atts.getValue(key); +658 if (HTML_DETECTION_PATTERN.matcher(value).find()) { +659 value = Jsoup.parse(value).text(); +660 } +661 if (IGNORE_VALUES.contains(value)) { +662 continue; +663 } else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_TITLE.toString())) { +664 foundSomething = true; +665 productEvidence.addEvidence(source, key, value, Confidence.HIGH); +666 addMatchingValues(classInformation, value, productEvidence); +667 } else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_VERSION.toString())) { +668 hasImplementationVersion = true; +669 foundSomething = true; +670 versionEvidence.addEvidence(source, key, value, Confidence.HIGH); +671 } else if ("specification-version".equalsIgnoreCase(key)) { +672 specificationVersion = key; +673 } else if (key.equalsIgnoreCase(Attributes.Name.IMPLEMENTATION_VENDOR.toString())) { +674 foundSomething = true; +675 vendorEvidence.addEvidence(source, key, value, Confidence.HIGH); +676 addMatchingValues(classInformation, value, vendorEvidence); +677 } else if (key.equalsIgnoreCase(IMPLEMENTATION_VENDOR_ID)) { +678 foundSomething = true; +679 vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM); +680 addMatchingValues(classInformation, value, vendorEvidence); +681 } else if (key.equalsIgnoreCase(BUNDLE_DESCRIPTION)) { +682 foundSomething = true; +683 addDescription(dependency, value, "manifest", key); +684 //productEvidence.addEvidence(source, key, value, Confidence.MEDIUM); +685 addMatchingValues(classInformation, value, productEvidence); +686 } else if (key.equalsIgnoreCase(BUNDLE_NAME)) { +687 foundSomething = true; +688 productEvidence.addEvidence(source, key, value, Confidence.MEDIUM); +689 addMatchingValues(classInformation, value, productEvidence); +690 // //the following caused false positives. +691 // } else if (key.equalsIgnoreCase(BUNDLE_VENDOR)) { +692 // foundSomething = true; +693 // vendorEvidence.addEvidence(source, key, value, Confidence.HIGH); +694 // addMatchingValues(classInformation, value, vendorEvidence); +695 } else if (key.equalsIgnoreCase(BUNDLE_VERSION)) { +696 foundSomething = true; +697 versionEvidence.addEvidence(source, key, value, Confidence.HIGH); +698 } else if (key.equalsIgnoreCase(Attributes.Name.MAIN_CLASS.toString())) { +699 continue; +700 //skipping main class as if this has important information to add +701 // it will be added during class name analysis... if other fields +702 // have the information from the class name then they will get added... 703 // foundSomething = true; -704 // vendorEvidence.addEvidence(source, key, value, Confidence.HIGH); -705 // addMatchingValues(classInformation, value, vendorEvidence); -706 } else if (key.equalsIgnoreCase(BUNDLE_VERSION)) { -707 foundSomething = true; -708 versionEvidence.addEvidence(source, key, value, Confidence.HIGH); -709 } else if (key.equalsIgnoreCase(Attributes.Name.MAIN_CLASS.toString())) { -710 continue; -711 //skipping main class as if this has important information to add -712 // it will be added during class name analysis... if other fields -713 // have the information from the class name then they will get added... -714 // foundSomething = true; -715 // productEvidence.addEvidence(source, key, value, Confidence.MEDIUM); -716 // vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM); -717 // addMatchingValues(classInformation, value, vendorEvidence); -718 // addMatchingValues(classInformation, value, productEvidence); -719 } else { -720 key = key.toLowerCase(); -721 -722 if (!IGNORE_KEYS.contains(key) -723 && !key.endsWith("jdk") -724 && !key.contains("lastmodified") -725 && !key.endsWith("package") -726 && !key.endsWith("classpath") -727 && !key.endsWith("class-path") -728 && !key.endsWith("-scm") //todo change this to a regex? -729 && !key.startsWith("scm-") -730 && !value.trim().startsWith("scm:") -731 && !isImportPackage(key, value) -732 && !isPackage(key, value)) { -733 -734 foundSomething = true; -735 if (key.contains("version")) { -736 if (!key.contains("specification")) { -737 //versionEvidence.addEvidence(source, key, value, Confidence.LOW); -738 //} else { -739 versionEvidence.addEvidence(source, key, value, Confidence.MEDIUM); -740 } -741 } else if ("build-id".equals(key)) { -742 int pos = value.indexOf('('); -743 if (pos >= 0) { -744 value = value.substring(0, pos - 1); -745 } -746 pos = value.indexOf('['); -747 if (pos >= 0) { -748 value = value.substring(0, pos - 1); +704 // productEvidence.addEvidence(source, key, value, Confidence.MEDIUM); +705 // vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM); +706 // addMatchingValues(classInformation, value, vendorEvidence); +707 // addMatchingValues(classInformation, value, productEvidence); +708 } else { +709 key = key.toLowerCase(); +710 +711 if (!IGNORE_KEYS.contains(key) +712 && !key.endsWith("jdk") +713 && !key.contains("lastmodified") +714 && !key.endsWith("package") +715 && !key.endsWith("classpath") +716 && !key.endsWith("class-path") +717 && !key.endsWith("-scm") //todo change this to a regex? +718 && !key.startsWith("scm-") +719 && !value.trim().startsWith("scm:") +720 && !isImportPackage(key, value) +721 && !isPackage(key, value)) { +722 +723 foundSomething = true; +724 if (key.contains("version")) { +725 if (!key.contains("specification")) { +726 //versionEvidence.addEvidence(source, key, value, Confidence.LOW); +727 //} else { +728 versionEvidence.addEvidence(source, key, value, Confidence.MEDIUM); +729 } +730 } else if ("build-id".equals(key)) { +731 int pos = value.indexOf('('); +732 if (pos >= 0) { +733 value = value.substring(0, pos - 1); +734 } +735 pos = value.indexOf('['); +736 if (pos >= 0) { +737 value = value.substring(0, pos - 1); +738 } +739 versionEvidence.addEvidence(source, key, value, Confidence.MEDIUM); +740 } else if (key.contains("title")) { +741 productEvidence.addEvidence(source, key, value, Confidence.MEDIUM); +742 addMatchingValues(classInformation, value, productEvidence); +743 } else if (key.contains("vendor")) { +744 if (key.contains("specification")) { +745 vendorEvidence.addEvidence(source, key, value, Confidence.LOW); +746 } else { +747 vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM); +748 addMatchingValues(classInformation, value, vendorEvidence); 749 } -750 versionEvidence.addEvidence(source, key, value, Confidence.MEDIUM); -751 } else if (key.contains("title")) { -752 productEvidence.addEvidence(source, key, value, Confidence.MEDIUM); -753 addMatchingValues(classInformation, value, productEvidence); -754 } else if (key.contains("vendor")) { -755 if (key.contains("specification")) { -756 vendorEvidence.addEvidence(source, key, value, Confidence.LOW); -757 } else { -758 vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM); -759 addMatchingValues(classInformation, value, vendorEvidence); -760 } -761 } else if (key.contains("name")) { -762 productEvidence.addEvidence(source, key, value, Confidence.MEDIUM); -763 vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM); -764 addMatchingValues(classInformation, value, vendorEvidence); -765 addMatchingValues(classInformation, value, productEvidence); -766 } else if (key.contains("license")) { -767 addLicense(dependency, value); -768 } else { -769 if (key.contains("description")) { -770 addDescription(dependency, value, "manifest", key); -771 } else { -772 productEvidence.addEvidence(source, key, value, Confidence.LOW); -773 vendorEvidence.addEvidence(source, key, value, Confidence.LOW); -774 addMatchingValues(classInformation, value, vendorEvidence); -775 addMatchingValues(classInformation, value, productEvidence); -776 if (value.matches(".*\\d.*")) { -777 final StringTokenizer tokenizer = new StringTokenizer(value, " "); -778 while (tokenizer.hasMoreElements()) { -779 final String s = tokenizer.nextToken(); -780 if (s.matches("^[0-9.]+$")) { -781 versionEvidence.addEvidence(source, key, s, Confidence.LOW); -782 } -783 } -784 } -785 } -786 } -787 } -788 } -789 } -790 if (specificationVersion != null && !hasImplementationVersion) { -791 foundSomething = true; -792 versionEvidence.addEvidence(source, "specificationn-version", specificationVersion, Confidence.HIGH); -793 } -794 } finally { -795 if (jar != null) { -796 jar.close(); -797 } -798 } -799 return foundSomething; -800 } -801 -802 /** -803 * Adds a description to the given dependency. If the description contains one of the following strings beyond 100 characters, -804 * then the description used will be trimmed to that position: -805 * <ul><li>"such as"</li><li>"like "</li><li>"will use "</li><li>"* uses "</li></ul> -806 * -807 * @param dependency a dependency -808 * @param description the description -809 * @param source the source of the evidence -810 * @param key the "name" of the evidence -811 * @return if the description is trimmed, the trimmed version is returned; otherwise the original description is returned -812 */ -813 public static String addDescription(Dependency dependency, String description, String source, String key) { -814 if (dependency.getDescription() == null) { -815 dependency.setDescription(description); -816 } -817 String desc; -818 if (HTML_DETECTION_PATTERN.matcher(description).find()) { -819 desc = Jsoup.parse(description).text(); -820 } else { -821 desc = description; -822 } -823 dependency.setDescription(desc); -824 if (desc.length() > 100) { -825 desc = desc.replaceAll("\\s\\s+", " "); -826 final int posSuchAs = desc.toLowerCase().indexOf("such as ", 100); -827 final int posLike = desc.toLowerCase().indexOf("like ", 100); -828 final int posWillUse = desc.toLowerCase().indexOf("will use ", 100); -829 final int posUses = desc.toLowerCase().indexOf(" uses ", 100); -830 int pos = -1; -831 pos = Math.max(pos, posSuchAs); -832 if (pos >= 0 && posLike >= 0) { -833 pos = Math.min(pos, posLike); -834 } else { -835 pos = Math.max(pos, posLike); -836 } -837 if (pos >= 0 && posWillUse >= 0) { -838 pos = Math.min(pos, posWillUse); -839 } else { -840 pos = Math.max(pos, posWillUse); -841 } -842 if (pos >= 0 && posUses >= 0) { -843 pos = Math.min(pos, posUses); -844 } else { -845 pos = Math.max(pos, posUses); -846 } -847 -848 if (pos > 0) { -849 final StringBuilder sb = new StringBuilder(pos + 3); -850 sb.append(desc.substring(0, pos)); -851 sb.append("..."); -852 desc = sb.toString(); -853 } -854 dependency.getProductEvidence().addEvidence(source, key, desc, Confidence.LOW); -855 dependency.getVendorEvidence().addEvidence(source, key, desc, Confidence.LOW); -856 } else { -857 dependency.getProductEvidence().addEvidence(source, key, desc, Confidence.MEDIUM); -858 dependency.getVendorEvidence().addEvidence(source, key, desc, Confidence.MEDIUM); -859 } -860 return desc; -861 } -862 -863 /** -864 * Adds a license to the given dependency. -865 * -866 * @param d a dependency -867 * @param license the license +750 } else if (key.contains("name")) { +751 productEvidence.addEvidence(source, key, value, Confidence.MEDIUM); +752 vendorEvidence.addEvidence(source, key, value, Confidence.MEDIUM); +753 addMatchingValues(classInformation, value, vendorEvidence); +754 addMatchingValues(classInformation, value, productEvidence); +755 } else if (key.contains("license")) { +756 addLicense(dependency, value); +757 } else { +758 if (key.contains("description")) { +759 addDescription(dependency, value, "manifest", key); +760 } else { +761 productEvidence.addEvidence(source, key, value, Confidence.LOW); +762 vendorEvidence.addEvidence(source, key, value, Confidence.LOW); +763 addMatchingValues(classInformation, value, vendorEvidence); +764 addMatchingValues(classInformation, value, productEvidence); +765 if (value.matches(".*\\d.*")) { +766 final StringTokenizer tokenizer = new StringTokenizer(value, " "); +767 while (tokenizer.hasMoreElements()) { +768 final String s = tokenizer.nextToken(); +769 if (s.matches("^[0-9.]+$")) { +770 versionEvidence.addEvidence(source, key, s, Confidence.LOW); +771 } +772 } +773 } +774 } +775 } +776 } +777 } +778 } +779 if (specificationVersion != null && !hasImplementationVersion) { +780 foundSomething = true; +781 versionEvidence.addEvidence(source, "specificationn-version", specificationVersion, Confidence.HIGH); +782 } +783 } finally { +784 if (jar != null) { +785 jar.close(); +786 } +787 } +788 return foundSomething; +789 } +790 +791 /** +792 * Adds a description to the given dependency. If the description contains one of the following strings beyond 100 characters, +793 * then the description used will be trimmed to that position: +794 * <ul><li>"such as"</li><li>"like "</li><li>"will use "</li><li>"* uses "</li></ul> +795 * +796 * @param dependency a dependency +797 * @param description the description +798 * @param source the source of the evidence +799 * @param key the "name" of the evidence +800 * @return if the description is trimmed, the trimmed version is returned; otherwise the original description is returned +801 */ +802 public static String addDescription(Dependency dependency, String description, String source, String key) { +803 if (dependency.getDescription() == null) { +804 dependency.setDescription(description); +805 } +806 String desc; +807 if (HTML_DETECTION_PATTERN.matcher(description).find()) { +808 desc = Jsoup.parse(description).text(); +809 } else { +810 desc = description; +811 } +812 dependency.setDescription(desc); +813 if (desc.length() > 100) { +814 desc = desc.replaceAll("\\s\\s+", " "); +815 final int posSuchAs = desc.toLowerCase().indexOf("such as ", 100); +816 final int posLike = desc.toLowerCase().indexOf("like ", 100); +817 final int posWillUse = desc.toLowerCase().indexOf("will use ", 100); +818 final int posUses = desc.toLowerCase().indexOf(" uses ", 100); +819 int pos = -1; +820 pos = Math.max(pos, posSuchAs); +821 if (pos >= 0 && posLike >= 0) { +822 pos = Math.min(pos, posLike); +823 } else { +824 pos = Math.max(pos, posLike); +825 } +826 if (pos >= 0 && posWillUse >= 0) { +827 pos = Math.min(pos, posWillUse); +828 } else { +829 pos = Math.max(pos, posWillUse); +830 } +831 if (pos >= 0 && posUses >= 0) { +832 pos = Math.min(pos, posUses); +833 } else { +834 pos = Math.max(pos, posUses); +835 } +836 +837 if (pos > 0) { +838 final StringBuilder sb = new StringBuilder(pos + 3); +839 sb.append(desc.substring(0, pos)); +840 sb.append("..."); +841 desc = sb.toString(); +842 } +843 dependency.getProductEvidence().addEvidence(source, key, desc, Confidence.LOW); +844 dependency.getVendorEvidence().addEvidence(source, key, desc, Confidence.LOW); +845 } else { +846 dependency.getProductEvidence().addEvidence(source, key, desc, Confidence.MEDIUM); +847 dependency.getVendorEvidence().addEvidence(source, key, desc, Confidence.MEDIUM); +848 } +849 return desc; +850 } +851 +852 /** +853 * Adds a license to the given dependency. +854 * +855 * @param d a dependency +856 * @param license the license +857 */ +858 private void addLicense(Dependency d, String license) { +859 if (d.getLicense() == null) { +860 d.setLicense(license); +861 } else if (!d.getLicense().contains(license)) { +862 d.setLicense(d.getLicense() + NEWLINE + license); +863 } +864 } +865 +866 /** +867 * The parent directory for the individual directories per archive. 868 */ -869 private void addLicense(Dependency d, String license) { -870 if (d.getLicense() == null) { -871 d.setLicense(license); -872 } else if (!d.getLicense().contains(license)) { -873 d.setLicense(d.getLicense() + NEWLINE + license); -874 } -875 } -876 -877 /** -878 * The parent directory for the individual directories per archive. -879 */ -880 private File tempFileLocation = null; -881 -882 /** -883 * Initializes the JarAnalyzer. -884 * -885 * @throws Exception is thrown if there is an exception creating a temporary directory -886 */ -887 @Override -888 public void initializeFileTypeAnalyzer() throws Exception { -889 final File baseDir = Settings.getTempDirectory(); -890 tempFileLocation = File.createTempFile("check", "tmp", baseDir); -891 if (!tempFileLocation.delete()) { -892 final String msg = String.format("Unable to delete temporary file '%s'.", tempFileLocation.getAbsolutePath()); -893 throw new AnalysisException(msg); -894 } -895 if (!tempFileLocation.mkdirs()) { -896 final String msg = String.format("Unable to create directory '%s'.", tempFileLocation.getAbsolutePath()); -897 throw new AnalysisException(msg); -898 } -899 } -900 -901 /** -902 * Deletes any files extracted from the JAR during analysis. -903 */ -904 @Override -905 public void close() { -906 if (tempFileLocation != null && tempFileLocation.exists()) { -907 LOGGER.debug("Attempting to delete temporary files"); -908 final boolean success = FileUtils.delete(tempFileLocation); -909 if (!success) { -910 LOGGER.warn("Failed to delete some temporary files, see the log for more details"); -911 } -912 } -913 } -914 -915 /** -916 * Determines if the key value pair from the manifest is for an "import" type entry for package names. -917 * -918 * @param key the key from the manifest -919 * @param value the value from the manifest -920 * @return true or false depending on if it is believed the entry is an "import" entry -921 */ -922 private boolean isImportPackage(String key, String value) { -923 final Pattern packageRx = Pattern.compile("^([a-zA-Z0-9_#\\$\\*\\.]+\\s*[,;]\\s*)+([a-zA-Z0-9_#\\$\\*\\.]+\\s*)?$"); -924 final boolean matches = packageRx.matcher(value).matches(); -925 return matches && (key.contains("import") || key.contains("include") || value.length() > 10); -926 } -927 -928 /** -929 * Cycles through an enumeration of JarEntries, contained within the dependency, and returns a list of the class names. This -930 * does not include core Java package names (i.e. java.* or javax.*). -931 * -932 * @param dependency the dependency being analyzed -933 * @return an list of fully qualified class names -934 */ -935 private List<ClassNameInformation> collectClassNames(Dependency dependency) { -936 final List<ClassNameInformation> classNames = new ArrayList<ClassNameInformation>(); -937 JarFile jar = null; -938 try { -939 jar = new JarFile(dependency.getActualFilePath()); -940 final Enumeration<JarEntry> entries = jar.entries(); -941 while (entries.hasMoreElements()) { -942 final JarEntry entry = entries.nextElement(); -943 final String name = entry.getName().toLowerCase(); -944 //no longer stripping "|com\\.sun" - there are some com.sun jar files with CVEs. -945 if (name.endsWith(".class") && !name.matches("^javax?\\..*$")) { -946 final ClassNameInformation className = new ClassNameInformation(name.substring(0, name.length() - 6)); -947 classNames.add(className); +869 private File tempFileLocation = null; +870 +871 /** +872 * Initializes the JarAnalyzer. +873 * +874 * @throws Exception is thrown if there is an exception creating a temporary directory +875 */ +876 @Override +877 public void initializeFileTypeAnalyzer() throws Exception { +878 final File baseDir = Settings.getTempDirectory(); +879 tempFileLocation = File.createTempFile("check", "tmp", baseDir); +880 if (!tempFileLocation.delete()) { +881 final String msg = String.format("Unable to delete temporary file '%s'.", tempFileLocation.getAbsolutePath()); +882 throw new AnalysisException(msg); +883 } +884 if (!tempFileLocation.mkdirs()) { +885 final String msg = String.format("Unable to create directory '%s'.", tempFileLocation.getAbsolutePath()); +886 throw new AnalysisException(msg); +887 } +888 } +889 +890 /** +891 * Deletes any files extracted from the JAR during analysis. +892 */ +893 @Override +894 public void close() { +895 if (tempFileLocation != null && tempFileLocation.exists()) { +896 LOGGER.debug("Attempting to delete temporary files"); +897 final boolean success = FileUtils.delete(tempFileLocation); +898 if (!success) { +899 LOGGER.warn("Failed to delete some temporary files, see the log for more details"); +900 } +901 } +902 } +903 +904 /** +905 * Determines if the key value pair from the manifest is for an "import" type entry for package names. +906 * +907 * @param key the key from the manifest +908 * @param value the value from the manifest +909 * @return true or false depending on if it is believed the entry is an "import" entry +910 */ +911 private boolean isImportPackage(String key, String value) { +912 final Pattern packageRx = Pattern.compile("^([a-zA-Z0-9_#\\$\\*\\.]+\\s*[,;]\\s*)+([a-zA-Z0-9_#\\$\\*\\.]+\\s*)?$"); +913 final boolean matches = packageRx.matcher(value).matches(); +914 return matches && (key.contains("import") || key.contains("include") || value.length() > 10); +915 } +916 +917 /** +918 * Cycles through an enumeration of JarEntries, contained within the dependency, and returns a list of the class names. This +919 * does not include core Java package names (i.e. java.* or javax.*). +920 * +921 * @param dependency the dependency being analyzed +922 * @return an list of fully qualified class names +923 */ +924 private List<ClassNameInformation> collectClassNames(Dependency dependency) { +925 final List<ClassNameInformation> classNames = new ArrayList<ClassNameInformation>(); +926 JarFile jar = null; +927 try { +928 jar = new JarFile(dependency.getActualFilePath()); +929 final Enumeration<JarEntry> entries = jar.entries(); +930 while (entries.hasMoreElements()) { +931 final JarEntry entry = entries.nextElement(); +932 final String name = entry.getName().toLowerCase(); +933 //no longer stripping "|com\\.sun" - there are some com.sun jar files with CVEs. +934 if (name.endsWith(".class") && !name.matches("^javax?\\..*$")) { +935 final ClassNameInformation className = new ClassNameInformation(name.substring(0, name.length() - 6)); +936 classNames.add(className); +937 } +938 } +939 } catch (IOException ex) { +940 LOGGER.warn("Unable to open jar file '{}'.", dependency.getFileName()); +941 LOGGER.debug("", ex); +942 } finally { +943 if (jar != null) { +944 try { +945 jar.close(); +946 } catch (IOException ex) { +947 LOGGER.trace("", ex); 948 } 949 } -950 } catch (IOException ex) { -951 LOGGER.warn("Unable to open jar file '{}'.", dependency.getFileName()); -952 LOGGER.debug("", ex); -953 } finally { -954 if (jar != null) { -955 try { -956 jar.close(); -957 } catch (IOException ex) { -958 LOGGER.trace("", ex); -959 } -960 } -961 } -962 return classNames; -963 } -964 -965 /** -966 * Cycles through the list of class names and places the package levels 0-3 into the provided maps for vendor and product. -967 * This is helpful when analyzing vendor/product as many times this is included in the package name. -968 * -969 * @param classNames a list of class names -970 * @param vendor HashMap of possible vendor names from package names (e.g. owasp) -971 * @param product HashMap of possible product names from package names (e.g. dependencycheck) -972 */ -973 private void analyzeFullyQualifiedClassNames(List<ClassNameInformation> classNames, -974 Map<String, Integer> vendor, Map<String, Integer> product) { -975 for (ClassNameInformation entry : classNames) { -976 final List<String> list = entry.getPackageStructure(); -977 addEntry(vendor, list.get(0)); -978 -979 if (list.size() == 2) { -980 addEntry(product, list.get(1)); -981 } -982 if (list.size() == 3) { -983 addEntry(vendor, list.get(1)); -984 addEntry(product, list.get(1)); -985 addEntry(product, list.get(2)); -986 } -987 if (list.size() >= 4) { -988 addEntry(vendor, list.get(1)); -989 addEntry(vendor, list.get(2)); -990 addEntry(product, list.get(1)); -991 addEntry(product, list.get(2)); -992 addEntry(product, list.get(3)); -993 } -994 } -995 } -996 -997 /** -998 * Adds an entry to the specified collection and sets the Integer (e.g. the count) to 1. If the entry already exists in the -999 * collection then the Integer is incremented by 1. -1000 * -1001 * @param collection a collection of strings and their occurrence count -1002 * @param key the key to add to the collection -1003 */ -1004 private void addEntry(Map<String, Integer> collection, String key) { -1005 if (collection.containsKey(key)) { -1006 collection.put(key, collection.get(key) + 1); -1007 } else { -1008 collection.put(key, 1); -1009 } -1010 } -1011 -1012 /** -1013 * Cycles through the collection of class name information to see if parts of the package names are contained in the provided -1014 * value. If found, it will be added as the HIGHEST confidence evidence because we have more then one source corroborating the -1015 * value. -1016 * -1017 * @param classes a collection of class name information -1018 * @param value the value to check to see if it contains a package name -1019 * @param evidence the evidence collection to add new entries too -1020 */ -1021 private static void addMatchingValues(List<ClassNameInformation> classes, String value, EvidenceCollection evidence) { -1022 if (value == null || value.isEmpty() || classes == null || classes.isEmpty()) { -1023 return; -1024 } -1025 final String text = value.toLowerCase(); -1026 for (ClassNameInformation cni : classes) { -1027 for (String key : cni.getPackageStructure()) { -1028 if (text.contains(key)) { //note, package structure elements are already lowercase. -1029 evidence.addEvidence("jar", "package name", key, Confidence.HIGHEST); -1030 } -1031 } -1032 } -1033 } -1034 -1035 /** -1036 * Simple check to see if the attribute from a manifest is just a package name. -1037 * -1038 * @param key the key of the value to check -1039 * @param value the value to check -1040 * @return true if the value looks like a java package name, otherwise false -1041 */ -1042 private boolean isPackage(String key, String value) { -1043 -1044 return !key.matches(".*(version|title|vendor|name|license|description).*") -1045 && value.matches("^([a-zA-Z_][a-zA-Z0-9_\\$]*(\\.[a-zA-Z_][a-zA-Z0-9_\\$]*)*)?$"); -1046 -1047 } -1048 -1049 /** -1050 * Extracts the license information from the pom and adds it to the dependency. -1051 * -1052 * @param pom the pom object -1053 * @param dependency the dependency to add license information too -1054 */ -1055 public static void extractLicense(Model pom, Dependency dependency) { -1056 //license -1057 if (pom.getLicenses() != null) { -1058 String license = null; -1059 for (License lic : pom.getLicenses()) { -1060 String tmp = null; -1061 if (lic.getName() != null) { -1062 tmp = lic.getName(); -1063 } -1064 if (lic.getUrl() != null) { -1065 if (tmp == null) { -1066 tmp = lic.getUrl(); -1067 } else { -1068 tmp += ": " + lic.getUrl(); -1069 } +950 } +951 return classNames; +952 } +953 +954 /** +955 * Cycles through the list of class names and places the package levels 0-3 into the provided maps for vendor and product. +956 * This is helpful when analyzing vendor/product as many times this is included in the package name. +957 * +958 * @param classNames a list of class names +959 * @param vendor HashMap of possible vendor names from package names (e.g. owasp) +960 * @param product HashMap of possible product names from package names (e.g. dependencycheck) +961 */ +962 private void analyzeFullyQualifiedClassNames(List<ClassNameInformation> classNames, +963 Map<String, Integer> vendor, Map<String, Integer> product) { +964 for (ClassNameInformation entry : classNames) { +965 final List<String> list = entry.getPackageStructure(); +966 addEntry(vendor, list.get(0)); +967 +968 if (list.size() == 2) { +969 addEntry(product, list.get(1)); +970 } +971 if (list.size() == 3) { +972 addEntry(vendor, list.get(1)); +973 addEntry(product, list.get(1)); +974 addEntry(product, list.get(2)); +975 } +976 if (list.size() >= 4) { +977 addEntry(vendor, list.get(1)); +978 addEntry(vendor, list.get(2)); +979 addEntry(product, list.get(1)); +980 addEntry(product, list.get(2)); +981 addEntry(product, list.get(3)); +982 } +983 } +984 } +985 +986 /** +987 * Adds an entry to the specified collection and sets the Integer (e.g. the count) to 1. If the entry already exists in the +988 * collection then the Integer is incremented by 1. +989 * +990 * @param collection a collection of strings and their occurrence count +991 * @param key the key to add to the collection +992 */ +993 private void addEntry(Map<String, Integer> collection, String key) { +994 if (collection.containsKey(key)) { +995 collection.put(key, collection.get(key) + 1); +996 } else { +997 collection.put(key, 1); +998 } +999 } +1000 +1001 /** +1002 * Cycles through the collection of class name information to see if parts of the package names are contained in the provided +1003 * value. If found, it will be added as the HIGHEST confidence evidence because we have more then one source corroborating the +1004 * value. +1005 * +1006 * @param classes a collection of class name information +1007 * @param value the value to check to see if it contains a package name +1008 * @param evidence the evidence collection to add new entries too +1009 */ +1010 private static void addMatchingValues(List<ClassNameInformation> classes, String value, EvidenceCollection evidence) { +1011 if (value == null || value.isEmpty() || classes == null || classes.isEmpty()) { +1012 return; +1013 } +1014 final String text = value.toLowerCase(); +1015 for (ClassNameInformation cni : classes) { +1016 for (String key : cni.getPackageStructure()) { +1017 if (text.contains(key)) { //note, package structure elements are already lowercase. +1018 evidence.addEvidence("jar", "package name", key, Confidence.HIGHEST); +1019 } +1020 } +1021 } +1022 } +1023 +1024 /** +1025 * Simple check to see if the attribute from a manifest is just a package name. +1026 * +1027 * @param key the key of the value to check +1028 * @param value the value to check +1029 * @return true if the value looks like a java package name, otherwise false +1030 */ +1031 private boolean isPackage(String key, String value) { +1032 +1033 return !key.matches(".*(version|title|vendor|name|license|description).*") +1034 && value.matches("^([a-zA-Z_][a-zA-Z0-9_\\$]*(\\.[a-zA-Z_][a-zA-Z0-9_\\$]*)*)?$"); +1035 +1036 } +1037 +1038 /** +1039 * Extracts the license information from the pom and adds it to the dependency. +1040 * +1041 * @param pom the pom object +1042 * @param dependency the dependency to add license information too +1043 */ +1044 public static void extractLicense(Model pom, Dependency dependency) { +1045 //license +1046 if (pom.getLicenses() != null) { +1047 String license = null; +1048 for (License lic : pom.getLicenses()) { +1049 String tmp = null; +1050 if (lic.getName() != null) { +1051 tmp = lic.getName(); +1052 } +1053 if (lic.getUrl() != null) { +1054 if (tmp == null) { +1055 tmp = lic.getUrl(); +1056 } else { +1057 tmp += ": " + lic.getUrl(); +1058 } +1059 } +1060 if (tmp == null) { +1061 continue; +1062 } +1063 if (HTML_DETECTION_PATTERN.matcher(tmp).find()) { +1064 tmp = Jsoup.parse(tmp).text(); +1065 } +1066 if (license == null) { +1067 license = tmp; +1068 } else { +1069 license += "\n" + tmp; 1070 } -1071 if (tmp == null) { -1072 continue; -1073 } -1074 if (HTML_DETECTION_PATTERN.matcher(tmp).find()) { -1075 tmp = Jsoup.parse(tmp).text(); -1076 } -1077 if (license == null) { -1078 license = tmp; -1079 } else { -1080 license += "\n" + tmp; -1081 } -1082 } -1083 if (license != null) { -1084 dependency.setLicense(license); -1085 -1086 } -1087 } -1088 } -1089 -1090 /** -1091 * Stores information about a class name. -1092 */ -1093 protected static class ClassNameInformation { -1094 -1095 /** -1096 * <p> -1097 * Stores information about a given class name. This class will keep the fully qualified class name and a list of the -1098 * important parts of the package structure. Up to the first four levels of the package structure are stored, excluding a -1099 * leading "org" or "com". Example:</p> -1100 * <code>ClassNameInformation obj = new ClassNameInformation("org.owasp.dependencycheck.analyzer.JarAnalyzer"); -1101 * System.out.println(obj.getName()); -1102 * for (String p : obj.getPackageStructure()) -1103 * System.out.println(p); -1104 * </code> -1105 * <p> -1106 * Would result in:</p> -1107 * <code>org.owasp.dependencycheck.analyzer.JarAnalyzer -1108 * owasp -1109 * dependencycheck -1110 * analyzer -1111 * jaranalyzer</code> -1112 * -1113 * @param className a fully qualified class name -1114 */ -1115 ClassNameInformation(String className) { -1116 name = className; -1117 if (name.contains("/")) { -1118 final String[] tmp = className.toLowerCase().split("/"); -1119 int start = 0; -1120 int end = 3; -1121 if ("com".equals(tmp[0]) || "org".equals(tmp[0])) { -1122 start = 1; -1123 end = 4; -1124 } -1125 if (tmp.length <= end) { -1126 end = tmp.length - 1; -1127 } -1128 for (int i = start; i <= end; i++) { -1129 packageStructure.add(tmp[i]); -1130 } -1131 } else { -1132 packageStructure.add(name); -1133 } -1134 } -1135 /** -1136 * The fully qualified class name. -1137 */ -1138 private String name; -1139 -1140 /** -1141 * Get the value of name -1142 * -1143 * @return the value of name -1144 */ -1145 public String getName() { -1146 return name; -1147 } -1148 -1149 /** -1150 * Set the value of name -1151 * -1152 * @param name new value of name -1153 */ -1154 public void setName(String name) { -1155 this.name = name; -1156 } -1157 /** -1158 * Up to the first four levels of the package structure, excluding a leading "org" or "com". -1159 */ -1160 private final ArrayList<String> packageStructure = new ArrayList<String>(); -1161 -1162 /** -1163 * Get the value of packageStructure -1164 * -1165 * @return the value of packageStructure -1166 */ -1167 public ArrayList<String> getPackageStructure() { -1168 return packageStructure; -1169 } -1170 } -1171 -1172 /** -1173 * Retrieves the next temporary directory to extract an archive too. -1174 * -1175 * @return a directory -1176 * @throws AnalysisException thrown if unable to create temporary directory -1177 */ -1178 private File getNextTempDirectory() throws AnalysisException { -1179 dirCount += 1; -1180 final File directory = new File(tempFileLocation, String.valueOf(dirCount)); -1181 //getting an exception for some directories not being able to be created; might be because the directory already exists? -1182 if (directory.exists()) { -1183 return getNextTempDirectory(); -1184 } -1185 if (!directory.mkdirs()) { -1186 final String msg = String.format("Unable to create temp directory '%s'.", directory.getAbsolutePath()); -1187 throw new AnalysisException(msg); -1188 } -1189 return directory; -1190 } -1191 } +1071 } +1072 if (license != null) { +1073 dependency.setLicense(license); +1074 +1075 } +1076 } +1077 } +1078 +1079 /** +1080 * Stores information about a class name. +1081 */ +1082 protected static class ClassNameInformation { +1083 +1084 /** +1085 * <p> +1086 * Stores information about a given class name. This class will keep the fully qualified class name and a list of the +1087 * important parts of the package structure. Up to the first four levels of the package structure are stored, excluding a +1088 * leading "org" or "com". Example:</p> +1089 * <code>ClassNameInformation obj = new ClassNameInformation("org.owasp.dependencycheck.analyzer.JarAnalyzer"); +1090 * System.out.println(obj.getName()); +1091 * for (String p : obj.getPackageStructure()) +1092 * System.out.println(p); +1093 * </code> +1094 * <p> +1095 * Would result in:</p> +1096 * <code>org.owasp.dependencycheck.analyzer.JarAnalyzer +1097 * owasp +1098 * dependencycheck +1099 * analyzer +1100 * jaranalyzer</code> +1101 * +1102 * @param className a fully qualified class name +1103 */ +1104 ClassNameInformation(String className) { +1105 name = className; +1106 if (name.contains("/")) { +1107 final String[] tmp = className.toLowerCase().split("/"); +1108 int start = 0; +1109 int end = 3; +1110 if ("com".equals(tmp[0]) || "org".equals(tmp[0])) { +1111 start = 1; +1112 end = 4; +1113 } +1114 if (tmp.length <= end) { +1115 end = tmp.length - 1; +1116 } +1117 for (int i = start; i <= end; i++) { +1118 packageStructure.add(tmp[i]); +1119 } +1120 } else { +1121 packageStructure.add(name); +1122 } +1123 } +1124 /** +1125 * The fully qualified class name. +1126 */ +1127 private String name; +1128 +1129 /** +1130 * Get the value of name +1131 * +1132 * @return the value of name +1133 */ +1134 public String getName() { +1135 return name; +1136 } +1137 +1138 /** +1139 * Set the value of name +1140 * +1141 * @param name new value of name +1142 */ +1143 public void setName(String name) { +1144 this.name = name; +1145 } +1146 /** +1147 * Up to the first four levels of the package structure, excluding a leading "org" or "com". +1148 */ +1149 private final ArrayList<String> packageStructure = new ArrayList<String>(); +1150 +1151 /** +1152 * Get the value of packageStructure +1153 * +1154 * @return the value of packageStructure +1155 */ +1156 public ArrayList<String> getPackageStructure() { +1157 return packageStructure; +1158 } +1159 } +1160 +1161 /** +1162 * Retrieves the next temporary directory to extract an archive too. +1163 * +1164 * @return a directory +1165 * @throws AnalysisException thrown if unable to create temporary directory +1166 */ +1167 private File getNextTempDirectory() throws AnalysisException { +1168 dirCount += 1; +1169 final File directory = new File(tempFileLocation, String.valueOf(dirCount)); +1170 //getting an exception for some directories not being able to be created; might be because the directory already exists? +1171 if (directory.exists()) { +1172 return getNextTempDirectory(); +1173 } +1174 if (!directory.mkdirs()) { +1175 final String msg = String.format("Unable to create temp directory '%s'.", directory.getAbsolutePath()); +1176 throw new AnalysisException(msg); +1177 } +1178 return directory; +1179 } +1180 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/NexusAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/NexusAnalyzer.html index b388a48f3..a0fc78551 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/NexusAnalyzer.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/NexusAnalyzer.html @@ -255,7 +255,7 @@ 247 } 248 } catch (IllegalArgumentException iae) { 249 //dependency.addAnalysisException(new AnalysisException("Invalid SHA-1")); -250 LOGGER.info(String.format("invalid sha-1 hash on %s", dependency.getFileName())); +250 LOGGER.info("invalid sha-1 hash on {}", dependency.getFileName()); 251 } catch (FileNotFoundException fnfe) { 252 //dependency.addAnalysisException(new AnalysisException("Artifact not found on repository")); 253 LOGGER.debug("Artifact not found in repository '{}'", dependency.getFileName()); diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/NodePackageAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/NodePackageAnalyzer.html new file mode 100644 index 000000000..22ed53e98 --- /dev/null +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/NodePackageAnalyzer.html @@ -0,0 +1,200 @@ + + + +NodePackageAnalyzer xref + + + +
    +1   /*
    +2    * This file is part of dependency-check-core.
    +3    *
    +4    * Licensed under the Apache License, Version 2.0 (the "License");
    +5    * you may not use this file except in compliance with the License.
    +6    * You may obtain a copy of the License at
    +7    *
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
    +9    *
    +10   * Unless required by applicable law or agreed to in writing, software
    +11   * distributed under the License is distributed on an "AS IS" BASIS,
    +12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +13   * See the License for the specific language governing permissions and
    +14   * limitations under the License.
    +15   *
    +16   * Copyright (c) 2015 Institute for Defense Analyses. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.analyzer;
    +19  
    +20  import org.apache.commons.io.FileUtils;
    +21  import org.owasp.dependencycheck.Engine;
    +22  import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
    +23  import org.owasp.dependencycheck.dependency.Confidence;
    +24  import org.owasp.dependencycheck.dependency.Dependency;
    +25  import org.owasp.dependencycheck.dependency.EvidenceCollection;
    +26  import org.owasp.dependencycheck.utils.FileFilterBuilder;
    +27  import org.owasp.dependencycheck.utils.Settings;
    +28  import org.slf4j.Logger;
    +29  import org.slf4j.LoggerFactory;
    +30  
    +31  import java.io.File;
    +32  import java.io.FileFilter;
    +33  import java.io.IOException;
    +34  import java.util.Map;
    +35  import javax.json.Json;
    +36  import javax.json.JsonException;
    +37  import javax.json.JsonObject;
    +38  import javax.json.JsonReader;
    +39  import javax.json.JsonString;
    +40  import javax.json.JsonValue;
    +41  
    +42  /**
    +43   * Used to analyze Node Package Manager (npm) package.json files, and collect information that can be used to determine the
    +44   * associated CPE.
    +45   *
    +46   * @author Dale Visser <dvisser@ida.org>
    +47   */
    +48  public class NodePackageAnalyzer extends AbstractFileTypeAnalyzer {
    +49  
    +50      /**
    +51       * The logger.
    +52       */
    +53      private static final Logger LOGGER = LoggerFactory.getLogger(NodePackageAnalyzer.class);
    +54  
    +55      /**
    +56       * The name of the analyzer.
    +57       */
    +58      private static final String ANALYZER_NAME = "Node.js Package Analyzer";
    +59  
    +60      /**
    +61       * The phase that this analyzer is intended to run in.
    +62       */
    +63      private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
    +64  
    +65      /**
    +66       * The file name to scan.
    +67       */
    +68      public static final String PACKAGE_JSON = "package.json";
    +69      /**
    +70       * Filter that detects files named "package.json".
    +71       */
    +72      private static final FileFilter PACKAGE_JSON_FILTER = FileFilterBuilder.newInstance()
    +73              .addFilenames(PACKAGE_JSON).build();
    +74  
    +75      /**
    +76       * Returns the FileFilter
    +77       *
    +78       * @return the FileFilter
    +79       */
    +80      @Override
    +81      protected FileFilter getFileFilter() {
    +82          return PACKAGE_JSON_FILTER;
    +83      }
    +84  
    +85      @Override
    +86      protected void initializeFileTypeAnalyzer() throws Exception {
    +87          // NO-OP
    +88      }
    +89  
    +90      /**
    +91       * Returns the name of the analyzer.
    +92       *
    +93       * @return the name of the analyzer.
    +94       */
    +95      @Override
    +96      public String getName() {
    +97          return ANALYZER_NAME;
    +98      }
    +99  
    +100     /**
    +101      * Returns the phase that the analyzer is intended to run in.
    +102      *
    +103      * @return the phase that the analyzer is intended to run in.
    +104      */
    +105     @Override
    +106     public AnalysisPhase getAnalysisPhase() {
    +107         return ANALYSIS_PHASE;
    +108     }
    +109 
    +110     /**
    +111      * Returns the key used in the properties file to reference the analyzer's enabled property.
    +112      *
    +113      * @return the analyzer's enabled property setting key
    +114      */
    +115     @Override
    +116     protected String getAnalyzerEnabledSettingKey() {
    +117         return Settings.KEYS.ANALYZER_NODE_PACKAGE_ENABLED;
    +118     }
    +119 
    +120     @Override
    +121     protected void analyzeFileType(Dependency dependency, Engine engine)
    +122             throws AnalysisException {
    +123         final File file = dependency.getActualFile();
    +124         JsonReader jsonReader;
    +125         try {
    +126             jsonReader = Json.createReader(FileUtils.openInputStream(file));
    +127         } catch (IOException e) {
    +128             throw new AnalysisException(
    +129                     "Problem occurred while reading dependency file.", e);
    +130         }
    +131         try {
    +132             final JsonObject json = jsonReader.readObject();
    +133             final EvidenceCollection productEvidence = dependency.getProductEvidence();
    +134             final EvidenceCollection vendorEvidence = dependency.getVendorEvidence();
    +135             if (json.containsKey("name")) {
    +136                 final Object value = json.get("name");
    +137                 if (value instanceof JsonString) {
    +138                     final String valueString = ((JsonString) value).getString();
    +139                     productEvidence.addEvidence(PACKAGE_JSON, "name", valueString, Confidence.HIGHEST);
    +140                     vendorEvidence.addEvidence(PACKAGE_JSON, "name_project", String.format("%s_project", valueString), Confidence.LOW);
    +141                 } else {
    +142                     LOGGER.warn("JSON value not string as expected: {}", value);
    +143                 }
    +144             }
    +145             addToEvidence(json, productEvidence, "description");
    +146             addToEvidence(json, vendorEvidence, "author");
    +147             addToEvidence(json, dependency.getVersionEvidence(), "version");
    +148             dependency.setDisplayFileName(String.format("%s/%s", file.getParentFile().getName(), file.getName()));
    +149         } catch (JsonException e) {
    +150             LOGGER.warn("Failed to parse package.json file.", e);
    +151         } finally {
    +152             jsonReader.close();
    +153         }
    +154     }
    +155 
    +156     /**
    +157      * Adds information to an evidence collection from the node json configuration.
    +158      *
    +159      * @param json information from node.js
    +160      * @param collection a set of evidence about a dependency
    +161      * @param key the key to obtain the data from the json information
    +162      */
    +163     private void addToEvidence(JsonObject json, EvidenceCollection collection, String key) {
    +164         if (json.containsKey(key)) {
    +165             final JsonValue value = json.get(key);
    +166             if (value instanceof JsonString) {
    +167                 collection.addEvidence(PACKAGE_JSON, key, ((JsonString) value).getString(), Confidence.HIGHEST);
    +168             } else if (value instanceof JsonObject) {
    +169                 final JsonObject jsonObject = (JsonObject) value;
    +170                 for (final Map.Entry<String, JsonValue> entry : jsonObject.entrySet()) {
    +171                     final String property = entry.getKey();
    +172                     final JsonValue subValue = entry.getValue();
    +173                     if (subValue instanceof JsonString) {
    +174                         collection.addEvidence(PACKAGE_JSON,
    +175                                 String.format("%s.%s", key, property),
    +176                                 ((JsonString) subValue).getString(),
    +177                                 Confidence.HIGHEST);
    +178                     } else {
    +179                         LOGGER.warn("JSON sub-value not string as expected: {}", subValue);
    +180                     }
    +181                 }
    +182             } else {
    +183                 LOGGER.warn("JSON value not string or JSON object as expected: {}", value);
    +184             }
    +185         }
    +186     }
    +187 }
    +
    +
    + + + diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/PythonDistributionAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/PythonDistributionAnalyzer.html index a5eaf909a..22f020b1c 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/PythonDistributionAnalyzer.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/PythonDistributionAnalyzer.html @@ -34,7 +34,7 @@ 26 import org.apache.commons.io.filefilter.NameFileFilter; 27 import org.apache.commons.io.filefilter.SuffixFileFilter; 28 import org.apache.commons.io.input.AutoCloseInputStream; -29 import org.apache.commons.lang.StringUtils; +29 import org.apache.commons.lang3.StringUtils; 30 import org.owasp.dependencycheck.Engine; 31 import org.owasp.dependencycheck.analyzer.exception.AnalysisException; 32 import org.owasp.dependencycheck.dependency.Confidence; @@ -61,7 +61,7 @@ 53 public class PythonDistributionAnalyzer extends AbstractFileTypeAnalyzer { 54 55 /** -56 * Name of egg metatdata files to analyze. +56 * Name of egg metadata files to analyze. 57 */ 58 private static final String PKG_INFO = "PKG-INFO"; 59 @@ -277,111 +277,109 @@ 269 * 270 * @param dependency the dependency being analyzed 271 * @param file a reference to the manifest/properties file -272 * @throws AnalysisException thrown when there is an error -273 */ -274 private static void collectWheelMetadata(Dependency dependency, File file) -275 throws AnalysisException { -276 final InternetHeaders headers = getManifestProperties(file); -277 addPropertyToEvidence(headers, dependency.getVersionEvidence(), -278 "Version", Confidence.HIGHEST); -279 addPropertyToEvidence(headers, dependency.getProductEvidence(), "Name", -280 Confidence.HIGHEST); -281 final String url = headers.getHeader("Home-page", null); -282 final EvidenceCollection vendorEvidence = dependency -283 .getVendorEvidence(); -284 if (StringUtils.isNotBlank(url)) { -285 if (UrlStringUtils.isUrl(url)) { -286 vendorEvidence.addEvidence(METADATA, "vendor", url, -287 Confidence.MEDIUM); -288 } -289 } -290 addPropertyToEvidence(headers, vendorEvidence, "Author", Confidence.LOW); -291 final String summary = headers.getHeader("Summary", null); -292 if (StringUtils.isNotBlank(summary)) { -293 JarAnalyzer -294 .addDescription(dependency, summary, METADATA, "summary"); -295 } -296 } -297 -298 /** -299 * Adds a value to the evidence collection. -300 * -301 * @param headers the properties collection -302 * @param evidence the evidence collection to add the value -303 * @param property the property name -304 * @param confidence the confidence of the evidence -305 */ -306 private static void addPropertyToEvidence(InternetHeaders headers, -307 EvidenceCollection evidence, String property, Confidence confidence) { -308 final String value = headers.getHeader(property, null); -309 LOGGER.debug("Property: {}, Value: {}", property, value); -310 if (StringUtils.isNotBlank(value)) { -311 evidence.addEvidence(METADATA, property, value, confidence); -312 } -313 } -314 -315 /** -316 * Returns a list of files that match the given filter, this does not recursively scan the directory. -317 * -318 * @param folder the folder to filter -319 * @param filter the filter to apply to the files in the directory -320 * @return the list of Files in the directory that match the provided filter -321 */ -322 private static File getMatchingFile(File folder, FilenameFilter filter) { -323 File result = null; -324 final File[] matches = folder.listFiles(filter); -325 if (null != matches && 1 == matches.length) { -326 result = matches[0]; -327 } -328 return result; -329 } -330 -331 /** -332 * Reads the manifest entries from the provided file. -333 * -334 * @param manifest the manifest -335 * @return the manifest entries -336 */ -337 private static InternetHeaders getManifestProperties(File manifest) { -338 final InternetHeaders result = new InternetHeaders(); -339 if (null == manifest) { -340 LOGGER.debug("Manifest file not found."); -341 } else { -342 try { -343 result.load(new AutoCloseInputStream(new BufferedInputStream( -344 new FileInputStream(manifest)))); -345 } catch (MessagingException e) { +272 */ +273 private static void collectWheelMetadata(Dependency dependency, File file) { +274 final InternetHeaders headers = getManifestProperties(file); +275 addPropertyToEvidence(headers, dependency.getVersionEvidence(), +276 "Version", Confidence.HIGHEST); +277 addPropertyToEvidence(headers, dependency.getProductEvidence(), "Name", +278 Confidence.HIGHEST); +279 final String url = headers.getHeader("Home-page", null); +280 final EvidenceCollection vendorEvidence = dependency +281 .getVendorEvidence(); +282 if (StringUtils.isNotBlank(url)) { +283 if (UrlStringUtils.isUrl(url)) { +284 vendorEvidence.addEvidence(METADATA, "vendor", url, +285 Confidence.MEDIUM); +286 } +287 } +288 addPropertyToEvidence(headers, vendorEvidence, "Author", Confidence.LOW); +289 final String summary = headers.getHeader("Summary", null); +290 if (StringUtils.isNotBlank(summary)) { +291 JarAnalyzer +292 .addDescription(dependency, summary, METADATA, "summary"); +293 } +294 } +295 +296 /** +297 * Adds a value to the evidence collection. +298 * +299 * @param headers the properties collection +300 * @param evidence the evidence collection to add the value +301 * @param property the property name +302 * @param confidence the confidence of the evidence +303 */ +304 private static void addPropertyToEvidence(InternetHeaders headers, +305 EvidenceCollection evidence, String property, Confidence confidence) { +306 final String value = headers.getHeader(property, null); +307 LOGGER.debug("Property: {}, Value: {}", property, value); +308 if (StringUtils.isNotBlank(value)) { +309 evidence.addEvidence(METADATA, property, value, confidence); +310 } +311 } +312 +313 /** +314 * Returns a list of files that match the given filter, this does not recursively scan the directory. +315 * +316 * @param folder the folder to filter +317 * @param filter the filter to apply to the files in the directory +318 * @return the list of Files in the directory that match the provided filter +319 */ +320 private static File getMatchingFile(File folder, FilenameFilter filter) { +321 File result = null; +322 final File[] matches = folder.listFiles(filter); +323 if (null != matches && 1 == matches.length) { +324 result = matches[0]; +325 } +326 return result; +327 } +328 +329 /** +330 * Reads the manifest entries from the provided file. +331 * +332 * @param manifest the manifest +333 * @return the manifest entries +334 */ +335 private static InternetHeaders getManifestProperties(File manifest) { +336 final InternetHeaders result = new InternetHeaders(); +337 if (null == manifest) { +338 LOGGER.debug("Manifest file not found."); +339 } else { +340 try { +341 result.load(new AutoCloseInputStream(new BufferedInputStream( +342 new FileInputStream(manifest)))); +343 } catch (MessagingException e) { +344 LOGGER.warn(e.getMessage(), e); +345 } catch (FileNotFoundException e) { 346 LOGGER.warn(e.getMessage(), e); -347 } catch (FileNotFoundException e) { -348 LOGGER.warn(e.getMessage(), e); -349 } -350 } -351 return result; -352 } -353 -354 /** -355 * Retrieves the next temporary destingation directory for extracting an archive. -356 * -357 * @return a directory -358 * @throws AnalysisException thrown if unable to create temporary directory -359 */ -360 private File getNextTempDirectory() throws AnalysisException { -361 File directory; -362 -363 // getting an exception for some directories not being able to be -364 // created; might be because the directory already exists? -365 do { -366 dirCount += 1; -367 directory = new File(tempFileLocation, String.valueOf(dirCount)); -368 } while (directory.exists()); -369 if (!directory.mkdirs()) { -370 throw new AnalysisException(String.format( -371 "Unable to create temp directory '%s'.", -372 directory.getAbsolutePath())); -373 } -374 return directory; -375 } -376 } +347 } +348 } +349 return result; +350 } +351 +352 /** +353 * Retrieves the next temporary destination directory for extracting an archive. +354 * +355 * @return a directory +356 * @throws AnalysisException thrown if unable to create temporary directory +357 */ +358 private File getNextTempDirectory() throws AnalysisException { +359 File directory; +360 +361 // getting an exception for some directories not being able to be +362 // created; might be because the directory already exists? +363 do { +364 dirCount += 1; +365 directory = new File(tempFileLocation, String.valueOf(dirCount)); +366 } while (directory.exists()); +367 if (!directory.mkdirs()) { +368 throw new AnalysisException(String.format( +369 "Unable to create temp directory '%s'.", +370 directory.getAbsolutePath())); +371 } +372 return directory; +373 } +374 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/PythonPackageAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/PythonPackageAnalyzer.html index 1f38ddcfb..ed63e358c 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/PythonPackageAnalyzer.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/PythonPackageAnalyzer.html @@ -36,303 +36,289 @@ 28 import org.owasp.dependencycheck.utils.FileFilterBuilder; 29 import org.owasp.dependencycheck.utils.Settings; 30 import org.owasp.dependencycheck.utils.UrlStringUtils; -31 import org.slf4j.Logger; -32 import org.slf4j.LoggerFactory; -33 -34 import java.io.File; -35 import java.io.FileFilter; -36 import java.io.IOException; -37 import java.net.MalformedURLException; -38 import java.util.ArrayList; -39 import java.util.List; -40 import java.util.regex.Matcher; -41 import java.util.regex.Pattern; -42 -43 /** -44 * Used to analyze a Python package, and collect information that can be used to determine the associated CPE. -45 * -46 * @author Dale Visser <dvisser@ida.org> -47 */ -48 public class PythonPackageAnalyzer extends AbstractFileTypeAnalyzer { -49 -50 /** -51 * Used when compiling file scanning regex patterns. -52 */ -53 private static final int REGEX_OPTIONS = Pattern.DOTALL -54 | Pattern.CASE_INSENSITIVE; -55 -56 /** -57 * The logger. -58 */ -59 private static final Logger LOGGER = LoggerFactory -60 .getLogger(PythonPackageAnalyzer.class); -61 -62 /** -63 * Filename extensions for files to be analyzed. -64 */ -65 private static final String EXTENSIONS = "py"; -66 -67 /** -68 * Pattern for matching the module docstring in a source file. -69 */ -70 private static final Pattern MODULE_DOCSTRING = Pattern.compile( -71 "^(['\\\"]{3})(.*?)\\1", REGEX_OPTIONS); -72 -73 /** -74 * Matches assignments to version variables in Python source code. -75 */ -76 private static final Pattern VERSION_PATTERN = Pattern.compile( -77 "\\b(__)?version(__)? *= *(['\"]+)(\\d+\\.\\d+.*?)\\3", -78 REGEX_OPTIONS); -79 -80 /** -81 * Matches assignments to title variables in Python source code. -82 */ -83 private static final Pattern TITLE_PATTERN = compileAssignPattern("title"); -84 -85 /** -86 * Matches assignments to summary variables in Python source code. -87 */ -88 private static final Pattern SUMMARY_PATTERN = compileAssignPattern("summary"); -89 -90 /** -91 * Matches assignments to URL/URL variables in Python source code. -92 */ -93 private static final Pattern URI_PATTERN = compileAssignPattern("ur[il]"); -94 -95 /** -96 * Matches assignments to home page variables in Python source code. -97 */ -98 private static final Pattern HOMEPAGE_PATTERN = compileAssignPattern("home_?page"); -99 -100 /** -101 * Matches assignments to author variables in Python source code. -102 */ -103 private static final Pattern AUTHOR_PATTERN = compileAssignPattern("author"); -104 -105 /** -106 * Filter that detects files named "__init__.py". -107 */ -108 private static final FileFilter INIT_PY_FILTER = new NameFileFilter("__init__.py"); -109 -110 /** -111 * The file filter for python files. -112 */ -113 private static final FileFilter PY_FILTER = new SuffixFileFilter(".py"); -114 -115 /** -116 * Returns the name of the Python Package Analyzer. -117 * -118 * @return the name of the analyzer -119 */ -120 @Override -121 public String getName() { -122 return "Python Package Analyzer"; -123 } -124 -125 /** -126 * Tell that we are used for information collection. -127 * -128 * @return INFORMATION_COLLECTION -129 */ -130 @Override -131 public AnalysisPhase getAnalysisPhase() { -132 return AnalysisPhase.INFORMATION_COLLECTION; -133 } -134 -135 /** -136 * The file filter used to determine which files this analyzer supports. -137 */ -138 private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build(); -139 -140 /** -141 * Returns the FileFilter -142 * -143 * @return the FileFilter -144 */ -145 @Override -146 protected FileFilter getFileFilter() { -147 return FILTER; -148 } -149 -150 /** -151 * No-op initializer implementation. -152 * -153 * @throws Exception never thrown -154 */ -155 @Override -156 protected void initializeFileTypeAnalyzer() throws Exception { -157 // Nothing to do here. -158 } -159 -160 /** -161 * Utility function to create a regex pattern matcher. -162 * -163 * @param name the value to use when constructing the assignment pattern -164 * @return the compiled Pattern -165 */ -166 private static Pattern compileAssignPattern(String name) { -167 return Pattern.compile( -168 String.format("\\b(__)?%s(__)?\\b *= *(['\"]+)(.*?)\\3", name), -169 REGEX_OPTIONS); -170 } -171 -172 /** -173 * Analyzes python packages and adds evidence to the dependency. -174 * -175 * @param dependency the dependency being analyzed -176 * @param engine the engine being used to perform the scan -177 * @throws AnalysisException thrown if there is an unrecoverable error analyzing the dependency -178 */ -179 @Override -180 protected void analyzeFileType(Dependency dependency, Engine engine) -181 throws AnalysisException { -182 final File file = dependency.getActualFile(); -183 final File parent = file.getParentFile(); -184 final String parentName = parent.getName(); -185 boolean found = false; -186 if (INIT_PY_FILTER.accept(file)) { -187 for (final File sourcefile : parent.listFiles(PY_FILTER)) { -188 found |= analyzeFileContents(dependency, sourcefile); -189 } -190 } -191 if (found) { -192 dependency.setDisplayFileName(parentName + "/__init__.py"); -193 dependency.getProductEvidence().addEvidence(file.getName(), -194 "PackageName", parentName, Confidence.MEDIUM); -195 } else { -196 // copy, alter and set in case some other thread is iterating over -197 final List<Dependency> deps = new ArrayList<Dependency>( -198 engine.getDependencies()); -199 deps.remove(dependency); -200 engine.setDependencies(deps); -201 } -202 } -203 -204 /** -205 * This should gather information from leading docstrings, file comments, and assignments to __version__, __title__, -206 * __summary__, __uri__, __url__, __home*page__, __author__, and their all caps equivalents. -207 * -208 * @param dependency the dependency being analyzed -209 * @param file the file name to analyze -210 * @return whether evidence was found -211 * @throws AnalysisException thrown if there is an unrecoverable error -212 */ -213 private boolean analyzeFileContents(Dependency dependency, File file) -214 throws AnalysisException { -215 String contents; -216 try { -217 contents = FileUtils.readFileToString(file).trim(); -218 } catch (IOException e) { -219 throw new AnalysisException( -220 "Problem occurred while reading dependency file.", e); -221 } -222 boolean found = false; -223 if (!contents.isEmpty()) { -224 final String source = file.getName(); -225 found = gatherEvidence(VERSION_PATTERN, contents, source, -226 dependency.getVersionEvidence(), "SourceVersion", -227 Confidence.MEDIUM); -228 found |= addSummaryInfo(dependency, SUMMARY_PATTERN, 4, contents, -229 source, "summary"); -230 if (INIT_PY_FILTER.accept(file)) { -231 found |= addSummaryInfo(dependency, MODULE_DOCSTRING, 2, -232 contents, source, "docstring"); -233 } -234 found |= gatherEvidence(TITLE_PATTERN, contents, source, -235 dependency.getProductEvidence(), "SourceTitle", -236 Confidence.LOW); -237 final EvidenceCollection vendorEvidence = dependency -238 .getVendorEvidence(); -239 found |= gatherEvidence(AUTHOR_PATTERN, contents, source, -240 vendorEvidence, "SourceAuthor", Confidence.MEDIUM); -241 try { -242 found |= gatherHomePageEvidence(URI_PATTERN, vendorEvidence, -243 source, "URL", contents); -244 found |= gatherHomePageEvidence(HOMEPAGE_PATTERN, -245 vendorEvidence, source, "HomePage", contents); -246 } catch (MalformedURLException e) { -247 LOGGER.warn(e.getMessage()); -248 } -249 } -250 return found; -251 } -252 -253 /** -254 * Adds summary information to the dependency -255 * -256 * @param dependency the dependency being analyzed -257 * @param pattern the pattern used to perform analysis -258 * @param group the group from the pattern that indicates the data to use -259 * @param contents the data being analyzed -260 * @param source the source name to use when recording the evidence -261 * @param key the key name to use when recording the evidence -262 * @return true if evidence was collected; otherwise false -263 */ -264 private boolean addSummaryInfo(Dependency dependency, Pattern pattern, -265 int group, String contents, String source, String key) { -266 final Matcher matcher = pattern.matcher(contents); -267 final boolean found = matcher.find(); -268 if (found) { -269 JarAnalyzer.addDescription(dependency, matcher.group(group), -270 source, key); -271 } -272 return found; -273 } -274 -275 /** -276 * Collects evidence from the home page URL. -277 * -278 * @param pattern the pattern to match -279 * @param evidence the evidence collection to add the evidence to -280 * @param source the source of the evidence -281 * @param name the name of the evidence -282 * @param contents the home page URL -283 * @return true if evidence was collected; otherwise false -284 * @throws MalformedURLException thrown if the URL is malformed -285 */ -286 private boolean gatherHomePageEvidence(Pattern pattern, -287 EvidenceCollection evidence, String source, String name, -288 String contents) throws MalformedURLException { -289 final Matcher matcher = pattern.matcher(contents); -290 boolean found = false; -291 if (matcher.find()) { -292 final String url = matcher.group(4); -293 if (UrlStringUtils.isUrl(url)) { -294 found = true; -295 evidence.addEvidence(source, name, url, Confidence.MEDIUM); -296 } -297 } -298 return found; -299 } -300 -301 /** -302 * Gather evidence from a Python source file usin the given string assignment regex pattern. -303 * -304 * @param pattern to scan contents with -305 * @param contents of Python source file -306 * @param source for storing evidence -307 * @param evidence to store evidence in -308 * @param name of evidence -309 * @param confidence in evidence -310 * @return whether evidence was found -311 */ -312 private boolean gatherEvidence(Pattern pattern, String contents, -313 String source, EvidenceCollection evidence, String name, -314 Confidence confidence) { -315 final Matcher matcher = pattern.matcher(contents); -316 final boolean found = matcher.find(); -317 if (found) { -318 evidence.addEvidence(source, name, matcher.group(4), confidence); -319 } -320 return found; -321 } -322 -323 @Override -324 protected String getAnalyzerEnabledSettingKey() { -325 return Settings.KEYS.ANALYZER_PYTHON_PACKAGE_ENABLED; -326 } -327 } +31 +32 import java.io.File; +33 import java.io.FileFilter; +34 import java.io.IOException; +35 import java.util.ArrayList; +36 import java.util.List; +37 import java.util.regex.Matcher; +38 import java.util.regex.Pattern; +39 +40 /** +41 * Used to analyze a Python package, and collect information that can be used to determine the associated CPE. +42 * +43 * @author Dale Visser <dvisser@ida.org> +44 */ +45 public class PythonPackageAnalyzer extends AbstractFileTypeAnalyzer { +46 +47 /** +48 * Used when compiling file scanning regex patterns. +49 */ +50 private static final int REGEX_OPTIONS = Pattern.DOTALL +51 | Pattern.CASE_INSENSITIVE; +52 +53 /** +54 * Filename extensions for files to be analyzed. +55 */ +56 private static final String EXTENSIONS = "py"; +57 +58 /** +59 * Pattern for matching the module docstring in a source file. +60 */ +61 private static final Pattern MODULE_DOCSTRING = Pattern.compile( +62 "^(['\\\"]{3})(.*?)\\1", REGEX_OPTIONS); +63 +64 /** +65 * Matches assignments to version variables in Python source code. +66 */ +67 private static final Pattern VERSION_PATTERN = Pattern.compile( +68 "\\b(__)?version(__)? *= *(['\"]+)(\\d+\\.\\d+.*?)\\3", +69 REGEX_OPTIONS); +70 +71 /** +72 * Matches assignments to title variables in Python source code. +73 */ +74 private static final Pattern TITLE_PATTERN = compileAssignPattern("title"); +75 +76 /** +77 * Matches assignments to summary variables in Python source code. +78 */ +79 private static final Pattern SUMMARY_PATTERN = compileAssignPattern("summary"); +80 +81 /** +82 * Matches assignments to URL/URL variables in Python source code. +83 */ +84 private static final Pattern URI_PATTERN = compileAssignPattern("ur[il]"); +85 +86 /** +87 * Matches assignments to home page variables in Python source code. +88 */ +89 private static final Pattern HOMEPAGE_PATTERN = compileAssignPattern("home_?page"); +90 +91 /** +92 * Matches assignments to author variables in Python source code. +93 */ +94 private static final Pattern AUTHOR_PATTERN = compileAssignPattern("author"); +95 +96 /** +97 * Filter that detects files named "__init__.py". +98 */ +99 private static final FileFilter INIT_PY_FILTER = new NameFileFilter("__init__.py"); +100 +101 /** +102 * The file filter for python files. +103 */ +104 private static final FileFilter PY_FILTER = new SuffixFileFilter(".py"); +105 +106 /** +107 * Returns the name of the Python Package Analyzer. +108 * +109 * @return the name of the analyzer +110 */ +111 @Override +112 public String getName() { +113 return "Python Package Analyzer"; +114 } +115 +116 /** +117 * Tell that we are used for information collection. +118 * +119 * @return INFORMATION_COLLECTION +120 */ +121 @Override +122 public AnalysisPhase getAnalysisPhase() { +123 return AnalysisPhase.INFORMATION_COLLECTION; +124 } +125 +126 /** +127 * The file filter used to determine which files this analyzer supports. +128 */ +129 private static final FileFilter FILTER = FileFilterBuilder.newInstance().addExtensions(EXTENSIONS).build(); +130 +131 /** +132 * Returns the FileFilter +133 * +134 * @return the FileFilter +135 */ +136 @Override +137 protected FileFilter getFileFilter() { +138 return FILTER; +139 } +140 +141 /** +142 * No-op initializer implementation. +143 * +144 * @throws Exception never thrown +145 */ +146 @Override +147 protected void initializeFileTypeAnalyzer() throws Exception { +148 // Nothing to do here. +149 } +150 +151 /** +152 * Utility function to create a regex pattern matcher. +153 * +154 * @param name the value to use when constructing the assignment pattern +155 * @return the compiled Pattern +156 */ +157 private static Pattern compileAssignPattern(String name) { +158 return Pattern.compile( +159 String.format("\\b(__)?%s(__)?\\b *= *(['\"]+)(.*?)\\3", name), +160 REGEX_OPTIONS); +161 } +162 +163 /** +164 * Analyzes python packages and adds evidence to the dependency. +165 * +166 * @param dependency the dependency being analyzed +167 * @param engine the engine being used to perform the scan +168 * @throws AnalysisException thrown if there is an unrecoverable error analyzing the dependency +169 */ +170 @Override +171 protected void analyzeFileType(Dependency dependency, Engine engine) +172 throws AnalysisException { +173 final File file = dependency.getActualFile(); +174 final File parent = file.getParentFile(); +175 final String parentName = parent.getName(); +176 boolean found = false; +177 if (INIT_PY_FILTER.accept(file)) { +178 for (final File sourceFile : parent.listFiles(PY_FILTER)) { +179 found |= analyzeFileContents(dependency, sourceFile); +180 } +181 } +182 if (found) { +183 dependency.setDisplayFileName(parentName + "/__init__.py"); +184 dependency.getProductEvidence().addEvidence(file.getName(), +185 "PackageName", parentName, Confidence.MEDIUM); +186 } else { +187 // copy, alter and set in case some other thread is iterating over +188 final List<Dependency> dependencies = new ArrayList<Dependency>( +189 engine.getDependencies()); +190 dependencies.remove(dependency); +191 engine.setDependencies(dependencies); +192 } +193 } +194 +195 /** +196 * This should gather information from leading docstrings, file comments, and assignments to __version__, __title__, +197 * __summary__, __uri__, __url__, __home*page__, __author__, and their all caps equivalents. +198 * +199 * @param dependency the dependency being analyzed +200 * @param file the file name to analyze +201 * @return whether evidence was found +202 * @throws AnalysisException thrown if there is an unrecoverable error +203 */ +204 private boolean analyzeFileContents(Dependency dependency, File file) +205 throws AnalysisException { +206 String contents; +207 try { +208 contents = FileUtils.readFileToString(file).trim(); +209 } catch (IOException e) { +210 throw new AnalysisException( +211 "Problem occurred while reading dependency file.", e); +212 } +213 boolean found = false; +214 if (!contents.isEmpty()) { +215 final String source = file.getName(); +216 found = gatherEvidence(VERSION_PATTERN, contents, source, +217 dependency.getVersionEvidence(), "SourceVersion", +218 Confidence.MEDIUM); +219 found |= addSummaryInfo(dependency, SUMMARY_PATTERN, 4, contents, +220 source, "summary"); +221 if (INIT_PY_FILTER.accept(file)) { +222 found |= addSummaryInfo(dependency, MODULE_DOCSTRING, 2, +223 contents, source, "docstring"); +224 } +225 found |= gatherEvidence(TITLE_PATTERN, contents, source, +226 dependency.getProductEvidence(), "SourceTitle", +227 Confidence.LOW); +228 final EvidenceCollection vendorEvidence = dependency +229 .getVendorEvidence(); +230 found |= gatherEvidence(AUTHOR_PATTERN, contents, source, +231 vendorEvidence, "SourceAuthor", Confidence.MEDIUM); +232 found |= gatherHomePageEvidence(URI_PATTERN, vendorEvidence, +233 source, "URL", contents); +234 found |= gatherHomePageEvidence(HOMEPAGE_PATTERN, +235 vendorEvidence, source, "HomePage", contents); +236 } +237 return found; +238 } +239 +240 /** +241 * Adds summary information to the dependency +242 * +243 * @param dependency the dependency being analyzed +244 * @param pattern the pattern used to perform analysis +245 * @param group the group from the pattern that indicates the data to use +246 * @param contents the data being analyzed +247 * @param source the source name to use when recording the evidence +248 * @param key the key name to use when recording the evidence +249 * @return true if evidence was collected; otherwise false +250 */ +251 private boolean addSummaryInfo(Dependency dependency, Pattern pattern, +252 int group, String contents, String source, String key) { +253 final Matcher matcher = pattern.matcher(contents); +254 final boolean found = matcher.find(); +255 if (found) { +256 JarAnalyzer.addDescription(dependency, matcher.group(group), +257 source, key); +258 } +259 return found; +260 } +261 +262 /** +263 * Collects evidence from the home page URL. +264 * +265 * @param pattern the pattern to match +266 * @param evidence the evidence collection to add the evidence to +267 * @param source the source of the evidence +268 * @param name the name of the evidence +269 * @param contents the home page URL +270 * @return true if evidence was collected; otherwise false +271 */ +272 private boolean gatherHomePageEvidence(Pattern pattern, +273 EvidenceCollection evidence, String source, String name, +274 String contents) { +275 final Matcher matcher = pattern.matcher(contents); +276 boolean found = false; +277 if (matcher.find()) { +278 final String url = matcher.group(4); +279 if (UrlStringUtils.isUrl(url)) { +280 found = true; +281 evidence.addEvidence(source, name, url, Confidence.MEDIUM); +282 } +283 } +284 return found; +285 } +286 +287 /** +288 * Gather evidence from a Python source file using the given string assignment regex pattern. +289 * +290 * @param pattern to scan contents with +291 * @param contents of Python source file +292 * @param source for storing evidence +293 * @param evidence to store evidence in +294 * @param name of evidence +295 * @param confidence in evidence +296 * @return whether evidence was found +297 */ +298 private boolean gatherEvidence(Pattern pattern, String contents, +299 String source, EvidenceCollection evidence, String name, +300 Confidence confidence) { +301 final Matcher matcher = pattern.matcher(contents); +302 final boolean found = matcher.find(); +303 if (found) { +304 evidence.addEvidence(source, name, matcher.group(4), confidence); +305 } +306 return found; +307 } +308 +309 @Override +310 protected String getAnalyzerEnabledSettingKey() { +311 return Settings.KEYS.ANALYZER_PYTHON_PACKAGE_ENABLED; +312 } +313 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/RubyGemspecAnalyzer.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/RubyGemspecAnalyzer.html new file mode 100644 index 000000000..d167b5d5d --- /dev/null +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/RubyGemspecAnalyzer.html @@ -0,0 +1,173 @@ + + + +RubyGemspecAnalyzer xref + + + +
    +1   /*
    +2    * This file is part of dependency-check-core.
    +3    *
    +4    * Licensed under the Apache License, Version 2.0 (the "License");
    +5    * you may not use this file except in compliance with the License.
    +6    * You may obtain a copy of the License at
    +7    *
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
    +9    *
    +10   * Unless required by applicable law or agreed to in writing, software
    +11   * distributed under the License is distributed on an "AS IS" BASIS,
    +12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +13   * See the License for the specific language governing permissions and
    +14   * limitations under the License.
    +15   *
    +16   * Copyright (c) 2015 Institute for Defense Analyses. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.analyzer;
    +19  
    +20  import org.apache.commons.io.FileUtils;
    +21  import org.owasp.dependencycheck.Engine;
    +22  import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
    +23  import org.owasp.dependencycheck.dependency.Confidence;
    +24  import org.owasp.dependencycheck.dependency.Dependency;
    +25  import org.owasp.dependencycheck.dependency.EvidenceCollection;
    +26  import org.owasp.dependencycheck.utils.FileFilterBuilder;
    +27  import org.owasp.dependencycheck.utils.Settings;
    +28  
    +29  import java.io.FileFilter;
    +30  import java.io.IOException;
    +31  import java.util.regex.Matcher;
    +32  import java.util.regex.Pattern;
    +33  
    +34  /**
    +35   * Used to analyze Ruby Gem specifications and collect information that can be used to determine the associated CPE.
    +36   * Regular expressions are used to parse the well-defined Ruby syntax that forms the specification.
    +37   *
    +38   * @author Dale Visser <dvisser@ida.org>
    +39   */
    +40  public class RubyGemspecAnalyzer extends AbstractFileTypeAnalyzer {
    +41  
    +42      /**
    +43       * The name of the analyzer.
    +44       */
    +45      private static final String ANALYZER_NAME = "Ruby Gemspec Analyzer";
    +46  
    +47      /**
    +48       * The phase that this analyzer is intended to run in.
    +49       */
    +50      private static final AnalysisPhase ANALYSIS_PHASE = AnalysisPhase.INFORMATION_COLLECTION;
    +51  
    +52      private static final FileFilter FILTER =
    +53              FileFilterBuilder.newInstance().addExtensions("gemspec").addFilenames("Rakefile").build();
    +54  
    +55      private static final String EMAIL = "email";
    +56      private static final String GEMSPEC = "gemspec";
    +57  
    +58      /**
    +59       * @return a filter that accepts files named Rakefile or matching the glob pattern, *.gemspec
    +60       */
    +61      @Override
    +62      protected FileFilter getFileFilter() {
    +63          return FILTER;
    +64      }
    +65  
    +66      @Override
    +67      protected void initializeFileTypeAnalyzer() throws Exception {
    +68          // NO-OP
    +69      }
    +70  
    +71      /**
    +72       * Returns the name of the analyzer.
    +73       *
    +74       * @return the name of the analyzer.
    +75       */
    +76      @Override
    +77      public String getName() {
    +78          return ANALYZER_NAME;
    +79      }
    +80  
    +81      /**
    +82       * Returns the phase that the analyzer is intended to run in.
    +83       *
    +84       * @return the phase that the analyzer is intended to run in.
    +85       */
    +86      @Override
    +87      public AnalysisPhase getAnalysisPhase() {
    +88          return ANALYSIS_PHASE;
    +89      }
    +90  
    +91      /**
    +92       * Returns the key used in the properties file to reference the analyzer's enabled property.
    +93       *
    +94       * @return the analyzer's enabled property setting key
    +95       */
    +96      @Override
    +97      protected String getAnalyzerEnabledSettingKey() {
    +98          return Settings.KEYS.ANALYZER_RUBY_GEMSPEC_ENABLED;
    +99      }
    +100 
    +101     /**
    +102      * The capture group #1 is the block variable.
    +103      */
    +104     private static final Pattern GEMSPEC_BLOCK_INIT =
    +105             Pattern.compile("Gem::Specification\\.new\\s+?do\\s+?\\|(.+?)\\|");
    +106 
    +107     @Override
    +108     protected void analyzeFileType(Dependency dependency, Engine engine)
    +109             throws AnalysisException {
    +110         String contents;
    +111         try {
    +112             contents = FileUtils.readFileToString(dependency.getActualFile());
    +113         } catch (IOException e) {
    +114             throw new AnalysisException(
    +115                     "Problem occurred while reading dependency file.", e);
    +116         }
    +117         final Matcher matcher = GEMSPEC_BLOCK_INIT.matcher(contents);
    +118         if (matcher.find()) {
    +119             contents = contents.substring(matcher.end());
    +120             final String blockVariable = matcher.group(1);
    +121             final EvidenceCollection vendor = dependency.getVendorEvidence();
    +122             addStringEvidence(vendor, contents, blockVariable, "author", Confidence.HIGHEST);
    +123             addListEvidence(vendor, contents, blockVariable, "authors", Confidence.HIGHEST);
    +124             final String email = addStringEvidence(vendor, contents, blockVariable, EMAIL, Confidence.MEDIUM);
    +125             if (email.isEmpty()) {
    +126                 addListEvidence(vendor, contents, blockVariable, EMAIL, Confidence.MEDIUM);
    +127             }
    +128             addStringEvidence(vendor, contents, blockVariable, "homepage", Confidence.MEDIUM);
    +129             final EvidenceCollection product = dependency.getProductEvidence();
    +130             final String name = addStringEvidence(product, contents, blockVariable, "name", Confidence.HIGHEST);
    +131             if (!name.isEmpty()) {
    +132                 vendor.addEvidence(GEMSPEC, "name_project", name + "_project", Confidence.LOW);
    +133             }
    +134             addStringEvidence(product, contents, blockVariable, "summary", Confidence.LOW);
    +135             addStringEvidence(dependency.getVersionEvidence(), contents, blockVariable, "version", Confidence.HIGHEST);
    +136         }
    +137     }
    +138 
    +139     private void addListEvidence(EvidenceCollection evidences, String contents,
    +140                                  String blockVariable, String field, Confidence confidence) {
    +141         final Matcher matcher = Pattern.compile(
    +142                 String.format("\\s+?%s\\.%s\\s*?=\\s*?\\[(.*?)\\]", blockVariable, field)).matcher(contents);
    +143         if (matcher.find()) {
    +144             final String value = matcher.group(1).replaceAll("['\"]", " ").trim();
    +145             evidences.addEvidence(GEMSPEC, field, value, confidence);
    +146         }
    +147     }
    +148 
    +149     private String addStringEvidence(EvidenceCollection evidences, String contents,
    +150                                      String blockVariable, String field, Confidence confidence) {
    +151         final Matcher matcher = Pattern.compile(
    +152                 String.format("\\s+?%s\\.%s\\s*?=\\s*?(['\"])(.*?)\\1", blockVariable, field)).matcher(contents);
    +153         String value = "";
    +154         if (matcher.find()) {
    +155             value = matcher.group(2);
    +156             evidences.addEvidence(GEMSPEC, field, value, confidence);
    +157         }
    +158         return value;
    +159     }
    +160 }
    +
    +
    + + + diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/exception/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/exception/package-frame.html index 780586f3c..172bdb727 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/exception/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/exception/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.analyzer.exception + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.analyzer.exception diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/exception/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/exception/package-summary.html index 86316bb8d..190639f36 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/exception/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/exception/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.analyzer.exception + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.analyzer.exception diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/package-frame.html index 78ee96294..e7ed6a307 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.analyzer + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.analyzer @@ -53,6 +53,9 @@
  • ClassNameInformation +
  • +
  • + ComposerLockAnalyzer
  • CpeSuppressionAnalyzer @@ -83,6 +86,9 @@
  • NexusAnalyzer +
  • +
  • + NodePackageAnalyzer
  • NuspecAnalyzer @@ -98,6 +104,9 @@
  • PythonPackageAnalyzer +
  • +
  • + RubyGemspecAnalyzer
  • VulnerabilitySuppressionAnalyzer diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/package-summary.html index 9a12c13d0..58be1c395 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/analyzer/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.analyzer + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.analyzer @@ -99,6 +99,11 @@
  • ClassNameInformation
    + ComposerLockAnalyzer +
    @@ -149,6 +154,11 @@ NexusAnalyzer
    + NodePackageAnalyzer +
    @@ -174,6 +184,11 @@ PythonPackageAnalyzer
    + RubyGemspecAnalyzer +
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/central/CentralSearch.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/central/CentralSearch.html index 012021f32..d5d762529 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/central/CentralSearch.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/central/CentralSearch.html @@ -124,7 +124,7 @@ 116 if ("0".equals(numFound)) { 117 missing = true; 118 } else { -119 final ArrayList<MavenArtifact> result = new ArrayList<MavenArtifact>(); +119 final List<MavenArtifact> result = new ArrayList<MavenArtifact>(); 120 final NodeList docs = (NodeList) xpath.evaluate("/response/result/doc", doc, XPathConstants.NODESET); 121 for (int i = 0; i < docs.getLength(); i++) { 122 final String g = xpath.evaluate("./str[@name='g']", docs.item(i)); diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/central/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/central/package-frame.html index f678d11ec..ebb3527e6 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/central/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/central/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.central + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.central diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/central/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/central/package-summary.html index 4c66571fc..6c1620fe2 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/central/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/central/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.central + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.central diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/ComposerDependency.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/ComposerDependency.html new file mode 100644 index 000000000..be16da1b2 --- /dev/null +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/ComposerDependency.html @@ -0,0 +1,123 @@ + + + +ComposerDependency xref + + + +
    +1   /*
    +2    * This file is part of dependency-check-core.
    +3    *
    +4    * Licensed under the Apache License, Version 2.0 (the "License");
    +5    * you may not use this file except in compliance with the License.
    +6    * You may obtain a copy of the License at
    +7    *
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
    +9    *
    +10   * Unless required by applicable law or agreed to in writing, software
    +11   * distributed under the License is distributed on an "AS IS" BASIS,
    +12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +13   * See the License for the specific language governing permissions and
    +14   * limitations under the License.
    +15   *
    +16   * Copyright (c) 2015 The OWASP Foundation. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.data.composer;
    +19  
    +20  /**
    +21   * Reperesents a dependency (GAV, right now) from a Composer dependency.
    +22   *
    +23   * @author colezlaw
    +24   */
    +25  public final class ComposerDependency {
    +26  
    +27      /**
    +28       * The group
    +29       */
    +30      private final String group;
    +31  
    +32      /**
    +33       * The project
    +34       */
    +35      private final String project;
    +36  
    +37      /**
    +38       * The version
    +39       */
    +40      private final String version;
    +41  
    +42      /**
    +43       * Create a ComposerDependency from group, project, and version.
    +44       *
    +45       * @param group the group
    +46       * @param project the project
    +47       * @param version the version
    +48       */
    +49      public ComposerDependency(String group, String project, String version) {
    +50          this.group = group;
    +51          this.project = project;
    +52          this.version = version;
    +53      }
    +54  
    +55      /**
    +56       * Get the group.
    +57       *
    +58       * @return the group
    +59       */
    +60      public String getGroup() {
    +61          return group;
    +62      }
    +63  
    +64      /**
    +65       * Get the project.
    +66       *
    +67       * @return the project
    +68       */
    +69      public String getProject() {
    +70          return project;
    +71      }
    +72  
    +73      /**
    +74       * Get the version.
    +75       *
    +76       * @return the version
    +77       */
    +78      public String getVersion() {
    +79          return version;
    +80      }
    +81  
    +82      @Override
    +83      public boolean equals(Object o) {
    +84          if (this == o) {
    +85              return true;
    +86          }
    +87          if (!(o instanceof ComposerDependency)) {
    +88              return false;
    +89          }
    +90  
    +91          final ComposerDependency that = (ComposerDependency) o;
    +92  
    +93          if (group != null ? !group.equals(that.group) : that.group != null) {
    +94              return false;
    +95          }
    +96          if (project != null ? !project.equals(that.project) : that.project != null) {
    +97              return false;
    +98          }
    +99          return !(version != null ? !version.equals(that.version) : that.version != null);
    +100 
    +101     }
    +102 
    +103     @Override
    +104     public int hashCode() {
    +105         int result = group != null ? group.hashCode() : 0;
    +106         result = 31 * result + (project != null ? project.hashCode() : 0);
    +107         result = 31 * result + (version != null ? version.hashCode() : 0);
    +108         return result;
    +109     }
    +110 }
    +
    +
    + + + diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/ComposerException.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/ComposerException.html new file mode 100644 index 000000000..087f8e3d4 --- /dev/null +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/ComposerException.html @@ -0,0 +1,65 @@ + + + +ComposerException xref + + + +
    +1   /*
    +2    * This file is part of dependency-check-core.
    +3    *
    +4    * Licensed under the Apache License, Version 2.0 (the "License");
    +5    * you may not use this file except in compliance with the License.
    +6    * You may obtain a copy of the License at
    +7    *
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
    +9    *
    +10   * Unless required by applicable law or agreed to in writing, software
    +11   * distributed under the License is distributed on an "AS IS" BASIS,
    +12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +13   * See the License for the specific language governing permissions and
    +14   * limitations under the License.
    +15   *
    +16   * Copyright (c) 2015 The OWASP Foundation. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.data.composer;
    +19  
    +20  /**
    +21   * Represents an exception when handling a composer.json or composer.lock file. Generally used to wrap a downstream exception.
    +22   *
    +23   * @author colezlaw
    +24   */
    +25  public class ComposerException extends RuntimeException {
    +26  
    +27      /**
    +28       * Creates a ComposerException with default message.
    +29       */
    +30      public ComposerException() {
    +31          super();
    +32      }
    +33  
    +34      /**
    +35       * Creates a ComposerException with the specified message.
    +36       *
    +37       * @param message the exception message
    +38       */
    +39      public ComposerException(String message) {
    +40          super(message);
    +41      }
    +42  
    +43      /**
    +44       * Creates a Composer exception with the specified message and cause.
    +45       *
    +46       * @param message the message
    +47       * @param cause the underlying cause
    +48       */
    +49      public ComposerException(String message, Throwable cause) {
    +50          super(message, cause);
    +51      }
    +52  }
    +
    +
    + + + diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/ComposerLockParser.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/ComposerLockParser.html new file mode 100644 index 000000000..6eee3e9a4 --- /dev/null +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/ComposerLockParser.html @@ -0,0 +1,137 @@ + + + +ComposerLockParser xref + + + +
    +1   /*
    +2    * This file is part of dependency-check-core.
    +3    *
    +4    * Licensed under the Apache License, Version 2.0 (the "License");
    +5    * you may not use this file except in compliance with the License.
    +6    * You may obtain a copy of the License at
    +7    *
    +8    *     http://www.apache.org/licenses/LICENSE-2.0
    +9    *
    +10   * Unless required by applicable law or agreed to in writing, software
    +11   * distributed under the License is distributed on an "AS IS" BASIS,
    +12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +13   * See the License for the specific language governing permissions and
    +14   * limitations under the License.
    +15   *
    +16   * Copyright (c) 2015 The OWASP Foundation. All Rights Reserved.
    +17   */
    +18  package org.owasp.dependencycheck.data.composer;
    +19  
    +20  import org.slf4j.Logger;
    +21  import org.slf4j.LoggerFactory;
    +22  
    +23  import javax.json.Json;
    +24  import javax.json.JsonArray;
    +25  import javax.json.JsonException;
    +26  import javax.json.JsonObject;
    +27  import javax.json.JsonReader;
    +28  import javax.json.stream.JsonParsingException;
    +29  import java.io.InputStream;
    +30  import java.util.ArrayList;
    +31  import java.util.List;
    +32  
    +33  /**
    +34   * Parses a Composer.lock file from an input stream. In a separate class so it can hopefully be injected.
    +35   *
    +36   * @author colezlaw
    +37   */
    +38  public class ComposerLockParser {
    +39  
    +40      /**
    +41       * The JsonReader for parsing JSON
    +42       */
    +43      private final JsonReader jsonReader;
    +44  
    +45      /**
    +46       * The input stream we'll read
    +47       */
    +48      private final InputStream inputStream; // NOPMD - it gets set in the constructor, read later
    +49  
    +50      /**
    +51       * The List of ComposerDependencies found
    +52       */
    +53      private final List<ComposerDependency> composerDependencies;
    +54  
    +55      /**
    +56       * The LOGGER
    +57       */
    +58      private static final Logger LOGGER = LoggerFactory.getLogger(ComposerLockParser.class);
    +59  
    +60      /**
    +61       * Createas a ComposerLockParser from a JsonReader and an InputStream.
    +62       *
    +63       * @param inputStream the InputStream to parse
    +64       */
    +65      public ComposerLockParser(InputStream inputStream) {
    +66          LOGGER.info("Creating a ComposerLockParser");
    +67          this.inputStream = inputStream;
    +68          this.jsonReader = Json.createReader(inputStream);
    +69          this.composerDependencies = new ArrayList<ComposerDependency>();
    +70      }
    +71  
    +72      /**
    +73       * Process the input stream to create the list of dependencies.
    +74       */
    +75      public void process() {
    +76          LOGGER.info("Beginning Composer lock processing");
    +77          try {
    +78              final JsonObject composer = jsonReader.readObject();
    +79              if (composer.containsKey("packages")) {
    +80                  LOGGER.debug("Found packages");
    +81                  final JsonArray packages = composer.getJsonArray("packages");
    +82                  for (JsonObject pkg : packages.getValuesAs(JsonObject.class)) {
    +83                      if (pkg.containsKey("name")) {
    +84                          final String groupName = pkg.getString("name");
    +85                          if (groupName.indexOf('/') >= 0 && groupName.indexOf('/') <= groupName.length() - 1) {
    +86                              if (pkg.containsKey("version")) {
    +87                                  final String group = groupName.substring(0, groupName.indexOf('/'));
    +88                                  final String project = groupName.substring(groupName.indexOf('/') + 1);
    +89                                  String version = pkg.getString("version");
    +90                                  // Some version nubmers begin with v - which doesn't end up matching CPE's
    +91                                  if (version.startsWith("v")) {
    +92                                      version = version.substring(1);
    +93                                  }
    +94                                  LOGGER.debug("Got package {}/{}/{}", group, project, version);
    +95                                  composerDependencies.add(new ComposerDependency(group, project, version));
    +96                              } else {
    +97                                  LOGGER.debug("Group/package {} does not have a version", groupName);
    +98                              }
    +99                          } else {
    +100                             LOGGER.debug("Got a dependency with no name");
    +101                         }
    +102                     }
    +103                 }
    +104             }
    +105         } catch (JsonParsingException jsonpe) {
    +106             throw new ComposerException("Error parsing stream", jsonpe);
    +107         } catch (JsonException jsone) {
    +108             throw new ComposerException("Error reading stream", jsone);
    +109         } catch (IllegalStateException ise) {
    +110             throw new ComposerException("Illegal state in composer stream", ise);
    +111         } catch (ClassCastException cce) {
    +112             throw new ComposerException("Not exactly composer lock", cce);
    +113         }
    +114     }
    +115 
    +116     /**
    +117      * Gets the list of dependencies.
    +118      *
    +119      * @return the list of dependencies
    +120      */
    +121     public List<ComposerDependency> getDependencies() {
    +122         return composerDependencies;
    +123     }
    +124 }
    +
    +
    + + + diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/package-frame.html new file mode 100644 index 000000000..66039b0fd --- /dev/null +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/package-frame.html @@ -0,0 +1,30 @@ + + + + + + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.composer + + + + +

    + org.owasp.dependencycheck.data.composer +

    + +

    Classes

    + + + + + \ No newline at end of file diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/package-summary.html new file mode 100644 index 000000000..3ef2ed0b4 --- /dev/null +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/composer/package-summary.html @@ -0,0 +1,79 @@ + + + + + + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.composer + + + +
    + +
    +
    + +
    + +

    Package org.owasp.dependencycheck.data.composer

    + + + + + + + + + + + + + + + + + + +
    Class Summary
    + ComposerDependency +
    + ComposerException +
    + ComposerLockParser +
    + +
    + +
    +
    + +
    +
    + + + \ No newline at end of file diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/cpe/CpeMemoryIndex.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/cpe/CpeMemoryIndex.html index bca23f0ac..4ba9888f2 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/cpe/CpeMemoryIndex.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/cpe/CpeMemoryIndex.html @@ -159,7 +159,7 @@ 151 */ 152 @SuppressWarnings("unchecked") 153 private Analyzer createIndexingAnalyzer() { -154 final Map fieldAnalyzers = new HashMap(); +154 final Map<String, Analyzer> fieldAnalyzers = new HashMap<String, Analyzer>(); 155 fieldAnalyzers.put(Fields.DOCUMENT_KEY, new KeywordAnalyzer()); 156 return new PerFieldAnalyzerWrapper(new FieldAnalyzer(LuceneUtils.CURRENT_VERSION), fieldAnalyzers); 157 } diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/cpe/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/cpe/package-frame.html index 18ef3ead7..8ad0c8b2e 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/cpe/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/cpe/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.cpe + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.cpe diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/cpe/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/cpe/package-summary.html index 870643cbe..4c6ecd2ff 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/cpe/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/cpe/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.cpe + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.cpe diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/cwe/CweDB.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/cwe/CweDB.html index 4b95575dc..3313bcb5b 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/cwe/CweDB.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/cwe/CweDB.html @@ -32,75 +32,76 @@ 24 import java.io.InputStream; 25 import java.io.ObjectInputStream; 26 import java.util.HashMap; -27 -28 /** -29 * -30 * @author Jeremy Long -31 */ -32 public final class CweDB { -33 -34 /** -35 * The Logger. -36 */ -37 private static final Logger LOGGER = LoggerFactory.getLogger(CweDB.class); -38 -39 /** -40 * Empty private constructor as this is a utility class. -41 */ -42 private CweDB() { -43 //empty -44 } -45 /** -46 * A HashMap of the CWE data. -47 */ -48 private static final HashMap<String, String> CWE = loadData(); -49 -50 /** -51 * Loads a HashMap containing the CWE data from a resource found in the jar. -52 * -53 * @return a HashMap of CWE data -54 */ -55 private static HashMap<String, String> loadData() { -56 ObjectInputStream oin = null; -57 try { -58 final String filePath = "data/cwe.hashmap.serialized"; -59 final InputStream input = CweDB.class.getClassLoader().getResourceAsStream(filePath); -60 oin = new ObjectInputStream(input); -61 @SuppressWarnings("unchecked") -62 final HashMap<String, String> ret = (HashMap<String, String>) oin.readObject(); -63 return ret; -64 } catch (ClassNotFoundException ex) { -65 LOGGER.warn("Unable to load CWE data. This should not be an issue."); -66 LOGGER.debug("", ex); -67 } catch (IOException ex) { -68 LOGGER.warn("Unable to load CWE data due to an IO Error. This should not be an issue."); -69 LOGGER.debug("", ex); -70 } finally { -71 if (oin != null) { -72 try { -73 oin.close(); -74 } catch (IOException ex) { -75 LOGGER.trace("", ex); -76 } -77 } -78 } -79 return null; -80 } -81 -82 /** -83 * <p> -84 * Returns the full CWE name from the CWE ID.</p> -85 * -86 * @param cweId the CWE ID -87 * @return the full name of the CWE -88 */ -89 public static String getCweName(String cweId) { -90 if (cweId != null) { -91 return CWE.get(cweId); -92 } -93 return null; -94 } -95 } +27 import java.util.Map; +28 +29 /** +30 * +31 * @author Jeremy Long +32 */ +33 public final class CweDB { +34 +35 /** +36 * The Logger. +37 */ +38 private static final Logger LOGGER = LoggerFactory.getLogger(CweDB.class); +39 +40 /** +41 * Empty private constructor as this is a utility class. +42 */ +43 private CweDB() { +44 //empty +45 } +46 /** +47 * A HashMap of the CWE data. +48 */ +49 private static final Map<String, String> CWE = loadData(); +50 +51 /** +52 * Loads a HashMap containing the CWE data from a resource found in the jar. +53 * +54 * @return a HashMap of CWE data +55 */ +56 private static Map<String, String> loadData() { +57 ObjectInputStream oin = null; +58 try { +59 final String filePath = "data/cwe.hashmap.serialized"; +60 final InputStream input = CweDB.class.getClassLoader().getResourceAsStream(filePath); +61 oin = new ObjectInputStream(input); +62 @SuppressWarnings("unchecked") +63 final Map<String, String> ret = (HashMap<String, String>) oin.readObject(); +64 return ret; +65 } catch (ClassNotFoundException ex) { +66 LOGGER.warn("Unable to load CWE data. This should not be an issue."); +67 LOGGER.debug("", ex); +68 } catch (IOException ex) { +69 LOGGER.warn("Unable to load CWE data due to an IO Error. This should not be an issue."); +70 LOGGER.debug("", ex); +71 } finally { +72 if (oin != null) { +73 try { +74 oin.close(); +75 } catch (IOException ex) { +76 LOGGER.trace("", ex); +77 } +78 } +79 } +80 return null; +81 } +82 +83 /** +84 * <p> +85 * Returns the full CWE name from the CWE ID.</p> +86 * +87 * @param cweId the CWE ID +88 * @return the full name of the CWE +89 */ +90 public static String getCweName(String cweId) { +91 if (cweId != null) { +92 return CWE.get(cweId); +93 } +94 return null; +95 } +96 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/cwe/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/cwe/package-frame.html index 23f3f85f7..5d8003d08 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/cwe/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/cwe/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.cwe + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.cwe diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/cwe/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/cwe/package-summary.html index 9657f212d..8e552e2c7 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/cwe/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/cwe/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.cwe + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.cwe diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/LuceneUtils.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/LuceneUtils.html index 34f83954b..3961455fe 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/LuceneUtils.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/LuceneUtils.html @@ -101,20 +101,15 @@ 93 * @return the escaped text. 94 */ 95 public static String escapeLuceneQuery(final CharSequence text) { -96 -97 if (text == null) { -98 return null; -99 } -100 -101 int size = text.length(); -102 size = size >> 1; -103 final StringBuilder buf = new StringBuilder(size); -104 -105 appendEscapedLuceneQuery(buf, text); -106 -107 return buf.toString(); -108 } -109 } +96 if (text == null) { +97 return null; +98 } +99 final int size = text.length() << 1; +100 final StringBuilder buf = new StringBuilder(size); +101 appendEscapedLuceneQuery(buf, text); +102 return buf.toString(); +103 } +104 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/TokenPairConcatenatingFilter.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/TokenPairConcatenatingFilter.html index b8793de87..85f04bbef 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/TokenPairConcatenatingFilter.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/TokenPairConcatenatingFilter.html @@ -83,8 +83,8 @@ 75 } 76 77 /** -78 * Increments the underlying TokenStream and sets CharTermAttributes to construct an expanded set of tokens by -79 * concatenating tokens with the previous token. +78 * Increments the underlying TokenStream and sets CharTermAttributes to construct an expanded set of tokens by concatenating +79 * tokens with the previous token. 80 * 81 * @return whether or not we have hit the end of the TokenStream 82 * @throws IOException is thrown when an IOException occurs @@ -120,16 +120,57 @@ 112 113 /** 114 * <p> -115 * Resets the Filter and clears any internal state data that may have been left-over from previous uses of the -116 * Filter.</p> -117 * <p> -118 * <b>If this Filter is re-used this method must be called between uses.</b></p> -119 */ -120 public void clear() { -121 previousWord = null; -122 words.clear(); -123 } -124 } +115 * Resets the Filter and clears any internal state data that may have been left-over from previous uses of the Filter.</p> +116 * <p> +117 * <b>If this Filter is re-used this method must be called between uses.</b></p> +118 */ +119 public void clear() { +120 previousWord = null; +121 words.clear(); +122 } +123 +124 /** +125 * Standard hash code implementation. +126 * +127 * @return the hash code +128 */ +129 @Override +130 public int hashCode() { +131 int hash = 3; +132 hash = 31 * hash + (this.termAtt != null ? this.termAtt.hashCode() : 0); +133 hash = 31 * hash + (this.previousWord != null ? this.previousWord.hashCode() : 0); +134 hash = 31 * hash + (this.words != null ? this.words.hashCode() : 0); +135 return hash; +136 } +137 +138 /** +139 * Standard equals implementation. +140 * +141 * @param obj the object to compare +142 * @return true if the objects are equal; otherwise false. +143 */ +144 @Override +145 public boolean equals(Object obj) { +146 if (obj == null) { +147 return false; +148 } +149 if (getClass() != obj.getClass()) { +150 return false; +151 } +152 final TokenPairConcatenatingFilter other = (TokenPairConcatenatingFilter) obj; +153 if (this.termAtt != other.termAtt && (this.termAtt == null || !this.termAtt.equals(other.termAtt))) { +154 return false; +155 } +156 if ((this.previousWord == null) ? (other.previousWord != null) : !this.previousWord.equals(other.previousWord)) { +157 return false; +158 } +159 if (this.words != other.words && (this.words == null || !this.words.equals(other.words))) { +160 return false; +161 } +162 return true; +163 } +164 +165 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/package-frame.html index 44f680420..a946a7687 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.lucene + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.lucene diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/package-summary.html index c42d664fe..fa10e8008 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/lucene/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.lucene + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.lucene diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/nexus/NexusSearch.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/nexus/NexusSearch.html index 15a730e0e..e0cb9e61f 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/nexus/NexusSearch.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/nexus/NexusSearch.html @@ -140,10 +140,10 @@ 132 "/org.sonatype.nexus.rest.model.NexusArtifact/pomLink", 133 doc); 134 final MavenArtifact ma = new MavenArtifact(groupId, artifactId, version); -135 if (link != null && !"".equals(link)) { +135 if (link != null && !link.isEmpty()) { 136 ma.setArtifactUrl(link); 137 } -138 if (pomLink != null && !"".equals(pomLink)) { +138 if (pomLink != null && !pomLink.isEmpty()) { 139 ma.setPomUrl(pomLink); 140 } 141 return ma; diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/nexus/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/nexus/package-frame.html index b2d257321..447aac03b 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/nexus/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/nexus/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.nexus + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.nexus diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/nexus/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/nexus/package-summary.html index 7cbf88bdf..eb60a38af 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/nexus/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/nexus/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.nexus + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.nexus diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/nuget/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/nuget/package-frame.html index 9350bef04..1b7b9e827 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/nuget/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/nuget/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.nuget + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.nuget diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/nuget/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/nuget/package-summary.html index 43e4b8c7a..aafaf076a 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/nuget/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/nuget/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.nuget + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.nuget diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/CveDB.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/CveDB.html index c8ee9c76f..6674fc18f 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/CveDB.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/CveDB.html @@ -348,17 +348,17 @@ 340 * @throws DatabaseException thrown if there is an exception retrieving data 341 */ 342 public List<Vulnerability> getVulnerabilities(String cpeStr) throws DatabaseException { -343 ResultSet rs = null; -344 final VulnerableSoftware cpe = new VulnerableSoftware(); -345 try { -346 cpe.parseName(cpeStr); -347 } catch (UnsupportedEncodingException ex) { -348 LOGGER.trace("", ex); -349 } -350 final DependencyVersion detectedVersion = parseDependencyVersion(cpe); -351 final List<Vulnerability> vulnerabilities = new ArrayList<Vulnerability>(); -352 -353 PreparedStatement ps; +343 final VulnerableSoftware cpe = new VulnerableSoftware(); +344 try { +345 cpe.parseName(cpeStr); +346 } catch (UnsupportedEncodingException ex) { +347 LOGGER.trace("", ex); +348 } +349 final DependencyVersion detectedVersion = parseDependencyVersion(cpe); +350 final List<Vulnerability> vulnerabilities = new ArrayList<Vulnerability>(); +351 +352 PreparedStatement ps = null; +353 ResultSet rs = null; 354 try { 355 ps = getConnection().prepareStatement(statementBundle.getString("SELECT_CVE_FROM_SOFTWARE")); 356 ps.setString(1, cpe.getVendor()); @@ -392,441 +392,444 @@ 384 v.setMatchedCPE(matchedCPE.getKey(), matchedCPE.getValue() ? "Y" : null); 385 vulnerabilities.add(v); 386 } -387 DBUtils.closeResultSet(rs); -388 DBUtils.closeStatement(ps); -389 } catch (SQLException ex) { -390 throw new DatabaseException("Exception retrieving vulnerability for " + cpeStr, ex); -391 } finally { -392 DBUtils.closeResultSet(rs); -393 } -394 return vulnerabilities; -395 } -396 -397 /** -398 * Gets a vulnerability for the provided CVE. -399 * -400 * @param cve the CVE to lookup -401 * @return a vulnerability object -402 * @throws DatabaseException if an exception occurs -403 */ -404 private Vulnerability getVulnerability(String cve) throws DatabaseException { -405 PreparedStatement psV = null; -406 PreparedStatement psR = null; -407 PreparedStatement psS = null; -408 ResultSet rsV = null; -409 ResultSet rsR = null; -410 ResultSet rsS = null; -411 Vulnerability vuln = null; -412 try { -413 psV = getConnection().prepareStatement(statementBundle.getString("SELECT_VULNERABILITY")); -414 psV.setString(1, cve); -415 rsV = psV.executeQuery(); -416 if (rsV.next()) { -417 vuln = new Vulnerability(); -418 vuln.setName(cve); -419 vuln.setDescription(rsV.getString(2)); -420 String cwe = rsV.getString(3); -421 if (cwe != null) { -422 final String name = CweDB.getCweName(cwe); -423 if (name != null) { -424 cwe += " " + name; -425 } -426 } -427 final int cveId = rsV.getInt(1); -428 vuln.setCwe(cwe); -429 vuln.setCvssScore(rsV.getFloat(4)); -430 vuln.setCvssAccessVector(rsV.getString(5)); -431 vuln.setCvssAccessComplexity(rsV.getString(6)); -432 vuln.setCvssAuthentication(rsV.getString(7)); -433 vuln.setCvssConfidentialityImpact(rsV.getString(8)); -434 vuln.setCvssIntegrityImpact(rsV.getString(9)); -435 vuln.setCvssAvailabilityImpact(rsV.getString(10)); -436 -437 psR = getConnection().prepareStatement(statementBundle.getString("SELECT_REFERENCES")); -438 psR.setInt(1, cveId); -439 rsR = psR.executeQuery(); -440 while (rsR.next()) { -441 vuln.addReference(rsR.getString(1), rsR.getString(2), rsR.getString(3)); -442 } -443 psS = getConnection().prepareStatement(statementBundle.getString("SELECT_SOFTWARE")); -444 psS.setInt(1, cveId); -445 rsS = psS.executeQuery(); -446 while (rsS.next()) { -447 final String cpe = rsS.getString(1); -448 final String prevVersion = rsS.getString(2); -449 if (prevVersion == null) { -450 vuln.addVulnerableSoftware(cpe); -451 } else { -452 vuln.addVulnerableSoftware(cpe, prevVersion); -453 } -454 } -455 } -456 } catch (SQLException ex) { -457 throw new DatabaseException("Error retrieving " + cve, ex); -458 } finally { -459 DBUtils.closeResultSet(rsV); -460 DBUtils.closeResultSet(rsR); -461 DBUtils.closeResultSet(rsS); -462 DBUtils.closeStatement(psV); -463 DBUtils.closeStatement(psR); -464 DBUtils.closeStatement(psS); -465 } -466 return vuln; -467 } -468 -469 /** -470 * Updates the vulnerability within the database. If the vulnerability does not exist it will be added. -471 * -472 * @param vuln the vulnerability to add to the database -473 * @throws DatabaseException is thrown if the database -474 */ -475 public void updateVulnerability(Vulnerability vuln) throws DatabaseException { -476 PreparedStatement selectVulnerabilityId = null; -477 PreparedStatement deleteVulnerability = null; -478 PreparedStatement deleteReferences = null; -479 PreparedStatement deleteSoftware = null; -480 PreparedStatement updateVulnerability = null; -481 PreparedStatement insertVulnerability = null; -482 PreparedStatement insertReference = null; -483 PreparedStatement selectCpeId = null; -484 PreparedStatement insertCpe = null; -485 PreparedStatement insertSoftware = null; -486 -487 try { -488 selectVulnerabilityId = getConnection().prepareStatement(statementBundle.getString("SELECT_VULNERABILITY_ID")); -489 deleteVulnerability = getConnection().prepareStatement(statementBundle.getString("DELETE_VULNERABILITY")); -490 deleteReferences = getConnection().prepareStatement(statementBundle.getString("DELETE_REFERENCE")); -491 deleteSoftware = getConnection().prepareStatement(statementBundle.getString("DELETE_SOFTWARE")); -492 updateVulnerability = getConnection().prepareStatement(statementBundle.getString("UPDATE_VULNERABILITY")); -493 String ids[] = {"id"}; -494 insertVulnerability = getConnection().prepareStatement(statementBundle.getString("INSERT_VULNERABILITY"), -495 //Statement.RETURN_GENERATED_KEYS); -496 ids); -497 insertReference = getConnection().prepareStatement(statementBundle.getString("INSERT_REFERENCE")); -498 selectCpeId = getConnection().prepareStatement(statementBundle.getString("SELECT_CPE_ID")); -499 insertCpe = getConnection().prepareStatement(statementBundle.getString("INSERT_CPE"), -500 //Statement.RETURN_GENERATED_KEYS); -501 ids); -502 insertSoftware = getConnection().prepareStatement(statementBundle.getString("INSERT_SOFTWARE")); -503 int vulnerabilityId = 0; -504 selectVulnerabilityId.setString(1, vuln.getName()); -505 ResultSet rs = selectVulnerabilityId.executeQuery(); -506 if (rs.next()) { -507 vulnerabilityId = rs.getInt(1); -508 // first delete any existing vulnerability info. We don't know what was updated. yes, slower but atm easier. -509 deleteReferences.setInt(1, vulnerabilityId); -510 deleteReferences.execute(); -511 deleteSoftware.setInt(1, vulnerabilityId); -512 deleteSoftware.execute(); -513 } -514 DBUtils.closeResultSet(rs); -515 rs = null; -516 if (vulnerabilityId != 0) { -517 if (vuln.getDescription().contains("** REJECT **")) { -518 deleteVulnerability.setInt(1, vulnerabilityId); -519 deleteVulnerability.executeUpdate(); -520 } else { -521 updateVulnerability.setString(1, vuln.getDescription()); -522 updateVulnerability.setString(2, vuln.getCwe()); -523 updateVulnerability.setFloat(3, vuln.getCvssScore()); -524 updateVulnerability.setString(4, vuln.getCvssAccessVector()); -525 updateVulnerability.setString(5, vuln.getCvssAccessComplexity()); -526 updateVulnerability.setString(6, vuln.getCvssAuthentication()); -527 updateVulnerability.setString(7, vuln.getCvssConfidentialityImpact()); -528 updateVulnerability.setString(8, vuln.getCvssIntegrityImpact()); -529 updateVulnerability.setString(9, vuln.getCvssAvailabilityImpact()); -530 updateVulnerability.setInt(10, vulnerabilityId); -531 updateVulnerability.executeUpdate(); -532 } -533 } else { -534 insertVulnerability.setString(1, vuln.getName()); -535 insertVulnerability.setString(2, vuln.getDescription()); -536 insertVulnerability.setString(3, vuln.getCwe()); -537 insertVulnerability.setFloat(4, vuln.getCvssScore()); -538 insertVulnerability.setString(5, vuln.getCvssAccessVector()); -539 insertVulnerability.setString(6, vuln.getCvssAccessComplexity()); -540 insertVulnerability.setString(7, vuln.getCvssAuthentication()); -541 insertVulnerability.setString(8, vuln.getCvssConfidentialityImpact()); -542 insertVulnerability.setString(9, vuln.getCvssIntegrityImpact()); -543 insertVulnerability.setString(10, vuln.getCvssAvailabilityImpact()); -544 insertVulnerability.execute(); -545 try { -546 rs = insertVulnerability.getGeneratedKeys(); -547 rs.next(); -548 vulnerabilityId = rs.getInt(1); -549 } catch (SQLException ex) { -550 final String msg = String.format("Unable to retrieve id for new vulnerability for '%s'", vuln.getName()); -551 throw new DatabaseException(msg, ex); -552 } finally { -553 DBUtils.closeResultSet(rs); -554 rs = null; -555 } -556 } -557 insertReference.setInt(1, vulnerabilityId); -558 for (Reference r : vuln.getReferences()) { -559 insertReference.setString(2, r.getName()); -560 insertReference.setString(3, r.getUrl()); -561 insertReference.setString(4, r.getSource()); -562 insertReference.execute(); -563 } -564 for (VulnerableSoftware s : vuln.getVulnerableSoftware()) { -565 int cpeProductId = 0; -566 selectCpeId.setString(1, s.getName()); -567 try { -568 rs = selectCpeId.executeQuery(); -569 if (rs.next()) { -570 cpeProductId = rs.getInt(1); -571 } -572 } catch (SQLException ex) { -573 throw new DatabaseException("Unable to get primary key for new cpe: " + s.getName(), ex); -574 } finally { -575 DBUtils.closeResultSet(rs); -576 rs = null; -577 } -578 -579 if (cpeProductId == 0) { -580 insertCpe.setString(1, s.getName()); -581 insertCpe.setString(2, s.getVendor()); -582 insertCpe.setString(3, s.getProduct()); -583 insertCpe.executeUpdate(); -584 cpeProductId = DBUtils.getGeneratedKey(insertCpe); -585 } -586 if (cpeProductId == 0) { -587 throw new DatabaseException("Unable to retrieve cpeProductId - no data returned"); -588 } -589 -590 insertSoftware.setInt(1, vulnerabilityId); -591 insertSoftware.setInt(2, cpeProductId); -592 if (s.getPreviousVersion() == null) { -593 insertSoftware.setNull(3, java.sql.Types.VARCHAR); -594 } else { -595 insertSoftware.setString(3, s.getPreviousVersion()); -596 } -597 insertSoftware.execute(); -598 } -599 -600 } catch (SQLException ex) { -601 final String msg = String.format("Error updating '%s'", vuln.getName()); -602 LOGGER.debug("", ex); -603 throw new DatabaseException(msg, ex); -604 } finally { -605 DBUtils.closeStatement(selectVulnerabilityId); -606 DBUtils.closeStatement(deleteReferences); -607 DBUtils.closeStatement(deleteSoftware); -608 DBUtils.closeStatement(updateVulnerability); -609 DBUtils.closeStatement(deleteVulnerability); -610 DBUtils.closeStatement(insertVulnerability); -611 DBUtils.closeStatement(insertReference); -612 DBUtils.closeStatement(selectCpeId); -613 DBUtils.closeStatement(insertCpe); -614 DBUtils.closeStatement(insertSoftware); -615 } -616 } -617 -618 /** -619 * Checks to see if data exists so that analysis can be performed. -620 * -621 * @return <code>true</code> if data exists; otherwise <code>false</code> -622 */ -623 public boolean dataExists() { -624 Statement cs = null; -625 ResultSet rs = null; -626 try { -627 cs = conn.createStatement(); -628 rs = cs.executeQuery("SELECT COUNT(*) records FROM cpeEntry"); -629 if (rs.next()) { -630 if (rs.getInt(1) > 0) { -631 return true; -632 } -633 } -634 } catch (SQLException ex) { -635 String dd; -636 try { -637 dd = Settings.getDataDirectory().getAbsolutePath(); -638 } catch (IOException ex1) { -639 dd = Settings.getString(Settings.KEYS.DATA_DIRECTORY); -640 } -641 LOGGER.error("Unable to access the local database.\n\nEnsure that '{}' is a writable directory. " -642 + "If the problem persist try deleting the files in '{}' and running {} again. If the problem continues, please " -643 + "create a log file (see documentation at http://jeremylong.github.io/DependencyCheck/) and open a ticket at " -644 + "https://github.com/jeremylong/DependencyCheck/issues and include the log file.\n\n", -645 dd, dd, Settings.getString(Settings.KEYS.APPLICATION_VAME)); -646 LOGGER.debug("", ex); -647 } finally { -648 DBUtils.closeResultSet(rs); -649 DBUtils.closeStatement(cs); -650 } -651 return false; -652 } -653 -654 /** -655 * It is possible that orphaned rows may be generated during database updates. This should be called after all updates have -656 * been completed to ensure orphan entries are removed. -657 */ -658 public void cleanupDatabase() { -659 PreparedStatement ps = null; -660 try { -661 ps = getConnection().prepareStatement(statementBundle.getString("CLEANUP_ORPHANS")); -662 if (ps != null) { -663 ps.executeUpdate(); -664 } -665 } catch (SQLException ex) { -666 LOGGER.error("An unexpected SQL Exception occurred; please see the verbose log for more details."); -667 LOGGER.debug("", ex); -668 } finally { -669 DBUtils.closeStatement(ps); -670 } -671 } -672 -673 /** -674 * Determines if the given identifiedVersion is affected by the given cpeId and previous version flag. A non-null, non-empty -675 * string passed to the previous version argument indicates that all previous versions are affected. -676 * -677 * @param vendor the vendor of the dependency being analyzed -678 * @param product the product name of the dependency being analyzed -679 * @param vulnerableSoftware a map of the vulnerable software with a boolean indicating if all previous versions are affected -680 * @param identifiedVersion the identified version of the dependency being analyzed -681 * @return true if the identified version is affected, otherwise false -682 */ -683 Entry<String, Boolean> getMatchingSoftware(Map<String, Boolean> vulnerableSoftware, String vendor, String product, -684 DependencyVersion identifiedVersion) { -685 -686 final boolean isVersionTwoADifferentProduct = "apache".equals(vendor) && "struts".equals(product); -687 -688 final Set<String> majorVersionsAffectingAllPrevious = new HashSet<String>(); -689 final boolean matchesAnyPrevious = identifiedVersion == null || "-".equals(identifiedVersion.toString()); -690 String majorVersionMatch = null; -691 for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) { -692 final DependencyVersion v = parseDependencyVersion(entry.getKey()); -693 if (v == null || "-".equals(v.toString())) { //all versions -694 return entry; -695 } -696 if (entry.getValue()) { -697 if (matchesAnyPrevious) { -698 return entry; -699 } -700 if (identifiedVersion != null && identifiedVersion.getVersionParts().get(0).equals(v.getVersionParts().get(0))) { -701 majorVersionMatch = v.getVersionParts().get(0); -702 } -703 majorVersionsAffectingAllPrevious.add(v.getVersionParts().get(0)); -704 } -705 } -706 if (matchesAnyPrevious) { -707 return null; -708 } -709 -710 final boolean canSkipVersions = majorVersionMatch != null && majorVersionsAffectingAllPrevious.size() > 1; -711 //yes, we are iterating over this twice. The first time we are skipping versions those that affect all versions -712 //then later we process those that affect all versions. This could be done with sorting... -713 for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) { -714 if (!entry.getValue()) { -715 final DependencyVersion v = parseDependencyVersion(entry.getKey()); -716 //this can't dereference a null 'majorVersionMatch' as canSkipVersions accounts for this. -717 if (canSkipVersions && !majorVersionMatch.equals(v.getVersionParts().get(0))) { -718 continue; -719 } -720 //this can't dereference a null 'identifiedVersion' because if it was null we would have exited -721 //in the above loop or just after loop (if matchesAnyPrevious return null). -722 if (identifiedVersion.equals(v)) { -723 return entry; -724 } -725 } -726 } -727 for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) { -728 if (entry.getValue()) { -729 final DependencyVersion v = parseDependencyVersion(entry.getKey()); -730 //this can't dereference a null 'majorVersionMatch' as canSkipVersions accounts for this. -731 if (canSkipVersions && !majorVersionMatch.equals(v.getVersionParts().get(0))) { -732 continue; -733 } -734 //this can't dereference a null 'identifiedVersion' because if it was null we would have exited -735 //in the above loop or just after loop (if matchesAnyPrevious return null). -736 if (entry.getValue() && identifiedVersion.compareTo(v) <= 0) { -737 if (!(isVersionTwoADifferentProduct && !identifiedVersion.getVersionParts().get(0).equals(v.getVersionParts().get(0)))) { -738 return entry; -739 } -740 } -741 } -742 } -743 return null; -744 } -745 -746 /** -747 * Parses the version (including revision) from a CPE identifier. If no version is identified then a '-' is returned. -748 * -749 * @param cpeStr a cpe identifier -750 * @return a dependency version -751 */ -752 private DependencyVersion parseDependencyVersion(String cpeStr) { -753 final VulnerableSoftware cpe = new VulnerableSoftware(); -754 try { -755 cpe.parseName(cpeStr); -756 } catch (UnsupportedEncodingException ex) { -757 //never going to happen. -758 LOGGER.trace("", ex); -759 } -760 return parseDependencyVersion(cpe); -761 } -762 -763 /** -764 * Takes a CPE and parses out the version number. If no version is identified then a '-' is returned. -765 * -766 * @param cpe a cpe object -767 * @return a dependency version -768 */ -769 private DependencyVersion parseDependencyVersion(VulnerableSoftware cpe) { -770 DependencyVersion cpeVersion; -771 if (cpe.getVersion() != null && !cpe.getVersion().isEmpty()) { -772 String versionText; -773 if (cpe.getUpdate() != null && !cpe.getUpdate().isEmpty()) { -774 versionText = String.format("%s.%s", cpe.getVersion(), cpe.getUpdate()); -775 } else { -776 versionText = cpe.getVersion(); -777 } -778 cpeVersion = DependencyVersionUtil.parseVersion(versionText); -779 } else { -780 cpeVersion = new DependencyVersion("-"); -781 } -782 return cpeVersion; -783 } -784 -785 /** -786 * Deletes unused dictionary entries from the database. -787 */ -788 public void deleteUnusedCpe() { -789 CallableStatement cs = null; -790 try { -791 cs = getConnection().prepareCall(statementBundle.getString("DELETE_UNUSED_DICT_CPE")); -792 cs.executeUpdate(); -793 } catch (SQLException ex) { -794 LOGGER.error("Unable to delete CPE dictionary entries", ex); -795 } finally { -796 DBUtils.closeStatement(cs); -797 } -798 } -799 -800 /** -801 * Merges CPE entries into the database. -802 * -803 * @param cpe the CPE identifier -804 * @param vendor the CPE vendor -805 * @param product the CPE product -806 */ -807 public void addCpe(String cpe, String vendor, String product) { -808 PreparedStatement ps = null; -809 try { -810 ps = getConnection().prepareCall(statementBundle.getString("ADD_DICT_CPE")); -811 ps.setString(1, cpe); -812 ps.setString(2, vendor); -813 ps.setString(3, product); -814 ps.executeUpdate(); -815 } catch (SQLException ex) { -816 LOGGER.error("Unable to add CPE dictionary entry", ex); -817 } finally { -818 DBUtils.closeStatement(ps); -819 } -820 } -821 } +387 } catch (SQLException ex) { +388 throw new DatabaseException("Exception retrieving vulnerability for " + cpeStr, ex); +389 } finally { +390 DBUtils.closeResultSet(rs); +391 DBUtils.closeStatement(ps); +392 } +393 return vulnerabilities; +394 } +395 +396 /** +397 * Gets a vulnerability for the provided CVE. +398 * +399 * @param cve the CVE to lookup +400 * @return a vulnerability object +401 * @throws DatabaseException if an exception occurs +402 */ +403 private Vulnerability getVulnerability(String cve) throws DatabaseException { +404 PreparedStatement psV = null; +405 PreparedStatement psR = null; +406 PreparedStatement psS = null; +407 ResultSet rsV = null; +408 ResultSet rsR = null; +409 ResultSet rsS = null; +410 Vulnerability vuln = null; +411 try { +412 psV = getConnection().prepareStatement(statementBundle.getString("SELECT_VULNERABILITY")); +413 psV.setString(1, cve); +414 rsV = psV.executeQuery(); +415 if (rsV.next()) { +416 vuln = new Vulnerability(); +417 vuln.setName(cve); +418 vuln.setDescription(rsV.getString(2)); +419 String cwe = rsV.getString(3); +420 if (cwe != null) { +421 final String name = CweDB.getCweName(cwe); +422 if (name != null) { +423 cwe += " " + name; +424 } +425 } +426 final int cveId = rsV.getInt(1); +427 vuln.setCwe(cwe); +428 vuln.setCvssScore(rsV.getFloat(4)); +429 vuln.setCvssAccessVector(rsV.getString(5)); +430 vuln.setCvssAccessComplexity(rsV.getString(6)); +431 vuln.setCvssAuthentication(rsV.getString(7)); +432 vuln.setCvssConfidentialityImpact(rsV.getString(8)); +433 vuln.setCvssIntegrityImpact(rsV.getString(9)); +434 vuln.setCvssAvailabilityImpact(rsV.getString(10)); +435 +436 psR = getConnection().prepareStatement(statementBundle.getString("SELECT_REFERENCES")); +437 psR.setInt(1, cveId); +438 rsR = psR.executeQuery(); +439 while (rsR.next()) { +440 vuln.addReference(rsR.getString(1), rsR.getString(2), rsR.getString(3)); +441 } +442 psS = getConnection().prepareStatement(statementBundle.getString("SELECT_SOFTWARE")); +443 psS.setInt(1, cveId); +444 rsS = psS.executeQuery(); +445 while (rsS.next()) { +446 final String cpe = rsS.getString(1); +447 final String prevVersion = rsS.getString(2); +448 if (prevVersion == null) { +449 vuln.addVulnerableSoftware(cpe); +450 } else { +451 vuln.addVulnerableSoftware(cpe, prevVersion); +452 } +453 } +454 } +455 } catch (SQLException ex) { +456 throw new DatabaseException("Error retrieving " + cve, ex); +457 } finally { +458 DBUtils.closeResultSet(rsV); +459 DBUtils.closeResultSet(rsR); +460 DBUtils.closeResultSet(rsS); +461 DBUtils.closeStatement(psV); +462 DBUtils.closeStatement(psR); +463 DBUtils.closeStatement(psS); +464 } +465 return vuln; +466 } +467 +468 /** +469 * Updates the vulnerability within the database. If the vulnerability does not exist it will be added. +470 * +471 * @param vuln the vulnerability to add to the database +472 * @throws DatabaseException is thrown if the database +473 */ +474 public void updateVulnerability(Vulnerability vuln) throws DatabaseException { +475 PreparedStatement selectVulnerabilityId = null; +476 PreparedStatement deleteVulnerability = null; +477 PreparedStatement deleteReferences = null; +478 PreparedStatement deleteSoftware = null; +479 PreparedStatement updateVulnerability = null; +480 PreparedStatement insertVulnerability = null; +481 PreparedStatement insertReference = null; +482 PreparedStatement selectCpeId = null; +483 PreparedStatement insertCpe = null; +484 PreparedStatement insertSoftware = null; +485 +486 try { +487 selectVulnerabilityId = getConnection().prepareStatement(statementBundle.getString("SELECT_VULNERABILITY_ID")); +488 deleteVulnerability = getConnection().prepareStatement(statementBundle.getString("DELETE_VULNERABILITY")); +489 deleteReferences = getConnection().prepareStatement(statementBundle.getString("DELETE_REFERENCE")); +490 deleteSoftware = getConnection().prepareStatement(statementBundle.getString("DELETE_SOFTWARE")); +491 updateVulnerability = getConnection().prepareStatement(statementBundle.getString("UPDATE_VULNERABILITY")); +492 final String[] ids = {"id"}; +493 insertVulnerability = getConnection().prepareStatement(statementBundle.getString("INSERT_VULNERABILITY"), +494 //Statement.RETURN_GENERATED_KEYS); +495 ids); +496 insertReference = getConnection().prepareStatement(statementBundle.getString("INSERT_REFERENCE")); +497 selectCpeId = getConnection().prepareStatement(statementBundle.getString("SELECT_CPE_ID")); +498 insertCpe = getConnection().prepareStatement(statementBundle.getString("INSERT_CPE"), +499 //Statement.RETURN_GENERATED_KEYS); +500 ids); +501 insertSoftware = getConnection().prepareStatement(statementBundle.getString("INSERT_SOFTWARE")); +502 int vulnerabilityId = 0; +503 selectVulnerabilityId.setString(1, vuln.getName()); +504 ResultSet rs = selectVulnerabilityId.executeQuery(); +505 if (rs.next()) { +506 vulnerabilityId = rs.getInt(1); +507 // first delete any existing vulnerability info. We don't know what was updated. yes, slower but atm easier. +508 deleteReferences.setInt(1, vulnerabilityId); +509 deleteReferences.execute(); +510 deleteSoftware.setInt(1, vulnerabilityId); +511 deleteSoftware.execute(); +512 } +513 DBUtils.closeResultSet(rs); +514 rs = null; +515 if (vulnerabilityId != 0) { +516 if (vuln.getDescription().contains("** REJECT **")) { +517 deleteVulnerability.setInt(1, vulnerabilityId); +518 deleteVulnerability.executeUpdate(); +519 } else { +520 updateVulnerability.setString(1, vuln.getDescription()); +521 updateVulnerability.setString(2, vuln.getCwe()); +522 updateVulnerability.setFloat(3, vuln.getCvssScore()); +523 updateVulnerability.setString(4, vuln.getCvssAccessVector()); +524 updateVulnerability.setString(5, vuln.getCvssAccessComplexity()); +525 updateVulnerability.setString(6, vuln.getCvssAuthentication()); +526 updateVulnerability.setString(7, vuln.getCvssConfidentialityImpact()); +527 updateVulnerability.setString(8, vuln.getCvssIntegrityImpact()); +528 updateVulnerability.setString(9, vuln.getCvssAvailabilityImpact()); +529 updateVulnerability.setInt(10, vulnerabilityId); +530 updateVulnerability.executeUpdate(); +531 } +532 } else { +533 insertVulnerability.setString(1, vuln.getName()); +534 insertVulnerability.setString(2, vuln.getDescription()); +535 insertVulnerability.setString(3, vuln.getCwe()); +536 insertVulnerability.setFloat(4, vuln.getCvssScore()); +537 insertVulnerability.setString(5, vuln.getCvssAccessVector()); +538 insertVulnerability.setString(6, vuln.getCvssAccessComplexity()); +539 insertVulnerability.setString(7, vuln.getCvssAuthentication()); +540 insertVulnerability.setString(8, vuln.getCvssConfidentialityImpact()); +541 insertVulnerability.setString(9, vuln.getCvssIntegrityImpact()); +542 insertVulnerability.setString(10, vuln.getCvssAvailabilityImpact()); +543 insertVulnerability.execute(); +544 try { +545 rs = insertVulnerability.getGeneratedKeys(); +546 rs.next(); +547 vulnerabilityId = rs.getInt(1); +548 } catch (SQLException ex) { +549 final String msg = String.format("Unable to retrieve id for new vulnerability for '%s'", vuln.getName()); +550 throw new DatabaseException(msg, ex); +551 } finally { +552 DBUtils.closeResultSet(rs); +553 rs = null; +554 } +555 } +556 insertReference.setInt(1, vulnerabilityId); +557 for (Reference r : vuln.getReferences()) { +558 insertReference.setString(2, r.getName()); +559 insertReference.setString(3, r.getUrl()); +560 insertReference.setString(4, r.getSource()); +561 insertReference.execute(); +562 } +563 for (VulnerableSoftware s : vuln.getVulnerableSoftware()) { +564 int cpeProductId = 0; +565 selectCpeId.setString(1, s.getName()); +566 try { +567 rs = selectCpeId.executeQuery(); +568 if (rs.next()) { +569 cpeProductId = rs.getInt(1); +570 } +571 } catch (SQLException ex) { +572 throw new DatabaseException("Unable to get primary key for new cpe: " + s.getName(), ex); +573 } finally { +574 DBUtils.closeResultSet(rs); +575 rs = null; +576 } +577 +578 if (cpeProductId == 0) { +579 insertCpe.setString(1, s.getName()); +580 insertCpe.setString(2, s.getVendor()); +581 insertCpe.setString(3, s.getProduct()); +582 insertCpe.executeUpdate(); +583 cpeProductId = DBUtils.getGeneratedKey(insertCpe); +584 } +585 if (cpeProductId == 0) { +586 throw new DatabaseException("Unable to retrieve cpeProductId - no data returned"); +587 } +588 +589 insertSoftware.setInt(1, vulnerabilityId); +590 insertSoftware.setInt(2, cpeProductId); +591 if (s.getPreviousVersion() == null) { +592 insertSoftware.setNull(3, java.sql.Types.VARCHAR); +593 } else { +594 insertSoftware.setString(3, s.getPreviousVersion()); +595 } +596 insertSoftware.execute(); +597 } +598 +599 } catch (SQLException ex) { +600 final String msg = String.format("Error updating '%s'", vuln.getName()); +601 LOGGER.debug("", ex); +602 throw new DatabaseException(msg, ex); +603 } finally { +604 DBUtils.closeStatement(selectVulnerabilityId); +605 DBUtils.closeStatement(deleteReferences); +606 DBUtils.closeStatement(deleteSoftware); +607 DBUtils.closeStatement(updateVulnerability); +608 DBUtils.closeStatement(deleteVulnerability); +609 DBUtils.closeStatement(insertVulnerability); +610 DBUtils.closeStatement(insertReference); +611 DBUtils.closeStatement(selectCpeId); +612 DBUtils.closeStatement(insertCpe); +613 DBUtils.closeStatement(insertSoftware); +614 } +615 } +616 +617 /** +618 * Checks to see if data exists so that analysis can be performed. +619 * +620 * @return <code>true</code> if data exists; otherwise <code>false</code> +621 */ +622 public boolean dataExists() { +623 Statement cs = null; +624 ResultSet rs = null; +625 try { +626 cs = conn.createStatement(); +627 rs = cs.executeQuery("SELECT COUNT(*) records FROM cpeEntry"); +628 if (rs.next()) { +629 if (rs.getInt(1) > 0) { +630 return true; +631 } +632 } +633 } catch (SQLException ex) { +634 String dd; +635 try { +636 dd = Settings.getDataDirectory().getAbsolutePath(); +637 } catch (IOException ex1) { +638 dd = Settings.getString(Settings.KEYS.DATA_DIRECTORY); +639 } +640 LOGGER.error("Unable to access the local database.\n\nEnsure that '{}' is a writable directory. " +641 + "If the problem persist try deleting the files in '{}' and running {} again. If the problem continues, please " +642 + "create a log file (see documentation at http://jeremylong.github.io/DependencyCheck/) and open a ticket at " +643 + "https://github.com/jeremylong/DependencyCheck/issues and include the log file.\n\n", +644 dd, dd, Settings.getString(Settings.KEYS.APPLICATION_VAME)); +645 LOGGER.debug("", ex); +646 } finally { +647 DBUtils.closeResultSet(rs); +648 DBUtils.closeStatement(cs); +649 } +650 return false; +651 } +652 +653 /** +654 * It is possible that orphaned rows may be generated during database updates. This should be called after all updates have +655 * been completed to ensure orphan entries are removed. +656 */ +657 public void cleanupDatabase() { +658 PreparedStatement ps = null; +659 try { +660 ps = getConnection().prepareStatement(statementBundle.getString("CLEANUP_ORPHANS")); +661 if (ps != null) { +662 ps.executeUpdate(); +663 } +664 } catch (SQLException ex) { +665 LOGGER.error("An unexpected SQL Exception occurred; please see the verbose log for more details."); +666 LOGGER.debug("", ex); +667 } finally { +668 DBUtils.closeStatement(ps); +669 } +670 } +671 +672 /** +673 * Determines if the given identifiedVersion is affected by the given cpeId and previous version flag. A non-null, non-empty +674 * string passed to the previous version argument indicates that all previous versions are affected. +675 * +676 * @param vendor the vendor of the dependency being analyzed +677 * @param product the product name of the dependency being analyzed +678 * @param vulnerableSoftware a map of the vulnerable software with a boolean indicating if all previous versions are affected +679 * @param identifiedVersion the identified version of the dependency being analyzed +680 * @return true if the identified version is affected, otherwise false +681 */ +682 Entry<String, Boolean> getMatchingSoftware(Map<String, Boolean> vulnerableSoftware, String vendor, String product, +683 DependencyVersion identifiedVersion) { +684 +685 final boolean isVersionTwoADifferentProduct = "apache".equals(vendor) && "struts".equals(product); +686 +687 final Set<String> majorVersionsAffectingAllPrevious = new HashSet<String>(); +688 final boolean matchesAnyPrevious = identifiedVersion == null || "-".equals(identifiedVersion.toString()); +689 String majorVersionMatch = null; +690 for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) { +691 final DependencyVersion v = parseDependencyVersion(entry.getKey()); +692 if (v == null || "-".equals(v.toString())) { //all versions +693 return entry; +694 } +695 if (entry.getValue()) { +696 if (matchesAnyPrevious) { +697 return entry; +698 } +699 if (identifiedVersion != null && identifiedVersion.getVersionParts().get(0).equals(v.getVersionParts().get(0))) { +700 majorVersionMatch = v.getVersionParts().get(0); +701 } +702 majorVersionsAffectingAllPrevious.add(v.getVersionParts().get(0)); +703 } +704 } +705 if (matchesAnyPrevious) { +706 return null; +707 } +708 +709 final boolean canSkipVersions = majorVersionMatch != null && majorVersionsAffectingAllPrevious.size() > 1; +710 //yes, we are iterating over this twice. The first time we are skipping versions those that affect all versions +711 //then later we process those that affect all versions. This could be done with sorting... +712 for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) { +713 if (!entry.getValue()) { +714 final DependencyVersion v = parseDependencyVersion(entry.getKey()); +715 //this can't dereference a null 'majorVersionMatch' as canSkipVersions accounts for this. +716 if (canSkipVersions && !majorVersionMatch.equals(v.getVersionParts().get(0))) { +717 continue; +718 } +719 //this can't dereference a null 'identifiedVersion' because if it was null we would have exited +720 //in the above loop or just after loop (if matchesAnyPrevious return null). +721 if (identifiedVersion.equals(v)) { +722 return entry; +723 } +724 } +725 } +726 for (Entry<String, Boolean> entry : vulnerableSoftware.entrySet()) { +727 if (entry.getValue()) { +728 final DependencyVersion v = parseDependencyVersion(entry.getKey()); +729 //this can't dereference a null 'majorVersionMatch' as canSkipVersions accounts for this. +730 if (canSkipVersions && !majorVersionMatch.equals(v.getVersionParts().get(0))) { +731 continue; +732 } +733 //this can't dereference a null 'identifiedVersion' because if it was null we would have exited +734 //in the above loop or just after loop (if matchesAnyPrevious return null). +735 if (entry.getValue() && identifiedVersion.compareTo(v) <= 0) { +736 if (!(isVersionTwoADifferentProduct && !identifiedVersion.getVersionParts().get(0).equals(v.getVersionParts().get(0)))) { +737 return entry; +738 } +739 } +740 } +741 } +742 return null; +743 } +744 +745 /** +746 * Parses the version (including revision) from a CPE identifier. If no version is identified then a '-' is returned. +747 * +748 * @param cpeStr a cpe identifier +749 * @return a dependency version +750 */ +751 private DependencyVersion parseDependencyVersion(String cpeStr) { +752 final VulnerableSoftware cpe = new VulnerableSoftware(); +753 try { +754 cpe.parseName(cpeStr); +755 } catch (UnsupportedEncodingException ex) { +756 //never going to happen. +757 LOGGER.trace("", ex); +758 } +759 return parseDependencyVersion(cpe); +760 } +761 +762 /** +763 * Takes a CPE and parses out the version number. If no version is identified then a '-' is returned. +764 * +765 * @param cpe a cpe object +766 * @return a dependency version +767 */ +768 private DependencyVersion parseDependencyVersion(VulnerableSoftware cpe) { +769 final DependencyVersion cpeVersion; +770 if (cpe.getVersion() != null && !cpe.getVersion().isEmpty()) { +771 final String versionText; +772 if (cpe.getUpdate() != null && !cpe.getUpdate().isEmpty()) { +773 versionText = String.format("%s.%s", cpe.getVersion(), cpe.getUpdate()); +774 } else { +775 versionText = cpe.getVersion(); +776 } +777 cpeVersion = DependencyVersionUtil.parseVersion(versionText); +778 } else { +779 cpeVersion = new DependencyVersion("-"); +780 } +781 return cpeVersion; +782 } +783 +784 /** +785 * This method is only referenced in unused code. +786 * +787 * Deletes unused dictionary entries from the database. +788 */ +789 public void deleteUnusedCpe() { +790 CallableStatement cs = null; +791 try { +792 cs = getConnection().prepareCall(statementBundle.getString("DELETE_UNUSED_DICT_CPE")); +793 cs.executeUpdate(); +794 } catch (SQLException ex) { +795 LOGGER.error("Unable to delete CPE dictionary entries", ex); +796 } finally { +797 DBUtils.closeStatement(cs); +798 } +799 } +800 +801 /** +802 * This method is only referenced in unused code and will likely break on MySQL if ever used due to the MERGE statement. +803 * +804 * Merges CPE entries into the database. +805 * +806 * @param cpe the CPE identifier +807 * @param vendor the CPE vendor +808 * @param product the CPE product +809 */ +810 public void addCpe(String cpe, String vendor, String product) { +811 PreparedStatement ps = null; +812 try { +813 ps = getConnection().prepareCall(statementBundle.getString("ADD_DICT_CPE")); +814 ps.setString(1, cpe); +815 ps.setString(2, vendor); +816 ps.setString(3, product); +817 ps.executeUpdate(); +818 } catch (SQLException ex) { +819 LOGGER.error("Unable to add CPE dictionary entry", ex); +820 } finally { +821 DBUtils.closeStatement(ps); +822 } +823 } +824 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/DriverShim.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/DriverShim.html index 8fd6e73bf..fc39c1576 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/DriverShim.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/DriverShim.html @@ -123,7 +123,7 @@ 115 * @throws SQLFeatureNotSupportedException thrown if the feature is not supported 116 * @see java.sql.Driver#getParentLogger() 117 */ -118 //@Override +118 @Override 119 public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException { 120 //return driver.getParentLogger(); 121 Method m = null; diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/package-frame.html index 19538a88d..131c96d1c 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.nvdcve + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.nvdcve diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/package-summary.html index f0d2d34a5..f1c18acd7 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/nvdcve/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.nvdcve + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.nvdcve diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/CpeUpdater.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/CpeUpdater.html index 521af1546..25e85f441 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/CpeUpdater.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/CpeUpdater.html @@ -32,178 +32,180 @@ 24 import java.io.IOException; 25 import java.net.MalformedURLException; 26 import java.net.URL; -27 import java.util.Date; -28 import java.util.List; -29 import java.util.zip.GZIPInputStream; -30 import javax.xml.parsers.ParserConfigurationException; -31 import javax.xml.parsers.SAXParser; -32 import javax.xml.parsers.SAXParserFactory; -33 import org.apache.commons.io.FileUtils; -34 import static org.owasp.dependencycheck.data.nvdcve.DatabaseProperties.LAST_CPE_UPDATE; -35 import org.owasp.dependencycheck.data.update.cpe.CPEHandler; -36 import org.owasp.dependencycheck.data.update.cpe.Cpe; -37 import org.owasp.dependencycheck.data.update.exception.UpdateException; -38 import org.owasp.dependencycheck.utils.DateUtil; -39 import org.owasp.dependencycheck.utils.DownloadFailedException; -40 import org.owasp.dependencycheck.utils.Downloader; -41 import org.owasp.dependencycheck.utils.Settings; -42 import org.slf4j.Logger; -43 import org.slf4j.LoggerFactory; -44 import org.xml.sax.SAXException; -45 -46 /** -47 * The CpeUpdater is designed to download the CPE data file from NIST and import the data into the database. However, as this -48 * currently adds no beneficial data, compared to what is in the CPE data contained in the CVE data files, this class is not -49 * currently used. The code is being kept as a future update may utilize more data from the CPE xml files. -50 * -51 * @author Jeremy Long -52 */ -53 public class CpeUpdater extends BaseUpdater implements CachedWebDataSource { -54 -55 /** -56 * Static logger. -57 */ -58 private static final Logger LOGGER = LoggerFactory.getLogger(CpeUpdater.class); -59 -60 @Override -61 public void update() throws UpdateException { -62 try { -63 openDataStores(); -64 if (updateNeeded()) { -65 LOGGER.info("Updating the Common Platform Enumeration (CPE)"); -66 final File xml = downloadCpe(); -67 final List<Cpe> cpes = processXML(xml); -68 getCveDB().deleteUnusedCpe(); -69 for (Cpe cpe : cpes) { -70 getCveDB().addCpe(cpe.getValue(), cpe.getVendor(), cpe.getProduct()); -71 } -72 final Date now = new Date(); -73 getProperties().save(LAST_CPE_UPDATE, Long.toString(now.getTime())); -74 LOGGER.info("CPE update complete"); -75 } -76 } finally { -77 closeDataStores(); -78 } -79 } -80 -81 /** -82 * Downloads the CPE XML file. -83 * -84 * @return the file reference to the CPE.xml file -85 * @throws UpdateException thrown if there is an issue downloading the XML file -86 */ -87 private File downloadCpe() throws UpdateException { -88 File xml; -89 final URL url; -90 try { -91 url = new URL(Settings.getString(Settings.KEYS.CPE_URL)); -92 xml = File.createTempFile("cpe", ".xml", Settings.getTempDirectory()); -93 Downloader.fetchFile(url, xml); -94 if (url.toExternalForm().endsWith(".xml.gz")) { -95 extractGzip(xml); -96 } -97 -98 } catch (MalformedURLException ex) { -99 throw new UpdateException("Invalid CPE URL", ex); -100 } catch (DownloadFailedException ex) { -101 throw new UpdateException("Unable to download CPE XML file", ex); -102 } catch (IOException ex) { -103 throw new UpdateException("Unable to create temporary file to download CPE", ex); -104 } -105 return xml; -106 } -107 -108 /** -109 * Parses the CPE XML file to return a list of CPE entries. -110 * -111 * @param xml the CPE data file -112 * @return the list of CPE entries -113 * @throws UpdateException thrown if there is an issue with parsing the XML file -114 */ -115 private List<Cpe> processXML(final File xml) throws UpdateException { -116 try { -117 final SAXParserFactory factory = SAXParserFactory.newInstance(); -118 final SAXParser saxParser = factory.newSAXParser(); -119 final CPEHandler handler = new CPEHandler(); -120 saxParser.parse(xml, handler); -121 return handler.getData(); -122 } catch (ParserConfigurationException ex) { -123 throw new UpdateException("Unable to parse CPE XML file due to SAX Parser Issue", ex); -124 } catch (SAXException ex) { -125 throw new UpdateException("Unable to parse CPE XML file due to SAX Parser Exception", ex); -126 } catch (IOException ex) { -127 throw new UpdateException("Unable to parse CPE XML file due to IO Failure", ex); -128 } -129 } -130 -131 /** -132 * Checks to find the last time the CPE data was refreshed and if it needs to be updated. -133 * -134 * @return true if the CPE data should be refreshed -135 */ -136 private boolean updateNeeded() { -137 final Date now = new Date(); -138 final int days = Settings.getInt(Settings.KEYS.CVE_MODIFIED_VALID_FOR_DAYS, 30); -139 long timestamp = 0; -140 final String ts = getProperties().getProperty(LAST_CPE_UPDATE); -141 if (ts != null && ts.matches("^[0-9]+$")) { -142 timestamp = Long.parseLong(ts); -143 } -144 return !DateUtil.withinDateRange(timestamp, now.getTime(), days); -145 } -146 -147 /** -148 * Extracts the file contained in a gzip archive. The extracted file is placed in the exact same path as the file specified. -149 * -150 * @param file the archive file -151 * @throws FileNotFoundException thrown if the file does not exist -152 * @throws IOException thrown if there is an error extracting the file. -153 */ -154 private void extractGzip(File file) throws FileNotFoundException, IOException { -155 //TODO - move this to a util class as it is duplicative of (copy of) code in the DownloadTask -156 final String originalPath = file.getPath(); -157 final File gzip = new File(originalPath + ".gz"); -158 if (gzip.isFile() && !gzip.delete()) { -159 gzip.deleteOnExit(); -160 } -161 if (!file.renameTo(gzip)) { -162 throw new IOException("Unable to rename '" + file.getPath() + "'"); -163 } -164 final File newfile = new File(originalPath); -165 -166 final byte[] buffer = new byte[4096]; +27 import java.util.List; +28 import java.util.zip.GZIPInputStream; +29 import javax.xml.parsers.ParserConfigurationException; +30 import javax.xml.parsers.SAXParser; +31 import javax.xml.parsers.SAXParserFactory; +32 import org.apache.commons.io.FileUtils; +33 import static org.owasp.dependencycheck.data.nvdcve.DatabaseProperties.LAST_CPE_UPDATE; +34 import org.owasp.dependencycheck.data.update.cpe.CPEHandler; +35 import org.owasp.dependencycheck.data.update.cpe.Cpe; +36 import org.owasp.dependencycheck.data.update.exception.UpdateException; +37 import org.owasp.dependencycheck.utils.DateUtil; +38 import org.owasp.dependencycheck.utils.DownloadFailedException; +39 import org.owasp.dependencycheck.utils.Downloader; +40 import org.owasp.dependencycheck.utils.Settings; +41 import org.slf4j.Logger; +42 import org.slf4j.LoggerFactory; +43 import org.xml.sax.SAXException; +44 +45 /** +46 * +47 * This class is currently unused and if enabled will likely not work on MySQL as the MERGE statement is used. +48 * +49 * The CpeUpdater is designed to download the CPE data file from NIST and import the data into the database. However, as this +50 * currently adds no beneficial data, compared to what is in the CPE data contained in the CVE data files, this class is not +51 * currently used. The code is being kept as a future update may utilize more data from the CPE xml files. +52 * +53 * @author Jeremy Long +54 */ +55 public class CpeUpdater extends BaseUpdater implements CachedWebDataSource { +56 +57 /** +58 * Static logger. +59 */ +60 private static final Logger LOGGER = LoggerFactory.getLogger(CpeUpdater.class); +61 +62 @Override +63 public void update() throws UpdateException { +64 try { +65 openDataStores(); +66 if (updateNeeded()) { +67 LOGGER.info("Updating the Common Platform Enumeration (CPE)"); +68 final File xml = downloadCpe(); +69 final List<Cpe> cpes = processXML(xml); +70 getCveDB().deleteUnusedCpe(); +71 for (Cpe cpe : cpes) { +72 getCveDB().addCpe(cpe.getValue(), cpe.getVendor(), cpe.getProduct()); +73 } +74 final long now = System.currentTimeMillis(); +75 getProperties().save(LAST_CPE_UPDATE, Long.toString(now)); +76 LOGGER.info("CPE update complete"); +77 } +78 } finally { +79 closeDataStores(); +80 } +81 } +82 +83 /** +84 * Downloads the CPE XML file. +85 * +86 * @return the file reference to the CPE.xml file +87 * @throws UpdateException thrown if there is an issue downloading the XML file +88 */ +89 private File downloadCpe() throws UpdateException { +90 File xml; +91 final URL url; +92 try { +93 url = new URL(Settings.getString(Settings.KEYS.CPE_URL)); +94 xml = File.createTempFile("cpe", ".xml", Settings.getTempDirectory()); +95 Downloader.fetchFile(url, xml); +96 if (url.toExternalForm().endsWith(".xml.gz")) { +97 extractGzip(xml); +98 } +99 +100 } catch (MalformedURLException ex) { +101 throw new UpdateException("Invalid CPE URL", ex); +102 } catch (DownloadFailedException ex) { +103 throw new UpdateException("Unable to download CPE XML file", ex); +104 } catch (IOException ex) { +105 throw new UpdateException("Unable to create temporary file to download CPE", ex); +106 } +107 return xml; +108 } +109 +110 /** +111 * Parses the CPE XML file to return a list of CPE entries. +112 * +113 * @param xml the CPE data file +114 * @return the list of CPE entries +115 * @throws UpdateException thrown if there is an issue with parsing the XML file +116 */ +117 private List<Cpe> processXML(final File xml) throws UpdateException { +118 try { +119 final SAXParserFactory factory = SAXParserFactory.newInstance(); +120 final SAXParser saxParser = factory.newSAXParser(); +121 final CPEHandler handler = new CPEHandler(); +122 saxParser.parse(xml, handler); +123 return handler.getData(); +124 } catch (ParserConfigurationException ex) { +125 throw new UpdateException("Unable to parse CPE XML file due to SAX Parser Issue", ex); +126 } catch (SAXException ex) { +127 throw new UpdateException("Unable to parse CPE XML file due to SAX Parser Exception", ex); +128 } catch (IOException ex) { +129 throw new UpdateException("Unable to parse CPE XML file due to IO Failure", ex); +130 } +131 } +132 +133 /** +134 * Checks to find the last time the CPE data was refreshed and if it needs to be updated. +135 * +136 * @return true if the CPE data should be refreshed +137 */ +138 private boolean updateNeeded() { +139 final long now = System.currentTimeMillis(); +140 final int days = Settings.getInt(Settings.KEYS.CVE_MODIFIED_VALID_FOR_DAYS, 30); +141 long timestamp = 0; +142 final String ts = getProperties().getProperty(LAST_CPE_UPDATE); +143 if (ts != null && ts.matches("^[0-9]+$")) { +144 timestamp = Long.parseLong(ts); +145 } +146 return !DateUtil.withinDateRange(timestamp, now, days); +147 } +148 +149 /** +150 * Extracts the file contained in a gzip archive. The extracted file is placed in the exact same path as the file specified. +151 * +152 * @param file the archive file +153 * @throws FileNotFoundException thrown if the file does not exist +154 * @throws IOException thrown if there is an error extracting the file. +155 */ +156 private void extractGzip(File file) throws FileNotFoundException, IOException { +157 //TODO - move this to a util class as it is duplicative of (copy of) code in the DownloadTask +158 final String originalPath = file.getPath(); +159 final File gzip = new File(originalPath + ".gz"); +160 if (gzip.isFile() && !gzip.delete()) { +161 gzip.deleteOnExit(); +162 } +163 if (!file.renameTo(gzip)) { +164 throw new IOException("Unable to rename '" + file.getPath() + "'"); +165 } +166 final File newfile = new File(originalPath); 167 -168 GZIPInputStream cin = null; -169 FileOutputStream out = null; -170 try { -171 cin = new GZIPInputStream(new FileInputStream(gzip)); -172 out = new FileOutputStream(newfile); -173 -174 int len; -175 while ((len = cin.read(buffer)) > 0) { -176 out.write(buffer, 0, len); -177 } -178 } finally { -179 if (cin != null) { -180 try { -181 cin.close(); -182 } catch (IOException ex) { -183 LOGGER.trace("ignore", ex); -184 } -185 } -186 if (out != null) { -187 try { -188 out.close(); -189 } catch (IOException ex) { -190 LOGGER.trace("ignore", ex); -191 } -192 } -193 if (gzip.isFile()) { -194 FileUtils.deleteQuietly(gzip); -195 } -196 } -197 } -198 } +168 final byte[] buffer = new byte[4096]; +169 +170 GZIPInputStream cin = null; +171 FileOutputStream out = null; +172 try { +173 cin = new GZIPInputStream(new FileInputStream(gzip)); +174 out = new FileOutputStream(newfile); +175 +176 int len; +177 while ((len = cin.read(buffer)) > 0) { +178 out.write(buffer, 0, len); +179 } +180 } finally { +181 if (cin != null) { +182 try { +183 cin.close(); +184 } catch (IOException ex) { +185 LOGGER.trace("ignore", ex); +186 } +187 } +188 if (out != null) { +189 try { +190 out.close(); +191 } catch (IOException ex) { +192 LOGGER.trace("ignore", ex); +193 } +194 } +195 if (gzip.isFile()) { +196 FileUtils.deleteQuietly(gzip); +197 } +198 } +199 } +200 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/EngineVersionCheck.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/EngineVersionCheck.html index 62e6a27b1..bc9e03551 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/EngineVersionCheck.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/EngineVersionCheck.html @@ -29,197 +29,196 @@ 21 import java.net.HttpURLConnection; 22 import java.net.MalformedURLException; 23 import java.net.URL; -24 import java.util.Date; -25 import org.apache.commons.io.IOUtils; -26 import org.owasp.dependencycheck.data.nvdcve.CveDB; -27 import org.owasp.dependencycheck.data.nvdcve.DatabaseException; -28 import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties; -29 import org.owasp.dependencycheck.data.update.exception.UpdateException; -30 import org.owasp.dependencycheck.utils.DateUtil; -31 import org.owasp.dependencycheck.utils.DependencyVersion; -32 import org.owasp.dependencycheck.utils.Settings; -33 import org.owasp.dependencycheck.utils.URLConnectionFactory; -34 import org.owasp.dependencycheck.utils.URLConnectionFailureException; -35 import org.slf4j.Logger; -36 import org.slf4j.LoggerFactory; -37 -38 /** -39 * -40 * @author Jeremy Long -41 */ -42 public class EngineVersionCheck implements CachedWebDataSource { -43 -44 /** -45 * Static logger. -46 */ -47 private static final Logger LOGGER = LoggerFactory.getLogger(EngineVersionCheck.class); -48 /** -49 * The property key indicating when the last version check occurred. -50 */ -51 public static final String ENGINE_VERSION_CHECKED_ON = "VersionCheckOn"; -52 /** -53 * The property key indicating when the last version check occurred. -54 */ -55 public static final String CURRENT_ENGINE_RELEASE = "CurrentEngineRelease"; -56 /** -57 * Reference to the Cve Database. -58 */ -59 private CveDB cveDB = null; -60 -61 /** -62 * The version retrieved from the database properties or web to check against. -63 */ -64 private String updateToVersion; -65 -66 /** -67 * Getter for updateToVersion - only used for testing. Represents the version retrieved from the database. -68 * -69 * @return the version to test -70 */ -71 protected String getUpdateToVersion() { -72 return updateToVersion; -73 } -74 -75 /** -76 * Setter for updateToVersion - only used for testing. Represents the version retrieved from the database. -77 * -78 * @param version the version to test -79 */ -80 protected void setUpdateToVersion(String version) { -81 updateToVersion = version; -82 } -83 -84 @Override -85 public void update() throws UpdateException { -86 try { -87 openDatabase(); -88 LOGGER.debug("Begin Engine Version Check"); -89 final DatabaseProperties properties = cveDB.getDatabaseProperties(); -90 final long lastChecked = Long.parseLong(properties.getProperty(ENGINE_VERSION_CHECKED_ON, "0")); -91 final long now = (new Date()).getTime(); -92 updateToVersion = properties.getProperty(CURRENT_ENGINE_RELEASE, ""); -93 final String currentVersion = Settings.getString(Settings.KEYS.APPLICATION_VERSION, "0.0.0"); -94 LOGGER.debug("Last checked: {}", lastChecked); -95 LOGGER.debug("Now: {}", now); -96 LOGGER.debug("Current version: {}", currentVersion); -97 final boolean updateNeeded = shouldUpdate(lastChecked, now, properties, currentVersion); -98 if (updateNeeded) { -99 LOGGER.warn("A new version of dependency-check is available. Consider updating to version {}.", -100 updateToVersion); -101 } -102 } catch (DatabaseException ex) { -103 LOGGER.debug("Database Exception opening databases to retrieve properties", ex); -104 throw new UpdateException("Error occured updating database properties."); -105 } finally { -106 closeDatabase(); -107 } -108 } -109 -110 /** -111 * Determines if a new version of the dependency-check engine has been released. -112 * -113 * @param lastChecked the epoch time of the last version check -114 * @param now the current epoch time -115 * @param properties the database properties object -116 * @param currentVersion the current version of dependency-check -117 * @return <code>true</code> if a newer version of the database has been released; otherwise <code>false</code> -118 * @throws UpdateException thrown if there is an error connecting to the github documentation site or accessing the local -119 * database. -120 */ -121 protected boolean shouldUpdate(final long lastChecked, final long now, final DatabaseProperties properties, -122 String currentVersion) throws UpdateException { -123 //check every 30 days if we know there is an update, otherwise check every 7 days -124 int checkRange = 30; -125 if (updateToVersion.isEmpty()) { -126 checkRange = 7; -127 } -128 if (!DateUtil.withinDateRange(lastChecked, now, checkRange)) { -129 LOGGER.debug("Checking web for new version."); -130 final String currentRelease = getCurrentReleaseVersion(); -131 if (currentRelease != null) { -132 final DependencyVersion v = new DependencyVersion(currentRelease); -133 if (v.getVersionParts() != null && v.getVersionParts().size() >= 3) { -134 updateToVersion = v.toString(); -135 if (!currentRelease.equals(updateToVersion)) { -136 properties.save(CURRENT_ENGINE_RELEASE, updateToVersion); -137 } else { -138 properties.save(CURRENT_ENGINE_RELEASE, ""); -139 } -140 properties.save(ENGINE_VERSION_CHECKED_ON, Long.toString(now)); -141 } -142 } -143 LOGGER.debug("Current Release: {}", updateToVersion); -144 } -145 final DependencyVersion running = new DependencyVersion(currentVersion); -146 final DependencyVersion released = new DependencyVersion(updateToVersion); -147 if (running.compareTo(released) < 0) { -148 LOGGER.debug("Upgrade recommended"); -149 return true; -150 } -151 LOGGER.debug("Upgrade not needed"); -152 return false; -153 } -154 -155 /** -156 * Opens the CVE and CPE data stores. -157 * -158 * @throws DatabaseException thrown if a data store cannot be opened -159 */ -160 protected final void openDatabase() throws DatabaseException { -161 if (cveDB != null) { -162 return; -163 } -164 cveDB = new CveDB(); -165 cveDB.open(); -166 } -167 -168 /** -169 * Closes the CVE and CPE data stores. -170 */ -171 protected void closeDatabase() { -172 if (cveDB != null) { -173 try { -174 cveDB.close(); -175 cveDB = null; -176 } catch (Throwable ignore) { -177 LOGGER.trace("Error closing the cveDB", ignore); -178 } -179 } -180 } -181 -182 /** -183 * Retrieves the current released version number from the github documentation site. -184 * -185 * @return the current released version number -186 */ -187 protected String getCurrentReleaseVersion() { -188 HttpURLConnection conn = null; -189 try { -190 final String str = Settings.getString(Settings.KEYS.ENGINE_VERSION_CHECK_URL, "http://jeremylong.github.io/DependencyCheck/current.txt"); -191 final URL url = new URL(str); -192 conn = URLConnectionFactory.createHttpURLConnection(url); -193 conn.connect(); -194 if (conn.getResponseCode() != 200) { -195 return null; -196 } -197 final String releaseVersion = IOUtils.toString(conn.getInputStream(), "UTF-8"); -198 if (releaseVersion != null) { -199 return releaseVersion.trim(); -200 } -201 } catch (MalformedURLException ex) { -202 LOGGER.debug("unable to retrieve current release version of dependency-check", ex); -203 } catch (URLConnectionFailureException ex) { -204 LOGGER.debug("unable to retrieve current release version of dependency-check", ex); -205 } catch (IOException ex) { -206 LOGGER.debug("unable to retrieve current release version of dependency-check", ex); -207 } finally { -208 if (conn != null) { -209 conn.disconnect(); -210 } -211 } -212 return null; -213 } -214 } +24 import org.apache.commons.io.IOUtils; +25 import org.owasp.dependencycheck.data.nvdcve.CveDB; +26 import org.owasp.dependencycheck.data.nvdcve.DatabaseException; +27 import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties; +28 import org.owasp.dependencycheck.data.update.exception.UpdateException; +29 import org.owasp.dependencycheck.utils.DateUtil; +30 import org.owasp.dependencycheck.utils.DependencyVersion; +31 import org.owasp.dependencycheck.utils.Settings; +32 import org.owasp.dependencycheck.utils.URLConnectionFactory; +33 import org.owasp.dependencycheck.utils.URLConnectionFailureException; +34 import org.slf4j.Logger; +35 import org.slf4j.LoggerFactory; +36 +37 /** +38 * +39 * @author Jeremy Long +40 */ +41 public class EngineVersionCheck implements CachedWebDataSource { +42 +43 /** +44 * Static logger. +45 */ +46 private static final Logger LOGGER = LoggerFactory.getLogger(EngineVersionCheck.class); +47 /** +48 * The property key indicating when the last version check occurred. +49 */ +50 public static final String ENGINE_VERSION_CHECKED_ON = "VersionCheckOn"; +51 /** +52 * The property key indicating when the last version check occurred. +53 */ +54 public static final String CURRENT_ENGINE_RELEASE = "CurrentEngineRelease"; +55 /** +56 * Reference to the Cve Database. +57 */ +58 private CveDB cveDB = null; +59 +60 /** +61 * The version retrieved from the database properties or web to check against. +62 */ +63 private String updateToVersion; +64 +65 /** +66 * Getter for updateToVersion - only used for testing. Represents the version retrieved from the database. +67 * +68 * @return the version to test +69 */ +70 protected String getUpdateToVersion() { +71 return updateToVersion; +72 } +73 +74 /** +75 * Setter for updateToVersion - only used for testing. Represents the version retrieved from the database. +76 * +77 * @param version the version to test +78 */ +79 protected void setUpdateToVersion(String version) { +80 updateToVersion = version; +81 } +82 +83 @Override +84 public void update() throws UpdateException { +85 try { +86 openDatabase(); +87 LOGGER.debug("Begin Engine Version Check"); +88 final DatabaseProperties properties = cveDB.getDatabaseProperties(); +89 final long lastChecked = Long.parseLong(properties.getProperty(ENGINE_VERSION_CHECKED_ON, "0")); +90 final long now = System.currentTimeMillis(); +91 updateToVersion = properties.getProperty(CURRENT_ENGINE_RELEASE, ""); +92 final String currentVersion = Settings.getString(Settings.KEYS.APPLICATION_VERSION, "0.0.0"); +93 LOGGER.debug("Last checked: {}", lastChecked); +94 LOGGER.debug("Now: {}", now); +95 LOGGER.debug("Current version: {}", currentVersion); +96 final boolean updateNeeded = shouldUpdate(lastChecked, now, properties, currentVersion); +97 if (updateNeeded) { +98 LOGGER.warn("A new version of dependency-check is available. Consider updating to version {}.", +99 updateToVersion); +100 } +101 } catch (DatabaseException ex) { +102 LOGGER.debug("Database Exception opening databases to retrieve properties", ex); +103 throw new UpdateException("Error occured updating database properties."); +104 } finally { +105 closeDatabase(); +106 } +107 } +108 +109 /** +110 * Determines if a new version of the dependency-check engine has been released. +111 * +112 * @param lastChecked the epoch time of the last version check +113 * @param now the current epoch time +114 * @param properties the database properties object +115 * @param currentVersion the current version of dependency-check +116 * @return <code>true</code> if a newer version of the database has been released; otherwise <code>false</code> +117 * @throws UpdateException thrown if there is an error connecting to the github documentation site or accessing the local +118 * database. +119 */ +120 protected boolean shouldUpdate(final long lastChecked, final long now, final DatabaseProperties properties, +121 String currentVersion) throws UpdateException { +122 //check every 30 days if we know there is an update, otherwise check every 7 days +123 int checkRange = 30; +124 if (updateToVersion.isEmpty()) { +125 checkRange = 7; +126 } +127 if (!DateUtil.withinDateRange(lastChecked, now, checkRange)) { +128 LOGGER.debug("Checking web for new version."); +129 final String currentRelease = getCurrentReleaseVersion(); +130 if (currentRelease != null) { +131 final DependencyVersion v = new DependencyVersion(currentRelease); +132 if (v.getVersionParts() != null && v.getVersionParts().size() >= 3) { +133 updateToVersion = v.toString(); +134 if (!currentRelease.equals(updateToVersion)) { +135 properties.save(CURRENT_ENGINE_RELEASE, updateToVersion); +136 } else { +137 properties.save(CURRENT_ENGINE_RELEASE, ""); +138 } +139 properties.save(ENGINE_VERSION_CHECKED_ON, Long.toString(now)); +140 } +141 } +142 LOGGER.debug("Current Release: {}", updateToVersion); +143 } +144 final DependencyVersion running = new DependencyVersion(currentVersion); +145 final DependencyVersion released = new DependencyVersion(updateToVersion); +146 if (running.compareTo(released) < 0) { +147 LOGGER.debug("Upgrade recommended"); +148 return true; +149 } +150 LOGGER.debug("Upgrade not needed"); +151 return false; +152 } +153 +154 /** +155 * Opens the CVE and CPE data stores. +156 * +157 * @throws DatabaseException thrown if a data store cannot be opened +158 */ +159 protected final void openDatabase() throws DatabaseException { +160 if (cveDB != null) { +161 return; +162 } +163 cveDB = new CveDB(); +164 cveDB.open(); +165 } +166 +167 /** +168 * Closes the CVE and CPE data stores. +169 */ +170 protected void closeDatabase() { +171 if (cveDB != null) { +172 try { +173 cveDB.close(); +174 cveDB = null; +175 } catch (Throwable ignore) { +176 LOGGER.trace("Error closing the cveDB", ignore); +177 } +178 } +179 } +180 +181 /** +182 * Retrieves the current released version number from the github documentation site. +183 * +184 * @return the current released version number +185 */ +186 protected String getCurrentReleaseVersion() { +187 HttpURLConnection conn = null; +188 try { +189 final String str = Settings.getString(Settings.KEYS.ENGINE_VERSION_CHECK_URL, "http://jeremylong.github.io/DependencyCheck/current.txt"); +190 final URL url = new URL(str); +191 conn = URLConnectionFactory.createHttpURLConnection(url); +192 conn.connect(); +193 if (conn.getResponseCode() != 200) { +194 return null; +195 } +196 final String releaseVersion = IOUtils.toString(conn.getInputStream(), "UTF-8"); +197 if (releaseVersion != null) { +198 return releaseVersion.trim(); +199 } +200 } catch (MalformedURLException ex) { +201 LOGGER.debug("unable to retrieve current release version of dependency-check", ex); +202 } catch (URLConnectionFailureException ex) { +203 LOGGER.debug("unable to retrieve current release version of dependency-check", ex); +204 } catch (IOException ex) { +205 LOGGER.debug("unable to retrieve current release version of dependency-check", ex); +206 } finally { +207 if (conn != null) { +208 conn.disconnect(); +209 } +210 } +211 return null; +212 } +213 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/NvdCveUpdater.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/NvdCveUpdater.html index 317db3ddd..8093121a1 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/NvdCveUpdater.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/NvdCveUpdater.html @@ -27,270 +27,269 @@ 19 20 import java.net.MalformedURLException; 21 import java.util.Calendar; -22 import java.util.Date; -23 import java.util.HashSet; -24 import java.util.Set; -25 import java.util.concurrent.ExecutionException; -26 import java.util.concurrent.ExecutorService; -27 import java.util.concurrent.Executors; -28 import java.util.concurrent.Future; -29 import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties; -30 import static org.owasp.dependencycheck.data.nvdcve.DatabaseProperties.MODIFIED; -31 import org.owasp.dependencycheck.data.update.exception.InvalidDataException; -32 import org.owasp.dependencycheck.data.update.exception.UpdateException; -33 import org.owasp.dependencycheck.data.update.nvd.DownloadTask; -34 import org.owasp.dependencycheck.data.update.nvd.NvdCveInfo; -35 import org.owasp.dependencycheck.data.update.nvd.ProcessTask; -36 import org.owasp.dependencycheck.data.update.nvd.UpdateableNvdCve; -37 import org.owasp.dependencycheck.utils.DateUtil; -38 import org.owasp.dependencycheck.utils.DownloadFailedException; -39 import org.owasp.dependencycheck.utils.InvalidSettingException; -40 import org.owasp.dependencycheck.utils.Settings; -41 import org.slf4j.Logger; -42 import org.slf4j.LoggerFactory; -43 -44 /** -45 * Class responsible for updating the NVD CVE data. -46 * -47 * @author Jeremy Long -48 */ -49 public class NvdCveUpdater extends BaseUpdater implements CachedWebDataSource { -50 -51 /** -52 * The logger -53 */ -54 private static final Logger LOGGER = LoggerFactory.getLogger(NvdCveUpdater.class); -55 /** -56 * The max thread pool size to use when downloading files. -57 */ -58 public static final int MAX_THREAD_POOL_SIZE = Settings.getInt(Settings.KEYS.MAX_DOWNLOAD_THREAD_POOL_SIZE, 3); -59 -60 /** -61 * <p> -62 * Downloads the latest NVD CVE XML file from the web and imports it into the current CVE Database.</p> -63 * -64 * @throws UpdateException is thrown if there is an error updating the database -65 */ -66 @Override -67 public void update() throws UpdateException { -68 try { -69 openDataStores(); -70 final UpdateableNvdCve updateable = getUpdatesNeeded(); -71 if (updateable.isUpdateNeeded()) { -72 performUpdate(updateable); -73 } -74 } catch (MalformedURLException ex) { -75 LOGGER.warn( -76 "NVD CVE properties files contain an invalid URL, unable to update the data to use the most current data."); -77 LOGGER.debug("", ex); -78 } catch (DownloadFailedException ex) { -79 LOGGER.warn( -80 "Unable to download the NVD CVE data; the results may not include the most recent CPE/CVEs from the NVD."); -81 if (Settings.getString(Settings.KEYS.PROXY_SERVER) == null) { -82 LOGGER.info( -83 "If you are behind a proxy you may need to configure dependency-check to use the proxy."); -84 } -85 LOGGER.debug("", ex); -86 } finally { -87 closeDataStores(); -88 } -89 } -90 -91 /** -92 * Downloads the latest NVD CVE XML file from the web and imports it into the current CVE Database. -93 * -94 * @param updateable a collection of NVD CVE data file references that need to be downloaded and processed to update the -95 * database -96 * @throws UpdateException is thrown if there is an error updating the database -97 */ -98 public void performUpdate(UpdateableNvdCve updateable) throws UpdateException { -99 int maxUpdates = 0; -100 try { -101 for (NvdCveInfo cve : updateable) { -102 if (cve.getNeedsUpdate()) { -103 maxUpdates += 1; -104 } -105 } -106 if (maxUpdates <= 0) { -107 return; -108 } -109 if (maxUpdates > 3) { -110 LOGGER.info( -111 "NVD CVE requires several updates; this could take a couple of minutes."); -112 } -113 if (maxUpdates > 0) { -114 openDataStores(); -115 } -116 -117 final int poolSize = (MAX_THREAD_POOL_SIZE < maxUpdates) ? MAX_THREAD_POOL_SIZE : maxUpdates; -118 -119 final ExecutorService downloadExecutors = Executors.newFixedThreadPool(poolSize); -120 final ExecutorService processExecutor = Executors.newSingleThreadExecutor(); -121 final Set<Future<Future<ProcessTask>>> downloadFutures = new HashSet<Future<Future<ProcessTask>>>(maxUpdates); -122 for (NvdCveInfo cve : updateable) { -123 if (cve.getNeedsUpdate()) { -124 final DownloadTask call = new DownloadTask(cve, processExecutor, getCveDB(), Settings.getInstance()); -125 downloadFutures.add(downloadExecutors.submit(call)); -126 } -127 } -128 downloadExecutors.shutdown(); -129 -130 //next, move the future future processTasks to just future processTasks -131 final Set<Future<ProcessTask>> processFutures = new HashSet<Future<ProcessTask>>(maxUpdates); -132 for (Future<Future<ProcessTask>> future : downloadFutures) { -133 Future<ProcessTask> task = null; -134 try { -135 task = future.get(); -136 } catch (InterruptedException ex) { -137 downloadExecutors.shutdownNow(); -138 processExecutor.shutdownNow(); -139 -140 LOGGER.debug("Thread was interrupted during download", ex); -141 throw new UpdateException("The download was interrupted", ex); -142 } catch (ExecutionException ex) { -143 downloadExecutors.shutdownNow(); -144 processExecutor.shutdownNow(); -145 -146 LOGGER.debug("Thread was interrupted during download execution", ex); -147 throw new UpdateException("The execution of the download was interrupted", ex); -148 } -149 if (task == null) { -150 downloadExecutors.shutdownNow(); -151 processExecutor.shutdownNow(); -152 LOGGER.debug("Thread was interrupted during download"); -153 throw new UpdateException("The download was interrupted; unable to complete the update"); -154 } else { -155 processFutures.add(task); -156 } -157 } -158 -159 for (Future<ProcessTask> future : processFutures) { -160 try { -161 final ProcessTask task = future.get(); -162 if (task.getException() != null) { -163 throw task.getException(); -164 } -165 } catch (InterruptedException ex) { -166 processExecutor.shutdownNow(); -167 LOGGER.debug("Thread was interrupted during processing", ex); -168 throw new UpdateException(ex); -169 } catch (ExecutionException ex) { -170 processExecutor.shutdownNow(); -171 LOGGER.debug("Execution Exception during process", ex); -172 throw new UpdateException(ex); -173 } finally { -174 processExecutor.shutdown(); -175 } -176 } -177 -178 if (maxUpdates >= 1) { //ensure the modified file date gets written (we may not have actually updated it) -179 getProperties().save(updateable.get(MODIFIED)); -180 LOGGER.info("Begin database maintenance."); -181 getCveDB().cleanupDatabase(); -182 LOGGER.info("End database maintenance."); -183 } -184 } finally { -185 closeDataStores(); -186 } -187 } -188 -189 /** -190 * Determines if the index needs to be updated. This is done by fetching the NVD CVE meta data and checking the last update -191 * date. If the data needs to be refreshed this method will return the NvdCveUrl for the files that need to be updated. -192 * -193 * @return the collection of files that need to be updated -194 * @throws MalformedURLException is thrown if the URL for the NVD CVE Meta data is incorrect -195 * @throws DownloadFailedException is thrown if there is an error. downloading the NVD CVE download data file -196 * @throws UpdateException Is thrown if there is an issue with the last updated properties file -197 */ -198 protected final UpdateableNvdCve getUpdatesNeeded() throws MalformedURLException, DownloadFailedException, UpdateException { -199 UpdateableNvdCve updates = null; -200 try { -201 updates = retrieveCurrentTimestampsFromWeb(); -202 } catch (InvalidDataException ex) { -203 final String msg = "Unable to retrieve valid timestamp from nvd cve downloads page"; -204 LOGGER.debug(msg, ex); -205 throw new DownloadFailedException(msg, ex); -206 } catch (InvalidSettingException ex) { -207 LOGGER.debug("Invalid setting found when retrieving timestamps", ex); -208 throw new DownloadFailedException("Invalid settings", ex); -209 } -210 -211 if (updates == null) { -212 throw new DownloadFailedException("Unable to retrieve the timestamps of the currently published NVD CVE data"); -213 } -214 if (!getProperties().isEmpty()) { -215 try { -216 final long lastUpdated = Long.parseLong(getProperties().getProperty(DatabaseProperties.LAST_UPDATED, "0")); -217 final Date now = new Date(); -218 final int days = Settings.getInt(Settings.KEYS.CVE_MODIFIED_VALID_FOR_DAYS, 7); -219 if (lastUpdated == updates.getTimeStamp(MODIFIED)) { -220 updates.clear(); //we don't need to update anything. -221 } else if (DateUtil.withinDateRange(lastUpdated, now.getTime(), days)) { -222 for (NvdCveInfo entry : updates) { -223 if (MODIFIED.equals(entry.getId())) { -224 entry.setNeedsUpdate(true); -225 } else { -226 entry.setNeedsUpdate(false); -227 } -228 } -229 } else { //we figure out which of the several XML files need to be downloaded. -230 for (NvdCveInfo entry : updates) { -231 if (MODIFIED.equals(entry.getId())) { -232 entry.setNeedsUpdate(true); -233 } else { -234 long currentTimestamp = 0; -235 try { -236 currentTimestamp = Long.parseLong(getProperties().getProperty(DatabaseProperties.LAST_UPDATED_BASE -237 + entry.getId(), "0")); -238 } catch (NumberFormatException ex) { -239 LOGGER.debug("Error parsing '{}' '{}' from nvdcve.lastupdated", -240 DatabaseProperties.LAST_UPDATED_BASE, entry.getId(), ex); -241 } -242 if (currentTimestamp == entry.getTimestamp()) { -243 entry.setNeedsUpdate(false); -244 } -245 } -246 } -247 } -248 } catch (NumberFormatException ex) { -249 LOGGER.warn("An invalid schema version or timestamp exists in the data.properties file."); -250 LOGGER.debug("", ex); -251 } -252 } -253 return updates; -254 } -255 -256 /** -257 * Retrieves the timestamps from the NVD CVE meta data file. -258 * -259 * @return the timestamp from the currently published nvdcve downloads page -260 * @throws MalformedURLException thrown if the URL for the NVD CCE Meta data is incorrect. -261 * @throws DownloadFailedException thrown if there is an error downloading the nvd cve meta data file -262 * @throws InvalidDataException thrown if there is an exception parsing the timestamps -263 * @throws InvalidSettingException thrown if the settings are invalid -264 */ -265 private UpdateableNvdCve retrieveCurrentTimestampsFromWeb() -266 throws MalformedURLException, DownloadFailedException, InvalidDataException, InvalidSettingException { -267 -268 final UpdateableNvdCve updates = new UpdateableNvdCve(); -269 updates.add(MODIFIED, Settings.getString(Settings.KEYS.CVE_MODIFIED_20_URL), -270 Settings.getString(Settings.KEYS.CVE_MODIFIED_12_URL), -271 false); -272 -273 final int start = Settings.getInt(Settings.KEYS.CVE_START_YEAR); -274 final int end = Calendar.getInstance().get(Calendar.YEAR); -275 final String baseUrl20 = Settings.getString(Settings.KEYS.CVE_SCHEMA_2_0); -276 final String baseUrl12 = Settings.getString(Settings.KEYS.CVE_SCHEMA_1_2); -277 for (int i = start; i <= end; i++) { -278 updates.add(Integer.toString(i), String.format(baseUrl20, i), -279 String.format(baseUrl12, i), -280 true); -281 } -282 return updates; -283 } -284 -285 } +22 import java.util.HashSet; +23 import java.util.Set; +24 import java.util.concurrent.ExecutionException; +25 import java.util.concurrent.ExecutorService; +26 import java.util.concurrent.Executors; +27 import java.util.concurrent.Future; +28 import org.owasp.dependencycheck.data.nvdcve.DatabaseProperties; +29 import static org.owasp.dependencycheck.data.nvdcve.DatabaseProperties.MODIFIED; +30 import org.owasp.dependencycheck.data.update.exception.InvalidDataException; +31 import org.owasp.dependencycheck.data.update.exception.UpdateException; +32 import org.owasp.dependencycheck.data.update.nvd.DownloadTask; +33 import org.owasp.dependencycheck.data.update.nvd.NvdCveInfo; +34 import org.owasp.dependencycheck.data.update.nvd.ProcessTask; +35 import org.owasp.dependencycheck.data.update.nvd.UpdateableNvdCve; +36 import org.owasp.dependencycheck.utils.DateUtil; +37 import org.owasp.dependencycheck.utils.DownloadFailedException; +38 import org.owasp.dependencycheck.utils.InvalidSettingException; +39 import org.owasp.dependencycheck.utils.Settings; +40 import org.slf4j.Logger; +41 import org.slf4j.LoggerFactory; +42 +43 /** +44 * Class responsible for updating the NVD CVE data. +45 * +46 * @author Jeremy Long +47 */ +48 public class NvdCveUpdater extends BaseUpdater implements CachedWebDataSource { +49 +50 /** +51 * The logger +52 */ +53 private static final Logger LOGGER = LoggerFactory.getLogger(NvdCveUpdater.class); +54 /** +55 * The max thread pool size to use when downloading files. +56 */ +57 public static final int MAX_THREAD_POOL_SIZE = Settings.getInt(Settings.KEYS.MAX_DOWNLOAD_THREAD_POOL_SIZE, 3); +58 +59 /** +60 * <p> +61 * Downloads the latest NVD CVE XML file from the web and imports it into the current CVE Database.</p> +62 * +63 * @throws UpdateException is thrown if there is an error updating the database +64 */ +65 @Override +66 public void update() throws UpdateException { +67 try { +68 openDataStores(); +69 final UpdateableNvdCve updateable = getUpdatesNeeded(); +70 if (updateable.isUpdateNeeded()) { +71 performUpdate(updateable); +72 } +73 } catch (MalformedURLException ex) { +74 LOGGER.warn( +75 "NVD CVE properties files contain an invalid URL, unable to update the data to use the most current data."); +76 LOGGER.debug("", ex); +77 } catch (DownloadFailedException ex) { +78 LOGGER.warn( +79 "Unable to download the NVD CVE data; the results may not include the most recent CPE/CVEs from the NVD."); +80 if (Settings.getString(Settings.KEYS.PROXY_SERVER) == null) { +81 LOGGER.info( +82 "If you are behind a proxy you may need to configure dependency-check to use the proxy."); +83 } +84 LOGGER.debug("", ex); +85 } finally { +86 closeDataStores(); +87 } +88 } +89 +90 /** +91 * Downloads the latest NVD CVE XML file from the web and imports it into the current CVE Database. +92 * +93 * @param updateable a collection of NVD CVE data file references that need to be downloaded and processed to update the +94 * database +95 * @throws UpdateException is thrown if there is an error updating the database +96 */ +97 public void performUpdate(UpdateableNvdCve updateable) throws UpdateException { +98 int maxUpdates = 0; +99 try { +100 for (NvdCveInfo cve : updateable) { +101 if (cve.getNeedsUpdate()) { +102 maxUpdates += 1; +103 } +104 } +105 if (maxUpdates <= 0) { +106 return; +107 } +108 if (maxUpdates > 3) { +109 LOGGER.info( +110 "NVD CVE requires several updates; this could take a couple of minutes."); +111 } +112 if (maxUpdates > 0) { +113 openDataStores(); +114 } +115 +116 final int poolSize = (MAX_THREAD_POOL_SIZE < maxUpdates) ? MAX_THREAD_POOL_SIZE : maxUpdates; +117 +118 final ExecutorService downloadExecutors = Executors.newFixedThreadPool(poolSize); +119 final ExecutorService processExecutor = Executors.newSingleThreadExecutor(); +120 final Set<Future<Future<ProcessTask>>> downloadFutures = new HashSet<Future<Future<ProcessTask>>>(maxUpdates); +121 for (NvdCveInfo cve : updateable) { +122 if (cve.getNeedsUpdate()) { +123 final DownloadTask call = new DownloadTask(cve, processExecutor, getCveDB(), Settings.getInstance()); +124 downloadFutures.add(downloadExecutors.submit(call)); +125 } +126 } +127 downloadExecutors.shutdown(); +128 +129 //next, move the future future processTasks to just future processTasks +130 final Set<Future<ProcessTask>> processFutures = new HashSet<Future<ProcessTask>>(maxUpdates); +131 for (Future<Future<ProcessTask>> future : downloadFutures) { +132 Future<ProcessTask> task = null; +133 try { +134 task = future.get(); +135 } catch (InterruptedException ex) { +136 downloadExecutors.shutdownNow(); +137 processExecutor.shutdownNow(); +138 +139 LOGGER.debug("Thread was interrupted during download", ex); +140 throw new UpdateException("The download was interrupted", ex); +141 } catch (ExecutionException ex) { +142 downloadExecutors.shutdownNow(); +143 processExecutor.shutdownNow(); +144 +145 LOGGER.debug("Thread was interrupted during download execution", ex); +146 throw new UpdateException("The execution of the download was interrupted", ex); +147 } +148 if (task == null) { +149 downloadExecutors.shutdownNow(); +150 processExecutor.shutdownNow(); +151 LOGGER.debug("Thread was interrupted during download"); +152 throw new UpdateException("The download was interrupted; unable to complete the update"); +153 } else { +154 processFutures.add(task); +155 } +156 } +157 +158 for (Future<ProcessTask> future : processFutures) { +159 try { +160 final ProcessTask task = future.get(); +161 if (task.getException() != null) { +162 throw task.getException(); +163 } +164 } catch (InterruptedException ex) { +165 processExecutor.shutdownNow(); +166 LOGGER.debug("Thread was interrupted during processing", ex); +167 throw new UpdateException(ex); +168 } catch (ExecutionException ex) { +169 processExecutor.shutdownNow(); +170 LOGGER.debug("Execution Exception during process", ex); +171 throw new UpdateException(ex); +172 } finally { +173 processExecutor.shutdown(); +174 } +175 } +176 +177 if (maxUpdates >= 1) { //ensure the modified file date gets written (we may not have actually updated it) +178 getProperties().save(updateable.get(MODIFIED)); +179 LOGGER.info("Begin database maintenance."); +180 getCveDB().cleanupDatabase(); +181 LOGGER.info("End database maintenance."); +182 } +183 } finally { +184 closeDataStores(); +185 } +186 } +187 +188 /** +189 * Determines if the index needs to be updated. This is done by fetching the NVD CVE meta data and checking the last update +190 * date. If the data needs to be refreshed this method will return the NvdCveUrl for the files that need to be updated. +191 * +192 * @return the collection of files that need to be updated +193 * @throws MalformedURLException is thrown if the URL for the NVD CVE Meta data is incorrect +194 * @throws DownloadFailedException is thrown if there is an error. downloading the NVD CVE download data file +195 * @throws UpdateException Is thrown if there is an issue with the last updated properties file +196 */ +197 protected final UpdateableNvdCve getUpdatesNeeded() throws MalformedURLException, DownloadFailedException, UpdateException { +198 UpdateableNvdCve updates = null; +199 try { +200 updates = retrieveCurrentTimestampsFromWeb(); +201 } catch (InvalidDataException ex) { +202 final String msg = "Unable to retrieve valid timestamp from nvd cve downloads page"; +203 LOGGER.debug(msg, ex); +204 throw new DownloadFailedException(msg, ex); +205 } catch (InvalidSettingException ex) { +206 LOGGER.debug("Invalid setting found when retrieving timestamps", ex); +207 throw new DownloadFailedException("Invalid settings", ex); +208 } +209 +210 if (updates == null) { +211 throw new DownloadFailedException("Unable to retrieve the timestamps of the currently published NVD CVE data"); +212 } +213 if (!getProperties().isEmpty()) { +214 try { +215 final long lastUpdated = Long.parseLong(getProperties().getProperty(DatabaseProperties.LAST_UPDATED, "0")); +216 final long now = System.currentTimeMillis(); +217 final int days = Settings.getInt(Settings.KEYS.CVE_MODIFIED_VALID_FOR_DAYS, 7); +218 if (lastUpdated == updates.getTimeStamp(MODIFIED)) { +219 updates.clear(); //we don't need to update anything. +220 } else if (DateUtil.withinDateRange(lastUpdated, now, days)) { +221 for (NvdCveInfo entry : updates) { +222 if (MODIFIED.equals(entry.getId())) { +223 entry.setNeedsUpdate(true); +224 } else { +225 entry.setNeedsUpdate(false); +226 } +227 } +228 } else { //we figure out which of the several XML files need to be downloaded. +229 for (NvdCveInfo entry : updates) { +230 if (MODIFIED.equals(entry.getId())) { +231 entry.setNeedsUpdate(true); +232 } else { +233 long currentTimestamp = 0; +234 try { +235 currentTimestamp = Long.parseLong(getProperties().getProperty(DatabaseProperties.LAST_UPDATED_BASE +236 + entry.getId(), "0")); +237 } catch (NumberFormatException ex) { +238 LOGGER.debug("Error parsing '{}' '{}' from nvdcve.lastupdated", +239 DatabaseProperties.LAST_UPDATED_BASE, entry.getId(), ex); +240 } +241 if (currentTimestamp == entry.getTimestamp()) { +242 entry.setNeedsUpdate(false); +243 } +244 } +245 } +246 } +247 } catch (NumberFormatException ex) { +248 LOGGER.warn("An invalid schema version or timestamp exists in the data.properties file."); +249 LOGGER.debug("", ex); +250 } +251 } +252 return updates; +253 } +254 +255 /** +256 * Retrieves the timestamps from the NVD CVE meta data file. +257 * +258 * @return the timestamp from the currently published nvdcve downloads page +259 * @throws MalformedURLException thrown if the URL for the NVD CCE Meta data is incorrect. +260 * @throws DownloadFailedException thrown if there is an error downloading the nvd cve meta data file +261 * @throws InvalidDataException thrown if there is an exception parsing the timestamps +262 * @throws InvalidSettingException thrown if the settings are invalid +263 */ +264 private UpdateableNvdCve retrieveCurrentTimestampsFromWeb() +265 throws MalformedURLException, DownloadFailedException, InvalidDataException, InvalidSettingException { +266 +267 final UpdateableNvdCve updates = new UpdateableNvdCve(); +268 updates.add(MODIFIED, Settings.getString(Settings.KEYS.CVE_MODIFIED_20_URL), +269 Settings.getString(Settings.KEYS.CVE_MODIFIED_12_URL), +270 false); +271 +272 final int start = Settings.getInt(Settings.KEYS.CVE_START_YEAR); +273 final int end = Calendar.getInstance().get(Calendar.YEAR); +274 final String baseUrl20 = Settings.getString(Settings.KEYS.CVE_SCHEMA_2_0); +275 final String baseUrl12 = Settings.getString(Settings.KEYS.CVE_SCHEMA_1_2); +276 for (int i = start; i <= end; i++) { +277 updates.add(Integer.toString(i), String.format(baseUrl20, i), +278 String.format(baseUrl12, i), +279 true); +280 } +281 return updates; +282 } +283 +284 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/cpe/CPEHandler.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/cpe/CPEHandler.html index 8707a6919..e66559fa6 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/cpe/CPEHandler.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/cpe/CPEHandler.html @@ -187,7 +187,7 @@ 179 /** 180 * A simple class to maintain information about the current element while parsing the CPE XML. 181 */ -182 protected class Element { +182 protected static final class Element { 183 184 /** 185 * A node type in the CPE Schema 2.2 diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/cpe/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/cpe/package-frame.html index f1f1009ab..32234e944 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/cpe/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/cpe/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.update.cpe + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.update.cpe diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/cpe/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/cpe/package-summary.html index d0b920a6c..45c4cd0c6 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/cpe/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/cpe/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.update.cpe + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.update.cpe diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/exception/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/exception/package-frame.html index bd38f1495..2e3247efd 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/exception/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/exception/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.update.exception + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.update.exception diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/exception/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/exception/package-summary.html index 75d4f0ca0..277eb71d0 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/exception/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/exception/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.update.exception + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.update.exception diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/DownloadTask.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/DownloadTask.html index 6dc8c8c7f..fd8103fe7 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/DownloadTask.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/DownloadTask.html @@ -193,118 +193,120 @@ 185 final URL url1 = new URL(nvdCveInfo.getUrl()); 186 final URL url2 = new URL(nvdCveInfo.getOldSchemaVersionUrl()); 187 LOGGER.info("Download Started for NVD CVE - {}", nvdCveInfo.getId()); -188 try { -189 Downloader.fetchFile(url1, first); -190 Downloader.fetchFile(url2, second); -191 } catch (DownloadFailedException ex) { -192 LOGGER.warn("Download Failed for NVD CVE - {}\nSome CVEs may not be reported.", nvdCveInfo.getId()); -193 if (Settings.getString(Settings.KEYS.PROXY_SERVER) == null) { -194 LOGGER.info( -195 "If you are behind a proxy you may need to configure dependency-check to use the proxy."); -196 } -197 LOGGER.debug("", ex); -198 return null; -199 } -200 if (url1.toExternalForm().endsWith(".xml.gz")) { -201 extractGzip(first); -202 } -203 if (url2.toExternalForm().endsWith(".xml.gz")) { -204 extractGzip(second); -205 } -206 -207 LOGGER.info("Download Complete for NVD CVE - {}", nvdCveInfo.getId()); -208 if (this.processorService == null) { -209 return null; -210 } -211 final ProcessTask task = new ProcessTask(cveDB, this, settings); -212 return this.processorService.submit(task); -213 -214 } catch (Throwable ex) { -215 LOGGER.warn("An exception occurred downloading NVD CVE - {}\nSome CVEs may not be reported.", nvdCveInfo.getId()); -216 LOGGER.debug("Download Task Failed", ex); -217 } finally { -218 Settings.cleanup(false); -219 } -220 return null; -221 } -222 -223 /** -224 * Attempts to delete the files that were downloaded. -225 */ -226 public void cleanup() { -227 boolean deleted = false; -228 try { -229 if (first != null && first.exists()) { -230 deleted = first.delete(); -231 } -232 } finally { -233 if (first != null && (first.exists() || !deleted)) { -234 first.deleteOnExit(); -235 } -236 } -237 try { -238 deleted = false; -239 if (second != null && second.exists()) { -240 deleted = second.delete(); -241 } -242 } finally { -243 if (second != null && (second.exists() || !deleted)) { -244 second.deleteOnExit(); -245 } -246 } -247 } -248 -249 /** -250 * Extracts the file contained in a gzip archive. The extracted file is placed in the exact same path as the file specified. -251 * -252 * @param file the archive file -253 * @throws FileNotFoundException thrown if the file does not exist -254 * @throws IOException thrown if there is an error extracting the file. -255 */ -256 private void extractGzip(File file) throws FileNotFoundException, IOException { -257 final String originalPath = file.getPath(); -258 final File gzip = new File(originalPath + ".gz"); -259 if (gzip.isFile() && !gzip.delete()) { -260 gzip.deleteOnExit(); -261 } -262 if (!file.renameTo(gzip)) { -263 throw new IOException("Unable to rename '" + file.getPath() + "'"); -264 } -265 final File newfile = new File(originalPath); -266 -267 final byte[] buffer = new byte[4096]; +188 final long startDownload = System.currentTimeMillis(); +189 try { +190 Downloader.fetchFile(url1, first); +191 Downloader.fetchFile(url2, second); +192 } catch (DownloadFailedException ex) { +193 LOGGER.warn("Download Failed for NVD CVE - {}\nSome CVEs may not be reported.", nvdCveInfo.getId()); +194 if (Settings.getString(Settings.KEYS.PROXY_SERVER) == null) { +195 LOGGER.info( +196 "If you are behind a proxy you may need to configure dependency-check to use the proxy."); +197 } +198 LOGGER.debug("", ex); +199 return null; +200 } +201 if (url1.toExternalForm().endsWith(".xml.gz")) { +202 extractGzip(first); +203 } +204 if (url2.toExternalForm().endsWith(".xml.gz")) { +205 extractGzip(second); +206 } +207 +208 LOGGER.info("Download Complete for NVD CVE - {} ({} ms)", nvdCveInfo.getId(), +209 System.currentTimeMillis() - startDownload); +210 if (this.processorService == null) { +211 return null; +212 } +213 final ProcessTask task = new ProcessTask(cveDB, this, settings); +214 return this.processorService.submit(task); +215 +216 } catch (Throwable ex) { +217 LOGGER.warn("An exception occurred downloading NVD CVE - {}\nSome CVEs may not be reported.", nvdCveInfo.getId()); +218 LOGGER.debug("Download Task Failed", ex); +219 } finally { +220 Settings.cleanup(false); +221 } +222 return null; +223 } +224 +225 /** +226 * Attempts to delete the files that were downloaded. +227 */ +228 public void cleanup() { +229 boolean deleted = false; +230 try { +231 if (first != null && first.exists()) { +232 deleted = first.delete(); +233 } +234 } finally { +235 if (first != null && (first.exists() || !deleted)) { +236 first.deleteOnExit(); +237 } +238 } +239 try { +240 deleted = false; +241 if (second != null && second.exists()) { +242 deleted = second.delete(); +243 } +244 } finally { +245 if (second != null && (second.exists() || !deleted)) { +246 second.deleteOnExit(); +247 } +248 } +249 } +250 +251 /** +252 * Extracts the file contained in a gzip archive. The extracted file is placed in the exact same path as the file specified. +253 * +254 * @param file the archive file +255 * @throws FileNotFoundException thrown if the file does not exist +256 * @throws IOException thrown if there is an error extracting the file. +257 */ +258 private void extractGzip(File file) throws FileNotFoundException, IOException { +259 final String originalPath = file.getPath(); +260 final File gzip = new File(originalPath + ".gz"); +261 if (gzip.isFile() && !gzip.delete()) { +262 gzip.deleteOnExit(); +263 } +264 if (!file.renameTo(gzip)) { +265 throw new IOException("Unable to rename '" + file.getPath() + "'"); +266 } +267 final File newfile = new File(originalPath); 268 -269 GZIPInputStream cin = null; -270 FileOutputStream out = null; -271 try { -272 cin = new GZIPInputStream(new FileInputStream(gzip)); -273 out = new FileOutputStream(newfile); -274 -275 int len; -276 while ((len = cin.read(buffer)) > 0) { -277 out.write(buffer, 0, len); -278 } -279 } finally { -280 if (cin != null) { -281 try { -282 cin.close(); -283 } catch (IOException ex) { -284 LOGGER.trace("ignore", ex); -285 } -286 } -287 if (out != null) { -288 try { -289 out.close(); -290 } catch (IOException ex) { -291 LOGGER.trace("ignore", ex); -292 } -293 } -294 if (gzip.isFile()) { -295 FileUtils.deleteQuietly(gzip); -296 } -297 } -298 } -299 } +269 final byte[] buffer = new byte[4096]; +270 +271 GZIPInputStream cin = null; +272 FileOutputStream out = null; +273 try { +274 cin = new GZIPInputStream(new FileInputStream(gzip)); +275 out = new FileOutputStream(newfile); +276 +277 int len; +278 while ((len = cin.read(buffer)) > 0) { +279 out.write(buffer, 0, len); +280 } +281 } finally { +282 if (cin != null) { +283 try { +284 cin.close(); +285 } catch (IOException ex) { +286 LOGGER.trace("ignore", ex); +287 } +288 } +289 if (out != null) { +290 try { +291 out.close(); +292 } catch (IOException ex) { +293 LOGGER.trace("ignore", ex); +294 } +295 } +296 if (gzip.isFile()) { +297 FileUtils.deleteQuietly(gzip); +298 } +299 } +300 } +301 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/ProcessTask.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/ProcessTask.html index 4c4be4c31..0560a080c 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/ProcessTask.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/ProcessTask.html @@ -165,30 +165,32 @@ 157 */ 158 private void processFiles() throws UpdateException { 159 LOGGER.info("Processing Started for NVD CVE - {}", filePair.getNvdCveInfo().getId()); -160 try { -161 importXML(filePair.getFirst(), filePair.getSecond()); -162 cveDB.commit(); -163 properties.save(filePair.getNvdCveInfo()); -164 } catch (FileNotFoundException ex) { -165 throw new UpdateException(ex); -166 } catch (ParserConfigurationException ex) { -167 throw new UpdateException(ex); -168 } catch (SAXException ex) { -169 throw new UpdateException(ex); -170 } catch (IOException ex) { -171 throw new UpdateException(ex); -172 } catch (SQLException ex) { -173 throw new UpdateException(ex); -174 } catch (DatabaseException ex) { -175 throw new UpdateException(ex); -176 } catch (ClassNotFoundException ex) { -177 throw new UpdateException(ex); -178 } finally { -179 filePair.cleanup(); -180 } -181 LOGGER.info("Processing Complete for NVD CVE - {}", filePair.getNvdCveInfo().getId()); -182 } -183 } +160 final long startProcessing = System.currentTimeMillis(); +161 try { +162 importXML(filePair.getFirst(), filePair.getSecond()); +163 cveDB.commit(); +164 properties.save(filePair.getNvdCveInfo()); +165 } catch (FileNotFoundException ex) { +166 throw new UpdateException(ex); +167 } catch (ParserConfigurationException ex) { +168 throw new UpdateException(ex); +169 } catch (SAXException ex) { +170 throw new UpdateException(ex); +171 } catch (IOException ex) { +172 throw new UpdateException(ex); +173 } catch (SQLException ex) { +174 throw new UpdateException(ex); +175 } catch (DatabaseException ex) { +176 throw new UpdateException(ex); +177 } catch (ClassNotFoundException ex) { +178 throw new UpdateException(ex); +179 } finally { +180 filePair.cleanup(); +181 } +182 LOGGER.info("Processing Complete for NVD CVE - {} ({} ms)", filePair.getNvdCveInfo().getId(), +183 System.currentTimeMillis() - startProcessing); +184 } +185 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/package-frame.html index 4efcb997a..d214b48dc 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.update.nvd + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.update.nvd diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/package-summary.html index 7a5d2b903..ee41b2745 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/nvd/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.update.nvd + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.update.nvd diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/package-frame.html index 73756d43c..06818c771 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.update + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.update diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/package-summary.html index 9069389ee..fbde568dc 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/data/update/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/data/update/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.data.update + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.data.update diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Dependency.html b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Dependency.html index a6e8dc02d..e0fd33c81 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Dependency.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Dependency.html @@ -36,730 +36,748 @@ 28 import java.util.SortedSet; 29 import java.util.TreeSet; 30 -31 import org.apache.commons.lang.ObjectUtils; -32 import org.owasp.dependencycheck.data.nexus.MavenArtifact; -33 import org.owasp.dependencycheck.utils.Checksum; -34 import org.slf4j.Logger; -35 import org.slf4j.LoggerFactory; -36 -37 /** -38 * A program dependency. This object is one of the core components within DependencyCheck. It is used to collect information about -39 * the dependency in the form of evidence. The Evidence is then used to determine if there are any known, published, -40 * vulnerabilities associated with the program dependency. -41 * -42 * @author Jeremy Long -43 */ -44 public class Dependency implements Serializable, Comparable<Dependency> { -45 -46 /** -47 * The logger. -48 */ -49 private static final Logger LOGGER = LoggerFactory.getLogger(Dependency.class); -50 /** -51 * Used as starting point for generating the value in {@link #hashCode()}. -52 */ -53 private static final int MAGIC_HASH_INIT_VALUE = 3; -54 /** -55 * Used as a multiplier for generating the value in {@link #hashCode()}. -56 */ -57 private static final int MAGIC_HASH_MULTIPLIER = 47; -58 /** -59 * The actual file path of the dependency on disk. -60 */ -61 private String actualFilePath; -62 /** -63 * The file path to display. -64 */ -65 private String filePath; -66 /** -67 * The file name of the dependency. -68 */ -69 private String fileName; -70 /** -71 * The md5 hash of the dependency. -72 */ -73 private String md5sum; -74 /** -75 * The SHA1 hash of the dependency. -76 */ -77 private String sha1sum; -78 /** -79 * A list of Identifiers. -80 */ -81 private Set<Identifier> identifiers; -82 /** -83 * A collection of vendor evidence. -84 */ -85 private final EvidenceCollection vendorEvidence; -86 /** -87 * A collection of product evidence. -88 */ -89 private final EvidenceCollection productEvidence; -90 /** -91 * A collection of version evidence. -92 */ -93 private final EvidenceCollection versionEvidence; -94 +31 import org.apache.commons.lang3.builder.EqualsBuilder; +32 import org.apache.commons.lang3.builder.HashCodeBuilder; +33 import org.owasp.dependencycheck.data.nexus.MavenArtifact; +34 import org.owasp.dependencycheck.utils.Checksum; +35 import org.slf4j.Logger; +36 import org.slf4j.LoggerFactory; +37 +38 /** +39 * A program dependency. This object is one of the core components within DependencyCheck. It is used to collect information about +40 * the dependency in the form of evidence. The Evidence is then used to determine if there are any known, published, +41 * vulnerabilities associated with the program dependency. +42 * +43 * @author Jeremy Long +44 */ +45 public class Dependency implements Serializable, Comparable<Dependency> { +46 +47 /** +48 * The serial version UID for serialization. +49 */ +50 private static final long serialVersionUID = 1L; +51 /** +52 * The logger. +53 */ +54 private static final Logger LOGGER = LoggerFactory.getLogger(Dependency.class); +55 /** +56 * Used as starting point for generating the value in {@link #hashCode()}. +57 */ +58 private static final int MAGIC_HASH_INIT_VALUE = 3; +59 /** +60 * Used as a multiplier for generating the value in {@link #hashCode()}. +61 */ +62 private static final int MAGIC_HASH_MULTIPLIER = 47; +63 /** +64 * The actual file path of the dependency on disk. +65 */ +66 private String actualFilePath; +67 /** +68 * The file path to display. +69 */ +70 private String filePath; +71 /** +72 * The file name of the dependency. +73 */ +74 private String fileName; +75 /** +76 * The md5 hash of the dependency. +77 */ +78 private String md5sum; +79 /** +80 * The SHA1 hash of the dependency. +81 */ +82 private String sha1sum; +83 /** +84 * A list of Identifiers. +85 */ +86 private Set<Identifier> identifiers; +87 /** +88 * A collection of vendor evidence. +89 */ +90 private final EvidenceCollection vendorEvidence; +91 /** +92 * A collection of product evidence. +93 */ +94 private final EvidenceCollection productEvidence; 95 /** -96 * Constructs a new Dependency object. +96 * A collection of version evidence. 97 */ -98 public Dependency() { -99 vendorEvidence = new EvidenceCollection(); -100 productEvidence = new EvidenceCollection(); -101 versionEvidence = new EvidenceCollection(); -102 identifiers = new TreeSet<Identifier>(); -103 vulnerabilities = new TreeSet<Vulnerability>(new VulnerabilityComparator()); -104 suppressedIdentifiers = new TreeSet<Identifier>(); -105 suppressedVulnerabilities = new TreeSet<Vulnerability>(new VulnerabilityComparator()); -106 } -107 -108 /** -109 * Constructs a new Dependency object. -110 * -111 * @param file the File to create the dependency object from. -112 */ -113 public Dependency(File file) { -114 this(); -115 this.actualFilePath = file.getAbsolutePath(); -116 this.filePath = this.actualFilePath; -117 this.fileName = file.getName(); -118 determineHashes(file); -119 } -120 -121 /** -122 * Returns the file name of the dependency. -123 * -124 * @return the file name of the dependency -125 */ -126 public String getFileName() { -127 return this.fileName; -128 } -129 -130 /** -131 * Returns the file name of the dependency with the backslash escaped for use in JavaScript. This is a complete hack as I -132 * could not get the replace to work in the template itself. -133 * -134 * @return the file name of the dependency with the backslash escaped for use in JavaScript -135 */ -136 public String getFileNameForJavaScript() { -137 return this.fileName.replace("\\", "\\\\"); -138 } -139 -140 /** -141 * Sets the file name of the dependency. -142 * -143 * @param fileName the file name of the dependency -144 */ -145 public void setFileName(String fileName) { -146 this.fileName = fileName; -147 } -148 -149 /** -150 * Sets the actual file path of the dependency on disk. -151 * -152 * @param actualFilePath the file path of the dependency -153 */ -154 public void setActualFilePath(String actualFilePath) { -155 this.actualFilePath = actualFilePath; -156 if (this.sha1sum == null) { -157 final File file = new File(this.actualFilePath); -158 determineHashes(file); -159 } -160 } -161 -162 /** -163 * Gets the file path of the dependency. -164 * -165 * @return the file path of the dependency -166 */ -167 public String getActualFilePath() { -168 return this.actualFilePath; -169 } -170 -171 /** -172 * Gets a reference to the File object. -173 * -174 * @return the File object -175 */ -176 public File getActualFile() { -177 return new File(this.actualFilePath); -178 } -179 -180 /** -181 * Sets the file path of the dependency. -182 * -183 * @param filePath the file path of the dependency -184 */ -185 public void setFilePath(String filePath) { -186 this.filePath = filePath; -187 } -188 -189 /** -190 * The file name to display in reports. -191 */ -192 private String displayName = null; +98 private final EvidenceCollection versionEvidence; +99 +100 /** +101 * Constructs a new Dependency object. +102 */ +103 public Dependency() { +104 vendorEvidence = new EvidenceCollection(); +105 productEvidence = new EvidenceCollection(); +106 versionEvidence = new EvidenceCollection(); +107 identifiers = new TreeSet<Identifier>(); +108 vulnerabilities = new TreeSet<Vulnerability>(new VulnerabilityComparator()); +109 suppressedIdentifiers = new TreeSet<Identifier>(); +110 suppressedVulnerabilities = new TreeSet<Vulnerability>(new VulnerabilityComparator()); +111 } +112 +113 /** +114 * Constructs a new Dependency object. +115 * +116 * @param file the File to create the dependency object from. +117 */ +118 public Dependency(File file) { +119 this(); +120 this.actualFilePath = file.getAbsolutePath(); +121 this.filePath = this.actualFilePath; +122 this.fileName = file.getName(); +123 determineHashes(file); +124 } +125 +126 /** +127 * Returns the file name of the dependency. +128 * +129 * @return the file name of the dependency +130 */ +131 public String getFileName() { +132 return this.fileName; +133 } +134 +135 /** +136 * Returns the file name of the dependency with the backslash escaped for use in JavaScript. This is a complete hack as I +137 * could not get the replace to work in the template itself. +138 * +139 * @return the file name of the dependency with the backslash escaped for use in JavaScript +140 */ +141 public String getFileNameForJavaScript() { +142 return this.fileName.replace("\\", "\\\\"); +143 } +144 +145 /** +146 * Sets the file name of the dependency. +147 * +148 * @param fileName the file name of the dependency +149 */ +150 public void setFileName(String fileName) { +151 this.fileName = fileName; +152 } +153 +154 /** +155 * Sets the actual file path of the dependency on disk. +156 * +157 * @param actualFilePath the file path of the dependency +158 */ +159 public void setActualFilePath(String actualFilePath) { +160 this.actualFilePath = actualFilePath; +161 if (this.sha1sum == null) { +162 final File file = new File(this.actualFilePath); +163 determineHashes(file); +164 } +165 } +166 +167 /** +168 * Gets the file path of the dependency. +169 * +170 * @return the file path of the dependency +171 */ +172 public String getActualFilePath() { +173 return this.actualFilePath; +174 } +175 +176 /** +177 * Gets a reference to the File object. +178 * +179 * @return the File object +180 */ +181 public File getActualFile() { +182 return new File(this.actualFilePath); +183 } +184 +185 /** +186 * Sets the file path of the dependency. +187 * +188 * @param filePath the file path of the dependency +189 */ +190 public void setFilePath(String filePath) { +191 this.filePath = filePath; +192 } 193 194 /** -195 * Sets the file name to display in reports. -196 * -197 * @param displayName the name to display -198 */ -199 public void setDisplayFileName(String displayName) { -200 this.displayName = displayName; -201 } -202 -203 /** -204 * Returns the file name to display in reports; if no display file name has been set it will default to the actual file name. -205 * -206 * @return the file name to display -207 */ -208 public String getDisplayFileName() { -209 if (displayName == null) { -210 return this.fileName; -211 } -212 return this.displayName; -213 } -214 -215 /** -216 * <p> -217 * Gets the file path of the dependency.</p> -218 * <p> -219 * <b>NOTE:</b> This may not be the actual path of the file on disk. The actual path of the file on disk can be obtained via -220 * the getActualFilePath().</p> -221 * -222 * @return the file path of the dependency -223 */ -224 public String getFilePath() { -225 return this.filePath; -226 } -227 -228 /** -229 * Returns the MD5 Checksum of the dependency file. -230 * -231 * @return the MD5 Checksum -232 */ -233 public String getMd5sum() { -234 return this.md5sum; -235 } -236 -237 /** -238 * Sets the MD5 Checksum of the dependency. -239 * -240 * @param md5sum the MD5 Checksum -241 */ -242 public void setMd5sum(String md5sum) { -243 this.md5sum = md5sum; -244 } -245 -246 /** -247 * Returns the SHA1 Checksum of the dependency. -248 * -249 * @return the SHA1 Checksum -250 */ -251 public String getSha1sum() { -252 return this.sha1sum; -253 } -254 -255 /** -256 * Sets the SHA1 Checksum of the dependency. -257 * -258 * @param sha1sum the SHA1 Checksum -259 */ -260 public void setSha1sum(String sha1sum) { -261 this.sha1sum = sha1sum; -262 } -263 -264 /** -265 * Returns a List of Identifiers. -266 * -267 * @return an ArrayList of Identifiers -268 */ -269 public Set<Identifier> getIdentifiers() { -270 return this.identifiers; -271 } -272 -273 /** -274 * Sets a List of Identifiers. -275 * -276 * @param identifiers A list of Identifiers -277 */ -278 public void setIdentifiers(Set<Identifier> identifiers) { -279 this.identifiers = identifiers; -280 } -281 -282 /** -283 * Adds an entry to the list of detected Identifiers for the dependency file. -284 * -285 * @param type the type of identifier (such as CPE) -286 * @param value the value of the identifier -287 * @param url the URL of the identifier -288 */ -289 public void addIdentifier(String type, String value, String url) { -290 final Identifier i = new Identifier(type, value, url); -291 this.identifiers.add(i); -292 } -293 -294 /** -295 * Adds an entry to the list of detected Identifiers for the dependency file. -296 * -297 * @param type the type of identifier (such as CPE) -298 * @param value the value of the identifier -299 * @param url the URL of the identifier -300 * @param confidence the confidence in the Identifier being accurate -301 */ -302 public void addIdentifier(String type, String value, String url, Confidence confidence) { -303 final Identifier i = new Identifier(type, value, url); -304 i.setConfidence(confidence); -305 this.identifiers.add(i); -306 } -307 -308 /** -309 * Adds the maven artifact as evidence. -310 * -311 * @param source The source of the evidence -312 * @param mavenArtifact The maven artifact -313 * @param confidence The confidence level of this evidence -314 */ -315 public void addAsEvidence(String source, MavenArtifact mavenArtifact, Confidence confidence) { -316 if (mavenArtifact.getGroupId() != null && !mavenArtifact.getGroupId().isEmpty()) { -317 this.getVendorEvidence().addEvidence(source, "groupid", mavenArtifact.getGroupId(), confidence); -318 } -319 if (mavenArtifact.getArtifactId() != null && !mavenArtifact.getArtifactId().isEmpty()) { -320 this.getProductEvidence().addEvidence(source, "artifactid", mavenArtifact.getArtifactId(), confidence); -321 } -322 if (mavenArtifact.getVersion() != null && !mavenArtifact.getVersion().isEmpty()) { -323 this.getVersionEvidence().addEvidence(source, "version", mavenArtifact.getVersion(), confidence); -324 } -325 if (mavenArtifact.getArtifactUrl() != null && !mavenArtifact.getArtifactUrl().isEmpty()) { -326 boolean found = false; -327 for (Identifier i : this.getIdentifiers()) { -328 if ("maven".equals(i.getType()) && i.getValue().equals(mavenArtifact.toString())) { -329 found = true; -330 i.setConfidence(Confidence.HIGHEST); -331 final String url = "http://search.maven.org/#search|ga|1|1%3A%22" + this.getSha1sum() + "%22"; -332 i.setUrl(url); -333 //i.setUrl(mavenArtifact.getArtifactUrl()); -334 LOGGER.debug("Already found identifier {}. Confidence set to highest", i.getValue()); -335 break; -336 } -337 } -338 if (!found) { -339 LOGGER.debug("Adding new maven identifier {}", mavenArtifact.toString()); -340 this.addIdentifier("maven", mavenArtifact.toString(), mavenArtifact.getArtifactUrl(), Confidence.HIGHEST); -341 } -342 } -343 } -344 -345 /** -346 * Adds an entry to the list of detected Identifiers for the dependency file. -347 * -348 * @param identifier the identifier to add -349 */ -350 public void addIdentifier(Identifier identifier) { -351 this.identifiers.add(identifier); -352 } -353 -354 /** -355 * A set of identifiers that have been suppressed. -356 */ -357 private Set<Identifier> suppressedIdentifiers; +195 * The file name to display in reports. +196 */ +197 private String displayName = null; +198 +199 /** +200 * Sets the file name to display in reports. +201 * +202 * @param displayName the name to display +203 */ +204 public void setDisplayFileName(String displayName) { +205 this.displayName = displayName; +206 } +207 +208 /** +209 * Returns the file name to display in reports; if no display file name has been set it will default to the actual file name. +210 * +211 * @return the file name to display +212 */ +213 public String getDisplayFileName() { +214 if (displayName == null) { +215 return this.fileName; +216 } +217 return this.displayName; +218 } +219 +220 /** +221 * <p> +222 * Gets the file path of the dependency.</p> +223 * <p> +224 * <b>NOTE:</b> This may not be the actual path of the file on disk. The actual path of the file on disk can be obtained via +225 * the getActualFilePath().</p> +226 * +227 * @return the file path of the dependency +228 */ +229 public String getFilePath() { +230 return this.filePath; +231 } +232 +233 /** +234 * Returns the MD5 Checksum of the dependency file. +235 * +236 * @return the MD5 Checksum +237 */ +238 public String getMd5sum() { +239 return this.md5sum; +240 } +241 +242 /** +243 * Sets the MD5 Checksum of the dependency. +244 * +245 * @param md5sum the MD5 Checksum +246 */ +247 public void setMd5sum(String md5sum) { +248 this.md5sum = md5sum; +249 } +250 +251 /** +252 * Returns the SHA1 Checksum of the dependency. +253 * +254 * @return the SHA1 Checksum +255 */ +256 public String getSha1sum() { +257 return this.sha1sum; +258 } +259 +260 /** +261 * Sets the SHA1 Checksum of the dependency. +262 * +263 * @param sha1sum the SHA1 Checksum +264 */ +265 public void setSha1sum(String sha1sum) { +266 this.sha1sum = sha1sum; +267 } +268 +269 /** +270 * Returns a List of Identifiers. +271 * +272 * @return an ArrayList of Identifiers +273 */ +274 public Set<Identifier> getIdentifiers() { +275 return this.identifiers; +276 } +277 +278 /** +279 * Sets a List of Identifiers. +280 * +281 * @param identifiers A list of Identifiers +282 */ +283 public void setIdentifiers(Set<Identifier> identifiers) { +284 this.identifiers = identifiers; +285 } +286 +287 /** +288 * Adds an entry to the list of detected Identifiers for the dependency file. +289 * +290 * @param type the type of identifier (such as CPE) +291 * @param value the value of the identifier +292 * @param url the URL of the identifier +293 */ +294 public void addIdentifier(String type, String value, String url) { +295 final Identifier i = new Identifier(type, value, url); +296 this.identifiers.add(i); +297 } +298 +299 /** +300 * Adds an entry to the list of detected Identifiers for the dependency file. +301 * +302 * @param type the type of identifier (such as CPE) +303 * @param value the value of the identifier +304 * @param url the URL of the identifier +305 * @param confidence the confidence in the Identifier being accurate +306 */ +307 public void addIdentifier(String type, String value, String url, Confidence confidence) { +308 final Identifier i = new Identifier(type, value, url); +309 i.setConfidence(confidence); +310 this.identifiers.add(i); +311 } +312 +313 /** +314 * Adds the maven artifact as evidence. +315 * +316 * @param source The source of the evidence +317 * @param mavenArtifact The maven artifact +318 * @param confidence The confidence level of this evidence +319 */ +320 public void addAsEvidence(String source, MavenArtifact mavenArtifact, Confidence confidence) { +321 if (mavenArtifact.getGroupId() != null && !mavenArtifact.getGroupId().isEmpty()) { +322 this.getVendorEvidence().addEvidence(source, "groupid", mavenArtifact.getGroupId(), confidence); +323 } +324 if (mavenArtifact.getArtifactId() != null && !mavenArtifact.getArtifactId().isEmpty()) { +325 this.getProductEvidence().addEvidence(source, "artifactid", mavenArtifact.getArtifactId(), confidence); +326 } +327 if (mavenArtifact.getVersion() != null && !mavenArtifact.getVersion().isEmpty()) { +328 this.getVersionEvidence().addEvidence(source, "version", mavenArtifact.getVersion(), confidence); +329 } +330 if (mavenArtifact.getArtifactUrl() != null && !mavenArtifact.getArtifactUrl().isEmpty()) { +331 boolean found = false; +332 for (Identifier i : this.getIdentifiers()) { +333 if ("maven".equals(i.getType()) && i.getValue().equals(mavenArtifact.toString())) { +334 found = true; +335 i.setConfidence(Confidence.HIGHEST); +336 final String url = "http://search.maven.org/#search|ga|1|1%3A%22" + this.getSha1sum() + "%22"; +337 i.setUrl(url); +338 //i.setUrl(mavenArtifact.getArtifactUrl()); +339 LOGGER.debug("Already found identifier {}. Confidence set to highest", i.getValue()); +340 break; +341 } +342 } +343 if (!found) { +344 LOGGER.debug("Adding new maven identifier {}", mavenArtifact.toString()); +345 this.addIdentifier("maven", mavenArtifact.toString(), mavenArtifact.getArtifactUrl(), Confidence.HIGHEST); +346 } +347 } +348 } +349 +350 /** +351 * Adds an entry to the list of detected Identifiers for the dependency file. +352 * +353 * @param identifier the identifier to add +354 */ +355 public void addIdentifier(Identifier identifier) { +356 this.identifiers.add(identifier); +357 } 358 359 /** -360 * Get the value of suppressedIdentifiers. -361 * -362 * @return the value of suppressedIdentifiers -363 */ -364 public Set<Identifier> getSuppressedIdentifiers() { -365 return suppressedIdentifiers; -366 } -367 -368 /** -369 * Set the value of suppressedIdentifiers. -370 * -371 * @param suppressedIdentifiers new value of suppressedIdentifiers -372 */ -373 public void setSuppressedIdentifiers(Set<Identifier> suppressedIdentifiers) { -374 this.suppressedIdentifiers = suppressedIdentifiers; -375 } -376 -377 /** -378 * Adds an identifier to the list of suppressed identifiers. -379 * -380 * @param identifier an identifier that was suppressed. -381 */ -382 public void addSuppressedIdentifier(Identifier identifier) { -383 this.suppressedIdentifiers.add(identifier); -384 } -385 -386 /** -387 * A set of vulnerabilities that have been suppressed. -388 */ -389 private SortedSet<Vulnerability> suppressedVulnerabilities; +360 * A set of identifiers that have been suppressed. +361 */ +362 private Set<Identifier> suppressedIdentifiers; +363 +364 /** +365 * Get the value of suppressedIdentifiers. +366 * +367 * @return the value of suppressedIdentifiers +368 */ +369 public Set<Identifier> getSuppressedIdentifiers() { +370 return suppressedIdentifiers; +371 } +372 +373 /** +374 * Set the value of suppressedIdentifiers. +375 * +376 * @param suppressedIdentifiers new value of suppressedIdentifiers +377 */ +378 public void setSuppressedIdentifiers(Set<Identifier> suppressedIdentifiers) { +379 this.suppressedIdentifiers = suppressedIdentifiers; +380 } +381 +382 /** +383 * Adds an identifier to the list of suppressed identifiers. +384 * +385 * @param identifier an identifier that was suppressed. +386 */ +387 public void addSuppressedIdentifier(Identifier identifier) { +388 this.suppressedIdentifiers.add(identifier); +389 } 390 391 /** -392 * Get the value of suppressedVulnerabilities. -393 * -394 * @return the value of suppressedVulnerabilities -395 */ -396 public SortedSet<Vulnerability> getSuppressedVulnerabilities() { -397 return suppressedVulnerabilities; -398 } -399 -400 /** -401 * Set the value of suppressedVulnerabilities. -402 * -403 * @param suppressedVulnerabilities new value of suppressedVulnerabilities -404 */ -405 public void setSuppressedVulnerabilities(SortedSet<Vulnerability> suppressedVulnerabilities) { -406 this.suppressedVulnerabilities = suppressedVulnerabilities; -407 } -408 -409 /** -410 * Adds a vulnerability to the set of suppressed vulnerabilities. -411 * -412 * @param vulnerability the vulnerability that was suppressed -413 */ -414 public void addSuppressedVulnerability(Vulnerability vulnerability) { -415 this.suppressedVulnerabilities.add(vulnerability); -416 } -417 -418 /** -419 * Returns the evidence used to identify this dependency. -420 * -421 * @return an EvidenceCollection. -422 */ -423 public EvidenceCollection getEvidence() { -424 return EvidenceCollection.merge(this.productEvidence, this.vendorEvidence, this.versionEvidence); -425 } -426 -427 /** -428 * Returns the evidence used to identify this dependency. -429 * -430 * @return an EvidenceCollection. -431 */ -432 public Set<Evidence> getEvidenceForDisplay() { -433 return EvidenceCollection.mergeForDisplay(this.productEvidence, this.vendorEvidence, this.versionEvidence); -434 } -435 -436 /** -437 * Returns the evidence used to identify this dependency. -438 * -439 * @return an EvidenceCollection. -440 */ -441 public EvidenceCollection getEvidenceUsed() { -442 return EvidenceCollection.mergeUsed(this.productEvidence, this.vendorEvidence, this.versionEvidence); -443 } -444 -445 /** -446 * Gets the Vendor Evidence. -447 * -448 * @return an EvidenceCollection. -449 */ -450 public EvidenceCollection getVendorEvidence() { -451 return this.vendorEvidence; -452 } -453 -454 /** -455 * Gets the Product Evidence. -456 * -457 * @return an EvidenceCollection. -458 */ -459 public EvidenceCollection getProductEvidence() { -460 return this.productEvidence; -461 } -462 -463 /** -464 * Gets the Version Evidence. -465 * -466 * @return an EvidenceCollection. -467 */ -468 public EvidenceCollection getVersionEvidence() { -469 return this.versionEvidence; -470 } -471 -472 /** -473 * The description of the JAR file. -474 */ -475 private String description; +392 * A set of vulnerabilities that have been suppressed. +393 */ +394 private SortedSet<Vulnerability> suppressedVulnerabilities; +395 +396 /** +397 * Get the value of suppressedVulnerabilities. +398 * +399 * @return the value of suppressedVulnerabilities +400 */ +401 public SortedSet<Vulnerability> getSuppressedVulnerabilities() { +402 return suppressedVulnerabilities; +403 } +404 +405 /** +406 * Set the value of suppressedVulnerabilities. +407 * +408 * @param suppressedVulnerabilities new value of suppressedVulnerabilities +409 */ +410 public void setSuppressedVulnerabilities(SortedSet<Vulnerability> suppressedVulnerabilities) { +411 this.suppressedVulnerabilities = suppressedVulnerabilities; +412 } +413 +414 /** +415 * Adds a vulnerability to the set of suppressed vulnerabilities. +416 * +417 * @param vulnerability the vulnerability that was suppressed +418 */ +419 public void addSuppressedVulnerability(Vulnerability vulnerability) { +420 this.suppressedVulnerabilities.add(vulnerability); +421 } +422 +423 /** +424 * Returns the evidence used to identify this dependency. +425 * +426 * @return an EvidenceCollection. +427 */ +428 public EvidenceCollection getEvidence() { +429 return EvidenceCollection.merge(this.productEvidence, this.vendorEvidence, this.versionEvidence); +430 } +431 +432 /** +433 * Returns the evidence used to identify this dependency. +434 * +435 * @return an EvidenceCollection. +436 */ +437 public Set<Evidence> getEvidenceForDisplay() { +438 return EvidenceCollection.mergeForDisplay(this.productEvidence, this.vendorEvidence, this.versionEvidence); +439 } +440 +441 /** +442 * Returns the evidence used to identify this dependency. +443 * +444 * @return an EvidenceCollection. +445 */ +446 public EvidenceCollection getEvidenceUsed() { +447 return EvidenceCollection.mergeUsed(this.productEvidence, this.vendorEvidence, this.versionEvidence); +448 } +449 +450 /** +451 * Gets the Vendor Evidence. +452 * +453 * @return an EvidenceCollection. +454 */ +455 public EvidenceCollection getVendorEvidence() { +456 return this.vendorEvidence; +457 } +458 +459 /** +460 * Gets the Product Evidence. +461 * +462 * @return an EvidenceCollection. +463 */ +464 public EvidenceCollection getProductEvidence() { +465 return this.productEvidence; +466 } +467 +468 /** +469 * Gets the Version Evidence. +470 * +471 * @return an EvidenceCollection. +472 */ +473 public EvidenceCollection getVersionEvidence() { +474 return this.versionEvidence; +475 } 476 477 /** -478 * Get the value of description. -479 * -480 * @return the value of description -481 */ -482 public String getDescription() { -483 return description; -484 } -485 -486 /** -487 * Set the value of description. -488 * -489 * @param description new value of description -490 */ -491 public void setDescription(String description) { -492 this.description = description; -493 } -494 -495 /** -496 * The license that this dependency uses. -497 */ -498 private String license; +478 * The description of the JAR file. +479 */ +480 private String description; +481 +482 /** +483 * Get the value of description. +484 * +485 * @return the value of description +486 */ +487 public String getDescription() { +488 return description; +489 } +490 +491 /** +492 * Set the value of description. +493 * +494 * @param description new value of description +495 */ +496 public void setDescription(String description) { +497 this.description = description; +498 } 499 500 /** -501 * Get the value of license. -502 * -503 * @return the value of license -504 */ -505 public String getLicense() { -506 return license; -507 } -508 -509 /** -510 * Set the value of license. -511 * -512 * @param license new value of license -513 */ -514 public void setLicense(String license) { -515 this.license = license; -516 } -517 -518 /** -519 * A list of vulnerabilities for this dependency. -520 */ -521 private SortedSet<Vulnerability> vulnerabilities; +501 * The license that this dependency uses. +502 */ +503 private String license; +504 +505 /** +506 * Get the value of license. +507 * +508 * @return the value of license +509 */ +510 public String getLicense() { +511 return license; +512 } +513 +514 /** +515 * Set the value of license. +516 * +517 * @param license new value of license +518 */ +519 public void setLicense(String license) { +520 this.license = license; +521 } 522 523 /** -524 * Get the list of vulnerabilities. -525 * -526 * @return the list of vulnerabilities -527 */ -528 public SortedSet<Vulnerability> getVulnerabilities() { -529 return vulnerabilities; -530 } -531 -532 /** -533 * Set the value of vulnerabilities. -534 * -535 * @param vulnerabilities new value of vulnerabilities -536 */ -537 public void setVulnerabilities(SortedSet<Vulnerability> vulnerabilities) { -538 this.vulnerabilities = vulnerabilities; -539 } -540 -541 /** -542 * Determines the sha1 and md5 sum for the given file. -543 * -544 * @param file the file to create checksums for -545 */ -546 private void determineHashes(File file) { -547 String md5 = null; -548 String sha1 = null; -549 try { -550 md5 = Checksum.getMD5Checksum(file); -551 sha1 = Checksum.getSHA1Checksum(file); -552 } catch (IOException ex) { -553 LOGGER.warn("Unable to read '{}' to determine hashes.", file.getName()); -554 LOGGER.debug("", ex); -555 } catch (NoSuchAlgorithmException ex) { -556 LOGGER.warn("Unable to use MD5 of SHA1 checksums."); -557 LOGGER.debug("", ex); -558 } -559 this.setMd5sum(md5); -560 this.setSha1sum(sha1); -561 } -562 -563 /** -564 * Adds a vulnerability to the dependency. -565 * -566 * @param vulnerability a vulnerability outlining a vulnerability. -567 */ -568 public void addVulnerability(Vulnerability vulnerability) { -569 this.vulnerabilities.add(vulnerability); -570 } -571 -572 /** -573 * A collection of related dependencies. -574 */ -575 private Set<Dependency> relatedDependencies = new TreeSet<Dependency>(); +524 * A list of vulnerabilities for this dependency. +525 */ +526 private SortedSet<Vulnerability> vulnerabilities; +527 +528 /** +529 * Get the list of vulnerabilities. +530 * +531 * @return the list of vulnerabilities +532 */ +533 public SortedSet<Vulnerability> getVulnerabilities() { +534 return vulnerabilities; +535 } +536 +537 /** +538 * Set the value of vulnerabilities. +539 * +540 * @param vulnerabilities new value of vulnerabilities +541 */ +542 public void setVulnerabilities(SortedSet<Vulnerability> vulnerabilities) { +543 this.vulnerabilities = vulnerabilities; +544 } +545 +546 /** +547 * Determines the sha1 and md5 sum for the given file. +548 * +549 * @param file the file to create checksums for +550 */ +551 private void determineHashes(File file) { +552 String md5 = null; +553 String sha1 = null; +554 try { +555 md5 = Checksum.getMD5Checksum(file); +556 sha1 = Checksum.getSHA1Checksum(file); +557 } catch (IOException ex) { +558 LOGGER.warn("Unable to read '{}' to determine hashes.", file.getName()); +559 LOGGER.debug("", ex); +560 } catch (NoSuchAlgorithmException ex) { +561 LOGGER.warn("Unable to use MD5 of SHA1 checksums."); +562 LOGGER.debug("", ex); +563 } +564 this.setMd5sum(md5); +565 this.setSha1sum(sha1); +566 } +567 +568 /** +569 * Adds a vulnerability to the dependency. +570 * +571 * @param vulnerability a vulnerability outlining a vulnerability. +572 */ +573 public void addVulnerability(Vulnerability vulnerability) { +574 this.vulnerabilities.add(vulnerability); +575 } 576 577 /** -578 * Get the value of {@link #relatedDependencies}. This field is used to collect other dependencies which really represent the -579 * same dependency, and may be presented as one item in reports. -580 * -581 * @return the value of relatedDependencies -582 */ -583 public Set<Dependency> getRelatedDependencies() { -584 return relatedDependencies; -585 } -586 -587 /** -588 * A list of projects that reference this dependency. -589 */ -590 private Set<String> projectReferences = new HashSet<String>(); +578 * A collection of related dependencies. +579 */ +580 private Set<Dependency> relatedDependencies = new TreeSet<Dependency>(); +581 +582 /** +583 * Get the value of {@link #relatedDependencies}. This field is used to collect other dependencies which really represent the +584 * same dependency, and may be presented as one item in reports. +585 * +586 * @return the value of relatedDependencies +587 */ +588 public Set<Dependency> getRelatedDependencies() { +589 return relatedDependencies; +590 } 591 592 /** -593 * Get the value of projectReferences. -594 * -595 * @return the value of projectReferences -596 */ -597 public Set<String> getProjectReferences() { -598 return projectReferences; -599 } -600 -601 /** -602 * Set the value of projectReferences. -603 * -604 * @param projectReferences new value of projectReferences -605 */ -606 public void setProjectReferences(Set<String> projectReferences) { -607 this.projectReferences = projectReferences; -608 } -609 -610 /** -611 * Adds a project reference. -612 * -613 * @param projectReference a project reference -614 */ -615 public void addProjectReference(String projectReference) { -616 this.projectReferences.add(projectReference); -617 } -618 -619 /** -620 * Add a collection of project reference. -621 * -622 * @param projectReferences a set of project references -623 */ -624 public void addAllProjectReferences(Set<String> projectReferences) { -625 this.projectReferences.addAll(projectReferences); -626 } -627 -628 /** -629 * Set the value of relatedDependencies. -630 * -631 * @param relatedDependencies new value of relatedDependencies -632 */ -633 public void setRelatedDependencies(Set<Dependency> relatedDependencies) { -634 this.relatedDependencies = relatedDependencies; -635 } -636 -637 /** -638 * Adds a related dependency. The internal collection is normally a {@link java.util.TreeSet}, which relies on -639 * {@link #compareTo(Dependency)}. A consequence of this is that if you attempt to add a dependency with the same file path -640 * (modulo character case) as one that is already in the collection, it won't get added. -641 * -642 * @param dependency a reference to the related dependency -643 */ -644 public void addRelatedDependency(Dependency dependency) { -645 if (this == dependency) { -646 LOGGER.warn("Attempted to add a circular reference - please post the log file to issue #172 here " -647 + "https://github.com/jeremylong/DependencyCheck/issues/172"); -648 LOGGER.debug("this: {}", this); -649 LOGGER.debug("dependency: {}", dependency); -650 } else if (!relatedDependencies.add(dependency)) { -651 LOGGER.debug("Failed to add dependency, likely due to referencing the same file as another dependency in the set."); -652 LOGGER.debug("this: {}", this); -653 LOGGER.debug("dependency: {}", dependency); -654 } -655 } -656 -657 /** -658 * A list of available versions. -659 */ -660 private List<String> availableVersions = new ArrayList<String>(); +593 * A list of projects that reference this dependency. +594 */ +595 private Set<String> projectReferences = new HashSet<String>(); +596 +597 /** +598 * Get the value of projectReferences. +599 * +600 * @return the value of projectReferences +601 */ +602 public Set<String> getProjectReferences() { +603 return projectReferences; +604 } +605 +606 /** +607 * Set the value of projectReferences. +608 * +609 * @param projectReferences new value of projectReferences +610 */ +611 public void setProjectReferences(Set<String> projectReferences) { +612 this.projectReferences = projectReferences; +613 } +614 +615 /** +616 * Adds a project reference. +617 * +618 * @param projectReference a project reference +619 */ +620 public void addProjectReference(String projectReference) { +621 this.projectReferences.add(projectReference); +622 } +623 +624 /** +625 * Add a collection of project reference. +626 * +627 * @param projectReferences a set of project references +628 */ +629 public void addAllProjectReferences(Set<String> projectReferences) { +630 this.projectReferences.addAll(projectReferences); +631 } +632 +633 /** +634 * Set the value of relatedDependencies. +635 * +636 * @param relatedDependencies new value of relatedDependencies +637 */ +638 public void setRelatedDependencies(Set<Dependency> relatedDependencies) { +639 this.relatedDependencies = relatedDependencies; +640 } +641 +642 /** +643 * Adds a related dependency. The internal collection is normally a {@link java.util.TreeSet}, which relies on +644 * {@link #compareTo(Dependency)}. A consequence of this is that if you attempt to add a dependency with the same file path +645 * (modulo character case) as one that is already in the collection, it won't get added. +646 * +647 * @param dependency a reference to the related dependency +648 */ +649 public void addRelatedDependency(Dependency dependency) { +650 if (this == dependency) { +651 LOGGER.warn("Attempted to add a circular reference - please post the log file to issue #172 here " +652 + "https://github.com/jeremylong/DependencyCheck/issues/172"); +653 LOGGER.debug("this: {}", this); +654 LOGGER.debug("dependency: {}", dependency); +655 } else if (!relatedDependencies.add(dependency)) { +656 LOGGER.debug("Failed to add dependency, likely due to referencing the same file as another dependency in the set."); +657 LOGGER.debug("this: {}", this); +658 LOGGER.debug("dependency: {}", dependency); +659 } +660 } 661 662 /** -663 * Get the value of availableVersions. -664 * -665 * @return the value of availableVersions -666 */ -667 public List<String> getAvailableVersions() { -668 return availableVersions; -669 } -670 -671 /** -672 * Set the value of availableVersions. -673 * -674 * @param availableVersions new value of availableVersions -675 */ -676 public void setAvailableVersions(List<String> availableVersions) { -677 this.availableVersions = availableVersions; -678 } -679 -680 /** -681 * Adds a version to the available version list. -682 * -683 * @param version the version to add to the list -684 */ -685 public void addAvailableVersion(String version) { -686 this.availableVersions.add(version); -687 } -688 -689 /** -690 * Implementation of the Comparable<Dependency> interface. The comparison is solely based on the file path. -691 * -692 * @param o a dependency to compare -693 * @return an integer representing the natural ordering -694 */ -695 public int compareTo(Dependency o) { -696 return this.getFilePath().compareToIgnoreCase(o.getFilePath()); -697 } -698 -699 /** -700 * Implementation of the equals method. -701 * -702 * @param obj the object to compare -703 * @return true if the objects are equal, otherwise false -704 */ -705 @Override -706 public boolean equals(Object obj) { -707 if (obj == null || getClass() != obj.getClass()) { -708 return false; -709 } -710 final Dependency other = (Dependency) obj; -711 return ObjectUtils.equals(this.actualFilePath, other.actualFilePath) -712 && ObjectUtils.equals(this.filePath, other.filePath) -713 && ObjectUtils.equals(this.fileName, other.fileName) -714 && ObjectUtils.equals(this.md5sum, other.md5sum) -715 && ObjectUtils.equals(this.sha1sum, other.sha1sum) -716 && ObjectUtils.equals(this.identifiers, other.identifiers) -717 && ObjectUtils.equals(this.vendorEvidence, other.vendorEvidence) -718 && ObjectUtils.equals(this.productEvidence, other.productEvidence) -719 && ObjectUtils.equals(this.versionEvidence, other.versionEvidence) -720 && ObjectUtils.equals(this.description, other.description) -721 && ObjectUtils.equals(this.license, other.license) -722 && ObjectUtils.equals(this.vulnerabilities, other.vulnerabilities) -723 && ObjectUtils.equals(this.relatedDependencies, other.relatedDependencies) -724 && ObjectUtils.equals(this.projectReferences, other.projectReferences) -725 && ObjectUtils.equals(this.availableVersions, other.availableVersions); -726 } -727 -728 /** -729 * Generates the HashCode. -730 * -731 * @return the HashCode -732 */ -733 @Override -734 public int hashCode() { -735 int hash = MAGIC_HASH_INIT_VALUE; -736 for (Object field : new Object[]{this.actualFilePath, this.filePath, this.fileName, this.md5sum, -737 this.sha1sum, this.identifiers, this.vendorEvidence, this.productEvidence, this.versionEvidence, -738 this.description, this.license, this.vulnerabilities, this.relatedDependencies, this.projectReferences, -739 this.availableVersions}) { -740 hash = MAGIC_HASH_MULTIPLIER * hash + ObjectUtils.hashCode(field); -741 } -742 return hash; -743 } -744 -745 /** -746 * Standard toString() implementation showing the filename, actualFilePath, and filePath. -747 * -748 * @return the string representation of the file -749 */ -750 @Override -751 public String toString() { -752 return "Dependency{ fileName='" + fileName + "', actualFilePath='" + actualFilePath + "', filePath='" + filePath + "'}"; -753 } -754 } +663 * A list of available versions. +664 */ +665 private List<String> availableVersions = new ArrayList<String>(); +666 +667 /** +668 * Get the value of availableVersions. +669 * +670 * @return the value of availableVersions +671 */ +672 public List<String> getAvailableVersions() { +673 return availableVersions; +674 } +675 +676 /** +677 * Set the value of availableVersions. +678 * +679 * @param availableVersions new value of availableVersions +680 */ +681 public void setAvailableVersions(List<String> availableVersions) { +682 this.availableVersions = availableVersions; +683 } +684 +685 /** +686 * Adds a version to the available version list. +687 * +688 * @param version the version to add to the list +689 */ +690 public void addAvailableVersion(String version) { +691 this.availableVersions.add(version); +692 } +693 +694 /** +695 * Implementation of the Comparable<Dependency> interface. The comparison is solely based on the file path. +696 * +697 * @param o a dependency to compare +698 * @return an integer representing the natural ordering +699 */ +700 @Override +701 public int compareTo(Dependency o) { +702 return this.getFilePath().compareToIgnoreCase(o.getFilePath()); +703 } +704 +705 /** +706 * Implementation of the equals method. +707 * +708 * @param obj the object to compare +709 * @return true if the objects are equal, otherwise false +710 */ +711 @Override +712 public boolean equals(Object obj) { +713 if (obj == null || getClass() != obj.getClass()) { +714 return false; +715 } +716 final Dependency other = (Dependency) obj; +717 return new EqualsBuilder() +718 .appendSuper(super.equals(obj)) +719 .append(this.actualFilePath, other.actualFilePath) +720 .append(this.filePath, other.filePath) +721 .append(this.fileName, other.fileName) +722 .append(this.md5sum, other.md5sum) +723 .append(this.sha1sum, other.sha1sum) +724 .append(this.identifiers, other.identifiers) +725 .append(this.vendorEvidence, other.vendorEvidence) +726 .append(this.productEvidence, other.productEvidence) +727 .append(this.versionEvidence, other.versionEvidence) +728 .append(this.description, other.description) +729 .append(this.license, other.license) +730 .append(this.vulnerabilities, other.vulnerabilities) +731 //.append(this.relatedDependencies, other.relatedDependencies) +732 .append(this.projectReferences, other.projectReferences) +733 .append(this.availableVersions, other.availableVersions) +734 .isEquals(); +735 } +736 +737 /** +738 * Generates the HashCode. +739 * +740 * @return the HashCode +741 */ +742 @Override +743 public int hashCode() { +744 return new HashCodeBuilder(MAGIC_HASH_INIT_VALUE, MAGIC_HASH_MULTIPLIER) +745 .append(actualFilePath) +746 .append(filePath) +747 .append(fileName) +748 .append(md5sum) +749 .append(sha1sum) +750 .append(identifiers) +751 .append(vendorEvidence) +752 .append(productEvidence) +753 .append(versionEvidence) +754 .append(description) +755 .append(license) +756 .append(vulnerabilities) +757 //.append(relatedDependencies) +758 .append(projectReferences) +759 .append(availableVersions) +760 .toHashCode(); +761 } +762 +763 /** +764 * Standard toString() implementation showing the filename, actualFilePath, and filePath. +765 * +766 * @return the string representation of the file +767 */ +768 @Override +769 public String toString() { +770 return "Dependency{ fileName='" + fileName + "', actualFilePath='" + actualFilePath + "', filePath='" + filePath + "'}"; +771 } +772 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Evidence.html b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Evidence.html index 545c79813..8e8a6af52 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Evidence.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Evidence.html @@ -25,271 +25,277 @@ 17 */ 18 package org.owasp.dependencycheck.dependency; 19 -20 import org.apache.commons.lang.ObjectUtils; -21 import org.apache.commons.lang.StringUtils; -22 -23 import java.io.Serializable; -24 -25 /** -26 * Evidence is a piece of information about a Dependency. -27 * -28 * @author Jeremy Long -29 */ -30 public class Evidence implements Serializable, Comparable<Evidence> { -31 -32 /** -33 * Used as starting point for generating the value in {@link #hashCode()}. -34 */ -35 private static final int MAGIC_HASH_INIT_VALUE = 3; -36 +20 import org.apache.commons.lang3.ObjectUtils; +21 import org.apache.commons.lang3.StringUtils; +22 import org.apache.commons.lang3.builder.HashCodeBuilder; +23 +24 import java.io.Serializable; +25 +26 /** +27 * Evidence is a piece of information about a Dependency. +28 * +29 * @author Jeremy Long +30 */ +31 public class Evidence implements Serializable, Comparable<Evidence> { +32 +33 /** +34 * The serial version UID for serialization. +35 */ +36 private static final long serialVersionUID = 1L; 37 /** -38 * Used as a multiplier for generating the value in {@link #hashCode()}. +38 * Used as starting point for generating the value in {@link #hashCode()}. 39 */ -40 private static final int MAGIC_HASH_MULTIPLIER = 67; +40 private static final int MAGIC_HASH_INIT_VALUE = 3; 41 42 /** -43 * Creates a new Evidence object. +43 * Used as a multiplier for generating the value in {@link #hashCode()}. 44 */ -45 public Evidence() { -46 } -47 -48 /** -49 * Creates a new Evidence objects. -50 * -51 * @param source the source of the evidence. -52 * @param name the name of the evidence. -53 * @param value the value of the evidence. -54 * @param confidence the confidence of the evidence. -55 */ -56 public Evidence(String source, String name, String value, Confidence confidence) { -57 this.source = source; -58 this.name = name; -59 this.value = value; -60 this.confidence = confidence; -61 } -62 -63 /** -64 * The name of the evidence. -65 */ -66 private String name; +45 private static final int MAGIC_HASH_MULTIPLIER = 67; +46 +47 /** +48 * Creates a new Evidence object. +49 */ +50 public Evidence() { +51 } +52 +53 /** +54 * Creates a new Evidence objects. +55 * +56 * @param source the source of the evidence. +57 * @param name the name of the evidence. +58 * @param value the value of the evidence. +59 * @param confidence the confidence of the evidence. +60 */ +61 public Evidence(String source, String name, String value, Confidence confidence) { +62 this.source = source; +63 this.name = name; +64 this.value = value; +65 this.confidence = confidence; +66 } 67 68 /** -69 * Get the value of name. -70 * -71 * @return the value of name -72 */ -73 public String getName() { -74 return name; -75 } -76 -77 /** -78 * Set the value of name. -79 * -80 * @param name new value of name -81 */ -82 public void setName(String name) { -83 this.name = name; -84 } -85 -86 /** -87 * The source of the evidence. -88 */ -89 private String source; +69 * The name of the evidence. +70 */ +71 private String name; +72 +73 /** +74 * Get the value of name. +75 * +76 * @return the value of name +77 */ +78 public String getName() { +79 return name; +80 } +81 +82 /** +83 * Set the value of name. +84 * +85 * @param name new value of name +86 */ +87 public void setName(String name) { +88 this.name = name; +89 } 90 91 /** -92 * Get the value of source. -93 * -94 * @return the value of source -95 */ -96 public String getSource() { -97 return source; -98 } -99 -100 /** -101 * Set the value of source. -102 * -103 * @param source new value of source -104 */ -105 public void setSource(String source) { -106 this.source = source; -107 } -108 -109 /** -110 * The value of the evidence. -111 */ -112 private String value; +92 * The source of the evidence. +93 */ +94 private String source; +95 +96 /** +97 * Get the value of source. +98 * +99 * @return the value of source +100 */ +101 public String getSource() { +102 return source; +103 } +104 +105 /** +106 * Set the value of source. +107 * +108 * @param source new value of source +109 */ +110 public void setSource(String source) { +111 this.source = source; +112 } 113 114 /** -115 * Get the value of value. -116 * -117 * @return the value of value -118 */ -119 public String getValue() { -120 used = true; -121 return value; -122 } -123 -124 /** -125 * Get the value of value. If setUsed is set to false this call to get will not mark the evidence as used. -126 * -127 * @param setUsed whether or not this call to getValue should cause the used flag to be updated -128 * @return the value of value -129 */ -130 public String getValue(Boolean setUsed) { -131 used = used || setUsed; -132 return value; -133 } -134 -135 /** -136 * Set the value of value. -137 * -138 * @param value new value of value -139 */ -140 public void setValue(String value) { -141 this.value = value; -142 } -143 -144 /** -145 * A value indicating if the Evidence has been "used" (aka read). -146 */ -147 private boolean used; +115 * The value of the evidence. +116 */ +117 private String value; +118 +119 /** +120 * Get the value of value. +121 * +122 * @return the value of value +123 */ +124 public String getValue() { +125 used = true; +126 return value; +127 } +128 +129 /** +130 * Get the value of value. If setUsed is set to false this call to get will not mark the evidence as used. +131 * +132 * @param setUsed whether or not this call to getValue should cause the used flag to be updated +133 * @return the value of value +134 */ +135 public String getValue(Boolean setUsed) { +136 used = used || setUsed; +137 return value; +138 } +139 +140 /** +141 * Set the value of value. +142 * +143 * @param value new value of value +144 */ +145 public void setValue(String value) { +146 this.value = value; +147 } 148 149 /** -150 * Get the value of used. -151 * -152 * @return the value of used -153 */ -154 public boolean isUsed() { -155 return used; -156 } -157 -158 /** -159 * Set the value of used. -160 * -161 * @param used new value of used -162 */ -163 public void setUsed(boolean used) { -164 this.used = used; -165 } -166 -167 /** -168 * The confidence level for the evidence. -169 */ -170 private Confidence confidence; +150 * A value indicating if the Evidence has been "used" (aka read). +151 */ +152 private boolean used; +153 +154 /** +155 * Get the value of used. +156 * +157 * @return the value of used +158 */ +159 public boolean isUsed() { +160 return used; +161 } +162 +163 /** +164 * Set the value of used. +165 * +166 * @param used new value of used +167 */ +168 public void setUsed(boolean used) { +169 this.used = used; +170 } 171 172 /** -173 * Get the value of confidence. -174 * -175 * @return the value of confidence -176 */ -177 public Confidence getConfidence() { -178 return confidence; -179 } -180 -181 /** -182 * Set the value of confidence. -183 * -184 * @param confidence new value of confidence -185 */ -186 public void setConfidence(Confidence confidence) { -187 this.confidence = confidence; -188 } -189 -190 /** -191 * Implements the hashCode for Evidence. -192 * -193 * @return hash code. -194 */ -195 @Override -196 public int hashCode() { -197 int hash = MAGIC_HASH_INIT_VALUE; -198 hash = MAGIC_HASH_MULTIPLIER * hash + ObjectUtils.hashCode(StringUtils.lowerCase(this.name)); -199 hash = MAGIC_HASH_MULTIPLIER * hash + ObjectUtils.hashCode(StringUtils.lowerCase(this.source)); -200 hash = MAGIC_HASH_MULTIPLIER * hash + ObjectUtils.hashCode(StringUtils.lowerCase(this.value)); -201 hash = MAGIC_HASH_MULTIPLIER * hash + ObjectUtils.hashCode(this.confidence); -202 return hash; -203 } -204 -205 /** -206 * Implements equals for Evidence. -207 * -208 * @param that an object to check the equality of. -209 * @return whether the two objects are equal. -210 */ -211 @Override -212 public boolean equals(Object that) { -213 if (this == that) { -214 return true; -215 } -216 if (!(that instanceof Evidence)) { -217 return false; -218 } -219 final Evidence e = (Evidence) that; -220 -221 return StringUtils.equalsIgnoreCase(name, e.name) -222 && StringUtils.equalsIgnoreCase(source, e.source) -223 && StringUtils.equalsIgnoreCase(value, e.value) -224 && ObjectUtils.equals(confidence, e.confidence); -225 } -226 -227 /** -228 * Implementation of the comparable interface. -229 * -230 * @param o the evidence being compared -231 * @return an integer indicating the ordering of the two objects -232 */ -233 public int compareTo(Evidence o) { -234 if (o == null) { -235 return 1; -236 } -237 if (StringUtils.equalsIgnoreCase(source, o.source)) { -238 if (StringUtils.equalsIgnoreCase(name, o.name)) { -239 if (StringUtils.equalsIgnoreCase(value, o.value)) { -240 if (ObjectUtils.equals(confidence, o.confidence)) { -241 return 0; //they are equal -242 } else { -243 return ObjectUtils.compare(confidence, o.confidence); -244 } -245 } else { -246 return compareToIgnoreCaseWithNullCheck(value, o.value); -247 } -248 } else { -249 return compareToIgnoreCaseWithNullCheck(name, o.name); -250 } -251 } else { -252 return compareToIgnoreCaseWithNullCheck(source, o.source); -253 } -254 } -255 -256 /** -257 * Wrapper around {@link java.lang.String#compareToIgnoreCase(java.lang.String) String.compareToIgnoreCase} with an -258 * exhaustive, possibly duplicative, check against nulls. -259 * -260 * @param me the value to be compared -261 * @param other the other value to be compared -262 * @return true if the values are equal; otherwise false -263 */ -264 private int compareToIgnoreCaseWithNullCheck(String me, String other) { -265 if (me == null && other == null) { -266 return 0; -267 } else if (me == null) { -268 return -1; //the other string is greater then me -269 } else if (other == null) { -270 return 1; //me is greater then the other string -271 } -272 return me.compareToIgnoreCase(other); -273 } -274 -275 /** -276 * Standard toString() implementation. -277 * -278 * @return the string representation of the object -279 */ -280 @Override -281 public String toString() { -282 return "Evidence{" + "name=" + name + ", source=" + source + ", value=" + value + ", confidence=" + confidence + '}'; -283 } -284 } +173 * The confidence level for the evidence. +174 */ +175 private Confidence confidence; +176 +177 /** +178 * Get the value of confidence. +179 * +180 * @return the value of confidence +181 */ +182 public Confidence getConfidence() { +183 return confidence; +184 } +185 +186 /** +187 * Set the value of confidence. +188 * +189 * @param confidence new value of confidence +190 */ +191 public void setConfidence(Confidence confidence) { +192 this.confidence = confidence; +193 } +194 +195 /** +196 * Implements the hashCode for Evidence. +197 * +198 * @return hash code. +199 */ +200 @Override +201 public int hashCode() { +202 return new HashCodeBuilder(MAGIC_HASH_INIT_VALUE, MAGIC_HASH_MULTIPLIER) +203 .append(StringUtils.lowerCase(name)) +204 .append(StringUtils.lowerCase(source)) +205 .append(StringUtils.lowerCase(value)) +206 .append(confidence) +207 .toHashCode(); +208 } +209 +210 /** +211 * Implements equals for Evidence. +212 * +213 * @param that an object to check the equality of. +214 * @return whether the two objects are equal. +215 */ +216 @Override +217 public boolean equals(Object that) { +218 if (this == that) { +219 return true; +220 } +221 if (!(that instanceof Evidence)) { +222 return false; +223 } +224 final Evidence e = (Evidence) that; +225 +226 return StringUtils.equalsIgnoreCase(name, e.name) +227 && StringUtils.equalsIgnoreCase(source, e.source) +228 && StringUtils.equalsIgnoreCase(value, e.value) +229 && ObjectUtils.equals(confidence, e.confidence); +230 } +231 +232 /** +233 * Implementation of the comparable interface. +234 * +235 * @param o the evidence being compared +236 * @return an integer indicating the ordering of the two objects +237 */ +238 @Override +239 public int compareTo(Evidence o) { +240 if (o == null) { +241 return 1; +242 } +243 if (StringUtils.equalsIgnoreCase(source, o.source)) { +244 if (StringUtils.equalsIgnoreCase(name, o.name)) { +245 if (StringUtils.equalsIgnoreCase(value, o.value)) { +246 if (ObjectUtils.equals(confidence, o.confidence)) { +247 return 0; //they are equal +248 } else { +249 return ObjectUtils.compare(confidence, o.confidence); +250 } +251 } else { +252 return compareToIgnoreCaseWithNullCheck(value, o.value); +253 } +254 } else { +255 return compareToIgnoreCaseWithNullCheck(name, o.name); +256 } +257 } else { +258 return compareToIgnoreCaseWithNullCheck(source, o.source); +259 } +260 } +261 +262 /** +263 * Wrapper around {@link java.lang.String#compareToIgnoreCase(java.lang.String) String.compareToIgnoreCase} with an +264 * exhaustive, possibly duplicative, check against nulls. +265 * +266 * @param me the value to be compared +267 * @param other the other value to be compared +268 * @return true if the values are equal; otherwise false +269 */ +270 private int compareToIgnoreCaseWithNullCheck(String me, String other) { +271 if (me == null && other == null) { +272 return 0; +273 } else if (me == null) { +274 return -1; //the other string is greater then me +275 } else if (other == null) { +276 return 1; //me is greater then the other string +277 } +278 return me.compareToIgnoreCase(other); +279 } +280 +281 /** +282 * Standard toString() implementation. +283 * +284 * @return the string representation of the object +285 */ +286 @Override +287 public String toString() { +288 return "Evidence{" + "name=" + name + ", source=" + source + ", value=" + value + ", confidence=" + confidence + '}'; +289 } +290 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/EvidenceCollection.html b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/EvidenceCollection.html index dae4f6ec9..ee30e79a9 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/EvidenceCollection.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/EvidenceCollection.html @@ -32,7 +32,7 @@ 24 import java.util.List; 25 import java.util.Set; 26 import java.util.TreeSet; -27 import org.apache.commons.lang.StringUtils; +27 import org.apache.commons.lang3.StringUtils; 28 import org.owasp.dependencycheck.utils.DependencyVersion; 29 import org.owasp.dependencycheck.utils.DependencyVersionUtil; 30 import org.owasp.dependencycheck.utils.Filter; @@ -48,361 +48,371 @@ 40 public class EvidenceCollection implements Serializable, Iterable<Evidence> { 41 42 /** -43 * The logger. +43 * The serial version UID for serialization. 44 */ -45 private static final Logger LOGGER = LoggerFactory.getLogger(EvidenceCollection.class); +45 private static final long serialVersionUID = 1L; 46 /** -47 * Used to iterate over highest confidence evidence contained in the collection. +47 * The logger. 48 */ -49 private static final Filter<Evidence> HIGHEST_CONFIDENCE = new Filter<Evidence>() { -50 public boolean passes(Evidence evidence) { -51 return evidence.getConfidence() == Confidence.HIGHEST; -52 } -53 }; -54 /** -55 * Used to iterate over high confidence evidence contained in the collection. -56 */ -57 private static final Filter<Evidence> HIGH_CONFIDENCE = new Filter<Evidence>() { -58 public boolean passes(Evidence evidence) { -59 return evidence.getConfidence() == Confidence.HIGH; -60 } -61 }; -62 /** -63 * Used to iterate over medium confidence evidence contained in the collection. -64 */ -65 private static final Filter<Evidence> MEDIUM_CONFIDENCE = new Filter<Evidence>() { -66 public boolean passes(Evidence evidence) { -67 return evidence.getConfidence() == Confidence.MEDIUM; -68 } -69 }; -70 /** -71 * Used to iterate over low confidence evidence contained in the collection. -72 */ -73 private static final Filter<Evidence> LOW_CONFIDENCE = new Filter<Evidence>() { -74 public boolean passes(Evidence evidence) { -75 return evidence.getConfidence() == Confidence.LOW; -76 } -77 }; -78 /** -79 * Used to iterate over evidence that has was used (aka read) from the collection. -80 */ -81 private static final Filter<Evidence> EVIDENCE_USED = new Filter<Evidence>() { +49 private static final Logger LOGGER = LoggerFactory.getLogger(EvidenceCollection.class); +50 /** +51 * Used to iterate over highest confidence evidence contained in the collection. +52 */ +53 private static final Filter<Evidence> HIGHEST_CONFIDENCE = new Filter<Evidence>() { +54 @Override +55 public boolean passes(Evidence evidence) { +56 return evidence.getConfidence() == Confidence.HIGHEST; +57 } +58 }; +59 /** +60 * Used to iterate over high confidence evidence contained in the collection. +61 */ +62 private static final Filter<Evidence> HIGH_CONFIDENCE = new Filter<Evidence>() { +63 @Override +64 public boolean passes(Evidence evidence) { +65 return evidence.getConfidence() == Confidence.HIGH; +66 } +67 }; +68 /** +69 * Used to iterate over medium confidence evidence contained in the collection. +70 */ +71 private static final Filter<Evidence> MEDIUM_CONFIDENCE = new Filter<Evidence>() { +72 @Override +73 public boolean passes(Evidence evidence) { +74 return evidence.getConfidence() == Confidence.MEDIUM; +75 } +76 }; +77 /** +78 * Used to iterate over low confidence evidence contained in the collection. +79 */ +80 private static final Filter<Evidence> LOW_CONFIDENCE = new Filter<Evidence>() { +81 @Override 82 public boolean passes(Evidence evidence) { -83 return evidence.isUsed(); +83 return evidence.getConfidence() == Confidence.LOW; 84 } 85 }; -86 -87 /** -88 * Used to iterate over evidence of the specified confidence. -89 * -90 * @param confidence the confidence level for the evidence to be iterated over. -91 * @return Iterable<Evidence> an iterable collection of evidence -92 */ -93 public final Iterable<Evidence> iterator(Confidence confidence) { -94 if (confidence == Confidence.HIGHEST) { -95 return EvidenceCollection.HIGHEST_CONFIDENCE.filter(this.list); -96 } else if (confidence == Confidence.HIGH) { -97 return EvidenceCollection.HIGH_CONFIDENCE.filter(this.list); -98 } else if (confidence == Confidence.MEDIUM) { -99 return EvidenceCollection.MEDIUM_CONFIDENCE.filter(this.list); -100 } else { -101 return EvidenceCollection.LOW_CONFIDENCE.filter(this.list); -102 } -103 } -104 /** -105 * A collection of evidence. -106 */ -107 private final Set<Evidence> list; -108 /** -109 * A collection of strings used to adjust Lucene's term weighting. -110 */ -111 private final Set<String> weightedStrings; -112 +86 /** +87 * Used to iterate over evidence that has was used (aka read) from the collection. +88 */ +89 private static final Filter<Evidence> EVIDENCE_USED = new Filter<Evidence>() { +90 @Override +91 public boolean passes(Evidence evidence) { +92 return evidence.isUsed(); +93 } +94 }; +95 +96 /** +97 * Used to iterate over evidence of the specified confidence. +98 * +99 * @param confidence the confidence level for the evidence to be iterated over. +100 * @return Iterable<Evidence> an iterable collection of evidence +101 */ +102 public final Iterable<Evidence> iterator(Confidence confidence) { +103 if (confidence == Confidence.HIGHEST) { +104 return EvidenceCollection.HIGHEST_CONFIDENCE.filter(this.list); +105 } else if (confidence == Confidence.HIGH) { +106 return EvidenceCollection.HIGH_CONFIDENCE.filter(this.list); +107 } else if (confidence == Confidence.MEDIUM) { +108 return EvidenceCollection.MEDIUM_CONFIDENCE.filter(this.list); +109 } else { +110 return EvidenceCollection.LOW_CONFIDENCE.filter(this.list); +111 } +112 } 113 /** -114 * Creates a new EvidenceCollection. +114 * A collection of evidence. 115 */ -116 public EvidenceCollection() { -117 list = new TreeSet<Evidence>(); -118 weightedStrings = new HashSet<String>(); -119 } -120 -121 /** -122 * Adds evidence to the collection. -123 * -124 * @param e Evidence. -125 */ -126 public void addEvidence(Evidence e) { -127 list.add(e); +116 private final Set<Evidence> list; +117 /** +118 * A collection of strings used to adjust Lucene's term weighting. +119 */ +120 private final Set<String> weightedStrings; +121 +122 /** +123 * Creates a new EvidenceCollection. +124 */ +125 public EvidenceCollection() { +126 list = new TreeSet<Evidence>(); +127 weightedStrings = new HashSet<String>(); 128 } 129 130 /** -131 * Creates an Evidence object from the parameters and adds the resulting object to the collection. +131 * Adds evidence to the collection. 132 * -133 * @param source the source of the Evidence. -134 * @param name the name of the Evidence. -135 * @param value the value of the Evidence. -136 * @param confidence the confidence of the Evidence. -137 */ -138 public void addEvidence(String source, String name, String value, Confidence confidence) { -139 final Evidence e = new Evidence(source, name, value, confidence); -140 addEvidence(e); -141 } -142 -143 /** -144 * Adds term to the weighting collection. The terms added here are used later to boost the score of other terms. This is a way -145 * of combining evidence from multiple sources to boost the confidence of the given evidence. -146 * -147 * Example: The term 'Apache' is found in the manifest of a JAR and is added to the Collection. When we parse the package -148 * names within the JAR file we may add these package names to the "weighted" strings collection to boost the score in the -149 * Lucene query. That way when we construct the Lucene query we find the term Apache in the collection AND in the weighted -150 * strings; as such, we will boost the confidence of the term Apache. -151 * -152 * @param str to add to the weighting collection. -153 */ -154 public void addWeighting(String str) { -155 weightedStrings.add(str); -156 } -157 -158 /** -159 * Returns a set of Weightings - a list of terms that are believed to be of higher confidence when also found in another -160 * location. -161 * -162 * @return Set<String> -163 */ -164 public Set<String> getWeighting() { -165 return weightedStrings; -166 } -167 -168 /** -169 * Returns the set of evidence. +133 * @param e Evidence. +134 */ +135 public void addEvidence(Evidence e) { +136 list.add(e); +137 } +138 +139 /** +140 * Creates an Evidence object from the parameters and adds the resulting object to the collection. +141 * +142 * @param source the source of the Evidence. +143 * @param name the name of the Evidence. +144 * @param value the value of the Evidence. +145 * @param confidence the confidence of the Evidence. +146 */ +147 public void addEvidence(String source, String name, String value, Confidence confidence) { +148 final Evidence e = new Evidence(source, name, value, confidence); +149 addEvidence(e); +150 } +151 +152 /** +153 * Adds term to the weighting collection. The terms added here are used later to boost the score of other terms. This is a way +154 * of combining evidence from multiple sources to boost the confidence of the given evidence. +155 * +156 * Example: The term 'Apache' is found in the manifest of a JAR and is added to the Collection. When we parse the package +157 * names within the JAR file we may add these package names to the "weighted" strings collection to boost the score in the +158 * Lucene query. That way when we construct the Lucene query we find the term Apache in the collection AND in the weighted +159 * strings; as such, we will boost the confidence of the term Apache. +160 * +161 * @param str to add to the weighting collection. +162 */ +163 public void addWeighting(String str) { +164 weightedStrings.add(str); +165 } +166 +167 /** +168 * Returns a set of Weightings - a list of terms that are believed to be of higher confidence when also found in another +169 * location. 170 * -171 * @return the set of evidence. +171 * @return Set<String> 172 */ -173 public Set<Evidence> getEvidence() { -174 return list; +173 public Set<String> getWeighting() { +174 return weightedStrings; 175 } 176 177 /** -178 * Returns the set of evidence from a given source. +178 * Returns the set of evidence. 179 * -180 * @param source the source of the evidence -181 * @return the set of evidence. -182 */ -183 public Set<Evidence> getEvidence(String source) { -184 if (source == null) { -185 return null; -186 } -187 final Set<Evidence> ret = new HashSet<Evidence>(); -188 for (Evidence e : list) { -189 if (source.equals(e.getSource())) { -190 ret.add(e); -191 } -192 } -193 return ret; -194 } -195 -196 /** -197 * Returns the set of evidence from a given source and name. -198 * -199 * @param source the source of the evidence -200 * @param name the name of the evidence to return -201 * @return the set of evidence. -202 */ -203 public Set<Evidence> getEvidence(String source, String name) { -204 if (source == null || name == null) { -205 return null; -206 } -207 final Set<Evidence> ret = new HashSet<Evidence>(); -208 for (Evidence e : list) { -209 if (source.equals(e.getSource()) && name.equals(e.getName())) { -210 ret.add(e); -211 } -212 } -213 return ret; -214 } -215 -216 /** -217 * Implements the iterator interface for the Evidence Collection. -218 * -219 * @return an Iterator<Evidence>. -220 */ -221 public Iterator<Evidence> iterator() { -222 return list.iterator(); +180 * @return the set of evidence. +181 */ +182 public Set<Evidence> getEvidence() { +183 return list; +184 } +185 +186 /** +187 * Returns the set of evidence from a given source. +188 * +189 * @param source the source of the evidence +190 * @return the set of evidence. +191 */ +192 public Set<Evidence> getEvidence(String source) { +193 if (source == null) { +194 return null; +195 } +196 final Set<Evidence> ret = new HashSet<Evidence>(); +197 for (Evidence e : list) { +198 if (source.equals(e.getSource())) { +199 ret.add(e); +200 } +201 } +202 return ret; +203 } +204 +205 /** +206 * Returns the set of evidence from a given source and name. +207 * +208 * @param source the source of the evidence +209 * @param name the name of the evidence to return +210 * @return the set of evidence. +211 */ +212 public Set<Evidence> getEvidence(String source, String name) { +213 if (source == null || name == null) { +214 return null; +215 } +216 final Set<Evidence> ret = new HashSet<Evidence>(); +217 for (Evidence e : list) { +218 if (source.equals(e.getSource()) && name.equals(e.getName())) { +219 ret.add(e); +220 } +221 } +222 return ret; 223 } 224 225 /** -226 * Used to determine if a given string was used (aka read). +226 * Implements the iterator interface for the Evidence Collection. 227 * -228 * @param text the string to search for. -229 * @return whether or not the string was used. -230 */ -231 public boolean containsUsedString(String text) { -232 if (text == null) { -233 return false; -234 } -235 final String textToTest = text.toLowerCase(); -236 -237 for (Evidence e : EvidenceCollection.EVIDENCE_USED.filter(this)) { -238 //TODO consider changing the regex to only compare alpha-numeric (i.e. strip everything else) -239 final String value = urlCorrection(e.getValue().toLowerCase()).replaceAll("[\\s_-]", ""); -240 if (value.contains(textToTest)) { -241 return true; -242 } -243 } -244 return false; -245 } +228 * @return an Iterator<Evidence>. +229 */ +230 @Override +231 public Iterator<Evidence> iterator() { +232 return list.iterator(); +233 } +234 +235 /** +236 * Used to determine if a given string was used (aka read). +237 * +238 * @param text the string to search for. +239 * @return whether or not the string was used. +240 */ +241 public boolean containsUsedString(String text) { +242 if (text == null) { +243 return false; +244 } +245 final String textToTest = text.toLowerCase(); 246 -247 /** -248 * Used to determine if a given version was used (aka read) from the EvidenceCollection. -249 * -250 * @param version the version to search for within the collected evidence. -251 * @return whether or not the string was used. -252 */ -253 public boolean containsUsedVersion(DependencyVersion version) { -254 if (version == null) { -255 return false; -256 } -257 -258 for (Evidence e : EvidenceCollection.EVIDENCE_USED.filter(this)) { -259 final DependencyVersion value = DependencyVersionUtil.parseVersion(e.getValue()); -260 if (value != null && value.matchesAtLeastThreeLevels(version)) { -261 return true; -262 } -263 } -264 return false; -265 } -266 -267 /** -268 * Returns whether or not the collection contains evidence of a specified Confidence. -269 * -270 * @param confidence A Confidence value. -271 * @return boolean. -272 */ -273 public boolean contains(Confidence confidence) { -274 for (Evidence e : list) { -275 if (e.getConfidence().equals(confidence)) { -276 return true; -277 } -278 } -279 return false; -280 } -281 -282 /** -283 * Merges multiple EvidenceCollections together, only merging evidence that was used, into a new EvidenceCollection. -284 * -285 * @param ec One or more EvidenceCollections. -286 * @return a new EvidenceCollection containing the used evidence. -287 */ -288 public static EvidenceCollection mergeUsed(EvidenceCollection... ec) { -289 final EvidenceCollection ret = new EvidenceCollection(); -290 for (EvidenceCollection col : ec) { -291 for (Evidence e : col.list) { -292 if (e.isUsed()) { -293 ret.addEvidence(e); -294 } -295 } -296 } -297 return ret; -298 } -299 -300 /** -301 * Merges multiple EvidenceCollections together. -302 * -303 * @param ec One or more EvidenceCollections. -304 * @return a new EvidenceCollection. -305 */ -306 public static EvidenceCollection merge(EvidenceCollection... ec) { -307 final EvidenceCollection ret = new EvidenceCollection(); -308 for (EvidenceCollection col : ec) { -309 ret.list.addAll(col.list); -310 ret.weightedStrings.addAll(col.weightedStrings); -311 } -312 return ret; -313 } -314 -315 /** -316 * Merges multiple EvidenceCollections together; flattening all of the evidence items by removing the confidence. -317 * -318 * @param ec One or more EvidenceCollections -319 * @return new set of evidence resulting from merging the evidence in the collections -320 */ -321 public static Set<Evidence> mergeForDisplay(EvidenceCollection... ec) { -322 final Set<Evidence> ret = new TreeSet<Evidence>(); -323 for (EvidenceCollection col : ec) { -324 for (Evidence e : col) { -325 //if (e.isUsed()) { -326 final Evidence newEvidence = new Evidence(e.getSource(), e.getName(), e.getValue(), null); -327 newEvidence.setUsed(true); -328 ret.add(newEvidence); -329 //} -330 } -331 } -332 return ret; -333 } -334 -335 /** -336 * Returns a string of evidence 'values'. -337 * -338 * @return a string containing the evidence. -339 */ -340 @Override -341 public String toString() { -342 final StringBuilder sb = new StringBuilder(); -343 for (Evidence e : this.list) { -344 sb.append(e.getValue()).append(' '); -345 } -346 return sb.toString(); -347 } -348 -349 /** -350 * Returns the number of elements in the EvidenceCollection. -351 * -352 * @return the number of elements in the collection. -353 */ -354 public int size() { -355 return list.size(); -356 } -357 -358 /** -359 * <p> -360 * Takes a string that may contain a fully qualified domain and it will return the string having removed the query string, the -361 * protocol, the sub-domain of 'www', and the file extension of the path.</p> -362 * <p> -363 * This is useful for checking if the evidence contains a specific string. The presence of the protocol, file extension, etc. -364 * may produce false positives. -365 * -366 * <p> -367 * Example, given the following input:</p> -368 * <code>'Please visit https://www.somedomain.com/path1/path2/file.php?id=439'</code> +247 for (Evidence e : EvidenceCollection.EVIDENCE_USED.filter(this)) { +248 //TODO consider changing the regex to only compare alpha-numeric (i.e. strip everything else) +249 final String value = urlCorrection(e.getValue().toLowerCase()).replaceAll("[\\s_-]", ""); +250 if (value.contains(textToTest)) { +251 return true; +252 } +253 } +254 return false; +255 } +256 +257 /** +258 * Used to determine if a given version was used (aka read) from the EvidenceCollection. +259 * +260 * @param version the version to search for within the collected evidence. +261 * @return whether or not the string was used. +262 */ +263 public boolean containsUsedVersion(DependencyVersion version) { +264 if (version == null) { +265 return false; +266 } +267 +268 for (Evidence e : EvidenceCollection.EVIDENCE_USED.filter(this)) { +269 final DependencyVersion value = DependencyVersionUtil.parseVersion(e.getValue()); +270 if (value != null && value.matchesAtLeastThreeLevels(version)) { +271 return true; +272 } +273 } +274 return false; +275 } +276 +277 /** +278 * Returns whether or not the collection contains evidence of a specified Confidence. +279 * +280 * @param confidence A Confidence value. +281 * @return boolean. +282 */ +283 public boolean contains(Confidence confidence) { +284 for (Evidence e : list) { +285 if (e.getConfidence().equals(confidence)) { +286 return true; +287 } +288 } +289 return false; +290 } +291 +292 /** +293 * Merges multiple EvidenceCollections together, only merging evidence that was used, into a new EvidenceCollection. +294 * +295 * @param ec One or more EvidenceCollections. +296 * @return a new EvidenceCollection containing the used evidence. +297 */ +298 public static EvidenceCollection mergeUsed(EvidenceCollection... ec) { +299 final EvidenceCollection ret = new EvidenceCollection(); +300 for (EvidenceCollection col : ec) { +301 for (Evidence e : col.list) { +302 if (e.isUsed()) { +303 ret.addEvidence(e); +304 } +305 } +306 } +307 return ret; +308 } +309 +310 /** +311 * Merges multiple EvidenceCollections together. +312 * +313 * @param ec One or more EvidenceCollections. +314 * @return a new EvidenceCollection. +315 */ +316 public static EvidenceCollection merge(EvidenceCollection... ec) { +317 final EvidenceCollection ret = new EvidenceCollection(); +318 for (EvidenceCollection col : ec) { +319 ret.list.addAll(col.list); +320 ret.weightedStrings.addAll(col.weightedStrings); +321 } +322 return ret; +323 } +324 +325 /** +326 * Merges multiple EvidenceCollections together; flattening all of the evidence items by removing the confidence. +327 * +328 * @param ec One or more EvidenceCollections +329 * @return new set of evidence resulting from merging the evidence in the collections +330 */ +331 public static Set<Evidence> mergeForDisplay(EvidenceCollection... ec) { +332 final Set<Evidence> ret = new TreeSet<Evidence>(); +333 for (EvidenceCollection col : ec) { +334 for (Evidence e : col) { +335 //if (e.isUsed()) { +336 final Evidence newEvidence = new Evidence(e.getSource(), e.getName(), e.getValue(), null); +337 newEvidence.setUsed(true); +338 ret.add(newEvidence); +339 //} +340 } +341 } +342 return ret; +343 } +344 +345 /** +346 * Returns a string of evidence 'values'. +347 * +348 * @return a string containing the evidence. +349 */ +350 @Override +351 public String toString() { +352 final StringBuilder sb = new StringBuilder(); +353 for (Evidence e : this.list) { +354 sb.append(e.getValue()).append(' '); +355 } +356 return sb.toString(); +357 } +358 +359 /** +360 * Returns the number of elements in the EvidenceCollection. +361 * +362 * @return the number of elements in the collection. +363 */ +364 public int size() { +365 return list.size(); +366 } +367 +368 /** 369 * <p> -370 * The function would return:</p> -371 * <code>'Please visit somedomain path1 path2 file'</code> -372 * -373 * @param value the value that may contain a url -374 * @return the modified string -375 */ -376 private String urlCorrection(String value) { -377 if (value == null || !UrlStringUtils.containsUrl(value)) { -378 return value; -379 } -380 final StringBuilder sb = new StringBuilder(value.length()); -381 final String[] parts = value.split("\\s"); -382 for (String part : parts) { -383 if (UrlStringUtils.isUrl(part)) { -384 try { -385 final List<String> data = UrlStringUtils.extractImportantUrlData(part); -386 sb.append(' ').append(StringUtils.join(data, ' ')); -387 } catch (MalformedURLException ex) { -388 LOGGER.debug("error parsing {}", part, ex); -389 sb.append(' ').append(part); -390 } -391 } else { -392 sb.append(' ').append(part); -393 } -394 } -395 return sb.toString().trim(); -396 } -397 } +370 * Takes a string that may contain a fully qualified domain and it will return the string having removed the query string, the +371 * protocol, the sub-domain of 'www', and the file extension of the path.</p> +372 * <p> +373 * This is useful for checking if the evidence contains a specific string. The presence of the protocol, file extension, etc. +374 * may produce false positives. +375 * +376 * <p> +377 * Example, given the following input:</p> +378 * <code>'Please visit https://www.somedomain.com/path1/path2/file.php?id=439'</code> +379 * <p> +380 * The function would return:</p> +381 * <code>'Please visit somedomain path1 path2 file'</code> +382 * +383 * @param value the value that may contain a url +384 * @return the modified string +385 */ +386 private String urlCorrection(String value) { +387 if (value == null || !UrlStringUtils.containsUrl(value)) { +388 return value; +389 } +390 final StringBuilder sb = new StringBuilder(value.length()); +391 final String[] parts = value.split("\\s"); +392 for (String part : parts) { +393 if (UrlStringUtils.isUrl(part)) { +394 try { +395 final List<String> data = UrlStringUtils.extractImportantUrlData(part); +396 sb.append(' ').append(StringUtils.join(data, ' ')); +397 } catch (MalformedURLException ex) { +398 LOGGER.debug("error parsing {}", part, ex); +399 sb.append(' ').append(part); +400 } +401 } else { +402 sb.append(' ').append(part); +403 } +404 } +405 return sb.toString().trim(); +406 } +407 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Identifier.html b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Identifier.html index 0a08004fc..d1a2cc063 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Identifier.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Identifier.html @@ -34,203 +34,209 @@ 26 public class Identifier implements Serializable, Comparable<Identifier> { 27 28 /** -29 * Default constructor. Should only be used for automatic class -30 * creation as is the case with many XML parsers (for the parsing -31 * of the Dependency-Check XML report). For all other use-cases, -32 * please use the non-default constructors. -33 */ -34 public Identifier() { -35 } -36 -37 /** -38 * Constructs a new Identifier with the specified data. -39 * -40 * @param type the identifier type. -41 * @param value the identifier value. -42 * @param url the identifier url. -43 */ -44 public Identifier(String type, String value, String url) { -45 this.type = type; -46 this.value = value; -47 this.url = url; -48 } -49 -50 /** -51 * Constructs a new Identifier with the specified data. -52 * -53 * @param type the identifier type. -54 * @param value the identifier value. -55 * @param url the identifier url. -56 * @param description the description of the identifier. -57 */ -58 public Identifier(String type, String value, String url, String description) { -59 this(type, value, url); -60 this.description = description; -61 } -62 -63 /** -64 * The confidence that this is the correct identifier. -65 */ -66 private Confidence confidence; +29 * The serial version UID for serialization. +30 */ +31 private static final long serialVersionUID = 1L; +32 +33 /** +34 * Default constructor. Should only be used for automatic class +35 * creation as is the case with many XML parsers (for the parsing +36 * of the Dependency-Check XML report). For all other use-cases, +37 * please use the non-default constructors. +38 */ +39 public Identifier() { +40 } +41 +42 /** +43 * Constructs a new Identifier with the specified data. +44 * +45 * @param type the identifier type. +46 * @param value the identifier value. +47 * @param url the identifier url. +48 */ +49 public Identifier(String type, String value, String url) { +50 this.type = type; +51 this.value = value; +52 this.url = url; +53 } +54 +55 /** +56 * Constructs a new Identifier with the specified data. +57 * +58 * @param type the identifier type. +59 * @param value the identifier value. +60 * @param url the identifier url. +61 * @param description the description of the identifier. +62 */ +63 public Identifier(String type, String value, String url, String description) { +64 this(type, value, url); +65 this.description = description; +66 } 67 68 /** -69 * Get the value of confidence. -70 * -71 * @return the value of confidence -72 */ -73 public Confidence getConfidence() { -74 return confidence; -75 } -76 -77 /** -78 * Set the value of confidence. -79 * -80 * @param confidence new value of confidence -81 */ -82 public void setConfidence(Confidence confidence) { -83 this.confidence = confidence; -84 } -85 -86 /** -87 * The value of the identifier -88 */ -89 private String value; +69 * The confidence that this is the correct identifier. +70 */ +71 private Confidence confidence; +72 +73 /** +74 * Get the value of confidence. +75 * +76 * @return the value of confidence +77 */ +78 public Confidence getConfidence() { +79 return confidence; +80 } +81 +82 /** +83 * Set the value of confidence. +84 * +85 * @param confidence new value of confidence +86 */ +87 public void setConfidence(Confidence confidence) { +88 this.confidence = confidence; +89 } 90 91 /** -92 * Get the value of value. -93 * -94 * @return the value of value -95 */ -96 public String getValue() { -97 return value; -98 } -99 -100 /** -101 * Set the value of value. -102 * -103 * @param value new value of value -104 */ -105 public void setValue(String value) { -106 this.value = value; -107 } -108 /** -109 * The url for the identifier. -110 */ -111 private String url; -112 +92 * The value of the identifier +93 */ +94 private String value; +95 +96 /** +97 * Get the value of value. +98 * +99 * @return the value of value +100 */ +101 public String getValue() { +102 return value; +103 } +104 +105 /** +106 * Set the value of value. +107 * +108 * @param value new value of value +109 */ +110 public void setValue(String value) { +111 this.value = value; +112 } 113 /** -114 * Get the value of url. -115 * -116 * @return the value of url -117 */ -118 public String getUrl() { -119 return url; -120 } -121 -122 /** -123 * Set the value of url. -124 * -125 * @param url new value of url -126 */ -127 public void setUrl(String url) { -128 this.url = url; -129 } -130 /** -131 * The type of the identifier. -132 */ -133 private String type; -134 +114 * The url for the identifier. +115 */ +116 private String url; +117 +118 /** +119 * Get the value of url. +120 * +121 * @return the value of url +122 */ +123 public String getUrl() { +124 return url; +125 } +126 +127 /** +128 * Set the value of url. +129 * +130 * @param url new value of url +131 */ +132 public void setUrl(String url) { +133 this.url = url; +134 } 135 /** -136 * Get the value of type. -137 * -138 * @return the value of type -139 */ -140 public String getType() { -141 return type; -142 } -143 -144 /** -145 * <p> -146 * Set the value of type.</p><p> -147 * Example would be "CPE".</p> -148 * -149 * @param type new value of type -150 */ -151 public void setType(String type) { -152 this.type = type; -153 } -154 /** -155 * A description of the identifier. -156 */ -157 private String description; -158 +136 * The type of the identifier. +137 */ +138 private String type; +139 +140 /** +141 * Get the value of type. +142 * +143 * @return the value of type +144 */ +145 public String getType() { +146 return type; +147 } +148 +149 /** +150 * <p> +151 * Set the value of type.</p><p> +152 * Example would be "CPE".</p> +153 * +154 * @param type new value of type +155 */ +156 public void setType(String type) { +157 this.type = type; +158 } 159 /** -160 * Get the value of description. -161 * -162 * @return the value of description -163 */ -164 public String getDescription() { -165 return description; -166 } -167 -168 /** -169 * Set the value of description. -170 * -171 * @param description new value of description -172 */ -173 public void setDescription(String description) { -174 this.description = description; -175 } -176 -177 @Override -178 public boolean equals(Object obj) { -179 if (obj == null) { -180 return false; -181 } -182 if (getClass() != obj.getClass()) { -183 return false; -184 } -185 final Identifier other = (Identifier) obj; -186 if ((this.value == null) ? (other.value != null) : !this.value.equals(other.value)) { -187 return false; -188 } -189 if ((this.type == null) ? (other.type != null) : !this.type.equals(other.type)) { -190 return false; -191 } -192 return true; -193 } -194 -195 @Override -196 public int hashCode() { -197 int hash = 5; -198 hash = 53 * hash + (this.value != null ? this.value.hashCode() : 0); -199 hash = 53 * hash + (this.type != null ? this.type.hashCode() : 0); -200 return hash; -201 } -202 -203 /** -204 * Standard implementation of toString; displays identifier value and type. -205 * -206 * @return a String representation of the object -207 */ -208 @Override -209 public String toString() { -210 return "Identifier{" + "value=" + value + ", type=" + type + '}'; -211 } -212 -213 /** -214 * Implementation of the comparator interface. This compares the value of the identifier only. -215 * -216 * @param o the object being compared -217 * @return an integer indicating the ordering -218 */ -219 public int compareTo(Identifier o) { -220 if (o == null) { -221 return -1; -222 } -223 return this.value.compareTo(o.value); -224 } -225 } +160 * A description of the identifier. +161 */ +162 private String description; +163 +164 /** +165 * Get the value of description. +166 * +167 * @return the value of description +168 */ +169 public String getDescription() { +170 return description; +171 } +172 +173 /** +174 * Set the value of description. +175 * +176 * @param description new value of description +177 */ +178 public void setDescription(String description) { +179 this.description = description; +180 } +181 +182 @Override +183 public boolean equals(Object obj) { +184 if (obj == null) { +185 return false; +186 } +187 if (getClass() != obj.getClass()) { +188 return false; +189 } +190 final Identifier other = (Identifier) obj; +191 if ((this.value == null) ? (other.value != null) : !this.value.equals(other.value)) { +192 return false; +193 } +194 if ((this.type == null) ? (other.type != null) : !this.type.equals(other.type)) { +195 return false; +196 } +197 return true; +198 } +199 +200 @Override +201 public int hashCode() { +202 int hash = 5; +203 hash = 53 * hash + (this.value != null ? this.value.hashCode() : 0); +204 hash = 53 * hash + (this.type != null ? this.type.hashCode() : 0); +205 return hash; +206 } +207 +208 /** +209 * Standard implementation of toString; displays identifier value and type. +210 * +211 * @return a String representation of the object +212 */ +213 @Override +214 public String toString() { +215 return "Identifier{" + "value=" + value + ", type=" + type + '}'; +216 } +217 +218 /** +219 * Implementation of the comparator interface. This compares the value of the identifier only. +220 * +221 * @param o the object being compared +222 * @return an integer indicating the ordering +223 */ +224 @Override +225 public int compareTo(Identifier o) { +226 if (o == null) { +227 return -1; +228 } +229 return this.value.compareTo(o.value); +230 } +231 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Reference.html b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Reference.html index 27c7280db..50ea82037 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Reference.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Reference.html @@ -141,22 +141,23 @@ 133 * @param o the Reference being compared 134 * @return an integer indicating the ordering of the two objects 135 */ -136 public int compareTo(Reference o) { -137 if (source.equals(o.source)) { -138 if (name.equals(o.name)) { -139 if (url.equals(o.url)) { -140 return 0; //they are equal -141 } else { -142 return url.compareTo(o.url); -143 } -144 } else { -145 return name.compareTo(o.name); -146 } -147 } else { -148 return source.compareTo(o.source); -149 } -150 } -151 } +136 @Override +137 public int compareTo(Reference o) { +138 if (source.equals(o.source)) { +139 if (name.equals(o.name)) { +140 if (url.equals(o.url)) { +141 return 0; //they are equal +142 } else { +143 return url.compareTo(o.url); +144 } +145 } else { +146 return name.compareTo(o.name); +147 } +148 } else { +149 return source.compareTo(o.source); +150 } +151 } +152 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Vulnerability.html b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Vulnerability.html index 9f78687d8..7a3f5b49b 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Vulnerability.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/Vulnerability.html @@ -398,58 +398,59 @@ 390 * @return a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than 391 * the specified vulnerability 392 */ -393 public int compareTo(Vulnerability v) { -394 return v.getName().compareTo(this.getName()); -395 } -396 -397 /** -398 * The CPE id that caused this vulnerability to be flagged. -399 */ -400 private String matchedCPE; -401 /** -402 * Whether or not all previous versions were affected. -403 */ -404 private String matchedAllPreviousCPE; -405 -406 /** -407 * Sets the CPE that caused this vulnerability to be flagged. -408 * -409 * @param cpeId a CPE identifier -410 * @param previous a flag indicating whether or not all previous versions were affected (any non-null value is -411 * considered true) -412 */ -413 public void setMatchedCPE(String cpeId, String previous) { -414 matchedCPE = cpeId; -415 matchedAllPreviousCPE = previous; -416 } -417 -418 /** -419 * Get the value of matchedCPE. -420 * -421 * @return the value of matchedCPE -422 */ -423 public String getMatchedCPE() { -424 return matchedCPE; -425 } -426 -427 /** -428 * Get the value of matchedAllPreviousCPE. -429 * -430 * @return the value of matchedAllPreviousCPE -431 */ -432 public String getMatchedAllPreviousCPE() { -433 return matchedAllPreviousCPE; -434 } -435 -436 /** -437 * Determines whether or not matchedAllPreviousCPE has been set. -438 * -439 * @return true if matchedAllPreviousCPE is not null; otherwise false -440 */ -441 public boolean hasMatchedAllPreviousCPE() { -442 return matchedAllPreviousCPE != null; -443 } -444 } +393 @Override +394 public int compareTo(Vulnerability v) { +395 return v.getName().compareTo(this.getName()); +396 } +397 +398 /** +399 * The CPE id that caused this vulnerability to be flagged. +400 */ +401 private String matchedCPE; +402 /** +403 * Whether or not all previous versions were affected. +404 */ +405 private String matchedAllPreviousCPE; +406 +407 /** +408 * Sets the CPE that caused this vulnerability to be flagged. +409 * +410 * @param cpeId a CPE identifier +411 * @param previous a flag indicating whether or not all previous versions were affected (any non-null value is +412 * considered true) +413 */ +414 public void setMatchedCPE(String cpeId, String previous) { +415 matchedCPE = cpeId; +416 matchedAllPreviousCPE = previous; +417 } +418 +419 /** +420 * Get the value of matchedCPE. +421 * +422 * @return the value of matchedCPE +423 */ +424 public String getMatchedCPE() { +425 return matchedCPE; +426 } +427 +428 /** +429 * Get the value of matchedAllPreviousCPE. +430 * +431 * @return the value of matchedAllPreviousCPE +432 */ +433 public String getMatchedAllPreviousCPE() { +434 return matchedAllPreviousCPE; +435 } +436 +437 /** +438 * Determines whether or not matchedAllPreviousCPE has been set. +439 * +440 * @return true if matchedAllPreviousCPE is not null; otherwise false +441 */ +442 public boolean hasMatchedAllPreviousCPE() { +443 return matchedAllPreviousCPE != null; +444 } +445 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/VulnerabilityComparator.html b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/VulnerabilityComparator.html index 609e2282e..b562e1739 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/VulnerabilityComparator.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/VulnerabilityComparator.html @@ -47,10 +47,11 @@ 39 * @param o2 a second vulnerability 40 * @return the comparison 41 */ -42 public int compare(Vulnerability o1, Vulnerability o2) { -43 return o2.getName().compareTo(o1.getName()); -44 } -45 } +42 @Override +43 public int compare(Vulnerability o1, Vulnerability o2) { +44 return o2.getName().compareTo(o1.getName()); +45 } +46 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/package-frame.html index 161182fa5..6ce02afb9 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.dependency + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.dependency diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/package-summary.html index 1a93bcb8b..ac8d55133 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/dependency/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/dependency/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.dependency + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.dependency diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/exception/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/exception/package-frame.html index 9232ebd39..a00b58610 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/exception/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/exception/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.exception + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.exception diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/exception/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/exception/package-summary.html index cb4fd7108..bcef95ed9 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/exception/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/exception/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.exception + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.exception diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/package-frame.html index 262a68ea1..fb64a4d5f 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/package-summary.html index 23d5e3cf8..e1d687cfd 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/reporting/EscapeTool.html b/dependency-check-core/xref/org/owasp/dependencycheck/reporting/EscapeTool.html index fd76fd2b5..7d76642b2 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/reporting/EscapeTool.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/reporting/EscapeTool.html @@ -27,13 +27,13 @@ 19 20 import java.io.UnsupportedEncodingException; 21 import java.net.URLEncoder; -22 import org.apache.commons.lang.StringEscapeUtils; +22 import org.apache.commons.lang3.StringEscapeUtils; 23 import org.slf4j.Logger; 24 import org.slf4j.LoggerFactory; 25 26 /** -27 * An extremely simple wrapper around various escape utils to perform URL and HTML encoding within the reports. This -28 * class was created to simplify the velocity configuration and avoid using the "built-in" escape tool. +27 * An extremely simple wrapper around various escape utils to perform URL and HTML encoding within the reports. This class was +28 * created to simplify the velocity configuration and avoid using the "built-in" escape tool. 29 * 30 * @author Jeremy Long 31 */ @@ -51,35 +51,44 @@ 43 * @return the URL encoded text 44 */ 45 public String url(String text) { -46 try { -47 return URLEncoder.encode(text, "UTF-8"); -48 } catch (UnsupportedEncodingException ex) { -49 LOGGER.warn("UTF-8 is not supported?"); -50 LOGGER.info("", ex); -51 } -52 return ""; -53 } -54 -55 /** -56 * HTML Encodes the provided text. -57 * -58 * @param text the text to encode -59 * @return the HTML encoded text -60 */ -61 public String html(String text) { -62 return StringEscapeUtils.escapeHtml(text); -63 } -64 -65 /** -66 * XML Encodes the provided text. -67 * -68 * @param text the text to encode -69 * @return the XML encoded text -70 */ -71 public String xml(String text) { -72 return StringEscapeUtils.escapeXml(text); -73 } -74 } +46 if (text == null || text.isEmpty()) { +47 return text; +48 } +49 try { +50 return URLEncoder.encode(text, "UTF-8"); +51 } catch (UnsupportedEncodingException ex) { +52 LOGGER.warn("UTF-8 is not supported?"); +53 LOGGER.info("", ex); +54 } +55 return ""; +56 } +57 +58 /** +59 * HTML Encodes the provided text. +60 * +61 * @param text the text to encode +62 * @return the HTML encoded text +63 */ +64 public String html(String text) { +65 if (text == null || text.isEmpty()) { +66 return text; +67 } +68 return StringEscapeUtils.escapeHtml4(text); +69 } +70 +71 /** +72 * XML Encodes the provided text. +73 * +74 * @param text the text to encode +75 * @return the XML encoded text +76 */ +77 public String xml(String text) { +78 if (text == null || text.isEmpty()) { +79 return text; +80 } +81 return StringEscapeUtils.escapeXml11(text); +82 } +83 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/reporting/VelocityLoggerRedirect.html b/dependency-check-core/xref/org/owasp/dependencycheck/reporting/VelocityLoggerRedirect.html index dc2357039..12506ed86 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/reporting/VelocityLoggerRedirect.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/reporting/VelocityLoggerRedirect.html @@ -54,79 +54,83 @@ 46 * 47 * @param rsvc the RuntimeServices 48 */ -49 public void init(RuntimeServices rsvc) { -50 // do nothing -51 } -52 -53 /** -54 * Given a Velocity log level and message, this method will call the appropriate Logger level and log the specified -55 * values. -56 * -57 * @param level the logging level -58 * @param message the message to be logged -59 */ -60 public void log(int level, String message) { -61 switch (level) { -62 case TRACE_ID: -63 LOGGER.trace(message); -64 break; -65 case DEBUG_ID: -66 LOGGER.debug(message); -67 break; -68 case INFO_ID: -69 LOGGER.info(message); -70 break; -71 case WARN_ID: -72 LOGGER.warn(message); -73 break; -74 case ERROR_ID: -75 LOGGER.error(message); -76 break; -77 default: -78 LOGGER.info(message); -79 } -80 } -81 -82 /** -83 * Given a Velocity log level, message and Throwable, this method will call the appropriate Logger level and log the -84 * specified values. -85 * -86 * @param level the logging level -87 * @param message the message to be logged -88 * @param t a throwable to log -89 */ -90 public void log(int level, String message, Throwable t) { -91 switch (level) { -92 case TRACE_ID: -93 LOGGER.trace(message, t); -94 break; -95 case DEBUG_ID: -96 LOGGER.debug(message, t); +49 @Override +50 public void init(RuntimeServices rsvc) { +51 // do nothing +52 } +53 +54 /** +55 * Given a Velocity log level and message, this method will call the appropriate Logger level and log the specified +56 * values. +57 * +58 * @param level the logging level +59 * @param message the message to be logged +60 */ +61 @Override +62 public void log(int level, String message) { +63 switch (level) { +64 case TRACE_ID: +65 LOGGER.trace(message); +66 break; +67 case DEBUG_ID: +68 LOGGER.debug(message); +69 break; +70 case INFO_ID: +71 LOGGER.info(message); +72 break; +73 case WARN_ID: +74 LOGGER.warn(message); +75 break; +76 case ERROR_ID: +77 LOGGER.error(message); +78 break; +79 default: +80 LOGGER.info(message); +81 } +82 } +83 +84 /** +85 * Given a Velocity log level, message and Throwable, this method will call the appropriate Logger level and log the +86 * specified values. +87 * +88 * @param level the logging level +89 * @param message the message to be logged +90 * @param t a throwable to log +91 */ +92 @Override +93 public void log(int level, String message, Throwable t) { +94 switch (level) { +95 case TRACE_ID: +96 LOGGER.trace(message, t); 97 break; -98 case INFO_ID: -99 LOGGER.info(message, t); +98 case DEBUG_ID: +99 LOGGER.debug(message, t); 100 break; -101 case WARN_ID: -102 LOGGER.warn(message, t); +101 case INFO_ID: +102 LOGGER.info(message, t); 103 break; -104 case ERROR_ID: -105 LOGGER.error(message, t); +104 case WARN_ID: +105 LOGGER.warn(message, t); 106 break; -107 default: -108 LOGGER.info(message, t); -109 } -110 } -111 -112 /** -113 * Will always return true. The property file will decide what level to log. -114 * -115 * @param level the logging level -116 * @return true -117 */ -118 public boolean isLevelEnabled(int level) { -119 return true; -120 } -121 } +107 case ERROR_ID: +108 LOGGER.error(message, t); +109 break; +110 default: +111 LOGGER.info(message, t); +112 } +113 } +114 +115 /** +116 * Will always return true. The property file will decide what level to log. +117 * +118 * @param level the logging level +119 * @return true +120 */ +121 @Override +122 public boolean isLevelEnabled(int level) { +123 return true; +124 } +125 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/reporting/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/reporting/package-frame.html index a041caa9b..7d4dff937 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/reporting/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/reporting/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.reporting + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.reporting diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/reporting/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/reporting/package-summary.html index c50b9a962..603d92cec 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/reporting/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/reporting/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.reporting + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.reporting diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/suppression/SuppressionHandler.html b/dependency-check-core/xref/org/owasp/dependencycheck/suppression/SuppressionHandler.html index 938e3d269..e4d76853a 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/suppression/SuppressionHandler.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/suppression/SuppressionHandler.html @@ -94,7 +94,7 @@ 86 /** 87 * The current node text being extracted from the element. 88 */ -89 private StringBuffer currentText; +89 private StringBuilder currentText; 90 91 /** 92 * Handles the start element event. @@ -108,7 +108,7 @@ 100 @Override 101 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 102 currentAttributes = attributes; -103 currentText = new StringBuffer(); +103 currentText = new StringBuilder(); 104 if (SUPPRESS.equals(qName)) { 105 rule = new SuppressionRule(); 106 final String base = currentAttributes.getValue("base"); diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/suppression/SuppressionParseException.html b/dependency-check-core/xref/org/owasp/dependencycheck/suppression/SuppressionParseException.html index f83e71e36..e07c99ec8 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/suppression/SuppressionParseException.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/suppression/SuppressionParseException.html @@ -35,40 +35,45 @@ 27 public class SuppressionParseException extends IOException { 28 29 /** -30 * Creates a new SuppressionParseException. +30 * The serial version UID for serialization. 31 */ -32 public SuppressionParseException() { -33 super(); -34 } -35 -36 /** -37 * Creates a new SuppressionParseException. -38 * -39 * @param msg a message for the exception. -40 */ -41 public SuppressionParseException(String msg) { -42 super(msg); -43 } -44 -45 /** -46 * Creates a new SuppressionParseException. -47 * -48 * @param ex the cause of the parse exception -49 */ -50 public SuppressionParseException(Throwable ex) { -51 super(ex); -52 } -53 -54 /** -55 * Creates a new SuppressionParseException. -56 * -57 * @param msg a message for the exception. -58 * @param ex the cause of the parse exception -59 */ -60 public SuppressionParseException(String msg, Throwable ex) { -61 super(msg, ex); -62 } -63 } +32 private static final long serialVersionUID = 1L; +33 +34 /** +35 * Creates a new SuppressionParseException. +36 */ +37 public SuppressionParseException() { +38 super(); +39 } +40 +41 /** +42 * Creates a new SuppressionParseException. +43 * +44 * @param msg a message for the exception. +45 */ +46 public SuppressionParseException(String msg) { +47 super(msg); +48 } +49 +50 /** +51 * Creates a new SuppressionParseException. +52 * +53 * @param ex the cause of the parse exception +54 */ +55 public SuppressionParseException(Throwable ex) { +56 super(ex); +57 } +58 +59 /** +60 * Creates a new SuppressionParseException. +61 * +62 * @param msg a message for the exception. +63 * @param ex the cause of the parse exception +64 */ +65 public SuppressionParseException(String msg, Throwable ex) { +66 super(msg, ex); +67 } +68 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/suppression/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/suppression/package-frame.html index eec5b0d52..8c8e31a2f 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/suppression/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/suppression/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.suppression + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.suppression diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/suppression/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/suppression/package-summary.html index 7563f2d13..55f2751c8 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/suppression/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/suppression/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.suppression + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.suppression diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/utils/DependencyVersion.html b/dependency-check-core/xref/org/owasp/dependencycheck/utils/DependencyVersion.html index 42974ba61..ecda6b9a0 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/utils/DependencyVersion.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/utils/DependencyVersion.html @@ -30,7 +30,7 @@ 22 import java.util.List; 23 import java.util.regex.Matcher; 24 import java.util.regex.Pattern; -25 import org.apache.commons.lang.StringUtils; +25 import org.apache.commons.lang3.StringUtils; 26 27 /** 28 * <p> @@ -45,7 +45,7 @@ 37 * 38 * @author Jeremy Long 39 */ -40 public class DependencyVersion implements Iterable, Comparable<DependencyVersion> { +40 public class DependencyVersion implements Iterable<String>, Comparable<DependencyVersion> { 41 42 /** 43 * Constructor for a empty DependencyVersion. @@ -111,158 +111,159 @@ 103 * 104 * @return an iterator for the version parts 105 */ -106 public Iterator iterator() { -107 return versionParts.iterator(); -108 } -109 -110 /** -111 * Reconstructs the version string from the split version parts. -112 * -113 * @return a string representing the version. -114 */ -115 @Override -116 public String toString() { -117 return StringUtils.join(versionParts.toArray(), "."); -118 } -119 -120 /** -121 * Compares the equality of this object to the one passed in as a parameter. -122 * -123 * @param obj the object to compare equality -124 * @return returns true only if the two objects are equal, otherwise false -125 */ -126 @Override -127 public boolean equals(Object obj) { -128 if (obj == null) { -129 return false; -130 } -131 if (getClass() != obj.getClass()) { -132 return false; -133 } -134 final DependencyVersion other = (DependencyVersion) obj; -135 final int max = (this.versionParts.size() < other.versionParts.size()) -136 ? this.versionParts.size() : other.versionParts.size(); -137 //TODO steal better version of code from compareTo -138 for (int i = 0; i < max; i++) { -139 final String thisPart = this.versionParts.get(i); -140 final String otherPart = other.versionParts.get(i); -141 if (!thisPart.equals(otherPart)) { -142 return false; -143 } -144 } -145 if (this.versionParts.size() > max) { -146 for (int i = max; i < this.versionParts.size(); i++) { -147 if (!"0".equals(this.versionParts.get(i))) { -148 return false; -149 } -150 } -151 } -152 -153 if (other.versionParts.size() > max) { -154 for (int i = max; i < other.versionParts.size(); i++) { -155 if (!"0".equals(other.versionParts.get(i))) { -156 return false; -157 } -158 } -159 } -160 -161 /* -162 * if (this.versionParts != other.versionParts && (this.versionParts == null || !this.versionParts.equals(other.versionParts))) { -163 * return false; -164 * } -165 */ -166 return true; -167 } -168 -169 /** -170 * Calculates the hashCode for this object. -171 * -172 * @return the hashCode -173 */ -174 @Override -175 public int hashCode() { -176 int hash = 5; -177 hash = 71 * hash + (this.versionParts != null ? this.versionParts.hashCode() : 0); -178 return hash; -179 } -180 -181 /** -182 * Determines if the three most major major version parts are identical. For instances, if version 1.2.3.4 was -183 * compared to 1.2.3 this function would return true. -184 * -185 * @param version the version number to compare -186 * @return true if the first three major parts of the version are identical -187 */ -188 public boolean matchesAtLeastThreeLevels(DependencyVersion version) { -189 if (version == null) { -190 return false; -191 } -192 if (Math.abs(this.versionParts.size() - version.versionParts.size()) >= 3) { -193 return false; -194 } -195 -196 final int max = (this.versionParts.size() < version.versionParts.size()) -197 ? this.versionParts.size() : version.versionParts.size(); -198 -199 boolean ret = true; -200 for (int i = 0; i < max; i++) { -201 final String thisVersion = this.versionParts.get(i); -202 final String otherVersion = version.getVersionParts().get(i); -203 if (i >= 3) { -204 if (thisVersion.compareToIgnoreCase(otherVersion) >= 0) { -205 ret = false; -206 break; -207 } -208 } else if (!thisVersion.equals(otherVersion)) { -209 ret = false; -210 break; -211 } -212 } -213 -214 return ret; -215 } -216 -217 @Override -218 public int compareTo(DependencyVersion version) { -219 if (version == null) { -220 return 1; -221 } -222 final List<String> left = this.getVersionParts(); -223 final List<String> right = version.getVersionParts(); -224 final int max = left.size() < right.size() ? left.size() : right.size(); -225 -226 for (int i = 0; i < max; i++) { -227 final String lStr = left.get(i); -228 final String rStr = right.get(i); -229 if (lStr.equals(rStr)) { -230 continue; -231 } -232 try { -233 final int l = Integer.parseInt(lStr); -234 final int r = Integer.parseInt(rStr); -235 if (l < r) { -236 return -1; -237 } else if (l > r) { -238 return 1; -239 } -240 } catch (NumberFormatException ex) { -241 final int comp = left.get(i).compareTo(right.get(i)); -242 if (comp < 0) { -243 return -1; -244 } else if (comp > 0) { -245 return 1; -246 } -247 } -248 } -249 if (left.size() < right.size()) { -250 return -1; -251 } else if (left.size() > right.size()) { -252 return 1; -253 } else { -254 return 0; -255 } -256 } -257 } +106 @Override +107 public Iterator<String> iterator() { +108 return versionParts.iterator(); +109 } +110 +111 /** +112 * Reconstructs the version string from the split version parts. +113 * +114 * @return a string representing the version. +115 */ +116 @Override +117 public String toString() { +118 return StringUtils.join(versionParts.toArray(), "."); +119 } +120 +121 /** +122 * Compares the equality of this object to the one passed in as a parameter. +123 * +124 * @param obj the object to compare equality +125 * @return returns true only if the two objects are equal, otherwise false +126 */ +127 @Override +128 public boolean equals(Object obj) { +129 if (obj == null) { +130 return false; +131 } +132 if (getClass() != obj.getClass()) { +133 return false; +134 } +135 final DependencyVersion other = (DependencyVersion) obj; +136 final int max = (this.versionParts.size() < other.versionParts.size()) +137 ? this.versionParts.size() : other.versionParts.size(); +138 //TODO steal better version of code from compareTo +139 for (int i = 0; i < max; i++) { +140 final String thisPart = this.versionParts.get(i); +141 final String otherPart = other.versionParts.get(i); +142 if (!thisPart.equals(otherPart)) { +143 return false; +144 } +145 } +146 if (this.versionParts.size() > max) { +147 for (int i = max; i < this.versionParts.size(); i++) { +148 if (!"0".equals(this.versionParts.get(i))) { +149 return false; +150 } +151 } +152 } +153 +154 if (other.versionParts.size() > max) { +155 for (int i = max; i < other.versionParts.size(); i++) { +156 if (!"0".equals(other.versionParts.get(i))) { +157 return false; +158 } +159 } +160 } +161 +162 /* +163 * if (this.versionParts != other.versionParts && (this.versionParts == null || !this.versionParts.equals(other.versionParts))) { +164 * return false; +165 * } +166 */ +167 return true; +168 } +169 +170 /** +171 * Calculates the hashCode for this object. +172 * +173 * @return the hashCode +174 */ +175 @Override +176 public int hashCode() { +177 int hash = 5; +178 hash = 71 * hash + (this.versionParts != null ? this.versionParts.hashCode() : 0); +179 return hash; +180 } +181 +182 /** +183 * Determines if the three most major major version parts are identical. For instances, if version 1.2.3.4 was +184 * compared to 1.2.3 this function would return true. +185 * +186 * @param version the version number to compare +187 * @return true if the first three major parts of the version are identical +188 */ +189 public boolean matchesAtLeastThreeLevels(DependencyVersion version) { +190 if (version == null) { +191 return false; +192 } +193 if (Math.abs(this.versionParts.size() - version.versionParts.size()) >= 3) { +194 return false; +195 } +196 +197 final int max = (this.versionParts.size() < version.versionParts.size()) +198 ? this.versionParts.size() : version.versionParts.size(); +199 +200 boolean ret = true; +201 for (int i = 0; i < max; i++) { +202 final String thisVersion = this.versionParts.get(i); +203 final String otherVersion = version.getVersionParts().get(i); +204 if (i >= 3) { +205 if (thisVersion.compareToIgnoreCase(otherVersion) >= 0) { +206 ret = false; +207 break; +208 } +209 } else if (!thisVersion.equals(otherVersion)) { +210 ret = false; +211 break; +212 } +213 } +214 +215 return ret; +216 } +217 +218 @Override +219 public int compareTo(DependencyVersion version) { +220 if (version == null) { +221 return 1; +222 } +223 final List<String> left = this.getVersionParts(); +224 final List<String> right = version.getVersionParts(); +225 final int max = left.size() < right.size() ? left.size() : right.size(); +226 +227 for (int i = 0; i < max; i++) { +228 final String lStr = left.get(i); +229 final String rStr = right.get(i); +230 if (lStr.equals(rStr)) { +231 continue; +232 } +233 try { +234 final int l = Integer.parseInt(lStr); +235 final int r = Integer.parseInt(rStr); +236 if (l < r) { +237 return -1; +238 } else if (l > r) { +239 return 1; +240 } +241 } catch (NumberFormatException ex) { +242 final int comp = left.get(i).compareTo(right.get(i)); +243 if (comp < 0) { +244 return -1; +245 } else if (comp > 0) { +246 return 1; +247 } +248 } +249 } +250 if (left.size() < right.size()) { +251 return -1; +252 } else if (left.size() > right.size()) { +253 return 1; +254 } else { +255 return 0; +256 } +257 } +258 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/utils/ExtractionUtil.html b/dependency-check-core/xref/org/owasp/dependencycheck/utils/ExtractionUtil.html index 8f70102b7..93a6a362d 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/utils/ExtractionUtil.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/utils/ExtractionUtil.html @@ -26,289 +26,262 @@ 18 package org.owasp.dependencycheck.utils; 19 20 import java.io.BufferedInputStream; -21 import java.io.BufferedOutputStream; -22 import java.io.Closeable; -23 import java.io.File; -24 import java.io.FileInputStream; -25 import java.io.FileNotFoundException; -26 import java.io.FileOutputStream; -27 import java.io.FilenameFilter; -28 import java.io.IOException; -29 import java.io.InputStream; -30 import java.util.zip.ZipEntry; -31 import java.util.zip.ZipInputStream; -32 -33 import org.apache.commons.compress.archivers.ArchiveEntry; -34 import org.apache.commons.compress.archivers.ArchiveInputStream; -35 import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; -36 import org.owasp.dependencycheck.Engine; -37 import org.owasp.dependencycheck.analyzer.exception.AnalysisException; -38 import org.owasp.dependencycheck.analyzer.exception.ArchiveExtractionException; -39 import org.slf4j.Logger; -40 import org.slf4j.LoggerFactory; -41 -42 /** -43 * Set of utilities to extract files from archives. -44 * -45 * @author Jeremy Long -46 */ -47 public final class ExtractionUtil { -48 -49 /** -50 * The logger. -51 */ -52 private static final Logger LOGGER = LoggerFactory.getLogger(ExtractionUtil.class); +21 import java.io.Closeable; +22 import java.io.File; +23 import java.io.FileInputStream; +24 import java.io.FileNotFoundException; +25 import java.io.FileOutputStream; +26 import java.io.FilenameFilter; +27 import java.io.IOException; +28 import java.util.zip.ZipEntry; +29 import java.util.zip.ZipInputStream; +30 +31 import org.apache.commons.compress.archivers.ArchiveEntry; +32 import org.apache.commons.compress.archivers.ArchiveInputStream; +33 import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; +34 import org.apache.commons.compress.utils.IOUtils; +35 import org.owasp.dependencycheck.Engine; +36 import org.owasp.dependencycheck.analyzer.exception.AnalysisException; +37 import org.owasp.dependencycheck.analyzer.exception.ArchiveExtractionException; +38 import org.slf4j.Logger; +39 import org.slf4j.LoggerFactory; +40 +41 /** +42 * Set of utilities to extract files from archives. +43 * +44 * @author Jeremy Long +45 */ +46 public final class ExtractionUtil { +47 +48 /** +49 * The logger. +50 */ +51 private static final Logger LOGGER = LoggerFactory.getLogger(ExtractionUtil.class); +52 53 /** -54 * The buffer size to use when extracting files from the archive. +54 * Private constructor for a utility class. 55 */ -56 private static final int BUFFER_SIZE = 4096; -57 -58 /** -59 * Private constructor for a utility class. -60 */ -61 private ExtractionUtil() { -62 } -63 -64 /** -65 * Extracts the contents of an archive into the specified directory. -66 * -67 * @param archive an archive file such as a WAR or EAR -68 * @param extractTo a directory to extract the contents to -69 * @throws ExtractionException thrown if an exception occurs while extracting the files -70 */ -71 public static void extractFiles(File archive, File extractTo) throws ExtractionException { -72 extractFiles(archive, extractTo, null); -73 } -74 -75 /** -76 * Extracts the contents of an archive into the specified directory. The files are only extracted if they are supported by the -77 * analyzers loaded into the specified engine. If the engine is specified as null then all files are extracted. -78 * -79 * @param archive an archive file such as a WAR or EAR -80 * @param extractTo a directory to extract the contents to -81 * @param engine the scanning engine -82 * @throws ExtractionException thrown if there is an error extracting the files -83 */ -84 public static void extractFiles(File archive, File extractTo, Engine engine) throws ExtractionException { -85 if (archive == null || extractTo == null) { -86 return; -87 } -88 -89 FileInputStream fis = null; -90 ZipInputStream zis = null; -91 -92 try { -93 fis = new FileInputStream(archive); -94 } catch (FileNotFoundException ex) { -95 LOGGER.debug("", ex); -96 throw new ExtractionException("Archive file was not found.", ex); -97 } -98 zis = new ZipInputStream(new BufferedInputStream(fis)); -99 ZipEntry entry; -100 try { -101 while ((entry = zis.getNextEntry()) != null) { -102 if (entry.isDirectory()) { -103 final File d = new File(extractTo, entry.getName()); -104 if (!d.exists() && !d.mkdirs()) { -105 final String msg = String.format("Unable to create '%s'.", d.getAbsolutePath()); -106 throw new ExtractionException(msg); -107 } -108 } else { -109 final File file = new File(extractTo, entry.getName()); -110 if (engine == null || engine.accept(file)) { -111 BufferedOutputStream bos = null; -112 FileOutputStream fos; -113 try { -114 fos = new FileOutputStream(file); -115 bos = new BufferedOutputStream(fos, BUFFER_SIZE); -116 transferUsingBuffer(zis, bos); -117 } catch (FileNotFoundException ex) { -118 LOGGER.debug("", ex); -119 final String msg = String.format("Unable to find file '%s'.", file.getName()); -120 throw new ExtractionException(msg, ex); -121 } catch (IOException ex) { -122 LOGGER.debug("", ex); -123 final String msg = String.format("IO Exception while parsing file '%s'.", file.getName()); -124 throw new ExtractionException(msg, ex); -125 } finally { -126 closeStream(bos); -127 } -128 } -129 } -130 } -131 } catch (IOException ex) { -132 final String msg = String.format("Exception reading archive '%s'.", archive.getName()); -133 LOGGER.debug("", ex); -134 throw new ExtractionException(msg, ex); -135 } finally { -136 closeStream(zis); -137 } -138 } -139 -140 /** -141 * Extracts the contents of an archive into the specified directory. -142 * -143 * @param archive an archive file such as a WAR or EAR -144 * @param destination a directory to extract the contents to -145 * @param filter determines which files get extracted -146 * @throws ExtractionException thrown if the archive is not found -147 */ -148 public static void extractFilesUsingFilter(File archive, File destination, -149 FilenameFilter filter) throws ExtractionException { -150 if (archive == null || destination == null) { -151 return; -152 } -153 -154 FileInputStream fis = null; -155 try { -156 fis = new FileInputStream(archive); -157 } catch (FileNotFoundException ex) { -158 LOGGER.debug("", ex); -159 throw new ExtractionException("Archive file was not found.", ex); -160 } -161 try { -162 extractArchive(new ZipArchiveInputStream(new BufferedInputStream( -163 fis)), destination, filter); -164 } catch (ArchiveExtractionException ex) { -165 LOGGER.warn("Exception extracting archive '{}'.", archive.getName()); -166 LOGGER.debug("", ex); -167 } finally { -168 try { -169 fis.close(); -170 } catch (IOException ex) { -171 LOGGER.debug("", ex); -172 } -173 } -174 } -175 -176 /** -177 * Extracts files from an archive. -178 * -179 * @param input the archive to extract files from -180 * @param destination the location to write the files too -181 * @param filter determines which files get extracted -182 * @throws ArchiveExtractionException thrown if there is an exception extracting files from the archive -183 */ -184 private static void extractArchive(ArchiveInputStream input, -185 File destination, FilenameFilter filter) -186 throws ArchiveExtractionException { -187 ArchiveEntry entry; -188 try { -189 while ((entry = input.getNextEntry()) != null) { -190 if (entry.isDirectory()) { -191 final File dir = new File(destination, entry.getName()); -192 if (!dir.exists()) { -193 if (!dir.mkdirs()) { -194 final String msg = String.format( -195 "Unable to create directory '%s'.", -196 dir.getAbsolutePath()); -197 throw new AnalysisException(msg); -198 } -199 } -200 } else { -201 extractFile(input, destination, filter, entry); -202 } -203 } -204 } catch (IOException ex) { -205 throw new ArchiveExtractionException(ex); -206 } catch (Throwable ex) { -207 throw new ArchiveExtractionException(ex); -208 } finally { -209 closeStream(input); -210 } -211 } -212 -213 /** -214 * Extracts a file from an archive (input stream) and correctly builds the directory structure. -215 * -216 * @param input the archive input stream -217 * @param destination where to write the file -218 * @param filter the file filter to apply to the files being extracted -219 * @param entry the entry from the archive to extract -220 * @throws ExtractionException thrown if there is an error reading from the archive stream -221 */ -222 private static void extractFile(ArchiveInputStream input, File destination, -223 FilenameFilter filter, ArchiveEntry entry) throws ExtractionException { -224 final File file = new File(destination, entry.getName()); -225 if (filter.accept(file.getParentFile(), file.getName())) { -226 LOGGER.debug("Extracting '{}'", -227 file.getPath()); -228 BufferedOutputStream bos = null; -229 FileOutputStream fos = null; -230 try { -231 createParentFile(file); -232 fos = new FileOutputStream(file); -233 bos = new BufferedOutputStream(fos, BUFFER_SIZE); -234 transferUsingBuffer(input, bos); -235 } catch (FileNotFoundException ex) { -236 LOGGER.debug("", ex); -237 final String msg = String.format("Unable to find file '%s'.", -238 file.getName()); -239 throw new ExtractionException(msg, ex); -240 } catch (IOException ex) { -241 LOGGER.debug("", ex); -242 final String msg = String -243 .format("IO Exception while parsing file '%s'.", -244 file.getName()); -245 throw new ExtractionException(msg, ex); -246 } finally { -247 closeStream(bos); -248 closeStream(fos); -249 } -250 } -251 } -252 -253 /** -254 * Transfers data from one stream to another using a buffer. -255 * -256 * @param input the input stream -257 * @param bos the output stream -258 * @throws IOException thrown if there is an error reading/writing to the streams -259 */ -260 private static void transferUsingBuffer(InputStream input, -261 BufferedOutputStream bos) throws IOException { -262 int count; -263 final byte[] data = new byte[BUFFER_SIZE]; -264 while ((count = input.read(data, 0, BUFFER_SIZE)) != -1) { -265 bos.write(data, 0, count); -266 } -267 bos.flush(); -268 } -269 -270 /** -271 * Closes the stream. -272 * -273 * @param stream the stream to close -274 */ -275 private static void closeStream(Closeable stream) { -276 if (stream != null) { -277 try { -278 stream.close(); -279 } catch (IOException ex) { -280 LOGGER.trace("", ex); -281 } -282 } -283 } -284 -285 /** -286 * Ensures the parent path is correctly created on disk so that the file can be extracted to the correct location. -287 * -288 * @param file the file path -289 * @throws ExtractionException thrown if the parent paths could not be created -290 */ -291 private static void createParentFile(final File file) -292 throws ExtractionException { -293 final File parent = file.getParentFile(); -294 if (!parent.isDirectory()) { -295 if (!parent.mkdirs()) { -296 final String msg = String.format( -297 "Unable to build directory '%s'.", -298 parent.getAbsolutePath()); -299 throw new ExtractionException(msg); -300 } -301 } -302 } -303 } +56 private ExtractionUtil() { +57 } +58 +59 /** +60 * Extracts the contents of an archive into the specified directory. +61 * +62 * @param archive an archive file such as a WAR or EAR +63 * @param extractTo a directory to extract the contents to +64 * @throws ExtractionException thrown if an exception occurs while extracting the files +65 */ +66 public static void extractFiles(File archive, File extractTo) throws ExtractionException { +67 extractFiles(archive, extractTo, null); +68 } +69 +70 /** +71 * Extracts the contents of an archive into the specified directory. The files are only extracted if they are supported by the +72 * analyzers loaded into the specified engine. If the engine is specified as null then all files are extracted. +73 * +74 * @param archive an archive file such as a WAR or EAR +75 * @param extractTo a directory to extract the contents to +76 * @param engine the scanning engine +77 * @throws ExtractionException thrown if there is an error extracting the files +78 */ +79 public static void extractFiles(File archive, File extractTo, Engine engine) throws ExtractionException { +80 if (archive == null || extractTo == null) { +81 return; +82 } +83 +84 FileInputStream fis = null; +85 ZipInputStream zis = null; +86 +87 try { +88 fis = new FileInputStream(archive); +89 } catch (FileNotFoundException ex) { +90 LOGGER.debug("", ex); +91 throw new ExtractionException("Archive file was not found.", ex); +92 } +93 zis = new ZipInputStream(new BufferedInputStream(fis)); +94 ZipEntry entry; +95 try { +96 while ((entry = zis.getNextEntry()) != null) { +97 if (entry.isDirectory()) { +98 final File d = new File(extractTo, entry.getName()); +99 if (!d.exists() && !d.mkdirs()) { +100 final String msg = String.format("Unable to create '%s'.", d.getAbsolutePath()); +101 throw new ExtractionException(msg); +102 } +103 } else { +104 final File file = new File(extractTo, entry.getName()); +105 if (engine == null || engine.accept(file)) { +106 FileOutputStream fos = null; +107 try { +108 fos = new FileOutputStream(file); +109 IOUtils.copy(zis, fos); +110 } catch (FileNotFoundException ex) { +111 LOGGER.debug("", ex); +112 final String msg = String.format("Unable to find file '%s'.", file.getName()); +113 throw new ExtractionException(msg, ex); +114 } catch (IOException ex) { +115 LOGGER.debug("", ex); +116 final String msg = String.format("IO Exception while parsing file '%s'.", file.getName()); +117 throw new ExtractionException(msg, ex); +118 } finally { +119 closeStream(fos); +120 } +121 } +122 } +123 } +124 } catch (IOException ex) { +125 final String msg = String.format("Exception reading archive '%s'.", archive.getName()); +126 LOGGER.debug("", ex); +127 throw new ExtractionException(msg, ex); +128 } finally { +129 closeStream(zis); +130 } +131 } +132 +133 /** +134 * Extracts the contents of an archive into the specified directory. +135 * +136 * @param archive an archive file such as a WAR or EAR +137 * @param destination a directory to extract the contents to +138 * @param filter determines which files get extracted +139 * @throws ExtractionException thrown if the archive is not found +140 */ +141 public static void extractFilesUsingFilter(File archive, File destination, +142 FilenameFilter filter) throws ExtractionException { +143 if (archive == null || destination == null) { +144 return; +145 } +146 +147 FileInputStream fis = null; +148 try { +149 fis = new FileInputStream(archive); +150 } catch (FileNotFoundException ex) { +151 LOGGER.debug("", ex); +152 throw new ExtractionException("Archive file was not found.", ex); +153 } +154 try { +155 extractArchive(new ZipArchiveInputStream(new BufferedInputStream( +156 fis)), destination, filter); +157 } catch (ArchiveExtractionException ex) { +158 LOGGER.warn("Exception extracting archive '{}'.", archive.getName()); +159 LOGGER.debug("", ex); +160 } finally { +161 try { +162 fis.close(); +163 } catch (IOException ex) { +164 LOGGER.debug("", ex); +165 } +166 } +167 } +168 +169 /** +170 * Extracts files from an archive. +171 * +172 * @param input the archive to extract files from +173 * @param destination the location to write the files too +174 * @param filter determines which files get extracted +175 * @throws ArchiveExtractionException thrown if there is an exception extracting files from the archive +176 */ +177 private static void extractArchive(ArchiveInputStream input, +178 File destination, FilenameFilter filter) +179 throws ArchiveExtractionException { +180 ArchiveEntry entry; +181 try { +182 while ((entry = input.getNextEntry()) != null) { +183 if (entry.isDirectory()) { +184 final File dir = new File(destination, entry.getName()); +185 if (!dir.exists()) { +186 if (!dir.mkdirs()) { +187 final String msg = String.format( +188 "Unable to create directory '%s'.", +189 dir.getAbsolutePath()); +190 throw new AnalysisException(msg); +191 } +192 } +193 } else { +194 extractFile(input, destination, filter, entry); +195 } +196 } +197 } catch (IOException ex) { +198 throw new ArchiveExtractionException(ex); +199 } catch (Throwable ex) { +200 throw new ArchiveExtractionException(ex); +201 } finally { +202 closeStream(input); +203 } +204 } +205 +206 /** +207 * Extracts a file from an archive (input stream) and correctly builds the directory structure. +208 * +209 * @param input the archive input stream +210 * @param destination where to write the file +211 * @param filter the file filter to apply to the files being extracted +212 * @param entry the entry from the archive to extract +213 * @throws ExtractionException thrown if there is an error reading from the archive stream +214 */ +215 private static void extractFile(ArchiveInputStream input, File destination, +216 FilenameFilter filter, ArchiveEntry entry) throws ExtractionException { +217 final File file = new File(destination, entry.getName()); +218 if (filter.accept(file.getParentFile(), file.getName())) { +219 LOGGER.debug("Extracting '{}'", +220 file.getPath()); +221 FileOutputStream fos = null; +222 try { +223 createParentFile(file); +224 fos = new FileOutputStream(file); +225 IOUtils.copy(input, fos); +226 } catch (FileNotFoundException ex) { +227 LOGGER.debug("", ex); +228 final String msg = String.format("Unable to find file '%s'.", +229 file.getName()); +230 throw new ExtractionException(msg, ex); +231 } catch (IOException ex) { +232 LOGGER.debug("", ex); +233 final String msg = String +234 .format("IO Exception while parsing file '%s'.", +235 file.getName()); +236 throw new ExtractionException(msg, ex); +237 } finally { +238 closeStream(fos); +239 } +240 } +241 } +242 +243 /** +244 * Closes the stream. +245 * +246 * @param stream the stream to close +247 */ +248 private static void closeStream(Closeable stream) { +249 if (stream != null) { +250 try { +251 stream.close(); +252 } catch (IOException ex) { +253 LOGGER.trace("", ex); +254 } +255 } +256 } +257 +258 /** +259 * Ensures the parent path is correctly created on disk so that the file can be extracted to the correct location. +260 * +261 * @param file the file path +262 * @throws ExtractionException thrown if the parent paths could not be created +263 */ +264 private static void createParentFile(final File file) +265 throws ExtractionException { +266 final File parent = file.getParentFile(); +267 if (!parent.isDirectory()) { +268 if (!parent.mkdirs()) { +269 final String msg = String.format( +270 "Unable to build directory '%s'.", +271 parent.getAbsolutePath()); +272 throw new ExtractionException(msg); +273 } +274 } +275 } +276 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/utils/Filter.html b/dependency-check-core/xref/org/owasp/dependencycheck/utils/Filter.html index f7ba561df..cf356621e 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/utils/Filter.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/utils/Filter.html @@ -31,51 +31,55 @@ 23 public Iterable<T> filter(final Iterable<T> iterable) { 24 return new Iterable<T>() { 25 -26 public Iterator<T> iterator() { -27 return filter(iterable.iterator()); -28 } -29 }; -30 } -31 -32 private class FilterIterator implements Iterator<T> { -33 -34 private final Iterator<T> iterator; -35 private T next; -36 -37 private FilterIterator(Iterator<T> iterator) { -38 this.iterator = iterator; -39 toNext(); -40 } -41 -42 public boolean hasNext() { -43 return next != null; -44 } -45 -46 public T next() { -47 if (next == null) { -48 throw new NoSuchElementException(); -49 } -50 T returnValue = next; -51 toNext(); -52 return returnValue; -53 } -54 -55 public void remove() { -56 throw new UnsupportedOperationException(); -57 } -58 -59 private void toNext() { -60 next = null; -61 while (iterator.hasNext()) { -62 T item = iterator.next(); -63 if (item != null && passes(item)) { -64 next = item; -65 break; -66 } -67 } -68 } -69 } -70 } +26 @Override +27 public Iterator<T> iterator() { +28 return filter(iterable.iterator()); +29 } +30 }; +31 } +32 +33 private class FilterIterator implements Iterator<T> { +34 +35 private final Iterator<T> iterator; +36 private T next; +37 +38 private FilterIterator(Iterator<T> iterator) { +39 this.iterator = iterator; +40 toNext(); +41 } +42 +43 @Override +44 public boolean hasNext() { +45 return next != null; +46 } +47 +48 @Override +49 public T next() { +50 if (next == null) { +51 throw new NoSuchElementException(); +52 } +53 T returnValue = next; +54 toNext(); +55 return returnValue; +56 } +57 +58 @Override +59 public void remove() { +60 throw new UnsupportedOperationException(); +61 } +62 +63 private void toNext() { +64 next = null; +65 while (iterator.hasNext()) { +66 T item = iterator.next(); +67 if (item != null && passes(item)) { +68 next = item; +69 break; +70 } +71 } +72 } +73 } +74 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/utils/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/utils/package-frame.html index 934ab76a0..f749a7f9c 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/utils/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/utils/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.utils + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.utils diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/utils/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/utils/package-summary.html index b167fa38d..7b34ecf71 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/utils/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/utils/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.utils + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.utils diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/PomHandler.html b/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/PomHandler.html index ac74e9be2..ced850d0d 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/PomHandler.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/PomHandler.html @@ -108,7 +108,7 @@ 100 /** 101 * The current node text being extracted from the element. 102 */ -103 private StringBuffer currentText; +103 private StringBuilder currentText; 104 105 /** 106 * Handles the start element event. @@ -121,7 +121,7 @@ 113 */ 114 @Override 115 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { -116 currentText = new StringBuffer(); +116 currentText = new StringBuilder(); 117 stack.push(qName); 118 if (LICENSE.equals(qName)) { 119 license = new License(); diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/PomParseException.html b/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/PomParseException.html index c37a9f2db..67f1b16dc 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/PomParseException.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/PomParseException.html @@ -35,40 +35,45 @@ 27 public class PomParseException extends IOException { 28 29 /** -30 * Creates a new SuppressionParseException. +30 * The serial version UID for serialization. 31 */ -32 public PomParseException() { -33 super(); -34 } -35 -36 /** -37 * Creates a new SuppressionParseException. -38 * -39 * @param msg a message for the exception. -40 */ -41 public PomParseException(String msg) { -42 super(msg); -43 } -44 -45 /** -46 * Creates a new SuppressionParseException. -47 * -48 * @param ex the cause of the parse exception -49 */ -50 public PomParseException(Throwable ex) { -51 super(ex); -52 } -53 -54 /** -55 * Creates a new SuppressionParseException. -56 * -57 * @param msg a message for the exception. -58 * @param ex the cause of the parse exception -59 */ -60 public PomParseException(String msg, Throwable ex) { -61 super(msg, ex); -62 } -63 } +32 private static final long serialVersionUID = 1L; +33 +34 /** +35 * Creates a new SuppressionParseException. +36 */ +37 public PomParseException() { +38 super(); +39 } +40 +41 /** +42 * Creates a new SuppressionParseException. +43 * +44 * @param msg a message for the exception. +45 */ +46 public PomParseException(String msg) { +47 super(msg); +48 } +49 +50 /** +51 * Creates a new SuppressionParseException. +52 * +53 * @param ex the cause of the parse exception +54 */ +55 public PomParseException(Throwable ex) { +56 super(ex); +57 } +58 +59 /** +60 * Creates a new SuppressionParseException. +61 * +62 * @param msg a message for the exception. +63 * @param ex the cause of the parse exception +64 */ +65 public PomParseException(String msg, Throwable ex) { +66 super(msg, ex); +67 } +68 }
    diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/package-frame.html b/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/package-frame.html index 343a2f615..2cf6dbaf4 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/package-frame.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.xml.pom + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.xml.pom diff --git a/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/package-summary.html b/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/package-summary.html index 23c9ad619..2ed1d19cd 100644 --- a/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/package-summary.html +++ b/dependency-check-core/xref/org/owasp/dependencycheck/xml/pom/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference Package org.owasp.dependencycheck.xml.pom + Dependency-Check Core 1.3.1 Reference Package org.owasp.dependencycheck.xml.pom diff --git a/dependency-check-core/xref/overview-frame.html b/dependency-check-core/xref/overview-frame.html index 841c8ec1d..e77dee1f6 100644 --- a/dependency-check-core/xref/overview-frame.html +++ b/dependency-check-core/xref/overview-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference + Dependency-Check Core 1.3.1 Reference @@ -29,6 +29,9 @@
  • org.owasp.dependencycheck.data.central +
  • +
  • + org.owasp.dependencycheck.data.composer
  • org.owasp.dependencycheck.data.cpe diff --git a/dependency-check-core/xref/overview-summary.html b/dependency-check-core/xref/overview-summary.html index eea9203cb..274a7829f 100644 --- a/dependency-check-core/xref/overview-summary.html +++ b/dependency-check-core/xref/overview-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Core 1.3.0 Reference + Dependency-Check Core 1.3.1 Reference @@ -24,7 +24,7 @@ -

    Dependency-Check Core 1.3.0 Reference

    +

    Dependency-Check Core 1.3.1 Reference

    @@ -57,6 +57,11 @@ + + + \s*$/g,W={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"
    org.owasp.dependencycheck.data.central
    + org.owasp.dependencycheck.data.composer +
    diff --git a/dependency-check-gradle/css/apache-maven-fluido-1.4.min.css b/dependency-check-gradle/css/apache-maven-fluido-1.4.min.css new file mode 100644 index 000000000..54a006744 --- /dev/null +++ b/dependency-check-gradle/css/apache-maven-fluido-1.4.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eeeeee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #dddddd #eee #eeeeee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eeeeee #eee #dddddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}.clear{clear:both;visibility:hidden}.clear hr{display:none}.section p,.section p,.section dt,.section dt{margin-right:7px;margin-left:7px}#ohloh{margin-bottom:10px}#poweredBy{text-align:center}a.externalLink{padding-right:18px}a.newWindow{background:url('../images/window-new.png') right center no-repeat;padding-right:18px}a.externalLink[href^=http]{background:url('../images/internet-web-browser.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".asc"]{background:url('../images/accessories-text-editor.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".jpg"],a.externalLink[href$=".jpeg"],a.externalLink[href$=".gif"],a.externalLink[href$=".png"]{background:url('../images/image-x-generic.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".tar.gz"],a.externalLink[href$=".zip"]{background:url('../images/package-x-generic.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".md5"],a.externalLink[href$=".sha1"]{background:url('../images/document-properties.png') right center no-repeat;padding-right:18px}a.externalLink[href^=https]{background:url('../images/application-certificate.png') right center no-repeat;padding-right:18px}a.externalLink[href^=file]{background:url('../images/drive-harddisk.png') right center no-repeat;padding-right:18px}a.externalLink[href^=ftp]{background:url('../images/network-server.png') right center no-repeat;padding-right:18px}a.externalLink[href^=mailto]{background:url('../images/contact-new.png') right center no-repeat;padding-right:18px}li.none{list-style:none}.search-query{background-image:url(http://www.google.com/cse/intl/en/images/google_custom_search_watermark.gif);background-attachment:initial;background-origin:initial;background-clip:initial;background-color:#fff;background-position:0 50%;background-repeat:no-repeat no-repeat;width:95%}body.topBarEnabled{padding-top:60px}body.topBarDisabled{padding-top:20px}.builtBy{display:block}img.builtBy{margin:10px auto}#search-form{margin-left:9px;margin-right:9px}.hero-unit h2{font-size:60px}tt{padding:0 3px 2px;font-family:Monaco,Andale Mono,Courier New,monospace;font-size:.9em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#fee9cc;color:rgba(0,0,0,0.75);padding:1px 3px}li{color:#404040}table.zebra-striped{background-color:#FFF}.footer{background-color:#EEE}.sidebar-nav{padding-left:0;padding-right:0}.sidebar-nav .icon-chevron-right,.sidebar-nav .icon-chevron-down{margin-top:2px;margin-right:-6px;float:right;opacity:.25}li.pull-right{margin-left:3px;margin-right:3px}.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0;padding-left:15px}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/dependency-check-gradle/dependency-analysis.html b/dependency-check-gradle/dependency-analysis.html new file mode 100644 index 000000000..1b2181703 --- /dev/null +++ b/dependency-check-gradle/dependency-analysis.html @@ -0,0 +1,184 @@ + + + + + + + + + dependency-check-gradle – + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + + +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-gradle/dependency-updates-report.html b/dependency-check-gradle/dependency-updates-report.html new file mode 100644 index 000000000..154c3dbbc --- /dev/null +++ b/dependency-check-gradle/dependency-updates-report.html @@ -0,0 +1,184 @@ + + + + + + + + + dependency-check-gradle – + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + + +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-gradle/fonts/glyphicons-halflings-regular.eot b/dependency-check-gradle/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..637452ea5404ac01670c10db5276e73114d16178 GIT binary patch literal 35283 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 literal 0 HcmV?d00001 diff --git a/dependency-check-gradle/fonts/glyphicons-halflings-regular.svg b/dependency-check-gradle/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 000000000..446948874 --- /dev/null +++ b/dependency-check-gradle/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dependency-check-gradle/fonts/glyphicons-halflings-regular.ttf b/dependency-check-gradle/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..282401576351ef7d0eb7313e74a251694b6d78bc GIT binary patch literal 55016 zcmeFa>2F-gmM3;2_l>zPOp-}vGMSmANF|pfnbby6`@UC6RF$eqQc+cZP>8UlwJe<$z#CAG-?bJwi~b2?lwFF``Z|X{V(|UJ11@~ z6t(qC!(U9sy*DCm+{lO%Cn8RqbK-`LESEjv2wbkrPLc z9XBDocgzaH>{D$L~MVg;aQEFaU9Q`4{v?>0Pm8H6OdRZ^x-GpeX#3){8I^O9K3@c-MO`4eD@?4H+eeC zA0axj;7d48CvM`S`(J&lp_HV;4Y_;p_~f(qZ!O^Y#`lt*HA3kAt#2QAd|GM*;aJO0 zZ{5H1+kfhY-KY1_gU`PF3ZX-|u1YSbe+YpGU)&)C;HI-ZrD=Y1=k^D;5PP{Tu`%Qw zz(uID%m?%v8+xaSpzBZnD5>HI4>Hd2AZ+*%?kGFLj^p(qEM@mQK5vY*MC@CxPu?up zSjUf7JN>FG9RV^qtv2h^a;#pE-#q^YS|^ z_kdG&rdi^0q&!=GuMFRKx^5cbMgm^`R2Wwg*A%WjxK81^j_W3_ySTo?)$6vWKaQ8~ zH_xQ!FT?9kZSDAM<}qQK){_hx{_E@~KJBCp;*yd;w7pYM67=O+07_{lEW_lG|G zihqRer1Y>EdNUjr&t6=|{q#d(vQs@ch(}<0{lInm?#Jup-)@>rb8t6an3?k5ZN{eQ z^~{{Pynd{Dy~2QZ=I$U-aqZ%Ig^%lu^zk>4Ri#?_o-sRh>ISMz?Vo1E@rTzt z@z<}*ulZ*NZoI{u0?cWgI4ou5FWtDo>>T-_AYV^(UaxI?9hym}%6n#+QFx~OBOWLe z?ouA+<*l8n^69Ie#@&(MxC7rUMk2T}T&Y}V>Q3BcjniUA+%$V3 za<1KBg#2pUmg4}D4OS|{<){B1fGydalA63}Yl7Oy2ZV^7@%8!)y{GZ2^z3 zeu}>(={R&%Z?WVA2k%<`B#|O5NReX2)ti2%;`p2psNVYcW-kmhlgx}%A8D8jm$!C$ zgFnrorhIXIzqA(HFw1H>Yi8~6VM82EI`2F7>1Oe!)S98o>($$QI@QC&;xX03*BP-U z(8Q2`(4{rtLcf(~az zZeCR7O*^Qk7J#m8wpfHN5CJFUt?79oaY= z&W7)-@2pdBCYY~7d>d%tX0|q?3oPd#qcTr7{VYp*Yct4a(M&sY^O>beqg_a~Qtd*p zlB*PgjZ`%iY_vBF3#0CrztE=})d?fI5VX$2ni`HmqBc;pWz6g3mn?HQr985eSkF*-hFp zT3*<*XAfJn-CAr{+pXpHa%-WGFH{$sp6Ynq6RZR)fgEn5zShF3XQ>qk2CCzYrfFjQN3Y;Q|DW^@r#79BJiBr_ZvMW4G>Uif<+k z$0X7064Sk3(HH3_3C)AX{zIaT(%H5@y{=?Sl{B}qdCK|;ZqHH4!_APFMfgB z_e>GL_08Y>aWNLZCj{_@l;kY@K_>!Y(^)cwwyCAU{*)~&KC!-whWWyI);%2b`DSLL zn+#zhaOa&S@w|;^Og;q!y4@GC^4oY~tO{`X60D)q8(i(>#aUAy4-S}fc+Ix*kiNT$ z>-~WN+!GUt0sht{T%A`p1{$RF22hI*T}7xn^KLK4TmGgKc3OljNEYI8aBI^m15$)= z4?W%VZawjav^RMD(vd=54Tb^|j7l@7Dkg=&X{nN8rf^zIc+8BA(Rkc9HavBfBJPAR z)*u37yi*@F?Nzgss-^0|xGC7sVm;`On;hZ-z6qqfa0uXDJAL6=njPxG@hfrSNiq^g z96X;+4drg`^1KVLx@2MKi{qc-Y^&hJjr}{Iax0k%m|UpjGQ+!!QlN+ zmWxHWZ*cwcJAA{eI!@9uc0{9o`F$pY!-w~SK{IpS^NB|2UA`uoaAaKfoUwOE;hbex>_2!$_^BvknQ#&U*?GkaY)b&;}txUya!Y1QwpEUpS z-)FkMKBwRH-aX#3O~F2*?x4x2$G$npdC&I7ZNHhvVi{=%SoMsZJbcnYIs+4iqTX_4 z3c+@v(XKXvuUf(*$eWZK9EnM|bLU^F)E=@9{*T}NJ^cuGX*k?EV9TJxFPWwB`T?`J zypS)MY@nJmIo7*&P(M3ZvrsT*12L@QBYndMgN#)LW{Z|I_ zAV$ZE*%r@qY%aKs&L09YbLg$_mG5j{5CNG}-KpnMCl6^TxsmcrpnYbYgU(^WW^I=l zg3o6gqD1iRw?JML3}3SlO%gbu=?3LVxReDh(iBr$n=6bzB*Vc{YH=B}az2*=qE*K0 zMW9`8*u3O@Nl-IaD&>&n13uZb-LPkUd(8H*l)U>v$#cIyhZ6GJ7V}IJ2a_WHgb;QC zcfonj`ONuQ&|1h$^aP^S{!au8f#ZuCg5v_nvyUV;yY=|!R}#CMu)Kjw;wQEqzXAV( z6c!!@^y8%Vk}&$qq+0jXoAT~~f4k2|rgy z@NTyy_Fe7iy3$e6br)F=86SnhAKBVG${58qcIJt#%{K(gZa#x!g_q;lt(`F_n+HNI z1F`Brs6cKzh7lv!>1DRTAV7?HQTTP+n6tiZyQ6%*IQ(o&ciWw#OgA&cYq&4!nO1!! z0z-vyO3t{7ohW|!vGcL-xbL_VmG9bNQwW=2*nDh; zI?2pXU!W6j^Id)Md!%wd2br@Y$=i@|4GFiAy+Y|$iAbfb%?hhBQc~)Fq%PEdX+(pi zF$wmO$&*C69x}NugViW=scmhR^mM$Zs zFI~KNK>oSYdFa z3NVnzvzTt@uyoC0-3A^-V=14;0?9Mp^cWpJK`QC+S@^5}>_d{;<~DARC<=umqd?tX z|H<2|cPY2QaSJyg3e6-}RBc=YoI3g#!#DrSUp&NzHWw4)r_6;<@HaLb(*XuKqNL*I z2oT5tS*K8})nf7_LE?J~kZcMJ0A@r)!L;l`B(e24CDTM3d{6^6rTb5GhZAlG{k)9J zHev2?F_%-y;=o;GQw=%84DxbLIG3E;ESW6CFK%s~VUd<`F^9{x$xd!&P?Wu}}y#PK1M z9rNVJOfX+)7xM7777lur51PVqyU|{TcWH6fQ=c{MdL!7V!&@CscmfI22m}kk0K9&# z!gATbczuY>J5PMjdvW)E`24%){q@Q5;n{kiIZIaG%G^coV1kwOGiZ_p@5LESITz5B z{)HL7+Sk13Ee>!J444mp!s92od9GKc>VbKiur_I@5alXQGMP>lb671hG%p|R=6tibwK*WqdHrZHBYk+0$*{7+y|nch>|0^G zlWOUZEtqf`5^ zOoL}*!|e|ekekmeL=qcQ`}R#Cr-f*oY`jn1ZZfrh{}fvq?kJz&IpW?M!-Wgw`o^DQ z!+?=F!-l|uhPCrax0XeB_~|AV;UU&s7szM=9pn5V={81&v9Lky`%eB&3Ufd zS2C38%Lg84Gk7rC2y;b>6L(V1I12=JjtCBpY&{7WZInPr8YQEnimVtr5H~5a z5swlzcnNT$anHJ$Df)hj5>zoG72((v}~X;czQ0ZPMmwKl2ZHc3d7l zL!NQRo!DR$ujhUCfB*W|p7%QGnX;P!KU9a-?K12ff7Ze{;WP!tig!VhkOFJ4d4$75 zzH&lg?KJ{6zpPVa%Fzj>YFb|Wn~JyU&9uB#m&ZY>J&UVb26n2+dE6+1WC7F(23)ks zl!6e^gXk7m)-$I*5p{w5W{bJy1HZ#`3nX*k6JJmZ?9-t}rbI}w@Kr=6L3n~bX+%$0 zCXxY8B%zoHeZUwp6c?gC5E(92yQN1O7gy=U1^2)I*`LwZ5r+}4)jhyNb!57ecmgcA zQAk4K$_M_7|l zPL4UwhB1F8PYRJgSjb3X6AC*+mIeeryXWs>#;v2Gq;SPoCWyPB1+9;2#0?lq8O4O3AL2U zRMIUwfo58TO1tH)AdyUQ#*XL+!z~!$|K5VP$UN-~a}?ehhImG)qmRST_JKYJ?)~xJ zW|ktl&0Mry0$o1FPS9!CA!*oDOiJwwN4$CV0_J1KXtrOzfVlql%UEK+j3HaZ(y!Zk z_yx1qOtCsI8kM^hN5WobUtsz#^elHqoGUE5h`TX&rC9AEE~XZ4B~TqxV1h7+xC6nc zcp{3geqSbAC@OY`1-tV~H>VW&jT6p-xlWWX^0fdaJL;hjyP6G@>q!c_gOyYe6fvZG zeXAR!-{vT;?W-f!GPdozi<*a>k7VI=sr$|M%$}1HpwJbCB%O-$J>ig2yp;hlzx5

    xGKKWr)LOIHX|9j|pm3m{#V9uzu%fq9E597(oHCcB;|_!~!{QsuILvV|l5CK@}Kh6VZyy>Se}Y{t-Ts^u!6qK#E$EnO68kp{GwEz0sut zG%@1oy!t`XgD7u-6eamx11F}@b7eq)A25|%ZAmYv+aPD5xbdXd{@GfJ`U9f-o~$OE z6$Da}A|GzM^~M6l@MkFrE`WrR0M?Nv5N3RVA;WrCTs#rx{DOV3lVUEB|&wiJLGM5fJCgIEdxR{ zvuZ{?tEQcbo2EAq1OT~U{r1rpA8$-e{s6DKuinZ^^RP7g=LRan{tK7rzjQ1zIT<;2 zi7*vi&kpWYptf+x`H%&eRp71?bLv~0%L{l4zLnr%E{AQ&T%N_afOdLobDDr&kkG!Z z&3z0dB~;jYd_+78)6y+t(b5RO%wMa|N=z`B$$GUP$Jn()GLxk`jGR?d9)*@dC*1Tv znUn6k;7k^5Bi~{~p%sxEp{b7^AJQy`IKO@l> zU*JX$oW_2IENp&XX*>aBGh5_yTNr>RMkA4Lo!tPuY>bwvia+JA7_d0N^#CKI0lk5K zGQkec_=3uj&ph}maPA^jL(inLpLWaOePGLwfQk|GkWnQ5bQ5%{t`M|jwKiBP!3LNw zJC*C$XCEKA+FOD>OPvD1v&_i`4nHeM2e0pT=XXoae!+U;6!YLU%7Bz&Q{;14ry>F~ z!I*e5VL_Q>zTgtbM(2ibJfpoADsQz^&2&l)R#Fa{9?_AHE4* zB8tF?dY7$_#^BCyU$xq{T8OtABAPaIxEl=hNb~U)9Gw)pc@d(Fib(MfI!C~NJL6n1 zx=lcP-rP}P+@!ajOwAwDu~`#_c?tdv!*8?UsSbD;+&4zp`)Zas9OVnAcf(cbIux*m|<(z;XTVl0?syq+zqU!Q$dU9Sqtv ziJF{Rp<*At8XuO3Om@X`8LJ#Fe0%q)uwpd57WU_h%kBLK){e+XK3_>ymnczaEmf!r zpwpYd6bErb&dYTov<6h@z(g90v9?0>0!{73q-T&igUcd@%v|)#Y!&M)hXl1a6*5`}Zpe+|7m^#3N~HUSUElRf3Pv!u7;h3InM+L1gsd<5-WK^mPcHHqJE44f zlrj%jCXYxTF7#DpTX)Hk2W$Ycm6#+uqR5EVNv9KSM zIh-LvWCgjP|0O(~K?#9nIm~yuRIYA4R;FZ9H9~>`p#X<<#->gP$QHCz6>7Y>1{$tF zvIWl^o=f)0unSm%O{%Rogy0AZxQh~J1A~YV4*#o$0YmQj>5_CoaKdCM7gVSTFOJY< zlL&!^l>r7@a0dw6w8}V~KvZO9oZecMuyL}5`~tKT8&Fa-V16Q{oewO}qBMGCw8Wd> z3SLJNxE;k6W6|FzjgFRhlMxv651UBZnB^;C>POg?u)t|wiwT~cP>n8E4&|gu8sB%y zndh1X)btJ|t+gnl^(Zf~zr0!+6v-3aaNo#Jx#gEx``Pm2r{N@Ck^|Pg1at)IH+YX) z5<^85s*@qdJ}fRG(0e6nZDYtrbOP}Nv3!tW1|xME$&Al0EdkYVEUmCasH8R!O`!6b zmeTud{~DCe$9UQPWruW2yF$+!@PI@LN;?7a*Z2`Hp%wAWm25W0d_QGJN4cM+pG1p- zK5VG!WKC-b-jZ-v!0C%vl~JqtEz0d)s~q0P{gWjC0D)d9n&cv9QmK zT#Y0>hwGk2;l{b31eGN#;g!>Y*uEmF(O7oW}@k>$1U-UDIOHLj+|}? zPE;mpWkLioyQd^(Y`jXg93m>5jGFT@KxK$P(c;i7^xe3ku-eojlx+GyuEsqHQL1(* zvVz3Qlg%$IFV@Go^x8K?9HWc^4_~6yzOswq%X^zq_IWHc2;g7-05`b6>iX*Hx)GrB z8?HM-!^f7U5y)jFj|YKUp=AvGB7={~Z1Vsz_?C&sy*kgF1M z6S@|uER8qKK~pK9&7qWBhYCFit18$wag#76Q^+it`%|kEnH&7_a&mf!&+*ChXn<7K z&+p*&`QS)wS0Z8V!QcGqaDI6P9=P4tu&ZTPrWqfw<8FFxI5q@bTD&v={C71GItRKw z6ZmjJop%bYe~0BSYv-tJJ+VG)0TE2twY53VD!9@GA{6r!i~#?+vb8BhPK9{Tl;#I7 zqE<$T%{t=ZM6D^Uo);9Dsz_jjt-p)O^7PHK?UQKr))G~&7n|P361oWG(+M-`!_!n7 z`kMH6JclHx~UJte=z57NA zrGZ57xJI?#X-|fN-dO9l_a&*{$mEGY*w3##mA&Id5s60T zPV5ODne|>;naCI~ltDt(MlHtN;THD?_H=ZTT@gnZeflSsZCG1W_(>jrUg?e)`fp5^ z@?)we5D_e`vxzaQx~o&=w_!98+En$&2e+OKS}mJFWlEI>HLKFF3hiOa+QPDG(C94n3-2fTVE>u&kAjC!$1km!+CRIQeX{W%L^XAT+IrHO>xKKzt z^DQKE&B{2!?9mT+8?Ve}iAw#;Iq&-}{Z?w^!u)t)V`IU4*%Qt+N*D?~P6csrY*uMn z0uX*)AqAmlYg4&$(y~1ej7YT;T?k^Q(Z2zhm6Uw2;fMI}mTkZd+b14_eB)W~BwiqCAbKiz`BML@l^$Fb z%-^DID768Ty)V4|{kGEgR0U;vsj^_F&>S8*0r($u0)20GtV5kRZRK!K(iCk>XfOz` z9V+YxI0h`@VosuDt;*BXqwLj_%ybxhs%`MHa9_rlSMYD@0uGIeq$1^ni8(duqBtBsbP-25I0+UCKfqKeUGRVPCBypZTNtWl72@%Gu zFu9_Byb?lZyXNh7-RzfzyDVhIu0gg zoe+ZB9YzC?dki_doV{S?EA7FSkS!`8Kbq1!qJ#!!5nJ7I_c*_TIl~D-G=a8_Qm-%u z_vuvM`RD&B@`jTYKL=TkKM1o!n;9E$!+6>l(e&G305IVAvccH|&zP{>Z9;+1tN4lX z0rCu>P1MEuBLIy^1J*Ea^G5_8Yfm?iY&|Aa=H}b~n$@QsVFsKMFuBa%v+~~ZMg>Jv z_j(hPej@<$)PFp)ai+r+#~Y5S&>2Z%K?k3R3(?t0(GU`%M}P$^xDl!z6xJnLQpj2^jc%;W>ln5}Hp4f+YYm^1oy98(B6tKtVde1;4v{XmI z&K6LlQYc`*9245z!e;I0fv7@osVMYNinLFTv`+>l=P!(DMUt5uNFjt(i5ivKz5(c< z@iz=4c4@nc97_AvGsR*C-=v2~4Vhi1O$|@D!B5UVIDh_u)H*#R0@E0t2bqdGt$gYO zccwg#cIia;Mue)&VwrfL2M96%yR9P-LFL_zn<{n-xoR)Ns#`wb(@K`Kl0j!s=sn0} zO>1G)WMvWA^fl_la#<5|(fA#%?KW!JD`YSgnOM3XtmtW&?>^g26`+NbW`1$fDL$?F@)01qX z#TJDm7~#5{tdC%IsN&R}YXr%Vu1dfQ77@3LM54e7By!b86vp|j$CCbQ?(vilri`{|ps z;3b2hJ6n!G&F^FnurREM%%`!n8Ropnp^*#=_7MKOX!inm;LAg#!w<)kGREXe6FQWH zha_Ah=zIb3*E^$SArPcGgayr#3mLQO9W%MG$&JUQC-~XX-o*7H$c%pY;d`Sc^AVE4 z1qV+axq4&|%jkmUVtKs_7{o7WN~WmPp*d_M@lhF@Jn=&7$o=imDM2MbNJGmb0CW^8 z%mbGQAp{!z8l_gGV3kILqhn-pBE9SwuSkClE7{-?{m-!K|84VZk=mO~2FaNnlGeyVe;f4gbOSq_*jEnt9hU$WD!bod3 zlc7s^I$#5Y1@mNkM)oNz65tcSPQ-_*c$3TuW(4eflvn-zfr1Qd9`-2*1KZqu%H%*q zK#3WTuz{ovY;Ht=ghCQH$iWB;@#*tG}?(5eq}zl62v){nv>b8$?FwHo9z&%T)ZTNq83RAQ6;0;-%~(HP{Zy@yT-$H+AL~!`Iw^1kqrIvn-tN zvhORhDr#ZVHicjgFC>Y+_3U>w1kA0T=)6p2fF~;Kbv&IBnnJz91b_(gVE03`dik0a z7Zd=o=@LR6{aGENd-P{9Lot_}?!Bb;tWZ0>8yYg$S}E&2C_@kgCIbyvE)!nSu|UuL z;{W>fuMKCfUiVB@6G~b4?NV^7Dw;<?_kbJJ%H>ae& zT0?K~<+arvf3H%(otto>(}X=MRk!shiIDD#{DVej)mT!ARi9R30E@hB#fBmn)WNXH zEm(MY@vrew*?z7uhBh|WfjzY@WR?0>?Z8`K43d}w{^8;u$(^Wv{ZX*b1w;K5Yi$b z#yWmc2x`PJqkRluyc^xx9PLU3(USXR6*8&>QDsr^uStR^?3)y=B>qHWuQaqpPmv4n zB7rG}h+>JRlH!Z}EC6BHw$_KfDVDvf{=HZab2no!?klubeM=B0fjZBCzIr(bfB6Gn zA{g-aJz-zmm+@xup@KirD9LE=PwyTdsm>prAHItMbleN!j4tjO@&sa$px=uvw#j@f zX?%sT19fj?YGHk$b#`(v@IbSoWOf_usrI(71A7c;GSCS%3S)etF`wVslnn#!kkFAh zBGa@o4lFqHy2^eQaBV1U!Acgixn2!M$eDHCu*DWuppARcP{&VnW1xJ^o`XM@TYAnA zMA3Iy*SyjSLV7~FEF1G3qE&LZs!~h?h2+|-6|jpSI{)-ZaCBO^(7CNA;qsLFRUaXj z7qptF&B0)fvK2H&RxgeUqsNG7hNxBEH7%T#)KUu^0O%ErdI|te+ytQz2kC7KtN_F= zx1s8WAR_UqmBW{bUB~Wm3BUaCUK$U$BChMd{4VaJHwQmE^UEJvDyR4X)1CR0+EN4u z-2UrV+5_s%a$Y@#>jPXBjT^?}$5Z$D0oi% z-7qY<;{DEKshl>uk%F5|veXh~`}AxU5?#{%Uf9`J)uWdyxcQp<00|zr`#U`duorDa z*?D{5|N8GdFFzUewnMG>0;svlUC%&GId{EKbGPX9LQU1bdPn#!)G&p~QuKBA=#V{k z?SJ58M&R&z?M+ryX0c_n*byefJutz*BLk2$F1~cF&$(omQd=1LRePY=r9~3lkVZ^O zX)h$<6(2@iKPF*skKrzpjO;L3Y`g*%t$J2AzCy<8#8^ALy1(EB;2^lZ-0-wlJD+j` z!h>7vPUH=|&!6VpfmPrT3od(>$jsrFo#hPt9>0t<4ypnYAG<7-71;LM*kV(L6;ozA#`t|n7 zCV;$BY)Slxlrqih(nZ-LJf1H)vmBjvIHx zkeY1(Q~~VLN(vm)l>E%NGQBh>o1cAH4$$Aq&)R^c6_COs%3<)hoT9(|N1z^hH`tM5 zP<1Y_nzAx1Z*7V;8brP#esH<-!tO&0^~+wsomUOwqO$b-u>oI&Og-k8tqPupbsbS6 znuL@f>*ddz%%~x|f@)7#atjIOZV|&5-A!{6Fjx2bs@dgi)wkC-$k{YIXlFSK%x&pK z$=GADAX_SBO%r!~2M1aTSl&Zj)FC>Za~45OiCNKx(iroUZbQRORrU502j;D@W5~Qk zAM}9Gt&8(g-)LrOFCl>5-O54#9qR6&D)$@M)}X0Zn8ggj%RwsvAwd=d6|g%qPE#BZ zHl<8^w7XrLmD>2s;~9@0Xp~v(d^*EgS4xcok*de@Sw{nX!#kd~<{T>wCoy=+#uhwdQ`hzYc%aYp zy>vf#VWDOL7)GD%HZA7R;6BaAi_&>=OAwMk(QVb=&U)fL7!VFF=iAFQblX(}Rcuvt z^ab%*IONT(G-vPLfnVK6Gp9fL9Nuq#xN#-%e!6j_ZB~xoy7%@}-WLjHu_XcT4jj<5 z*Yo;Z;$E)Xxc2RTv$cD4&!|S@{y+W6o2_sllW6}uaOE(<^@AKG-dM%-H{geT?;852zorR#eO!T6%AP5XMHj+hE_L(!nt{G&XbTkpmFvp~Q7VUG$J}2z6W}isMZosP= z02_>JpdxQWyiM>X60fL?`q9`xvN$wRYuZ1v7C}@z(HGfl;-j@8gRa2_<#yqgsj?N@ zX||nh#e*0zq5O;#uu9Y(^{~}_J*|53!2TLCg8R#VTqBe0i@Oa1;jjLpMpD-{*=%8S zZz66c>-pWY<8zr=b8EUm6mJd;4Fzj&acJo_Cd4A?J#6)Y^$;sH_z1!rIkQ{`=Jd>7zBMQ|E?69p1ue^cE1<54E z$~u=ChJfd@;hH~Q8|DE2Q+9?KsaxAqU8rggSD1dJzi_>Zdy8SUbRq5 zqsp8LkIJBzuaWISmA^Jw*kq@hQA3l8jao`fE6$o~FhIk;?UX-I-^fE%ef`n8xtGX` z0SZ=VC_|z5yBX26fG;&@0#n)fxH)F7tgf$j$#A@j&u6Ey14MdtZ|B!w{{H;=a5A@+ zf7@^(iIJAWpWQSP-e&c;jY+?=XAm|Au7QelMH=99sx~?G@xkJS5SQE4+&$c{>xWnc z%yTn^-b9Ehy2wJ?MJH_gZ0cm~i>O6?BQfpnK5{ zM#K`?EDvR}3{gaM*+Zm{Ko+X)^0wSog_YiuFO-V^{=b8a5H-yztf zh!dRw%vtQ$Eoj(ym47^gw7>liaZ_i!9Hcvr5P@S{50Rsh^1XU{@1FH;4nOq1P`|FY zTq#mo7j)J-q43jVtTX|{p4lTs=~s+0&`huQZ8*{Fu^)loaWjbspZtHwrzEO-uvm@2XndV?Bgm-Ye zF8}oL=NDV8i=Th|(`9qjZCdxq-fYK3!pHX!yA>&VFN~134QV`c(-joigl-V;JV)5b zVqt~t=##|&6eFAye0Xj6J=!KPt4ovZ1^9_Z-+3%OtLJpXm+tfnEF9k z+bT!jr`sK{f<{ssh@%^L#a>wfO8{Jy`?JHCX{oO*KOz`sA3y4Qq6G_LhBY4d2aJMc zF^ymd4%!e{hojQaT97Iu4z#*}U|g}QNVJ{-P7qD%o&Bex`2zWipuRh42w6YzbaM@ZTj_gqD0SbT92 zmo=dWpRBz2#HEJu^q0XgB7Fvag%<;?AWip|#mE@ghO%wY{bk{!q35!YJq#Y0Xe`pbjpK|5R?B^q^xApE*9O>`ba@_U#Oukfd6e2)o5w1~A1cy%~60})m( z<%6{_00ZX11Y=vs1TW#tF5%T^fMIlY7a=>51O`B1X8Du+Y5eR6e^#{C1gQ~_-{x5z z@b_$L5e=CN=MC&3@6R1SMMlw%4nK*`-qQsVnBZtPK$H{hR_h@vQxG1A7=HmKNaK?% zBS1t|Y`81LQVR+gp2zG_L1StoMQ!Ya)oPB6q1*RL3}YS0y%U8D)q61WRr{ul!Kr;z zm-A0#36D&Tc%#nF@*9d+m`lu?OpWo5pu?1y8)qp{ir$Xz1Ht76Y(gv%d#1H_&tlISd-o`ZJ4}so z-a^f8^sT}20>LuJ6!VI8HMONOxmyTZ>WH*qFs2PfPmXBVct}>DD^T=|3#-RJO0HI5 z{Pb`(_3&Wg`zz@{I{R)G_bcBg4n9m}hlkSn%lHj-d-tY?__MK<<15j*Pt3bAQkfIy ze#(|JL%B>X^Ygh*VnAv#7#?X(!Fb3NV&@MWmMns7h)x1cqK=_<*q?<>nuDg5!#QH!s%3Oy zfpg#oqHME+3YVE{&1Jp}7EMjY)$X^|z7VNwV6$U*8Ln=(n zG;@L4fd;xA@K2~RpA4(8G*az$Lf3AeZX8d!aH}h4H8eS+!tSosz9~{_(?VG^bpqZ6 z%A$zj8Txqp4AHd!^M^c3r6LdZSs43mk74X-RF=HeU==xRyf$2g5h;-Uk(C2%aff>@ zd=;+d8yTIT^|OI(8gB}^9CE&6Ulpn2ggw3pETnn%N3f*@lJnNq>AW>@CVY|S0#of= zV{htiyBT%&ep%BhBW1TjGnN|8(l!czdw4<+v&u?LkqjH8FRKjR!u~@d`fY=^OD)HP zriK9zoAhZ32jjRBINZWtZx<>UCjfNrN3K?Od8m571ZG^rPa=0?1eO3ljz?3m`|;?T zrupW*`)}Msd~i5{J3UOaA)5>W5|>P;i5+bd^@Y7bpU>kbI$g!3PFmoMXCPIJaHtK$ z9>lZh_;+XFXMcywvy%*8H&=3#qq%I!7?0QQjfLU^h`xf07>);hcQ|Gxgv}l%9+9T+{ zf9vt8cDcdL|ZIn8jLUyw{^m$jLsZ4`?VQ${DxLl|xjL|3sKhAct_8J>d z@W9S+OtY1CsurZ-qF~&=3+==mJ9j=I{G;*v1IcLI+z)0d$lESN62qK%K7NCsR==rz z3_sj8ToJ$VqbqIKp}|XRd5ak(z+J&M)EE z0MSG=j3&X#34xe2s17?=arn;q1BNE*y)yo~E)m*S{A46A6aVrQcUB&G&?qYlwU0JBOSEd2f4 zg}=X0119Q1?vqd7AnIZ?F;_XdjKu9w z18hX_@BUF>gc134I?rsQ!DPrgkcQ9mIc{*Itgy(Ip@G3TXpX(aMN2tj%ZW^YBvYA# zYi$qGA6nZ(OhTpn;gn#T?9Fm|Y)FPON@UTBq_r6Bsa0^QNUq|ia0X5|JsI^sdxveD z84rIN?o)ku-u(W5`?dYJ_XC`!b_iipm*qn5k`S?2m=!Sc!Dl%?*s&zFajPbSA$0s< zL76JVNSIMAQDKqG-Wiy`(J5NYV^Vt|1)>>Sv2f%ZZDD)bSiRuimhHQpi;0}!SS5FL zr4{M{2i|p#hSTJF-_}~J(rRy&m?ti&3g%B#QH@6lK5NDBI-`uCxHg%XQ1I)1g$QwD zK-UIp`Lk0s94?E0(`mHtc5DI`fKyVhds*$2eY8W>&h=F7*``AMTyt2u!Ld`n!VdLQ zl+^kGC7E+xn>RvqMN@9CFIhI#)T`7N6|lUS7gp8U{Z`Nj>Dk-!k}Oj1WziJ;n@b$P z;P`N{)dm3scglUsZDhO>Z&tw|==)Y`Egtu0AkAMrd#%eXMN&-1xGP}BCl?OfxcjZ0 zp)bwIT%2E6Sv`6B+I3Bcw5hdl#L2$(6})yN)>qOgzWMh1ouHWs=y#{(G=ZKUwv*#K5y)VN!QI0gRpG6Y4CwvNFf0p7GBbFH_j^x1}~nB@is zVWeyX8aVMWP^TmoKNRPP+|DoHmca8M&(t7%Kb0#?N8-D(#c(>~4Mz)&Tsb)99q{^n6V-go>y4!Y5tyh61R9BGAvpfU z=doHa5=;5g^9`Q~VM+jZr$;Ftwzu|!H;ZOjF8B-WJQ@tAgwA3Q!FuKVO@Or5ah|ih z`NVYMGlZs-o@;mTT)x3O9OYv-juXq1$xpf6+i`AoW+pxUu7$Ie_c>ziS8T09XG5lU z@N+~PZEkB*=6>v}mF3wA?5i@v8ZM5EqVTcw^zr;2F~tXs7kj|nlI8O(DWAt4fCp6& zO!wPaJTEgw02yF~c7Ul{yPf&-vM_jEC?;HtCAPx~=W=yj<`BX=2W&z-Vj@Sxl1xs% zutEqgm~vw7#+th6(>oL197rYQ3(9DuL=cS%kc5HtRoHivElT)-)0R5cpY)xDtcyRZ zLEKptrP6wt2;@c9R16}lb#Q0pcS|iK2NgRwE^Q+`9g+piMI<7Lr<>#UxUR&w(!!vw zxlVUT!^t7o%AgYsVp=b%YO+B+#!D=@!AcP;7S}BWW2l&Nt+~Qefe)BsWCWGC{L9h4 zWiEx5BqoY{2P{0YgsrTH$E)B?x6%lx6BZr|k3&}Y$%cFZ=^f*Q`QRgPIv7q3wJfMu z*>#2&tXNvM6bWjV1Q+L1pwxo}$kf0AqG*klxxJ9Gr5YpvfBF4ieuW3eW!LNZ+io1A zf5o3yXMId5tZn;ACks;VodEpWC%Yw%f?6DdQ0s^zQ#HYA&uItUC^G3YY}4Y_=5aQV z*wov@81O~pz`#k{K9h%}8ASn{@L<8tv)^L9>1vni#&Or?WkoDt!tQdNE1+F6;jM0M zt}=8~LZ`NV(>`@HL@3T%egn2LoMM8G%JT(DSyvNPk+^GGd3Be}e7pAxP1{yRK{%1| z&F-^vi>#7Xnllx=Ma=DN{hpSx97cT7@``&~# zkQ@LLWTMtGW98-;-j&%5FH$P*ViFRn(+}aFsg#>#Jj?U`pG-WSXOJr#oYv85UCx(T zjE=-_U#AmX(B+4y+d}v$Y$FWj%S49LxcHM78Mvg~xS*_t5R)if+vC3y>N3B#3W@ zhvupej~`sAtW7m0Wk+FkFfsgAHrzZij-P!LJZ8SjW(vdgL~;UQxW!ZLx5EC!+(dma zYi=waxVKy^y!S8^d|O`!k9qt@R#M3iE*!gZ@2$xbh;_`g^L0L1m}t29A3j)JU7MK5G57Y8?7+T#$L8(?_Y-R5V7x;P$3&$)C_ll` z#{+HAWr6-WWHrmG=Or=(Ip-M6prEi@WtIiC>DuQ|jS-OCx>hbJtyv`4r`ZhNV8Ydd z_by6r@(YbkP~!qJli0(7WH7MM^pQ>j%dG(J8xCp!a}A1>(m)sf@^_Hg?GJHNSG{(G zWxtt9PJeOy@ZO~>HHwB0tghwXxpn#T*xHfRn|n{~efUM|)V}wH5&O@6h4=sLcbac~ za^kpVQ7G(%=lG$$OYa@HSRcN6Xf^-VXE#2JtsY+=IdSWXCc5~(LWdQC^L;}Y;Si4n zu;H^PDsagx!$@`=8_x{5@puM!CR@9Ky^f%9As(d-ZDNcG>^Y2&55M!?ni)P!Z!CBh zcQ_J6@1>iiwj@9x!xy$&;l)^~s;}@ZUcenTx89Y+hmjY~^oT4;$Y*e3Rg;5NPe|st8W=*CshlLP)=#6X&!~$(ZR~GEMGb0-=_YTThaE^j$KgY+B)+$DVEq zNd$5j)Rmk)r&FXaX$^OQpO`M~*DX_1oD-E%3xUTFM{RcDqI(*_oT~48WYz4`qX`=9 z7<-t^i4|)rtA}*R6+NH~db;73sT8_4#EM3CRQU>3456t4&3Xp7uZngtGucrudJE2J z$dIY7_8|P%P7gN^pP#L;wJ&Vck6qqBO-eJge0pts|Hbws{BRq%-kdDro=ok^js$%N zPQkx^nTUDr{e-y?jN??r_4W;fj|9(O@MUHW-aUNsjODn+gPEEAcdX`F^xXN>waI&) z(bCLdE)WE}HXR}|O>-V!J5eMOZ8#sW6w+W~X@uQICMHNAg^ZT-X#sFKS48xPaBxT_ zstuHhYXga%F*Hb4*|HD`P07<9=ryRv&jzhzBdDtpF|&!S3itr@v8p5ws@{p`z=@Lz zdO7+%I#HWlUeSm+%RVoSHoGiC@WQGPBo3Qx9%2vD^er|6nn(s^*x{t9-5^Zhj0U&^ zE)RbY0_|lEcmkU8oLVcFEp+e2HSyL1bei@bFm2+M4oRC?YsK!B-{R*#WN$N z+{~WnaIT!L#V37YrLMGZ8BG0gj{C)e_pr}56pO;|iw6dxsYn~%6X@?A{C7J&X=~XD zL%t>vB+fpBZh{T^3fQRfF+;-NRo+k7Lk^IqtNXwYdqQ?~X2ebuUOnp5iFib0p&k;- z(ZQR56N9NC+7RYTT-Ka;fZaX9^InDQ$9af?J~+1B@yTjPwsT}4b8m2@jhc`uylg!fV-2zE~ya43RKyN@W*5|3ePib5XTy;rwzDo z3CV&HISE1_4Plr-6AdByJDA|06e+VAtclAU2+i7^0UZ<&C2|5n^w*REI?hp6wQWiY zXf#4bn`0;v6+pW)CeHA97SO>ipvP672D9t5Ux0i^bjOYeHiZXY?18+6G*4{kYk}uL zo^W;Qzlorz;MMgj3sNJw1(0Z}o; z@y=;`ymMO3HVX$l&L71k(1=o4@tcgr9qvpeEaiktKtnpVLLMyubT4?dH2PSXl-eh-0X&*f3I^Si2dLR&Jh7{W{dp~q85d7m>!=P+KmoP+;Wj!2 zbDgV|>uL1f($f#udp3y6o$FRy)8O8HrBQD9-(2mZsC~lL9@7G*j)zga z$Js8O+E=#MzQ6Px81&VU*bZlj-@aG+rl;~83os;{g{CC=xw|+HV1FcA2^cGEE+Peg zNLKz>TA=NvUn~0u3|nkd2d&<(nho6ySHHh&vdH~iWCka8=R`s zJ2uoaRV7q*uIqoSZw~fiFrprqbJ_!OI5O><4e6m`U7}Nk0d|`|mk<02p?W|nLm3=e z;q0;@YvP}jM@M@Z{uC(`ue7LW@=XsYob68LqnZ49YBHqO`~$#zZ-q2OW=NB8UMw79G00%BH|rsC4)yRgIXT zJ4|97!+{YoLta_yaTgatNjAv{nnW#CwwEB~P}8`Ovd&_McFsV;0j+B!Gc&V%i1|(C zO=9DncW{Fv0mL{skz=bjfk#hU_<}u$An(+CcKpXz(mEw)!g+&bw)KV7K&YG{MDfQ& z1k}S`vbyRxDosf2sB)ABi=zbSnZ?Nem(bvxqsRGbRC2bkNz7Eu_1 zw%a2acHSazL^uY}NI!(igOEamAAd*YOsw);yCk}j1HZ1w5MQP5s!x}-P9ELKfGi)EOc zPX~ymEJRZZQMDG@3sJE2wgGhB^9C}4BR`(SdR{?$(;?a31-sQl7n5NTmkv6;(1fH& zbf4VP%BY!_rqA1g=Cz=fv2T75^SQ<$_Z>k^8+~Q zUBF$i8QE}(pYl%7i*Utn}f z;{rZe@`R+@%idL;JTQNXc*1h}fbO`W9elBPSwX*V?pJ z0&2J0fFEpNaI>J#K+i!`9?&)Wir$q8YEf|4)?gdKv1HFY5V2EBA-XR++hB

    ;Iyg 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 DH|yT| literal 0 HcmV?d00001 diff --git a/dependency-check-gradle/fonts/glyphicons-halflings-regular.woff b/dependency-check-gradle/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..f824ac15a0ac59d8c236f346f3bd429542cdf8b9 GIT binary patch literal 41793 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 literal 33442 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 - + - dependency-check-gradle - Dependency-Check Gradle Plugin - + dependency-check-gradle – Dependency-Check Gradle Plugin + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@

  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 0.0.5 + Version: 0.0.6
  • @@ -77,19 +77,26 @@
    -
    +
    -
    +

    Dependency-Check Gradle Plugin

    Dependency-Check is a utility that identifies project dependencies and checks if there are any known, publicly disclosed, vulnerabilities. This tool can be part of the solution to the OWASP Top 10 2013: A9 - Using Components with Known Vulnerabilities.

    The Gradle Plugin is still a work in progress. The core dependency-check functionality works; however, the configuration options available in the other plugins still need to be completed. For more information about the plugin, including usage, please see the github repo’s readme.

    -

    License

    +

    License

    Permission to modify and redistribute is granted under the terms of the Apache 2.0 license. See the LICENSE.txt file for the full license.

    Dependency-Check makes use of several other open source libraries. Please see the NOTICE.txt file for more information.

    @@ -152,15 +159,14 @@
    -

    Copyright © 2015 +

    Copyright © 2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-gradle/integration.html b/dependency-check-gradle/integration.html new file mode 100644 index 000000000..633ae8c89 --- /dev/null +++ b/dependency-check-gradle/integration.html @@ -0,0 +1,221 @@ + + + + + + + + + dependency-check-gradle – Continuous Integration + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +
    +

    Overview

    +

    This project uses Continuous Integration System.

    +
    +

    Access

    +

    The following is a link to the continuous integration system used by the project:

    +
    +
    +

    Notifiers

    +

    No notifiers are defined. Please check back at a later date.

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-gradle/issue-tracking.html b/dependency-check-gradle/issue-tracking.html index c954e7e40..a255de86d 100644 --- a/dependency-check-gradle/issue-tracking.html +++ b/dependency-check-gradle/issue-tracking.html @@ -1,21 +1,21 @@ - + - dependency-check-gradle - Issue Tracking - + dependency-check-gradle – Issue Tracking + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 0.0.5 + Version: 0.0.6
  • @@ -77,61 +77,75 @@
    -
    +
    -
    +
    -

    Overview

    +

    Overview

    This project uses github to manage its issues.

    -

    Issue Tracking

    +

    Issue Tracking

    Issues, bugs, and feature requests should be submitted to the following issue tracking system for this project.

    -
    +
    @@ -191,15 +204,14 @@
    -

    Copyright © 2015 +

    Copyright © 2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-gradle/js/apache-maven-fluido-1.4.min.js b/dependency-check-gradle/js/apache-maven-fluido-1.4.min.js new file mode 100644 index 000000000..0537c09d6 --- /dev/null +++ b/dependency-check-gradle/js/apache-maven-fluido-1.4.min.js @@ -0,0 +1,25 @@ +/*! + * jQuery JavaScript Library v1.11.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-17T15:27Z + */ +(function(b,a){if(typeof module==="object"&&typeof module.exports==="object"){module.exports=b.document?a(b,true):function(c){if(!c.document){throw new Error("jQuery requires a window with a document")}return a(c)}}else{a(b)}}(typeof window!=="undefined"?window:this,function(a5,av){var aP=[];var P=aP.slice;var az=aP.concat;var x=aP.push;var bU=aP.indexOf;var ac={};var y=ac.toString;var K=ac.hasOwnProperty;var D={};var ai="1.11.2",bI=function(e,i){return new bI.fn.init(e,i)},E=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bS=/^-ms-/,aW=/-([\da-z])/gi,O=function(e,i){return i.toUpperCase()};bI.fn=bI.prototype={jquery:ai,constructor:bI,selector:"",length:0,toArray:function(){return P.call(this)},get:function(e){return e!=null?(e<0?this[e+this.length]:this[e]):P.call(this)},pushStack:function(e){var i=bI.merge(this.constructor(),e);i.prevObject=this;i.context=this.context;return i},each:function(i,e){return bI.each(this,i,e)},map:function(e){return this.pushStack(bI.map(this,function(b7,b6){return e.call(b7,b6,b7)}))},slice:function(){return this.pushStack(P.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(b7){var e=this.length,b6=+b7+(b7<0?e:0);return this.pushStack(b6>=0&&b6=0},isEmptyObject:function(i){var e;for(e in i){return false}return true},isPlainObject:function(b7){var i;if(!b7||bI.type(b7)!=="object"||b7.nodeType||bI.isWindow(b7)){return false}try{if(b7.constructor&&!K.call(b7,"constructor")&&!K.call(b7.constructor.prototype,"isPrototypeOf")){return false}}catch(b6){return false}if(D.ownLast){for(i in b7){return K.call(b7,i)}}for(i in b7){}return i===undefined||K.call(b7,i)},type:function(e){if(e==null){return e+""}return typeof e==="object"||typeof e==="function"?ac[y.call(e)]||"object":typeof e},globalEval:function(e){if(e&&bI.trim(e)){(a5.execScript||function(i){a5["eval"].call(a5,i)})(e)}},camelCase:function(e){return e.replace(bS,"ms-").replace(aW,O)},nodeName:function(i,e){return i.nodeName&&i.nodeName.toLowerCase()===e.toLowerCase()},each:function(ca,cb,b6){var b9,b7=0,b8=ca.length,e=ad(ca);if(b6){if(e){for(;b70&&(i-1) in b6}var m= +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function(de){var cy,dh,cn,cH,cK,ci,cW,dg,dm,cI,cX,cZ,cC,co,c8,c3,df,ce,cF,da="sizzle"+1*new Date(),cJ=de.document,di=0,c4=0,b9=cA(),c9=cA(),cG=cA(),cE=function(i,e){if(i===e){cX=true}return 0},cQ=1<<31,cO=({}).hasOwnProperty,dc=[],dd=dc.pop,cM=dc.push,b7=dc.push,cm=dc.slice,cd=function(dq,dp){var dn=0,e=dq.length;for(;dn+~]|"+cp+")"+cp+"*"),ct=new RegExp("="+cp+"*([^\\]'\"]*?)"+cp+"*\\]","g"),cS=new RegExp(ck),cU=new RegExp("^"+cL+"$"),c2={ID:new RegExp("^#("+b6+")"),CLASS:new RegExp("^\\.("+b6+")"),TAG:new RegExp("^("+b6.replace("w","w*")+")"),ATTR:new RegExp("^"+c6),PSEUDO:new RegExp("^"+ck),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+cp+"*(even|odd|(([+-]|)(\\d*)n|)"+cp+"*(?:([+-]|)"+cp+"*(\\d+)|))"+cp+"*\\)|)","i"),bool:new RegExp("^(?:"+b8+")$","i"),needsContext:new RegExp("^"+cp+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+cp+"*((?:-\\d)?\\d*)"+cp+"*\\)|)(?=[^-]|$)","i")},cc=/^(?:input|select|textarea|button)$/i,cl=/^h\d$/i,cP=/^[^{]+\{\s*\[native \w/,cR=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,c1=/[+~]/,cN=/'|\\/g,cs=new RegExp("\\\\([\\da-f]{1,6}"+cp+"?|("+cp+")|.)","ig"),c5=function(e,dp,i){var dn="0x"+dp-65536;return dn!==dn||i?dp:dn<0?String.fromCharCode(dn+65536):String.fromCharCode(dn>>10|55296,dn&1023|56320)},dl=function(){cZ()};try{b7.apply((dc=cm.call(cJ.childNodes)),cJ.childNodes);dc[cJ.childNodes.length].nodeType}catch(cD){b7={apply:dc.length?function(i,e){cM.apply(i,cm.call(e))}:function(dq,dp){var e=dq.length,dn=0;while((dq[e++]=dp[dn++])){}dq.length=e-1}}}function cw(dv,dn,dz,dB){var dA,ds,dt,dx,dy,dr,dq,e,dp,dw;if((dn?dn.ownerDocument||dn:cJ)!==cC){cZ(dn)}dn=dn||cC;dz=dz||[];dx=dn.nodeType;if(typeof dv!=="string"||!dv||dx!==1&&dx!==9&&dx!==11){return dz}if(!dB&&c8){if(dx!==11&&(dA=cR.exec(dv))){if((dt=dA[1])){if(dx===9){ds=dn.getElementById(dt);if(ds&&ds.parentNode){if(ds.id===dt){dz.push(ds);return dz}}else{return dz}}else{if(dn.ownerDocument&&(ds=dn.ownerDocument.getElementById(dt))&&cF(dn,ds)&&ds.id===dt){dz.push(ds);return dz}}}else{if(dA[2]){b7.apply(dz,dn.getElementsByTagName(dv));return dz}else{if((dt=dA[3])&&dh.getElementsByClassName){b7.apply(dz,dn.getElementsByClassName(dt));return dz}}}}if(dh.qsa&&(!c3||!c3.test(dv))){e=dq=da;dp=dn;dw=dx!==1&&dv;if(dx===1&&dn.nodeName.toLowerCase()!=="object"){dr=ci(dv);if((dq=dn.getAttribute("id"))){e=dq.replace(cN,"\\$&")}else{dn.setAttribute("id",e)}e="[id='"+e+"'] ";dy=dr.length;while(dy--){dr[dy]=e+ch(dr[dy])}dp=c1.test(dv)&&cT(dn.parentNode)||dn;dw=dr.join(",")}if(dw){try{b7.apply(dz,dp.querySelectorAll(dw));return dz}catch(du){}finally{if(!dq){dn.removeAttribute("id")}}}}}return dg(dv.replace(cr,"$1"),dn,dz,dB)}function cA(){var i=[];function e(dn,dp){if(i.push(dn+" ")>cn.cacheLength){delete e[i.shift()]}return(e[dn+" "]=dp)}return e}function cj(e){e[da]=true;return e}function cf(i){var dp=cC.createElement("div");try{return !!i(dp)}catch(dn){return false}finally{if(dp.parentNode){dp.parentNode.removeChild(dp)}dp=null}}function dj(dn,dq){var e=dn.split("|"),dp=dn.length;while(dp--){cn.attrHandle[e[dp]]=dq}}function ca(i,e){var dp=e&&i,dn=dp&&i.nodeType===1&&e.nodeType===1&&(~e.sourceIndex||cQ)-(~i.sourceIndex||cQ);if(dn){return dn}if(dp){while((dp=dp.nextSibling)){if(dp===e){return -1}}}return i?1:-1}function cx(e){return function(dn){var i=dn.nodeName.toLowerCase();return i==="input"&&dn.type===e}}function cb(e){return function(dn){var i=dn.nodeName.toLowerCase();return(i==="input"||i==="button")&&dn.type===e}}function c7(e){return cj(function(i){i=+i;return cj(function(dn,ds){var dq,dp=e([],dn.length,i),dr=dp.length;while(dr--){if(dn[(dq=dp[dr])]){dn[dq]=!(ds[dq]=dn[dq])}}})})}function cT(e){return e&&typeof e.getElementsByTagName!=="undefined"&&e}dh=cw.support={};cK=cw.isXML=function(e){var i=e&&(e.ownerDocument||e).documentElement;return i?i.nodeName!=="HTML":false};cZ=cw.setDocument=function(dn){var e,i,dp=dn?dn.ownerDocument||dn:cJ;if(dp===cC||dp.nodeType!==9||!dp.documentElement){return cC}cC=dp;co=dp.documentElement;i=dp.defaultView;if(i&&i!==i.top){if(i.addEventListener){i.addEventListener("unload",dl,false)}else{if(i.attachEvent){i.attachEvent("onunload",dl)}}}c8=!cK(dp);dh.attributes=cf(function(dq){dq.className="i";return !dq.getAttribute("className")});dh.getElementsByTagName=cf(function(dq){dq.appendChild(dp.createComment(""));return !dq.getElementsByTagName("*").length});dh.getElementsByClassName=cP.test(dp.getElementsByClassName);dh.getById=cf(function(dq){co.appendChild(dq).id=da;return !dp.getElementsByName||!dp.getElementsByName(da).length});if(dh.getById){cn.find.ID=function(ds,dr){if(typeof dr.getElementById!=="undefined"&&c8){var dq=dr.getElementById(ds);return dq&&dq.parentNode?[dq]:[]}};cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(ds){return ds.getAttribute("id")===dq}}}else{delete cn.find.ID;cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(dt){var ds=typeof dt.getAttributeNode!=="undefined"&&dt.getAttributeNode("id");return ds&&ds.value===dq}}}cn.find.TAG=dh.getElementsByTagName?function(dq,dr){if(typeof dr.getElementsByTagName!=="undefined"){return dr.getElementsByTagName(dq)}else{if(dh.qsa){return dr.querySelectorAll(dq)}}}:function(dq,du){var dv,dt=[],ds=0,dr=du.getElementsByTagName(dq);if(dq==="*"){while((dv=dr[ds++])){if(dv.nodeType===1){dt.push(dv)}}return dt}return dr};cn.find.CLASS=dh.getElementsByClassName&&function(dr,dq){if(c8){return dq.getElementsByClassName(dr)}};df=[];c3=[];if((dh.qsa=cP.test(dp.querySelectorAll))){cf(function(dq){co.appendChild(dq).innerHTML="";if(dq.querySelectorAll("[msallowcapture^='']").length){c3.push("[*^$]="+cp+"*(?:''|\"\")")}if(!dq.querySelectorAll("[selected]").length){c3.push("\\["+cp+"*(?:value|"+b8+")")}if(!dq.querySelectorAll("[id~="+da+"-]").length){c3.push("~=")}if(!dq.querySelectorAll(":checked").length){c3.push(":checked")}if(!dq.querySelectorAll("a#"+da+"+*").length){c3.push(".#.+[+~]")}});cf(function(dr){var dq=dp.createElement("input");dq.setAttribute("type","hidden");dr.appendChild(dq).setAttribute("name","D");if(dr.querySelectorAll("[name=d]").length){c3.push("name"+cp+"*[*^$|!~]?=")}if(!dr.querySelectorAll(":enabled").length){c3.push(":enabled",":disabled")}dr.querySelectorAll("*,:x");c3.push(",.*:")})}if((dh.matchesSelector=cP.test((ce=co.matches||co.webkitMatchesSelector||co.mozMatchesSelector||co.oMatchesSelector||co.msMatchesSelector)))){cf(function(dq){dh.disconnectedMatch=ce.call(dq,"div");ce.call(dq,"[s!='']:x");df.push("!=",ck)})}c3=c3.length&&new RegExp(c3.join("|"));df=df.length&&new RegExp(df.join("|"));e=cP.test(co.compareDocumentPosition);cF=e||cP.test(co.contains)?function(dr,dq){var dt=dr.nodeType===9?dr.documentElement:dr,ds=dq&&dq.parentNode;return dr===ds||!!(ds&&ds.nodeType===1&&(dt.contains?dt.contains(ds):dr.compareDocumentPosition&&dr.compareDocumentPosition(ds)&16))}:function(dr,dq){if(dq){while((dq=dq.parentNode)){if(dq===dr){return true}}}return false};cE=e?function(dr,dq){if(dr===dq){cX=true;return 0}var ds=!dr.compareDocumentPosition-!dq.compareDocumentPosition;if(ds){return ds}ds=(dr.ownerDocument||dr)===(dq.ownerDocument||dq)?dr.compareDocumentPosition(dq):1;if(ds&1||(!dh.sortDetached&&dq.compareDocumentPosition(dr)===ds)){if(dr===dp||dr.ownerDocument===cJ&&cF(cJ,dr)){return -1}if(dq===dp||dq.ownerDocument===cJ&&cF(cJ,dq)){return 1}return cI?(cd(cI,dr)-cd(cI,dq)):0}return ds&4?-1:1}:function(dr,dq){if(dr===dq){cX=true;return 0}var dx,du=0,dw=dr.parentNode,dt=dq.parentNode,ds=[dr],dv=[dq];if(!dw||!dt){return dr===dp?-1:dq===dp?1:dw?-1:dt?1:cI?(cd(cI,dr)-cd(cI,dq)):0}else{if(dw===dt){return ca(dr,dq)}}dx=dr;while((dx=dx.parentNode)){ds.unshift(dx)}dx=dq;while((dx=dx.parentNode)){dv.unshift(dx)}while(ds[du]===dv[du]){du++}return du?ca(ds[du],dv[du]):ds[du]===cJ?-1:dv[du]===cJ?1:0};return dp};cw.matches=function(i,e){return cw(i,null,null,e)};cw.matchesSelector=function(dn,dq){if((dn.ownerDocument||dn)!==cC){cZ(dn)}dq=dq.replace(ct,"='$1']");if(dh.matchesSelector&&c8&&(!df||!df.test(dq))&&(!c3||!c3.test(dq))){try{var i=ce.call(dn,dq);if(i||dh.disconnectedMatch||dn.document&&dn.document.nodeType!==11){return i}}catch(dp){}}return cw(dq,cC,null,[dn]).length>0};cw.contains=function(e,i){if((e.ownerDocument||e)!==cC){cZ(e)}return cF(e,i)};cw.attr=function(dn,e){if((dn.ownerDocument||dn)!==cC){cZ(dn)}var i=cn.attrHandle[e.toLowerCase()],dp=i&&cO.call(cn.attrHandle,e.toLowerCase())?i(dn,e,!c8):undefined;return dp!==undefined?dp:dh.attributes||!c8?dn.getAttribute(e):(dp=dn.getAttributeNode(e))&&dp.specified?dp.value:null};cw.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};cw.uniqueSort=function(dp){var dq,dr=[],e=0,dn=0;cX=!dh.detectDuplicates;cI=!dh.sortStable&&dp.slice(0);dp.sort(cE);if(cX){while((dq=dp[dn++])){if(dq===dp[dn]){e=dr.push(dn)}}while(e--){dp.splice(dr[e],1)}}cI=null;return dp};cH=cw.getText=function(dr){var dq,dn="",dp=0,e=dr.nodeType;if(!e){while((dq=dr[dp++])){dn+=cH(dq)}}else{if(e===1||e===9||e===11){if(typeof dr.textContent==="string"){return dr.textContent}else{for(dr=dr.firstChild;dr;dr=dr.nextSibling){dn+=cH(dr)}}}else{if(e===3||e===4){return dr.nodeValue}}}return dn};cn=cw.selectors={cacheLength:50,createPseudo:cj,match:c2,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){e[1]=e[1].replace(cs,c5);e[3]=(e[3]||e[4]||e[5]||"").replace(cs,c5);if(e[2]==="~="){e[3]=" "+e[3]+" "}return e.slice(0,4)},CHILD:function(e){e[1]=e[1].toLowerCase();if(e[1].slice(0,3)==="nth"){if(!e[3]){cw.error(e[0])}e[4]=+(e[4]?e[5]+(e[6]||1):2*(e[3]==="even"||e[3]==="odd"));e[5]=+((e[7]+e[8])||e[3]==="odd")}else{if(e[3]){cw.error(e[0])}}return e},PSEUDO:function(i){var e,dn=!i[6]&&i[2];if(c2.CHILD.test(i[0])){return null}if(i[3]){i[2]=i[4]||i[5]||""}else{if(dn&&cS.test(dn)&&(e=ci(dn,true))&&(e=dn.indexOf(")",dn.length-e)-dn.length)){i[0]=i[0].slice(0,e);i[2]=dn.slice(0,e)}}return i.slice(0,3)}},filter:{TAG:function(i){var e=i.replace(cs,c5).toLowerCase();return i==="*"?function(){return true}:function(dn){return dn.nodeName&&dn.nodeName.toLowerCase()===e}},CLASS:function(e){var i=b9[e+" "];return i||(i=new RegExp("(^|"+cp+")"+e+"("+cp+"|$)"))&&b9(e,function(dn){return i.test(typeof dn.className==="string"&&dn.className||typeof dn.getAttribute!=="undefined"&&dn.getAttribute("class")||"")})},ATTR:function(dn,i,e){return function(dq){var dp=cw.attr(dq,dn);if(dp==null){return i==="!="}if(!i){return true}dp+="";return i==="="?dp===e:i==="!="?dp!==e:i==="^="?e&&dp.indexOf(e)===0:i==="*="?e&&dp.indexOf(e)>-1:i==="$="?e&&dp.slice(-e.length)===e:i==="~="?(" "+dp.replace(cu," ")+" ").indexOf(e)>-1:i==="|="?dp===e||dp.slice(0,e.length+1)===e+"-":false}},CHILD:function(i,dq,dp,dr,dn){var dt=i.slice(0,3)!=="nth",e=i.slice(-4)!=="last",ds=dq==="of-type";return dr===1&&dn===0?function(du){return !!du.parentNode}:function(dA,dy,dD){var du,dG,dB,dF,dC,dx,dz=dt!==e?"nextSibling":"previousSibling",dE=dA.parentNode,dw=ds&&dA.nodeName.toLowerCase(),dv=!dD&&!ds;if(dE){if(dt){while(dz){dB=dA;while((dB=dB[dz])){if(ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1){return false}}dx=dz=i==="only"&&!dx&&"nextSibling"}return true}dx=[e?dE.firstChild:dE.lastChild];if(e&&dv){dG=dE[da]||(dE[da]={});du=dG[i]||[];dC=du[0]===di&&du[1];dF=du[0]===di&&du[2];dB=dC&&dE.childNodes[dC];while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if(dB.nodeType===1&&++dF&&dB===dA){dG[i]=[di,dC,dF];break}}}else{if(dv&&(du=(dA[da]||(dA[da]={}))[i])&&du[0]===di){dF=du[1]}else{while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if((ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1)&&++dF){if(dv){(dB[da]||(dB[da]={}))[i]=[di,dF]}if(dB===dA){break}}}}}dF-=dn;return dF===dr||(dF%dr===0&&dF/dr>=0)}}},PSEUDO:function(dp,dn){var e,i=cn.pseudos[dp]||cn.setFilters[dp.toLowerCase()]||cw.error("unsupported pseudo: "+dp);if(i[da]){return i(dn)}if(i.length>1){e=[dp,dp,"",dn];return cn.setFilters.hasOwnProperty(dp.toLowerCase())?cj(function(ds,du){var dr,dq=i(ds,dn),dt=dq.length;while(dt--){dr=cd(ds,dq[dt]);ds[dr]=!(du[dr]=dq[dt])}}):function(dq){return i(dq,0,e)}}return i}},pseudos:{not:cj(function(e){var i=[],dn=[],dp=cW(e.replace(cr,"$1"));return dp[da]?cj(function(dr,dw,du,ds){var dv,dq=dp(dr,null,ds,[]),dt=dr.length;while(dt--){if((dv=dq[dt])){dr[dt]=!(dw[dt]=dv)}}}):function(ds,dr,dq){i[0]=ds;dp(i,null,dq,dn);i[0]=null;return !dn.pop()}}),has:cj(function(e){return function(i){return cw(e,i).length>0}}),contains:cj(function(e){e=e.replace(cs,c5);return function(i){return(i.textContent||i.innerText||cH(i)).indexOf(e)>-1}}),lang:cj(function(e){if(!cU.test(e||"")){cw.error("unsupported lang: "+e)}e=e.replace(cs,c5).toLowerCase();return function(dn){var i;do{if((i=c8?dn.lang:dn.getAttribute("xml:lang")||dn.getAttribute("lang"))){i=i.toLowerCase();return i===e||i.indexOf(e+"-")===0}}while((dn=dn.parentNode)&&dn.nodeType===1);return false}}),target:function(e){var i=de.location&&de.location.hash;return i&&i.slice(1)===e.id},root:function(e){return e===co},focus:function(e){return e===cC.activeElement&&(!cC.hasFocus||cC.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===false},disabled:function(e){return e.disabled===true},checked:function(e){var i=e.nodeName.toLowerCase();return(i==="input"&&!!e.checked)||(i==="option"&&!!e.selected)},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling){if(e.nodeType<6){return false}}return true},parent:function(e){return !cn.pseudos.empty(e)},header:function(e){return cl.test(e.nodeName)},input:function(e){return cc.test(e.nodeName)},button:function(i){var e=i.nodeName.toLowerCase();return e==="input"&&i.type==="button"||e==="button"},text:function(i){var e;return i.nodeName.toLowerCase()==="input"&&i.type==="text"&&((e=i.getAttribute("type"))==null||e.toLowerCase()==="text")},first:c7(function(){return[0]}),last:c7(function(e,i){return[i-1]}),eq:c7(function(e,dn,i){return[i<0?i+dn:i]}),even:c7(function(e,dp){var dn=0;for(;dn=0;){e.push(dn)}return e}),gt:c7(function(e,dq,dp){var dn=dp<0?dp+dq:dp;for(;++dn1?function(dr,dq,dn){var dp=e.length;while(dp--){if(!e[dp](dr,dq,dn)){return false}}return true}:e[0]}function cz(dn,dr,dq){var dp=0,e=dr.length;for(;dp-1){dC[dE]=!(dz[dE]=dw)}}}}else{dy=c0(dy===dz?dy.splice(dt,dy.length):dy);if(dr){dr(null,dz,dy,dB)}else{b7.apply(dz,dy)}}})}function db(dt){var dn,dr,dp,ds=dt.length,dw=cn.relative[dt[0].type],dx=dw||cn.relative[" "],dq=dw?1:0,du=cq(function(i){return i===dn},dx,true),dv=cq(function(i){return cd(dn,i)>-1},dx,true),e=[function(dA,dz,dy){var i=(!dw&&(dy||dz!==dm))||((dn=dz).nodeType?du(dA,dz,dy):dv(dA,dz,dy));dn=null;return i}];for(;dq1&&dk(e),dq>1&&ch(dt.slice(0,dq-1).concat({value:dt[dq-2].type===" "?"*":""})).replace(cr,"$1"),dr,dq0,dq=dp.length>0,i=function(dA,du,dz,dy,dD){var dv,dw,dB,dF=0,dx="0",dr=dA&&[],dG=[],dE=dm,dt=dA||dq&&cn.find.TAG("*",dD),ds=(di+=dE==null?1:Math.random()||0.1),dC=dt.length;if(dD){dm=du!==cC&&du}for(;dx!==dC&&(dv=dt[dx])!=null;dx++){if(dq&&dv){dw=0;while((dB=dp[dw++])){if(dB(dv,du,dz)){dy.push(dv);break}}if(dD){di=ds}}if(e){if((dv=!dB&&dv)){dF--}if(dA){dr.push(dv)}}}dF+=dx;if(e&&dx!==dF){dw=0;while((dB=dn[dw++])){dB(dr,dG,du,dz)}if(dA){if(dF>0){while(dx--){if(!(dr[dx]||dG[dx])){dG[dx]=dd.call(dy)}}}dG=c0(dG)}b7.apply(dy,dG);if(dD&&!dA&&dG.length>0&&(dF+dn.length)>1){cw.uniqueSort(dy)}}if(dD){di=ds;dm=dE}return dr};return e?cj(i):i}cW=cw.compile=function(e,dp){var dq,dn=[],ds=[],dr=cG[e+" "];if(!dr){if(!dp){dp=ci(e)}dq=dp.length;while(dq--){dr=db(dp[dq]);if(dr[da]){dn.push(dr)}else{ds.push(dr)}}dr=cG(e,cY(ds,dn));dr.selector=e}return dr};dg=cw.select=function(dp,e,dq,dt){var dr,dw,dn,dx,du,dv=typeof dp==="function"&&dp,ds=!dt&&ci((dp=dv.selector||dp));dq=dq||[];if(ds.length===1){dw=ds[0]=ds[0].slice(0);if(dw.length>2&&(dn=dw[0]).type==="ID"&&dh.getById&&e.nodeType===9&&c8&&cn.relative[dw[1].type]){e=(cn.find.ID(dn.matches[0].replace(cs,c5),e)||[])[0];if(!e){return dq}else{if(dv){e=e.parentNode}}dp=dp.slice(dw.shift().value.length)}dr=c2.needsContext.test(dp)?0:dw.length;while(dr--){dn=dw[dr];if(cn.relative[(dx=dn.type)]){break}if((du=cn.find[dx])){if((dt=du(dn.matches[0].replace(cs,c5),c1.test(dw[0].type)&&cT(e.parentNode)||e))){dw.splice(dr,1);dp=dt.length&&ch(dw);if(!dp){b7.apply(dq,dt);return dq}break}}}}(dv||cW(dp,ds))(dt,e,!c8,dq,c1.test(dp)&&cT(e.parentNode)||e);return dq};dh.sortStable=da.split("").sort(cE).join("")===da;dh.detectDuplicates=!!cX;cZ();dh.sortDetached=cf(function(e){return e.compareDocumentPosition(cC.createElement("div"))&1});if(!cf(function(e){e.innerHTML="";return e.firstChild.getAttribute("href")==="#"})){dj("type|href|height|width",function(i,e,dn){if(!dn){return i.getAttribute(e,e.toLowerCase()==="type"?1:2)}})}if(!dh.attributes||!cf(function(e){e.innerHTML="";e.firstChild.setAttribute("value","");return e.firstChild.getAttribute("value")===""})){dj("value",function(i,e,dn){if(!dn&&i.nodeName.toLowerCase()==="input"){return i.defaultValue}})}if(!cf(function(e){return e.getAttribute("disabled")==null})){dj(b8,function(i,e,dp){var dn;if(!dp){return i[e]===true?e.toLowerCase():(dn=i.getAttributeNode(e))&&dn.specified?dn.value:null}})}return cw})(a5);bI.find=m;bI.expr=m.selectors;bI.expr[":"]=bI.expr.pseudos;bI.unique=m.uniqueSort;bI.text=m.getText;bI.isXMLDoc=m.isXML;bI.contains=m.contains;var A=bI.expr.match.needsContext;var a=(/^<(\w+)\s*\/?>(?:<\/\1>|)$/);var aL=/^.[^:#\[\.,]*$/;function aR(b6,e,i){if(bI.isFunction(e)){return bI.grep(b6,function(b8,b7){return !!e.call(b8,b7,b8)!==i})}if(e.nodeType){return bI.grep(b6,function(b7){return(b7===e)!==i})}if(typeof e==="string"){if(aL.test(e)){return bI.filter(e,b6,i)}e=bI.filter(e,b6)}return bI.grep(b6,function(b7){return(bI.inArray(b7,e)>=0)!==i})}bI.filter=function(b7,e,b6){var i=e[0];if(b6){b7=":not("+b7+")"}return e.length===1&&i.nodeType===1?bI.find.matchesSelector(i,b7)?[i]:[]:bI.find.matches(b7,bI.grep(e,function(b8){return b8.nodeType===1}))};bI.fn.extend({find:function(b6){var b9,b8=[],b7=this,e=b7.length;if(typeof b6!=="string"){return this.pushStack(bI(b6).filter(function(){for(b9=0;b91?bI.unique(b8):b8);b8.selector=this.selector?this.selector+" "+b6:b6;return b8},filter:function(e){return this.pushStack(aR(this,e||[],false))},not:function(e){return this.pushStack(aR(this,e||[],true))},is:function(e){return !!aR(this,typeof e==="string"&&A.test(e)?bI(e):e||[],false).length}});var z,n=a5.document,bt=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,bV=bI.fn.init=function(e,b6){var i,b7;if(!e){return this}if(typeof e==="string"){if(e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3){i=[null,e,null]}else{i=bt.exec(e)}if(i&&(i[1]||!b6)){if(i[1]){b6=b6 instanceof bI?b6[0]:b6;bI.merge(this,bI.parseHTML(i[1],b6&&b6.nodeType?b6.ownerDocument||b6:n,true));if(a.test(i[1])&&bI.isPlainObject(b6)){for(i in b6){if(bI.isFunction(this[i])){this[i](b6[i])}else{this.attr(i,b6[i])}}}return this}else{b7=n.getElementById(i[2]);if(b7&&b7.parentNode){if(b7.id!==i[2]){return z.find(e)}this.length=1;this[0]=b7}this.context=n;this.selector=e;return this}}else{if(!b6||b6.jquery){return(b6||z).find(e)}else{return this.constructor(b6).find(e)}}}else{if(e.nodeType){this.context=this[0]=e;this.length=1;return this}else{if(bI.isFunction(e)){return typeof z.ready!=="undefined"?z.ready(e):e(bI)}}}if(e.selector!==undefined){this.selector=e.selector;this.context=e.context}return bI.makeArray(e,this)};bV.prototype=bI.fn;z=bI(n);var bv=/^(?:parents|prev(?:Until|All))/,bz={children:true,contents:true,next:true,prev:true};bI.extend({dir:function(b6,i,b8){var e=[],b7=b6[i];while(b7&&b7.nodeType!==9&&(b8===undefined||b7.nodeType!==1||!bI(b7).is(b8))){if(b7.nodeType===1){e.push(b7)}b7=b7[i]}return e},sibling:function(b6,i){var e=[];for(;b6;b6=b6.nextSibling){if(b6.nodeType===1&&b6!==i){e.push(b6)}}return e}});bI.fn.extend({has:function(b8){var b7,b6=bI(b8,this),e=b6.length;return this.filter(function(){for(b7=0;b7-1:ca.nodeType===1&&bI.find.matchesSelector(ca,b9))){e.push(ca);break}}}return this.pushStack(e.length>1?bI.unique(e):e)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.first().prevAll().length:-1}if(typeof e==="string"){return bI.inArray(this[0],bI(e))}return bI.inArray(e.jquery?e[0]:e,this)},add:function(e,i){return this.pushStack(bI.unique(bI.merge(this.get(),bI(e,i))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}});function aY(i,e){do{i=i[e]}while(i&&i.nodeType!==1);return i}bI.each({parent:function(i){var e=i.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return bI.dir(e,"parentNode")},parentsUntil:function(b6,e,b7){return bI.dir(b6,"parentNode",b7)},next:function(e){return aY(e,"nextSibling")},prev:function(e){return aY(e,"previousSibling")},nextAll:function(e){return bI.dir(e,"nextSibling")},prevAll:function(e){return bI.dir(e,"previousSibling")},nextUntil:function(b6,e,b7){return bI.dir(b6,"nextSibling",b7)},prevUntil:function(b6,e,b7){return bI.dir(b6,"previousSibling",b7)},siblings:function(e){return bI.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return bI.sibling(e.firstChild)},contents:function(e){return bI.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:bI.merge([],e.childNodes)}},function(e,i){bI.fn[e]=function(b8,b6){var b7=bI.map(this,i,b8);if(e.slice(-5)!=="Until"){b6=b8}if(b6&&typeof b6==="string"){b7=bI.filter(b6,b7)}if(this.length>1){if(!bz[e]){b7=bI.unique(b7)}if(bv.test(e)){b7=b7.reverse()}}return this.pushStack(b7)}});var aF=(/\S+/g);var b2={};function af(i){var e=b2[i]={};bI.each(i.match(aF)||[],function(b7,b6){e[b6]=true});return e}bI.Callbacks=function(ce){ce=typeof ce==="string"?(b2[ce]||af(ce)):bI.extend({},ce);var b8,b7,e,b9,ca,b6,cb=[],cc=!ce.once&&[],i=function(cf){b7=ce.memory&&cf;e=true;ca=b6||0;b6=0;b9=cb.length;b8=true;for(;cb&&ca-1){cb.splice(cg,1);if(b8){if(cg<=b9){b9--}if(cg<=ca){ca--}}}})}return this},has:function(cf){return cf?bI.inArray(cf,cb)>-1:!!(cb&&cb.length)},empty:function(){cb=[];b9=0;return this},disable:function(){cb=cc=b7=undefined;return this},disabled:function(){return !cb},lock:function(){cc=undefined;if(!b7){cd.disable()}return this},locked:function(){return !cc},fireWith:function(cg,cf){if(cb&&(!e||cc)){cf=cf||[];cf=[cg,cf.slice?cf.slice():cf];if(b8){cc.push(cf)}else{i(cf)}}return this},fire:function(){cd.fireWith(this,arguments);return this},fired:function(){return !!e}};return cd};bI.extend({Deferred:function(b6){var i=[["resolve","done",bI.Callbacks("once memory"),"resolved"],["reject","fail",bI.Callbacks("once memory"),"rejected"],["notify","progress",bI.Callbacks("memory")]],b7="pending",b8={state:function(){return b7},always:function(){e.done(arguments).fail(arguments);return this},then:function(){var b9=arguments;return bI.Deferred(function(ca){bI.each(i,function(cc,cb){var cd=bI.isFunction(b9[cc])&&b9[cc];e[cb[1]](function(){var ce=cd&&cd.apply(this,arguments);if(ce&&bI.isFunction(ce.promise)){ce.promise().done(ca.resolve).fail(ca.reject).progress(ca.notify)}else{ca[cb[0]+"With"](this===b8?ca.promise():this,cd?[ce]:arguments)}})});b9=null}).promise()},promise:function(b9){return b9!=null?bI.extend(b9,b8):b8}},e={};b8.pipe=b8.then;bI.each(i,function(ca,b9){var cc=b9[2],cb=b9[3];b8[b9[1]]=cc.add;if(cb){cc.add(function(){b7=cb},i[ca^1][2].disable,i[2][2].lock)}e[b9[0]]=function(){e[b9[0]+"With"](this===e?b8:this,arguments);return this};e[b9[0]+"With"]=cc.fireWith});b8.promise(e);if(b6){b6.call(e,e)}return e},when:function(b9){var b7=0,cb=P.call(arguments),e=cb.length,b6=e!==1||(b9&&bI.isFunction(b9.promise))?e:0,ce=b6===1?b9:bI.Deferred(),b8=function(cg,ch,cf){return function(i){ch[cg]=this;cf[cg]=arguments.length>1?P.call(arguments):i;if(cf===cd){ce.notifyWith(ch,cf)}else{if(!(--b6)){ce.resolveWith(ch,cf)}}}},cd,ca,cc;if(e>1){cd=new Array(e);ca=new Array(e);cc=new Array(e);for(;b70){return}ak.resolveWith(n,[bI]);if(bI.fn.triggerHandler){bI(n).triggerHandler("ready");bI(n).off("ready")}}});function bm(){if(n.addEventListener){n.removeEventListener("DOMContentLoaded",bZ,false);a5.removeEventListener("load",bZ,false)}else{n.detachEvent("onreadystatechange",bZ);a5.detachEvent("onload",bZ)}}function bZ(){if(n.addEventListener||event.type==="load"||n.readyState==="complete"){bm();bI.ready()}}bI.ready.promise=function(b8){if(!ak){ak=bI.Deferred();if(n.readyState==="complete"){setTimeout(bI.ready)}else{if(n.addEventListener){n.addEventListener("DOMContentLoaded",bZ,false);a5.addEventListener("load",bZ,false)}else{n.attachEvent("onreadystatechange",bZ);a5.attachEvent("onload",bZ);var b7=false;try{b7=a5.frameElement==null&&n.documentElement}catch(b6){}if(b7&&b7.doScroll){(function i(){if(!bI.isReady){try{b7.doScroll("left")}catch(b9){return setTimeout(i,50)}bm();bI.ready()}})()}}}}return ak.promise(b8)};var aC=typeof undefined;var bh;for(bh in bI(D)){break}D.ownLast=bh!=="0";D.inlineBlockNeedsLayout=false;bI(function(){var b6,b7,e,i;e=n.getElementsByTagName("body")[0];if(!e||!e.style){return}b7=n.createElement("div");i=n.createElement("div");i.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";e.appendChild(i).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";D.inlineBlockNeedsLayout=b6=b7.offsetWidth===3;if(b6){e.style.zoom=1}}e.removeChild(i)});(function(){var b6=n.createElement("div");if(D.deleteExpando==null){D.deleteExpando=true;try{delete b6.test}catch(i){D.deleteExpando=false}}b6=null})();bI.acceptData=function(b6){var i=bI.noData[(b6.nodeName+" ").toLowerCase()],e=+b6.nodeType||1;return e!==1&&e!==9?false:!i||i!==true&&b6.getAttribute("classid")===i};var by=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,aQ=/([A-Z])/g;function bA(b7,b6,b8){if(b8===undefined&&b7.nodeType===1){var i="data-"+b6.replace(aQ,"-$1").toLowerCase();b8=b7.getAttribute(i);if(typeof b8==="string"){try{b8=b8==="true"?true:b8==="false"?false:b8==="null"?null:+b8+""===b8?+b8:by.test(b8)?bI.parseJSON(b8):b8}catch(b9){}bI.data(b7,b6,b8)}else{b8=undefined}}return b8}function Q(i){var e;for(e in i){if(e==="data"&&bI.isEmptyObject(i[e])){continue}if(e!=="toJSON"){return false}}return true}function bc(b7,i,b9,b8){if(!bI.acceptData(b7)){return}var cb,ca,cc=bI.expando,cd=b7.nodeType,e=cd?bI.cache:b7,b6=cd?b7[cc]:b7[cc]&&cc;if((!b6||!e[b6]||(!b8&&!e[b6].data))&&b9===undefined&&typeof i==="string"){return}if(!b6){if(cd){b6=b7[cc]=aP.pop()||bI.guid++}else{b6=cc}}if(!e[b6]){e[b6]=cd?{}:{toJSON:bI.noop}}if(typeof i==="object"||typeof i==="function"){if(b8){e[b6]=bI.extend(e[b6],i)}else{e[b6].data=bI.extend(e[b6].data,i)}}ca=e[b6];if(!b8){if(!ca.data){ca.data={}}ca=ca.data}if(b9!==undefined){ca[bI.camelCase(i)]=b9}if(typeof i==="string"){cb=ca[i];if(cb==null){cb=ca[bI.camelCase(i)]}}else{cb=ca}return cb}function ab(b9,b7,e){if(!bI.acceptData(b9)){return}var cb,b8,ca=b9.nodeType,b6=ca?bI.cache:b9,cc=ca?b9[bI.expando]:bI.expando;if(!b6[cc]){return}if(b7){cb=e?b6[cc]:b6[cc].data;if(cb){if(!bI.isArray(b7)){if(b7 in cb){b7=[b7]}else{b7=bI.camelCase(b7);if(b7 in cb){b7=[b7]}else{b7=b7.split(" ")}}}else{b7=b7.concat(bI.map(b7,bI.camelCase))}b8=b7.length;while(b8--){delete cb[b7[b8]]}if(e?!Q(cb):!bI.isEmptyObject(cb)){return}}}if(!e){delete b6[cc].data;if(!Q(b6[cc])){return}}if(ca){bI.cleanData([b9],true)}else{if(D.deleteExpando||b6!=b6.window){delete b6[cc]}else{b6[cc]=null}}}bI.extend({cache:{},noData:{"applet ":true,"embed ":true,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){e=e.nodeType?bI.cache[e[bI.expando]]:e[bI.expando];return !!e&&!Q(e)},data:function(i,e,b6){return bc(i,e,b6)},removeData:function(i,e){return ab(i,e)},_data:function(i,e,b6){return bc(i,e,b6,true)},_removeData:function(i,e){return ab(i,e,true)}});bI.fn.extend({data:function(b8,cb){var b7,b6,ca,b9=this[0],e=b9&&b9.attributes;if(b8===undefined){if(this.length){ca=bI.data(b9);if(b9.nodeType===1&&!bI._data(b9,"parsedAttrs")){b7=e.length;while(b7--){if(e[b7]){b6=e[b7].name;if(b6.indexOf("data-")===0){b6=bI.camelCase(b6.slice(5));bA(b9,b6,ca[b6])}}}bI._data(b9,"parsedAttrs",true)}}return ca}if(typeof b8==="object"){return this.each(function(){bI.data(this,b8)})}return arguments.length>1?this.each(function(){bI.data(this,b8,cb)}):b9?bA(b9,b8,bI.data(b9,b8)):undefined},removeData:function(e){return this.each(function(){bI.removeData(this,e)})}});bI.extend({queue:function(b6,i,b7){var e;if(b6){i=(i||"fx")+"queue";e=bI._data(b6,i);if(b7){if(!e||bI.isArray(b7)){e=bI._data(b6,i,bI.makeArray(b7))}else{e.push(b7)}}return e||[]}},dequeue:function(b9,b8){b8=b8||"fx";var i=bI.queue(b9,b8),ca=i.length,b7=i.shift(),e=bI._queueHooks(b9,b8),b6=function(){bI.dequeue(b9,b8)};if(b7==="inprogress"){b7=i.shift();ca--}if(b7){if(b8==="fx"){i.unshift("inprogress")}delete e.stop;b7.call(b9,b6,e)}if(!ca&&e){e.empty.fire()}},_queueHooks:function(b6,i){var e=i+"queueHooks";return bI._data(b6,e)||bI._data(b6,e,{empty:bI.Callbacks("once memory").add(function(){bI._removeData(b6,i+"queue");bI._removeData(b6,e)})})}});bI.fn.extend({queue:function(e,i){var b6=2;if(typeof e!=="string"){i=e;e="fx";b6--}if(arguments.length
    a";D.leadingWhitespace=b8.firstChild.nodeType===3;D.tbody=!b8.getElementsByTagName("tbody").length;D.htmlSerialize=!!b8.getElementsByTagName("link").length;D.html5Clone=n.createElement("nav").cloneNode(true).outerHTML!=="<:nav>";i.type="checkbox";i.checked=true;b6.appendChild(i);D.appendChecked=i.checked;b8.innerHTML="";D.noCloneChecked=!!b8.cloneNode(true).lastChild.defaultValue;b6.appendChild(b8);b8.innerHTML="";D.checkClone=b8.cloneNode(true).cloneNode(true).lastChild.checked;D.noCloneEvent=true;if(b8.attachEvent){b8.attachEvent("onclick",function(){D.noCloneEvent=false});b8.cloneNode(true).click()}if(D.deleteExpando==null){D.deleteExpando=true;try{delete b8.test}catch(b7){D.deleteExpando=false}}})();(function(){var b6,e,b7=n.createElement("div");for(b6 in {submit:true,change:true,focusin:true}){e="on"+b6;if(!(D[b6+"Bubbles"]=e in a5)){b7.setAttribute(e,"t");D[b6+"Bubbles"]=b7.attributes[e].expando===false}}b7=null})();var bG=/^(?:input|select|textarea)$/i,a6=/^key/,bM=/^(?:mouse|pointer|contextmenu)|click/,bC=/^(?:focusinfocus|focusoutblur)$/,bx=/^([^.]*)(?:\.(.+)|)$/;function U(){return true}function Z(){return false}function am(){try{return n.activeElement}catch(e){}}bI.event={global:{},add:function(b8,cd,ci,ca,b9){var cb,cj,ck,b6,cf,cc,ch,b7,cg,e,i,ce=bI._data(b8);if(!ce){return}if(ci.handler){b6=ci;ci=b6.handler;b9=b6.selector}if(!ci.guid){ci.guid=bI.guid++}if(!(cj=ce.events)){cj=ce.events={}}if(!(cc=ce.handle)){cc=ce.handle=function(cl){return typeof bI!==aC&&(!cl||bI.event.triggered!==cl.type)?bI.event.dispatch.apply(cc.elem,arguments):undefined};cc.elem=b8}cd=(cd||"").match(aF)||[""];ck=cd.length;while(ck--){cb=bx.exec(cd[ck])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){continue}cf=bI.event.special[cg]||{};cg=(b9?cf.delegateType:cf.bindType)||cg;cf=bI.event.special[cg]||{};ch=bI.extend({type:cg,origType:i,data:ca,handler:ci,guid:ci.guid,selector:b9,needsContext:b9&&bI.expr.match.needsContext.test(b9),namespace:e.join(".")},b6);if(!(b7=cj[cg])){b7=cj[cg]=[];b7.delegateCount=0;if(!cf.setup||cf.setup.call(b8,ca,e,cc)===false){if(b8.addEventListener){b8.addEventListener(cg,cc,false)}else{if(b8.attachEvent){b8.attachEvent("on"+cg,cc)}}}}if(cf.add){cf.add.call(b8,ch);if(!ch.handler.guid){ch.handler.guid=ci.guid}}if(b9){b7.splice(b7.delegateCount++,0,ch)}else{b7.push(ch)}bI.event.global[cg]=true}b8=null},remove:function(b7,cd,ck,b8,cc){var ca,ch,cb,b9,cj,ci,cf,b6,cg,e,i,ce=bI.hasData(b7)&&bI._data(b7);if(!ce||!(ci=ce.events)){return}cd=(cd||"").match(aF)||[""];cj=cd.length;while(cj--){cb=bx.exec(cd[cj])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){for(cg in ci){bI.event.remove(b7,cg+cd[cj],ck,b8,true)}continue}cf=bI.event.special[cg]||{};cg=(b8?cf.delegateType:cf.bindType)||cg;b6=ci[cg]||[];cb=cb[2]&&new RegExp("(^|\\.)"+e.join("\\.(?:.*\\.|)")+"(\\.|$)");b9=ca=b6.length;while(ca--){ch=b6[ca];if((cc||i===ch.origType)&&(!ck||ck.guid===ch.guid)&&(!cb||cb.test(ch.namespace))&&(!b8||b8===ch.selector||b8==="**"&&ch.selector)){b6.splice(ca,1);if(ch.selector){b6.delegateCount--}if(cf.remove){cf.remove.call(b7,ch)}}}if(b9&&!b6.length){if(!cf.teardown||cf.teardown.call(b7,e,ce.handle)===false){bI.removeEvent(b7,cg,ce.handle)}delete ci[cg]}}if(bI.isEmptyObject(ci)){delete ce.handle;bI._removeData(b7,"events")}},trigger:function(b6,cd,b9,ck){var ce,b8,ci,cj,cg,cc,cb,ca=[b9||n],ch=K.call(b6,"type")?b6.type:b6,b7=K.call(b6,"namespace")?b6.namespace.split("."):[];ci=cc=b9=b9||n;if(b9.nodeType===3||b9.nodeType===8){return}if(bC.test(ch+bI.event.triggered)){return}if(ch.indexOf(".")>=0){b7=ch.split(".");ch=b7.shift();b7.sort()}b8=ch.indexOf(":")<0&&"on"+ch;b6=b6[bI.expando]?b6:new bI.Event(ch,typeof b6==="object"&&b6);b6.isTrigger=ck?2:3;b6.namespace=b7.join(".");b6.namespace_re=b6.namespace?new RegExp("(^|\\.)"+b7.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;b6.result=undefined;if(!b6.target){b6.target=b9}cd=cd==null?[b6]:bI.makeArray(cd,[b6]);cg=bI.event.special[ch]||{};if(!ck&&cg.trigger&&cg.trigger.apply(b9,cd)===false){return}if(!ck&&!cg.noBubble&&!bI.isWindow(b9)){cj=cg.delegateType||ch;if(!bC.test(cj+ch)){ci=ci.parentNode}for(;ci;ci=ci.parentNode){ca.push(ci);cc=ci}if(cc===(b9.ownerDocument||n)){ca.push(cc.defaultView||cc.parentWindow||a5)}}cb=0;while((ci=ca[cb++])&&!b6.isPropagationStopped()){b6.type=cb>1?cj:cg.bindType||ch;ce=(bI._data(ci,"events")||{})[b6.type]&&bI._data(ci,"handle");if(ce){ce.apply(ci,cd)}ce=b8&&ci[b8];if(ce&&ce.apply&&bI.acceptData(ci)){b6.result=ce.apply(ci,cd);if(b6.result===false){b6.preventDefault()}}}b6.type=ch;if(!ck&&!b6.isDefaultPrevented()){if((!cg._default||cg._default.apply(ca.pop(),cd)===false)&&bI.acceptData(b9)){if(b8&&b9[ch]&&!bI.isWindow(b9)){cc=b9[b8];if(cc){b9[b8]=null}bI.event.triggered=ch;try{b9[ch]()}catch(cf){}bI.event.triggered=undefined;if(cc){b9[b8]=cc}}}}return b6.result},dispatch:function(e){e=bI.event.fix(e);var b9,ca,ce,b6,b8,cd=[],cc=P.call(arguments),b7=(bI._data(this,"events")||{})[e.type]||[],cb=bI.event.special[e.type]||{};cc[0]=e;e.delegateTarget=this;if(cb.preDispatch&&cb.preDispatch.call(this,e)===false){return}cd=bI.event.handlers.call(this,e,b7);b9=0;while((b6=cd[b9++])&&!e.isPropagationStopped()){e.currentTarget=b6.elem;b8=0;while((ce=b6.handlers[b8++])&&!e.isImmediatePropagationStopped()){if(!e.namespace_re||e.namespace_re.test(ce.namespace)){e.handleObj=ce;e.data=ce.data;ca=((bI.event.special[ce.origType]||{}).handle||ce.handler).apply(b6.elem,cc);if(ca!==undefined){if((e.result=ca)===false){e.preventDefault();e.stopPropagation()}}}}}if(cb.postDispatch){cb.postDispatch.call(this,e)}return e.result},handlers:function(e,b7){var b6,cc,ca,b9,cb=[],b8=b7.delegateCount,cd=e.target;if(b8&&cd.nodeType&&(!e.button||e.type!=="click")){for(;cd!=this;cd=cd.parentNode||this){if(cd.nodeType===1&&(cd.disabled!==true||e.type!=="click")){ca=[];for(b9=0;b9=0:bI.find(b6,this,null,[cd]).length}if(ca[b6]){ca.push(cc)}}if(ca.length){cb.push({elem:cd,handlers:ca})}}}}if(b8]","i"),b5=/^\s+/,aH=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,o=/<([\w:]+)/,b0=/
    ","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:D.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},aT=B(n),k=aT.appendChild(n.createElement("div"));W.optgroup=W.option;W.tbody=W.tfoot=W.colgroup=W.caption=W.thead;W.th=W.td;function l(b8,e){var b6,b9,b7=0,ca=typeof b8.getElementsByTagName!==aC?b8.getElementsByTagName(e||"*"):typeof b8.querySelectorAll!==aC?b8.querySelectorAll(e||"*"):undefined;if(!ca){for(ca=[],b6=b8.childNodes||b8;(b9=b6[b7])!=null;b7++){if(!e||bI.nodeName(b9,e)){ca.push(b9)}else{bI.merge(ca,l(b9,e))}}}return e===undefined||e&&bI.nodeName(b8,e)?bI.merge([b8],ca):ca}function bY(e){if(aM.test(e.type)){e.defaultChecked=e.checked}}function a3(i,e){return bI.nodeName(i,"table")&&bI.nodeName(e.nodeType!==11?e:e.firstChild,"tr")?i.getElementsByTagName("tbody")[0]||i.appendChild(i.ownerDocument.createElement("tbody")):i}function u(e){e.type=(bI.find.attr(e,"type")!==null)+"/"+e.type;return e}function bf(i){var e=ar.exec(i.type);if(e){i.type=e[1]}else{i.removeAttribute("type")}return i}function bu(e,b7){var b8,b6=0;for(;(b8=e[b6])!=null;b6++){bI._data(b8,"globalEval",!b7||bI._data(b7[b6],"globalEval"))}}function at(cc,b6){if(b6.nodeType!==1||!bI.hasData(cc)){return}var b9,b8,e,cb=bI._data(cc),ca=bI._data(b6,cb),b7=cb.events;if(b7){delete ca.handle;ca.events={};for(b9 in b7){for(b8=0,e=b7[b9].length;b8")){cd=b6.cloneNode(true)}else{k.innerHTML=b6.outerHTML;k.removeChild(cd=k.firstChild)}if((!D.noCloneEvent||!D.noCloneChecked)&&(b6.nodeType===1||b6.nodeType===11)&&!bI.isXMLDoc(b6)){ca=l(cd);cb=l(b6);for(b9=0;(b7=cb[b9])!=null;++b9){if(ca[b9]){T(b7,ca[b9])}}}if(b8){if(e){cb=cb||l(b6);ca=ca||l(cd);for(b9=0;(b7=cb[b9])!=null;b9++){at(b7,ca[b9])}}else{at(b6,cd)}}ca=l(cd,"script");if(ca.length>0){bu(ca,!cc&&l(b6,"script"))}ca=cb=b7=null;return cd},buildFragment:function(b6,b8,cd,ci){var ce,ca,cc,ch,cj,cg,b7,cb=b6.length,b9=B(b8),e=[],cf=0;for(;cf")+b7[2];ce=b7[0];while(ce--){ch=ch.lastChild}if(!D.leadingWhitespace&&b5.test(ca)){e.push(b8.createTextNode(b5.exec(ca)[0]))}if(!D.tbody){ca=cj==="table"&&!b0.test(ca)?ch.firstChild:b7[1]===""&&!b0.test(ca)?ch:0;ce=ca&&ca.childNodes.length;while(ce--){if(bI.nodeName((cg=ca.childNodes[ce]),"tbody")&&!cg.childNodes.length){ca.removeChild(cg)}}}bI.merge(e,ch.childNodes);ch.textContent="";while(ch.firstChild){ch.removeChild(ch.firstChild)}ch=b9.lastChild}}}}if(ch){b9.removeChild(ch)}if(!D.appendChecked){bI.grep(l(e,"input"),bY)}cf=0;while((ca=e[cf++])){if(ci&&bI.inArray(ca,ci)!==-1){continue}cc=bI.contains(ca.ownerDocument,ca);ch=l(b9.appendChild(ca),"script");if(cc){bu(ch)}if(cd){ce=0;while((ca=ch[ce++])){if(bB.test(ca.type||"")){cd.push(ca)}}}}ch=null;return b9},cleanData:function(b6,ce){var b8,cd,b7,b9,ca=0,cf=bI.expando,e=bI.cache,cb=D.deleteExpando,cc=bI.event.special;for(;(b8=b6[ca])!=null;ca++){if(ce||bI.acceptData(b8)){b7=b8[cf];b9=b7&&e[b7];if(b9){if(b9.events){for(cd in b9.events){if(cc[cd]){bI.event.remove(b8,cd)}else{bI.removeEvent(b8,cd,b9.handle)}}}if(e[b7]){delete e[b7];if(cb){delete b8[cf]}else{if(typeof b8.removeAttribute!==aC){b8.removeAttribute(cf)}else{b8[cf]=null}}aP.push(b7)}}}}}});bI.fn.extend({text:function(e){return aB(this,function(i){return i===undefined?bI.text(this):this.empty().append((this[0]&&this[0].ownerDocument||n).createTextNode(i))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.insertBefore(e,i.firstChild)}})},before:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this)}})},after:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this.nextSibling)}})},remove:function(e,b9){var b8,b6=e?bI.filter(e,this):this,b7=0;for(;(b8=b6[b7])!=null;b7++){if(!b9&&b8.nodeType===1){bI.cleanData(l(b8))}if(b8.parentNode){if(b9&&bI.contains(b8.ownerDocument,b8)){bu(l(b8,"script"))}b8.parentNode.removeChild(b8)}}return this},empty:function(){var b6,e=0;for(;(b6=this[e])!=null;e++){if(b6.nodeType===1){bI.cleanData(l(b6,false))}while(b6.firstChild){b6.removeChild(b6.firstChild)}if(b6.options&&bI.nodeName(b6,"select")){b6.options.length=0}}return this},clone:function(i,e){i=i==null?false:i;e=e==null?i:e;return this.map(function(){return bI.clone(this,i,e)})},html:function(e){return aB(this,function(b9){var b8=this[0]||{},b7=0,b6=this.length;if(b9===undefined){return b8.nodeType===1?b8.innerHTML.replace(aD,""):undefined}if(typeof b9==="string"&&!an.test(b9)&&(D.htmlSerialize||!M.test(b9))&&(D.leadingWhitespace||!b5.test(b9))&&!W[(o.exec(b9)||["",""])[1].toLowerCase()]){b9=b9.replace(aH,"<$1>");try{for(;b71&&typeof ce==="string"&&!D.checkClone&&bW.test(ce))){return this.each(function(cj){var i=cf.eq(cj);if(b6){cd[0]=ce.call(this,cj,i.html())}i.domManip(cd,ci)})}if(b8){cc=bI.buildFragment(cd,this[0].ownerDocument,false,this);cb=cc.firstChild;if(cc.childNodes.length===1){cc=cb}if(cb){b9=bI.map(l(cc,"script"),u);e=b9.length;for(;ca")).appendTo(i.documentElement);i=(aI[0].contentWindow||aI[0].contentDocument).document;i.write();i.close();e=a4(b6,i);aI.detach()}bl[b6]=e}return e}(function(){var e;D.shrinkWrapBlocks=function(){if(e!=null){return e}e=false;var b7,i,b6;i=n.getElementsByTagName("body")[0];if(!i||!i.style){return}b7=n.createElement("div");b6=n.createElement("div");b6.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";i.appendChild(b6).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1";b7.appendChild(n.createElement("div")).style.width="5px";e=b7.offsetWidth!==3}i.removeChild(b6);return e}})();var aZ=(/^margin/);var Y=new RegExp("^("+aE+")(?!px)[a-z%]+$","i");var bq,G,bo=/^(top|right|bottom|left)$/;if(a5.getComputedStyle){bq=function(e){if(e.ownerDocument.defaultView.opener){return e.ownerDocument.defaultView.getComputedStyle(e,null)}return a5.getComputedStyle(e,null)};G=function(cb,i,ca){var b8,b7,b9,e,b6=cb.style;ca=ca||bq(cb);e=ca?ca.getPropertyValue(i)||ca[i]:undefined;if(ca){if(e===""&&!bI.contains(cb.ownerDocument,cb)){e=bI.style(cb,i)}if(Y.test(e)&&aZ.test(i)){b8=b6.width;b7=b6.minWidth;b9=b6.maxWidth;b6.minWidth=b6.maxWidth=b6.width=e;e=ca.width;b6.width=b8;b6.minWidth=b7;b6.maxWidth=b9}}return e===undefined?e:e+""}}else{if(n.documentElement.currentStyle){bq=function(e){return e.currentStyle};G=function(ca,b7,b9){var cb,i,e,b6,b8=ca.style;b9=b9||bq(ca);b6=b9?b9[b7]:undefined;if(b6==null&&b8&&b8[b7]){b6=b8[b7]}if(Y.test(b6)&&!bo.test(b7)){cb=b8.left;i=ca.runtimeStyle;e=i&&i.left;if(e){i.left=ca.currentStyle.left}b8.left=b7==="fontSize"?"1em":b6;b6=b8.pixelLeft+"px";b8.left=cb;if(e){i.left=e}}return b6===undefined?b6:b6+""||"auto"}}}function a7(e,i){return{get:function(){var b6=e();if(b6==null){return}if(b6){delete this.get;return}return(this.get=i).apply(this,arguments)}}}(function(){var cb,b9,b7,ca,b6,b8,i;cb=n.createElement("div");cb.innerHTML="
    a";b7=cb.getElementsByTagName("a")[0];b9=b7&&b7.style;if(!b9){return}b9.cssText="float:left;opacity:.5";D.opacity=b9.opacity==="0.5";D.cssFloat=!!b9.cssFloat;cb.style.backgroundClip="content-box";cb.cloneNode(true).style.backgroundClip="";D.clearCloneStyle=cb.style.backgroundClip==="content-box";D.boxSizing=b9.boxSizing===""||b9.MozBoxSizing===""||b9.WebkitBoxSizing==="";bI.extend(D,{reliableHiddenOffsets:function(){if(b8==null){e()}return b8},boxSizingReliable:function(){if(b6==null){e()}return b6},pixelPosition:function(){if(ca==null){e()}return ca},reliableMarginRight:function(){if(i==null){e()}return i}});function e(){var cf,cc,cd,ce;cc=n.getElementsByTagName("body")[0];if(!cc||!cc.style){return}cf=n.createElement("div");cd=n.createElement("div");cd.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";cc.appendChild(cd).appendChild(cf);cf.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute";ca=b6=false;i=true;if(a5.getComputedStyle){ca=(a5.getComputedStyle(cf,null)||{}).top!=="1%";b6=(a5.getComputedStyle(cf,null)||{width:"4px"}).width==="4px";ce=cf.appendChild(n.createElement("div"));ce.style.cssText=cf.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0";ce.style.marginRight=ce.style.width="0";cf.style.width="1px";i=!parseFloat((a5.getComputedStyle(ce,null)||{}).marginRight);cf.removeChild(ce)}cf.innerHTML="
    t
    ";ce=cf.getElementsByTagName("td");ce[0].style.cssText="margin:0;border:0;padding:0;display:none";b8=ce[0].offsetHeight===0;if(b8){ce[0].style.display="";ce[1].style.display="none";b8=ce[0].offsetHeight===0}cc.removeChild(cd)}})();bI.swap=function(b9,b8,ca,b7){var b6,i,e={};for(i in b8){e[i]=b9.style[i];b9.style[i]=b8[i]}b6=ca.apply(b9,b7||[]);for(i in b8){b9.style[i]=e[i]}return b6};var bj=/alpha\([^)]*\)/i,aU=/opacity\s*=\s*([^)]*)/,H=/^(none|table(?!-c[ea]).+)/,bb=new RegExp("^("+aE+")(.*)$","i"),V=new RegExp("^([+-])=("+aE+")","i"),be={position:"absolute",visibility:"hidden",display:"block"},bD={letterSpacing:"0",fontWeight:"400"},aw=["Webkit","O","Moz","ms"];function c(b8,b6){if(b6 in b8){return b6}var b9=b6.charAt(0).toUpperCase()+b6.slice(1),e=b6,b7=aw.length;while(b7--){b6=aw[b7]+b9;if(b6 in b8){return b6}}return e}function s(ca,e){var cb,b8,b9,i=[],b6=0,b7=ca.length;for(;b6=1||b9==="")&&bI.trim(b6.replace(bj,""))===""&&b7.removeAttribute){b7.removeAttribute("filter");if(b9===""||i&&!i.filter){return}}b7.filter=bj.test(b6)?b6.replace(bj,e):b6+" "+e}}}bI.cssHooks.marginRight=a7(D.reliableMarginRight,function(i,e){if(e){return bI.swap(i,{display:"inline-block"},G,[i,"marginRight"])}});bI.each({margin:"",padding:"",border:"Width"},function(e,i){bI.cssHooks[e+i]={expand:function(b8){var b7=0,b6={},b9=typeof b8==="string"?b8.split(" "):[b8];for(;b7<4;b7++){b6[e+bT[b7]+i]=b9[b7]||b9[b7-2]||b9[0]}return b6}};if(!aZ.test(e)){bI.cssHooks[e+i].set=aN}});bI.fn.extend({css:function(e,i){return aB(this,function(ca,b7,cb){var b9,b6,cc={},b8=0;if(bI.isArray(b7)){b9=bq(ca);b6=b7.length;for(;b81)},show:function(){return s(this,true)},hide:function(){return s(this)},toggle:function(e){if(typeof e==="boolean"){return e?this.show():this.hide()}return this.each(function(){if(S(this)){bI(this).show()}else{bI(this).hide()}})}});function J(b6,i,b8,e,b7){return new J.prototype.init(b6,i,b8,e,b7)}bI.Tween=J;J.prototype={constructor:J,init:function(b7,i,b9,e,b8,b6){this.elem=b7;this.prop=b9;this.easing=b8||"swing";this.options=i;this.start=this.now=this.cur();this.end=e;this.unit=b6||(bI.cssNumber[b9]?"":"px")},cur:function(){var e=J.propHooks[this.prop];return e&&e.get?e.get(this):J.propHooks._default.get(this)},run:function(b6){var i,e=J.propHooks[this.prop];if(this.options.duration){this.pos=i=bI.easing[this.easing](b6,this.options.duration*b6,0,1,this.options.duration)}else{this.pos=i=b6}this.now=(this.end-this.start)*i+this.start;if(this.options.step){this.options.step.call(this.elem,this.now,this)}if(e&&e.set){e.set(this)}else{J.propHooks._default.set(this)}return this}};J.prototype.init.prototype=J.prototype;J.propHooks={_default:{get:function(i){var e;if(i.elem[i.prop]!=null&&(!i.elem.style||i.elem.style[i.prop]==null)){return i.elem[i.prop]}e=bI.css(i.elem,i.prop,"");return !e||e==="auto"?0:e},set:function(e){if(bI.fx.step[e.prop]){bI.fx.step[e.prop](e)}else{if(e.elem.style&&(e.elem.style[bI.cssProps[e.prop]]!=null||bI.cssHooks[e.prop])){bI.style(e.elem,e.prop,e.now+e.unit)}else{e.elem[e.prop]=e.now}}}}};J.propHooks.scrollTop=J.propHooks.scrollLeft={set:function(e){if(e.elem.nodeType&&e.elem.parentNode){e.elem[e.prop]=e.now}}};bI.easing={linear:function(e){return e},swing:function(e){return 0.5-Math.cos(e*Math.PI)/2}};bI.fx=J.prototype.init;bI.fx.step={};var N,ae,bR=/^(?:toggle|show|hide)$/,bJ=new RegExp("^(?:([+-])=|)("+aE+")([a-z%]*)$","i"),bP=/queueHooks$/,aG=[h],a2={"*":[function(e,ca){var cc=this.createTween(e,ca),b8=cc.cur(),b7=bJ.exec(ca),cb=b7&&b7[3]||(bI.cssNumber[e]?"":"px"),i=(bI.cssNumber[e]||cb!=="px"&&+b8)&&bJ.exec(bI.css(cc.elem,e)),b6=1,b9=20;if(i&&i[3]!==cb){cb=cb||i[3];b7=b7||[];i=+b8||1;do{b6=b6||".5";i=i/b6;bI.style(cc.elem,e,i+cb)}while(b6!==(b6=cc.cur()/b8)&&b6!==1&&--b9)}if(b7){i=cc.start=+i||+b8||0;cc.unit=cb;cc.end=b7[1]?i+(b7[1]+1)*b7[2]:+b7[2]}return cc}]};function bn(){setTimeout(function(){N=undefined});return(N=bI.now())}function bH(b7,b9){var b8,e={height:b7},b6=0;b9=b9?1:0;for(;b6<4;b6+=2-b9){b8=bT[b6];e["margin"+b8]=e["padding"+b8]=b7}if(b9){e.opacity=e.width=b7}return e}function bd(b8,ca,b7){var i,b9=(a2[ca]||[]).concat(a2["*"]),e=0,b6=b9.length;for(;e
    a";i=b8.getElementsByTagName("a")[0];e=n.createElement("select");b7=e.appendChild(n.createElement("option"));b6=b8.getElementsByTagName("input")[0];i.style.cssText="top:1px";D.getSetAttribute=b8.className!=="t";D.style=/top/.test(i.getAttribute("style"));D.hrefNormalized=i.getAttribute("href")==="/a";D.checkOn=!!b6.value;D.optSelected=b7.selected;D.enctype=!!n.createElement("form").enctype;e.disabled=true;D.optDisabled=!b7.disabled;b6=n.createElement("input");b6.setAttribute("value","");D.input=b6.getAttribute("value")==="";b6.value="t";b6.setAttribute("type","radio");D.radioValue=b6.value==="t"})();var al=/\r/g;bI.fn.extend({val:function(b7){var e,i,b8,b6=this[0];if(!arguments.length){if(b6){e=bI.valHooks[b6.type]||bI.valHooks[b6.nodeName.toLowerCase()];if(e&&"get" in e&&(i=e.get(b6,"value"))!==undefined){return i}i=b6.value;return typeof i==="string"?i.replace(al,""):i==null?"":i}return}b8=bI.isFunction(b7);return this.each(function(b9){var ca;if(this.nodeType!==1){return}if(b8){ca=b7.call(this,b9,bI(this).val())}else{ca=b7}if(ca==null){ca=""}else{if(typeof ca==="number"){ca+=""}else{if(bI.isArray(ca)){ca=bI.map(ca,function(cb){return cb==null?"":cb+""})}}}e=bI.valHooks[this.type]||bI.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,ca,"value")===undefined){this.value=ca}})}});bI.extend({valHooks:{option:{get:function(e){var i=bI.find.attr(e,"value");return i!=null?i:bI.trim(bI.text(e))}},select:{get:function(e){var cb,b7,cd=e.options,b9=e.selectedIndex,b8=e.type==="select-one"||b9<0,cc=b8?null:[],ca=b8?b9+1:cd.length,b6=b9<0?ca:b8?b9:0;for(;b6=0){try{b9.selected=cc=true}catch(b6){b9.scrollHeight}}else{b9.selected=false}}if(!cc){ca.selectedIndex=-1}return b7}}}});bI.each(["radio","checkbox"],function(){bI.valHooks[this]={set:function(e,i){if(bI.isArray(i)){return(e.checked=bI.inArray(bI(e).val(),i)>=0)}}};if(!D.checkOn){bI.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value}}});var ba,b3,bO=bI.expr.attrHandle,aq=/^(?:checked|selected)$/i,bN=D.getSetAttribute,bF=D.input;bI.fn.extend({attr:function(e,i){return aB(this,bI.attr,e,i,arguments.length>1)},removeAttr:function(e){return this.each(function(){bI.removeAttr(this,e)})}});bI.extend({attr:function(b8,b7,b9){var e,b6,i=b8.nodeType;if(!b8||i===3||i===8||i===2){return}if(typeof b8.getAttribute===aC){return bI.prop(b8,b7,b9)}if(i!==1||!bI.isXMLDoc(b8)){b7=b7.toLowerCase();e=bI.attrHooks[b7]||(bI.expr.match.bool.test(b7)?b3:ba)}if(b9!==undefined){if(b9===null){bI.removeAttr(b8,b7)}else{if(e&&"set" in e&&(b6=e.set(b8,b9,b7))!==undefined){return b6}else{b8.setAttribute(b7,b9+"");return b9}}}else{if(e&&"get" in e&&(b6=e.get(b8,b7))!==null){return b6}else{b6=bI.find.attr(b8,b7);return b6==null?undefined:b6}}},removeAttr:function(b7,b9){var e,b8,b6=0,ca=b9&&b9.match(aF);if(ca&&b7.nodeType===1){while((e=ca[b6++])){b8=bI.propFix[e]||e;if(bI.expr.match.bool.test(e)){if(bF&&bN||!aq.test(e)){b7[b8]=false}else{b7[bI.camelCase("default-"+e)]=b7[b8]=false}}else{bI.attr(b7,e,"")}b7.removeAttribute(bN?e:b8)}}},attrHooks:{type:{set:function(e,i){if(!D.radioValue&&i==="radio"&&bI.nodeName(e,"input")){var b6=e.value;e.setAttribute("type",i);if(b6){e.value=b6}return i}}}}});b3={set:function(i,b6,e){if(b6===false){bI.removeAttr(i,e)}else{if(bF&&bN||!aq.test(e)){i.setAttribute(!bN&&bI.propFix[e]||e,e)}else{i[bI.camelCase("default-"+e)]=i[e]=true}}return e}};bI.each(bI.expr.match.bool.source.match(/\w+/g),function(b7,b6){var e=bO[b6]||bI.find.attr;bO[b6]=bF&&bN||!aq.test(b6)?function(b9,b8,cb){var i,ca;if(!cb){ca=bO[b8];bO[b8]=i;i=e(b9,b8,cb)!=null?b8.toLowerCase():null;bO[b8]=ca}return i}:function(b8,i,b9){if(!b9){return b8[bI.camelCase("default-"+i)]?i.toLowerCase():null}}});if(!bF||!bN){bI.attrHooks.value={set:function(i,b6,e){if(bI.nodeName(i,"input")){i.defaultValue=b6}else{return ba&&ba.set(i,b6,e)}}}}if(!bN){ba={set:function(b6,b7,i){var e=b6.getAttributeNode(i);if(!e){b6.setAttributeNode((e=b6.ownerDocument.createAttribute(i)))}e.value=b7+="";if(i==="value"||b7===b6.getAttribute(i)){return b7}}};bO.id=bO.name=bO.coords=function(b6,i,b7){var e;if(!b7){return(e=b6.getAttributeNode(i))&&e.value!==""?e.value:null}};bI.valHooks.button={get:function(b6,i){var e=b6.getAttributeNode(i);if(e&&e.specified){return e.value}},set:ba.set};bI.attrHooks.contenteditable={set:function(i,b6,e){ba.set(i,b6===""?false:b6,e)}};bI.each(["width","height"],function(b6,e){bI.attrHooks[e]={set:function(i,b7){if(b7===""){i.setAttribute(e,"auto");return b7}}}})}if(!D.style){bI.attrHooks.style={get:function(e){return e.style.cssText||undefined},set:function(e,i){return(e.style.cssText=i+"")}}}var aJ=/^(?:input|select|textarea|button|object)$/i,F=/^(?:a|area)$/i;bI.fn.extend({prop:function(e,i){return aB(this,bI.prop,e,i,arguments.length>1)},removeProp:function(e){e=bI.propFix[e]||e;return this.each(function(){try{this[e]=undefined;delete this[e]}catch(i){}})}});bI.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(b9,b7,ca){var b6,e,b8,i=b9.nodeType;if(!b9||i===3||i===8||i===2){return}b8=i!==1||!bI.isXMLDoc(b9);if(b8){b7=bI.propFix[b7]||b7;e=bI.propHooks[b7]}if(ca!==undefined){return e&&"set" in e&&(b6=e.set(b9,ca,b7))!==undefined?b6:(b9[b7]=ca)}else{return e&&"get" in e&&(b6=e.get(b9,b7))!==null?b6:b9[b7]}},propHooks:{tabIndex:{get:function(i){var e=bI.find.attr(i,"tabindex");return e?parseInt(e,10):aJ.test(i.nodeName)||F.test(i.nodeName)&&i.href?0:-1}}}});if(!D.hrefNormalized){bI.each(["href","src"],function(b6,e){bI.propHooks[e]={get:function(i){return i.getAttribute(e,4)}}})}if(!D.optSelected){bI.propHooks.selected={get:function(i){var e=i.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}}}bI.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){bI.propFix[this.toLowerCase()]=this});if(!D.enctype){bI.propFix.enctype="encoding"}var bL=/[\t\r\n\f]/g;bI.fn.extend({addClass:function(cd){var b7,b6,ce,cb,b8,e,b9=0,ca=this.length,cc=typeof cd==="string"&&cd;if(bI.isFunction(cd)){return this.each(function(i){bI(this).addClass(cd.call(this,i,this.className))})}if(cc){b7=(cd||"").match(aF)||[];for(;b9=0){ce=ce.replace(" "+cb+" "," ")}}e=cd?bI.trim(ce):"";if(b6.className!==e){b6.className=e}}}}return this},toggleClass:function(b6,e){var i=typeof b6;if(typeof e==="boolean"&&i==="string"){return e?this.addClass(b6):this.removeClass(b6)}if(bI.isFunction(b6)){return this.each(function(b7){bI(this).toggleClass(b6.call(this,b7,this.className,e),e)})}return this.each(function(){if(i==="string"){var b9,b8=0,b7=bI(this),ca=b6.match(aF)||[];while((b9=ca[b8++])){if(b7.hasClass(b9)){b7.removeClass(b9)}else{b7.addClass(b9)}}}else{if(i===aC||i==="boolean"){if(this.className){bI._data(this,"__className__",this.className)}this.className=this.className||b6===false?"":bI._data(this,"__className__")||""}}})},hasClass:function(e){var b8=" "+e+" ",b7=0,b6=this.length;for(;b7=0){return true}}return false}});bI.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(b6,e){bI.fn[e]=function(b7,i){return arguments.length>0?this.on(e,null,b7,i):this.trigger(e)}});bI.fn.extend({hover:function(e,i){return this.mouseenter(e).mouseleave(i||e)},bind:function(e,b6,i){return this.on(e,null,b6,i)},unbind:function(e,i){return this.off(e,null,i)},delegate:function(e,i,b7,b6){return this.on(i,e,b7,b6)},undelegate:function(e,i,b6){return arguments.length===1?this.off(e,"**"):this.off(i,e||"**",b6)}});var bp=bI.now();var bQ=(/\?/);var a1=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;bI.parseJSON=function(e){if(a5.JSON&&a5.JSON.parse){return a5.JSON.parse(e+"")}var b7,b6=null,i=bI.trim(e+"");return i&&!bI.trim(i.replace(a1,function(ca,b8,b9,cb){if(b7&&b8){b6=0}if(b6===0){return ca}b7=b9||b8;b6+=!cb-!b9;return""}))?(Function("return "+i))():bI.error("Invalid JSON: "+e)};bI.parseXML=function(b7){var i,b6;if(!b7||typeof b7!=="string"){return null}try{if(a5.DOMParser){b6=new DOMParser();i=b6.parseFromString(b7,"text/xml")}else{i=new ActiveXObject("Microsoft.XMLDOM");i.async="false";i.loadXML(b7)}}catch(b8){i=undefined}if(!i||!i.documentElement||i.getElementsByTagName("parsererror").length){bI.error("Invalid XML: "+b7)}return i};var b4,aa,ap=/#.*$/,R=/([?&])_=[^&]*/,ah=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,C=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,r=/^(?:GET|HEAD)$/,aK=/^\/\//,aV=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,w={},a9={},aX="*/".concat("*");try{aa=location.href}catch(bi){aa=n.createElement("a");aa.href="";aa=aa.href}b4=aV.exec(aa.toLowerCase())||[];function bK(e){return function(b9,ca){if(typeof b9!=="string"){ca=b9;b9="*"}var b6,b7=0,b8=b9.toLowerCase().match(aF)||[];if(bI.isFunction(ca)){while((b6=b8[b7++])){if(b6.charAt(0)==="+"){b6=b6.slice(1)||"*";(e[b6]=e[b6]||[]).unshift(ca)}else{(e[b6]=e[b6]||[]).push(ca)}}}}}function p(e,b6,ca,b7){var i={},b8=(e===a9);function b9(cb){var cc;i[cb]=true;bI.each(e[cb]||[],function(ce,cd){var cf=cd(b6,ca,b7);if(typeof cf==="string"&&!b8&&!i[cf]){b6.dataTypes.unshift(cf);b9(cf);return false}else{if(b8){return !(cc=cf)}}});return cc}return b9(b6.dataTypes[0])||!i["*"]&&b9("*")}function t(b6,b7){var e,i,b8=bI.ajaxSettings.flatOptions||{};for(i in b7){if(b7[i]!==undefined){(b8[i]?b6:(e||(e={})))[i]=b7[i]}}if(e){bI.extend(true,b6,e)}return b6}function g(cc,cb,b8){var e,b7,b6,b9,i=cc.contents,ca=cc.dataTypes;while(ca[0]==="*"){ca.shift();if(b7===undefined){b7=cc.mimeType||cb.getResponseHeader("Content-Type")}}if(b7){for(b9 in i){if(i[b9]&&i[b9].test(b7)){ca.unshift(b9);break}}}if(ca[0] in b8){b6=ca[0]}else{for(b9 in b8){if(!ca[0]||cc.converters[b9+" "+ca[0]]){b6=b9;break}if(!e){e=b9}}b6=b6||e}if(b6){if(b6!==ca[0]){ca.unshift(b6)}return b8[b6]}}function ag(cg,b8,cd,b6){var i,cb,ce,b9,b7,cf={},cc=cg.dataTypes.slice();if(cc[1]){for(ce in cg.converters){cf[ce.toLowerCase()]=cg.converters[ce]}}cb=cc.shift();while(cb){if(cg.responseFields[cb]){cd[cg.responseFields[cb]]=b8}if(!b7&&b6&&cg.dataFilter){b8=cg.dataFilter(b8,cg.dataType)}b7=cb;cb=cc.shift();if(cb){if(cb==="*"){cb=b7}else{if(b7!=="*"&&b7!==cb){ce=cf[b7+" "+cb]||cf["* "+cb];if(!ce){for(i in cf){b9=i.split(" ");if(b9[1]===cb){ce=cf[b7+" "+b9[0]]||cf["* "+b9[0]];if(ce){if(ce===true){ce=cf[i]}else{if(cf[i]!==true){cb=b9[0];cc.unshift(b9[1])}}break}}}}if(ce!==true){if(ce&&cg["throws"]){b8=ce(b8)}else{try{b8=ce(b8)}catch(ca){return{state:"parsererror",error:ce?ca:"No conversion from "+b7+" to "+cb}}}}}}}}return{state:"success",data:b8}}bI.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:aa,type:"GET",isLocal:C.test(b4[1]),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":aX,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":bI.parseJSON,"text xml":bI.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(i,e){return e?t(t(i,bI.ajaxSettings),e):t(bI.ajaxSettings,i)},ajaxPrefilter:bK(w),ajaxTransport:bK(a9),ajax:function(ca,b7){if(typeof ca==="object"){b7=ca;ca=undefined}b7=b7||{};var cj,cl,cb,cq,cf,b6,cm,b8,ce=bI.ajaxSetup({},b7),cs=ce.context||ce,ch=ce.context&&(cs.nodeType||cs.jquery)?bI(cs):bI.event,cr=bI.Deferred(),co=bI.Callbacks("once memory"),cc=ce.statusCode||{},ci={},cp={},b9=0,cd="canceled",ck={readyState:0,getResponseHeader:function(i){var e;if(b9===2){if(!b8){b8={};while((e=ah.exec(cq))){b8[e[1].toLowerCase()]=e[2]}}e=b8[i.toLowerCase()]}return e==null?null:e},getAllResponseHeaders:function(){return b9===2?cq:null},setRequestHeader:function(i,ct){var e=i.toLowerCase();if(!b9){i=cp[e]=cp[e]||i;ci[i]=ct}return this},overrideMimeType:function(e){if(!b9){ce.mimeType=e}return this},statusCode:function(i){var e;if(i){if(b9<2){for(e in i){cc[e]=[cc[e],i[e]]}}else{ck.always(i[ck.status])}}return this},abort:function(i){var e=i||cd;if(cm){cm.abort(e)}cg(0,e);return this}};cr.promise(ck).complete=co.add;ck.success=ck.done;ck.error=ck.fail;ce.url=((ca||ce.url||aa)+"").replace(ap,"").replace(aK,b4[1]+"//");ce.type=b7.method||b7.type||ce.method||ce.type;ce.dataTypes=bI.trim(ce.dataType||"*").toLowerCase().match(aF)||[""];if(ce.crossDomain==null){cj=aV.exec(ce.url.toLowerCase());ce.crossDomain=!!(cj&&(cj[1]!==b4[1]||cj[2]!==b4[2]||(cj[3]||(cj[1]==="http:"?"80":"443"))!==(b4[3]||(b4[1]==="http:"?"80":"443"))))}if(ce.data&&ce.processData&&typeof ce.data!=="string"){ce.data=bI.param(ce.data,ce.traditional)}p(w,ce,b7,ck);if(b9===2){return ck}b6=bI.event&&ce.global;if(b6&&bI.active++===0){bI.event.trigger("ajaxStart")}ce.type=ce.type.toUpperCase();ce.hasContent=!r.test(ce.type);cb=ce.url;if(!ce.hasContent){if(ce.data){cb=(ce.url+=(bQ.test(cb)?"&":"?")+ce.data);delete ce.data}if(ce.cache===false){ce.url=R.test(cb)?cb.replace(R,"$1_="+bp++):cb+(bQ.test(cb)?"&":"?")+"_="+bp++}}if(ce.ifModified){if(bI.lastModified[cb]){ck.setRequestHeader("If-Modified-Since",bI.lastModified[cb])}if(bI.etag[cb]){ck.setRequestHeader("If-None-Match",bI.etag[cb])}}if(ce.data&&ce.hasContent&&ce.contentType!==false||b7.contentType){ck.setRequestHeader("Content-Type",ce.contentType)}ck.setRequestHeader("Accept",ce.dataTypes[0]&&ce.accepts[ce.dataTypes[0]]?ce.accepts[ce.dataTypes[0]]+(ce.dataTypes[0]!=="*"?", "+aX+"; q=0.01":""):ce.accepts["*"]);for(cl in ce.headers){ck.setRequestHeader(cl,ce.headers[cl])}if(ce.beforeSend&&(ce.beforeSend.call(cs,ck,ce)===false||b9===2)){return ck.abort()}cd="abort";for(cl in {success:1,error:1,complete:1}){ck[cl](ce[cl])}cm=p(a9,ce,b7,ck);if(!cm){cg(-1,"No Transport")}else{ck.readyState=1;if(b6){ch.trigger("ajaxSend",[ck,ce])}if(ce.async&&ce.timeout>0){cf=setTimeout(function(){ck.abort("timeout")},ce.timeout)}try{b9=1;cm.send(ci,cg)}catch(cn){if(b9<2){cg(-1,cn)}else{throw cn}}}function cg(cw,i,cx,cu){var e,cA,cy,cv,cz,ct=i;if(b9===2){return}b9=2;if(cf){clearTimeout(cf)}cm=undefined;cq=cu||"";ck.readyState=cw>0?4:0;e=cw>=200&&cw<300||cw===304;if(cx){cv=g(ce,ck,cx)}cv=ag(ce,cv,ck,e);if(e){if(ce.ifModified){cz=ck.getResponseHeader("Last-Modified");if(cz){bI.lastModified[cb]=cz}cz=ck.getResponseHeader("etag");if(cz){bI.etag[cb]=cz}}if(cw===204||ce.type==="HEAD"){ct="nocontent"}else{if(cw===304){ct="notmodified"}else{ct=cv.state;cA=cv.data;cy=cv.error;e=!cy}}}else{cy=ct;if(cw||!ct){ct="error";if(cw<0){cw=0}}}ck.status=cw;ck.statusText=(i||ct)+"";if(e){cr.resolveWith(cs,[cA,ct,ck])}else{cr.rejectWith(cs,[ck,ct,cy])}ck.statusCode(cc);cc=undefined;if(b6){ch.trigger(e?"ajaxSuccess":"ajaxError",[ck,ce,e?cA:cy])}co.fireWith(cs,[ck,ct]);if(b6){ch.trigger("ajaxComplete",[ck,ce]);if(!(--bI.active)){bI.event.trigger("ajaxStop")}}}return ck},getJSON:function(e,i,b6){return bI.get(e,i,b6,"json")},getScript:function(e,i){return bI.get(e,undefined,i,"script")}});bI.each(["get","post"],function(e,b6){bI[b6]=function(i,b8,b9,b7){if(bI.isFunction(b8)){b7=b7||b9;b9=b8;b8=undefined}return bI.ajax({url:i,type:b6,dataType:b7,data:b8,success:b9})}});bI._evalUrl=function(e){return bI.ajax({url:e,type:"GET",dataType:"script",async:false,global:false,"throws":true})};bI.fn.extend({wrapAll:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapAll(e.call(this,b6))})}if(this[0]){var i=bI(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){i.insertBefore(this[0])}i.map(function(){var b6=this;while(b6.firstChild&&b6.firstChild.nodeType===1){b6=b6.firstChild}return b6}).append(this)}return this},wrapInner:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapInner(e.call(this,b6))})}return this.each(function(){var i=bI(this),b6=i.contents();if(b6.length){b6.wrapAll(e)}else{i.append(e)}})},wrap:function(e){var i=bI.isFunction(e);return this.each(function(b6){bI(this).wrapAll(i?e.call(this,b6):e)})},unwrap:function(){return this.parent().each(function(){if(!bI.nodeName(this,"body")){bI(this).replaceWith(this.childNodes)}}).end()}});bI.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||(!D.reliableHiddenOffsets()&&((e.style&&e.style.display)||bI.css(e,"display"))==="none")};bI.expr.filters.visible=function(e){return !bI.expr.filters.hidden(e)};var bw=/%20/g,aS=/\[\]$/,X=/\r?\n/g,b=/^(?:submit|button|image|reset|file)$/i,au=/^(?:input|select|textarea|keygen)/i;function j(b6,b8,i,b7){var e;if(bI.isArray(b8)){bI.each(b8,function(ca,b9){if(i||aS.test(b6)){b7(b6,b9)}else{j(b6+"["+(typeof b9==="object"?ca:"")+"]",b9,i,b7)}})}else{if(!i&&bI.type(b8)==="object"){for(e in b8){j(b6+"["+e+"]",b8[e],i,b7)}}else{b7(b6,b8)}}}bI.param=function(e,b6){var b7,i=[],b8=function(b9,ca){ca=bI.isFunction(ca)?ca():(ca==null?"":ca);i[i.length]=encodeURIComponent(b9)+"="+encodeURIComponent(ca)};if(b6===undefined){b6=bI.ajaxSettings&&bI.ajaxSettings.traditional}if(bI.isArray(e)||(e.jquery&&!bI.isPlainObject(e))){bI.each(e,function(){b8(this.name,this.value)})}else{for(b7 in e){j(b7,e[b7],b6,b8)}}return i.join("&").replace(bw,"+")};bI.fn.extend({serialize:function(){return bI.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=bI.prop(this,"elements");return e?bI.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!bI(this).is(":disabled")&&au.test(this.nodeName)&&!b.test(e)&&(this.checked||!aM.test(e))}).map(function(e,b6){var b7=bI(this).val();return b7==null?null:bI.isArray(b7)?bI.map(b7,function(i){return{name:b6.name,value:i.replace(X,"\r\n")}}):{name:b6.name,value:b7.replace(X,"\r\n")}}).get()}});bI.ajaxSettings.xhr=a5.ActiveXObject!==undefined?function(){return !this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&bE()||bg()}:bE;var aA=0,aj={},ay=bI.ajaxSettings.xhr();if(a5.attachEvent){a5.attachEvent("onunload",function(){for(var e in aj){aj[e](undefined,true)}})}D.cors=!!ay&&("withCredentials" in ay);ay=D.ajax=!!ay;if(ay){bI.ajaxTransport(function(e){if(!e.crossDomain||D.cors){var i;return{send:function(b9,b6){var b7,b8=e.xhr(),ca=++aA;b8.open(e.type,e.url,e.async,e.username,e.password);if(e.xhrFields){for(b7 in e.xhrFields){b8[b7]=e.xhrFields[b7]}}if(e.mimeType&&b8.overrideMimeType){b8.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!b9["X-Requested-With"]){b9["X-Requested-With"]="XMLHttpRequest"}for(b7 in b9){if(b9[b7]!==undefined){b8.setRequestHeader(b7,b9[b7]+"")}}b8.send((e.hasContent&&e.data)||null);i=function(cd,cc){var cb,cg,ce;if(i&&(cc||b8.readyState===4)){delete aj[ca];i=undefined;b8.onreadystatechange=bI.noop;if(cc){if(b8.readyState!==4){b8.abort()}}else{ce={};cb=b8.status;if(typeof b8.responseText==="string"){ce.text=b8.responseText}try{cg=b8.statusText}catch(cf){cg=""}if(!cb&&e.isLocal&&!e.crossDomain){cb=ce.text?200:404}else{if(cb===1223){cb=204}}}}if(ce){b6(cb,cg,ce,b8.getAllResponseHeaders())}};if(!e.async){i()}else{if(b8.readyState===4){setTimeout(i)}else{b8.onreadystatechange=aj[ca]=i}}},abort:function(){if(i){i(undefined,true)}}}}})}function bE(){try{return new a5.XMLHttpRequest()}catch(i){}}function bg(){try{return new a5.ActiveXObject("Microsoft.XMLHTTP")}catch(i){}}bI.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){bI.globalEval(e);return e}}});bI.ajaxPrefilter("script",function(e){if(e.cache===undefined){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});bI.ajaxTransport("script",function(b6){if(b6.crossDomain){var e,i=n.head||bI("head")[0]||n.documentElement;return{send:function(b7,b8){e=n.createElement("script");e.async=true;if(b6.scriptCharset){e.charset=b6.scriptCharset}e.src=b6.url;e.onload=e.onreadystatechange=function(ca,b9){if(b9||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(e.parentNode){e.parentNode.removeChild(e)}e=null;if(!b9){b8(200,"success")}}};i.insertBefore(e,i.firstChild)},abort:function(){if(e){e.onload(undefined,true)}}}}});var bs=[],a8=/(=)\?(?=&|$)|\?\?/;bI.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=bs.pop()||(bI.expando+"_"+(bp++));this[e]=true;return e}});bI.ajaxPrefilter("json jsonp",function(b7,e,b8){var ca,i,b6,b9=b7.jsonp!==false&&(a8.test(b7.url)?"url":typeof b7.data==="string"&&!(b7.contentType||"").indexOf("application/x-www-form-urlencoded")&&a8.test(b7.data)&&"data");if(b9||b7.dataTypes[0]==="jsonp"){ca=b7.jsonpCallback=bI.isFunction(b7.jsonpCallback)?b7.jsonpCallback():b7.jsonpCallback;if(b9){b7[b9]=b7[b9].replace(a8,"$1"+ca)}else{if(b7.jsonp!==false){b7.url+=(bQ.test(b7.url)?"&":"?")+b7.jsonp+"="+ca}}b7.converters["script json"]=function(){if(!b6){bI.error(ca+" was not called")}return b6[0]};b7.dataTypes[0]="json";i=a5[ca];a5[ca]=function(){b6=arguments};b8.always(function(){a5[ca]=i;if(b7[ca]){b7.jsonpCallback=e.jsonpCallback;bs.push(ca)}if(b6&&bI.isFunction(i)){i(b6[0])}b6=i=undefined});return"script"}});bI.parseHTML=function(b8,b6,b7){if(!b8||typeof b8!=="string"){return null}if(typeof b6==="boolean"){b7=b6;b6=false}b6=b6||n;var i=a.exec(b8),e=!b7&&[];if(i){return[b6.createElement(i[1])]}i=bI.buildFragment([b8],b6,e);if(e&&e.length){bI(e).remove()}return bI.merge([],i.childNodes)};var b1=bI.fn.load;bI.fn.load=function(b7,ca,cb){if(typeof b7!=="string"&&b1){return b1.apply(this,arguments)}var e,b6,b8,i=this,b9=b7.indexOf(" ");if(b9>=0){e=bI.trim(b7.slice(b9,b7.length));b7=b7.slice(0,b9)}if(bI.isFunction(ca)){cb=ca;ca=undefined}else{if(ca&&typeof ca==="object"){b8="POST"}}if(i.length>0){bI.ajax({url:b7,type:b8,dataType:"html",data:ca}).done(function(cc){b6=arguments;i.html(e?bI("
    ").append(bI.parseHTML(cc)).find(e):cc)}).complete(cb&&function(cd,cc){i.each(cb,b6||[cd.responseText,cc,cd])})}return this};bI.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,b6){bI.fn[b6]=function(i){return this.on(b6,i)}});bI.expr.filters.animated=function(e){return bI.grep(bI.timers,function(i){return e===i.elem}).length};var bX=a5.document.documentElement;function br(e){return bI.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}bI.offset={setOffset:function(b7,ch,cb){var cd,ca,e,b8,b6,cf,cg,cc=bI.css(b7,"position"),b9=bI(b7),ce={};if(cc==="static"){b7.style.position="relative"}b6=b9.offset();e=bI.css(b7,"top");cf=bI.css(b7,"left");cg=(cc==="absolute"||cc==="fixed")&&bI.inArray("auto",[e,cf])>-1;if(cg){cd=b9.position();b8=cd.top;ca=cd.left}else{b8=parseFloat(e)||0;ca=parseFloat(cf)||0}if(bI.isFunction(ch)){ch=ch.call(b7,cb,b6)}if(ch.top!=null){ce.top=(ch.top-b6.top)+b8}if(ch.left!=null){ce.left=(ch.left-b6.left)+ca}if("using" in ch){ch.using.call(b7,ce)}else{b9.css(ce)}}};bI.fn.extend({offset:function(i){if(arguments.length){return i===undefined?this:this.each(function(ca){bI.offset.setOffset(this,i,ca)})}var e,b9,b7={top:0,left:0},b6=this[0],b8=b6&&b6.ownerDocument;if(!b8){return}e=b8.documentElement;if(!bI.contains(e,b6)){return b7}if(typeof b6.getBoundingClientRect!==aC){b7=b6.getBoundingClientRect()}b9=br(b8);return{top:b7.top+(b9.pageYOffset||e.scrollTop)-(e.clientTop||0),left:b7.left+(b9.pageXOffset||e.scrollLeft)-(e.clientLeft||0)}},position:function(){if(!this[0]){return}var b6,b7,e={top:0,left:0},i=this[0];if(bI.css(i,"position")==="fixed"){b7=i.getBoundingClientRect()}else{b6=this.offsetParent();b7=this.offset();if(!bI.nodeName(b6[0],"html")){e=b6.offset()}e.top+=bI.css(b6[0],"borderTopWidth",true);e.left+=bI.css(b6[0],"borderLeftWidth",true)}return{top:b7.top-e.top-bI.css(i,"marginTop",true),left:b7.left-e.left-bI.css(i,"marginLeft",true)}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||bX;while(e&&(!bI.nodeName(e,"html")&&bI.css(e,"position")==="static")){e=e.offsetParent}return e||bX})}});bI.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b6,i){var e=/Y/.test(i);bI.fn[b6]=function(b7){return aB(this,function(b8,cb,ca){var b9=br(b8);if(ca===undefined){return b9?(i in b9)?b9[i]:b9.document.documentElement[cb]:b8[cb]}if(b9){b9.scrollTo(!e?ca:bI(b9).scrollLeft(),e?ca:bI(b9).scrollTop())}else{b8[cb]=ca}},b6,b7,arguments.length,null)}});bI.each(["top","left"],function(e,b6){bI.cssHooks[b6]=a7(D.pixelPosition,function(b7,i){if(i){i=G(b7,b6);return Y.test(i)?bI(b7).position()[b6]+"px":i}})});bI.each({Height:"height",Width:"width"},function(e,i){bI.each({padding:"inner"+e,content:i,"":"outer"+e},function(b6,b7){bI.fn[b7]=function(cb,ca){var b9=arguments.length&&(b6||typeof cb!=="boolean"),b8=b6||(cb===true||ca===true?"margin":"border");return aB(this,function(cd,cc,ce){var cf;if(bI.isWindow(cd)){return cd.document.documentElement["client"+e]}if(cd.nodeType===9){cf=cd.documentElement;return Math.max(cd.body["scroll"+e],cf["scroll"+e],cd.body["offset"+e],cf["offset"+e],cf["client"+e])}return ce===undefined?bI.css(cd,cc,b8):bI.style(cd,cc,ce,b8)},i,b9?cb:undefined,b9,null)}})});bI.fn.size=function(){return this.length};bI.fn.andSelf=bI.fn.addBack;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return bI})}var bk=a5.jQuery,I=a5.$;bI.noConflict=function(e){if(a5.$===bI){a5.$=I}if(e&&a5.jQuery===bI){a5.jQuery=bk}return bI};if(typeof av===aC){a5.jQuery=a5.$=bI}return bI}));!function(a){a(function(){a.support.transition=(function(){var b=(function(){var e=document.createElement("bootstrap"),d={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in d){if(e.style[c]!==undefined){return d[c]}}}());return b&&{end:b}})()})}(window.jQuery);!function(d){var c='[data-dismiss="alert"]',b=function(e){d(e).on("click",c,this.close)};b.prototype.close=function(j){var i=d(this),g=i.attr("data-target"),h;if(!g){g=i.attr("href");g=g&&g.replace(/.*(?=#[^\s]*$)/,"")}h=d(g);j&&j.preventDefault();h.length||(h=i.hasClass("alert")?i:i.parent());h.trigger(j=d.Event("close"));if(j.isDefaultPrevented()){return}h.removeClass("in");function f(){h.trigger("closed").remove()}d.support.transition&&h.hasClass("fade")?h.on(d.support.transition.end,f):f()};var a=d.fn.alert;d.fn.alert=function(e){return this.each(function(){var g=d(this),f=g.data("alert");if(!f){g.data("alert",(f=new b(this)))}if(typeof e=="string"){f[e].call(g)}})};d.fn.alert.Constructor=b;d.fn.alert.noConflict=function(){d.fn.alert=a;return this};d(document).on("click.alert.data-api",c,b.prototype.close)}(window.jQuery);!function(c){var b=function(e,d){this.$element=c(e);this.options=c.extend({},c.fn.button.defaults,d)};b.prototype.setState=function(g){var i="disabled",e=this.$element,f=e.data(),h=e.is("input")?"val":"html";g=g+"Text";f.resetText||e.data("resetText",e[h]());e[h](f[g]||this.options[g]);setTimeout(function(){g=="loadingText"?e.addClass(i).attr(i,i):e.removeClass(i).removeAttr(i)},0)};b.prototype.toggle=function(){var d=this.$element.closest('[data-toggle="buttons-radio"]');d&&d.find(".active").removeClass("active");this.$element.toggleClass("active")};var a=c.fn.button;c.fn.button=function(d){return this.each(function(){var g=c(this),f=g.data("button"),e=typeof d=="object"&&d;if(!f){g.data("button",(f=new b(this,e)))}if(d=="toggle"){f.toggle()}else{if(d){f.setState(d)}}})};c.fn.button.defaults={loadingText:"loading..."};c.fn.button.Constructor=b;c.fn.button.noConflict=function(){c.fn.button=a;return this};c(document).on("click.button.data-api","[data-toggle^=button]",function(f){var d=c(f.target);if(!d.hasClass("btn")){d=d.closest(".btn")}d.button("toggle")})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.$indicators=this.$element.find(".carousel-indicators");this.options=d;this.options.pause=="hover"&&this.$element.on("mouseenter",b.proxy(this.pause,this)).on("mouseleave",b.proxy(this.cycle,this))};c.prototype={cycle:function(d){if(!d){this.paused=false}if(this.interval){clearInterval(this.interval)}this.options.interval&&!this.paused&&(this.interval=setInterval(b.proxy(this.next,this),this.options.interval));return this},getActiveIndex:function(){this.$active=this.$element.find(".item.active");this.$items=this.$active.parent().children();return this.$items.index(this.$active)},to:function(f){var d=this.getActiveIndex(),e=this;if(f>(this.$items.length-1)||f<0){return}if(this.sliding){return this.$element.one("slid",function(){e.to(f)})}if(d==f){return this.pause().cycle()}return this.slide(f>d?"next":"prev",b(this.$items[f]))},pause:function(d){if(!d){this.paused=true}if(this.$element.find(".next, .prev").length&&b.support.transition.end){this.$element.trigger(b.support.transition.end);this.cycle(true)}clearInterval(this.interval);this.interval=null;return this},next:function(){if(this.sliding){return}return this.slide("next")},prev:function(){if(this.sliding){return}return this.slide("prev")},slide:function(k,f){var m=this.$element.find(".item.active"),d=f||m[k](),j=this.interval,l=k=="next"?"left":"right",g=k=="next"?"first":"last",h=this,i;this.sliding=true;j&&this.pause();d=d.length?d:this.$element.find(".item")[g]();i=b.Event("slide",{relatedTarget:d[0],direction:l});if(d.hasClass("active")){return}if(this.$indicators.length){this.$indicators.find(".active").removeClass("active");this.$element.one("slid",function(){var e=b(h.$indicators.children()[h.getActiveIndex()]);e&&e.addClass("active")})}if(b.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(i);if(i.isDefaultPrevented()){return}d.addClass(k);d[0].offsetWidth;m.addClass(l);d.addClass(l);this.$element.one(b.support.transition.end,function(){d.removeClass([k,l].join(" ")).addClass("active");m.removeClass(["active",l].join(" "));h.sliding=false;setTimeout(function(){h.$element.trigger("slid")},0)})}else{this.$element.trigger(i);if(i.isDefaultPrevented()){return}m.removeClass("active");d.addClass("active");this.sliding=false;this.$element.trigger("slid")}j&&this.cycle();return this}};var a=b.fn.carousel;b.fn.carousel=function(d){return this.each(function(){var h=b(this),g=h.data("carousel"),e=b.extend({},b.fn.carousel.defaults,typeof d=="object"&&d),f=typeof d=="string"?d:e.slide;if(!g){h.data("carousel",(g=new c(this,e)))}if(typeof d=="number"){g.to(d)}else{if(f){g[f]()}else{if(e.interval){g.pause().cycle()}}}})};b.fn.carousel.defaults={interval:5000,pause:"hover"};b.fn.carousel.Constructor=c;b.fn.carousel.noConflict=function(){b.fn.carousel=a;return this};b(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(j){var i=b(this),f,d=b(i.attr("data-target")||(f=i.attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")),g=b.extend({},d.data(),i.data()),h;d.carousel(g);if(h=i.attr("data-slide-to")){d.data("carousel").pause().to(h).cycle()}j.preventDefault()})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.options=b.extend({},b.fn.collapse.defaults,d);if(this.options.parent){this.$parent=b(this.options.parent)}this.options.toggle&&this.toggle()};c.prototype={constructor:c,dimension:function(){var d=this.$element.hasClass("width");return d?"width":"height"},show:function(){var g,d,f,e;if(this.transitioning||this.$element.hasClass("in")){return}g=this.dimension();d=b.camelCase(["scroll",g].join("-"));f=this.$parent&&this.$parent.find("> .accordion-group > .in");if(f&&f.length){e=f.data("collapse");if(e&&e.transitioning){return}f.collapse("hide");e||f.data("collapse",null)}this.$element[g](0);this.transition("addClass",b.Event("show"),"shown");b.support.transition&&this.$element[g](this.$element[0][d])},hide:function(){var d;if(this.transitioning||!this.$element.hasClass("in")){return}d=this.dimension();this.reset(this.$element[d]());this.transition("removeClass",b.Event("hide"),"hidden");this.$element[d](0)},reset:function(d){var e=this.dimension();this.$element.removeClass("collapse")[e](d||"auto")[0].offsetWidth;this.$element[d!==null?"addClass":"removeClass"]("collapse");return this},transition:function(h,e,f){var g=this,d=function(){if(e.type=="show"){g.reset()}g.transitioning=0;g.$element.trigger(f)};this.$element.trigger(e);if(e.isDefaultPrevented()){return}this.transitioning=1;this.$element[h]("in");b.support.transition&&this.$element.hasClass("collapse")?this.$element.one(b.support.transition.end,d):d()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var a=b.fn.collapse;b.fn.collapse=function(d){return this.each(function(){var g=b(this),f=g.data("collapse"),e=b.extend({},b.fn.collapse.defaults,g.data(),typeof d=="object"&&d);if(!f){g.data("collapse",(f=new c(this,e)))}if(typeof d=="string"){f[d]()}})};b.fn.collapse.defaults={toggle:true};b.fn.collapse.Constructor=c;b.fn.collapse.noConflict=function(){b.fn.collapse=a;return this};b(document).on("click.collapse.data-api","[data-toggle=collapse]",function(i){var h=b(this),d,g=h.attr("data-target")||i.preventDefault()||(d=h.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=b(g).data("collapse")?"toggle":h.data();h[b(g).hasClass("in")?"addClass":"removeClass"]("collapsed");b(g).collapse(f)})}(window.jQuery);!function(f){var b="[data-toggle=dropdown]",a=function(h){var g=f(h).on("click.dropdown.data-api",this.toggle);f("html").on("click.dropdown.data-api",function(){g.parent().removeClass("open")})};a.prototype={constructor:a,toggle:function(j){var i=f(this),h,g;if(i.is(".disabled, :disabled")){return}h=e(i);g=h.hasClass("open");d();if(!g){if("ontouchstart" in document.documentElement){f('
  • ',minLength:1};b.fn.typeahead.Constructor=c;b.fn.typeahead.noConflict=function(){b.fn.typeahead=a;return this};b(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(f){var d=b(this);if(d.data("typeahead")){return}d.typeahead(d.data())})}(window.jQuery);!function(c){var b=function(e,d){this.options=c.extend({},c.fn.affix.defaults,d);this.$window=c(window).on("scroll.affix.data-api",c.proxy(this.checkPosition,this)).on("click.affix.data-api",c.proxy(function(){setTimeout(c.proxy(this.checkPosition,this),1)},this));this.$element=c(e);this.checkPosition()};b.prototype.checkPosition=function(){if(!this.$element.is(":visible")){return}var h=c(document).height(),j=this.$window.scrollTop(),d=this.$element.offset(),k=this.options.offset,f=k.bottom,g=k.top,i="affix affix-top affix-bottom",e;if(typeof k!="object"){f=g=k}if(typeof g=="function"){g=k.top()}if(typeof f=="function"){f=k.bottom()}e=this.unpin!=null&&(j+this.unpin<=d.top)?false:f!=null&&(d.top+this.$element.height()>=h-f)?"bottom":g!=null&&j<=g?"top":false;if(this.affixed===e){return}this.affixed=e;this.unpin=e=="bottom"?d.top-j:null;this.$element.removeClass(i).addClass("affix"+(e?"-"+e:""))};var a=c.fn.affix;c.fn.affix=function(d){return this.each(function(){var g=c(this),f=g.data("affix"),e=typeof d=="object"&&d;if(!f){g.data("affix",(f=new b(this,e)))}if(typeof d=="string"){f[d]()}})};c.fn.affix.Constructor=b;c.fn.affix.defaults={offset:0};c.fn.affix.noConflict=function(){c.fn.affix=a;return this};c(window).on("load",function(){c('[data-spy="affix"]').each(function(){var e=c(this),d=e.data();d.offset=d.offset||{};d.offsetBottom&&(d.offset.bottom=d.offsetBottom);d.offsetTop&&(d.offset.top=d.offsetTop);e.affix(d)})})}(window.jQuery);var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;(function(){function d(F){function w(J){var K=J.charCodeAt(0);if(K!==92){return K}var I=J.charAt(1);return(K=k[I])?K:"0"<=I&&I<="7"?parseInt(J.substring(1),8):I==="u"||I==="x"?parseInt(J.substring(2),16):J.charCodeAt(1)}function C(I){if(I<32){return(I<16?"\\x0":"\\x")+I.toString(16)}I=String.fromCharCode(I);if(I==="\\"||I==="-"||I==="["||I==="]"){I="\\"+I}return I}function A(J){for(var M=J.substring(1,J.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),J=[],I=[],O=M[0]==="^",P=O?1:0,L=M.length;P122||(N<65||K>90||I.push([Math.max(65,K)|32,Math.min(N,90)|32]),N<97||K>122||I.push([Math.max(97,K)&-33,Math.min(N,122)&-33]))}}I.sort(function(Q,R){return Q[0]-R[0]||R[1]-Q[1]});M=[];K=[NaN,NaN];for(P=0;PL[0]&&(L[1]+1>L[0]&&I.push("-"),I.push(C(L[1])))}I.push("]");return I.join("")}function E(J){for(var M=J.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),I=M.length,N=[],O=0,L=0;O=2&&J==="["?M[O]=A(K):J!=="\\"&&(M[O]=K.replace(/[A-Za-z]/g,function(P){P=P.charCodeAt(0);return"["+String.fromCharCode(P&-33,P|32)+"]"}))}}return M.join("")}for(var G=0,H=!1,x=!1,u=0,D=F.length;u=5&&"lang-"===O.substring(0,5))&&!(D&&typeof D[1]==="string")){M=!1,O="src"}M||(B[K]=O)}I=L;L+=K.length;if(M){M=D[1];var H=K.indexOf(M),G=H+M.length;D[2]&&(G=K.length-D[2].length,H=G-M.length);O=O.substring(5);t(F+I,K.substring(0,H),x,C);t(F+I+H,M,s(O,M),C);t(F+I+G,K.substring(G),x,C)}else{C.push(F+I,O)}}P.e=C}var w={},A;(function(){for(var G=u.concat(k),B=[],F={},H=0,E=G.length;H=0;){w[I.charAt(C)]=D}}D=D[1];I=""+D;F.hasOwnProperty(I)||(B.push(D),F[I]=q)}B.push(/[\S\s]/);A=d(B)})();var v=k.length;return x}function o(u){var k=[],w=[];u.tripleQuotedStrings?k.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):u.multiLineStrings?k.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,q,"'\"`"]):k.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);u.verbatimStrings&&w.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var v=u.hashComments;v&&(u.cStyleComments?(v>1?k.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):k.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),w.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):k.push(["com",/^#[^\n\r]*/,q,"#"]));u.cStyleComments&&(w.push(["com",/^\/\/[^\n\r]*/,q]),w.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));u.regexLiterals&&w.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(v=u.types)&&w.push(["typ",v]);u=(""+u.keywords).replace(/^ | $/g,"");u.length&&w.push(["kwd",RegExp("^(?:"+u.replace(/[\s,]+/g,"|")+")\\b"),q]);k.push(["pln",/^\s+/,q," \r\n\t\xa0"]);w.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return h(k,w)}function r(H,x){function E(K){switch(K.nodeType){case 1:if(B.test(K.className)){break}if("BR"===K.nodeName){C(K),K.parentNode&&K.parentNode.removeChild(K)}else{for(K=K.firstChild;K;K=K.nextSibling){E(K)}}break;case 3:case 4:if(v){var k=K.nodeValue,L=k.match(I);if(L){var M=k.substring(0,L.index);K.nodeValue=M;(k=k.substring(L.index+L[0].length))&&K.parentNode.insertBefore(J.createTextNode(k),K.nextSibling);C(K);M||K.parentNode.removeChild(K)}}}}function C(K){function k(M,R){var Q=R?M.cloneNode(!1):M,P=M.parentNode;if(P){var P=k(P,1),O=M.nextSibling;P.appendChild(Q);for(var N=O;N;N=O){O=N.nextSibling,P.appendChild(N)}}return Q}for(;!K.nextSibling;){if(K=K.parentNode,!K){return}}for(var K=k(K.nextSibling,0),L;(L=K.parentNode)&&L.nodeType===1;){K=L}F.push(K)}var B=/(?:^|\s)nocode(?:\s|$)/,I=/\r\n?|\n/,J=H.ownerDocument,A;H.currentStyle?A=H.currentStyle.whiteSpace:window.getComputedStyle&&(A=J.defaultView.getComputedStyle(H,q).getPropertyValue("white-space"));var v=A&&"pre"===A.substring(0,3);for(A=J.createElement("LI");H.firstChild;){A.appendChild(H.firstChild)}for(var F=[A],D=0;D=0;){var v=k[w];y.hasOwnProperty(v)?window.console&&console.warn("cannot override language handler %s",v):y[v]=u}}function s(u,k){if(!u||!y.hasOwnProperty(u)){u=/^\s*=J&&(Q+=2);T>=V&&(X+=2)}}catch(C){"console" in window&&console.log(C&&C.stack?C.stack:C)}}var m=["break,continue,do,else,for,if,return,while"],j=[[m,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],n=[j,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],l=[j,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],i=[l,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],j=[j,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],g=[m,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],f=[m,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],m=[m,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,b=/\S/,a=o({keywords:[n,i,j,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+g,f,m],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),y={};z(a,["default-code"]);z(h([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);z(h([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);z(h([],[["atv",/^[\S\s]+/]]),["uq.val"]);z(o({keywords:n,hashComments:!0,cStyleComments:!0,types:e}),["c","cc","cpp","cxx","cyc","m"]);z(o({keywords:"null,true,false"}),["json"]);z(o({keywords:i,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:e}),["cs"]);z(o({keywords:l,cStyleComments:!0}),["java"]);z(o({keywords:m,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);z(o({keywords:g,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py"]);z(o({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);z(o({keywords:f,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);z(o({keywords:j,cStyleComments:!0,regexLiterals:!0}),["js"]);z(o({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);z(h([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(u,k,w){var v=document.createElement("PRE");v.innerHTML=u;w&&r(v,w);p({g:k,i:w,h:v});return v.innerHTML};window.prettyPrint=function(E){function v(){for(var L=window.PR_SHOULD_USE_CONTINUATION?w.now()+250:Infinity;u=0){var I=I.match(B),K,H;if(H=!I){H=O;for(var M=void 0,N=H.firstChild;N;N=N.nextSibling){var J=N.nodeType,M=J===1?M?H:N:J===3?b.test(N.nodeValue)?H:M:M}H=(K=M===H?void 0:M)&&"CODE"===K.tagName}H&&(I=K.className.match(B));I&&(I=I[1]);H=!1;for(M=O.parentNode;M;M=M.parentNode){if((M.tagName==="pre"||M.tagName==="code"||M.tagName==="xmp")&&M.className&&M.className.indexOf("prettyprint")>=0){H=!0;break}}H||((H=(H=O.className.match(/\blinenums\b(?::(\d+))?/))?H[1]&&H[1].length?+H[1]:!0:!1)&&r(O,H),D={g:I,h:O,i:H},p(D))}}u - + - dependency-check-gradle - Project License - + dependency-check-gradle – Project License + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 0.0.5 + Version: 0.0.6
  • @@ -77,61 +77,75 @@
    -
    +
    -
    +
    -

    Overview

    +

    Overview

    Typically the licenses listed for the project are that of the project itself, and not of dependencies.

    -

    Project License

    +

    Project License

    -

    The Apache Software License, Version 2.0

    +

    The Apache Software License, Version 2.0

                                      Apache License
    @@ -393,15 +407,14 @@
         
    -

    Copyright © 2015 +

    Copyright © 2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-gradle/mail-lists.html b/dependency-check-gradle/mail-lists.html index 4bae57b12..7fc0d42f8 100644 --- a/dependency-check-gradle/mail-lists.html +++ b/dependency-check-gradle/mail-lists.html @@ -1,21 +1,21 @@ - + - dependency-check-gradle - Project Mailing Lists - + dependency-check-gradle – Project Mailing Lists + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 0.0.5 + Version: 0.0.6
  • @@ -77,61 +77,75 @@
    -
    +
    -
    +
    -

    Project Mailing Lists

    +

    Project Mailing Lists

    These are the mailing lists that have been established for this project. For each list, there is a subscribe, unsubscribe, and an archive link.

    @@ -199,15 +213,14 @@
    -

    Copyright © 2015 +

    Copyright © 2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-gradle/plugin-updates-report.html b/dependency-check-gradle/plugin-updates-report.html new file mode 100644 index 000000000..f4c0ebcdb --- /dev/null +++ b/dependency-check-gradle/plugin-updates-report.html @@ -0,0 +1,184 @@ + + + + + + + + + dependency-check-gradle – + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + + +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-gradle/project-info.html b/dependency-check-gradle/project-info.html index 046e8bc11..64d716eab 100644 --- a/dependency-check-gradle/project-info.html +++ b/dependency-check-gradle/project-info.html @@ -1,21 +1,21 @@ - + - dependency-check-gradle - Project Information - + dependency-check-gradle – Project Information + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 0.0.5 + Version: 0.0.6
  • @@ -77,61 +77,75 @@
    -
    +
    -
    +
    -

    Project Information

    +

    Project Information

    This document provides an overview of the various documents and links that are part of this project's general information. All of this content is automatically generated by Maven on behalf of the project.

    -

    Overview

    +

    Overview

    + + + - - - - + -
    Document Description
    Continuous IntegrationThis is a link to the definitions of all continuous integration processes that builds and tests code on a frequent, regular basis.
    Project Summary This document lists other related information of this project
    Project LicenseThis is a link to the definitions of project licenses.
    Mailing Lists This document provides subscription and archive information for this project's mailing lists.
    Issue TrackingThis is a link to the issue management system for this project. Issues (bugs, features, change requests) can be created and queried using this link.
    This document provides information on the issue management system used in this project.
    Project Team This document provides information on the members of this project. These are the individuals who have contributed to the project in one form or another.
    Source RepositoryThis is a link to the online source repository that can be viewed via a web browser.
    +
    This document lists ways to access the online source repository.
    Project LicenseThis document lists the project license(s).
    @@ -210,15 +227,14 @@
    -

    Copyright © 2015 +

    Copyright © 2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-gradle/project-reports.html b/dependency-check-gradle/project-reports.html new file mode 100644 index 000000000..f27012560 --- /dev/null +++ b/dependency-check-gradle/project-reports.html @@ -0,0 +1,201 @@ + + + + + + + + + dependency-check-gradle – Generated Reports + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +
    +

    Generated Reports

    +

    This document provides an overview of the various reports that are automatically generated by Maven . Each report is briefly described below.

    +
    +

    Overview

    + + + + + + + + + + + + +
    DocumentDescription
    Dependency AnalysisDependency analysis of the project (used declared, used undeclared, unused declared)
    Dependency Updates ReportProvides details of the dependencies which have updated versions available.
    Plugin Updates ReportProvides details of the plugins used by this project which have newer versions available.
    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-gradle/project-summary.html b/dependency-check-gradle/project-summary.html index 90cb20fa8..15ecc7a3f 100644 --- a/dependency-check-gradle/project-summary.html +++ b/dependency-check-gradle/project-summary.html @@ -1,21 +1,21 @@ - + - dependency-check-gradle - Project Summary - + dependency-check-gradle – Project Summary + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 0.0.5 + Version: 0.0.6
  • @@ -77,61 +77,75 @@
    -
    +
    -
    +
    -

    Project Summary

    +

    Project Summary

    -

    Project Information

    +

    Project Information

    @@ -192,7 +206,7 @@
    FieldHomepage http://maven.apache.org
    -

    Project Organization

    +

    Project Organization

    @@ -204,7 +218,7 @@
    FieldURL http://www.owasp.org
    -

    Build Information

    +

    Build Information

    @@ -217,7 +231,7 @@ - +
    Fielddependency-check-gradle
    Version0.0.5
    0.0.6
    Type pom
    @@ -230,15 +244,14 @@
    -

    Copyright © 2015 +

    Copyright © 2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-gradle/source-repository.html b/dependency-check-gradle/source-repository.html index e1bbe41fa..fbe4b87aa 100644 --- a/dependency-check-gradle/source-repository.html +++ b/dependency-check-gradle/source-repository.html @@ -1,21 +1,21 @@ - + - dependency-check-gradle - Source Repository - + dependency-check-gradle – Source Repository + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 0.0.5 + Version: 0.0.6
  • @@ -77,61 +77,75 @@
    -
    +
    -
    +
    -

    Overview

    -

    This project uses GIT to manage its source code. Instructions on GIT use can be found at http://git-scm.com/documentation.

    +

    Overview

    +

    This project uses Git to manage its source code. Instructions on Git use can be found at http://git-scm.com/documentation.

    -

    Web Access

    -

    The following is a link to the online source repository.

    -
    +

    Web Browser Access

    +

    The following is a link to a browsable version of the source repository:

    +
    -

    Anonymous access

    -

    The source can be checked out anonymously from GIT with this command (See http://git-scm.com/docs/git-clone):

    -
    -
    $ git clone git@github.com:jeremylong/DependencyCheck.git/dependency-check-gradle
    +

    Anonymous Access

    +

    The source can be checked out anonymously from Git with this command (See http://git-scm.com/docs/git-clone):

    +
    $ git clone git@github.com:jeremylong/DependencyCheck.git
    -

    Developer access

    -

    Only project developers can access the GIT tree via this method (See http://git-scm.com/docs/git-clone).

    -
    -
    $ git clone git@github.com:jeremylong/DependencyCheck.git/dependency-check-gradle
    +

    Developer Access

    +

    Only project developers can access the Git tree via this method (See http://git-scm.com/docs/git-clone).

    +
    $ git clone git@github.com:jeremylong/DependencyCheck.git
    -

    Access from behind a firewall

    +

    Access from Behind a Firewall

    Refer to the documentation of the SCM used for more information about access behind a firewall.

    @@ -204,15 +215,14 @@
    -

    Copyright © 2015 +

    Copyright © 2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-gradle/team-list.html b/dependency-check-gradle/team-list.html index 49c0d497b..a39f98e3b 100644 --- a/dependency-check-gradle/team-list.html +++ b/dependency-check-gradle/team-list.html @@ -1,21 +1,21 @@ - + - dependency-check-gradle - Team list - + dependency-check-gradle – Project Team + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -63,13 +63,13 @@ dependency-check / -
  • Team list
  • +
  • Project Team
  • -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 0.0.5 + Version: 0.0.6
  • @@ -77,61 +77,75 @@
    -
    +
    -
    +
    -

    The Team

    +

    The Team

    A successful project requires many people to play many roles. Some members write code or documentation, while others are valuable as testers, submitting patches and suggestions.

    The team is comprised of Members and Contributors. Members have direct access to the source of a project and actively evolve the code-base. Contributors improve the project through submission of patches and suggestions to the Members. The number of Contributors to the project is unbounded. Get involved today. All contributions to the project are greatly appreciated.

    -

    Members

    +

    Members

    The following is a list of developers with commit privileges that have directly contributed to the project in one way or another.

    @@ -218,7 +232,7 @@
    https://www.ida.org/ developer
    -

    Contributors

    +

    Contributors

    The following additional people have contributed to this project through the way of suggestions, patches or documentation.

    @@ -230,22 +244,7 @@ -
    Hugo Costa OWASP https://www.owasp.org/logo design
    +logo design
    @@ -255,15 +254,14 @@ window.onLoad = init();
    -

    Copyright © 2015 +

    Copyright © 2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-jenkins/css/apache-maven-fluido-1.4.min.css b/dependency-check-jenkins/css/apache-maven-fluido-1.4.min.css new file mode 100644 index 000000000..54a006744 --- /dev/null +++ b/dependency-check-jenkins/css/apache-maven-fluido-1.4.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eeeeee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #dddddd #eee #eeeeee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eeeeee #eee #dddddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}.clear{clear:both;visibility:hidden}.clear hr{display:none}.section p,.section p,.section dt,.section dt{margin-right:7px;margin-left:7px}#ohloh{margin-bottom:10px}#poweredBy{text-align:center}a.externalLink{padding-right:18px}a.newWindow{background:url('../images/window-new.png') right center no-repeat;padding-right:18px}a.externalLink[href^=http]{background:url('../images/internet-web-browser.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".asc"]{background:url('../images/accessories-text-editor.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".jpg"],a.externalLink[href$=".jpeg"],a.externalLink[href$=".gif"],a.externalLink[href$=".png"]{background:url('../images/image-x-generic.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".tar.gz"],a.externalLink[href$=".zip"]{background:url('../images/package-x-generic.png') right center no-repeat;padding-right:18px}a.externalLink[href$=".md5"],a.externalLink[href$=".sha1"]{background:url('../images/document-properties.png') right center no-repeat;padding-right:18px}a.externalLink[href^=https]{background:url('../images/application-certificate.png') right center no-repeat;padding-right:18px}a.externalLink[href^=file]{background:url('../images/drive-harddisk.png') right center no-repeat;padding-right:18px}a.externalLink[href^=ftp]{background:url('../images/network-server.png') right center no-repeat;padding-right:18px}a.externalLink[href^=mailto]{background:url('../images/contact-new.png') right center no-repeat;padding-right:18px}li.none{list-style:none}.search-query{background-image:url(http://www.google.com/cse/intl/en/images/google_custom_search_watermark.gif);background-attachment:initial;background-origin:initial;background-clip:initial;background-color:#fff;background-position:0 50%;background-repeat:no-repeat no-repeat;width:95%}body.topBarEnabled{padding-top:60px}body.topBarDisabled{padding-top:20px}.builtBy{display:block}img.builtBy{margin:10px auto}#search-form{margin-left:9px;margin-right:9px}.hero-unit h2{font-size:60px}tt{padding:0 3px 2px;font-family:Monaco,Andale Mono,Courier New,monospace;font-size:.9em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#fee9cc;color:rgba(0,0,0,0.75);padding:1px 3px}li{color:#404040}table.zebra-striped{background-color:#FFF}.footer{background-color:#EEE}.sidebar-nav{padding-left:0;padding-right:0}.sidebar-nav .icon-chevron-right,.sidebar-nav .icon-chevron-down{margin-top:2px;margin-right:-6px;float:right;opacity:.25}li.pull-right{margin-left:3px;margin-right:3px}.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0;padding-left:15px}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/dependency-check-jenkins/dependency-analysis.html b/dependency-check-jenkins/dependency-analysis.html new file mode 100644 index 000000000..ee9d5a9c4 --- /dev/null +++ b/dependency-check-jenkins/dependency-analysis.html @@ -0,0 +1,184 @@ + + + + + + + + + dependency-check-jenkins – + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + + +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-jenkins/dependency-updates-report.html b/dependency-check-jenkins/dependency-updates-report.html new file mode 100644 index 000000000..038f3fc76 --- /dev/null +++ b/dependency-check-jenkins/dependency-updates-report.html @@ -0,0 +1,184 @@ + + + + + + + + + dependency-check-jenkins – + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + + +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-jenkins/fonts/glyphicons-halflings-regular.eot b/dependency-check-jenkins/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..637452ea5404ac01670c10db5276e73114d16178 GIT binary patch literal 35283 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 literal 0 HcmV?d00001 diff --git a/dependency-check-jenkins/fonts/glyphicons-halflings-regular.svg b/dependency-check-jenkins/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 000000000..446948874 --- /dev/null +++ b/dependency-check-jenkins/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dependency-check-jenkins/fonts/glyphicons-halflings-regular.ttf b/dependency-check-jenkins/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..282401576351ef7d0eb7313e74a251694b6d78bc GIT binary patch literal 55016 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

    ;Iyg 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 DH|yT| literal 0 HcmV?d00001 diff --git a/dependency-check-jenkins/fonts/glyphicons-halflings-regular.woff b/dependency-check-jenkins/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..f824ac15a0ac59d8c236f346f3bd429542cdf8b9 GIT binary patch literal 41793 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 literal 33442 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 - + - dependency-check-jenkins - - + dependency-check-jenkins – Dependency-Check Jenkins Plugin + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@

  • - + /
  • @@ -63,13 +63,13 @@ dependency-check / -
  • +
  • Dependency-Check Jenkins Plugin
  • -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,19 +77,26 @@
    -
    +
    -
    +

    Dependency-Check Jenkins Plugin

    Dependency-Check is a utility that identifies project dependencies and checks if there are any known, publicly disclosed, vulnerabilities. This tool can be part of the solution to the OWASP Top 10 2013: A9 - Using Components with Known Vulnerabilities. This plug-in can independently execute a Dependency-Check analysis and visualize results.

    The Dependency-Check Jenkins Plugin features the ability to perform a dependency analysis build and later view results post build. The plugin is built using analysis-core and features many of the same features that Jenkins static analysis plugins offer, including thresholds, charts and the ability to view vulnerability information should a dependency have one identified.

    More information can be found on the wiki.

    -

    Copyright & License

    +

    Copyright & License

    Dependency-Check is Copyright (c) 2012-2014 Jeremy Long. All Rights Reserved.

    Dependency-Check Jenkins Plugin is Copyright (c) 2013-2014 Steve Springett. All Rights Reserved.

    Permission to modify and redistribute is granted under the terms of the Apache 2.0 license. See the LICENSE.txt file for the full license.

    @@ -155,15 +162,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-jenkins/integration.html b/dependency-check-jenkins/integration.html new file mode 100644 index 000000000..02ce8e3c3 --- /dev/null +++ b/dependency-check-jenkins/integration.html @@ -0,0 +1,221 @@ + + + + + + + + + dependency-check-jenkins – Continuous Integration + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +
    +

    Overview

    +

    This project uses Continuous Integration System.

    +
    +

    Access

    +

    The following is a link to the continuous integration system used by the project:

    +
    +
    +

    Notifiers

    +

    No notifiers are defined. Please check back at a later date.

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-jenkins/issue-tracking.html b/dependency-check-jenkins/issue-tracking.html index 3501520b5..4f59a7e2c 100644 --- a/dependency-check-jenkins/issue-tracking.html +++ b/dependency-check-jenkins/issue-tracking.html @@ -1,21 +1,21 @@ - + - dependency-check-jenkins - Issue Tracking - + dependency-check-jenkins – Issue Tracking + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,61 +77,75 @@
    -
    +
    -
    +
    -

    Overview

    +

    Overview

    This project uses github to manage its issues.

    -

    Issue Tracking

    +

    Issue Tracking

    Issues, bugs, and feature requests should be submitted to the following issue tracking system for this project.

    -
    +
    @@ -191,15 +204,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-jenkins/js/apache-maven-fluido-1.4.min.js b/dependency-check-jenkins/js/apache-maven-fluido-1.4.min.js new file mode 100644 index 000000000..0537c09d6 --- /dev/null +++ b/dependency-check-jenkins/js/apache-maven-fluido-1.4.min.js @@ -0,0 +1,25 @@ +/*! + * jQuery JavaScript Library v1.11.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-17T15:27Z + */ +(function(b,a){if(typeof module==="object"&&typeof module.exports==="object"){module.exports=b.document?a(b,true):function(c){if(!c.document){throw new Error("jQuery requires a window with a document")}return a(c)}}else{a(b)}}(typeof window!=="undefined"?window:this,function(a5,av){var aP=[];var P=aP.slice;var az=aP.concat;var x=aP.push;var bU=aP.indexOf;var ac={};var y=ac.toString;var K=ac.hasOwnProperty;var D={};var ai="1.11.2",bI=function(e,i){return new bI.fn.init(e,i)},E=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bS=/^-ms-/,aW=/-([\da-z])/gi,O=function(e,i){return i.toUpperCase()};bI.fn=bI.prototype={jquery:ai,constructor:bI,selector:"",length:0,toArray:function(){return P.call(this)},get:function(e){return e!=null?(e<0?this[e+this.length]:this[e]):P.call(this)},pushStack:function(e){var i=bI.merge(this.constructor(),e);i.prevObject=this;i.context=this.context;return i},each:function(i,e){return bI.each(this,i,e)},map:function(e){return this.pushStack(bI.map(this,function(b7,b6){return e.call(b7,b6,b7)}))},slice:function(){return this.pushStack(P.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(b7){var e=this.length,b6=+b7+(b7<0?e:0);return this.pushStack(b6>=0&&b6=0},isEmptyObject:function(i){var e;for(e in i){return false}return true},isPlainObject:function(b7){var i;if(!b7||bI.type(b7)!=="object"||b7.nodeType||bI.isWindow(b7)){return false}try{if(b7.constructor&&!K.call(b7,"constructor")&&!K.call(b7.constructor.prototype,"isPrototypeOf")){return false}}catch(b6){return false}if(D.ownLast){for(i in b7){return K.call(b7,i)}}for(i in b7){}return i===undefined||K.call(b7,i)},type:function(e){if(e==null){return e+""}return typeof e==="object"||typeof e==="function"?ac[y.call(e)]||"object":typeof e},globalEval:function(e){if(e&&bI.trim(e)){(a5.execScript||function(i){a5["eval"].call(a5,i)})(e)}},camelCase:function(e){return e.replace(bS,"ms-").replace(aW,O)},nodeName:function(i,e){return i.nodeName&&i.nodeName.toLowerCase()===e.toLowerCase()},each:function(ca,cb,b6){var b9,b7=0,b8=ca.length,e=ad(ca);if(b6){if(e){for(;b70&&(i-1) in b6}var m= +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function(de){var cy,dh,cn,cH,cK,ci,cW,dg,dm,cI,cX,cZ,cC,co,c8,c3,df,ce,cF,da="sizzle"+1*new Date(),cJ=de.document,di=0,c4=0,b9=cA(),c9=cA(),cG=cA(),cE=function(i,e){if(i===e){cX=true}return 0},cQ=1<<31,cO=({}).hasOwnProperty,dc=[],dd=dc.pop,cM=dc.push,b7=dc.push,cm=dc.slice,cd=function(dq,dp){var dn=0,e=dq.length;for(;dn+~]|"+cp+")"+cp+"*"),ct=new RegExp("="+cp+"*([^\\]'\"]*?)"+cp+"*\\]","g"),cS=new RegExp(ck),cU=new RegExp("^"+cL+"$"),c2={ID:new RegExp("^#("+b6+")"),CLASS:new RegExp("^\\.("+b6+")"),TAG:new RegExp("^("+b6.replace("w","w*")+")"),ATTR:new RegExp("^"+c6),PSEUDO:new RegExp("^"+ck),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+cp+"*(even|odd|(([+-]|)(\\d*)n|)"+cp+"*(?:([+-]|)"+cp+"*(\\d+)|))"+cp+"*\\)|)","i"),bool:new RegExp("^(?:"+b8+")$","i"),needsContext:new RegExp("^"+cp+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+cp+"*((?:-\\d)?\\d*)"+cp+"*\\)|)(?=[^-]|$)","i")},cc=/^(?:input|select|textarea|button)$/i,cl=/^h\d$/i,cP=/^[^{]+\{\s*\[native \w/,cR=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,c1=/[+~]/,cN=/'|\\/g,cs=new RegExp("\\\\([\\da-f]{1,6}"+cp+"?|("+cp+")|.)","ig"),c5=function(e,dp,i){var dn="0x"+dp-65536;return dn!==dn||i?dp:dn<0?String.fromCharCode(dn+65536):String.fromCharCode(dn>>10|55296,dn&1023|56320)},dl=function(){cZ()};try{b7.apply((dc=cm.call(cJ.childNodes)),cJ.childNodes);dc[cJ.childNodes.length].nodeType}catch(cD){b7={apply:dc.length?function(i,e){cM.apply(i,cm.call(e))}:function(dq,dp){var e=dq.length,dn=0;while((dq[e++]=dp[dn++])){}dq.length=e-1}}}function cw(dv,dn,dz,dB){var dA,ds,dt,dx,dy,dr,dq,e,dp,dw;if((dn?dn.ownerDocument||dn:cJ)!==cC){cZ(dn)}dn=dn||cC;dz=dz||[];dx=dn.nodeType;if(typeof dv!=="string"||!dv||dx!==1&&dx!==9&&dx!==11){return dz}if(!dB&&c8){if(dx!==11&&(dA=cR.exec(dv))){if((dt=dA[1])){if(dx===9){ds=dn.getElementById(dt);if(ds&&ds.parentNode){if(ds.id===dt){dz.push(ds);return dz}}else{return dz}}else{if(dn.ownerDocument&&(ds=dn.ownerDocument.getElementById(dt))&&cF(dn,ds)&&ds.id===dt){dz.push(ds);return dz}}}else{if(dA[2]){b7.apply(dz,dn.getElementsByTagName(dv));return dz}else{if((dt=dA[3])&&dh.getElementsByClassName){b7.apply(dz,dn.getElementsByClassName(dt));return dz}}}}if(dh.qsa&&(!c3||!c3.test(dv))){e=dq=da;dp=dn;dw=dx!==1&&dv;if(dx===1&&dn.nodeName.toLowerCase()!=="object"){dr=ci(dv);if((dq=dn.getAttribute("id"))){e=dq.replace(cN,"\\$&")}else{dn.setAttribute("id",e)}e="[id='"+e+"'] ";dy=dr.length;while(dy--){dr[dy]=e+ch(dr[dy])}dp=c1.test(dv)&&cT(dn.parentNode)||dn;dw=dr.join(",")}if(dw){try{b7.apply(dz,dp.querySelectorAll(dw));return dz}catch(du){}finally{if(!dq){dn.removeAttribute("id")}}}}}return dg(dv.replace(cr,"$1"),dn,dz,dB)}function cA(){var i=[];function e(dn,dp){if(i.push(dn+" ")>cn.cacheLength){delete e[i.shift()]}return(e[dn+" "]=dp)}return e}function cj(e){e[da]=true;return e}function cf(i){var dp=cC.createElement("div");try{return !!i(dp)}catch(dn){return false}finally{if(dp.parentNode){dp.parentNode.removeChild(dp)}dp=null}}function dj(dn,dq){var e=dn.split("|"),dp=dn.length;while(dp--){cn.attrHandle[e[dp]]=dq}}function ca(i,e){var dp=e&&i,dn=dp&&i.nodeType===1&&e.nodeType===1&&(~e.sourceIndex||cQ)-(~i.sourceIndex||cQ);if(dn){return dn}if(dp){while((dp=dp.nextSibling)){if(dp===e){return -1}}}return i?1:-1}function cx(e){return function(dn){var i=dn.nodeName.toLowerCase();return i==="input"&&dn.type===e}}function cb(e){return function(dn){var i=dn.nodeName.toLowerCase();return(i==="input"||i==="button")&&dn.type===e}}function c7(e){return cj(function(i){i=+i;return cj(function(dn,ds){var dq,dp=e([],dn.length,i),dr=dp.length;while(dr--){if(dn[(dq=dp[dr])]){dn[dq]=!(ds[dq]=dn[dq])}}})})}function cT(e){return e&&typeof e.getElementsByTagName!=="undefined"&&e}dh=cw.support={};cK=cw.isXML=function(e){var i=e&&(e.ownerDocument||e).documentElement;return i?i.nodeName!=="HTML":false};cZ=cw.setDocument=function(dn){var e,i,dp=dn?dn.ownerDocument||dn:cJ;if(dp===cC||dp.nodeType!==9||!dp.documentElement){return cC}cC=dp;co=dp.documentElement;i=dp.defaultView;if(i&&i!==i.top){if(i.addEventListener){i.addEventListener("unload",dl,false)}else{if(i.attachEvent){i.attachEvent("onunload",dl)}}}c8=!cK(dp);dh.attributes=cf(function(dq){dq.className="i";return !dq.getAttribute("className")});dh.getElementsByTagName=cf(function(dq){dq.appendChild(dp.createComment(""));return !dq.getElementsByTagName("*").length});dh.getElementsByClassName=cP.test(dp.getElementsByClassName);dh.getById=cf(function(dq){co.appendChild(dq).id=da;return !dp.getElementsByName||!dp.getElementsByName(da).length});if(dh.getById){cn.find.ID=function(ds,dr){if(typeof dr.getElementById!=="undefined"&&c8){var dq=dr.getElementById(ds);return dq&&dq.parentNode?[dq]:[]}};cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(ds){return ds.getAttribute("id")===dq}}}else{delete cn.find.ID;cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(dt){var ds=typeof dt.getAttributeNode!=="undefined"&&dt.getAttributeNode("id");return ds&&ds.value===dq}}}cn.find.TAG=dh.getElementsByTagName?function(dq,dr){if(typeof dr.getElementsByTagName!=="undefined"){return dr.getElementsByTagName(dq)}else{if(dh.qsa){return dr.querySelectorAll(dq)}}}:function(dq,du){var dv,dt=[],ds=0,dr=du.getElementsByTagName(dq);if(dq==="*"){while((dv=dr[ds++])){if(dv.nodeType===1){dt.push(dv)}}return dt}return dr};cn.find.CLASS=dh.getElementsByClassName&&function(dr,dq){if(c8){return dq.getElementsByClassName(dr)}};df=[];c3=[];if((dh.qsa=cP.test(dp.querySelectorAll))){cf(function(dq){co.appendChild(dq).innerHTML="";if(dq.querySelectorAll("[msallowcapture^='']").length){c3.push("[*^$]="+cp+"*(?:''|\"\")")}if(!dq.querySelectorAll("[selected]").length){c3.push("\\["+cp+"*(?:value|"+b8+")")}if(!dq.querySelectorAll("[id~="+da+"-]").length){c3.push("~=")}if(!dq.querySelectorAll(":checked").length){c3.push(":checked")}if(!dq.querySelectorAll("a#"+da+"+*").length){c3.push(".#.+[+~]")}});cf(function(dr){var dq=dp.createElement("input");dq.setAttribute("type","hidden");dr.appendChild(dq).setAttribute("name","D");if(dr.querySelectorAll("[name=d]").length){c3.push("name"+cp+"*[*^$|!~]?=")}if(!dr.querySelectorAll(":enabled").length){c3.push(":enabled",":disabled")}dr.querySelectorAll("*,:x");c3.push(",.*:")})}if((dh.matchesSelector=cP.test((ce=co.matches||co.webkitMatchesSelector||co.mozMatchesSelector||co.oMatchesSelector||co.msMatchesSelector)))){cf(function(dq){dh.disconnectedMatch=ce.call(dq,"div");ce.call(dq,"[s!='']:x");df.push("!=",ck)})}c3=c3.length&&new RegExp(c3.join("|"));df=df.length&&new RegExp(df.join("|"));e=cP.test(co.compareDocumentPosition);cF=e||cP.test(co.contains)?function(dr,dq){var dt=dr.nodeType===9?dr.documentElement:dr,ds=dq&&dq.parentNode;return dr===ds||!!(ds&&ds.nodeType===1&&(dt.contains?dt.contains(ds):dr.compareDocumentPosition&&dr.compareDocumentPosition(ds)&16))}:function(dr,dq){if(dq){while((dq=dq.parentNode)){if(dq===dr){return true}}}return false};cE=e?function(dr,dq){if(dr===dq){cX=true;return 0}var ds=!dr.compareDocumentPosition-!dq.compareDocumentPosition;if(ds){return ds}ds=(dr.ownerDocument||dr)===(dq.ownerDocument||dq)?dr.compareDocumentPosition(dq):1;if(ds&1||(!dh.sortDetached&&dq.compareDocumentPosition(dr)===ds)){if(dr===dp||dr.ownerDocument===cJ&&cF(cJ,dr)){return -1}if(dq===dp||dq.ownerDocument===cJ&&cF(cJ,dq)){return 1}return cI?(cd(cI,dr)-cd(cI,dq)):0}return ds&4?-1:1}:function(dr,dq){if(dr===dq){cX=true;return 0}var dx,du=0,dw=dr.parentNode,dt=dq.parentNode,ds=[dr],dv=[dq];if(!dw||!dt){return dr===dp?-1:dq===dp?1:dw?-1:dt?1:cI?(cd(cI,dr)-cd(cI,dq)):0}else{if(dw===dt){return ca(dr,dq)}}dx=dr;while((dx=dx.parentNode)){ds.unshift(dx)}dx=dq;while((dx=dx.parentNode)){dv.unshift(dx)}while(ds[du]===dv[du]){du++}return du?ca(ds[du],dv[du]):ds[du]===cJ?-1:dv[du]===cJ?1:0};return dp};cw.matches=function(i,e){return cw(i,null,null,e)};cw.matchesSelector=function(dn,dq){if((dn.ownerDocument||dn)!==cC){cZ(dn)}dq=dq.replace(ct,"='$1']");if(dh.matchesSelector&&c8&&(!df||!df.test(dq))&&(!c3||!c3.test(dq))){try{var i=ce.call(dn,dq);if(i||dh.disconnectedMatch||dn.document&&dn.document.nodeType!==11){return i}}catch(dp){}}return cw(dq,cC,null,[dn]).length>0};cw.contains=function(e,i){if((e.ownerDocument||e)!==cC){cZ(e)}return cF(e,i)};cw.attr=function(dn,e){if((dn.ownerDocument||dn)!==cC){cZ(dn)}var i=cn.attrHandle[e.toLowerCase()],dp=i&&cO.call(cn.attrHandle,e.toLowerCase())?i(dn,e,!c8):undefined;return dp!==undefined?dp:dh.attributes||!c8?dn.getAttribute(e):(dp=dn.getAttributeNode(e))&&dp.specified?dp.value:null};cw.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};cw.uniqueSort=function(dp){var dq,dr=[],e=0,dn=0;cX=!dh.detectDuplicates;cI=!dh.sortStable&&dp.slice(0);dp.sort(cE);if(cX){while((dq=dp[dn++])){if(dq===dp[dn]){e=dr.push(dn)}}while(e--){dp.splice(dr[e],1)}}cI=null;return dp};cH=cw.getText=function(dr){var dq,dn="",dp=0,e=dr.nodeType;if(!e){while((dq=dr[dp++])){dn+=cH(dq)}}else{if(e===1||e===9||e===11){if(typeof dr.textContent==="string"){return dr.textContent}else{for(dr=dr.firstChild;dr;dr=dr.nextSibling){dn+=cH(dr)}}}else{if(e===3||e===4){return dr.nodeValue}}}return dn};cn=cw.selectors={cacheLength:50,createPseudo:cj,match:c2,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){e[1]=e[1].replace(cs,c5);e[3]=(e[3]||e[4]||e[5]||"").replace(cs,c5);if(e[2]==="~="){e[3]=" "+e[3]+" "}return e.slice(0,4)},CHILD:function(e){e[1]=e[1].toLowerCase();if(e[1].slice(0,3)==="nth"){if(!e[3]){cw.error(e[0])}e[4]=+(e[4]?e[5]+(e[6]||1):2*(e[3]==="even"||e[3]==="odd"));e[5]=+((e[7]+e[8])||e[3]==="odd")}else{if(e[3]){cw.error(e[0])}}return e},PSEUDO:function(i){var e,dn=!i[6]&&i[2];if(c2.CHILD.test(i[0])){return null}if(i[3]){i[2]=i[4]||i[5]||""}else{if(dn&&cS.test(dn)&&(e=ci(dn,true))&&(e=dn.indexOf(")",dn.length-e)-dn.length)){i[0]=i[0].slice(0,e);i[2]=dn.slice(0,e)}}return i.slice(0,3)}},filter:{TAG:function(i){var e=i.replace(cs,c5).toLowerCase();return i==="*"?function(){return true}:function(dn){return dn.nodeName&&dn.nodeName.toLowerCase()===e}},CLASS:function(e){var i=b9[e+" "];return i||(i=new RegExp("(^|"+cp+")"+e+"("+cp+"|$)"))&&b9(e,function(dn){return i.test(typeof dn.className==="string"&&dn.className||typeof dn.getAttribute!=="undefined"&&dn.getAttribute("class")||"")})},ATTR:function(dn,i,e){return function(dq){var dp=cw.attr(dq,dn);if(dp==null){return i==="!="}if(!i){return true}dp+="";return i==="="?dp===e:i==="!="?dp!==e:i==="^="?e&&dp.indexOf(e)===0:i==="*="?e&&dp.indexOf(e)>-1:i==="$="?e&&dp.slice(-e.length)===e:i==="~="?(" "+dp.replace(cu," ")+" ").indexOf(e)>-1:i==="|="?dp===e||dp.slice(0,e.length+1)===e+"-":false}},CHILD:function(i,dq,dp,dr,dn){var dt=i.slice(0,3)!=="nth",e=i.slice(-4)!=="last",ds=dq==="of-type";return dr===1&&dn===0?function(du){return !!du.parentNode}:function(dA,dy,dD){var du,dG,dB,dF,dC,dx,dz=dt!==e?"nextSibling":"previousSibling",dE=dA.parentNode,dw=ds&&dA.nodeName.toLowerCase(),dv=!dD&&!ds;if(dE){if(dt){while(dz){dB=dA;while((dB=dB[dz])){if(ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1){return false}}dx=dz=i==="only"&&!dx&&"nextSibling"}return true}dx=[e?dE.firstChild:dE.lastChild];if(e&&dv){dG=dE[da]||(dE[da]={});du=dG[i]||[];dC=du[0]===di&&du[1];dF=du[0]===di&&du[2];dB=dC&&dE.childNodes[dC];while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if(dB.nodeType===1&&++dF&&dB===dA){dG[i]=[di,dC,dF];break}}}else{if(dv&&(du=(dA[da]||(dA[da]={}))[i])&&du[0]===di){dF=du[1]}else{while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if((ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1)&&++dF){if(dv){(dB[da]||(dB[da]={}))[i]=[di,dF]}if(dB===dA){break}}}}}dF-=dn;return dF===dr||(dF%dr===0&&dF/dr>=0)}}},PSEUDO:function(dp,dn){var e,i=cn.pseudos[dp]||cn.setFilters[dp.toLowerCase()]||cw.error("unsupported pseudo: "+dp);if(i[da]){return i(dn)}if(i.length>1){e=[dp,dp,"",dn];return cn.setFilters.hasOwnProperty(dp.toLowerCase())?cj(function(ds,du){var dr,dq=i(ds,dn),dt=dq.length;while(dt--){dr=cd(ds,dq[dt]);ds[dr]=!(du[dr]=dq[dt])}}):function(dq){return i(dq,0,e)}}return i}},pseudos:{not:cj(function(e){var i=[],dn=[],dp=cW(e.replace(cr,"$1"));return dp[da]?cj(function(dr,dw,du,ds){var dv,dq=dp(dr,null,ds,[]),dt=dr.length;while(dt--){if((dv=dq[dt])){dr[dt]=!(dw[dt]=dv)}}}):function(ds,dr,dq){i[0]=ds;dp(i,null,dq,dn);i[0]=null;return !dn.pop()}}),has:cj(function(e){return function(i){return cw(e,i).length>0}}),contains:cj(function(e){e=e.replace(cs,c5);return function(i){return(i.textContent||i.innerText||cH(i)).indexOf(e)>-1}}),lang:cj(function(e){if(!cU.test(e||"")){cw.error("unsupported lang: "+e)}e=e.replace(cs,c5).toLowerCase();return function(dn){var i;do{if((i=c8?dn.lang:dn.getAttribute("xml:lang")||dn.getAttribute("lang"))){i=i.toLowerCase();return i===e||i.indexOf(e+"-")===0}}while((dn=dn.parentNode)&&dn.nodeType===1);return false}}),target:function(e){var i=de.location&&de.location.hash;return i&&i.slice(1)===e.id},root:function(e){return e===co},focus:function(e){return e===cC.activeElement&&(!cC.hasFocus||cC.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===false},disabled:function(e){return e.disabled===true},checked:function(e){var i=e.nodeName.toLowerCase();return(i==="input"&&!!e.checked)||(i==="option"&&!!e.selected)},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling){if(e.nodeType<6){return false}}return true},parent:function(e){return !cn.pseudos.empty(e)},header:function(e){return cl.test(e.nodeName)},input:function(e){return cc.test(e.nodeName)},button:function(i){var e=i.nodeName.toLowerCase();return e==="input"&&i.type==="button"||e==="button"},text:function(i){var e;return i.nodeName.toLowerCase()==="input"&&i.type==="text"&&((e=i.getAttribute("type"))==null||e.toLowerCase()==="text")},first:c7(function(){return[0]}),last:c7(function(e,i){return[i-1]}),eq:c7(function(e,dn,i){return[i<0?i+dn:i]}),even:c7(function(e,dp){var dn=0;for(;dn=0;){e.push(dn)}return e}),gt:c7(function(e,dq,dp){var dn=dp<0?dp+dq:dp;for(;++dn1?function(dr,dq,dn){var dp=e.length;while(dp--){if(!e[dp](dr,dq,dn)){return false}}return true}:e[0]}function cz(dn,dr,dq){var dp=0,e=dr.length;for(;dp-1){dC[dE]=!(dz[dE]=dw)}}}}else{dy=c0(dy===dz?dy.splice(dt,dy.length):dy);if(dr){dr(null,dz,dy,dB)}else{b7.apply(dz,dy)}}})}function db(dt){var dn,dr,dp,ds=dt.length,dw=cn.relative[dt[0].type],dx=dw||cn.relative[" "],dq=dw?1:0,du=cq(function(i){return i===dn},dx,true),dv=cq(function(i){return cd(dn,i)>-1},dx,true),e=[function(dA,dz,dy){var i=(!dw&&(dy||dz!==dm))||((dn=dz).nodeType?du(dA,dz,dy):dv(dA,dz,dy));dn=null;return i}];for(;dq1&&dk(e),dq>1&&ch(dt.slice(0,dq-1).concat({value:dt[dq-2].type===" "?"*":""})).replace(cr,"$1"),dr,dq0,dq=dp.length>0,i=function(dA,du,dz,dy,dD){var dv,dw,dB,dF=0,dx="0",dr=dA&&[],dG=[],dE=dm,dt=dA||dq&&cn.find.TAG("*",dD),ds=(di+=dE==null?1:Math.random()||0.1),dC=dt.length;if(dD){dm=du!==cC&&du}for(;dx!==dC&&(dv=dt[dx])!=null;dx++){if(dq&&dv){dw=0;while((dB=dp[dw++])){if(dB(dv,du,dz)){dy.push(dv);break}}if(dD){di=ds}}if(e){if((dv=!dB&&dv)){dF--}if(dA){dr.push(dv)}}}dF+=dx;if(e&&dx!==dF){dw=0;while((dB=dn[dw++])){dB(dr,dG,du,dz)}if(dA){if(dF>0){while(dx--){if(!(dr[dx]||dG[dx])){dG[dx]=dd.call(dy)}}}dG=c0(dG)}b7.apply(dy,dG);if(dD&&!dA&&dG.length>0&&(dF+dn.length)>1){cw.uniqueSort(dy)}}if(dD){di=ds;dm=dE}return dr};return e?cj(i):i}cW=cw.compile=function(e,dp){var dq,dn=[],ds=[],dr=cG[e+" "];if(!dr){if(!dp){dp=ci(e)}dq=dp.length;while(dq--){dr=db(dp[dq]);if(dr[da]){dn.push(dr)}else{ds.push(dr)}}dr=cG(e,cY(ds,dn));dr.selector=e}return dr};dg=cw.select=function(dp,e,dq,dt){var dr,dw,dn,dx,du,dv=typeof dp==="function"&&dp,ds=!dt&&ci((dp=dv.selector||dp));dq=dq||[];if(ds.length===1){dw=ds[0]=ds[0].slice(0);if(dw.length>2&&(dn=dw[0]).type==="ID"&&dh.getById&&e.nodeType===9&&c8&&cn.relative[dw[1].type]){e=(cn.find.ID(dn.matches[0].replace(cs,c5),e)||[])[0];if(!e){return dq}else{if(dv){e=e.parentNode}}dp=dp.slice(dw.shift().value.length)}dr=c2.needsContext.test(dp)?0:dw.length;while(dr--){dn=dw[dr];if(cn.relative[(dx=dn.type)]){break}if((du=cn.find[dx])){if((dt=du(dn.matches[0].replace(cs,c5),c1.test(dw[0].type)&&cT(e.parentNode)||e))){dw.splice(dr,1);dp=dt.length&&ch(dw);if(!dp){b7.apply(dq,dt);return dq}break}}}}(dv||cW(dp,ds))(dt,e,!c8,dq,c1.test(dp)&&cT(e.parentNode)||e);return dq};dh.sortStable=da.split("").sort(cE).join("")===da;dh.detectDuplicates=!!cX;cZ();dh.sortDetached=cf(function(e){return e.compareDocumentPosition(cC.createElement("div"))&1});if(!cf(function(e){e.innerHTML="";return e.firstChild.getAttribute("href")==="#"})){dj("type|href|height|width",function(i,e,dn){if(!dn){return i.getAttribute(e,e.toLowerCase()==="type"?1:2)}})}if(!dh.attributes||!cf(function(e){e.innerHTML="";e.firstChild.setAttribute("value","");return e.firstChild.getAttribute("value")===""})){dj("value",function(i,e,dn){if(!dn&&i.nodeName.toLowerCase()==="input"){return i.defaultValue}})}if(!cf(function(e){return e.getAttribute("disabled")==null})){dj(b8,function(i,e,dp){var dn;if(!dp){return i[e]===true?e.toLowerCase():(dn=i.getAttributeNode(e))&&dn.specified?dn.value:null}})}return cw})(a5);bI.find=m;bI.expr=m.selectors;bI.expr[":"]=bI.expr.pseudos;bI.unique=m.uniqueSort;bI.text=m.getText;bI.isXMLDoc=m.isXML;bI.contains=m.contains;var A=bI.expr.match.needsContext;var a=(/^<(\w+)\s*\/?>(?:<\/\1>|)$/);var aL=/^.[^:#\[\.,]*$/;function aR(b6,e,i){if(bI.isFunction(e)){return bI.grep(b6,function(b8,b7){return !!e.call(b8,b7,b8)!==i})}if(e.nodeType){return bI.grep(b6,function(b7){return(b7===e)!==i})}if(typeof e==="string"){if(aL.test(e)){return bI.filter(e,b6,i)}e=bI.filter(e,b6)}return bI.grep(b6,function(b7){return(bI.inArray(b7,e)>=0)!==i})}bI.filter=function(b7,e,b6){var i=e[0];if(b6){b7=":not("+b7+")"}return e.length===1&&i.nodeType===1?bI.find.matchesSelector(i,b7)?[i]:[]:bI.find.matches(b7,bI.grep(e,function(b8){return b8.nodeType===1}))};bI.fn.extend({find:function(b6){var b9,b8=[],b7=this,e=b7.length;if(typeof b6!=="string"){return this.pushStack(bI(b6).filter(function(){for(b9=0;b91?bI.unique(b8):b8);b8.selector=this.selector?this.selector+" "+b6:b6;return b8},filter:function(e){return this.pushStack(aR(this,e||[],false))},not:function(e){return this.pushStack(aR(this,e||[],true))},is:function(e){return !!aR(this,typeof e==="string"&&A.test(e)?bI(e):e||[],false).length}});var z,n=a5.document,bt=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,bV=bI.fn.init=function(e,b6){var i,b7;if(!e){return this}if(typeof e==="string"){if(e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3){i=[null,e,null]}else{i=bt.exec(e)}if(i&&(i[1]||!b6)){if(i[1]){b6=b6 instanceof bI?b6[0]:b6;bI.merge(this,bI.parseHTML(i[1],b6&&b6.nodeType?b6.ownerDocument||b6:n,true));if(a.test(i[1])&&bI.isPlainObject(b6)){for(i in b6){if(bI.isFunction(this[i])){this[i](b6[i])}else{this.attr(i,b6[i])}}}return this}else{b7=n.getElementById(i[2]);if(b7&&b7.parentNode){if(b7.id!==i[2]){return z.find(e)}this.length=1;this[0]=b7}this.context=n;this.selector=e;return this}}else{if(!b6||b6.jquery){return(b6||z).find(e)}else{return this.constructor(b6).find(e)}}}else{if(e.nodeType){this.context=this[0]=e;this.length=1;return this}else{if(bI.isFunction(e)){return typeof z.ready!=="undefined"?z.ready(e):e(bI)}}}if(e.selector!==undefined){this.selector=e.selector;this.context=e.context}return bI.makeArray(e,this)};bV.prototype=bI.fn;z=bI(n);var bv=/^(?:parents|prev(?:Until|All))/,bz={children:true,contents:true,next:true,prev:true};bI.extend({dir:function(b6,i,b8){var e=[],b7=b6[i];while(b7&&b7.nodeType!==9&&(b8===undefined||b7.nodeType!==1||!bI(b7).is(b8))){if(b7.nodeType===1){e.push(b7)}b7=b7[i]}return e},sibling:function(b6,i){var e=[];for(;b6;b6=b6.nextSibling){if(b6.nodeType===1&&b6!==i){e.push(b6)}}return e}});bI.fn.extend({has:function(b8){var b7,b6=bI(b8,this),e=b6.length;return this.filter(function(){for(b7=0;b7-1:ca.nodeType===1&&bI.find.matchesSelector(ca,b9))){e.push(ca);break}}}return this.pushStack(e.length>1?bI.unique(e):e)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.first().prevAll().length:-1}if(typeof e==="string"){return bI.inArray(this[0],bI(e))}return bI.inArray(e.jquery?e[0]:e,this)},add:function(e,i){return this.pushStack(bI.unique(bI.merge(this.get(),bI(e,i))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}});function aY(i,e){do{i=i[e]}while(i&&i.nodeType!==1);return i}bI.each({parent:function(i){var e=i.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return bI.dir(e,"parentNode")},parentsUntil:function(b6,e,b7){return bI.dir(b6,"parentNode",b7)},next:function(e){return aY(e,"nextSibling")},prev:function(e){return aY(e,"previousSibling")},nextAll:function(e){return bI.dir(e,"nextSibling")},prevAll:function(e){return bI.dir(e,"previousSibling")},nextUntil:function(b6,e,b7){return bI.dir(b6,"nextSibling",b7)},prevUntil:function(b6,e,b7){return bI.dir(b6,"previousSibling",b7)},siblings:function(e){return bI.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return bI.sibling(e.firstChild)},contents:function(e){return bI.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:bI.merge([],e.childNodes)}},function(e,i){bI.fn[e]=function(b8,b6){var b7=bI.map(this,i,b8);if(e.slice(-5)!=="Until"){b6=b8}if(b6&&typeof b6==="string"){b7=bI.filter(b6,b7)}if(this.length>1){if(!bz[e]){b7=bI.unique(b7)}if(bv.test(e)){b7=b7.reverse()}}return this.pushStack(b7)}});var aF=(/\S+/g);var b2={};function af(i){var e=b2[i]={};bI.each(i.match(aF)||[],function(b7,b6){e[b6]=true});return e}bI.Callbacks=function(ce){ce=typeof ce==="string"?(b2[ce]||af(ce)):bI.extend({},ce);var b8,b7,e,b9,ca,b6,cb=[],cc=!ce.once&&[],i=function(cf){b7=ce.memory&&cf;e=true;ca=b6||0;b6=0;b9=cb.length;b8=true;for(;cb&&ca-1){cb.splice(cg,1);if(b8){if(cg<=b9){b9--}if(cg<=ca){ca--}}}})}return this},has:function(cf){return cf?bI.inArray(cf,cb)>-1:!!(cb&&cb.length)},empty:function(){cb=[];b9=0;return this},disable:function(){cb=cc=b7=undefined;return this},disabled:function(){return !cb},lock:function(){cc=undefined;if(!b7){cd.disable()}return this},locked:function(){return !cc},fireWith:function(cg,cf){if(cb&&(!e||cc)){cf=cf||[];cf=[cg,cf.slice?cf.slice():cf];if(b8){cc.push(cf)}else{i(cf)}}return this},fire:function(){cd.fireWith(this,arguments);return this},fired:function(){return !!e}};return cd};bI.extend({Deferred:function(b6){var i=[["resolve","done",bI.Callbacks("once memory"),"resolved"],["reject","fail",bI.Callbacks("once memory"),"rejected"],["notify","progress",bI.Callbacks("memory")]],b7="pending",b8={state:function(){return b7},always:function(){e.done(arguments).fail(arguments);return this},then:function(){var b9=arguments;return bI.Deferred(function(ca){bI.each(i,function(cc,cb){var cd=bI.isFunction(b9[cc])&&b9[cc];e[cb[1]](function(){var ce=cd&&cd.apply(this,arguments);if(ce&&bI.isFunction(ce.promise)){ce.promise().done(ca.resolve).fail(ca.reject).progress(ca.notify)}else{ca[cb[0]+"With"](this===b8?ca.promise():this,cd?[ce]:arguments)}})});b9=null}).promise()},promise:function(b9){return b9!=null?bI.extend(b9,b8):b8}},e={};b8.pipe=b8.then;bI.each(i,function(ca,b9){var cc=b9[2],cb=b9[3];b8[b9[1]]=cc.add;if(cb){cc.add(function(){b7=cb},i[ca^1][2].disable,i[2][2].lock)}e[b9[0]]=function(){e[b9[0]+"With"](this===e?b8:this,arguments);return this};e[b9[0]+"With"]=cc.fireWith});b8.promise(e);if(b6){b6.call(e,e)}return e},when:function(b9){var b7=0,cb=P.call(arguments),e=cb.length,b6=e!==1||(b9&&bI.isFunction(b9.promise))?e:0,ce=b6===1?b9:bI.Deferred(),b8=function(cg,ch,cf){return function(i){ch[cg]=this;cf[cg]=arguments.length>1?P.call(arguments):i;if(cf===cd){ce.notifyWith(ch,cf)}else{if(!(--b6)){ce.resolveWith(ch,cf)}}}},cd,ca,cc;if(e>1){cd=new Array(e);ca=new Array(e);cc=new Array(e);for(;b70){return}ak.resolveWith(n,[bI]);if(bI.fn.triggerHandler){bI(n).triggerHandler("ready");bI(n).off("ready")}}});function bm(){if(n.addEventListener){n.removeEventListener("DOMContentLoaded",bZ,false);a5.removeEventListener("load",bZ,false)}else{n.detachEvent("onreadystatechange",bZ);a5.detachEvent("onload",bZ)}}function bZ(){if(n.addEventListener||event.type==="load"||n.readyState==="complete"){bm();bI.ready()}}bI.ready.promise=function(b8){if(!ak){ak=bI.Deferred();if(n.readyState==="complete"){setTimeout(bI.ready)}else{if(n.addEventListener){n.addEventListener("DOMContentLoaded",bZ,false);a5.addEventListener("load",bZ,false)}else{n.attachEvent("onreadystatechange",bZ);a5.attachEvent("onload",bZ);var b7=false;try{b7=a5.frameElement==null&&n.documentElement}catch(b6){}if(b7&&b7.doScroll){(function i(){if(!bI.isReady){try{b7.doScroll("left")}catch(b9){return setTimeout(i,50)}bm();bI.ready()}})()}}}}return ak.promise(b8)};var aC=typeof undefined;var bh;for(bh in bI(D)){break}D.ownLast=bh!=="0";D.inlineBlockNeedsLayout=false;bI(function(){var b6,b7,e,i;e=n.getElementsByTagName("body")[0];if(!e||!e.style){return}b7=n.createElement("div");i=n.createElement("div");i.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";e.appendChild(i).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";D.inlineBlockNeedsLayout=b6=b7.offsetWidth===3;if(b6){e.style.zoom=1}}e.removeChild(i)});(function(){var b6=n.createElement("div");if(D.deleteExpando==null){D.deleteExpando=true;try{delete b6.test}catch(i){D.deleteExpando=false}}b6=null})();bI.acceptData=function(b6){var i=bI.noData[(b6.nodeName+" ").toLowerCase()],e=+b6.nodeType||1;return e!==1&&e!==9?false:!i||i!==true&&b6.getAttribute("classid")===i};var by=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,aQ=/([A-Z])/g;function bA(b7,b6,b8){if(b8===undefined&&b7.nodeType===1){var i="data-"+b6.replace(aQ,"-$1").toLowerCase();b8=b7.getAttribute(i);if(typeof b8==="string"){try{b8=b8==="true"?true:b8==="false"?false:b8==="null"?null:+b8+""===b8?+b8:by.test(b8)?bI.parseJSON(b8):b8}catch(b9){}bI.data(b7,b6,b8)}else{b8=undefined}}return b8}function Q(i){var e;for(e in i){if(e==="data"&&bI.isEmptyObject(i[e])){continue}if(e!=="toJSON"){return false}}return true}function bc(b7,i,b9,b8){if(!bI.acceptData(b7)){return}var cb,ca,cc=bI.expando,cd=b7.nodeType,e=cd?bI.cache:b7,b6=cd?b7[cc]:b7[cc]&&cc;if((!b6||!e[b6]||(!b8&&!e[b6].data))&&b9===undefined&&typeof i==="string"){return}if(!b6){if(cd){b6=b7[cc]=aP.pop()||bI.guid++}else{b6=cc}}if(!e[b6]){e[b6]=cd?{}:{toJSON:bI.noop}}if(typeof i==="object"||typeof i==="function"){if(b8){e[b6]=bI.extend(e[b6],i)}else{e[b6].data=bI.extend(e[b6].data,i)}}ca=e[b6];if(!b8){if(!ca.data){ca.data={}}ca=ca.data}if(b9!==undefined){ca[bI.camelCase(i)]=b9}if(typeof i==="string"){cb=ca[i];if(cb==null){cb=ca[bI.camelCase(i)]}}else{cb=ca}return cb}function ab(b9,b7,e){if(!bI.acceptData(b9)){return}var cb,b8,ca=b9.nodeType,b6=ca?bI.cache:b9,cc=ca?b9[bI.expando]:bI.expando;if(!b6[cc]){return}if(b7){cb=e?b6[cc]:b6[cc].data;if(cb){if(!bI.isArray(b7)){if(b7 in cb){b7=[b7]}else{b7=bI.camelCase(b7);if(b7 in cb){b7=[b7]}else{b7=b7.split(" ")}}}else{b7=b7.concat(bI.map(b7,bI.camelCase))}b8=b7.length;while(b8--){delete cb[b7[b8]]}if(e?!Q(cb):!bI.isEmptyObject(cb)){return}}}if(!e){delete b6[cc].data;if(!Q(b6[cc])){return}}if(ca){bI.cleanData([b9],true)}else{if(D.deleteExpando||b6!=b6.window){delete b6[cc]}else{b6[cc]=null}}}bI.extend({cache:{},noData:{"applet ":true,"embed ":true,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){e=e.nodeType?bI.cache[e[bI.expando]]:e[bI.expando];return !!e&&!Q(e)},data:function(i,e,b6){return bc(i,e,b6)},removeData:function(i,e){return ab(i,e)},_data:function(i,e,b6){return bc(i,e,b6,true)},_removeData:function(i,e){return ab(i,e,true)}});bI.fn.extend({data:function(b8,cb){var b7,b6,ca,b9=this[0],e=b9&&b9.attributes;if(b8===undefined){if(this.length){ca=bI.data(b9);if(b9.nodeType===1&&!bI._data(b9,"parsedAttrs")){b7=e.length;while(b7--){if(e[b7]){b6=e[b7].name;if(b6.indexOf("data-")===0){b6=bI.camelCase(b6.slice(5));bA(b9,b6,ca[b6])}}}bI._data(b9,"parsedAttrs",true)}}return ca}if(typeof b8==="object"){return this.each(function(){bI.data(this,b8)})}return arguments.length>1?this.each(function(){bI.data(this,b8,cb)}):b9?bA(b9,b8,bI.data(b9,b8)):undefined},removeData:function(e){return this.each(function(){bI.removeData(this,e)})}});bI.extend({queue:function(b6,i,b7){var e;if(b6){i=(i||"fx")+"queue";e=bI._data(b6,i);if(b7){if(!e||bI.isArray(b7)){e=bI._data(b6,i,bI.makeArray(b7))}else{e.push(b7)}}return e||[]}},dequeue:function(b9,b8){b8=b8||"fx";var i=bI.queue(b9,b8),ca=i.length,b7=i.shift(),e=bI._queueHooks(b9,b8),b6=function(){bI.dequeue(b9,b8)};if(b7==="inprogress"){b7=i.shift();ca--}if(b7){if(b8==="fx"){i.unshift("inprogress")}delete e.stop;b7.call(b9,b6,e)}if(!ca&&e){e.empty.fire()}},_queueHooks:function(b6,i){var e=i+"queueHooks";return bI._data(b6,e)||bI._data(b6,e,{empty:bI.Callbacks("once memory").add(function(){bI._removeData(b6,i+"queue");bI._removeData(b6,e)})})}});bI.fn.extend({queue:function(e,i){var b6=2;if(typeof e!=="string"){i=e;e="fx";b6--}if(arguments.length
    a";D.leadingWhitespace=b8.firstChild.nodeType===3;D.tbody=!b8.getElementsByTagName("tbody").length;D.htmlSerialize=!!b8.getElementsByTagName("link").length;D.html5Clone=n.createElement("nav").cloneNode(true).outerHTML!=="<:nav>";i.type="checkbox";i.checked=true;b6.appendChild(i);D.appendChecked=i.checked;b8.innerHTML="";D.noCloneChecked=!!b8.cloneNode(true).lastChild.defaultValue;b6.appendChild(b8);b8.innerHTML="";D.checkClone=b8.cloneNode(true).cloneNode(true).lastChild.checked;D.noCloneEvent=true;if(b8.attachEvent){b8.attachEvent("onclick",function(){D.noCloneEvent=false});b8.cloneNode(true).click()}if(D.deleteExpando==null){D.deleteExpando=true;try{delete b8.test}catch(b7){D.deleteExpando=false}}})();(function(){var b6,e,b7=n.createElement("div");for(b6 in {submit:true,change:true,focusin:true}){e="on"+b6;if(!(D[b6+"Bubbles"]=e in a5)){b7.setAttribute(e,"t");D[b6+"Bubbles"]=b7.attributes[e].expando===false}}b7=null})();var bG=/^(?:input|select|textarea)$/i,a6=/^key/,bM=/^(?:mouse|pointer|contextmenu)|click/,bC=/^(?:focusinfocus|focusoutblur)$/,bx=/^([^.]*)(?:\.(.+)|)$/;function U(){return true}function Z(){return false}function am(){try{return n.activeElement}catch(e){}}bI.event={global:{},add:function(b8,cd,ci,ca,b9){var cb,cj,ck,b6,cf,cc,ch,b7,cg,e,i,ce=bI._data(b8);if(!ce){return}if(ci.handler){b6=ci;ci=b6.handler;b9=b6.selector}if(!ci.guid){ci.guid=bI.guid++}if(!(cj=ce.events)){cj=ce.events={}}if(!(cc=ce.handle)){cc=ce.handle=function(cl){return typeof bI!==aC&&(!cl||bI.event.triggered!==cl.type)?bI.event.dispatch.apply(cc.elem,arguments):undefined};cc.elem=b8}cd=(cd||"").match(aF)||[""];ck=cd.length;while(ck--){cb=bx.exec(cd[ck])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){continue}cf=bI.event.special[cg]||{};cg=(b9?cf.delegateType:cf.bindType)||cg;cf=bI.event.special[cg]||{};ch=bI.extend({type:cg,origType:i,data:ca,handler:ci,guid:ci.guid,selector:b9,needsContext:b9&&bI.expr.match.needsContext.test(b9),namespace:e.join(".")},b6);if(!(b7=cj[cg])){b7=cj[cg]=[];b7.delegateCount=0;if(!cf.setup||cf.setup.call(b8,ca,e,cc)===false){if(b8.addEventListener){b8.addEventListener(cg,cc,false)}else{if(b8.attachEvent){b8.attachEvent("on"+cg,cc)}}}}if(cf.add){cf.add.call(b8,ch);if(!ch.handler.guid){ch.handler.guid=ci.guid}}if(b9){b7.splice(b7.delegateCount++,0,ch)}else{b7.push(ch)}bI.event.global[cg]=true}b8=null},remove:function(b7,cd,ck,b8,cc){var ca,ch,cb,b9,cj,ci,cf,b6,cg,e,i,ce=bI.hasData(b7)&&bI._data(b7);if(!ce||!(ci=ce.events)){return}cd=(cd||"").match(aF)||[""];cj=cd.length;while(cj--){cb=bx.exec(cd[cj])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){for(cg in ci){bI.event.remove(b7,cg+cd[cj],ck,b8,true)}continue}cf=bI.event.special[cg]||{};cg=(b8?cf.delegateType:cf.bindType)||cg;b6=ci[cg]||[];cb=cb[2]&&new RegExp("(^|\\.)"+e.join("\\.(?:.*\\.|)")+"(\\.|$)");b9=ca=b6.length;while(ca--){ch=b6[ca];if((cc||i===ch.origType)&&(!ck||ck.guid===ch.guid)&&(!cb||cb.test(ch.namespace))&&(!b8||b8===ch.selector||b8==="**"&&ch.selector)){b6.splice(ca,1);if(ch.selector){b6.delegateCount--}if(cf.remove){cf.remove.call(b7,ch)}}}if(b9&&!b6.length){if(!cf.teardown||cf.teardown.call(b7,e,ce.handle)===false){bI.removeEvent(b7,cg,ce.handle)}delete ci[cg]}}if(bI.isEmptyObject(ci)){delete ce.handle;bI._removeData(b7,"events")}},trigger:function(b6,cd,b9,ck){var ce,b8,ci,cj,cg,cc,cb,ca=[b9||n],ch=K.call(b6,"type")?b6.type:b6,b7=K.call(b6,"namespace")?b6.namespace.split("."):[];ci=cc=b9=b9||n;if(b9.nodeType===3||b9.nodeType===8){return}if(bC.test(ch+bI.event.triggered)){return}if(ch.indexOf(".")>=0){b7=ch.split(".");ch=b7.shift();b7.sort()}b8=ch.indexOf(":")<0&&"on"+ch;b6=b6[bI.expando]?b6:new bI.Event(ch,typeof b6==="object"&&b6);b6.isTrigger=ck?2:3;b6.namespace=b7.join(".");b6.namespace_re=b6.namespace?new RegExp("(^|\\.)"+b7.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;b6.result=undefined;if(!b6.target){b6.target=b9}cd=cd==null?[b6]:bI.makeArray(cd,[b6]);cg=bI.event.special[ch]||{};if(!ck&&cg.trigger&&cg.trigger.apply(b9,cd)===false){return}if(!ck&&!cg.noBubble&&!bI.isWindow(b9)){cj=cg.delegateType||ch;if(!bC.test(cj+ch)){ci=ci.parentNode}for(;ci;ci=ci.parentNode){ca.push(ci);cc=ci}if(cc===(b9.ownerDocument||n)){ca.push(cc.defaultView||cc.parentWindow||a5)}}cb=0;while((ci=ca[cb++])&&!b6.isPropagationStopped()){b6.type=cb>1?cj:cg.bindType||ch;ce=(bI._data(ci,"events")||{})[b6.type]&&bI._data(ci,"handle");if(ce){ce.apply(ci,cd)}ce=b8&&ci[b8];if(ce&&ce.apply&&bI.acceptData(ci)){b6.result=ce.apply(ci,cd);if(b6.result===false){b6.preventDefault()}}}b6.type=ch;if(!ck&&!b6.isDefaultPrevented()){if((!cg._default||cg._default.apply(ca.pop(),cd)===false)&&bI.acceptData(b9)){if(b8&&b9[ch]&&!bI.isWindow(b9)){cc=b9[b8];if(cc){b9[b8]=null}bI.event.triggered=ch;try{b9[ch]()}catch(cf){}bI.event.triggered=undefined;if(cc){b9[b8]=cc}}}}return b6.result},dispatch:function(e){e=bI.event.fix(e);var b9,ca,ce,b6,b8,cd=[],cc=P.call(arguments),b7=(bI._data(this,"events")||{})[e.type]||[],cb=bI.event.special[e.type]||{};cc[0]=e;e.delegateTarget=this;if(cb.preDispatch&&cb.preDispatch.call(this,e)===false){return}cd=bI.event.handlers.call(this,e,b7);b9=0;while((b6=cd[b9++])&&!e.isPropagationStopped()){e.currentTarget=b6.elem;b8=0;while((ce=b6.handlers[b8++])&&!e.isImmediatePropagationStopped()){if(!e.namespace_re||e.namespace_re.test(ce.namespace)){e.handleObj=ce;e.data=ce.data;ca=((bI.event.special[ce.origType]||{}).handle||ce.handler).apply(b6.elem,cc);if(ca!==undefined){if((e.result=ca)===false){e.preventDefault();e.stopPropagation()}}}}}if(cb.postDispatch){cb.postDispatch.call(this,e)}return e.result},handlers:function(e,b7){var b6,cc,ca,b9,cb=[],b8=b7.delegateCount,cd=e.target;if(b8&&cd.nodeType&&(!e.button||e.type!=="click")){for(;cd!=this;cd=cd.parentNode||this){if(cd.nodeType===1&&(cd.disabled!==true||e.type!=="click")){ca=[];for(b9=0;b9=0:bI.find(b6,this,null,[cd]).length}if(ca[b6]){ca.push(cc)}}if(ca.length){cb.push({elem:cd,handlers:ca})}}}}if(b8]","i"),b5=/^\s+/,aH=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,o=/<([\w:]+)/,b0=/\s*$/g,W={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:D.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},aT=B(n),k=aT.appendChild(n.createElement("div"));W.optgroup=W.option;W.tbody=W.tfoot=W.colgroup=W.caption=W.thead;W.th=W.td;function l(b8,e){var b6,b9,b7=0,ca=typeof b8.getElementsByTagName!==aC?b8.getElementsByTagName(e||"*"):typeof b8.querySelectorAll!==aC?b8.querySelectorAll(e||"*"):undefined;if(!ca){for(ca=[],b6=b8.childNodes||b8;(b9=b6[b7])!=null;b7++){if(!e||bI.nodeName(b9,e)){ca.push(b9)}else{bI.merge(ca,l(b9,e))}}}return e===undefined||e&&bI.nodeName(b8,e)?bI.merge([b8],ca):ca}function bY(e){if(aM.test(e.type)){e.defaultChecked=e.checked}}function a3(i,e){return bI.nodeName(i,"table")&&bI.nodeName(e.nodeType!==11?e:e.firstChild,"tr")?i.getElementsByTagName("tbody")[0]||i.appendChild(i.ownerDocument.createElement("tbody")):i}function u(e){e.type=(bI.find.attr(e,"type")!==null)+"/"+e.type;return e}function bf(i){var e=ar.exec(i.type);if(e){i.type=e[1]}else{i.removeAttribute("type")}return i}function bu(e,b7){var b8,b6=0;for(;(b8=e[b6])!=null;b6++){bI._data(b8,"globalEval",!b7||bI._data(b7[b6],"globalEval"))}}function at(cc,b6){if(b6.nodeType!==1||!bI.hasData(cc)){return}var b9,b8,e,cb=bI._data(cc),ca=bI._data(b6,cb),b7=cb.events;if(b7){delete ca.handle;ca.events={};for(b9 in b7){for(b8=0,e=b7[b9].length;b8")){cd=b6.cloneNode(true)}else{k.innerHTML=b6.outerHTML;k.removeChild(cd=k.firstChild)}if((!D.noCloneEvent||!D.noCloneChecked)&&(b6.nodeType===1||b6.nodeType===11)&&!bI.isXMLDoc(b6)){ca=l(cd);cb=l(b6);for(b9=0;(b7=cb[b9])!=null;++b9){if(ca[b9]){T(b7,ca[b9])}}}if(b8){if(e){cb=cb||l(b6);ca=ca||l(cd);for(b9=0;(b7=cb[b9])!=null;b9++){at(b7,ca[b9])}}else{at(b6,cd)}}ca=l(cd,"script");if(ca.length>0){bu(ca,!cc&&l(b6,"script"))}ca=cb=b7=null;return cd},buildFragment:function(b6,b8,cd,ci){var ce,ca,cc,ch,cj,cg,b7,cb=b6.length,b9=B(b8),e=[],cf=0;for(;cf")+b7[2];ce=b7[0];while(ce--){ch=ch.lastChild}if(!D.leadingWhitespace&&b5.test(ca)){e.push(b8.createTextNode(b5.exec(ca)[0]))}if(!D.tbody){ca=cj==="table"&&!b0.test(ca)?ch.firstChild:b7[1]===""&&!b0.test(ca)?ch:0;ce=ca&&ca.childNodes.length;while(ce--){if(bI.nodeName((cg=ca.childNodes[ce]),"tbody")&&!cg.childNodes.length){ca.removeChild(cg)}}}bI.merge(e,ch.childNodes);ch.textContent="";while(ch.firstChild){ch.removeChild(ch.firstChild)}ch=b9.lastChild}}}}if(ch){b9.removeChild(ch)}if(!D.appendChecked){bI.grep(l(e,"input"),bY)}cf=0;while((ca=e[cf++])){if(ci&&bI.inArray(ca,ci)!==-1){continue}cc=bI.contains(ca.ownerDocument,ca);ch=l(b9.appendChild(ca),"script");if(cc){bu(ch)}if(cd){ce=0;while((ca=ch[ce++])){if(bB.test(ca.type||"")){cd.push(ca)}}}}ch=null;return b9},cleanData:function(b6,ce){var b8,cd,b7,b9,ca=0,cf=bI.expando,e=bI.cache,cb=D.deleteExpando,cc=bI.event.special;for(;(b8=b6[ca])!=null;ca++){if(ce||bI.acceptData(b8)){b7=b8[cf];b9=b7&&e[b7];if(b9){if(b9.events){for(cd in b9.events){if(cc[cd]){bI.event.remove(b8,cd)}else{bI.removeEvent(b8,cd,b9.handle)}}}if(e[b7]){delete e[b7];if(cb){delete b8[cf]}else{if(typeof b8.removeAttribute!==aC){b8.removeAttribute(cf)}else{b8[cf]=null}}aP.push(b7)}}}}}});bI.fn.extend({text:function(e){return aB(this,function(i){return i===undefined?bI.text(this):this.empty().append((this[0]&&this[0].ownerDocument||n).createTextNode(i))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.insertBefore(e,i.firstChild)}})},before:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this)}})},after:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this.nextSibling)}})},remove:function(e,b9){var b8,b6=e?bI.filter(e,this):this,b7=0;for(;(b8=b6[b7])!=null;b7++){if(!b9&&b8.nodeType===1){bI.cleanData(l(b8))}if(b8.parentNode){if(b9&&bI.contains(b8.ownerDocument,b8)){bu(l(b8,"script"))}b8.parentNode.removeChild(b8)}}return this},empty:function(){var b6,e=0;for(;(b6=this[e])!=null;e++){if(b6.nodeType===1){bI.cleanData(l(b6,false))}while(b6.firstChild){b6.removeChild(b6.firstChild)}if(b6.options&&bI.nodeName(b6,"select")){b6.options.length=0}}return this},clone:function(i,e){i=i==null?false:i;e=e==null?i:e;return this.map(function(){return bI.clone(this,i,e)})},html:function(e){return aB(this,function(b9){var b8=this[0]||{},b7=0,b6=this.length;if(b9===undefined){return b8.nodeType===1?b8.innerHTML.replace(aD,""):undefined}if(typeof b9==="string"&&!an.test(b9)&&(D.htmlSerialize||!M.test(b9))&&(D.leadingWhitespace||!b5.test(b9))&&!W[(o.exec(b9)||["",""])[1].toLowerCase()]){b9=b9.replace(aH,"<$1>");try{for(;b71&&typeof ce==="string"&&!D.checkClone&&bW.test(ce))){return this.each(function(cj){var i=cf.eq(cj);if(b6){cd[0]=ce.call(this,cj,i.html())}i.domManip(cd,ci)})}if(b8){cc=bI.buildFragment(cd,this[0].ownerDocument,false,this);cb=cc.firstChild;if(cc.childNodes.length===1){cc=cb}if(cb){b9=bI.map(l(cc,"script"),u);e=b9.length;for(;ca")).appendTo(i.documentElement);i=(aI[0].contentWindow||aI[0].contentDocument).document;i.write();i.close();e=a4(b6,i);aI.detach()}bl[b6]=e}return e}(function(){var e;D.shrinkWrapBlocks=function(){if(e!=null){return e}e=false;var b7,i,b6;i=n.getElementsByTagName("body")[0];if(!i||!i.style){return}b7=n.createElement("div");b6=n.createElement("div");b6.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";i.appendChild(b6).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1";b7.appendChild(n.createElement("div")).style.width="5px";e=b7.offsetWidth!==3}i.removeChild(b6);return e}})();var aZ=(/^margin/);var Y=new RegExp("^("+aE+")(?!px)[a-z%]+$","i");var bq,G,bo=/^(top|right|bottom|left)$/;if(a5.getComputedStyle){bq=function(e){if(e.ownerDocument.defaultView.opener){return e.ownerDocument.defaultView.getComputedStyle(e,null)}return a5.getComputedStyle(e,null)};G=function(cb,i,ca){var b8,b7,b9,e,b6=cb.style;ca=ca||bq(cb);e=ca?ca.getPropertyValue(i)||ca[i]:undefined;if(ca){if(e===""&&!bI.contains(cb.ownerDocument,cb)){e=bI.style(cb,i)}if(Y.test(e)&&aZ.test(i)){b8=b6.width;b7=b6.minWidth;b9=b6.maxWidth;b6.minWidth=b6.maxWidth=b6.width=e;e=ca.width;b6.width=b8;b6.minWidth=b7;b6.maxWidth=b9}}return e===undefined?e:e+""}}else{if(n.documentElement.currentStyle){bq=function(e){return e.currentStyle};G=function(ca,b7,b9){var cb,i,e,b6,b8=ca.style;b9=b9||bq(ca);b6=b9?b9[b7]:undefined;if(b6==null&&b8&&b8[b7]){b6=b8[b7]}if(Y.test(b6)&&!bo.test(b7)){cb=b8.left;i=ca.runtimeStyle;e=i&&i.left;if(e){i.left=ca.currentStyle.left}b8.left=b7==="fontSize"?"1em":b6;b6=b8.pixelLeft+"px";b8.left=cb;if(e){i.left=e}}return b6===undefined?b6:b6+""||"auto"}}}function a7(e,i){return{get:function(){var b6=e();if(b6==null){return}if(b6){delete this.get;return}return(this.get=i).apply(this,arguments)}}}(function(){var cb,b9,b7,ca,b6,b8,i;cb=n.createElement("div");cb.innerHTML="
    a";b7=cb.getElementsByTagName("a")[0];b9=b7&&b7.style;if(!b9){return}b9.cssText="float:left;opacity:.5";D.opacity=b9.opacity==="0.5";D.cssFloat=!!b9.cssFloat;cb.style.backgroundClip="content-box";cb.cloneNode(true).style.backgroundClip="";D.clearCloneStyle=cb.style.backgroundClip==="content-box";D.boxSizing=b9.boxSizing===""||b9.MozBoxSizing===""||b9.WebkitBoxSizing==="";bI.extend(D,{reliableHiddenOffsets:function(){if(b8==null){e()}return b8},boxSizingReliable:function(){if(b6==null){e()}return b6},pixelPosition:function(){if(ca==null){e()}return ca},reliableMarginRight:function(){if(i==null){e()}return i}});function e(){var cf,cc,cd,ce;cc=n.getElementsByTagName("body")[0];if(!cc||!cc.style){return}cf=n.createElement("div");cd=n.createElement("div");cd.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";cc.appendChild(cd).appendChild(cf);cf.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute";ca=b6=false;i=true;if(a5.getComputedStyle){ca=(a5.getComputedStyle(cf,null)||{}).top!=="1%";b6=(a5.getComputedStyle(cf,null)||{width:"4px"}).width==="4px";ce=cf.appendChild(n.createElement("div"));ce.style.cssText=cf.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0";ce.style.marginRight=ce.style.width="0";cf.style.width="1px";i=!parseFloat((a5.getComputedStyle(ce,null)||{}).marginRight);cf.removeChild(ce)}cf.innerHTML="
    t
    ";ce=cf.getElementsByTagName("td");ce[0].style.cssText="margin:0;border:0;padding:0;display:none";b8=ce[0].offsetHeight===0;if(b8){ce[0].style.display="";ce[1].style.display="none";b8=ce[0].offsetHeight===0}cc.removeChild(cd)}})();bI.swap=function(b9,b8,ca,b7){var b6,i,e={};for(i in b8){e[i]=b9.style[i];b9.style[i]=b8[i]}b6=ca.apply(b9,b7||[]);for(i in b8){b9.style[i]=e[i]}return b6};var bj=/alpha\([^)]*\)/i,aU=/opacity\s*=\s*([^)]*)/,H=/^(none|table(?!-c[ea]).+)/,bb=new RegExp("^("+aE+")(.*)$","i"),V=new RegExp("^([+-])=("+aE+")","i"),be={position:"absolute",visibility:"hidden",display:"block"},bD={letterSpacing:"0",fontWeight:"400"},aw=["Webkit","O","Moz","ms"];function c(b8,b6){if(b6 in b8){return b6}var b9=b6.charAt(0).toUpperCase()+b6.slice(1),e=b6,b7=aw.length;while(b7--){b6=aw[b7]+b9;if(b6 in b8){return b6}}return e}function s(ca,e){var cb,b8,b9,i=[],b6=0,b7=ca.length;for(;b6=1||b9==="")&&bI.trim(b6.replace(bj,""))===""&&b7.removeAttribute){b7.removeAttribute("filter");if(b9===""||i&&!i.filter){return}}b7.filter=bj.test(b6)?b6.replace(bj,e):b6+" "+e}}}bI.cssHooks.marginRight=a7(D.reliableMarginRight,function(i,e){if(e){return bI.swap(i,{display:"inline-block"},G,[i,"marginRight"])}});bI.each({margin:"",padding:"",border:"Width"},function(e,i){bI.cssHooks[e+i]={expand:function(b8){var b7=0,b6={},b9=typeof b8==="string"?b8.split(" "):[b8];for(;b7<4;b7++){b6[e+bT[b7]+i]=b9[b7]||b9[b7-2]||b9[0]}return b6}};if(!aZ.test(e)){bI.cssHooks[e+i].set=aN}});bI.fn.extend({css:function(e,i){return aB(this,function(ca,b7,cb){var b9,b6,cc={},b8=0;if(bI.isArray(b7)){b9=bq(ca);b6=b7.length;for(;b81)},show:function(){return s(this,true)},hide:function(){return s(this)},toggle:function(e){if(typeof e==="boolean"){return e?this.show():this.hide()}return this.each(function(){if(S(this)){bI(this).show()}else{bI(this).hide()}})}});function J(b6,i,b8,e,b7){return new J.prototype.init(b6,i,b8,e,b7)}bI.Tween=J;J.prototype={constructor:J,init:function(b7,i,b9,e,b8,b6){this.elem=b7;this.prop=b9;this.easing=b8||"swing";this.options=i;this.start=this.now=this.cur();this.end=e;this.unit=b6||(bI.cssNumber[b9]?"":"px")},cur:function(){var e=J.propHooks[this.prop];return e&&e.get?e.get(this):J.propHooks._default.get(this)},run:function(b6){var i,e=J.propHooks[this.prop];if(this.options.duration){this.pos=i=bI.easing[this.easing](b6,this.options.duration*b6,0,1,this.options.duration)}else{this.pos=i=b6}this.now=(this.end-this.start)*i+this.start;if(this.options.step){this.options.step.call(this.elem,this.now,this)}if(e&&e.set){e.set(this)}else{J.propHooks._default.set(this)}return this}};J.prototype.init.prototype=J.prototype;J.propHooks={_default:{get:function(i){var e;if(i.elem[i.prop]!=null&&(!i.elem.style||i.elem.style[i.prop]==null)){return i.elem[i.prop]}e=bI.css(i.elem,i.prop,"");return !e||e==="auto"?0:e},set:function(e){if(bI.fx.step[e.prop]){bI.fx.step[e.prop](e)}else{if(e.elem.style&&(e.elem.style[bI.cssProps[e.prop]]!=null||bI.cssHooks[e.prop])){bI.style(e.elem,e.prop,e.now+e.unit)}else{e.elem[e.prop]=e.now}}}}};J.propHooks.scrollTop=J.propHooks.scrollLeft={set:function(e){if(e.elem.nodeType&&e.elem.parentNode){e.elem[e.prop]=e.now}}};bI.easing={linear:function(e){return e},swing:function(e){return 0.5-Math.cos(e*Math.PI)/2}};bI.fx=J.prototype.init;bI.fx.step={};var N,ae,bR=/^(?:toggle|show|hide)$/,bJ=new RegExp("^(?:([+-])=|)("+aE+")([a-z%]*)$","i"),bP=/queueHooks$/,aG=[h],a2={"*":[function(e,ca){var cc=this.createTween(e,ca),b8=cc.cur(),b7=bJ.exec(ca),cb=b7&&b7[3]||(bI.cssNumber[e]?"":"px"),i=(bI.cssNumber[e]||cb!=="px"&&+b8)&&bJ.exec(bI.css(cc.elem,e)),b6=1,b9=20;if(i&&i[3]!==cb){cb=cb||i[3];b7=b7||[];i=+b8||1;do{b6=b6||".5";i=i/b6;bI.style(cc.elem,e,i+cb)}while(b6!==(b6=cc.cur()/b8)&&b6!==1&&--b9)}if(b7){i=cc.start=+i||+b8||0;cc.unit=cb;cc.end=b7[1]?i+(b7[1]+1)*b7[2]:+b7[2]}return cc}]};function bn(){setTimeout(function(){N=undefined});return(N=bI.now())}function bH(b7,b9){var b8,e={height:b7},b6=0;b9=b9?1:0;for(;b6<4;b6+=2-b9){b8=bT[b6];e["margin"+b8]=e["padding"+b8]=b7}if(b9){e.opacity=e.width=b7}return e}function bd(b8,ca,b7){var i,b9=(a2[ca]||[]).concat(a2["*"]),e=0,b6=b9.length;for(;e
    a";i=b8.getElementsByTagName("a")[0];e=n.createElement("select");b7=e.appendChild(n.createElement("option"));b6=b8.getElementsByTagName("input")[0];i.style.cssText="top:1px";D.getSetAttribute=b8.className!=="t";D.style=/top/.test(i.getAttribute("style"));D.hrefNormalized=i.getAttribute("href")==="/a";D.checkOn=!!b6.value;D.optSelected=b7.selected;D.enctype=!!n.createElement("form").enctype;e.disabled=true;D.optDisabled=!b7.disabled;b6=n.createElement("input");b6.setAttribute("value","");D.input=b6.getAttribute("value")==="";b6.value="t";b6.setAttribute("type","radio");D.radioValue=b6.value==="t"})();var al=/\r/g;bI.fn.extend({val:function(b7){var e,i,b8,b6=this[0];if(!arguments.length){if(b6){e=bI.valHooks[b6.type]||bI.valHooks[b6.nodeName.toLowerCase()];if(e&&"get" in e&&(i=e.get(b6,"value"))!==undefined){return i}i=b6.value;return typeof i==="string"?i.replace(al,""):i==null?"":i}return}b8=bI.isFunction(b7);return this.each(function(b9){var ca;if(this.nodeType!==1){return}if(b8){ca=b7.call(this,b9,bI(this).val())}else{ca=b7}if(ca==null){ca=""}else{if(typeof ca==="number"){ca+=""}else{if(bI.isArray(ca)){ca=bI.map(ca,function(cb){return cb==null?"":cb+""})}}}e=bI.valHooks[this.type]||bI.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,ca,"value")===undefined){this.value=ca}})}});bI.extend({valHooks:{option:{get:function(e){var i=bI.find.attr(e,"value");return i!=null?i:bI.trim(bI.text(e))}},select:{get:function(e){var cb,b7,cd=e.options,b9=e.selectedIndex,b8=e.type==="select-one"||b9<0,cc=b8?null:[],ca=b8?b9+1:cd.length,b6=b9<0?ca:b8?b9:0;for(;b6=0){try{b9.selected=cc=true}catch(b6){b9.scrollHeight}}else{b9.selected=false}}if(!cc){ca.selectedIndex=-1}return b7}}}});bI.each(["radio","checkbox"],function(){bI.valHooks[this]={set:function(e,i){if(bI.isArray(i)){return(e.checked=bI.inArray(bI(e).val(),i)>=0)}}};if(!D.checkOn){bI.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value}}});var ba,b3,bO=bI.expr.attrHandle,aq=/^(?:checked|selected)$/i,bN=D.getSetAttribute,bF=D.input;bI.fn.extend({attr:function(e,i){return aB(this,bI.attr,e,i,arguments.length>1)},removeAttr:function(e){return this.each(function(){bI.removeAttr(this,e)})}});bI.extend({attr:function(b8,b7,b9){var e,b6,i=b8.nodeType;if(!b8||i===3||i===8||i===2){return}if(typeof b8.getAttribute===aC){return bI.prop(b8,b7,b9)}if(i!==1||!bI.isXMLDoc(b8)){b7=b7.toLowerCase();e=bI.attrHooks[b7]||(bI.expr.match.bool.test(b7)?b3:ba)}if(b9!==undefined){if(b9===null){bI.removeAttr(b8,b7)}else{if(e&&"set" in e&&(b6=e.set(b8,b9,b7))!==undefined){return b6}else{b8.setAttribute(b7,b9+"");return b9}}}else{if(e&&"get" in e&&(b6=e.get(b8,b7))!==null){return b6}else{b6=bI.find.attr(b8,b7);return b6==null?undefined:b6}}},removeAttr:function(b7,b9){var e,b8,b6=0,ca=b9&&b9.match(aF);if(ca&&b7.nodeType===1){while((e=ca[b6++])){b8=bI.propFix[e]||e;if(bI.expr.match.bool.test(e)){if(bF&&bN||!aq.test(e)){b7[b8]=false}else{b7[bI.camelCase("default-"+e)]=b7[b8]=false}}else{bI.attr(b7,e,"")}b7.removeAttribute(bN?e:b8)}}},attrHooks:{type:{set:function(e,i){if(!D.radioValue&&i==="radio"&&bI.nodeName(e,"input")){var b6=e.value;e.setAttribute("type",i);if(b6){e.value=b6}return i}}}}});b3={set:function(i,b6,e){if(b6===false){bI.removeAttr(i,e)}else{if(bF&&bN||!aq.test(e)){i.setAttribute(!bN&&bI.propFix[e]||e,e)}else{i[bI.camelCase("default-"+e)]=i[e]=true}}return e}};bI.each(bI.expr.match.bool.source.match(/\w+/g),function(b7,b6){var e=bO[b6]||bI.find.attr;bO[b6]=bF&&bN||!aq.test(b6)?function(b9,b8,cb){var i,ca;if(!cb){ca=bO[b8];bO[b8]=i;i=e(b9,b8,cb)!=null?b8.toLowerCase():null;bO[b8]=ca}return i}:function(b8,i,b9){if(!b9){return b8[bI.camelCase("default-"+i)]?i.toLowerCase():null}}});if(!bF||!bN){bI.attrHooks.value={set:function(i,b6,e){if(bI.nodeName(i,"input")){i.defaultValue=b6}else{return ba&&ba.set(i,b6,e)}}}}if(!bN){ba={set:function(b6,b7,i){var e=b6.getAttributeNode(i);if(!e){b6.setAttributeNode((e=b6.ownerDocument.createAttribute(i)))}e.value=b7+="";if(i==="value"||b7===b6.getAttribute(i)){return b7}}};bO.id=bO.name=bO.coords=function(b6,i,b7){var e;if(!b7){return(e=b6.getAttributeNode(i))&&e.value!==""?e.value:null}};bI.valHooks.button={get:function(b6,i){var e=b6.getAttributeNode(i);if(e&&e.specified){return e.value}},set:ba.set};bI.attrHooks.contenteditable={set:function(i,b6,e){ba.set(i,b6===""?false:b6,e)}};bI.each(["width","height"],function(b6,e){bI.attrHooks[e]={set:function(i,b7){if(b7===""){i.setAttribute(e,"auto");return b7}}}})}if(!D.style){bI.attrHooks.style={get:function(e){return e.style.cssText||undefined},set:function(e,i){return(e.style.cssText=i+"")}}}var aJ=/^(?:input|select|textarea|button|object)$/i,F=/^(?:a|area)$/i;bI.fn.extend({prop:function(e,i){return aB(this,bI.prop,e,i,arguments.length>1)},removeProp:function(e){e=bI.propFix[e]||e;return this.each(function(){try{this[e]=undefined;delete this[e]}catch(i){}})}});bI.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(b9,b7,ca){var b6,e,b8,i=b9.nodeType;if(!b9||i===3||i===8||i===2){return}b8=i!==1||!bI.isXMLDoc(b9);if(b8){b7=bI.propFix[b7]||b7;e=bI.propHooks[b7]}if(ca!==undefined){return e&&"set" in e&&(b6=e.set(b9,ca,b7))!==undefined?b6:(b9[b7]=ca)}else{return e&&"get" in e&&(b6=e.get(b9,b7))!==null?b6:b9[b7]}},propHooks:{tabIndex:{get:function(i){var e=bI.find.attr(i,"tabindex");return e?parseInt(e,10):aJ.test(i.nodeName)||F.test(i.nodeName)&&i.href?0:-1}}}});if(!D.hrefNormalized){bI.each(["href","src"],function(b6,e){bI.propHooks[e]={get:function(i){return i.getAttribute(e,4)}}})}if(!D.optSelected){bI.propHooks.selected={get:function(i){var e=i.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}}}bI.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){bI.propFix[this.toLowerCase()]=this});if(!D.enctype){bI.propFix.enctype="encoding"}var bL=/[\t\r\n\f]/g;bI.fn.extend({addClass:function(cd){var b7,b6,ce,cb,b8,e,b9=0,ca=this.length,cc=typeof cd==="string"&&cd;if(bI.isFunction(cd)){return this.each(function(i){bI(this).addClass(cd.call(this,i,this.className))})}if(cc){b7=(cd||"").match(aF)||[];for(;b9=0){ce=ce.replace(" "+cb+" "," ")}}e=cd?bI.trim(ce):"";if(b6.className!==e){b6.className=e}}}}return this},toggleClass:function(b6,e){var i=typeof b6;if(typeof e==="boolean"&&i==="string"){return e?this.addClass(b6):this.removeClass(b6)}if(bI.isFunction(b6)){return this.each(function(b7){bI(this).toggleClass(b6.call(this,b7,this.className,e),e)})}return this.each(function(){if(i==="string"){var b9,b8=0,b7=bI(this),ca=b6.match(aF)||[];while((b9=ca[b8++])){if(b7.hasClass(b9)){b7.removeClass(b9)}else{b7.addClass(b9)}}}else{if(i===aC||i==="boolean"){if(this.className){bI._data(this,"__className__",this.className)}this.className=this.className||b6===false?"":bI._data(this,"__className__")||""}}})},hasClass:function(e){var b8=" "+e+" ",b7=0,b6=this.length;for(;b7=0){return true}}return false}});bI.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(b6,e){bI.fn[e]=function(b7,i){return arguments.length>0?this.on(e,null,b7,i):this.trigger(e)}});bI.fn.extend({hover:function(e,i){return this.mouseenter(e).mouseleave(i||e)},bind:function(e,b6,i){return this.on(e,null,b6,i)},unbind:function(e,i){return this.off(e,null,i)},delegate:function(e,i,b7,b6){return this.on(i,e,b7,b6)},undelegate:function(e,i,b6){return arguments.length===1?this.off(e,"**"):this.off(i,e||"**",b6)}});var bp=bI.now();var bQ=(/\?/);var a1=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;bI.parseJSON=function(e){if(a5.JSON&&a5.JSON.parse){return a5.JSON.parse(e+"")}var b7,b6=null,i=bI.trim(e+"");return i&&!bI.trim(i.replace(a1,function(ca,b8,b9,cb){if(b7&&b8){b6=0}if(b6===0){return ca}b7=b9||b8;b6+=!cb-!b9;return""}))?(Function("return "+i))():bI.error("Invalid JSON: "+e)};bI.parseXML=function(b7){var i,b6;if(!b7||typeof b7!=="string"){return null}try{if(a5.DOMParser){b6=new DOMParser();i=b6.parseFromString(b7,"text/xml")}else{i=new ActiveXObject("Microsoft.XMLDOM");i.async="false";i.loadXML(b7)}}catch(b8){i=undefined}if(!i||!i.documentElement||i.getElementsByTagName("parsererror").length){bI.error("Invalid XML: "+b7)}return i};var b4,aa,ap=/#.*$/,R=/([?&])_=[^&]*/,ah=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,C=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,r=/^(?:GET|HEAD)$/,aK=/^\/\//,aV=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,w={},a9={},aX="*/".concat("*");try{aa=location.href}catch(bi){aa=n.createElement("a");aa.href="";aa=aa.href}b4=aV.exec(aa.toLowerCase())||[];function bK(e){return function(b9,ca){if(typeof b9!=="string"){ca=b9;b9="*"}var b6,b7=0,b8=b9.toLowerCase().match(aF)||[];if(bI.isFunction(ca)){while((b6=b8[b7++])){if(b6.charAt(0)==="+"){b6=b6.slice(1)||"*";(e[b6]=e[b6]||[]).unshift(ca)}else{(e[b6]=e[b6]||[]).push(ca)}}}}}function p(e,b6,ca,b7){var i={},b8=(e===a9);function b9(cb){var cc;i[cb]=true;bI.each(e[cb]||[],function(ce,cd){var cf=cd(b6,ca,b7);if(typeof cf==="string"&&!b8&&!i[cf]){b6.dataTypes.unshift(cf);b9(cf);return false}else{if(b8){return !(cc=cf)}}});return cc}return b9(b6.dataTypes[0])||!i["*"]&&b9("*")}function t(b6,b7){var e,i,b8=bI.ajaxSettings.flatOptions||{};for(i in b7){if(b7[i]!==undefined){(b8[i]?b6:(e||(e={})))[i]=b7[i]}}if(e){bI.extend(true,b6,e)}return b6}function g(cc,cb,b8){var e,b7,b6,b9,i=cc.contents,ca=cc.dataTypes;while(ca[0]==="*"){ca.shift();if(b7===undefined){b7=cc.mimeType||cb.getResponseHeader("Content-Type")}}if(b7){for(b9 in i){if(i[b9]&&i[b9].test(b7)){ca.unshift(b9);break}}}if(ca[0] in b8){b6=ca[0]}else{for(b9 in b8){if(!ca[0]||cc.converters[b9+" "+ca[0]]){b6=b9;break}if(!e){e=b9}}b6=b6||e}if(b6){if(b6!==ca[0]){ca.unshift(b6)}return b8[b6]}}function ag(cg,b8,cd,b6){var i,cb,ce,b9,b7,cf={},cc=cg.dataTypes.slice();if(cc[1]){for(ce in cg.converters){cf[ce.toLowerCase()]=cg.converters[ce]}}cb=cc.shift();while(cb){if(cg.responseFields[cb]){cd[cg.responseFields[cb]]=b8}if(!b7&&b6&&cg.dataFilter){b8=cg.dataFilter(b8,cg.dataType)}b7=cb;cb=cc.shift();if(cb){if(cb==="*"){cb=b7}else{if(b7!=="*"&&b7!==cb){ce=cf[b7+" "+cb]||cf["* "+cb];if(!ce){for(i in cf){b9=i.split(" ");if(b9[1]===cb){ce=cf[b7+" "+b9[0]]||cf["* "+b9[0]];if(ce){if(ce===true){ce=cf[i]}else{if(cf[i]!==true){cb=b9[0];cc.unshift(b9[1])}}break}}}}if(ce!==true){if(ce&&cg["throws"]){b8=ce(b8)}else{try{b8=ce(b8)}catch(ca){return{state:"parsererror",error:ce?ca:"No conversion from "+b7+" to "+cb}}}}}}}}return{state:"success",data:b8}}bI.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:aa,type:"GET",isLocal:C.test(b4[1]),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":aX,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":bI.parseJSON,"text xml":bI.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(i,e){return e?t(t(i,bI.ajaxSettings),e):t(bI.ajaxSettings,i)},ajaxPrefilter:bK(w),ajaxTransport:bK(a9),ajax:function(ca,b7){if(typeof ca==="object"){b7=ca;ca=undefined}b7=b7||{};var cj,cl,cb,cq,cf,b6,cm,b8,ce=bI.ajaxSetup({},b7),cs=ce.context||ce,ch=ce.context&&(cs.nodeType||cs.jquery)?bI(cs):bI.event,cr=bI.Deferred(),co=bI.Callbacks("once memory"),cc=ce.statusCode||{},ci={},cp={},b9=0,cd="canceled",ck={readyState:0,getResponseHeader:function(i){var e;if(b9===2){if(!b8){b8={};while((e=ah.exec(cq))){b8[e[1].toLowerCase()]=e[2]}}e=b8[i.toLowerCase()]}return e==null?null:e},getAllResponseHeaders:function(){return b9===2?cq:null},setRequestHeader:function(i,ct){var e=i.toLowerCase();if(!b9){i=cp[e]=cp[e]||i;ci[i]=ct}return this},overrideMimeType:function(e){if(!b9){ce.mimeType=e}return this},statusCode:function(i){var e;if(i){if(b9<2){for(e in i){cc[e]=[cc[e],i[e]]}}else{ck.always(i[ck.status])}}return this},abort:function(i){var e=i||cd;if(cm){cm.abort(e)}cg(0,e);return this}};cr.promise(ck).complete=co.add;ck.success=ck.done;ck.error=ck.fail;ce.url=((ca||ce.url||aa)+"").replace(ap,"").replace(aK,b4[1]+"//");ce.type=b7.method||b7.type||ce.method||ce.type;ce.dataTypes=bI.trim(ce.dataType||"*").toLowerCase().match(aF)||[""];if(ce.crossDomain==null){cj=aV.exec(ce.url.toLowerCase());ce.crossDomain=!!(cj&&(cj[1]!==b4[1]||cj[2]!==b4[2]||(cj[3]||(cj[1]==="http:"?"80":"443"))!==(b4[3]||(b4[1]==="http:"?"80":"443"))))}if(ce.data&&ce.processData&&typeof ce.data!=="string"){ce.data=bI.param(ce.data,ce.traditional)}p(w,ce,b7,ck);if(b9===2){return ck}b6=bI.event&&ce.global;if(b6&&bI.active++===0){bI.event.trigger("ajaxStart")}ce.type=ce.type.toUpperCase();ce.hasContent=!r.test(ce.type);cb=ce.url;if(!ce.hasContent){if(ce.data){cb=(ce.url+=(bQ.test(cb)?"&":"?")+ce.data);delete ce.data}if(ce.cache===false){ce.url=R.test(cb)?cb.replace(R,"$1_="+bp++):cb+(bQ.test(cb)?"&":"?")+"_="+bp++}}if(ce.ifModified){if(bI.lastModified[cb]){ck.setRequestHeader("If-Modified-Since",bI.lastModified[cb])}if(bI.etag[cb]){ck.setRequestHeader("If-None-Match",bI.etag[cb])}}if(ce.data&&ce.hasContent&&ce.contentType!==false||b7.contentType){ck.setRequestHeader("Content-Type",ce.contentType)}ck.setRequestHeader("Accept",ce.dataTypes[0]&&ce.accepts[ce.dataTypes[0]]?ce.accepts[ce.dataTypes[0]]+(ce.dataTypes[0]!=="*"?", "+aX+"; q=0.01":""):ce.accepts["*"]);for(cl in ce.headers){ck.setRequestHeader(cl,ce.headers[cl])}if(ce.beforeSend&&(ce.beforeSend.call(cs,ck,ce)===false||b9===2)){return ck.abort()}cd="abort";for(cl in {success:1,error:1,complete:1}){ck[cl](ce[cl])}cm=p(a9,ce,b7,ck);if(!cm){cg(-1,"No Transport")}else{ck.readyState=1;if(b6){ch.trigger("ajaxSend",[ck,ce])}if(ce.async&&ce.timeout>0){cf=setTimeout(function(){ck.abort("timeout")},ce.timeout)}try{b9=1;cm.send(ci,cg)}catch(cn){if(b9<2){cg(-1,cn)}else{throw cn}}}function cg(cw,i,cx,cu){var e,cA,cy,cv,cz,ct=i;if(b9===2){return}b9=2;if(cf){clearTimeout(cf)}cm=undefined;cq=cu||"";ck.readyState=cw>0?4:0;e=cw>=200&&cw<300||cw===304;if(cx){cv=g(ce,ck,cx)}cv=ag(ce,cv,ck,e);if(e){if(ce.ifModified){cz=ck.getResponseHeader("Last-Modified");if(cz){bI.lastModified[cb]=cz}cz=ck.getResponseHeader("etag");if(cz){bI.etag[cb]=cz}}if(cw===204||ce.type==="HEAD"){ct="nocontent"}else{if(cw===304){ct="notmodified"}else{ct=cv.state;cA=cv.data;cy=cv.error;e=!cy}}}else{cy=ct;if(cw||!ct){ct="error";if(cw<0){cw=0}}}ck.status=cw;ck.statusText=(i||ct)+"";if(e){cr.resolveWith(cs,[cA,ct,ck])}else{cr.rejectWith(cs,[ck,ct,cy])}ck.statusCode(cc);cc=undefined;if(b6){ch.trigger(e?"ajaxSuccess":"ajaxError",[ck,ce,e?cA:cy])}co.fireWith(cs,[ck,ct]);if(b6){ch.trigger("ajaxComplete",[ck,ce]);if(!(--bI.active)){bI.event.trigger("ajaxStop")}}}return ck},getJSON:function(e,i,b6){return bI.get(e,i,b6,"json")},getScript:function(e,i){return bI.get(e,undefined,i,"script")}});bI.each(["get","post"],function(e,b6){bI[b6]=function(i,b8,b9,b7){if(bI.isFunction(b8)){b7=b7||b9;b9=b8;b8=undefined}return bI.ajax({url:i,type:b6,dataType:b7,data:b8,success:b9})}});bI._evalUrl=function(e){return bI.ajax({url:e,type:"GET",dataType:"script",async:false,global:false,"throws":true})};bI.fn.extend({wrapAll:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapAll(e.call(this,b6))})}if(this[0]){var i=bI(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){i.insertBefore(this[0])}i.map(function(){var b6=this;while(b6.firstChild&&b6.firstChild.nodeType===1){b6=b6.firstChild}return b6}).append(this)}return this},wrapInner:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapInner(e.call(this,b6))})}return this.each(function(){var i=bI(this),b6=i.contents();if(b6.length){b6.wrapAll(e)}else{i.append(e)}})},wrap:function(e){var i=bI.isFunction(e);return this.each(function(b6){bI(this).wrapAll(i?e.call(this,b6):e)})},unwrap:function(){return this.parent().each(function(){if(!bI.nodeName(this,"body")){bI(this).replaceWith(this.childNodes)}}).end()}});bI.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||(!D.reliableHiddenOffsets()&&((e.style&&e.style.display)||bI.css(e,"display"))==="none")};bI.expr.filters.visible=function(e){return !bI.expr.filters.hidden(e)};var bw=/%20/g,aS=/\[\]$/,X=/\r?\n/g,b=/^(?:submit|button|image|reset|file)$/i,au=/^(?:input|select|textarea|keygen)/i;function j(b6,b8,i,b7){var e;if(bI.isArray(b8)){bI.each(b8,function(ca,b9){if(i||aS.test(b6)){b7(b6,b9)}else{j(b6+"["+(typeof b9==="object"?ca:"")+"]",b9,i,b7)}})}else{if(!i&&bI.type(b8)==="object"){for(e in b8){j(b6+"["+e+"]",b8[e],i,b7)}}else{b7(b6,b8)}}}bI.param=function(e,b6){var b7,i=[],b8=function(b9,ca){ca=bI.isFunction(ca)?ca():(ca==null?"":ca);i[i.length]=encodeURIComponent(b9)+"="+encodeURIComponent(ca)};if(b6===undefined){b6=bI.ajaxSettings&&bI.ajaxSettings.traditional}if(bI.isArray(e)||(e.jquery&&!bI.isPlainObject(e))){bI.each(e,function(){b8(this.name,this.value)})}else{for(b7 in e){j(b7,e[b7],b6,b8)}}return i.join("&").replace(bw,"+")};bI.fn.extend({serialize:function(){return bI.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=bI.prop(this,"elements");return e?bI.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!bI(this).is(":disabled")&&au.test(this.nodeName)&&!b.test(e)&&(this.checked||!aM.test(e))}).map(function(e,b6){var b7=bI(this).val();return b7==null?null:bI.isArray(b7)?bI.map(b7,function(i){return{name:b6.name,value:i.replace(X,"\r\n")}}):{name:b6.name,value:b7.replace(X,"\r\n")}}).get()}});bI.ajaxSettings.xhr=a5.ActiveXObject!==undefined?function(){return !this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&bE()||bg()}:bE;var aA=0,aj={},ay=bI.ajaxSettings.xhr();if(a5.attachEvent){a5.attachEvent("onunload",function(){for(var e in aj){aj[e](undefined,true)}})}D.cors=!!ay&&("withCredentials" in ay);ay=D.ajax=!!ay;if(ay){bI.ajaxTransport(function(e){if(!e.crossDomain||D.cors){var i;return{send:function(b9,b6){var b7,b8=e.xhr(),ca=++aA;b8.open(e.type,e.url,e.async,e.username,e.password);if(e.xhrFields){for(b7 in e.xhrFields){b8[b7]=e.xhrFields[b7]}}if(e.mimeType&&b8.overrideMimeType){b8.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!b9["X-Requested-With"]){b9["X-Requested-With"]="XMLHttpRequest"}for(b7 in b9){if(b9[b7]!==undefined){b8.setRequestHeader(b7,b9[b7]+"")}}b8.send((e.hasContent&&e.data)||null);i=function(cd,cc){var cb,cg,ce;if(i&&(cc||b8.readyState===4)){delete aj[ca];i=undefined;b8.onreadystatechange=bI.noop;if(cc){if(b8.readyState!==4){b8.abort()}}else{ce={};cb=b8.status;if(typeof b8.responseText==="string"){ce.text=b8.responseText}try{cg=b8.statusText}catch(cf){cg=""}if(!cb&&e.isLocal&&!e.crossDomain){cb=ce.text?200:404}else{if(cb===1223){cb=204}}}}if(ce){b6(cb,cg,ce,b8.getAllResponseHeaders())}};if(!e.async){i()}else{if(b8.readyState===4){setTimeout(i)}else{b8.onreadystatechange=aj[ca]=i}}},abort:function(){if(i){i(undefined,true)}}}}})}function bE(){try{return new a5.XMLHttpRequest()}catch(i){}}function bg(){try{return new a5.ActiveXObject("Microsoft.XMLHTTP")}catch(i){}}bI.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){bI.globalEval(e);return e}}});bI.ajaxPrefilter("script",function(e){if(e.cache===undefined){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});bI.ajaxTransport("script",function(b6){if(b6.crossDomain){var e,i=n.head||bI("head")[0]||n.documentElement;return{send:function(b7,b8){e=n.createElement("script");e.async=true;if(b6.scriptCharset){e.charset=b6.scriptCharset}e.src=b6.url;e.onload=e.onreadystatechange=function(ca,b9){if(b9||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(e.parentNode){e.parentNode.removeChild(e)}e=null;if(!b9){b8(200,"success")}}};i.insertBefore(e,i.firstChild)},abort:function(){if(e){e.onload(undefined,true)}}}}});var bs=[],a8=/(=)\?(?=&|$)|\?\?/;bI.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=bs.pop()||(bI.expando+"_"+(bp++));this[e]=true;return e}});bI.ajaxPrefilter("json jsonp",function(b7,e,b8){var ca,i,b6,b9=b7.jsonp!==false&&(a8.test(b7.url)?"url":typeof b7.data==="string"&&!(b7.contentType||"").indexOf("application/x-www-form-urlencoded")&&a8.test(b7.data)&&"data");if(b9||b7.dataTypes[0]==="jsonp"){ca=b7.jsonpCallback=bI.isFunction(b7.jsonpCallback)?b7.jsonpCallback():b7.jsonpCallback;if(b9){b7[b9]=b7[b9].replace(a8,"$1"+ca)}else{if(b7.jsonp!==false){b7.url+=(bQ.test(b7.url)?"&":"?")+b7.jsonp+"="+ca}}b7.converters["script json"]=function(){if(!b6){bI.error(ca+" was not called")}return b6[0]};b7.dataTypes[0]="json";i=a5[ca];a5[ca]=function(){b6=arguments};b8.always(function(){a5[ca]=i;if(b7[ca]){b7.jsonpCallback=e.jsonpCallback;bs.push(ca)}if(b6&&bI.isFunction(i)){i(b6[0])}b6=i=undefined});return"script"}});bI.parseHTML=function(b8,b6,b7){if(!b8||typeof b8!=="string"){return null}if(typeof b6==="boolean"){b7=b6;b6=false}b6=b6||n;var i=a.exec(b8),e=!b7&&[];if(i){return[b6.createElement(i[1])]}i=bI.buildFragment([b8],b6,e);if(e&&e.length){bI(e).remove()}return bI.merge([],i.childNodes)};var b1=bI.fn.load;bI.fn.load=function(b7,ca,cb){if(typeof b7!=="string"&&b1){return b1.apply(this,arguments)}var e,b6,b8,i=this,b9=b7.indexOf(" ");if(b9>=0){e=bI.trim(b7.slice(b9,b7.length));b7=b7.slice(0,b9)}if(bI.isFunction(ca)){cb=ca;ca=undefined}else{if(ca&&typeof ca==="object"){b8="POST"}}if(i.length>0){bI.ajax({url:b7,type:b8,dataType:"html",data:ca}).done(function(cc){b6=arguments;i.html(e?bI("
    ").append(bI.parseHTML(cc)).find(e):cc)}).complete(cb&&function(cd,cc){i.each(cb,b6||[cd.responseText,cc,cd])})}return this};bI.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,b6){bI.fn[b6]=function(i){return this.on(b6,i)}});bI.expr.filters.animated=function(e){return bI.grep(bI.timers,function(i){return e===i.elem}).length};var bX=a5.document.documentElement;function br(e){return bI.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}bI.offset={setOffset:function(b7,ch,cb){var cd,ca,e,b8,b6,cf,cg,cc=bI.css(b7,"position"),b9=bI(b7),ce={};if(cc==="static"){b7.style.position="relative"}b6=b9.offset();e=bI.css(b7,"top");cf=bI.css(b7,"left");cg=(cc==="absolute"||cc==="fixed")&&bI.inArray("auto",[e,cf])>-1;if(cg){cd=b9.position();b8=cd.top;ca=cd.left}else{b8=parseFloat(e)||0;ca=parseFloat(cf)||0}if(bI.isFunction(ch)){ch=ch.call(b7,cb,b6)}if(ch.top!=null){ce.top=(ch.top-b6.top)+b8}if(ch.left!=null){ce.left=(ch.left-b6.left)+ca}if("using" in ch){ch.using.call(b7,ce)}else{b9.css(ce)}}};bI.fn.extend({offset:function(i){if(arguments.length){return i===undefined?this:this.each(function(ca){bI.offset.setOffset(this,i,ca)})}var e,b9,b7={top:0,left:0},b6=this[0],b8=b6&&b6.ownerDocument;if(!b8){return}e=b8.documentElement;if(!bI.contains(e,b6)){return b7}if(typeof b6.getBoundingClientRect!==aC){b7=b6.getBoundingClientRect()}b9=br(b8);return{top:b7.top+(b9.pageYOffset||e.scrollTop)-(e.clientTop||0),left:b7.left+(b9.pageXOffset||e.scrollLeft)-(e.clientLeft||0)}},position:function(){if(!this[0]){return}var b6,b7,e={top:0,left:0},i=this[0];if(bI.css(i,"position")==="fixed"){b7=i.getBoundingClientRect()}else{b6=this.offsetParent();b7=this.offset();if(!bI.nodeName(b6[0],"html")){e=b6.offset()}e.top+=bI.css(b6[0],"borderTopWidth",true);e.left+=bI.css(b6[0],"borderLeftWidth",true)}return{top:b7.top-e.top-bI.css(i,"marginTop",true),left:b7.left-e.left-bI.css(i,"marginLeft",true)}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||bX;while(e&&(!bI.nodeName(e,"html")&&bI.css(e,"position")==="static")){e=e.offsetParent}return e||bX})}});bI.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b6,i){var e=/Y/.test(i);bI.fn[b6]=function(b7){return aB(this,function(b8,cb,ca){var b9=br(b8);if(ca===undefined){return b9?(i in b9)?b9[i]:b9.document.documentElement[cb]:b8[cb]}if(b9){b9.scrollTo(!e?ca:bI(b9).scrollLeft(),e?ca:bI(b9).scrollTop())}else{b8[cb]=ca}},b6,b7,arguments.length,null)}});bI.each(["top","left"],function(e,b6){bI.cssHooks[b6]=a7(D.pixelPosition,function(b7,i){if(i){i=G(b7,b6);return Y.test(i)?bI(b7).position()[b6]+"px":i}})});bI.each({Height:"height",Width:"width"},function(e,i){bI.each({padding:"inner"+e,content:i,"":"outer"+e},function(b6,b7){bI.fn[b7]=function(cb,ca){var b9=arguments.length&&(b6||typeof cb!=="boolean"),b8=b6||(cb===true||ca===true?"margin":"border");return aB(this,function(cd,cc,ce){var cf;if(bI.isWindow(cd)){return cd.document.documentElement["client"+e]}if(cd.nodeType===9){cf=cd.documentElement;return Math.max(cd.body["scroll"+e],cf["scroll"+e],cd.body["offset"+e],cf["offset"+e],cf["client"+e])}return ce===undefined?bI.css(cd,cc,b8):bI.style(cd,cc,ce,b8)},i,b9?cb:undefined,b9,null)}})});bI.fn.size=function(){return this.length};bI.fn.andSelf=bI.fn.addBack;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return bI})}var bk=a5.jQuery,I=a5.$;bI.noConflict=function(e){if(a5.$===bI){a5.$=I}if(e&&a5.jQuery===bI){a5.jQuery=bk}return bI};if(typeof av===aC){a5.jQuery=a5.$=bI}return bI}));!function(a){a(function(){a.support.transition=(function(){var b=(function(){var e=document.createElement("bootstrap"),d={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in d){if(e.style[c]!==undefined){return d[c]}}}());return b&&{end:b}})()})}(window.jQuery);!function(d){var c='[data-dismiss="alert"]',b=function(e){d(e).on("click",c,this.close)};b.prototype.close=function(j){var i=d(this),g=i.attr("data-target"),h;if(!g){g=i.attr("href");g=g&&g.replace(/.*(?=#[^\s]*$)/,"")}h=d(g);j&&j.preventDefault();h.length||(h=i.hasClass("alert")?i:i.parent());h.trigger(j=d.Event("close"));if(j.isDefaultPrevented()){return}h.removeClass("in");function f(){h.trigger("closed").remove()}d.support.transition&&h.hasClass("fade")?h.on(d.support.transition.end,f):f()};var a=d.fn.alert;d.fn.alert=function(e){return this.each(function(){var g=d(this),f=g.data("alert");if(!f){g.data("alert",(f=new b(this)))}if(typeof e=="string"){f[e].call(g)}})};d.fn.alert.Constructor=b;d.fn.alert.noConflict=function(){d.fn.alert=a;return this};d(document).on("click.alert.data-api",c,b.prototype.close)}(window.jQuery);!function(c){var b=function(e,d){this.$element=c(e);this.options=c.extend({},c.fn.button.defaults,d)};b.prototype.setState=function(g){var i="disabled",e=this.$element,f=e.data(),h=e.is("input")?"val":"html";g=g+"Text";f.resetText||e.data("resetText",e[h]());e[h](f[g]||this.options[g]);setTimeout(function(){g=="loadingText"?e.addClass(i).attr(i,i):e.removeClass(i).removeAttr(i)},0)};b.prototype.toggle=function(){var d=this.$element.closest('[data-toggle="buttons-radio"]');d&&d.find(".active").removeClass("active");this.$element.toggleClass("active")};var a=c.fn.button;c.fn.button=function(d){return this.each(function(){var g=c(this),f=g.data("button"),e=typeof d=="object"&&d;if(!f){g.data("button",(f=new b(this,e)))}if(d=="toggle"){f.toggle()}else{if(d){f.setState(d)}}})};c.fn.button.defaults={loadingText:"loading..."};c.fn.button.Constructor=b;c.fn.button.noConflict=function(){c.fn.button=a;return this};c(document).on("click.button.data-api","[data-toggle^=button]",function(f){var d=c(f.target);if(!d.hasClass("btn")){d=d.closest(".btn")}d.button("toggle")})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.$indicators=this.$element.find(".carousel-indicators");this.options=d;this.options.pause=="hover"&&this.$element.on("mouseenter",b.proxy(this.pause,this)).on("mouseleave",b.proxy(this.cycle,this))};c.prototype={cycle:function(d){if(!d){this.paused=false}if(this.interval){clearInterval(this.interval)}this.options.interval&&!this.paused&&(this.interval=setInterval(b.proxy(this.next,this),this.options.interval));return this},getActiveIndex:function(){this.$active=this.$element.find(".item.active");this.$items=this.$active.parent().children();return this.$items.index(this.$active)},to:function(f){var d=this.getActiveIndex(),e=this;if(f>(this.$items.length-1)||f<0){return}if(this.sliding){return this.$element.one("slid",function(){e.to(f)})}if(d==f){return this.pause().cycle()}return this.slide(f>d?"next":"prev",b(this.$items[f]))},pause:function(d){if(!d){this.paused=true}if(this.$element.find(".next, .prev").length&&b.support.transition.end){this.$element.trigger(b.support.transition.end);this.cycle(true)}clearInterval(this.interval);this.interval=null;return this},next:function(){if(this.sliding){return}return this.slide("next")},prev:function(){if(this.sliding){return}return this.slide("prev")},slide:function(k,f){var m=this.$element.find(".item.active"),d=f||m[k](),j=this.interval,l=k=="next"?"left":"right",g=k=="next"?"first":"last",h=this,i;this.sliding=true;j&&this.pause();d=d.length?d:this.$element.find(".item")[g]();i=b.Event("slide",{relatedTarget:d[0],direction:l});if(d.hasClass("active")){return}if(this.$indicators.length){this.$indicators.find(".active").removeClass("active");this.$element.one("slid",function(){var e=b(h.$indicators.children()[h.getActiveIndex()]);e&&e.addClass("active")})}if(b.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(i);if(i.isDefaultPrevented()){return}d.addClass(k);d[0].offsetWidth;m.addClass(l);d.addClass(l);this.$element.one(b.support.transition.end,function(){d.removeClass([k,l].join(" ")).addClass("active");m.removeClass(["active",l].join(" "));h.sliding=false;setTimeout(function(){h.$element.trigger("slid")},0)})}else{this.$element.trigger(i);if(i.isDefaultPrevented()){return}m.removeClass("active");d.addClass("active");this.sliding=false;this.$element.trigger("slid")}j&&this.cycle();return this}};var a=b.fn.carousel;b.fn.carousel=function(d){return this.each(function(){var h=b(this),g=h.data("carousel"),e=b.extend({},b.fn.carousel.defaults,typeof d=="object"&&d),f=typeof d=="string"?d:e.slide;if(!g){h.data("carousel",(g=new c(this,e)))}if(typeof d=="number"){g.to(d)}else{if(f){g[f]()}else{if(e.interval){g.pause().cycle()}}}})};b.fn.carousel.defaults={interval:5000,pause:"hover"};b.fn.carousel.Constructor=c;b.fn.carousel.noConflict=function(){b.fn.carousel=a;return this};b(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(j){var i=b(this),f,d=b(i.attr("data-target")||(f=i.attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")),g=b.extend({},d.data(),i.data()),h;d.carousel(g);if(h=i.attr("data-slide-to")){d.data("carousel").pause().to(h).cycle()}j.preventDefault()})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.options=b.extend({},b.fn.collapse.defaults,d);if(this.options.parent){this.$parent=b(this.options.parent)}this.options.toggle&&this.toggle()};c.prototype={constructor:c,dimension:function(){var d=this.$element.hasClass("width");return d?"width":"height"},show:function(){var g,d,f,e;if(this.transitioning||this.$element.hasClass("in")){return}g=this.dimension();d=b.camelCase(["scroll",g].join("-"));f=this.$parent&&this.$parent.find("> .accordion-group > .in");if(f&&f.length){e=f.data("collapse");if(e&&e.transitioning){return}f.collapse("hide");e||f.data("collapse",null)}this.$element[g](0);this.transition("addClass",b.Event("show"),"shown");b.support.transition&&this.$element[g](this.$element[0][d])},hide:function(){var d;if(this.transitioning||!this.$element.hasClass("in")){return}d=this.dimension();this.reset(this.$element[d]());this.transition("removeClass",b.Event("hide"),"hidden");this.$element[d](0)},reset:function(d){var e=this.dimension();this.$element.removeClass("collapse")[e](d||"auto")[0].offsetWidth;this.$element[d!==null?"addClass":"removeClass"]("collapse");return this},transition:function(h,e,f){var g=this,d=function(){if(e.type=="show"){g.reset()}g.transitioning=0;g.$element.trigger(f)};this.$element.trigger(e);if(e.isDefaultPrevented()){return}this.transitioning=1;this.$element[h]("in");b.support.transition&&this.$element.hasClass("collapse")?this.$element.one(b.support.transition.end,d):d()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var a=b.fn.collapse;b.fn.collapse=function(d){return this.each(function(){var g=b(this),f=g.data("collapse"),e=b.extend({},b.fn.collapse.defaults,g.data(),typeof d=="object"&&d);if(!f){g.data("collapse",(f=new c(this,e)))}if(typeof d=="string"){f[d]()}})};b.fn.collapse.defaults={toggle:true};b.fn.collapse.Constructor=c;b.fn.collapse.noConflict=function(){b.fn.collapse=a;return this};b(document).on("click.collapse.data-api","[data-toggle=collapse]",function(i){var h=b(this),d,g=h.attr("data-target")||i.preventDefault()||(d=h.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=b(g).data("collapse")?"toggle":h.data();h[b(g).hasClass("in")?"addClass":"removeClass"]("collapsed");b(g).collapse(f)})}(window.jQuery);!function(f){var b="[data-toggle=dropdown]",a=function(h){var g=f(h).on("click.dropdown.data-api",this.toggle);f("html").on("click.dropdown.data-api",function(){g.parent().removeClass("open")})};a.prototype={constructor:a,toggle:function(j){var i=f(this),h,g;if(i.is(".disabled, :disabled")){return}h=e(i);g=h.hasClass("open");d();if(!g){if("ontouchstart" in document.documentElement){f(' diff --git a/dependency-check-maven/fonts/glyphicons-halflings-regular.eot b/dependency-check-maven/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..637452ea5404ac01670c10db5276e73114d16178 GIT binary patch literal 35283 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 literal 0 HcmV?d00001 diff --git a/dependency-check-maven/fonts/glyphicons-halflings-regular.svg b/dependency-check-maven/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 000000000..446948874 --- /dev/null +++ b/dependency-check-maven/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dependency-check-maven/fonts/glyphicons-halflings-regular.ttf b/dependency-check-maven/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..282401576351ef7d0eb7313e74a251694b6d78bc GIT binary patch literal 55016 zcmeFa>2F-gmM3;2_l>zPOp-}vGMSmANF|pfnbby6`@UC6RF$eqQc+cZP>8UlwJe<$z#CAG-?bJwi~b2?lwFF``Z|X{V(|UJ11@~ z6t(qC!(U9sy*DCm+{lO%Cn8RqbK-`LESEjv2wbkrPLc z9XBDocgzaH>{D$L~MVg;aQEFaU9Q`4{v?>0Pm8H6OdRZ^x-GpeX#3){8I^O9K3@c-MO`4eD@?4H+eeC zA0axj;7d48CvM`S`(J&lp_HV;4Y_;p_~f(qZ!O^Y#`lt*HA3kAt#2QAd|GM*;aJO0 zZ{5H1+kfhY-KY1_gU`PF3ZX-|u1YSbe+YpGU)&)C;HI-ZrD=Y1=k^D;5PP{Tu`%Qw zz(uID%m?%v8+xaSpzBZnD5>HI4>Hd2AZ+*%?kGFLj^p(qEM@mQK5vY*MC@CxPu?up zSjUf7JN>FG9RV^qtv2h^a;#pE-#q^YS|^ z_kdG&rdi^0q&!=GuMFRKx^5cbMgm^`R2Wwg*A%WjxK81^j_W3_ySTo?)$6vWKaQ8~ zH_xQ!FT?9kZSDAM<}qQK){_hx{_E@~KJBCp;*yd;w7pYM67=O+07_{lEW_lG|G zihqRer1Y>EdNUjr&t6=|{q#d(vQs@ch(}<0{lInm?#Jup-)@>rb8t6an3?k5ZN{eQ z^~{{Pynd{Dy~2QZ=I$U-aqZ%Ig^%lu^zk>4Ri#?_o-sRh>ISMz?Vo1E@rTzt z@z<}*ulZ*NZoI{u0?cWgI4ou5FWtDo>>T-_AYV^(UaxI?9hym}%6n#+QFx~OBOWLe z?ouA+<*l8n^69Ie#@&(MxC7rUMk2T}T&Y}V>Q3BcjniUA+%$V3 za<1KBg#2pUmg4}D4OS|{<){B1fGydalA63}Yl7Oy2ZV^7@%8!)y{GZ2^z3 zeu}>(={R&%Z?WVA2k%<`B#|O5NReX2)ti2%;`p2psNVYcW-kmhlgx}%A8D8jm$!C$ zgFnrorhIXIzqA(HFw1H>Yi8~6VM82EI`2F7>1Oe!)S98o>($$QI@QC&;xX03*BP-U z(8Q2`(4{rtLcf(~az zZeCR7O*^Qk7J#m8wpfHN5CJFUt?79oaY= z&W7)-@2pdBCYY~7d>d%tX0|q?3oPd#qcTr7{VYp*Yct4a(M&sY^O>beqg_a~Qtd*p zlB*PgjZ`%iY_vBF3#0CrztE=})d?fI5VX$2ni`HmqBc;pWz6g3mn?HQr985eSkF*-hFp zT3*<*XAfJn-CAr{+pXpHa%-WGFH{$sp6Ynq6RZR)fgEn5zShF3XQ>qk2CCzYrfFjQN3Y;Q|DW^@r#79BJiBr_ZvMW4G>Uif<+k z$0X7064Sk3(HH3_3C)AX{zIaT(%H5@y{=?Sl{B}qdCK|;ZqHH4!_APFMfgB z_e>GL_08Y>aWNLZCj{_@l;kY@K_>!Y(^)cwwyCAU{*)~&KC!-whWWyI);%2b`DSLL zn+#zhaOa&S@w|;^Og;q!y4@GC^4oY~tO{`X60D)q8(i(>#aUAy4-S}fc+Ix*kiNT$ z>-~WN+!GUt0sht{T%A`p1{$RF22hI*T}7xn^KLK4TmGgKc3OljNEYI8aBI^m15$)= z4?W%VZawjav^RMD(vd=54Tb^|j7l@7Dkg=&X{nN8rf^zIc+8BA(Rkc9HavBfBJPAR z)*u37yi*@F?Nzgss-^0|xGC7sVm;`On;hZ-z6qqfa0uXDJAL6=njPxG@hfrSNiq^g z96X;+4drg`^1KVLx@2MKi{qc-Y^&hJjr}{Iax0k%m|UpjGQ+!!QlN+ zmWxHWZ*cwcJAA{eI!@9uc0{9o`F$pY!-w~SK{IpS^NB|2UA`uoaAaKfoUwOE;hbex>_2!$_^BvknQ#&U*?GkaY)b&;}txUya!Y1QwpEUpS z-)FkMKBwRH-aX#3O~F2*?x4x2$G$npdC&I7ZNHhvVi{=%SoMsZJbcnYIs+4iqTX_4 z3c+@v(XKXvuUf(*$eWZK9EnM|bLU^F)E=@9{*T}NJ^cuGX*k?EV9TJxFPWwB`T?`J zypS)MY@nJmIo7*&P(M3ZvrsT*12L@QBYndMgN#)LW{Z|I_ zAV$ZE*%r@qY%aKs&L09YbLg$_mG5j{5CNG}-KpnMCl6^TxsmcrpnYbYgU(^WW^I=l zg3o6gqD1iRw?JML3}3SlO%gbu=?3LVxReDh(iBr$n=6bzB*Vc{YH=B}az2*=qE*K0 zMW9`8*u3O@Nl-IaD&>&n13uZb-LPkUd(8H*l)U>v$#cIyhZ6GJ7V}IJ2a_WHgb;QC zcfonj`ONuQ&|1h$^aP^S{!au8f#ZuCg5v_nvyUV;yY=|!R}#CMu)Kjw;wQEqzXAV( z6c!!@^y8%Vk}&$qq+0jXoAT~~f4k2|rgy z@NTyy_Fe7iy3$e6br)F=86SnhAKBVG${58qcIJt#%{K(gZa#x!g_q;lt(`F_n+HNI z1F`Brs6cKzh7lv!>1DRTAV7?HQTTP+n6tiZyQ6%*IQ(o&ciWw#OgA&cYq&4!nO1!! z0z-vyO3t{7ohW|!vGcL-xbL_VmG9bNQwW=2*nDh; zI?2pXU!W6j^Id)Md!%wd2br@Y$=i@|4GFiAy+Y|$iAbfb%?hhBQc~)Fq%PEdX+(pi zF$wmO$&*C69x}NugViW=scmhR^mM$Zs zFI~KNK>oSYdFa z3NVnzvzTt@uyoC0-3A^-V=14;0?9Mp^cWpJK`QC+S@^5}>_d{;<~DARC<=umqd?tX z|H<2|cPY2QaSJyg3e6-}RBc=YoI3g#!#DrSUp&NzHWw4)r_6;<@HaLb(*XuKqNL*I z2oT5tS*K8})nf7_LE?J~kZcMJ0A@r)!L;l`B(e24CDTM3d{6^6rTb5GhZAlG{k)9J zHev2?F_%-y;=o;GQw=%84DxbLIG3E;ESW6CFK%s~VUd<`F^9{x$xd!&P?Wu}}y#PK1M z9rNVJOfX+)7xM7777lur51PVqyU|{TcWH6fQ=c{MdL!7V!&@CscmfI22m}kk0K9&# z!gATbczuY>J5PMjdvW)E`24%){q@Q5;n{kiIZIaG%G^coV1kwOGiZ_p@5LESITz5B z{)HL7+Sk13Ee>!J444mp!s92od9GKc>VbKiur_I@5alXQGMP>lb671hG%p|R=6tibwK*WqdHrZHBYk+0$*{7+y|nch>|0^G zlWOUZEtqf`5^ zOoL}*!|e|ekekmeL=qcQ`}R#Cr-f*oY`jn1ZZfrh{}fvq?kJz&IpW?M!-Wgw`o^DQ z!+?=F!-l|uhPCrax0XeB_~|AV;UU&s7szM=9pn5V={81&v9Lky`%eB&3Ufd zS2C38%Lg84Gk7rC2y;b>6L(V1I12=JjtCBpY&{7WZInPr8YQEnimVtr5H~5a z5swlzcnNT$anHJ$Df)hj5>zoG72((v}~X;czQ0ZPMmwKl2ZHc3d7l zL!NQRo!DR$ujhUCfB*W|p7%QGnX;P!KU9a-?K12ff7Ze{;WP!tig!VhkOFJ4d4$75 zzH&lg?KJ{6zpPVa%Fzj>YFb|Wn~JyU&9uB#m&ZY>J&UVb26n2+dE6+1WC7F(23)ks zl!6e^gXk7m)-$I*5p{w5W{bJy1HZ#`3nX*k6JJmZ?9-t}rbI}w@Kr=6L3n~bX+%$0 zCXxY8B%zoHeZUwp6c?gC5E(92yQN1O7gy=U1^2)I*`LwZ5r+}4)jhyNb!57ecmgcA zQAk4K$_M_7|l zPL4UwhB1F8PYRJgSjb3X6AC*+mIeeryXWs>#;v2Gq;SPoCWyPB1+9;2#0?lq8O4O3AL2U zRMIUwfo58TO1tH)AdyUQ#*XL+!z~!$|K5VP$UN-~a}?ehhImG)qmRST_JKYJ?)~xJ zW|ktl&0Mry0$o1FPS9!CA!*oDOiJwwN4$CV0_J1KXtrOzfVlql%UEK+j3HaZ(y!Zk z_yx1qOtCsI8kM^hN5WobUtsz#^elHqoGUE5h`TX&rC9AEE~XZ4B~TqxV1h7+xC6nc zcp{3geqSbAC@OY`1-tV~H>VW&jT6p-xlWWX^0fdaJL;hjyP6G@>q!c_gOyYe6fvZG zeXAR!-{vT;?W-f!GPdozi<*a>k7VI=sr$|M%$}1HpwJbCB%O-$J>ig2yp;hlzx5

    xGKKWr)LOIHX|9j|pm3m{#V9uzu%fq9E597(oHCcB;|_!~!{QsuILvV|l5CK@}Kh6VZyy>Se}Y{t-Ts^u!6qK#E$EnO68kp{GwEz0sut zG%@1oy!t`XgD7u-6eamx11F}@b7eq)A25|%ZAmYv+aPD5xbdXd{@GfJ`U9f-o~$OE z6$Da}A|GzM^~M6l@MkFrE`WrR0M?Nv5N3RVA;WrCTs#rx{DOV3lVUEB|&wiJLGM5fJCgIEdxR{ zvuZ{?tEQcbo2EAq1OT~U{r1rpA8$-e{s6DKuinZ^^RP7g=LRan{tK7rzjQ1zIT<;2 zi7*vi&kpWYptf+x`H%&eRp71?bLv~0%L{l4zLnr%E{AQ&T%N_afOdLobDDr&kkG!Z z&3z0dB~;jYd_+78)6y+t(b5RO%wMa|N=z`B$$GUP$Jn()GLxk`jGR?d9)*@dC*1Tv znUn6k;7k^5Bi~{~p%sxEp{b7^AJQy`IKO@l> zU*JX$oW_2IENp&XX*>aBGh5_yTNr>RMkA4Lo!tPuY>bwvia+JA7_d0N^#CKI0lk5K zGQkec_=3uj&ph}maPA^jL(inLpLWaOePGLwfQk|GkWnQ5bQ5%{t`M|jwKiBP!3LNw zJC*C$XCEKA+FOD>OPvD1v&_i`4nHeM2e0pT=XXoae!+U;6!YLU%7Bz&Q{;14ry>F~ z!I*e5VL_Q>zTgtbM(2ibJfpoADsQz^&2&l)R#Fa{9?_AHE4* zB8tF?dY7$_#^BCyU$xq{T8OtABAPaIxEl=hNb~U)9Gw)pc@d(Fib(MfI!C~NJL6n1 zx=lcP-rP}P+@!ajOwAwDu~`#_c?tdv!*8?UsSbD;+&4zp`)Zas9OVnAcf(cbIux*m|<(z;XTVl0?syq+zqU!Q$dU9Sqtv ziJF{Rp<*At8XuO3Om@X`8LJ#Fe0%q)uwpd57WU_h%kBLK){e+XK3_>ymnczaEmf!r zpwpYd6bErb&dYTov<6h@z(g90v9?0>0!{73q-T&igUcd@%v|)#Y!&M)hXl1a6*5`}Zpe+|7m^#3N~HUSUElRf3Pv!u7;h3InM+L1gsd<5-WK^mPcHHqJE44f zlrj%jCXYxTF7#DpTX)Hk2W$Ycm6#+uqR5EVNv9KSM zIh-LvWCgjP|0O(~K?#9nIm~yuRIYA4R;FZ9H9~>`p#X<<#->gP$QHCz6>7Y>1{$tF zvIWl^o=f)0unSm%O{%Rogy0AZxQh~J1A~YV4*#o$0YmQj>5_CoaKdCM7gVSTFOJY< zlL&!^l>r7@a0dw6w8}V~KvZO9oZecMuyL}5`~tKT8&Fa-V16Q{oewO}qBMGCw8Wd> z3SLJNxE;k6W6|FzjgFRhlMxv651UBZnB^;C>POg?u)t|wiwT~cP>n8E4&|gu8sB%y zndh1X)btJ|t+gnl^(Zf~zr0!+6v-3aaNo#Jx#gEx``Pm2r{N@Ck^|Pg1at)IH+YX) z5<^85s*@qdJ}fRG(0e6nZDYtrbOP}Nv3!tW1|xME$&Al0EdkYVEUmCasH8R!O`!6b zmeTud{~DCe$9UQPWruW2yF$+!@PI@LN;?7a*Z2`Hp%wAWm25W0d_QGJN4cM+pG1p- zK5VG!WKC-b-jZ-v!0C%vl~JqtEz0d)s~q0P{gWjC0D)d9n&cv9QmK zT#Y0>hwGk2;l{b31eGN#;g!>Y*uEmF(O7oW}@k>$1U-UDIOHLj+|}? zPE;mpWkLioyQd^(Y`jXg93m>5jGFT@KxK$P(c;i7^xe3ku-eojlx+GyuEsqHQL1(* zvVz3Qlg%$IFV@Go^x8K?9HWc^4_~6yzOswq%X^zq_IWHc2;g7-05`b6>iX*Hx)GrB z8?HM-!^f7U5y)jFj|YKUp=AvGB7={~Z1Vsz_?C&sy*kgF1M z6S@|uER8qKK~pK9&7qWBhYCFit18$wag#76Q^+it`%|kEnH&7_a&mf!&+*ChXn<7K z&+p*&`QS)wS0Z8V!QcGqaDI6P9=P4tu&ZTPrWqfw<8FFxI5q@bTD&v={C71GItRKw z6ZmjJop%bYe~0BSYv-tJJ+VG)0TE2twY53VD!9@GA{6r!i~#?+vb8BhPK9{Tl;#I7 zqE<$T%{t=ZM6D^Uo);9Dsz_jjt-p)O^7PHK?UQKr))G~&7n|P361oWG(+M-`!_!n7 z`kMH6JclHx~UJte=z57NA zrGZ57xJI?#X-|fN-dO9l_a&*{$mEGY*w3##mA&Id5s60T zPV5ODne|>;naCI~ltDt(MlHtN;THD?_H=ZTT@gnZeflSsZCG1W_(>jrUg?e)`fp5^ z@?)we5D_e`vxzaQx~o&=w_!98+En$&2e+OKS}mJFWlEI>HLKFF3hiOa+QPDG(C94n3-2fTVE>u&kAjC!$1km!+CRIQeX{W%L^XAT+IrHO>xKKzt z^DQKE&B{2!?9mT+8?Ve}iAw#;Iq&-}{Z?w^!u)t)V`IU4*%Qt+N*D?~P6csrY*uMn z0uX*)AqAmlYg4&$(y~1ej7YT;T?k^Q(Z2zhm6Uw2;fMI}mTkZd+b14_eB)W~BwiqCAbKiz`BML@l^$Fb z%-^DID768Ty)V4|{kGEgR0U;vsj^_F&>S8*0r($u0)20GtV5kRZRK!K(iCk>XfOz` z9V+YxI0h`@VosuDt;*BXqwLj_%ybxhs%`MHa9_rlSMYD@0uGIeq$1^ni8(duqBtBsbP-25I0+UCKfqKeUGRVPCBypZTNtWl72@%Gu zFu9_Byb?lZyXNh7-RzfzyDVhIu0gg zoe+ZB9YzC?dki_doV{S?EA7FSkS!`8Kbq1!qJ#!!5nJ7I_c*_TIl~D-G=a8_Qm-%u z_vuvM`RD&B@`jTYKL=TkKM1o!n;9E$!+6>l(e&G305IVAvccH|&zP{>Z9;+1tN4lX z0rCu>P1MEuBLIy^1J*Ea^G5_8Yfm?iY&|Aa=H}b~n$@QsVFsKMFuBa%v+~~ZMg>Jv z_j(hPej@<$)PFp)ai+r+#~Y5S&>2Z%K?k3R3(?t0(GU`%M}P$^xDl!z6xJnLQpj2^jc%;W>ln5}Hp4f+YYm^1oy98(B6tKtVde1;4v{XmI z&K6LlQYc`*9245z!e;I0fv7@osVMYNinLFTv`+>l=P!(DMUt5uNFjt(i5ivKz5(c< z@iz=4c4@nc97_AvGsR*C-=v2~4Vhi1O$|@D!B5UVIDh_u)H*#R0@E0t2bqdGt$gYO zccwg#cIia;Mue)&VwrfL2M96%yR9P-LFL_zn<{n-xoR)Ns#`wb(@K`Kl0j!s=sn0} zO>1G)WMvWA^fl_la#<5|(fA#%?KW!JD`YSgnOM3XtmtW&?>^g26`+NbW`1$fDL$?F@)01qX z#TJDm7~#5{tdC%IsN&R}YXr%Vu1dfQ77@3LM54e7By!b86vp|j$CCbQ?(vilri`{|ps z;3b2hJ6n!G&F^FnurREM%%`!n8Ropnp^*#=_7MKOX!inm;LAg#!w<)kGREXe6FQWH zha_Ah=zIb3*E^$SArPcGgayr#3mLQO9W%MG$&JUQC-~XX-o*7H$c%pY;d`Sc^AVE4 z1qV+axq4&|%jkmUVtKs_7{o7WN~WmPp*d_M@lhF@Jn=&7$o=imDM2MbNJGmb0CW^8 z%mbGQAp{!z8l_gGV3kILqhn-pBE9SwuSkClE7{-?{m-!K|84VZk=mO~2FaNnlGeyVe;f4gbOSq_*jEnt9hU$WD!bod3 zlc7s^I$#5Y1@mNkM)oNz65tcSPQ-_*c$3TuW(4eflvn-zfr1Qd9`-2*1KZqu%H%*q zK#3WTuz{ovY;Ht=ghCQH$iWB;@#*tG}?(5eq}zl62v){nv>b8$?FwHo9z&%T)ZTNq83RAQ6;0;-%~(HP{Zy@yT-$H+AL~!`Iw^1kqrIvn-tN zvhORhDr#ZVHicjgFC>Y+_3U>w1kA0T=)6p2fF~;Kbv&IBnnJz91b_(gVE03`dik0a z7Zd=o=@LR6{aGENd-P{9Lot_}?!Bb;tWZ0>8yYg$S}E&2C_@kgCIbyvE)!nSu|UuL z;{W>fuMKCfUiVB@6G~b4?NV^7Dw;<?_kbJJ%H>ae& zT0?K~<+arvf3H%(otto>(}X=MRk!shiIDD#{DVej)mT!ARi9R30E@hB#fBmn)WNXH zEm(MY@vrew*?z7uhBh|WfjzY@WR?0>?Z8`K43d}w{^8;u$(^Wv{ZX*b1w;K5Yi$b z#yWmc2x`PJqkRluyc^xx9PLU3(USXR6*8&>QDsr^uStR^?3)y=B>qHWuQaqpPmv4n zB7rG}h+>JRlH!Z}EC6BHw$_KfDVDvf{=HZab2no!?klubeM=B0fjZBCzIr(bfB6Gn zA{g-aJz-zmm+@xup@KirD9LE=PwyTdsm>prAHItMbleN!j4tjO@&sa$px=uvw#j@f zX?%sT19fj?YGHk$b#`(v@IbSoWOf_usrI(71A7c;GSCS%3S)etF`wVslnn#!kkFAh zBGa@o4lFqHy2^eQaBV1U!Acgixn2!M$eDHCu*DWuppARcP{&VnW1xJ^o`XM@TYAnA zMA3Iy*SyjSLV7~FEF1G3qE&LZs!~h?h2+|-6|jpSI{)-ZaCBO^(7CNA;qsLFRUaXj z7qptF&B0)fvK2H&RxgeUqsNG7hNxBEH7%T#)KUu^0O%ErdI|te+ytQz2kC7KtN_F= zx1s8WAR_UqmBW{bUB~Wm3BUaCUK$U$BChMd{4VaJHwQmE^UEJvDyR4X)1CR0+EN4u z-2UrV+5_s%a$Y@#>jPXBjT^?}$5Z$D0oi% z-7qY<;{DEKshl>uk%F5|veXh~`}AxU5?#{%Uf9`J)uWdyxcQp<00|zr`#U`duorDa z*?D{5|N8GdFFzUewnMG>0;svlUC%&GId{EKbGPX9LQU1bdPn#!)G&p~QuKBA=#V{k z?SJ58M&R&z?M+ryX0c_n*byefJutz*BLk2$F1~cF&$(omQd=1LRePY=r9~3lkVZ^O zX)h$<6(2@iKPF*skKrzpjO;L3Y`g*%t$J2AzCy<8#8^ALy1(EB;2^lZ-0-wlJD+j` z!h>7vPUH=|&!6VpfmPrT3od(>$jsrFo#hPt9>0t<4ypnYAG<7-71;LM*kV(L6;ozA#`t|n7 zCV;$BY)Slxlrqih(nZ-LJf1H)vmBjvIHx zkeY1(Q~~VLN(vm)l>E%NGQBh>o1cAH4$$Aq&)R^c6_COs%3<)hoT9(|N1z^hH`tM5 zP<1Y_nzAx1Z*7V;8brP#esH<-!tO&0^~+wsomUOwqO$b-u>oI&Og-k8tqPupbsbS6 znuL@f>*ddz%%~x|f@)7#atjIOZV|&5-A!{6Fjx2bs@dgi)wkC-$k{YIXlFSK%x&pK z$=GADAX_SBO%r!~2M1aTSl&Zj)FC>Za~45OiCNKx(iroUZbQRORrU502j;D@W5~Qk zAM}9Gt&8(g-)LrOFCl>5-O54#9qR6&D)$@M)}X0Zn8ggj%RwsvAwd=d6|g%qPE#BZ zHl<8^w7XrLmD>2s;~9@0Xp~v(d^*EgS4xcok*de@Sw{nX!#kd~<{T>wCoy=+#uhwdQ`hzYc%aYp zy>vf#VWDOL7)GD%HZA7R;6BaAi_&>=OAwMk(QVb=&U)fL7!VFF=iAFQblX(}Rcuvt z^ab%*IONT(G-vPLfnVK6Gp9fL9Nuq#xN#-%e!6j_ZB~xoy7%@}-WLjHu_XcT4jj<5 z*Yo;Z;$E)Xxc2RTv$cD4&!|S@{y+W6o2_sllW6}uaOE(<^@AKG-dM%-H{geT?;852zorR#eO!T6%AP5XMHj+hE_L(!nt{G&XbTkpmFvp~Q7VUG$J}2z6W}isMZosP= z02_>JpdxQWyiM>X60fL?`q9`xvN$wRYuZ1v7C}@z(HGfl;-j@8gRa2_<#yqgsj?N@ zX||nh#e*0zq5O;#uu9Y(^{~}_J*|53!2TLCg8R#VTqBe0i@Oa1;jjLpMpD-{*=%8S zZz66c>-pWY<8zr=b8EUm6mJd;4Fzj&acJo_Cd4A?J#6)Y^$;sH_z1!rIkQ{`=Jd>7zBMQ|E?69p1ue^cE1<54E z$~u=ChJfd@;hH~Q8|DE2Q+9?KsaxAqU8rggSD1dJzi_>Zdy8SUbRq5 zqsp8LkIJBzuaWISmA^Jw*kq@hQA3l8jao`fE6$o~FhIk;?UX-I-^fE%ef`n8xtGX` z0SZ=VC_|z5yBX26fG;&@0#n)fxH)F7tgf$j$#A@j&u6Ey14MdtZ|B!w{{H;=a5A@+ zf7@^(iIJAWpWQSP-e&c;jY+?=XAm|Au7QelMH=99sx~?G@xkJS5SQE4+&$c{>xWnc z%yTn^-b9Ehy2wJ?MJH_gZ0cm~i>O6?BQfpnK5{ zM#K`?EDvR}3{gaM*+Zm{Ko+X)^0wSog_YiuFO-V^{=b8a5H-yztf zh!dRw%vtQ$Eoj(ym47^gw7>liaZ_i!9Hcvr5P@S{50Rsh^1XU{@1FH;4nOq1P`|FY zTq#mo7j)J-q43jVtTX|{p4lTs=~s+0&`huQZ8*{Fu^)loaWjbspZtHwrzEO-uvm@2XndV?Bgm-Ye zF8}oL=NDV8i=Th|(`9qjZCdxq-fYK3!pHX!yA>&VFN~134QV`c(-joigl-V;JV)5b zVqt~t=##|&6eFAye0Xj6J=!KPt4ovZ1^9_Z-+3%OtLJpXm+tfnEF9k z+bT!jr`sK{f<{ssh@%^L#a>wfO8{Jy`?JHCX{oO*KOz`sA3y4Qq6G_LhBY4d2aJMc zF^ymd4%!e{hojQaT97Iu4z#*}U|g}QNVJ{-P7qD%o&Bex`2zWipuRh42w6YzbaM@ZTj_gqD0SbT92 zmo=dWpRBz2#HEJu^q0XgB7Fvag%<;?AWip|#mE@ghO%wY{bk{!q35!YJq#Y0Xe`pbjpK|5R?B^q^xApE*9O>`ba@_U#Oukfd6e2)o5w1~A1cy%~60})m( z<%6{_00ZX11Y=vs1TW#tF5%T^fMIlY7a=>51O`B1X8Du+Y5eR6e^#{C1gQ~_-{x5z z@b_$L5e=CN=MC&3@6R1SMMlw%4nK*`-qQsVnBZtPK$H{hR_h@vQxG1A7=HmKNaK?% zBS1t|Y`81LQVR+gp2zG_L1StoMQ!Ya)oPB6q1*RL3}YS0y%U8D)q61WRr{ul!Kr;z zm-A0#36D&Tc%#nF@*9d+m`lu?OpWo5pu?1y8)qp{ir$Xz1Ht76Y(gv%d#1H_&tlISd-o`ZJ4}so z-a^f8^sT}20>LuJ6!VI8HMONOxmyTZ>WH*qFs2PfPmXBVct}>DD^T=|3#-RJO0HI5 z{Pb`(_3&Wg`zz@{I{R)G_bcBg4n9m}hlkSn%lHj-d-tY?__MK<<15j*Pt3bAQkfIy ze#(|JL%B>X^Ygh*VnAv#7#?X(!Fb3NV&@MWmMns7h)x1cqK=_<*q?<>nuDg5!#QH!s%3Oy zfpg#oqHME+3YVE{&1Jp}7EMjY)$X^|z7VNwV6$U*8Ln=(n zG;@L4fd;xA@K2~RpA4(8G*az$Lf3AeZX8d!aH}h4H8eS+!tSosz9~{_(?VG^bpqZ6 z%A$zj8Txqp4AHd!^M^c3r6LdZSs43mk74X-RF=HeU==xRyf$2g5h;-Uk(C2%aff>@ zd=;+d8yTIT^|OI(8gB}^9CE&6Ulpn2ggw3pETnn%N3f*@lJnNq>AW>@CVY|S0#of= zV{htiyBT%&ep%BhBW1TjGnN|8(l!czdw4<+v&u?LkqjH8FRKjR!u~@d`fY=^OD)HP zriK9zoAhZ32jjRBINZWtZx<>UCjfNrN3K?Od8m571ZG^rPa=0?1eO3ljz?3m`|;?T zrupW*`)}Msd~i5{J3UOaA)5>W5|>P;i5+bd^@Y7bpU>kbI$g!3PFmoMXCPIJaHtK$ z9>lZh_;+XFXMcywvy%*8H&=3#qq%I!7?0QQjfLU^h`xf07>);hcQ|Gxgv}l%9+9T+{ zf9vt8cDcdL|ZIn8jLUyw{^m$jLsZ4`?VQ${DxLl|xjL|3sKhAct_8J>d z@W9S+OtY1CsurZ-qF~&=3+==mJ9j=I{G;*v1IcLI+z)0d$lESN62qK%K7NCsR==rz z3_sj8ToJ$VqbqIKp}|XRd5ak(z+J&M)EE z0MSG=j3&X#34xe2s17?=arn;q1BNE*y)yo~E)m*S{A46A6aVrQcUB&G&?qYlwU0JBOSEd2f4 zg}=X0119Q1?vqd7AnIZ?F;_XdjKu9w z18hX_@BUF>gc134I?rsQ!DPrgkcQ9mIc{*Itgy(Ip@G3TXpX(aMN2tj%ZW^YBvYA# zYi$qGA6nZ(OhTpn;gn#T?9Fm|Y)FPON@UTBq_r6Bsa0^QNUq|ia0X5|JsI^sdxveD z84rIN?o)ku-u(W5`?dYJ_XC`!b_iipm*qn5k`S?2m=!Sc!Dl%?*s&zFajPbSA$0s< zL76JVNSIMAQDKqG-Wiy`(J5NYV^Vt|1)>>Sv2f%ZZDD)bSiRuimhHQpi;0}!SS5FL zr4{M{2i|p#hSTJF-_}~J(rRy&m?ti&3g%B#QH@6lK5NDBI-`uCxHg%XQ1I)1g$QwD zK-UIp`Lk0s94?E0(`mHtc5DI`fKyVhds*$2eY8W>&h=F7*``AMTyt2u!Ld`n!VdLQ zl+^kGC7E+xn>RvqMN@9CFIhI#)T`7N6|lUS7gp8U{Z`Nj>Dk-!k}Oj1WziJ;n@b$P z;P`N{)dm3scglUsZDhO>Z&tw|==)Y`Egtu0AkAMrd#%eXMN&-1xGP}BCl?OfxcjZ0 zp)bwIT%2E6Sv`6B+I3Bcw5hdl#L2$(6})yN)>qOgzWMh1ouHWs=y#{(G=ZKUwv*#K5y)VN!QI0gRpG6Y4CwvNFf0p7GBbFH_j^x1}~nB@is zVWeyX8aVMWP^TmoKNRPP+|DoHmca8M&(t7%Kb0#?N8-D(#c(>~4Mz)&Tsb)99q{^n6V-go>y4!Y5tyh61R9BGAvpfU z=doHa5=;5g^9`Q~VM+jZr$;Ftwzu|!H;ZOjF8B-WJQ@tAgwA3Q!FuKVO@Or5ah|ih z`NVYMGlZs-o@;mTT)x3O9OYv-juXq1$xpf6+i`AoW+pxUu7$Ie_c>ziS8T09XG5lU z@N+~PZEkB*=6>v}mF3wA?5i@v8ZM5EqVTcw^zr;2F~tXs7kj|nlI8O(DWAt4fCp6& zO!wPaJTEgw02yF~c7Ul{yPf&-vM_jEC?;HtCAPx~=W=yj<`BX=2W&z-Vj@Sxl1xs% zutEqgm~vw7#+th6(>oL197rYQ3(9DuL=cS%kc5HtRoHivElT)-)0R5cpY)xDtcyRZ zLEKptrP6wt2;@c9R16}lb#Q0pcS|iK2NgRwE^Q+`9g+piMI<7Lr<>#UxUR&w(!!vw zxlVUT!^t7o%AgYsVp=b%YO+B+#!D=@!AcP;7S}BWW2l&Nt+~Qefe)BsWCWGC{L9h4 zWiEx5BqoY{2P{0YgsrTH$E)B?x6%lx6BZr|k3&}Y$%cFZ=^f*Q`QRgPIv7q3wJfMu z*>#2&tXNvM6bWjV1Q+L1pwxo}$kf0AqG*klxxJ9Gr5YpvfBF4ieuW3eW!LNZ+io1A zf5o3yXMId5tZn;ACks;VodEpWC%Yw%f?6DdQ0s^zQ#HYA&uItUC^G3YY}4Y_=5aQV z*wov@81O~pz`#k{K9h%}8ASn{@L<8tv)^L9>1vni#&Or?WkoDt!tQdNE1+F6;jM0M zt}=8~LZ`NV(>`@HL@3T%egn2LoMM8G%JT(DSyvNPk+^GGd3Be}e7pAxP1{yRK{%1| z&F-^vi>#7Xnllx=Ma=DN{hpSx97cT7@``&~# zkQ@LLWTMtGW98-;-j&%5FH$P*ViFRn(+}aFsg#>#Jj?U`pG-WSXOJr#oYv85UCx(T zjE=-_U#AmX(B+4y+d}v$Y$FWj%S49LxcHM78Mvg~xS*_t5R)if+vC3y>N3B#3W@ zhvupej~`sAtW7m0Wk+FkFfsgAHrzZij-P!LJZ8SjW(vdgL~;UQxW!ZLx5EC!+(dma zYi=waxVKy^y!S8^d|O`!k9qt@R#M3iE*!gZ@2$xbh;_`g^L0L1m}t29A3j)JU7MK5G57Y8?7+T#$L8(?_Y-R5V7x;P$3&$)C_ll` z#{+HAWr6-WWHrmG=Or=(Ip-M6prEi@WtIiC>DuQ|jS-OCx>hbJtyv`4r`ZhNV8Ydd z_by6r@(YbkP~!qJli0(7WH7MM^pQ>j%dG(J8xCp!a}A1>(m)sf@^_Hg?GJHNSG{(G zWxtt9PJeOy@ZO~>HHwB0tghwXxpn#T*xHfRn|n{~efUM|)V}wH5&O@6h4=sLcbac~ za^kpVQ7G(%=lG$$OYa@HSRcN6Xf^-VXE#2JtsY+=IdSWXCc5~(LWdQC^L;}Y;Si4n zu;H^PDsagx!$@`=8_x{5@puM!CR@9Ky^f%9As(d-ZDNcG>^Y2&55M!?ni)P!Z!CBh zcQ_J6@1>iiwj@9x!xy$&;l)^~s;}@ZUcenTx89Y+hmjY~^oT4;$Y*e3Rg;5NPe|st8W=*CshlLP)=#6X&!~$(ZR~GEMGb0-=_YTThaE^j$KgY+B)+$DVEq zNd$5j)Rmk)r&FXaX$^OQpO`M~*DX_1oD-E%3xUTFM{RcDqI(*_oT~48WYz4`qX`=9 z7<-t^i4|)rtA}*R6+NH~db;73sT8_4#EM3CRQU>3456t4&3Xp7uZngtGucrudJE2J z$dIY7_8|P%P7gN^pP#L;wJ&Vck6qqBO-eJge0pts|Hbws{BRq%-kdDro=ok^js$%N zPQkx^nTUDr{e-y?jN??r_4W;fj|9(O@MUHW-aUNsjODn+gPEEAcdX`F^xXN>waI&) z(bCLdE)WE}HXR}|O>-V!J5eMOZ8#sW6w+W~X@uQICMHNAg^ZT-X#sFKS48xPaBxT_ zstuHhYXga%F*Hb4*|HD`P07<9=ryRv&jzhzBdDtpF|&!S3itr@v8p5ws@{p`z=@Lz zdO7+%I#HWlUeSm+%RVoSHoGiC@WQGPBo3Qx9%2vD^er|6nn(s^*x{t9-5^Zhj0U&^ zE)RbY0_|lEcmkU8oLVcFEp+e2HSyL1bei@bFm2+M4oRC?YsK!B-{R*#WN$N z+{~WnaIT!L#V37YrLMGZ8BG0gj{C)e_pr}56pO;|iw6dxsYn~%6X@?A{C7J&X=~XD zL%t>vB+fpBZh{T^3fQRfF+;-NRo+k7Lk^IqtNXwYdqQ?~X2ebuUOnp5iFib0p&k;- z(ZQR56N9NC+7RYTT-Ka;fZaX9^InDQ$9af?J~+1B@yTjPwsT}4b8m2@jhc`uylg!fV-2zE~ya43RKyN@W*5|3ePib5XTy;rwzDo z3CV&HISE1_4Plr-6AdByJDA|06e+VAtclAU2+i7^0UZ<&C2|5n^w*REI?hp6wQWiY zXf#4bn`0;v6+pW)CeHA97SO>ipvP672D9t5Ux0i^bjOYeHiZXY?18+6G*4{kYk}uL zo^W;Qzlorz;MMgj3sNJw1(0Z}o; z@y=;`ymMO3HVX$l&L71k(1=o4@tcgr9qvpeEaiktKtnpVLLMyubT4?dH2PSXl-eh-0X&*f3I^Si2dLR&Jh7{W{dp~q85d7m>!=P+KmoP+;Wj!2 zbDgV|>uL1f($f#udp3y6o$FRy)8O8HrBQD9-(2mZsC~lL9@7G*j)zga z$Js8O+E=#MzQ6Px81&VU*bZlj-@aG+rl;~83os;{g{CC=xw|+HV1FcA2^cGEE+Peg zNLKz>TA=NvUn~0u3|nkd2d&<(nho6ySHHh&vdH~iWCka8=R`s zJ2uoaRV7q*uIqoSZw~fiFrprqbJ_!OI5O><4e6m`U7}Nk0d|`|mk<02p?W|nLm3=e z;q0;@YvP}jM@M@Z{uC(`ue7LW@=XsYob68LqnZ49YBHqO`~$#zZ-q2OW=NB8UMw79G00%BH|rsC4)yRgIXT zJ4|97!+{YoLta_yaTgatNjAv{nnW#CwwEB~P}8`Ovd&_McFsV;0j+B!Gc&V%i1|(C zO=9DncW{Fv0mL{skz=bjfk#hU_<}u$An(+CcKpXz(mEw)!g+&bw)KV7K&YG{MDfQ& z1k}S`vbyRxDosf2sB)ABi=zbSnZ?Nem(bvxqsRGbRC2bkNz7Eu_1 zw%a2acHSazL^uY}NI!(igOEamAAd*YOsw);yCk}j1HZ1w5MQP5s!x}-P9ELKfGi)EOc zPX~ymEJRZZQMDG@3sJE2wgGhB^9C}4BR`(SdR{?$(;?a31-sQl7n5NTmkv6;(1fH& zbf4VP%BY!_rqA1g=Cz=fv2T75^SQ<$_Z>k^8+~Q zUBF$i8QE}(pYl%7i*Utn}f z;{rZe@`R+@%idL;JTQNXc*1h}fbO`W9elBPSwX*V?pJ z0&2J0fFEpNaI>J#K+i!`9?&)Wir$q8YEf|4)?gdKv1HFY5V2EBA-XR++hB

    ;Iyg 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 DH|yT| literal 0 HcmV?d00001 diff --git a/dependency-check-maven/fonts/glyphicons-halflings-regular.woff b/dependency-check-maven/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..f824ac15a0ac59d8c236f346f3bd429542cdf8b9 GIT binary patch literal 41793 zcmd75_m^GOwJvxnCsocl=bYoIoO8}O=bR&17_hOyV3TaX7-LMZ!CY_F6OTQ>Ch6tEsZmU}nI7z5o5E zKN?)ALGch9N8kLfva-FwU@+sg215X88oHpWyrNQ{3&LE8nXSRHsVzB8x0b;=JcY~a zKw}Fd%LaovOlIDYvoKZHdyj3dhZqbNJ}}#A6k~yj$>pg9STQ5dHlJvNH5oKDvW8VG zq3L%R3@%giJCnDp4cZ)-Pu!{4AhBixBc(MrlG)w2{ zh4pRNLhxJ<>=9Q9Tp{L{#&CT*R**fBr-9mc7e=XY)y>flxoHrGu9)R zYR%>YK#ZhOu2rJ}-g--SJJ`l(YD@lyz|5tmz@tEJVu&k=;FN7A81s#1x6D5R2ack; zxUQgfVIE4RjaOGsw^;TQ(?v;Oq+>yeX`eg{u?*?~S%G-sQV`JLcKsK7w3`mwIDuii zOzXUuiT2r}mEf1(b=rVn9@{pTSyWAjmIjw$umS>jPGIlS9iph+?)G+G_`O&*A=U!H zs-sh4%9^X7@$>*a?@B$1cO71R8+@S&4A=qn7mD6916daW#%l14wFi#|0sbN!AeKZO zfZ*w;_GPRDcOgjTfdPxmT=3Ov_kcUJdKQQ^ZZa6k5#4IF5k66^vd|D?4hy$A&;r)j zrv=&3+2qF%uI2&Ku?NkHsd4$cqvQEvww=jd6>Y^VnCV;Yc>Pshv4B^DtV6x4_e%>y z-O?EZAS0hQuYK}Zdfi7qfVKtV6hjgL5?DiIff~66z$_K~{kso{V$(Z6DHSofDA@&;)9KUjAKQ zeb+H*UALMz_Ze-7)Id8E368FO`I0y7~lzFOG;}5>s2W?4ISV{fXup#BdYYn zi5{?l%g@cn7Bi=OjbQs39nBE^WPlsf3gG2HJBab{-UQ<%-s;Iv1vT7y%PzesDB2y0 z7cIVz9&ukvy6^-K%8mB$xqzxkXll2UYV+J-zg)w!lG-L^%qf7LJ@r_A-KPBjv~n>9 z`-TpTm*0FTSnWF-X0_82xgwzpa=BNPK2N!z7UXrypz+MI$~nlHGcS5U%+}Ivo#*cJ zOm6SDh5GRWo#4RxFM>7Kc@=U4ix+<>)?N|n9IP;|?>P<@1>(x9AU}|fa8C!(OLY@{ z_iwMgsCt5!w?)*o#LhAxiL5qYzi>(v@b0(<)dVoOaz9u!=#XJ!fJlNwrun}_NjS_b z8^Bk@YVGvd*S>l^(LdYRB9;vi0ZA$-(ab!7l{eE7u;qRm162*ziBb3oh;ER|>cdPi zcRGFWTq)hn9N`D5WCoCXsm(}jV+{d310&D}S}db4fiadJpA-pV1%2=aV+mY%l0h~f zYDteQ+J`poI<6{P=E1|a55Sp$$v2+>|KK_Hf)5@5>)LPu2N(|l`FF)HITgfB^9s{dOxMB!Fdbpg*3<#xB(`T+c5qkE=Gud642|$!tc0=WG ze>}q%5SdmFvES~Msd`~?uc`50xxc~`0bEv}G6W8UvF6osDPpqAjm?FoO0uEW+D4^s z3%xAhYu{&0^nMY{OqD&%xg5Up0p)W>E8Ubrb&i8DbWJ;hN2|&8QfsXFKMoUf>)MN~iHn=fHxP1m!X@!{cVGJLd-3J0n1D zpexTYD|IBhLN$3q^(*Di_^koVny#1fk6b}~~E?O^oPYg*;deSk{*`5x$rs%1ef2ko7IlvyO$W>Ik2 zY|yr&7}c;sMod0#+d6?9DB#9Zd8THS2w$qzG7n%hf`B~{4z6*c2#*SaR9Do9Df=6T z4q@zl=-9C~`>0mPJ-!?S_7H3fg)(I7s`HvcCQ}{C;J|AHM-Wq@ZmAv6ZveBVdWk{w z4jUZn54HDITZ5$v1cZcdxpOl`UDuwUfixY;;b+CeFzj#3A`5@qnM=w9gJHurN-rL1D1|PG|q~gH02doGLgsMH& zL03tZ4z(ZDsY)lwLrrY*zJVj{!CPk@!2nQ!o?H0)2&-Pcm}^bdC-lv2Mr)oV^F|OD^eQ#DRZ*^Ec}B zWAushcQ7HFkRWphXpj5dCoGD$Uyj1I293T^{v&qT2=w?VWG1<6X z{RK4UKG2<3%o1(N2{un^E)A`?sRAUkI?v*I$&8xs0oeAGDi7!@Lua3Y7y#*ToTINw zRg?oRK7$d{IV`gF+?$Xp3SCeS>GgGxxAJT+TUI&o5`Pajw8LmrMZJSQyKYV2zW`YrSGp zT^a+n62_?pv|W1sE#Fx)XgoOc%(=#;`_C^u3T+lNuL4@eCw#i=aGq7nf;n+m!Wd4XYUYtK0T$sjSs<#dwg8P!_2tw|^Ww zvU-8@AqODsYuEfSW=LFG2e?2*om-rB;&t2*^RE*GG=2VxW%rrq`B8)`SOK3E-gt_9SMEz^+pTip_?lC}@Rv@5N1h901MC0gQ*g^c@blpHTWxpt=nP zRh`ot5azxq3F?s;)w#v6_qXnVxioMOzyU2FI~fKo@dCw4zmP z;LYiY(br#q@|WA50qE4Nc0eyrr0dnhg%2i-8dl%r$`9qE`#^zz#sw6AUr8nMG&NJ;%Z77!<>D z03^E&aG(NJl)`n23}USk5hVir)2BtXRtXZX&p7R?)KF*TJyUFqf;ww=+n`b&Q%9rs zp{_#-1{EDzuWh3>a35s<)%+&7Yq)zU_;8)?cR-i1TdW;k}+xX0{iprk99zh*fg1$8z6z*p4${# zK`b4e<_6a3E;C=;3&}-BWjsJTvqi;1tl;~guV1e^8Y6=uMF_JA*ydtfBtgce z%6Ez|RxhxUfUTzrEHIRYxr8aceY+7G6d(=F)&I~aJG5B>L<$7pzN-c9?vWGjG1MPuy z{QHkz4C?060;{?BS!gLBw$1fe9ve_8$d=l}`&j~KegdY0(Exb5;-lTmuYB~1Dq>3} zkHBV|ZU8(%n_QX)15C*}-Nqw^MbSYzd{fP!fAt_&s;C$9+_I%8RXlW#D`N(<7^fKk z?sr)2T_%KwS8WDDiwCXwB!TmT1sBl4EX!0m+sl*=85#-uU$_16A;w402SHD$M?(9@ zcYaSF^38tsmtdu=K$X-*t}dJT7y`AC49>S;`Qe{*i#r_;@CiT=)hw_U8H1m?N7VHb z&3TMCaOMSX<%%q(B9qg$P^Q{NfVb&dge%k=YMC-sv`tYAiK$fEmN9HxZBo^WL3ZZa zT+VtXG=XoTf!D-<3}WekNI7(5{Jg{x!cb`c77EFn^iWyCr>ZRuS~=T{W5~lW<$!V! zlT6?c2-(V$40mj~h>cHW>pkMG1p~Xus_8PgfO0>y0g&H<*#^U-Z)GPY$4TCiz;J6svK%yh;UeKH=lr#3<7r4QRxo8&si8j2VkV7 z|mCfJbZH{aOay!->VB(@kVC$gywH@Xw{qF=~QZ>)09D(l7b?s8JS{;*}nG%wn#y`;%n`cXG0lHN)jFH-00_thX+MiH-2Tx$AzX${WaG2D&picc+7I*9 zM-@t|Wmgu4BeoYGgE#~M^b;2YTFeEdy9&knw zu#ZXQ)(d1b(C#ma1B5s4>sP5;nZa_2GD|qBER{>ZN8G?_N*Gsw*`to~KYbazey=_Y;>@d>pMzLUbPXT%>8oG@ z7Q2n89S|x5s0w)VZZcT*JlOb7ML!3CZ?Q^_lC1I?v$3eSZtK_-E)M+dji>VY4iRYI z$Mu9>CS&c(JE*IxDyH_FW7h+ELoAPsEr$HES{Vn5uy9C%qV*Ip2>-|lpn z4s^A4)UB(~l-r@zocV+5NkRG*Jh6pJ-#(^4u+yYZYu|ui&CIc^|Lf(~W*`_rKou-B z3&WI{B1P=5CV0S3rZf9^##o^bvr8q~l-WlQ@ESq?nFpY7uY0-N*#y1HS0qrvOk}@_ z{NOv_Dqg!vu6g<;MV9$s;_^da0_G5){pbx-L=}1M3_Ah9TutIT1jrBpJ|kpW;tkXTVZzW+^}(@ z%3~oa*5_XFD(-jlzyzQ=H?*km_n%!9qZj)}jB*~=(=p(C&es|6(X(K_RXjnsiUQQJ_PqrN zfE7DICy$GMjS*&i2(0vsRr-&`Rx0;NlmJhNHt`zJPVkAf_TS$ zM)LqvNOv<;fOZ-I_8@?1uVV&U1E>b1Icmun+FtAVUqRG@fVlJ&aL@iCa5s=OYpGSO z26dacw9_#J4qSPHw?&xqbOJLGgFNDuyXXsRvShDl@VzXsEouVR#)Y??`5YYw79r5D zJp~q^8+9dL1wl86!jk;k^LO&jGUqsF4h40aMcdFSm^hKiq2=5tD?j6_ljI=52!t;a z;iDge&4JF{3kLM4KzKPB#UR|rZVL(nsuoenQ>--xnE!Uys~%O5jLiY4fY;OCT_7FC zf%v-RB6eATuW3O0mWaJ7D-YJ>ahM(GBY&qorm`vu=J$NoGPotk)(Z@{{(w@L;5FA? z8-^HW&uQ@hqc;;&=0L5aYchNI`DP6?`tidyAK%?uP!AnQ3~g{ptBE<`4&9f_2^>6| zdG;IMlOf-5U5;R9|G*D(I+%Dt4!L|I0!+bK)+$}CawZQdPkRJf@Xz(U@*60s{GkDT ziHD+CmG+BbEdqQ}r4<*PzVS5p#Bi7^w{A#Ko24iCe8VQof{#i9sVp-;{WOnJ2Z}9@ zz5X~PprRTGwRe<$u@!s2Di;b3`4$ed=W7`0H{`$vv=ZBU| zt}hmQR$L{N@+lb!zxeJh({>hQ)!WKVq@}f{GG~H=2KjQ#+xCp(K>_Z!5!3?Wo`&tg zGQ$~HZw94i1FS&p52{LTXk6C_5=?x3k0{J=wYEN~D~xFz&+G<@Zku7<_0ylhHY+r> z7HGq@q#g6L43xSP{V|(LJrd*)&Y|+j?RhL)5MmE5@-lMk? zWB3e!)dd_mZ__zNH-DDPy`{u~X`w4srO;IR!7pGFjEisxsI00fVC4X%o?wvO`TZ`ArRN^0-MYn->T&il0Cp;KmeZ$ z)Y8NQ z>R?owK+VB7m{GtMh~We58F}RkvDiirnDZcq)vjVtZTfKEJ4_5V^N@@&kf9u0nJnXv z?x^EIfc8S>53{C23_5oo3B37A03DWR?UY*}c9mWja7R&dK`aHHBi+Zxb|S@YOjTKD zsxyqhTxxmLnR|`Unm{-2Reee(!Rvi287gz#kfm$+qHU)_`f!&z#-Lq#P=+7;AZ)F0 z#JwerN9__D%V`dzqD$A9vN(gK#8CAubLGUCNqTT07YyjPVhZt8&L6$t8Qp~K~UaDcTH!?*{OtJ6ZC2nG|_ z)8kX+U>`os@B$3Gaw^XqJU2tvtntCh3=N0{1+Sd`H3VxNm=*yZ%@rwG7XTBDG4N8g zF4j7TItDGYVHKP@VpdHLwbO&Cj!>6BFb>&Gh%!(Mb?yT!_fPPrl)phO# zG4dhIhIQv7)jybcA3nq<0y`k{iEQx6>;y5TB;ERU-kK9PZq>>)hqEeT4D0~_%dKEh zbi?=rl&TUib!aXbC6g2$qPA=?TUCjOiJd|)$e;l?pBvMD6=4rL{RPB#vZ&qIxd1+< zg+2W^g1H|Z?hGK$DA0Zg8tPx}f6`k;*v~rDdXHxk@Ih>9@7>YSpjt!{R}2NI4)O6l z(5>p?{G*tJI@;ZMR=^vStfuDl=}a|qz$ZkqoPE2<5C7x#`?HKt1OpJk`slc#^6jg) zVZ8dh%%~tGv2x5N#Wps_eQ)#N0OOH4RK{98eXp3N=zAS@7M0Lz2c2VTedy4vLzx<* z7r126#ovm>REg{_y`cYi{mB@a6Ru)tSisPQjqFyxE!D50*K1`IrNW3&|IS2r59F%M zT>Fmamwyr!{Ki{gE1;RAvp<5!QGSNX$ZmkLLB}z;etabQfryc!2~15DZ)AA$N2_j1?o0{U1C6UhO#L31OBq9Gf?+0w5Q4)Gbsy`k%S2Y$U^< z;qGTChL+U(M0J+(Lgo;_bW#PkYq{v&p;~iWvkxXB?IR|vJ<{dM4}YF03Uda~e*LYm zndetcfo}p}DBPLbUJ6qe(vR!(K@mvDLW;|Rda&43j^ukYOUlH?jkEUvj1{o@-zVRO z`1t2w?xuvsh_|(OsLevZ_<%BwsxvWB;z9i&fPwey1{-JSZ+!t(9=;!?{d^zYrQ`1} ze4joCVpL)WSetqT6W%D(J7N1!tQb@t!L*wlwO3j?E5Lx%-4thA$Y~jlMTs0Q^kv#_ z$;gyn7+ZqOKuo|T5HK;xbFly>=s~{NC+VwXP#=iP_;$4TB&UZ!18hKrY*eigV9J=@ zJ6TxKiZO5bAMd;d4zN(act~wa#Q`RtM&+D~cgS_FB98Mw4EQ1t%i?*dIfc7|D@_d#*7od2TmB7lK{i(E~@aP)xbGuYWvW*qec+j`0?$rY&mp{ z^6Dbj(SE!j7D{g-Lk?8?f~_-=9mJq>CM`1u;H}AvzN?|lP*fx8pe??i!P1c!(535H zxuT{Wi2RQ?es^76nI@KgKGpI4CuKBr{cZ;qjgEy4U4`=5y^I}j!XZPgEaPs5+jeZj zerFE~JCu)gH8{<@FoEF|eER(wda*#c%(tso?LJ?>g!90@g^eAAueA(KJIV98`SuLs z0O8XNBWn2$YZ(k1XkyFj(oW&m8{^1MI z+(10fL~tm0B+JYa*RUQl|qSW$Z`|3$wuF8z&`B=L7eD3Clw}Tgh zc+&UoHiBEMe(^dRqu{WZH!)yUpa2lF^v3I8I_Mq1GH|pYnlaKgFfp|}!V?~t_w!IE zKsnu`<-C>|LCG^zfdmyC8o1}q9{aY2A+a)Fcs+|6m`m~i=i6{Z<#oS$-L;3Z4Ml9E zxy%jTcpK{FKY$5L$uwBR`a3}{GLZ^gqqZ#Q2!@h}OHqkT7jwO+GB99UgmB}LIk#h` z_9Vtn-`y+JFS_)+^SlgV)kX9HV9o%kz(Zpyt|hWA1ll)`9L@Jf`j>Ru*UyPMsav45 z&UP-)ErJaObyakpM!<#%jN9|YnXvo8Nk_hKEi*&3p_+-blzXy-lq?s7(u*R8M7Dp zsJfM~g_PZVHa4C)3A6|jj2=Sfh^``^C!=Q7jb>RVEsgc82%cPE>yXtbTBB3m>2mIxiud#vXNGPW75Rfnu?<&zMN>O4y^w=I@M)SDp$n$K4g5Y+3HckfdP=Yn46`R9I1K1#FyX(d~5GviE0m<3M zWzp&&*!0dm0M-ebZ)F2fj&tXJ*FXgzKs_hjd*;K(Fsv!$fm2jv@9tpW?hd9Ut@f>9 zKa2uF-vajx6e%xe^kcyNc8I-fInJrUojYs-F+Wms3=9m*dg(g51+WDQ=H9v5+5i|+ zFE%9`TvbObBf#XKM}me`CP8No3F<~557@>6xdY(pFD=_33V1dkJJSk$qHGMa2W&xQ zDfEvZ_|&g-eUYyjl~&N$;Z8V!ZGfieTUQV_4+MzNxg|8^%Z7*@-K>IJ0Rt0cDU2y@ z0pi{PZiM9`;0eER%Fn(F3qv?07kHSi{l_1_BR23O?$BDjB-s;qx!Ob{)Gpd|v=*{^ z0XZUO7eulZ3z|i=l(3LWCz*p*{b0AgpoGeMci1<8NzRp~efIhhxm|aQVMmB@5JN%Bq~AQmsvA43>2YjA zfHP>k&324!(l$x$VIPA$&_9Exswx8uWi)tE*AFsl0dprXWBC95;9Eam@>*mANRa=-g(hU`ih-pD*)CEIptIbWjV%z~wlw z7zH<;fIRr(yV1OT^43p1rQQ0LTaLC%-oyyre48=8^{@A8MkW%9sV28_wW<^oCf# zr&9Cz$^dM28P)ga`({Au3Mi-=qeq3Yf#gN02CjDO3Pz1G#{zxg<9N6b~gNT8DX9Pe2a<<+|`Wf|*0_E;^ar z!JN6KW6hhD=)9gfdHNo&5U8mjZq9zB%qs@ci_Ze6_pxwTh(L{9nf9l8PCe4Kh#{Sq z*agNt&!1@IRed1fK!k8MPrz{?y0<2j8!YMk%vkz>`77WC^VC5O_|PD+mxy2%x`PH~2%aCl zb>_RnGGr4uOuYK)v5}~s-fGkX7!S{Bf5wCR?v`orTu!LoV&^7ize~@rML@MQ9X`_> z<0u}R@9da}5tr=%7uBbtogAZJ{AYZ?4W%&60B^N;`S}+x>S?r@se?=h`GQV>u095~ z#ViUs!Sl9#`UfV9V1UsA`nch_$#1+tR6ykd?H|pd?rdm3Ot0GGJnQPn>FD$Wrhd6V zw*gvf-G|~23SmV6+y0DH$q>3+4JMzDm#6eo=>U=`|9UnW4;~xRU2=y zf-`M(H1t7jO7_tWt6os8WN6o}{PE$lFht$>@${TsXg;^;+ACM+JWjO5-XbXGb?0w~ z$l;tt0NsHy99J zt>fzLl}8x(uh%ddfcaQjwrClt1(ndY6MDcs{114Z9#@%5^%V&op6$Gx@WFl1ju}e}}M#>DhqfOF?3|g!_?FXSUQbVC)1Lwp`PgXFaX9l#mK^tdo`s}N$jAG!6D|il|qP|P}8N+1h4DIdXeByu#!?44SK|i)@#; z9TpA1of|<5D*31b_5nqCOjsS~UlX;1zs!;ME#>%gyQ(>4sw7G4lq&M59{KY=8!Ct&&jC3Ng9cS2PkFseQHf(G`=nG8IMGvfi6 zI!2pAprhD?Z_>AZ6DsYXt6FA8M5$prWOy!^B^jU^gOiMufo@+0l{14_HfDRPd;?6< z5pkt^pFae7986$7!i{kgXul81%^v9{$J}8*?h)`zm=uLR%LB1s_;IHg1gNNVH}EtA zrqWB4>0XB{)ie^;VCe^a{csy|z*a8kF#2SekI>!co)gP)PPYy6>gbVe6*LUo^h^Ae zb6`lm{IZz&Jg)&TRyn{AkRhN|6*A_9DZH5&v7T=Icr}Znuy&Yk?$wq{GB~n z#cr!%GBQ2%{hz`z!-UtNYTVi!7VS&74k**<>@8I+>gvgDaA1ZhuKmF(_Q_DI9`8P@ zacDgtz&2TZ_KB_H4T~Fo-~k6R39d3#MMun?-3|IYlvU97BJ&bp8#%CNF%)nwtdc2E zuR7COOcO@)xg`vfJ3osZN8E}&GE^==Phe28i?zReY}Z=Dy)h2~1Bhz~K6t@#N=14G zmP9h3Z!#Zz0Hlg#Y8U#!`8U9UzVW3tr5QOv2b&Jc1ATmVI(T|gl=klkQ`+Zp9&m=vYU$Q(D>Kxm6U4y0IQyFz8CZ+xilLRh zjq%~NymUfcfA-En1~Dp^FQK?nzSx+)0zQc6{1$j76$@ypRSs07U@)Zp0hP6@_dq}W zb1;VbIJl(O43ns4;ry%nJh~vHD_Fg(FlMO(+TZfC=wsfkrE6d3LaT31W=I7`-La7g zD!;sRYt9J<7*P2sgEjh;pI+z|U(ngNl;QgCq3BQv*vl>#G2;Oq2vWy%U|kqWlA4W> zHQ8Wkpg%u+H=n)HH z3mHY$@D71GSx~Px#!SIHP$OtByAB-SX>Z&a(gG0z@&^G+B6QA|0AL^U!R_X{F?oll z<-q{E&ws^m#JaK|qKDnUU3w2aA%Ia4l`Neg(Y3GLv_H+1o4f*Yee~vhaS%UKfnLD3{1B~FJ@)s9>Ge_53u68nX5cg7*F%n@3cPx#MOF1$8q6J z8Ew#SJy~F-M`wP-C1xz>9)TxUaT!dpdGghWRq@X`PfZNP-~y`j+v8LcQI%d#$l zCyEt|&bOgeMEA*99l835&M9rty+9H^5al<2miGvbBEoN(dh{ zWwx`bat~`?7E-)2gdNU5x`_&!GUXVtRjsKC%X1O26K$VoF=`*76Q7%E@v7bHqp;}&*#oUoxz)k(_ zt{+uHtb^FKxgDl3b>RF<+P{j$nU7)c#p~V)2`qd;VIAEC#Pz8?^E`k9`;W_rO^to4 znf5m`R4&ZGykd$qw_j2Q#zZOr>2Mz8%Fdv)0_!@X*iXL*Nq3w8H8R}G8zJDp>e<_T z3%!)PGng;TBR7zdkK;hl9?j^Gn9=~#m!D#1cK8;hhYfs$CCDsc!<@QbcMv#@mX_Mz zxBKAaN0I7n&I-Q%qbTqJP&{aZH!{I; zK(X3CXOEjf{p;Oy8Bq7Vj)sWZM@30Ir)cKDxGkxha9S5R? zwz2udschQcGc(0$Hkf@A{@dFq$-#trla%x zqoSKyGEg+0$YGD>Yq`R2F>51B`_ukBa^tJ}$zTHwM zPCd)0cg@VYDH{a9+{put()9pmRSNEl1>AB7EYMybCxwUd^5~H)9?(;_i^7L;Q)+*) zkzp7(FuOuPz(H1tDBxaUboZGbUV5<>GCm0`lDW~q%rL63(o1~Voqqg~nE{lvh7>~- zUVhqZKZSeYDlY8(%FqA!(;w=BF$5S0U;xBG&P>TTp9bI%#D=h=x`J4}Co7?F)7%n^ z|Mcr%+=U?h2r|w|`!$Kq7U=%G$hV`PuZK8LItcLK?ih@sb}?{QBaAdZhbDr&{5MM> znC1eGhSzxZVTK}<8(RPsu+L?6Mh`&jA8G$Q3vC^A9L^pX?d5{8({wPic@(e8i9iS- z@%$q>e0H}C!404YZ+)2L%J3=gox895puFq73WbQ=^V@lH}=e}1+zuSjN;_qe2!%FW!w zW{kWh!T3x;2!z%*Vr1Ny!o=tUO;=lhb6=exx_ooA3tWfU2lqg~{%bJpr`NqW>&cyE zZ`}Ir+!&RgW4_MuEp%;=xtGlXWQ!jd7vEF9HHYr>=@Z~Vsp-X$rUX3ulC$=|e8CLB z{yopQW%u?cO;|Ux%>e6x2kb0P+PXmpTWrRPOYcCN;XjXLmMsNtZL@v{aA3UsZv9O}{rrar@M-|LeAAp_hXEL4%+%H=ZOm zhgm!U60jF!iRuf%6F16G_$WlyjOnE8W%YJ7Tk!0UpHK~Z2&3Wi&$C4^$pUzbGlL3bfOhj#GVl>+Uy_OLddOOk_S=yxR)7n> z|F-DhYrTD%vw2u15U-j!GJ@BDfUEC-sVah&$t|CLFtrGROE-b$7>a#XiGUjds(W;c zD7DpUle63U3{MOcmaKx;GaL+_FR04~jIn5D`vML;!1m)3!B4O(?X?Wx27r9!sCas6 z2jn1j@Yeks?^G}ec_(+!owL<>*boLy2OsR~-!;U1)qc7KlG~qRz4A)#xF56u0&?Gt}UDa==Ra zL-lqGri^wkl$mh|^;{1#dXX6e>?bz_LahAvPyfIO`!b-R4JsvSyn{Y}6$Ty6Bf6Sz z^bTT61s3aK234Cr!mut2%nrm={BPa^?gL^{s&)4!N0MAW{V@z}prO1kpZeq^6mR82 zr~sD&#`i=fyRe!7Rx(i8ZSnbQo4gxu?Qd)qpxEv~{!fj&rXZ z7C@a#;##3}Vljx0ortUk*HM{~cjFn=*GplwP$l0z6+GO4@#JtP`?P@j=H2S7**Se7 zscRTpdS!z1fdXrYHft49-FoeIsDA7c+(-8Yof=S*z(zth(Tl*XKSC^{!liCeVvSoB z^tf``DDM(*QzLCRAIgI@jg zfudIYl!0diWEjjKs7{Wtfc0Y!VnV2tD$FfQi~IW5u5C#NFeW;J z^>e!;p6nKpGgct~gK;6j_2=jTJ1(!BX3Hb= z1V(s4FiiGq6{*vZKseK86Eq+DmAYTmEo@V)ka~LmZ@;+ne?9ZYeU@=NrJ$Z43CsWb z+G7yR382w*$Y`;Ex7zz@e~-EWIzQ0u?l)BWK(4XB=m=u`18kWZ^p2fOaA>+r`|^KR zWDCD!MDar&gga4k#&pyXbzu>%5VY~^|(YQuieCqV!&26mkbVnhS4 zG&(k=pZ#^%GFz~qcvkygz^p7|*b@YH08;(UFW4@P9&6WrJM0MBai~nqg>5^DUI#4u zz(TY?>fgn_)9V*_<{n0mbD*5*gAo}i8)IRW@7Mwn0pi(!G!ZJb7ck<(vOxwnHmP<4 z!#3eduP$GBt1ITzz0k}+fI}~sO63VLb%vWoF#Wn6I(;FmL1{58BSEmy)Faz;D+3tE zL@V~=OQ)KxEhp25A-4c&zwzN%w-V#5w#hUb=j~GrxWKHm843ds2wDjB1fS(jQv2v| zz!ZsoI$%4(8JxxGRL>6}#se@%=CckCmQ|Z7fxad)*Pn*8V(UFplMsR%)1 zx!w91AgFvGu&f#wqqP+trTt|IsAt{`>W-)ke*b4Z7f#BBWh}%-P>hq8Sn3&#Z(%9T z$@FBg_O6q=d|A-;AUa*_^7hzbBi@JpfFrh~B_>8F`I1LE&Rd zLG&U^swF{P+*;X*p}_mvcedzaAeZ3+#%4CUMB`}A$eiy50%!Pdq z;B~g5f>%YA^;t4?1dU(5pzBa}!t@c}=9VDSt#sz1b$4tNo0ouLa$IHdq%uCk@AK`n z!E^@FS;E>Mb*laRE~rxr(=uVl7i^GwD7~&am?^rj#i^0)sXLcDFlGcuEyM2iDmO9m zqp1wk1p<6TfYW<}ouS~47a#X-uZD8$o<>Rpk;St2(J zAu~izDG~`DCEA3Sx=q!0UC;q0)TZ={&G|9A0;HlM6TIq3rBz>Tcu_ISB;Fy@GO=_hYgHiR^E^qW{l_-k5~e!S<(P6dFsSd1Nwr!KDNm<8=1*-7z*u?XQYL z3g~5fA9iej51j5b1kKbB#Y>XZ##z6ZQ3`nLv8(4!ISiUM=s5YQP z5SQC5@dh8uFvNG(Ls?E>-Dtm(FyPO^Yplsk))d~55}jHSZ!w!b_5K?e0snFG&4gIS zfsdk>wu^FAxkPYhYqz41r~TbgSOnv`b|@MfldAK%MKP7-FcUk}$3CWcrA+uTrtbL6=YSU3MmiZ%z&5p(iNZjs*j#zMiY4jB3}qNR8Ry(XW~6@;vqgCt8encr9uO`0 z%I`BiJDC%QQ8S3;X9kJ}0V5(@M0|_qA0Ovo5S=WRls?z|5pJRzRB^=4HVhh3j!EoM zPPo;^Ft^D}j^bHaZAsd{azmll1;G&fBmhv&6g69f@X5d}D1QEYYK@q*|H&cL`X#kB z(>o$pt}u$AhnOqC(t=1XCQ#1sE=!-~*xtiS#3o!^UjNrW?l|K;nB;C9Tq@PmMyf@^;= zW8v|^Rvlj8thG&07fbXwSTZ_T8~Fw>?~&$ZuB%?o^m~cL6nLH!7_dFbI%mK}t8zOt zATy1ucfc8B2VzDWLA(v%gR6={=osBZWw%6|X`>jLZp3 z^Ox!O_e`?u4jI&%7Zp^q__)v~=GJX6Ys_wf(gq9CkO8rWgov|stAw>m*h zRXl+X76x7CvjN5q$nq8JiI`^s3b<%3XdlEBxb@?&P??dDAX8`MJE%VstQsWX^9##Z z7{^iF>CoF`Jqgn&Q?0OtHO5+J9J@e0Rocf?HV5vVIeEyf0PA!CKnLZyf;kO$vZ%vV zPv}i&b@5JsorQLmhW6Sk9orc*VgO`=b`l5UAh?qt6&3f(_hAGu8|yMhhS-(P{TOU= z5sdpCc6J9}1qm7$Zf+YG<@vXlxMO9=Vh%PjWdWY1lObPJMPcoRff)$!o9h?lNJQ}- z$78870=EV+8cR!zT@?tJE2#tbl0h*un^9`LM!35bFQFqQiyt^J$J`HZz7g3mNtHDwWo<)C?1>e3*6vj94d z2n_H|JMi;Q)|}ubLg&G(Y>V6(slE@NQuTJ||4$w#v*vfzX`e`wN z&tE+02|@RcbE|RMAK7->bn~7uoyvg^05%dC>*Lto9q78LxqhdQH7{UXnIAyD2;n?M zz6a|WP|LI61*QOo!LU69<^!to;}KU5zyxd@>AmS0OrrXkq=VI2_v=64YQtP%d~ee! zlHL#XV29Z12IG1>9Kf58BMJkx@rw5M@4xX=cAO@;qHNs_N(p_&r(b@eE1D9h3t)w? zBuaN#M~)!o8&8|cCmu&I2JDn*?6El(34J7w~@xVDz`{27E-q!#U z*d9QtI>`2()9uEOe>>JNm#B|hW^R4AXw<=MFAer?X6&wmeuegZe*0-FW_S#UE&&FV zyPZ>H3?5mi;*{>Z7dhN<^*fm|WqLXftJ>X?e%pX(M+}7y<%MBo{N%nIwf5=n;~E>e zF87O6&flHD05U_ixG zM$7j5ELp+T+x80@q1xC6urBNwj|;zG#*IYK4yYFlH0FSM_n0E18b|=MoeeY_q{_+6 z8alw^2(&}i9l zH0~Yr^&4|>pT2m5-oMQ{UvPhqm! zDF(}+Ol5!nH&Ez#?H9Df2wv!v7S8nBJK_8J$!I9tCtxc4mHktXwZal86J8K>Tz~Om zeQQ)ba|DK!S^I!71lM&rw=xrzdzIW z(!Kl^P2lb^!tem4BEZ>~0lSevI`Z7zU^W@Wtk6uZ z5^V%?O$`DETIh0~U~Xlb+Y2dTS_0Ym6{3_wg!-Ji&t8VY)!i7(6@rl(_*~Ucl6e#0 z!e;?V^gR#=I{V%Al3_^y7O*~0ra89-C~;z1Rp8Yh&S<|bQe#W!u*IqpWj>{JgX!qy zhZ!JxmhtIfJ>-vs4?+}H@u64mI(O0;643r&Lq#n#uE1z8e|*or2u_Eo2Es1uyEazN z2m|)6JfjVZ4Nxxj-;g1A4QL{RE1E(tlXN_**{URE} zW=MhdjpEII88~Xc#sHng^3~&F+!c{50^A7t_*t*)og*mRvyJv0C@8+5Gryvlu?DU_ z2R5`PgB;ZcR7kY{{Ss!hw_XaA1RF>2kqWa^cjX&fYx>X-qlW1i0Jhd^gU!qaU`YGv zqHSpH#mnF-BcSol2H+OD2E{MpsuxRB4)q5b7$jNB9GOD3WYCXcs__KOpoSXW2d z|NR4s<$H3UTKSfn76uk zpBRKYW?DpP@3rLjpADKkw1M@&9IUZ2P%g-am^TYK|9}e2SuVchQplli^?u}Zj$8-M z{RQcxZfI5>+4@*z4i_&4Y5(uUGAQ13R~YEuZo5zW!yr)YJ*O%lP9#(@flayOPcLi4 z>IbRiohr799d@_keZX3CXtiif5Jik>oY@GEwkL@&{29-~w#UTc zUA)F-jAhPEje!6kP^zL^e@2EcyK5)G9O_)>?ERU@{G`WVhi`JkHInI`WxwU9W!1hh zTm=c(x40Rj3>i=QHEJ*y+#Zyl2FLfuhB9NdQA_24$ zK1b)#%iKiSe?7v+0I)(2K+YcB9vL3}9;+T0cofD=#ssylYCqiC4+BtHQ9U7=dq*gg zED&An-+uE2wH=vm*@OJ#XEHdfg)9!QRB;lcRufQ}Br70O$uKDeixpGlN;2!hB3FPc_ND*KaKn}|F%rUMdt(lrIY=DKKf;kpo zFqjz(251_&LN^%9VKX;)amtLdhVAPw%Uw)|V#cY-!4JF=#6$tugwNb_RML6oZfH%k zCRu^C+b<-v*6cH71^(Vi2j&Mn`zc-tq=c0)i2xpLe@*oCtwjgz*Yhz90rAt#beYV# ze)6M!M@Gzkk+1L%crTj;z^V!;^kBMicX5=Rd+h~~I&w-6wV(2sIAGWU=(?QR!Va0I zP-!vXVktJA53I54^>B+oKtnrqQdfcDP~Tg<<3F?iMQGWbAd zrN_Q#Tvr``Fon$^yQs{rVqPZ87|oC0VpRuZ|TkNRc|8w8Nzxu~p-+@VU zpi$<6m*~y91~6+-rdYw_S(`woaEW8!aJ_vAQ9anxhVPMFw-KOgF#>>i=awQW;hqo1-Dy*@E7+AVSF`CFQ@S3ov@_A~wZsbJE_T^6K3K z*S-tuwL6X1?x#F?aP2`zy2(QMilXe8uKj5fb_x1m;ENB!(anW_*RZlG%yDSA^9N zq$io97y?CD6hXR^@zVt0FT&=~<7`X2LW_a;en2S^M|2&w*3{&WfUv7L$rHcR_LLCHJ zCOgIdcKFT7Z;o)^aqJ$*Xpnipn5$kdR!-7*;bj>QhzNvW3lEl|aFrD@ID+7f|6gCh z0~BhXhh<;Fzp+)*C5$jXN9p+g#VHd0@$ReGk@jUPWDrREqA@*E`%J~J7zES|bzrvI rud|qO%&t*s9p4=a>C(eVk5+BKxj-=M`2KEQ - + - dependency-check-maven - - dependency-check:help - + dependency-check-maven – dependency-check:help + - + @@ -30,7 +29,7 @@ - + Fork me on GitHub @@ -55,7 +54,7 @@

  • - + /
  • @@ -64,14 +63,13 @@ dependency-check / -
  • - dependency-check:help
  • +
  • dependency-check:help
  • -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -79,7 +77,7 @@
    -
    +
    -
    +
    -

    dependency-check:help

    +

    dependency-check:help

    Full name:

    -

    org.owasp:dependency-check-maven:1.3.0:help

    +

    org.owasp:dependency-check-maven:1.3.1:help

    Description:

    @@ -179,7 +177,7 @@ Call mvn dependency-check:help -Ddetail=true
    -

    Optional Parameters

    +

    Optional Parameters

    @@ -243,7 +241,7 @@ goals will be displayed.
    User property is: goal.
    -

    Parameter Details

    +

    Parameter Details

    detail:

    @@ -314,15 +312,14 @@ goals will be displayed.
    -

    Copyright © 2013–2015 +

    Copyright © 2013–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-maven/images/apache-maven-project-2.png b/dependency-check-maven/images/apache-maven-project-2.png index 6c096ec0c7d50ecca14e76dd49b1fcb9382c3d07..a44db6ed08630e9fc59e65ea42a1a067f781ddae 100644 GIT binary patch literal 43073 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 literal 33442 zcma%iWmKC@v~G~1r4*-l3lxV^TvMPp!Ci|x6qg_^6n8J~65L%%(IUk)1d6-6g&V$g z?zw;Oo0XL}qtEQwduF!G)BMvvz-u`vSt$S#G5}zP_yC>`0C=C>Ol`dYNB~s8b0XmB z2=GeG%+bUgVD<}R|3Aq8??L(B=YOgrBOxJj5#RsK`2T%*`USwl02m-O zpdjG^knxaE@Q|K*k@64#(U4J)5I_I(pktuDK*dDCLPi2$Ba+cj5Iz6jJOCmK1sxd! z2@`;Y{ThIbgo28Mg7S<784c472^j?y?*%^ETXceV01Qq-v5&Mwm@4AL#&ldHs!rcY zP2%V!a%)cBb30?b>7L+WSXJW9pp2}XwvMi)m9>q#ho_f!P;f|SSa@Pma>~!tw1UE-;u1({eM4hYb4zP) zU;n`1pP}iQ*}3_J#f{Ca?Va7di_5F)o7+3Yz>!dpQBhG|prWFpp}nw2K*mFTi~oWX z4e*XYOa=X;F`*NN_;=bkBGp_IVlK=Yy6y=H=M$3E0B-ttHB!^hr+KySdETh=N}4fX zxdbLixjy67Fn81B`w{dX;BzLj#De5Yq|!iK(?%}YjUEen44;N+sl{@JZ7OOKG0 z;--PQ?Q0orE6>oMCC!8LJ2wKdI@VrcsgRaG3%j?>f^xbx-r;GbtwW1@cTbCemx$>> z#zVma00GKszvAH8G!z8CYMubb<#?A5;5p@EDiKjN4DBa?-B;0Q2Ufiu)PN=Mwc(z2 zaS&P|aB@%I#qp%sajZkx+wG_}m)S3}%+_!trkHpm%l>$pDiaK$lQ16nrcFGxhw2|) zEP6fHy7q^lVHz6Y`-$%ffG*Lh97L+J?b zkwrlysJ<(1n*HS;hP-lEi#>T?I53>941Sm!Fy{~fPF-cd- z!AHLd!=+v|zM$T}zc$?G=00!fY}E6$!-}~gA@1lv6wCO%BEeDOtIfsP@dTKyzCP-h z9yGCd;ozTZOa3U@j*Y0cCsUa6-TC**_{u)KAWHvH1W}DfbtuOO4pPO~x(3R}AP~6L z{B6|GWC1VtQlDOz;wpAbSK;a5S1Mgr122>xz$=D(pT7>S-O0P$bujnDE@wSM%upM( zWv{w~iBWuIm7pGI-7&0ybSSCL603oEo&X#4GZ*l}ppJX-%Pzb}@8q(#wKw%ofJ%A) zn159rR@9;$Yrra<N)m^7|7&3bzC?-l-X0kQs42|Lb&YNR9BBbk6xR?VCS4v(3q( z-+kz4c>*B)H)dw;FTUJ+pVkhJ&~M1!l01`YI;(~iLZNadAlbG3Sh=-~nEQC$hQ5tt zJ-iE*Ts!|+0PYE*+?*{6pI~a}*2vIY*W{e-$}Mi_QVjz z{dpTv2yJT9m2Qphua!gyD(+1-VoF|8$;I64t(^IHxgE9Pj{srYk6jO94C&9D@H06l z!Ft}mJPO|PP3bxRZ2Ac>;Qj=FI3l>1FJ%2F7T;@a_1klcZcCm#ZTlcT}Gz}2*EgP0V`_`phpC+)ANZgQJ>xS#q9e;Nm&sKJSpPk_WNWY4maA z{1P2k3nV^UY!2uT1)ux^?_8eIn!4M!9Qn7Cj{BFC1^Gk2k3A1}`|$u;9ZTY5LV;lX z${)V|bz@V{GeLMifccp5muhRaL!S-&1OPFlKg%<4!U4kuCMn_|Xdu<|`BXnWW(T)5 zMXWcvoYwT0>-#V6$-7Is{voQEmqb(RXS|ib(iiB9S{;os^dX14;@V4tVD*c(2ngQ+ zh%}pecNXsnpfNF27UV0_{U+ayS9m_~Fnifu`ZNYQ8NA35%OY$?6eLEop_xS0g6e00 zsSd+c;X$oOa~1KDy}W&4%gM^l-U8jUPX1J`!r zmCm3JGEK=y0i$-(&GOhq{>8c**DX$PbyztoZiBwJ4K{gM>!Tp?RDYJn6Cix&J!JVt z*g*Y4_)^q@4( zccLJrAK0*N>xQ6gGEt zxGC0hSYED^`}=%Ye-NHDdURA^_3K24>4=bg<@yugXAh456{HX-cI(*mEWIO{Epsap z9Und+i@cK!nTr_}sX|D470>~(zqYhjH*IIL{(Az%Owu8yaYA!JK$kW8-;rFquRc$r z24z=vS#If%Wu~0+#d|@BnM619Z^yC!*2%qYKmH2_%j1_oTL*oI@llPnk1I4_zhYcH zCAs&(wNWmolcTKc@sJ5BMXb_|$Nix-pEwTKP6K{X)YhV)BZH`(Rp7x5`u^412P(2Zv;4x{_5mg+ygb-JR z(1YjH_X)PI-jNrb=7`-`8XLps|Jy3{wcPA-?D)3mD=v{`)S;)opZ$P62vJZ?@wN*s zr(16BfwQTXU35*w=Rc=PJhQH?DcCDZGXGvrI3xs!( zY$J;504LFYSpbgOt$`Cpr#E+T&%5Lt?+VQK%d3L{eSe*bNB_kR#MU!>kC4R&|I;he z3t#Tr*}0iV9;00Z87fetFK!RmrTelLalofKT@`RBXzbn}ynFl#_j(nvodLJ^nUBY^ zzW_wpu2$}`GH-wtl?I>IS6Wv>(C^RTAH5UPueT3)fd>^=(3q+>I48JMciM2oapbvy z?FX~VM0bX|yXD8Zc7EVW{^Q2wpgZnZ5id1in`1U4fwn`M zm-bO3^!li2wHy9Oear@TD6BH}xeeWY0+=h+XYc+gTYd>#HoLAYTkV5CP**zDNH!%nyT`rnh<; z_xp$*gpNcL%4(!7t1$2hmyJ|7_*d1R8+K!qQDsHXT7w9wqNT=ej?bFjd|o(ufP#$* z8z0|^v5S}aT)A5kX`vE`{)iWrFsB=t%_0wF+B6|N?Y_c;2|(?jMS9kh#H(;3OAR(f zL5bJ8Nux-6N*hY%j|11#&Ji{nu)HULQ%CCWl3-$Ewck~rB8)V@2$C}2%db!bF*(lJoqJ>G*%Qf(9P#+tl)9+GM<=^nMc7^?3N>XU6t_9uW_6-+5nokRGzZEIIpk$7Fc$EGIZ^)%pRwCU1&oYdUU4iuwrt@X`go6kKAH0rV)nm4r{+xfbt!t75qK?k#rHLOAn8`# zxN#}pdGXvfr3zBV6kb@!EC4tbTRlH=dHLy@GmtIo?M&&WsO zd*~ajK9*SEIq3X#>rY<(Lcb?XOINdyC0`<4=C!ElOC8Q4e zbmLp_%oJHjSe2;?ltK)@yQxFOD6TEs*8(w`kNP(LDodQ3G@t z6Y8^Od%GqPy-bLs5XVc4gfS8(2}iTA`-y)O(sZb3r6V$^2}(b_?xH(=bE~uLhh)vT z8>G=6Io|+$zW)*JAc6J3fFrmYqZ)d0~-*U>h<|1+C{G-Sss~R z{hsc12~>~0i-r2|@yI5=GCu2#qy~?|bx|a2<{wwlo#0f4tK2aj$fAb7bE=^d3^pOD^^~{h19S4y zOi?NHsqu7Ln6&qN$N`y@hXdCZD+EbwtY^qpuLy79@)B2BWem4*7ao3Y1Lx`s2EO%o z1hj3Ud=JqFhUH6Bj*m@R>E8}BluV8VDZ3WyxyW??aC$Bkt&AcVxgtmyncvFBTDxEU zyfdsx50KuP3-7m7gI`$nT+LlYmv^~8e1;qP8k||$`{*p)R3*KEEi6pWPkdkg>1}Ou zH&(^sQhz#rc<^d>nXtY_;XeE8X1*6>gLH4iO;CNR(C8ZqUDkm729#IZp)WDmh-gZ)m2T;`H&62y)dLQ*CHxCBM(gjfJ+3sdO&pA(o&fK6q{yqCJToU!M-Cqx zR!1ei!BXW6s&ph12PUTl+1#ZtPrXPtT;#d&dzW_)dn_9CKDRdFOO15Pby1|@R?lt! zx^*?>1NN^3WRqVvY5F)H@8QOh=hu5A561{~fV-+bXehfj_Wv1^jZ;^M;4zeD2`wI+ zTQgVi6;!q?jFiRJlEs(7xK@&FvTJl`OtEK()+}sBf;*6Q-(K84)N|f4gEAi`ypR3S z5Vjkr@mjZ?=szgAkejh>8$sEb5K1lGkV7eDZY#b|$r8VULKtCv7(wsl-Y#a^`=}L| zNWG*(<8>VRjIEpvbx&cb-?$(vknYaEl5gPb9`*#_^doXzaW!t*HaKqQof>lO8f29u z6zXzS)^s?ms;^Drp6@7Z=HhnMP*FX)Q<&lTEWkwLjZqw}O`APM(kkZGba-}H;cr@Q z^##MmlE&vzY`teV-?7o}wQGv1sh{Ab(x74K?Th(GD9n{mY%6Tl`?`fA z!dMIwxJzsO9t@q&C^T9eFnDK9pE32vKut+nYK{MKvTy!?2Cv(-PNX+ON7^P~&l4a5 z@&%#m-aH(1KkVG3p2gJNDSh#==)Zo|v)JNI78SQZTF&dvy#!Sg2^nyp-~kzMlSkzi zkE}y#jm!-pMZnI&pZ%!jBKJA7>lStn%Zm+we|G`QK;i9*3}7O)^;OJ0ZKjwWEE6R9 zYY7VNxbEy3u`k)#%a1{d98|F=JrQVal^aT1$Vy;I?w?W-VAt?F;Urc&hP`Zjg9cL>V+Xicdh64+604+1?lPwmCJGK`1BniHv^gPTivIwO?JL;rjZF-L3%t{H;C6 zZ{o!@ab)u5Fmv73a`av36k1?9YuVkir5Rf(88S*bc z9KMsVTVAwu1X^&G$YlH$zrgbkcQbAvMtpAYI7W}${8DMaF*egs~5ING_9pGVk#MwHB44HxE5w0xvtvg1vS; zAJrz3WuZsKLDpv0zKRw0_1eSh`q{4+`uo(`bs%zCRF)yQ*{=e-lCr5h&=wX~$c3ub zjno_&_TdW$_8m1s5~Xdn_AjOF+{)i5B)NV(VloYGpPEwX1BH|Zdlv9SP#l7|xyD|6 z(te!Mf=aeZ6U{U>1WRLSRR1o%{VLk|*=c9Pfg}0}K)`D`*pB;Y`>NRe$ZpJ1jiQpo z_20=n=Uk=-fvHUtJGsXZe{s>DvCO46tZoYRhf0xahW!VL`k)s00zA1MVUT~L$Mwi#hA zs(BQf&6w7bcd^9v82`l-5^|Q$l&iVnvC=|Ysty&))?J?)Dxz!lLVBN=fg#k;J9LxuSkTl%kuN|3bu%%Wd#gC)UERV zP4>i`F@%HWuJn>Vzs?7ctpqKg25fUMhHAk&>a(i*iB_SA8YY^-BP;I&J7dJEpf{yi zQae*A$Fatf$nRxzxDAP%)zDD?d`v|4ne7;+eAuQD=`_$>mmc;4?8*29Fg<6ODi`rT zz3vn&+ipPXDOw8S8^|1;g+{pBI}9&sKeh#|{9MebP)wH)V4Y5-a5GmR`d|}Zlomu& zT9ihDOu|71F1ByXwQj>O@xbFYPx=mcOv6?1($a>g``UcOD?#`7`_1Fu1ge^FazDC+HQo?~(?Ax-5}kiK8p5bIOq^ z>ukT*b5aVxu2bUquy2%XtM3|l%Xb>sZdP$~-rC7*x_hc8(bB|DVtH&(2m`BOzB=Et zd8n`89MfWF_V)Hk=Aw)&EVEf8^xBHn6;Z$B;hfG1gzM8LF9 zHOTwpZD-02tl^r?NdD;MwUx5NB2Ik+5v+@ypsIhQa0%bk`t0?T|Eur--2q4vvqT|d zPCOFnhX%{6zrItG^LENIc77F^rv_+tAV zG8(!3H+kPvTbL$zWcY0s6hhNODmZmgHM7#ulcA7kh!vMN%iE;A*CotZkCW-7R~HLg zn(X7j`ElFgjGCRF)ndjfoUf6e0NlKz8&8052cm`g0##+Cvso!tzSr}t zH@PxgCn_=qX8|?R#3DTb(4)otfK>>Cb33p9xp4*_F+l<6R?nrfU3jxrOinw}BSJL} zx}rXJp$Nx~A$oUL$;jJ5ySQ>ls7n8w#m*M=u*givl)sBb0*8R=Y~Ia0$|g{hYavu` z1KHWGQ5a}8Kj%I5H%9k(IrNK`K7RCPqrH2F@dJ$EBIbfcQ7f70)sU+#9FTxHAd0X7 zeTRntGo+V{Znot-eFCSh^hhKx$YZmAx#>Ou4E?nbNVC!82rlAH;eA~@$B4E(9;B!* zUHqFI?}QMY>Zi~W-B`ywB-%d#7@n;HvT~EXyK;?BfPeu`gtjg%da1HM*XmRl-C7f% zrZP9uyNhH3xqAZqkywt%S(Egxmf}arb+Nm+I{B+MnowHEZ^uT#p=FdZJkoq%|AInp zj7P)V*KB-pa!P`fby8-i^u-^P1>e8BmNw|2dzjorv<%}ucf3$uwkh`(c~B>&MQdC@ z>AMsQy73npsPT#bK*Cfsv46yIRM`-45ERimN20>UtC?=Rsd$3wMs0>R~i`HXY+NmIm9c!Vf%;U#1x*INc?($IfkdnS{o~21B0!#D?JKCZ~Fwu z_lw!Pu|j2@{?kn2yjA?AqF}nhOyJ-p&v;wQ26kJ8jn3FjN?CG+9@pX2@}Al-bAXAsA#-5Zen z&&rg>FvxZ(4dR_y(GjiwBf%Qrn_a#0m9(QQAs>&hB#il$@X^On@(;;rowfBmNAVn2 zYD)(h`(HPkS~h)?Rnbb^ew}ju!;A|2m_@U9``TyQ$kuO-+ASK?+`3Q*ZG@XT;uJJC zw}V5E_o)YPL)LkIW(jjjHHy&;5gk!#6>T5C+_GfIfW?|qzxi1i+Sg1wpsB^itBXnU zxmLYLO^rYPO}MVMPO5rDMN~}9(da?uumSWiJ&mU?bA}8%1SwVffvy9I4qvD_)+N9@ zbD$+7WT-uUHXXlP=@LM8G zATt=B19S+bQPuG21GHF4#Ix1SvgNUj(!qnT)bG1sN5me)K{r)xsV>*ALBxNtoEON=9`EpYMC>wq!4y7r$^7}2tNzf^P7DKbF?9C3q`jHi@H zQ1GPc{hY75iIskjK+nNE{XqYCs-aB2-OLx8TM=3@{=9m>_v?yF$kl!mY6)_m{(b!#4ti0axo(E6Gb z1b6aVztcI5Hjn0wbBKy|hsLlvavAFO0%6{Ry6;9LJar+3Kk=5L7JHRH(2Se81+REH zS_l-+Q@b7spq;5OM|iToHGfcE`b;M`?IYvXJ3rhn(}QJT_yicdGThvk8|_&f_YL+S zU=v~0i_fwlBQuyBrH(Gl?VT8Vl?o{`5VxX{vo;0mQ1QOhaWc1Tg1xA<$z3bhd)IeEfqg1d8e6>WYk75aaYL7mFW4omO09OR);%Gr9|N|~zRERUAN{y)AD~HBTq)lD z9ZfrSzPfwsS~}=cxKACgXSr^#Xv%6Ov~TO4H43K>DeB%>9nhTAa%g3BH?aOF9(P(@ zB$pN+LA%a{ix;(uqS0|*Cc0_gJYc6k`ADxDPGM25O=ScWo3OF-+9OG@$Mkd`$Y!uDh3ftXXT?*H7n8?(LZ9CulsiRi|FmV2h z7EXRE#`6wamG4VDHzVyoPqlb>*z64%9OqQj>D=7x@U{1IbVKnuS)C{)R$85HJHqeG z+FLAi#K#LU(UQ7p)NaG0xp$cNyW%M+0~c1qKTH2?3q| zmBd$8(#D05tLYdRysYzLIO(Gs!E3j|xb&8`Z=RRN*{~7jNs^Jw1qOvsOcvbTUVNL+ zgw=dC!fDfkIO~KrH^H|LUb=%Zqu`VYX<7LsFD&(x=qAlgi?|6#Y7Q5BayPU@IR`2n zj}o9OdPSo=>16uc-@Z%yhHUo?Ubqu%R!Ltaz3PVvWw(N9Aza$JpFykDjT_{p!iH;E z+_I%6`q9gMnt5s<-8aT1x}nS0OF4lyGDtwxIY$q-YQgCCPFiKi{f@_hXG_WCGc(IJ_IXWWDHrd+NWHI3|6IZja+_-BgR!{^&xRL?kf zrc;9uw#zZj)Hj%VD(<>o7f~vlzBP~Mjcl1S&|f*8j*~Sto+i5Jb1KvBZ=zRisZlu+a!CUN)VR@TSrcQ_nnAiGI!5jl z*!x93nYWGce>WFD^q21I27J0ez4fO4;GMEWc|7a(+HH1uQ6y#F;D?h?I&LPctTfHPke_*6dnh9SmnQPc~r3<{~Zv=2>S~ zfAO9x*MoN5?Q@;=SX~8kebofjILUv%zncgjl78nKMQO&P>olg&P`ewi(U@p&gg8WN zktda>Pa4t^IMhRO&(NCJXViT%4@6ozJ2f6MU_zP=`zJcSPk?$GD;vuIZ@x61o#pbv z*akLL31LCYqAw^V@8|9i?8XEu4&Q^zuJS~M=B{p_XKRwrKAu-^-lS&kElD|aAslc4 zN1(L@VOPR8f>!^$A4gT%koyu(=m|^bqxwJ$c@o1(k8;1j!-Y?Pb{cZBg)(XguCDUQ zv=S91QXrdfgOv3e#KXfPZo|Ue!-Dl_WJsQivxOnvcRvsRKu;@MYHpL`>p|zAK|8Xj zbS<642=vAk$^`40hMTK^isGOjHVyUT^*wUgsxbe7kCT!b*P-ugA;VX=>?eRZJ zhmO%A=P`@mh{n3~1T%-nHo4}5N*`~<0d|{Tv`!(@k5r?k9cW| zS~-!4A1Q58TQ#FT#}qq^pHKsU^!!!xo-q>Rsk526@YGIeWe1#^?;~mlpxnCJd+!i> z6*2Cw?eRZSOIge`;;~4|<0WO@TJ!wO*QDY4Sk2=@Zf&aUBH$Sq38xa^+=o2C% z60`#5!h&_o>J7L!P$r;B_&Y3h!j|v-u>R~Z1{say1CL)1qWG)UCvvz>ky)U5xUnowL26QxOk85Wxnr@#^U8*T}SF! z^Yfwdi?T_fHeSma_hj1-dGHpeooi*329SJ-EzWg4DL!?2f>$6iAc>Du6yB-37 z&#nD66y+J(zr1|iwGZbhoCM`BCA|gT_0uWc}3mJLxnrdG3yZijs zoU*TbLxoZ3R52X-4@Lu$lJY-SIJA&Tf|zrARl5naWEBnR&u3({czA*2O7}T?kTf>a zhk2KQ=D;N-uUjr?nJ;*A>}K7E_!Jj^6>j^QCJ3IMB=?V#f5&5ZDW=8IOxRkceWALm z{=%4U?=d6*+VIBCQdiVnkjz&7F-uW6^5U|0IV;UuDiB+R!VOES|J=7Z^QhYE+srYM z2S=ym=HG3~tl@?MRMr8$gx3bPpN9YCzneM*ob5j7`fNGqURj#8FPTDbgRkWI3urt8 z-mThhNlFmimN48glsX@;Y_YZ8ad^(yM^Ykl z-^;=MF=*v!%W{9Bxu@>3ed8xaxnVji_Ad;8^6*?S)JE$Wx$EP<2B+=kHSUVkElt5> z`M4mFm;Cn7PR`Tu0r6k58j(ePC=$U{1G5k+U2B?T=Ad^ELC7kbSrXPwGA(+`V5_4> zXncJOmcNop-beviQ9|GP7BPniVg0neLjUq#w277=o%6y0sv@-wHX^G&VEj zrmr7=-48iyY)#eNj~?=Ul&E%r&wYr#x6JY<6%JFHtJTC^*ZJE8)g4rfl?#MOYu9!$ zx#JkndE0PJX(^UYJ^^qL9(mfBtct!xU93BO*I1d!rD{gGYT@&-=3$$w`xGxnzjz_} zFb~Qo`T`ee)CQ}u-_|)ENWq3=-*byqJrI$!o>gyMx|sBC@RqwrYx`ebxzEjJ_cK#8=GY^ftr^GSrYYYXUIuXp`=nyk+k{~z~Hz8_rnqg zuk+E!)gRPdS-MzW2%!xiFIKO5;vxVGzbN3_7fP2i`LBaBx1+a>jbWt(5^;HpKf`QG z-v^YQp~*U9?If|0Hcy&jyf`k)Hot-fugz*g*;hLb8+mz0#BW|>z7easqXqPOIsGaW zyxeY}_CB)g=-Bd|`WoWc+@(88SsRZvA}pTsAupW0SnzKKBBFge;wA>okcrvj@7}Ur z&3brR!ok@an>0b4$apVfY)Pr1aY=dnvm(nDx_NC}bD?ccu#A1}o92di& z!=?#xTbmyV*p1bmU&kAiA%*$jayti--1Mb;!czoV`0+y&*6(^<4(6<{o1kpb7KZwZ z6>Dkpf^DtA^bs0Xhgydkg|=|2BHzFxoHpkNVrW?Sq!2j5G7X5sBcJ=zQ{iAWO2_8K zM}DWB*$e4@*q;u*0@8M3KDM8bK#Zra-8{lG7nkvLZNd4}_y&1B|5UOn z6@uhP`utXzjIl{)7^A;R5(PjwIT=+vVBS zfie%YTl4Iws3$+>geFGQQmVe-9UrV|kB=){=TbP-Zm446%+8Z4Tce`1F>U5I-936^vsBg;s$ITM(9>SbSY=HN+CI5Fq^Z0rcfW>Ep4 zrB;AsArQzpWbC%}_Vl`L#n1m5n(g4*v%O!~ymEv``^Y~@niotzMaU^hiWQf4vNj?w zR42qm`1kCXa-uUYnqt#+hBGfQS^#76dr`bKhQV7$x+$R=;X2Ou8wm${LfUIKr(c+E zaoKZ+BX+k5V-qIHaS3&NvV^G8j0LdnO>nYhEH(vjHAUufW72U?h|&tEjm>$Y0wl!oi9WihF<1{|bZYjzm?URwoCXr}gK zFi9w=mby-V74=2&%q*j{G&=g*T{bK$Ci!jDzM>{H&&C{*;^aX2>!aJ*MDJE-mYkrz z6gsAwnu_3nGO=b+P@LbYnUQPUml=oinjBRCRl)RBOe|_b_S@~L=(~m8np#gEHYtt$ zIwB!8I|tTF#(X(R=q=k=SRfD$Fw!t%(pnUV6I;N;{uzfzJ$|ZQESGh8fA00oOX3ET zaHYZO3jVEc;U}Y#oZ}5qH+`_A#QD24J9emXq8%%@`V3|Itnvo=+m_SUmb_WS3i|1N z&fL%l4^tar1w&q$O6Gm!C5WzLRbZ zsjJrGC}d7Yy5DuRKyIqVQ^h*oWzCFd_$GV236EOA@*!Dan;#kxy8tD6KT@E3$CD zRr1v7aUbgP!*vms5ELR%LHmq9z5u?md9ik=P6m@Z5 z5ka1J2he|Cx(^bxEoyDBE-H6gANNhqU($1QGP|mDBu;#Dz^hw~8K0L{6cxlP7Y%_} zgwFP<(4$tD54!%1Z-15S=KO>6TDCwsT!Jtlo++1_^L+L8WJfWjsLes7r;&GrQ~}3N z+Edx`OwYTFsEZd(2}uuBU!%6oCtyD%-C_>azUnq*GD~(+(IQ&MI^CCjXL&9EYQ>e( z1WBHsP9-sVLi1=wOsv27A=9{UFKYs_tZJuSay4{By*fYAfv@iP_+37Hbp4#O`#qU& zT{ANutG3ASgN}{z?|LF4oPxR!8qu0cZepfir#uOb@V`Z0Bltvjb6Tqo*)ea2c zUsF5!)S~)LIXz!yx!~w7RE#!Mdtqht&leY$Eorw?(Q>Bc4m&6W6DQX)Kq4q#sP)o+ z`hAphUm77FgHw=$2celsB&&LjL{mfMieA`wziWS6S393ZrmHJ5C)@1e$=2{4(rezh zsVG+lY_6I1qEIAfYI15>YSgkf`zWjKH_ICEX@;}k?33ozwUScP773SVvFMah|?z#tubQy1PEK(KS>X9bg&Z@j~Cp_a8p{exayZ+3(c~5 z8HGB1iAUEjV;)&n(%jXm#Et*yQ*!3-oB&dasqpv@V(9$4w|CcmYW6-3C;YmuJ?5_j zc7Jbw_-OIAV0cCZjhZDE8fLig;6TEuN6;s)rv@ToJ!8Ut+qweNUew3<(dVx)HKG}U zh^PCege-|G2l3`>V!EcXw4GkR>Z3Asn8eEb-QXKGr)=7IFP~t?^ByRWZa?|8*{;t| z8N+&~)H1x(UTl^N?+kpcNZEKGH~u;oZWbX{Wna#xgzKj~ZH&!l$Xj_T%cVshC;6npMjROTWPn!PJBdef zzcV2)cI~pp&Be&M+C9e$>FWGuVv=dou6ydL4!6oEO9d_2s)ixvGOC3^{)S8H=6PQ) z%~x^V7CIpaMJKpwjVRl|-tp$$Zr9|$Q-qRK<&R(fFxczgjsD>H>?sV^Yye7hJ;Y|m z6i+|LV886}KND*39!5%pw(;@*ETw4Bo73R$HQp3L z?K2er5LCXoN5sHZjm99;w`4_#2unWX#ZM@Y&Cg0=+;vj8WEm1Q;vSd?!Yxa0%TV26 zy7GVwee9^R1tYF2X=PUYG-(7LHxOZep_>K(RK3sC;~j?fGbddj0X_2s6@6Mzu$e|%;lHN&0SYf{}@H<{>?m57Kq zjoBtxN}HKJ%q*%f8Z*=+H?f+y`AVfzZ(0AaPH$dz)lgUgZ?{Y$>8+m9+N72Bww$YN z9mpPSm9R;^5@sOJW?h1!%Ce~v9pi^v>Crob)6Ce$1y-J%8`ID-ira5xYf_Qc5-yaj z`lC?}j&UisjuewSGeZwI6XPr<$R^#gjg0zHosF|8*#bYPSb2rT&Ts9U zc&E)_WjNh85>4a1ZD#vUj10D_#jC&TYj4$?|8+FDd<5J7Nv~>ymZv+6xtPC*L{Y!? zfd1fh=lxLUZ|fvf?*{B4d<)wR%At2_xdoo`wF+^#NYAH-tT%lmP<;-Kfu=`{P2JxA#5&?othjSm!o&Yq?Q-@C474Y>kjoD2% zi{uk2>0Y+HX#VxjsHgA6J?npLm+xOq&HJ~u;5IlIt}PsqgrmqhzS_GwfepPtnsjgt z^$b_l3)9RD&m;_A3FP5d=qF}9RxEW;xWzlPFTZz=*Dv&m*Fjx>89S=>g5u?;$3CfP z5pO$tCWdACM0Va|*gae0QlqlP-ffQ5Tj}1Cg96LD_Zeumsv--W+eRK0S`X(QF12Hh zW=YZWwZ0$grlsk-V`FKJE*P~_kEpo;REZi!#9VETOpl{6R#Tf`ly?es%BD=5w>FWI zvj<%p%70{~P8itb%blQVu{ro_zT3PNYj-%4|McuLqAW^lzLWi)Dm|r(eY33A7bHVj zmKAi53rk<1QoEWw2G3VE?sr;ux$AJ4X(wZ=+RCsIeZ!Zf^pwI1dsY0Uq-+l2Cpveq z`16BTq=tbzm~~=mVqA=2S$)=vlvRB`T+l$njqvXXQZngai8KDY-*YOX{$QNzOb^CN zUZq!4ruEeM_(gFs7dp~t-agD-Q&0D?U~A2O$STI*+SX`;+kzYr;w6RVmdYDC)Ea_ zU>jkdpBbNPAl1Qng@!cjznnk2xg9$SpBtPmsrq(bV0j+IGt&5xx_yW4s4JgRbAbX= zMK>SHYL{f$Z-?XT<5~oZo13B$af!m3APaB{a7A-mnkEYHN@G4NXlP}#;jAc%vBW7; zsJYfFtvV()_uH2m{tWRM?@@Zq-6gL`Ub4JS@OR~lT6uY7oOhOvxi5XD{(>K;WQDby z^m2Pf?hMr)bg^wPcPk^8xjo1_6^M&lwPf=H0s(!i&Qy;ixuzD zf6)b()yqjmtPYSd$J3Qfe13cC|Lknn(0EOF`P0f&c&eRMxfSD2mL+$4&XH6nIQ zTH}=qQ(GOjP<@`YMNu(s!DGjSj3CsvXem8Kak#^gJo1`Lv@9ZY=+jw%%|yx6+whN! z#S&rMv(Y?MHErp@4w4o7{RAbZ!!dhXFP1=&Yo8Q_xa^6hKovYaJ!z0GKCg%K$mIAg zvbmAJvHK5#ao1~uL*Ed>8j#}Ud^l;aMIKfNz7mdhF!#0Ne;ppHo7T4Ok;B*2Y$*on2MQdWe{XNJ|Q z@JGTQ`o89tn#+4|QR@bk?f0v3^6X1Zlt+J+=PlKzXO6<&oJx%GU$Qq@tIZ(F`J3c4 zjVzv6mVzMcoEa0G&L4;i-)e<{xU>^deGkFQ_4g^bt*@|c|M0TZ32D`Xu+_}-{!dR| z8PL@K_Kk@Of&n5Rpi7@Ahph#=V#;#Gd(U+ z*~8u`$hX zFgLRIsAlrc38A-hJ3U&fZUc$EYcua@7&e1eS9i*DXRUKA5`~zrm-JXUq;P$$;FrDX zG15)0i+>Z~vMZ9Vyc-)Gwis70|J z$H!qszUxObvowQJLM@`k&unHIp)}vV^s(Aya9Cd+`-|Q!WQVEp3&h^yw_)l~qQ<^> z1)B{xS9U4sk6B1XxbBg!{xa>_7+gJ?5x-N>jZQZ1b+lE~Q8X-A_6_R_yPQSxorDCv zo0OoRqMr=Jo@`hM5Hc#Jr`{og!V2k#?w!2i?~77gzwfk5QJA499J54D4V-r9?3q*R;_tNaNCcJa#`EC%{`@rl5`n{X+^~?o3e*ojmGJ+5Ce>tj-p(sv}njD6;|sHQI0o0WXjr%t$ zZJa_-Qh7si@JZa}=bMvj$q^1x_8OcUdEbVu^*7KIOY`*%wbjkwU)Snhj4WxDn1 zCBd$|d$2X7IVo7JcO+p}?6l*JE2IVX_1BuHmvKOgPPGVyj+353RLOkmdLygKCjzUm zz*oD%f@`-)qh6Lg&Bc#?omWldlKOS~7Ryg=2eVtNmG_m$Nx~=?1b6mg#Y^hpeK!25 z26khXo2RFvv%k}8RScS4tHj6|yNZ=@j1sXtA@jd?#-p?Ii)BTWIcLwmR%qAT$Hl|C zcavf62^{2KLvsrA&6h}YG&vvg4;kld9v!0i5_XlH2R{uidj}58riM7+N1M)oA`Z}u)_1R=UO_ zILsh)Ygg48KJT-r`1Y>7@u+T%gPxl1qw%X0B===dW8;?Ic{B9L3Q>^N+jqrXr_%Pd zfnc!Z`)ct3Gn;j@F>FShEZN=;+~P|}P*z2bjxJr_(Y@X*W4}0Co!yMu7L9@g$7tR7 zYU<0``X#al1ylu@1!ut{phnRUc8}eX{`$q+8fv`DbK+@7GU$6MO93tF*^l2I8eI)y z*2+7jscrQLv6r;ZFxJtzk5%(4<2f@7pEYab{2RiV)-s-cNALrc=lX1}WkD}cjmo}q zuxBPZTDQqLs-e`%crRsRQFEBBR7(3~(Sn*)fyV9^;a?95>MrB#L(5vsbz+)mAfOud zFjb3_ASBZ{2rzxj2|RooUC`;<7bF%$+iSp@p`PtI6oG;Mh$7~?+J1RlJnb6~ntBW^ z>&hmYQ(`$muV@|02y}`}8e2IQ_*TH8$}@^LtX8$fdqtwxFGx&?_UIe?NBqaX+Hp2A z{y-M+^1|jIVrOe!HOO&)>t67Qvm>E-*XZNQd;?mCI*a|}Rp9pzTY-U1xBtZqfBbl( z_f`|6RM!fuIR_5`%)GiG?rzE-#Rbsa664rHpdJ@e`}N%PQa3PpjE2zY{URgwEgP>3 zl1xKlYmidcbvjV78&eNHQFP-Rg(J4S_(h%=9V|>A1$yuUD8tqu?u0z+*@@*Eb2x+) z+kFK%40TY~5*Cc9&dcm-)>wUf4o394+yIsUBX(gh#z8BejFQ}Ih6THxJx!IE0-~OE z#9j`?KX5UB*Pbdi(%hm|Yg2YQ%_KZ{2r&mv`cBR8P)TUD5j5y@PSZ|0D$c*)Wv!&Z zA8se9yqK|@fvnW1*9P8q1IQI#@!`ZX#Hs1=&tI6teeG>`q}4|dI?(4#~bs$%@LjWTDEpeK`zy> zH6I6R#EdypqB5uiyMfCY{-_aA=jZxo9HMYU^Ha?{SpxE>3RQWx?R3<-;K1|F>N^BZ zC+`*a(+Pz;K%V!bOFNS@CHhH!CXwml(ZwbXj{Rlxk>|5~)Ho67vejfx?LZjrTy3qz zwHwZZW~hyPze*^?#h*3*oK$R?$eVXaqw-K-Tk+(3AjPK9J7=Z{6t5y8-z;i#6_pS` z#;=56;BZ6IKMedQK#IxTO+oZ7#djul>y$nPy}Xsh7l1xa%?Q=_MOB~TA9 z!deaWe?QQ=b6*$W%{LDsLIIz_gvj=8qrm}?xQ#MuU7x4$0|H@|EIwW^Jh8Z2d%C=a zEwyy*dnF|z{23*d!Ei+8Uq2O{axebNNH`M#fimSGJQ^_tTp(K#Uf26fnD#_KcxOHM z3f>M31}Iou$IE;utQ|Y5NIKPvwmlSM-qDF9vaukZWjjG4XU>D$S2`!M&X&C|ZxUKJi6e@? zuzg2)RL>DXsL>+SUy#IoChqvtPD{;gY<#@c!Exl%4j^Mx4^EV8w@h9LS9mAS9@iD; zR86L4i#9$VQ8Kw2E~_Y#Kzg%|t8fdE<%jy7Wz5~YpmR6u+P7XV7MXM%v$<|tmuW$R zU&i`rZZGjc^^zn7QoOULs9MKW4B*@BOr*_=~tw}`%XozRu2SXBYQNea}kF=BZRK;?vcI}ZKcbz z4ubeBMP}m3{#`i^fx5g(|43oU^$lS&@9$7xZ`-5Y_B^Bv;aBrII!5V%3{|2t+fU&L z7?E0Kf6SS^hpz2?VOqhN!wybb&t%pKz?3L&8k6TNHv1h{-pQLs9ZF~8P&LGZm$Y(} z*rHdc-J%DDMA;tPUwbFtqw_fQ$hYM^3dNbX;cE(^d8c?D|vP2vL8w~31#-0N5g_bMghY0V&rgOSvLT64em23PN>^isyifNKpK)1VxJu(6fs($q zbK7mFtm=hWc9ok_iqB$#Z&rK;oXfx;wy;2F>py5|B->PdzvW){G>U^LEYvPY6zM@7 zpvA#jpKBf$Bs5vmZa)`sYh~Xp<~>ePKx?IdR7w|)a%>ILz5^Epbk?2Ycaqmi zq`f{b{f8u-YmeT0jJ${b9wVyf;-bm}k-CiRO^DpHsP~s1i_S#5|MMZQI9g_39-oL( zVmkc%tgia!xS|YK(LZ5n1Z@-&xvHYA8*{}cpXwe-9ocEV5()7b+zC6{*XsS!S>h?4 zW|Bl*5v%(Ui_mO6Cng)Iv)g`s_Ps}l*6=T9p+i2Zh%iK*lTsQYAzozvCSNFsw$N^= zSEuPm(Sr!vZ{?RJ;6No&V_@P-kf%9y=%p08mt@bhdnl1^y3c{}{xz+7jEs7&J+8;? zVs!O$LC_B~)}Q##R}1S{$fAiGC>Y%dd#x938=q}sZQy}$thmZss3uTgeUE3`h4){f zQts{M`%laB3nE2qB=UW=|%2)6SG4G6Y%dZ04(gMyVlk&;580%(9vZ;W0d{O?k z^iWPpy~AVU!W3hk`iYn^oqmqoiQ|ciY1IRcKXks7r$E)$E}%31F4DbILh>{K!AHe0 zEwjtnO)B&~g};*9g&YN9!QY7qWX0Vj{5Di+wrIOBCDzXtn7C`khWZcUuc1CR@VsI= zyFpyz;FMTy5M9U|eSRl*rA{WT@Q;Laj@38@s-MsF3N*@y+Ho2@X&9?Ptu*%{^J$7N zY6M^r!n~x%m{P%OW~{Iy&C6JCG$@Ad$!T@Hd?IDiB44WAGdHf+9qvO`6G0W@f_5sah|#75$I+ zUBZ!BK^gfj5nH7W4SjB)2&u1mAwe>ZvHQjZAQVWPCM*9-!k)s!l83ZwhsLd#Jkb1r`Hrl9)OAJI_CzEzE@Kfs=mHWc|Y-W zBDM!bFLBlWuCcNv?TB*D#~yON6QW#j1;bM9EK#=fwdIO_4ZmGd3r#);J@PMH+=-Y} zU2jMA5^n^$-QsNXJuhi@q5U?iwG)6d{MaUdeoS*$uw?n{aM%ekD=^3mU7cvDt8KYo zuNtd8G0g3$XGDi6>M^LII`(`vIeCxd$VdKVH$&Cuh?h9v?Em`B2nl(n1_n%;dW@}B zcuw@{>F8V)cGpt~o5kARfBC52^&z5rOyQpWm634&XrdZgt*c|nL&WKf$g>rfe5&|! zaOiqfh~kpKSnY@|)PlGOI7*~N;ufcI^YbD#9fM0g`#wvCGSp-MlvZ5&7oa11kxdy% z*!0xhj*jqG5GG;2sm5jhr5v5}$zJ*0gRY!Zvi}B(1m=1^A(t6y0D=W<<@qIPO#WEgPcjd*};rqM3RcA5DGc}?-u z{O&=yqWj(Q8z)+K348ycv?)&{Rg88!e}3-Cuof-TPyQl;gM_|>iZ;*A2Jy^AW_^y- z$V;?TGn6)9XpvJ9S*+H$a5c}9E4T|1BA-lYRk{vpPz6;as;EhN6E1zbiit^%DAT~) zhc*$Zzjh|6BZNZ@^8B8PkRSY7=y^vJKS{Mz6-*RMJgJJ?v5|I`QC1wZ=1P`y?;rZ# zr~A2BwDSwDnoU#=xx3pl579`7@p8p&j!J=Yj)#)6n>T0ZPraT<&wZ|)n{9^;PY{pc ziPi68a~8{}*W}y5__nt}Fgkev`+t}QIwBGoOu)(1JM`g{R=Jnw)g^v%CCyL44sLw* zq$|Wp%5KNL%;6~cZUWCl)`eSqJbr$iXvYGQ)r~*xzQIeimezTk;`P&W2*er6ivJLSj>{{~te1yXKn|I@D8$EXme?G+B)ioOLm3pmWXC!l=pt|u_oOy`I z!jf09ikvs1LfH#GG0`&}-5nEe-tmY0yde1p9h}}8OZdeWNLK4b!De05Bz3io|4@$a zLd%F)SR47uvcMtkv!K3yTaijo;KHK-xHhN~Z4U6x+S(N+CA~F>_S7oJP(0gm3c1w> zeopR7MgQIKM6#7<=h$TE0-tc8d|L1-OPE7|$p`spf5^;#Gnaz-P1UG1^P`$($m6cX z4SXsQ7J2%bN$XciHaMRKG)ahaWNA&;lYwD+x{(eeRwhulA~U ztN%KmP*K*?dz{*cjvVmXH|-Wq5l zmUHkh;4?wGujRB`ay}@cd~{-DT4iJ1f6eCOv+~jq?a7}V;b?VLE3U5Y&)RALt^D+s z*Eg$_d1}QWn-=*lzL3+6hvH=kkMu2{744I|{mguGQpxeLQ!gc800ZP{G*sSu^Zc|| zTSm{wBKECrGC$S1z5RQehYk*MuiCGESKPLYE93Q<{xED7#;ici zcyl=-P1!WZ`9(a_OGD%)1YnvNv*Cn?P61z@#NLzE;lJO<#n}<@NXUmhly+blMX%Zk zXd01oBK;{Py00aYMaE(xReH`;JJk5*^=^{8YQLEk;$^E>OtE>)c*zn>yx)leQC<@a zo3vJ3Urt#ZFge?+0xP?foVF^vZY?jxSuak?TmPFpMQt!nl}$n?zAw~*BQZ1=dk$yL z(M^(%V3dnCiV;cf3;y{Z&5WfeZH`k?tENs}-5<Qdz4l=qM)Kt+bLm1(^pEpmZ7g1@mTK! zV)_vvN7c_x$Eh|UEj*i!TVEcYIp`mL5u-Jb2-T28s`AAMvE(LnglvVk$ADTYbB3ckc97FGB zl}IToVdb{Pym~m=%QZdeOD9(Fyo63D2x84_ZNmeeRB#&HtN{u7BGGPoelyH@?Lv0L>sPacieH{z{!iXya(TK)B#9X4 zC<};t#6W86ug0>eXIe);U2IH~XR%5(4HEGhckd)>)mXB62WarffIzYtIJ!@MtVO=4 zZ?s$Oi`{5)?o=r#SGI|J6Ai(jfsTeiDuikmc#cbu~TA4Ciq8hEe%y2hJ*(jdQ z<}u`w<-e`x^w*m%KeGl}M)sU>=Qu68YtzO^ILXR4B+VoUa^2x;vjmp`GgmNlY}}W7 zR?_3>6saxvxG0~ums*4&nv9t&OK9Nb|DCy80In!JE6(ch$>NjPh-63BiGNQSh0lE! z{CG(Af{q3-!NKek>q>q@1f6{tdbm)1fmU4A< zE*uytO;@#ai(2GK^vx-}|0{vUjiZ=aX zoudPeT(8S4Vj|KeCmgK8;8Z=i$>H$^$zN&80a$7Qh$Hua(T5G<#-&v+46NSqY!v8o z-InH=RN*os;@N#ALJM&C;nLa}4t8vo`rG4^a_jb1mUh`W?}4_M?fw2xSo1xSf~|R3 z(_Ddh=NFdI$z6eL16Sry%?=FfY zrGMUU{poP6QnM*9E0e`42u5-sKft8J;;gwQBl15UG2Qg0Fn&ZKVplPvC6pX6$HzH2 zR3Z6%bO#+udlJGyuPd%~{J%#vECcow_a7F}cYePx$AG?TcX# zM_}C0xeb93+epqwWODS%)yBzB?dS5(IlQV%|5F7%p*}dDz(} zs{rWc^iDf3!xUTMB5H}iU@Hy(v1$5JM6zhhdW@04SzQKr#mFw#=TA0rkKD$hS>GxY z;r2cC^7=ouUwr?R_tf-($lC^Q+xWw?o)qi3WRgQbc`f=_+F!Gc&W->cj=56_)q#3K zZ{sCQtgw`Rk!ip6nB85#@sgWdDP-DcbNLR$ zFAa%y1zM$d>xx{E%%cR?+_jpbtqy@Gfvyi}q)03#%t0~3oAYKlZwEx9)xjn0!Pdrv zL(8vu{-qyBGEKFP{cIKj5&Q#IOVKMK;g=7x8&=JLM#;pxtu)z$j9Uz!o$Or-G-IR; zsSib)llc$Ub2^ApRrvKy2ZWp z>YXxdowESd8Mi=(3-O{zLRo)t#i_`?Dx-+!{EO6{Gt&tTzJs|i#e;T*k3P{ejyJ7| z)R#)s7`wCG2hiXW$iKHT$=H9VHv8GW)s2{Lc;Jf_tyzk(8k!C@=Y$lE#mLh4qNNqW zXbOQ>IlP!p=x4Li{Kj9Z81&~jHAggqK3e7yPIfC*$>d`srnxG* z#>F*#vuv3-e@=wJ)6V!h$ga>sEq!xLx3?~dKu)f+Qk4{ir&iR=XqafVbCqFK( zQ+qEotSMAOik@&vw-!zT@#d_}Mh!7TT z26wB9N^jo-P-fRy+V1N{1>&O$t_B7FgKxk!0@C_M-Of?-qQl!w9WTq|+}^eC8QJW0 zEWzxoJW{;#(aeSS*X%b{Jp_9CGVk|4wgG%=K!+;-(qU_`qN`pqfBmzCT=(Rc6MG4T zQS#ARZy5QO9C3;=MwhR1>X_zw-p>(y0AMp!HGH%ELHWq-(N7sgm{Ny4zusDwox33p z+}B>eAGeMbiknmkbJ)<$3thG5K2;KmkpgTxi{B=joR4lR&SCOxi~Dv>J+#JMXjyXX zw6+{b}{Vum4HWkWMYV|(WotV5?|Krwp%{$}IYNH$7obU2a zw+qPCXN>X^pN?1l4HIYT8*BNXnd)EWF&wqvzuXAcUZ3`(vrc7ANgEs64b3mip_+Ke z>cjlqVbqLXfvw_)nCA9c7CGYv0K;Z@+ZQ+{={d8p!*vP1jbxQ?eC5HMtUd*&i&{<3 z4sS)MMhmON>-@;#uzz-%_cqUFl2gE7 zz37bu)jTtXE=Qh{?6BDDquH(Vn^qBd?=ID8{|BAEe<`nxJShyP)lDt(logtJl;h0e zA1rt&M(o*hHWnTRvt;HNgU3vnHq1oe;n9rrNBWLCOWdSbpDPnOQ%!Rl#6h2r*&#C9 z9 zfAEV3OXia%MOBnGry>YIXvw0K9$MO`dB3XchS(;w==2{mUeEq#P))i1rk{BC%vyDQ z`A{0zRqH`oVss3r6PNtA<;@Eipvt~$Rls)&8%p5lTg-xNG+CFOtY_dB!Fq33f{^Z`1;S7fSpL6lr&6#2!vMV zcAd;4`W6FCzIk$bJ zcfF66i8($Z&5AR)0_cNiH~PD}FI%~T;w2IC?%1wPH?f|b+^cn))?Mb`F+tyNJ>af- zyXlaVUd1Xx8)sHst|uV;xtQp0adc^VTvj6CkoatLOlOKtFNUL#(>_~swWmylfhFeN zRmZF`T`ygWTLaN&5Nn1s1_OI6^Ym^bj%DA8#J@O zW$hU$$b3)t9;AAi@=HIW^9Pp(Z^C`&(%GO?ny^UIPcuffc{GkiBQD!!PSnX1Kaszk z);n^7`Q_5{yQfCiT@QvOh3^g=mlrXyL?>RVvSvqI`;p5L=E?q|+8<0>=^%RjmHia# zT3nI1!=~BE$KHO{+kspqT(0qkC*3Y|h2KtDI$M9h&{Qf~YBzi3Y2zyWN27Ee`PJ33 zppG_ecKg7P`bnh8?byEP_IV%fCaySvCgCLK#<7XY(PlkX(-GZVp0`O{EHGNu zu$bF}s&Pzk0~6y6M%nM{X44Hc;1wJ3fMUVk!nPp%?34>xi*FidGU>b$lJ8aQnf6UG$tfi_c^p0H&z`FuhZg zk`<3S`N1+0+06ELuD|x6qSWL$TP$B%m=etsV}_Lw7+8qEDFosa-L$Jq|G}u_M0(SO zJ1+*MwDQM?H8_c^4_PwSaB^}pk1FU-7(L9$<)CY@yaRb9$c4J1 zW0p)uyE4kA-;x7;E`x$ZH6sxR+rPV6IkeOnKi!dGvfFy#{==K#e?PR(wl)wowA%XB z#x4-cQRfagCBsruZ)#~Ma&8u}!gt}El57>+4X>H0%50Z*D?H$bYo8D!Nhhk%pVgyn-0`iGbh$!bOw62fWpp7fOlnzR8)_R2mwuYhn^%F--yjuaL!P^#mQ=*L{K zT+5p)b*n2_-R3sJHn{UJi1)I`D4qzHEz<=Cw%VR`@1V-EEHwCJkIn*M+bGd`SA2AB z%|TJ0p22H=|Dc#)Rx_D;yTgec{1)=z;BfUdsX%6alk4iS%pti21!2bCDOYuDtZgqf zuV}h%$@hyfS}e7p^cpJs%Un+M$2+VKX_X}xnCpQC0*PNRxpJyeQ-4l3l(Z*CtJQ?9 z%GEg>2EJ28FS8`Pk~LlI%H?#|A*d&b=)HT{NqXi-u{Q6U+qU8W3R?x-z_j@}aZ^)5 zWkic8!Z1{}%9S=PpXGyD$%*KDMTnmUYr!K@?X~$C*pk>xcF*bn0Q>os1oZTCDim(B zU0RlR75gW)f}F?zA&=~T{4`BMhUKa&gL13~(A)0g^166HLqD5|AXyLRW&n&hODK7` zR&fqkFiJYiH0s)Ltt{gszt{WG?L}8G3hDh5Z_vk;`qTZ-`rk4O^y+Aj2`MR<9%OpO z{fMBGCwgkY1*fvj&7E3WVZRg-laE31K$kX7e`ot@MP9Z#T}Y>)=JTtCI$^<^lUF~6 zT{2y@+%{b>=GinB-&7HqZY!!QO1FBJ>^!2SH0`B(c#jnDP)#FK>F4S^;}Skx8`CIt zxP;|6^+=pcHOsnLvRbLD)^>sk`+lp;CFG6RJOdt*ea7gF0(9$Zm_65GB{i zB4!00U6$yl1rgcu@oe(e-+KPj!$8_ze&cru$Y=uLW@MaI1)F!@dbYg%xtiT*_Y zPHS&oFNWIC&dJr>{tZzc8@dqTo?-I%cu)IU`yUe#20B8T@)3H5uc{({WV$J7Dgj>M zu??P@Ms~`oO+ioVPBt2LZ8y(2>@cYrOO;;TLUVDqo@NP!S5~(0H-4~_`x)v%RtB?q zO0vpx;MM6{+k9_Fb^=P@71DiuI-81cf8+hAq`@_)C8m~AWUymOhT)dA#gn+4Zfj9$ zAq`<6_wkMs2hR^^z$g%N2`F9t>A5i1X|++7JMa#xQ~P{I5gID>I%;zHJw#1IioY;7 z#m+|AA^Vwj5pD{2O#VtPG^Pq1ixtKVS-*=h&C_Q0 z?9uPqqY^S?B6ofqCmk1Kz$s4Bqe#@h+I4?l|Bi1g6aCU*>1t%$_bpw|W-X~-r!KSW zRh5`2qadFVkBttGnS!jEimVLz(SsB#InBAbBj8H<@?y)W-j)wD>PxN#UXaWoDISiC zs>7sL+i&Np>4f^_^a_g^8#k>gS5yThC5I|J7H0&~;I!Xi8Owl{(t~uXY{8zp$?qT9 z>$qu#&2Da|t&Z-Pyc16+Z!IqY-62FC5W8dSjSRd;ydZuUnR-c9eZ}he! z!oY4h_m==OlL$f=z}z@uXu@ww8Y2Ejw7+<4kG$cn9jj@istTJ1FYH-Knjm0|-p!6! z#YR})1@zoL89jwYv*6`t66K%ZlE>bJ$1dFI<}`jPBCiT^fDV7(Ug!>TVLF8!3u)}b zsq~}2GQ9-+h`pjp8`_yS@51@FCen8Zi#0SQfx+dz?~&L4(o|2DI8Cqcwd+r5_#Bm^TW1p~ux|4% zx@v&vw4Q3Mv}8xTfagE_0Xr{9oep86=HUx*I}x)S_-aJt7TChvK# z0xT~>GbQ}qjh99rBo1yKquQK6)Dn7nn&3W3wuPb$;}0`Q-fRxh%X1Sty3)*))gq^R zg$`{hNeK?L95uT#Tn{q7%e_#L`1@+;()3rKGtaj!lIO!FvaJQ>sebwW+7T&VT-Tq? zGW5zB2qk@!otj1}ap!HZ6UxN_}pa;%7diO_Mi7)r*kA0tHeonb+_L$Vmc;)niZ4 z^6$8%$OofK52aPO=z*YB`aE-PyO82=i3%~GK~qk&@=lghJi*z*OMb&_sD2T~Agj_I zQXm2#>RD2xV7HvtF2MZUZ6JS~|MDr(3p?*g(R}P%BC)H6j5n2|3Tmjg0$l7OHf6<1 zv_QC^O4-U*A{ubm(|^o|4>$T$(~528jZDRDMW}E0LrJq;EeuM5I$;i4hfOO!I_>3K z3e3JF*0Nktt;BHaK^$PQ{O#$KkbhJK^+L2=+s2`e?-qjeQx`R_oC5&>pWh{}<51;A z>7w2Xk}=zT)4=GamOV_3#V)VgqWkHh{YR_@>z7m@yAjG*re5ObJGrADXwjclHcIU0 zH^_djLLiGgU|2&#J1ZHX5Bu=bNJs|hHg2H|^re6Oz+$|}tbTIOY$5m*cI3JD?g!mHKj^r#=|0w}13Nt|HH-l!;;2B&)?cacgSpIGBlHnHb zF}8KN9xeq3p_!adefX*lKWXrN>EAfmJa(8yq?`X;U|&Y4!>$ZfZ92hGq?iXU6c;Rf zaXNw83`Sc}Rw2t09oZQnOwLCQSccxR~0Su|YLqZE`=>Zo3?=zT%5uj-Y%z~qZF z;aeX&8*ac_RJGv|Ni2aDq^ZLzt-zurH&5F!%{;KbjvLAW=eo`o$F(>Gph(^$^A&oQ$*Cg3li$19r*6XJoKK9%xP<9wLNzD(Bw?`+!Jf(gE=Wvz98wabKD=_7|D*g zAhC(Xgh;fr;x{fxl+3{3rQ6k@5FmYru&D*jg#Q7)f$B|)}7BB%!yKK|gGIO{; z2Mxey$ftnV7MgGK={eibhSYSxe{@8L* z7}Sd}jcqQ&uwx@9myi5#8JlWd8COp6aNg2j@MLGJE%FFx)~2-ECe?`V0kUX)6M2(gTI#6-oseI|w&nV~qoV_m*nFcl)dj1W?!goq#D>_Tb+2gRSFDBDDZX5)V;- zur1AV&!nUw?uq!P7bMrdkBDZL5ZIHC4A(m?X7PCdA=g}olEx0MOrj=B=Qh!;(+Ic* zZ2shMTn2Tt6|b~Sx#U4-;0swiP;G^GoV5Z=tZBp7CcbjqKMPoRaZqHQ;pty+UT6u^ zzaY6&mJZ^rt3_imY%es>zo($o1HK;!0-P<#o%a^@>wLaV(iWnTIEQH$@a~sQ`?KRs z$Tjya_{J6&G>3BOH=fz|R_k&y6eRAh1014#Fjj*%iuK<-=bnz^LuH=8mcApHhRdK| z9fV3a2xZcVCVY4yJYkpse8~<9YGGQuMxZ~1cHmke8%XF+&{zB(HWEv@JX?j|IAcB8 zI^H_ngy?5#gte}t^6-o4&}-5bAoXwGfgAgRQH9#$m#JG9RrwMz&~p$U8st3AG`F_| zw|tAAK7x`Q0xjl&#?Cag^Uy|oLtsOOX+Xgt;!N5Mh!cBE4&Ms6Aj!3mmh{>9j`f39 zs^RE4@PFvH`tj?tzz0uTKhp74x1t%Dj(u^0*bM1@3<&MGhl92Qx!l#jwO)`gHNcC; z;aUW8C~q;ybGr7kBw=o<6*PRf83_Dqa|QeP6XAejfPlUr$!j?v96_>e1K?2HeS{?Z zz{a8+*d^2#I5jXq3CjLu914a;*wYmiX#piRh>bB>Y@^Y*2Bq@&8PJq&#AXqdh>-_% zy^!4n`d_RCt|-l4kN~pK@e>v-$_SPDOc;I2dH##xa0Oif=CnQ6IHBk&j zXp4?Rg4W&nH6pfXH? z#h}f69<&DQ#5a2exzr@B@lOyox);sn9!Q>Z#r{0p)LlfiVx&mFdBFjceZTMQo2@&3 z7^sN_s5_HpaOv=@$uAO+Y-eci@$8eTzl3-W+<9&-Yz6lHKpN5CURu_#?w7XF0Ccfj zX_kVc;T?x9CN-PXOyJYs;Oe8>*EN8>WgFz31G3R8Tq8tM!pEai49Xijhsh9x=(pyV zc@=J!4b_(+r+h)<2Kx?-FF?D{uWJFb^d9(bU>)>30SOj-u-^62Kw-z)4dB>x@VY3_ z-wTq$W+e~`0j&M2mjUqe{XSn@NkiaD+i9Ie^`T!t3mK78I(5_U2t{@KiGLeLT`2~YH@D7b3wAlH`C(Oi-xvKwDyDljD~?K3C!p~ zCeky$t^ITG9_084Va!OA4oZ~iXIvxPm(BEN+9PI8EHsa=W1-dU_}bW0Tm}<+svI7m zH&6f3vUI=qc86s~t5V%K&M?#rlQ&L*Yh#pm`^ZOn`t~V7?fKUJnPdYWAmbL{fxBlX zWn+^^TS6Q4(4bLB#p%Oh0&Con9c0ddu(-2-LE>0ueEq;zvcc08Q0}eG=z#M@K&Mv| z%pRk)(KowBeA#yF4nZ9PE#TU`c|l#^%H9S}59XC#`ZKwDuo%7ti2G6CG&)bTmI4~? zoiE~(-Y047CNJ#ONn(qP=9J%M6KL?i^RRo%jt$06l)#LCpuRwqd^qy_*bhJBsZ&xL zj47}<@jI?61aY+hOzi-iox-`<0+XYS8+;Ki(n)x-HWEyW6T~DUeVST#*%mZtvIqAd zi_*;mK0IT_LH8OI%~g6q62iNO1@Co&(6*D`2%82x-(fJogBd?F9vTyY3oj*%K~EQd)PrRtZnCv0c^Bqvy32vykCnJ-H@>gDsqe z1`WD$S*NDiH-K{^CpKe+K%=l^-cHQ~i9Nc5O`GtMM&3Oo==n@pP{#JI)K{M%vF1n# z)Ohw!oS9W3o)3B>bL<7pZfmF&ZdM&olm8w!fdLw9Z4?UdNh-GBfMfgsLwy!#rU*j0 zW8`SQd5ISip2Q#d46Xj-XlTu$A+4me25AA50sxAm*F5n-ObWtluHH8AqG2W#Qd3cUvg^@)axmMwQTRtT_i?h!N(cfqJjbW zYt&qjbV(L%jA#FKEsg8O_?cOQX7UKvDg*a--z@$Th3@}&%^y;PttP-u7Y`^`6zJqE z4k&lQuy&jx^v-y8J9ZX=!RwK35GWJ-i}-fW;i`TIWeE@n|5QLXRtPkYPv4-g?8h7BN(Sq)xS^Z=01>)Yh!;*r{RihjjA_=vRKRC>l^XcYDt~(kC~t(3%cNS?u`Q=;|S=HSfHN0GY;Fo}207A2@Dp zDC^`wF#{Pg-L?+<)k7uo*=AD<>7c@C9CD$xt924k!l@ - + - dependency-check-maven - Usage - + dependency-check-maven – Usage + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@

  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +

    Usage

    Dependency-check-maven is very simple to utilize and can be used as a stand-alone plugin or as part of the site plugin.

    @@ -158,11 +158,11 @@

    After the first batch download, as long as the plugin is executed at least once every seven days the update will only take a few seconds.

    -

    Example 1:

    +

    Example 1:

    Create the DependencyCheck-report.html in the target directory.

    -
    <project>
    +
    <project>
         ...
         <build>
             ...
    @@ -171,7 +171,7 @@
                 <plugin>
                   <groupId>org.owasp</groupId>
                   <artifactId>dependency-check-maven</artifactId>
    -              <version>1.3.0</version>
    +              <version>1.3.1</version>
                   <executions>
                       <execution>
                           <goals>
    @@ -186,13 +186,13 @@
         </build>
         ...
     </project>
    -
    +
    -

    Example 2:

    +

    Example 2:

    Create an aggregated dependency-check report within the site.

    -
    <project>
    +
    <project>
         ...
         <reporting>
             ...
    @@ -202,7 +202,7 @@
                     <plugin>
                         <groupId>org.owasp</groupId>
                         <artifactId>dependency-check-maven</artifactId>
    -                    <version>1.3.0</version>
    +                    <version>1.3.1</version>
                         <reportSets>
                             <reportSet>
                                 <reports>
    @@ -218,13 +218,13 @@
         </reporting>
         ...
     </project>
    -
    +
    -

    Example 3:

    +

    Example 3:

    Create the DependencyCheck-report.html and fail the build for CVSS greater then 8.

    -
    <project>
    +
    <project>
         ...
         <build>
             ...
    @@ -233,7 +233,7 @@
                 <plugin>
                   <groupId>org.owasp</groupId>
                   <artifactId>dependency-check-maven</artifactId>
    -              <version>1.3.0</version>
    +              <version>1.3.1</version>
                   <configuration>
                       <failBuildOnCVSS>8</failBuildOnCVSS>
                   </configuration>
    @@ -251,13 +251,13 @@
         </build>
         ...
     </project>
    -
    +
    -

    Example 4:

    +

    Example 4:

    Create the DependencyCheck-report.html and skip artifacts not bundled in distribution (Provided and Runtime scope).

    -
    <project>
    +
    <project>
         ...
         <build>
             ...
    @@ -266,7 +266,7 @@
                 <plugin>
                     <groupId>org.owasp</groupId>
                     <artifactId>dependency-check-maven</artifactId>
    -                <version>1.3.0</version>
    +                <version>1.3.1</version>
                     <configuration>
                         <skipProvidedScope>true</skipProvidedScope>
                         <skipRuntimeScope>true</skipRuntimeScope>
    @@ -285,13 +285,13 @@
         </build>
         ...
     </project>
    -
    +
    -

    Example 5:

    +

    Example 5:

    Create the DependencyCheck-report.html and use internal mirroring of CVE contents.

    -
    <project>
    +
    <project>
         ...
         <build>
             ...
    @@ -300,7 +300,7 @@
                 <plugin>
                     <groupId>org.owasp</groupId>
                     <artifactId>dependency-check-maven</artifactId>
    -                <version>1.3.0</version>
    +                <version>1.3.1</version>
                     <configuration>
                         <cveUrl12Modified>http://internal-mirror.mycorp.com/downloads/nist/nvdcve-modified.xml</cveUrl12Modified>
                         <cveUrl20Modified>http://internal-mirror.mycorp.com/downloads/nist/nvdcve-2.0-modified.xml</cveUrl20Modified>
    @@ -321,13 +321,13 @@
         </build>
         ...
     </project>
    -
    +
    -

    Example 6:

    +

    Example 6:

    Update the local cache of the NVD data from NIST without analyzing the dependencies.

    -
    <project>
    +
    <project>
         ...
         <build>
             ...
    @@ -336,7 +336,7 @@
                 <plugin>
                     <groupId>org.owasp</groupId>
                     <artifactId>dependency-check-maven</artifactId>
    -                <version>1.3.0</version>
    +                <version>1.3.1</version>
                     <executions>
                         <execution>
                             <goals>
    @@ -351,7 +351,7 @@
         </build>
         ...
     </project>
    -
    + @@ -361,15 +361,14 @@
    -

    Copyright © 2013–2015 +

    Copyright © 2013–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-maven/integration.html b/dependency-check-maven/integration.html new file mode 100644 index 000000000..82ebf62bf --- /dev/null +++ b/dependency-check-maven/integration.html @@ -0,0 +1,236 @@ + + + + + + + + + dependency-check-maven – Continuous Integration + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +
    +

    Overview

    +

    This project uses Continuous Integration System.

    +
    +

    Access

    +

    The following is a link to the continuous integration system used by the project:

    +
    +
    +

    Notifiers

    +

    No notifiers are defined. Please check back at a later date.

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2013–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-maven/issue-tracking.html b/dependency-check-maven/issue-tracking.html index 18e420d9c..70e1ffc98 100644 --- a/dependency-check-maven/issue-tracking.html +++ b/dependency-check-maven/issue-tracking.html @@ -1,21 +1,21 @@ - + - dependency-check-maven - Issue Tracking - + dependency-check-maven – Issue Tracking + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,7 +77,7 @@
    -
    +
    -
    +
    -

    Overview

    +

    Overview

    This project uses github to manage its issues.

    -

    Issue Tracking

    +

    Issue Tracking

    Issues, bugs, and feature requests should be submitted to the following issue tracking system for this project.

    -
    +
    @@ -213,15 +219,14 @@
    -

    Copyright © 2013–2015 +

    Copyright © 2013–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-maven/js/apache-maven-fluido-1.4.min.js b/dependency-check-maven/js/apache-maven-fluido-1.4.min.js new file mode 100644 index 000000000..0537c09d6 --- /dev/null +++ b/dependency-check-maven/js/apache-maven-fluido-1.4.min.js @@ -0,0 +1,25 @@ +/*! + * jQuery JavaScript Library v1.11.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-17T15:27Z + */ +(function(b,a){if(typeof module==="object"&&typeof module.exports==="object"){module.exports=b.document?a(b,true):function(c){if(!c.document){throw new Error("jQuery requires a window with a document")}return a(c)}}else{a(b)}}(typeof window!=="undefined"?window:this,function(a5,av){var aP=[];var P=aP.slice;var az=aP.concat;var x=aP.push;var bU=aP.indexOf;var ac={};var y=ac.toString;var K=ac.hasOwnProperty;var D={};var ai="1.11.2",bI=function(e,i){return new bI.fn.init(e,i)},E=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bS=/^-ms-/,aW=/-([\da-z])/gi,O=function(e,i){return i.toUpperCase()};bI.fn=bI.prototype={jquery:ai,constructor:bI,selector:"",length:0,toArray:function(){return P.call(this)},get:function(e){return e!=null?(e<0?this[e+this.length]:this[e]):P.call(this)},pushStack:function(e){var i=bI.merge(this.constructor(),e);i.prevObject=this;i.context=this.context;return i},each:function(i,e){return bI.each(this,i,e)},map:function(e){return this.pushStack(bI.map(this,function(b7,b6){return e.call(b7,b6,b7)}))},slice:function(){return this.pushStack(P.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(b7){var e=this.length,b6=+b7+(b7<0?e:0);return this.pushStack(b6>=0&&b6=0},isEmptyObject:function(i){var e;for(e in i){return false}return true},isPlainObject:function(b7){var i;if(!b7||bI.type(b7)!=="object"||b7.nodeType||bI.isWindow(b7)){return false}try{if(b7.constructor&&!K.call(b7,"constructor")&&!K.call(b7.constructor.prototype,"isPrototypeOf")){return false}}catch(b6){return false}if(D.ownLast){for(i in b7){return K.call(b7,i)}}for(i in b7){}return i===undefined||K.call(b7,i)},type:function(e){if(e==null){return e+""}return typeof e==="object"||typeof e==="function"?ac[y.call(e)]||"object":typeof e},globalEval:function(e){if(e&&bI.trim(e)){(a5.execScript||function(i){a5["eval"].call(a5,i)})(e)}},camelCase:function(e){return e.replace(bS,"ms-").replace(aW,O)},nodeName:function(i,e){return i.nodeName&&i.nodeName.toLowerCase()===e.toLowerCase()},each:function(ca,cb,b6){var b9,b7=0,b8=ca.length,e=ad(ca);if(b6){if(e){for(;b70&&(i-1) in b6}var m= +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function(de){var cy,dh,cn,cH,cK,ci,cW,dg,dm,cI,cX,cZ,cC,co,c8,c3,df,ce,cF,da="sizzle"+1*new Date(),cJ=de.document,di=0,c4=0,b9=cA(),c9=cA(),cG=cA(),cE=function(i,e){if(i===e){cX=true}return 0},cQ=1<<31,cO=({}).hasOwnProperty,dc=[],dd=dc.pop,cM=dc.push,b7=dc.push,cm=dc.slice,cd=function(dq,dp){var dn=0,e=dq.length;for(;dn+~]|"+cp+")"+cp+"*"),ct=new RegExp("="+cp+"*([^\\]'\"]*?)"+cp+"*\\]","g"),cS=new RegExp(ck),cU=new RegExp("^"+cL+"$"),c2={ID:new RegExp("^#("+b6+")"),CLASS:new RegExp("^\\.("+b6+")"),TAG:new RegExp("^("+b6.replace("w","w*")+")"),ATTR:new RegExp("^"+c6),PSEUDO:new RegExp("^"+ck),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+cp+"*(even|odd|(([+-]|)(\\d*)n|)"+cp+"*(?:([+-]|)"+cp+"*(\\d+)|))"+cp+"*\\)|)","i"),bool:new RegExp("^(?:"+b8+")$","i"),needsContext:new RegExp("^"+cp+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+cp+"*((?:-\\d)?\\d*)"+cp+"*\\)|)(?=[^-]|$)","i")},cc=/^(?:input|select|textarea|button)$/i,cl=/^h\d$/i,cP=/^[^{]+\{\s*\[native \w/,cR=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,c1=/[+~]/,cN=/'|\\/g,cs=new RegExp("\\\\([\\da-f]{1,6}"+cp+"?|("+cp+")|.)","ig"),c5=function(e,dp,i){var dn="0x"+dp-65536;return dn!==dn||i?dp:dn<0?String.fromCharCode(dn+65536):String.fromCharCode(dn>>10|55296,dn&1023|56320)},dl=function(){cZ()};try{b7.apply((dc=cm.call(cJ.childNodes)),cJ.childNodes);dc[cJ.childNodes.length].nodeType}catch(cD){b7={apply:dc.length?function(i,e){cM.apply(i,cm.call(e))}:function(dq,dp){var e=dq.length,dn=0;while((dq[e++]=dp[dn++])){}dq.length=e-1}}}function cw(dv,dn,dz,dB){var dA,ds,dt,dx,dy,dr,dq,e,dp,dw;if((dn?dn.ownerDocument||dn:cJ)!==cC){cZ(dn)}dn=dn||cC;dz=dz||[];dx=dn.nodeType;if(typeof dv!=="string"||!dv||dx!==1&&dx!==9&&dx!==11){return dz}if(!dB&&c8){if(dx!==11&&(dA=cR.exec(dv))){if((dt=dA[1])){if(dx===9){ds=dn.getElementById(dt);if(ds&&ds.parentNode){if(ds.id===dt){dz.push(ds);return dz}}else{return dz}}else{if(dn.ownerDocument&&(ds=dn.ownerDocument.getElementById(dt))&&cF(dn,ds)&&ds.id===dt){dz.push(ds);return dz}}}else{if(dA[2]){b7.apply(dz,dn.getElementsByTagName(dv));return dz}else{if((dt=dA[3])&&dh.getElementsByClassName){b7.apply(dz,dn.getElementsByClassName(dt));return dz}}}}if(dh.qsa&&(!c3||!c3.test(dv))){e=dq=da;dp=dn;dw=dx!==1&&dv;if(dx===1&&dn.nodeName.toLowerCase()!=="object"){dr=ci(dv);if((dq=dn.getAttribute("id"))){e=dq.replace(cN,"\\$&")}else{dn.setAttribute("id",e)}e="[id='"+e+"'] ";dy=dr.length;while(dy--){dr[dy]=e+ch(dr[dy])}dp=c1.test(dv)&&cT(dn.parentNode)||dn;dw=dr.join(",")}if(dw){try{b7.apply(dz,dp.querySelectorAll(dw));return dz}catch(du){}finally{if(!dq){dn.removeAttribute("id")}}}}}return dg(dv.replace(cr,"$1"),dn,dz,dB)}function cA(){var i=[];function e(dn,dp){if(i.push(dn+" ")>cn.cacheLength){delete e[i.shift()]}return(e[dn+" "]=dp)}return e}function cj(e){e[da]=true;return e}function cf(i){var dp=cC.createElement("div");try{return !!i(dp)}catch(dn){return false}finally{if(dp.parentNode){dp.parentNode.removeChild(dp)}dp=null}}function dj(dn,dq){var e=dn.split("|"),dp=dn.length;while(dp--){cn.attrHandle[e[dp]]=dq}}function ca(i,e){var dp=e&&i,dn=dp&&i.nodeType===1&&e.nodeType===1&&(~e.sourceIndex||cQ)-(~i.sourceIndex||cQ);if(dn){return dn}if(dp){while((dp=dp.nextSibling)){if(dp===e){return -1}}}return i?1:-1}function cx(e){return function(dn){var i=dn.nodeName.toLowerCase();return i==="input"&&dn.type===e}}function cb(e){return function(dn){var i=dn.nodeName.toLowerCase();return(i==="input"||i==="button")&&dn.type===e}}function c7(e){return cj(function(i){i=+i;return cj(function(dn,ds){var dq,dp=e([],dn.length,i),dr=dp.length;while(dr--){if(dn[(dq=dp[dr])]){dn[dq]=!(ds[dq]=dn[dq])}}})})}function cT(e){return e&&typeof e.getElementsByTagName!=="undefined"&&e}dh=cw.support={};cK=cw.isXML=function(e){var i=e&&(e.ownerDocument||e).documentElement;return i?i.nodeName!=="HTML":false};cZ=cw.setDocument=function(dn){var e,i,dp=dn?dn.ownerDocument||dn:cJ;if(dp===cC||dp.nodeType!==9||!dp.documentElement){return cC}cC=dp;co=dp.documentElement;i=dp.defaultView;if(i&&i!==i.top){if(i.addEventListener){i.addEventListener("unload",dl,false)}else{if(i.attachEvent){i.attachEvent("onunload",dl)}}}c8=!cK(dp);dh.attributes=cf(function(dq){dq.className="i";return !dq.getAttribute("className")});dh.getElementsByTagName=cf(function(dq){dq.appendChild(dp.createComment(""));return !dq.getElementsByTagName("*").length});dh.getElementsByClassName=cP.test(dp.getElementsByClassName);dh.getById=cf(function(dq){co.appendChild(dq).id=da;return !dp.getElementsByName||!dp.getElementsByName(da).length});if(dh.getById){cn.find.ID=function(ds,dr){if(typeof dr.getElementById!=="undefined"&&c8){var dq=dr.getElementById(ds);return dq&&dq.parentNode?[dq]:[]}};cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(ds){return ds.getAttribute("id")===dq}}}else{delete cn.find.ID;cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(dt){var ds=typeof dt.getAttributeNode!=="undefined"&&dt.getAttributeNode("id");return ds&&ds.value===dq}}}cn.find.TAG=dh.getElementsByTagName?function(dq,dr){if(typeof dr.getElementsByTagName!=="undefined"){return dr.getElementsByTagName(dq)}else{if(dh.qsa){return dr.querySelectorAll(dq)}}}:function(dq,du){var dv,dt=[],ds=0,dr=du.getElementsByTagName(dq);if(dq==="*"){while((dv=dr[ds++])){if(dv.nodeType===1){dt.push(dv)}}return dt}return dr};cn.find.CLASS=dh.getElementsByClassName&&function(dr,dq){if(c8){return dq.getElementsByClassName(dr)}};df=[];c3=[];if((dh.qsa=cP.test(dp.querySelectorAll))){cf(function(dq){co.appendChild(dq).innerHTML="";if(dq.querySelectorAll("[msallowcapture^='']").length){c3.push("[*^$]="+cp+"*(?:''|\"\")")}if(!dq.querySelectorAll("[selected]").length){c3.push("\\["+cp+"*(?:value|"+b8+")")}if(!dq.querySelectorAll("[id~="+da+"-]").length){c3.push("~=")}if(!dq.querySelectorAll(":checked").length){c3.push(":checked")}if(!dq.querySelectorAll("a#"+da+"+*").length){c3.push(".#.+[+~]")}});cf(function(dr){var dq=dp.createElement("input");dq.setAttribute("type","hidden");dr.appendChild(dq).setAttribute("name","D");if(dr.querySelectorAll("[name=d]").length){c3.push("name"+cp+"*[*^$|!~]?=")}if(!dr.querySelectorAll(":enabled").length){c3.push(":enabled",":disabled")}dr.querySelectorAll("*,:x");c3.push(",.*:")})}if((dh.matchesSelector=cP.test((ce=co.matches||co.webkitMatchesSelector||co.mozMatchesSelector||co.oMatchesSelector||co.msMatchesSelector)))){cf(function(dq){dh.disconnectedMatch=ce.call(dq,"div");ce.call(dq,"[s!='']:x");df.push("!=",ck)})}c3=c3.length&&new RegExp(c3.join("|"));df=df.length&&new RegExp(df.join("|"));e=cP.test(co.compareDocumentPosition);cF=e||cP.test(co.contains)?function(dr,dq){var dt=dr.nodeType===9?dr.documentElement:dr,ds=dq&&dq.parentNode;return dr===ds||!!(ds&&ds.nodeType===1&&(dt.contains?dt.contains(ds):dr.compareDocumentPosition&&dr.compareDocumentPosition(ds)&16))}:function(dr,dq){if(dq){while((dq=dq.parentNode)){if(dq===dr){return true}}}return false};cE=e?function(dr,dq){if(dr===dq){cX=true;return 0}var ds=!dr.compareDocumentPosition-!dq.compareDocumentPosition;if(ds){return ds}ds=(dr.ownerDocument||dr)===(dq.ownerDocument||dq)?dr.compareDocumentPosition(dq):1;if(ds&1||(!dh.sortDetached&&dq.compareDocumentPosition(dr)===ds)){if(dr===dp||dr.ownerDocument===cJ&&cF(cJ,dr)){return -1}if(dq===dp||dq.ownerDocument===cJ&&cF(cJ,dq)){return 1}return cI?(cd(cI,dr)-cd(cI,dq)):0}return ds&4?-1:1}:function(dr,dq){if(dr===dq){cX=true;return 0}var dx,du=0,dw=dr.parentNode,dt=dq.parentNode,ds=[dr],dv=[dq];if(!dw||!dt){return dr===dp?-1:dq===dp?1:dw?-1:dt?1:cI?(cd(cI,dr)-cd(cI,dq)):0}else{if(dw===dt){return ca(dr,dq)}}dx=dr;while((dx=dx.parentNode)){ds.unshift(dx)}dx=dq;while((dx=dx.parentNode)){dv.unshift(dx)}while(ds[du]===dv[du]){du++}return du?ca(ds[du],dv[du]):ds[du]===cJ?-1:dv[du]===cJ?1:0};return dp};cw.matches=function(i,e){return cw(i,null,null,e)};cw.matchesSelector=function(dn,dq){if((dn.ownerDocument||dn)!==cC){cZ(dn)}dq=dq.replace(ct,"='$1']");if(dh.matchesSelector&&c8&&(!df||!df.test(dq))&&(!c3||!c3.test(dq))){try{var i=ce.call(dn,dq);if(i||dh.disconnectedMatch||dn.document&&dn.document.nodeType!==11){return i}}catch(dp){}}return cw(dq,cC,null,[dn]).length>0};cw.contains=function(e,i){if((e.ownerDocument||e)!==cC){cZ(e)}return cF(e,i)};cw.attr=function(dn,e){if((dn.ownerDocument||dn)!==cC){cZ(dn)}var i=cn.attrHandle[e.toLowerCase()],dp=i&&cO.call(cn.attrHandle,e.toLowerCase())?i(dn,e,!c8):undefined;return dp!==undefined?dp:dh.attributes||!c8?dn.getAttribute(e):(dp=dn.getAttributeNode(e))&&dp.specified?dp.value:null};cw.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};cw.uniqueSort=function(dp){var dq,dr=[],e=0,dn=0;cX=!dh.detectDuplicates;cI=!dh.sortStable&&dp.slice(0);dp.sort(cE);if(cX){while((dq=dp[dn++])){if(dq===dp[dn]){e=dr.push(dn)}}while(e--){dp.splice(dr[e],1)}}cI=null;return dp};cH=cw.getText=function(dr){var dq,dn="",dp=0,e=dr.nodeType;if(!e){while((dq=dr[dp++])){dn+=cH(dq)}}else{if(e===1||e===9||e===11){if(typeof dr.textContent==="string"){return dr.textContent}else{for(dr=dr.firstChild;dr;dr=dr.nextSibling){dn+=cH(dr)}}}else{if(e===3||e===4){return dr.nodeValue}}}return dn};cn=cw.selectors={cacheLength:50,createPseudo:cj,match:c2,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){e[1]=e[1].replace(cs,c5);e[3]=(e[3]||e[4]||e[5]||"").replace(cs,c5);if(e[2]==="~="){e[3]=" "+e[3]+" "}return e.slice(0,4)},CHILD:function(e){e[1]=e[1].toLowerCase();if(e[1].slice(0,3)==="nth"){if(!e[3]){cw.error(e[0])}e[4]=+(e[4]?e[5]+(e[6]||1):2*(e[3]==="even"||e[3]==="odd"));e[5]=+((e[7]+e[8])||e[3]==="odd")}else{if(e[3]){cw.error(e[0])}}return e},PSEUDO:function(i){var e,dn=!i[6]&&i[2];if(c2.CHILD.test(i[0])){return null}if(i[3]){i[2]=i[4]||i[5]||""}else{if(dn&&cS.test(dn)&&(e=ci(dn,true))&&(e=dn.indexOf(")",dn.length-e)-dn.length)){i[0]=i[0].slice(0,e);i[2]=dn.slice(0,e)}}return i.slice(0,3)}},filter:{TAG:function(i){var e=i.replace(cs,c5).toLowerCase();return i==="*"?function(){return true}:function(dn){return dn.nodeName&&dn.nodeName.toLowerCase()===e}},CLASS:function(e){var i=b9[e+" "];return i||(i=new RegExp("(^|"+cp+")"+e+"("+cp+"|$)"))&&b9(e,function(dn){return i.test(typeof dn.className==="string"&&dn.className||typeof dn.getAttribute!=="undefined"&&dn.getAttribute("class")||"")})},ATTR:function(dn,i,e){return function(dq){var dp=cw.attr(dq,dn);if(dp==null){return i==="!="}if(!i){return true}dp+="";return i==="="?dp===e:i==="!="?dp!==e:i==="^="?e&&dp.indexOf(e)===0:i==="*="?e&&dp.indexOf(e)>-1:i==="$="?e&&dp.slice(-e.length)===e:i==="~="?(" "+dp.replace(cu," ")+" ").indexOf(e)>-1:i==="|="?dp===e||dp.slice(0,e.length+1)===e+"-":false}},CHILD:function(i,dq,dp,dr,dn){var dt=i.slice(0,3)!=="nth",e=i.slice(-4)!=="last",ds=dq==="of-type";return dr===1&&dn===0?function(du){return !!du.parentNode}:function(dA,dy,dD){var du,dG,dB,dF,dC,dx,dz=dt!==e?"nextSibling":"previousSibling",dE=dA.parentNode,dw=ds&&dA.nodeName.toLowerCase(),dv=!dD&&!ds;if(dE){if(dt){while(dz){dB=dA;while((dB=dB[dz])){if(ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1){return false}}dx=dz=i==="only"&&!dx&&"nextSibling"}return true}dx=[e?dE.firstChild:dE.lastChild];if(e&&dv){dG=dE[da]||(dE[da]={});du=dG[i]||[];dC=du[0]===di&&du[1];dF=du[0]===di&&du[2];dB=dC&&dE.childNodes[dC];while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if(dB.nodeType===1&&++dF&&dB===dA){dG[i]=[di,dC,dF];break}}}else{if(dv&&(du=(dA[da]||(dA[da]={}))[i])&&du[0]===di){dF=du[1]}else{while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if((ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1)&&++dF){if(dv){(dB[da]||(dB[da]={}))[i]=[di,dF]}if(dB===dA){break}}}}}dF-=dn;return dF===dr||(dF%dr===0&&dF/dr>=0)}}},PSEUDO:function(dp,dn){var e,i=cn.pseudos[dp]||cn.setFilters[dp.toLowerCase()]||cw.error("unsupported pseudo: "+dp);if(i[da]){return i(dn)}if(i.length>1){e=[dp,dp,"",dn];return cn.setFilters.hasOwnProperty(dp.toLowerCase())?cj(function(ds,du){var dr,dq=i(ds,dn),dt=dq.length;while(dt--){dr=cd(ds,dq[dt]);ds[dr]=!(du[dr]=dq[dt])}}):function(dq){return i(dq,0,e)}}return i}},pseudos:{not:cj(function(e){var i=[],dn=[],dp=cW(e.replace(cr,"$1"));return dp[da]?cj(function(dr,dw,du,ds){var dv,dq=dp(dr,null,ds,[]),dt=dr.length;while(dt--){if((dv=dq[dt])){dr[dt]=!(dw[dt]=dv)}}}):function(ds,dr,dq){i[0]=ds;dp(i,null,dq,dn);i[0]=null;return !dn.pop()}}),has:cj(function(e){return function(i){return cw(e,i).length>0}}),contains:cj(function(e){e=e.replace(cs,c5);return function(i){return(i.textContent||i.innerText||cH(i)).indexOf(e)>-1}}),lang:cj(function(e){if(!cU.test(e||"")){cw.error("unsupported lang: "+e)}e=e.replace(cs,c5).toLowerCase();return function(dn){var i;do{if((i=c8?dn.lang:dn.getAttribute("xml:lang")||dn.getAttribute("lang"))){i=i.toLowerCase();return i===e||i.indexOf(e+"-")===0}}while((dn=dn.parentNode)&&dn.nodeType===1);return false}}),target:function(e){var i=de.location&&de.location.hash;return i&&i.slice(1)===e.id},root:function(e){return e===co},focus:function(e){return e===cC.activeElement&&(!cC.hasFocus||cC.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===false},disabled:function(e){return e.disabled===true},checked:function(e){var i=e.nodeName.toLowerCase();return(i==="input"&&!!e.checked)||(i==="option"&&!!e.selected)},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling){if(e.nodeType<6){return false}}return true},parent:function(e){return !cn.pseudos.empty(e)},header:function(e){return cl.test(e.nodeName)},input:function(e){return cc.test(e.nodeName)},button:function(i){var e=i.nodeName.toLowerCase();return e==="input"&&i.type==="button"||e==="button"},text:function(i){var e;return i.nodeName.toLowerCase()==="input"&&i.type==="text"&&((e=i.getAttribute("type"))==null||e.toLowerCase()==="text")},first:c7(function(){return[0]}),last:c7(function(e,i){return[i-1]}),eq:c7(function(e,dn,i){return[i<0?i+dn:i]}),even:c7(function(e,dp){var dn=0;for(;dn=0;){e.push(dn)}return e}),gt:c7(function(e,dq,dp){var dn=dp<0?dp+dq:dp;for(;++dn1?function(dr,dq,dn){var dp=e.length;while(dp--){if(!e[dp](dr,dq,dn)){return false}}return true}:e[0]}function cz(dn,dr,dq){var dp=0,e=dr.length;for(;dp-1){dC[dE]=!(dz[dE]=dw)}}}}else{dy=c0(dy===dz?dy.splice(dt,dy.length):dy);if(dr){dr(null,dz,dy,dB)}else{b7.apply(dz,dy)}}})}function db(dt){var dn,dr,dp,ds=dt.length,dw=cn.relative[dt[0].type],dx=dw||cn.relative[" "],dq=dw?1:0,du=cq(function(i){return i===dn},dx,true),dv=cq(function(i){return cd(dn,i)>-1},dx,true),e=[function(dA,dz,dy){var i=(!dw&&(dy||dz!==dm))||((dn=dz).nodeType?du(dA,dz,dy):dv(dA,dz,dy));dn=null;return i}];for(;dq1&&dk(e),dq>1&&ch(dt.slice(0,dq-1).concat({value:dt[dq-2].type===" "?"*":""})).replace(cr,"$1"),dr,dq0,dq=dp.length>0,i=function(dA,du,dz,dy,dD){var dv,dw,dB,dF=0,dx="0",dr=dA&&[],dG=[],dE=dm,dt=dA||dq&&cn.find.TAG("*",dD),ds=(di+=dE==null?1:Math.random()||0.1),dC=dt.length;if(dD){dm=du!==cC&&du}for(;dx!==dC&&(dv=dt[dx])!=null;dx++){if(dq&&dv){dw=0;while((dB=dp[dw++])){if(dB(dv,du,dz)){dy.push(dv);break}}if(dD){di=ds}}if(e){if((dv=!dB&&dv)){dF--}if(dA){dr.push(dv)}}}dF+=dx;if(e&&dx!==dF){dw=0;while((dB=dn[dw++])){dB(dr,dG,du,dz)}if(dA){if(dF>0){while(dx--){if(!(dr[dx]||dG[dx])){dG[dx]=dd.call(dy)}}}dG=c0(dG)}b7.apply(dy,dG);if(dD&&!dA&&dG.length>0&&(dF+dn.length)>1){cw.uniqueSort(dy)}}if(dD){di=ds;dm=dE}return dr};return e?cj(i):i}cW=cw.compile=function(e,dp){var dq,dn=[],ds=[],dr=cG[e+" "];if(!dr){if(!dp){dp=ci(e)}dq=dp.length;while(dq--){dr=db(dp[dq]);if(dr[da]){dn.push(dr)}else{ds.push(dr)}}dr=cG(e,cY(ds,dn));dr.selector=e}return dr};dg=cw.select=function(dp,e,dq,dt){var dr,dw,dn,dx,du,dv=typeof dp==="function"&&dp,ds=!dt&&ci((dp=dv.selector||dp));dq=dq||[];if(ds.length===1){dw=ds[0]=ds[0].slice(0);if(dw.length>2&&(dn=dw[0]).type==="ID"&&dh.getById&&e.nodeType===9&&c8&&cn.relative[dw[1].type]){e=(cn.find.ID(dn.matches[0].replace(cs,c5),e)||[])[0];if(!e){return dq}else{if(dv){e=e.parentNode}}dp=dp.slice(dw.shift().value.length)}dr=c2.needsContext.test(dp)?0:dw.length;while(dr--){dn=dw[dr];if(cn.relative[(dx=dn.type)]){break}if((du=cn.find[dx])){if((dt=du(dn.matches[0].replace(cs,c5),c1.test(dw[0].type)&&cT(e.parentNode)||e))){dw.splice(dr,1);dp=dt.length&&ch(dw);if(!dp){b7.apply(dq,dt);return dq}break}}}}(dv||cW(dp,ds))(dt,e,!c8,dq,c1.test(dp)&&cT(e.parentNode)||e);return dq};dh.sortStable=da.split("").sort(cE).join("")===da;dh.detectDuplicates=!!cX;cZ();dh.sortDetached=cf(function(e){return e.compareDocumentPosition(cC.createElement("div"))&1});if(!cf(function(e){e.innerHTML="";return e.firstChild.getAttribute("href")==="#"})){dj("type|href|height|width",function(i,e,dn){if(!dn){return i.getAttribute(e,e.toLowerCase()==="type"?1:2)}})}if(!dh.attributes||!cf(function(e){e.innerHTML="";e.firstChild.setAttribute("value","");return e.firstChild.getAttribute("value")===""})){dj("value",function(i,e,dn){if(!dn&&i.nodeName.toLowerCase()==="input"){return i.defaultValue}})}if(!cf(function(e){return e.getAttribute("disabled")==null})){dj(b8,function(i,e,dp){var dn;if(!dp){return i[e]===true?e.toLowerCase():(dn=i.getAttributeNode(e))&&dn.specified?dn.value:null}})}return cw})(a5);bI.find=m;bI.expr=m.selectors;bI.expr[":"]=bI.expr.pseudos;bI.unique=m.uniqueSort;bI.text=m.getText;bI.isXMLDoc=m.isXML;bI.contains=m.contains;var A=bI.expr.match.needsContext;var a=(/^<(\w+)\s*\/?>(?:<\/\1>|)$/);var aL=/^.[^:#\[\.,]*$/;function aR(b6,e,i){if(bI.isFunction(e)){return bI.grep(b6,function(b8,b7){return !!e.call(b8,b7,b8)!==i})}if(e.nodeType){return bI.grep(b6,function(b7){return(b7===e)!==i})}if(typeof e==="string"){if(aL.test(e)){return bI.filter(e,b6,i)}e=bI.filter(e,b6)}return bI.grep(b6,function(b7){return(bI.inArray(b7,e)>=0)!==i})}bI.filter=function(b7,e,b6){var i=e[0];if(b6){b7=":not("+b7+")"}return e.length===1&&i.nodeType===1?bI.find.matchesSelector(i,b7)?[i]:[]:bI.find.matches(b7,bI.grep(e,function(b8){return b8.nodeType===1}))};bI.fn.extend({find:function(b6){var b9,b8=[],b7=this,e=b7.length;if(typeof b6!=="string"){return this.pushStack(bI(b6).filter(function(){for(b9=0;b91?bI.unique(b8):b8);b8.selector=this.selector?this.selector+" "+b6:b6;return b8},filter:function(e){return this.pushStack(aR(this,e||[],false))},not:function(e){return this.pushStack(aR(this,e||[],true))},is:function(e){return !!aR(this,typeof e==="string"&&A.test(e)?bI(e):e||[],false).length}});var z,n=a5.document,bt=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,bV=bI.fn.init=function(e,b6){var i,b7;if(!e){return this}if(typeof e==="string"){if(e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3){i=[null,e,null]}else{i=bt.exec(e)}if(i&&(i[1]||!b6)){if(i[1]){b6=b6 instanceof bI?b6[0]:b6;bI.merge(this,bI.parseHTML(i[1],b6&&b6.nodeType?b6.ownerDocument||b6:n,true));if(a.test(i[1])&&bI.isPlainObject(b6)){for(i in b6){if(bI.isFunction(this[i])){this[i](b6[i])}else{this.attr(i,b6[i])}}}return this}else{b7=n.getElementById(i[2]);if(b7&&b7.parentNode){if(b7.id!==i[2]){return z.find(e)}this.length=1;this[0]=b7}this.context=n;this.selector=e;return this}}else{if(!b6||b6.jquery){return(b6||z).find(e)}else{return this.constructor(b6).find(e)}}}else{if(e.nodeType){this.context=this[0]=e;this.length=1;return this}else{if(bI.isFunction(e)){return typeof z.ready!=="undefined"?z.ready(e):e(bI)}}}if(e.selector!==undefined){this.selector=e.selector;this.context=e.context}return bI.makeArray(e,this)};bV.prototype=bI.fn;z=bI(n);var bv=/^(?:parents|prev(?:Until|All))/,bz={children:true,contents:true,next:true,prev:true};bI.extend({dir:function(b6,i,b8){var e=[],b7=b6[i];while(b7&&b7.nodeType!==9&&(b8===undefined||b7.nodeType!==1||!bI(b7).is(b8))){if(b7.nodeType===1){e.push(b7)}b7=b7[i]}return e},sibling:function(b6,i){var e=[];for(;b6;b6=b6.nextSibling){if(b6.nodeType===1&&b6!==i){e.push(b6)}}return e}});bI.fn.extend({has:function(b8){var b7,b6=bI(b8,this),e=b6.length;return this.filter(function(){for(b7=0;b7-1:ca.nodeType===1&&bI.find.matchesSelector(ca,b9))){e.push(ca);break}}}return this.pushStack(e.length>1?bI.unique(e):e)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.first().prevAll().length:-1}if(typeof e==="string"){return bI.inArray(this[0],bI(e))}return bI.inArray(e.jquery?e[0]:e,this)},add:function(e,i){return this.pushStack(bI.unique(bI.merge(this.get(),bI(e,i))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}});function aY(i,e){do{i=i[e]}while(i&&i.nodeType!==1);return i}bI.each({parent:function(i){var e=i.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return bI.dir(e,"parentNode")},parentsUntil:function(b6,e,b7){return bI.dir(b6,"parentNode",b7)},next:function(e){return aY(e,"nextSibling")},prev:function(e){return aY(e,"previousSibling")},nextAll:function(e){return bI.dir(e,"nextSibling")},prevAll:function(e){return bI.dir(e,"previousSibling")},nextUntil:function(b6,e,b7){return bI.dir(b6,"nextSibling",b7)},prevUntil:function(b6,e,b7){return bI.dir(b6,"previousSibling",b7)},siblings:function(e){return bI.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return bI.sibling(e.firstChild)},contents:function(e){return bI.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:bI.merge([],e.childNodes)}},function(e,i){bI.fn[e]=function(b8,b6){var b7=bI.map(this,i,b8);if(e.slice(-5)!=="Until"){b6=b8}if(b6&&typeof b6==="string"){b7=bI.filter(b6,b7)}if(this.length>1){if(!bz[e]){b7=bI.unique(b7)}if(bv.test(e)){b7=b7.reverse()}}return this.pushStack(b7)}});var aF=(/\S+/g);var b2={};function af(i){var e=b2[i]={};bI.each(i.match(aF)||[],function(b7,b6){e[b6]=true});return e}bI.Callbacks=function(ce){ce=typeof ce==="string"?(b2[ce]||af(ce)):bI.extend({},ce);var b8,b7,e,b9,ca,b6,cb=[],cc=!ce.once&&[],i=function(cf){b7=ce.memory&&cf;e=true;ca=b6||0;b6=0;b9=cb.length;b8=true;for(;cb&&ca-1){cb.splice(cg,1);if(b8){if(cg<=b9){b9--}if(cg<=ca){ca--}}}})}return this},has:function(cf){return cf?bI.inArray(cf,cb)>-1:!!(cb&&cb.length)},empty:function(){cb=[];b9=0;return this},disable:function(){cb=cc=b7=undefined;return this},disabled:function(){return !cb},lock:function(){cc=undefined;if(!b7){cd.disable()}return this},locked:function(){return !cc},fireWith:function(cg,cf){if(cb&&(!e||cc)){cf=cf||[];cf=[cg,cf.slice?cf.slice():cf];if(b8){cc.push(cf)}else{i(cf)}}return this},fire:function(){cd.fireWith(this,arguments);return this},fired:function(){return !!e}};return cd};bI.extend({Deferred:function(b6){var i=[["resolve","done",bI.Callbacks("once memory"),"resolved"],["reject","fail",bI.Callbacks("once memory"),"rejected"],["notify","progress",bI.Callbacks("memory")]],b7="pending",b8={state:function(){return b7},always:function(){e.done(arguments).fail(arguments);return this},then:function(){var b9=arguments;return bI.Deferred(function(ca){bI.each(i,function(cc,cb){var cd=bI.isFunction(b9[cc])&&b9[cc];e[cb[1]](function(){var ce=cd&&cd.apply(this,arguments);if(ce&&bI.isFunction(ce.promise)){ce.promise().done(ca.resolve).fail(ca.reject).progress(ca.notify)}else{ca[cb[0]+"With"](this===b8?ca.promise():this,cd?[ce]:arguments)}})});b9=null}).promise()},promise:function(b9){return b9!=null?bI.extend(b9,b8):b8}},e={};b8.pipe=b8.then;bI.each(i,function(ca,b9){var cc=b9[2],cb=b9[3];b8[b9[1]]=cc.add;if(cb){cc.add(function(){b7=cb},i[ca^1][2].disable,i[2][2].lock)}e[b9[0]]=function(){e[b9[0]+"With"](this===e?b8:this,arguments);return this};e[b9[0]+"With"]=cc.fireWith});b8.promise(e);if(b6){b6.call(e,e)}return e},when:function(b9){var b7=0,cb=P.call(arguments),e=cb.length,b6=e!==1||(b9&&bI.isFunction(b9.promise))?e:0,ce=b6===1?b9:bI.Deferred(),b8=function(cg,ch,cf){return function(i){ch[cg]=this;cf[cg]=arguments.length>1?P.call(arguments):i;if(cf===cd){ce.notifyWith(ch,cf)}else{if(!(--b6)){ce.resolveWith(ch,cf)}}}},cd,ca,cc;if(e>1){cd=new Array(e);ca=new Array(e);cc=new Array(e);for(;b70){return}ak.resolveWith(n,[bI]);if(bI.fn.triggerHandler){bI(n).triggerHandler("ready");bI(n).off("ready")}}});function bm(){if(n.addEventListener){n.removeEventListener("DOMContentLoaded",bZ,false);a5.removeEventListener("load",bZ,false)}else{n.detachEvent("onreadystatechange",bZ);a5.detachEvent("onload",bZ)}}function bZ(){if(n.addEventListener||event.type==="load"||n.readyState==="complete"){bm();bI.ready()}}bI.ready.promise=function(b8){if(!ak){ak=bI.Deferred();if(n.readyState==="complete"){setTimeout(bI.ready)}else{if(n.addEventListener){n.addEventListener("DOMContentLoaded",bZ,false);a5.addEventListener("load",bZ,false)}else{n.attachEvent("onreadystatechange",bZ);a5.attachEvent("onload",bZ);var b7=false;try{b7=a5.frameElement==null&&n.documentElement}catch(b6){}if(b7&&b7.doScroll){(function i(){if(!bI.isReady){try{b7.doScroll("left")}catch(b9){return setTimeout(i,50)}bm();bI.ready()}})()}}}}return ak.promise(b8)};var aC=typeof undefined;var bh;for(bh in bI(D)){break}D.ownLast=bh!=="0";D.inlineBlockNeedsLayout=false;bI(function(){var b6,b7,e,i;e=n.getElementsByTagName("body")[0];if(!e||!e.style){return}b7=n.createElement("div");i=n.createElement("div");i.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";e.appendChild(i).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";D.inlineBlockNeedsLayout=b6=b7.offsetWidth===3;if(b6){e.style.zoom=1}}e.removeChild(i)});(function(){var b6=n.createElement("div");if(D.deleteExpando==null){D.deleteExpando=true;try{delete b6.test}catch(i){D.deleteExpando=false}}b6=null})();bI.acceptData=function(b6){var i=bI.noData[(b6.nodeName+" ").toLowerCase()],e=+b6.nodeType||1;return e!==1&&e!==9?false:!i||i!==true&&b6.getAttribute("classid")===i};var by=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,aQ=/([A-Z])/g;function bA(b7,b6,b8){if(b8===undefined&&b7.nodeType===1){var i="data-"+b6.replace(aQ,"-$1").toLowerCase();b8=b7.getAttribute(i);if(typeof b8==="string"){try{b8=b8==="true"?true:b8==="false"?false:b8==="null"?null:+b8+""===b8?+b8:by.test(b8)?bI.parseJSON(b8):b8}catch(b9){}bI.data(b7,b6,b8)}else{b8=undefined}}return b8}function Q(i){var e;for(e in i){if(e==="data"&&bI.isEmptyObject(i[e])){continue}if(e!=="toJSON"){return false}}return true}function bc(b7,i,b9,b8){if(!bI.acceptData(b7)){return}var cb,ca,cc=bI.expando,cd=b7.nodeType,e=cd?bI.cache:b7,b6=cd?b7[cc]:b7[cc]&&cc;if((!b6||!e[b6]||(!b8&&!e[b6].data))&&b9===undefined&&typeof i==="string"){return}if(!b6){if(cd){b6=b7[cc]=aP.pop()||bI.guid++}else{b6=cc}}if(!e[b6]){e[b6]=cd?{}:{toJSON:bI.noop}}if(typeof i==="object"||typeof i==="function"){if(b8){e[b6]=bI.extend(e[b6],i)}else{e[b6].data=bI.extend(e[b6].data,i)}}ca=e[b6];if(!b8){if(!ca.data){ca.data={}}ca=ca.data}if(b9!==undefined){ca[bI.camelCase(i)]=b9}if(typeof i==="string"){cb=ca[i];if(cb==null){cb=ca[bI.camelCase(i)]}}else{cb=ca}return cb}function ab(b9,b7,e){if(!bI.acceptData(b9)){return}var cb,b8,ca=b9.nodeType,b6=ca?bI.cache:b9,cc=ca?b9[bI.expando]:bI.expando;if(!b6[cc]){return}if(b7){cb=e?b6[cc]:b6[cc].data;if(cb){if(!bI.isArray(b7)){if(b7 in cb){b7=[b7]}else{b7=bI.camelCase(b7);if(b7 in cb){b7=[b7]}else{b7=b7.split(" ")}}}else{b7=b7.concat(bI.map(b7,bI.camelCase))}b8=b7.length;while(b8--){delete cb[b7[b8]]}if(e?!Q(cb):!bI.isEmptyObject(cb)){return}}}if(!e){delete b6[cc].data;if(!Q(b6[cc])){return}}if(ca){bI.cleanData([b9],true)}else{if(D.deleteExpando||b6!=b6.window){delete b6[cc]}else{b6[cc]=null}}}bI.extend({cache:{},noData:{"applet ":true,"embed ":true,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){e=e.nodeType?bI.cache[e[bI.expando]]:e[bI.expando];return !!e&&!Q(e)},data:function(i,e,b6){return bc(i,e,b6)},removeData:function(i,e){return ab(i,e)},_data:function(i,e,b6){return bc(i,e,b6,true)},_removeData:function(i,e){return ab(i,e,true)}});bI.fn.extend({data:function(b8,cb){var b7,b6,ca,b9=this[0],e=b9&&b9.attributes;if(b8===undefined){if(this.length){ca=bI.data(b9);if(b9.nodeType===1&&!bI._data(b9,"parsedAttrs")){b7=e.length;while(b7--){if(e[b7]){b6=e[b7].name;if(b6.indexOf("data-")===0){b6=bI.camelCase(b6.slice(5));bA(b9,b6,ca[b6])}}}bI._data(b9,"parsedAttrs",true)}}return ca}if(typeof b8==="object"){return this.each(function(){bI.data(this,b8)})}return arguments.length>1?this.each(function(){bI.data(this,b8,cb)}):b9?bA(b9,b8,bI.data(b9,b8)):undefined},removeData:function(e){return this.each(function(){bI.removeData(this,e)})}});bI.extend({queue:function(b6,i,b7){var e;if(b6){i=(i||"fx")+"queue";e=bI._data(b6,i);if(b7){if(!e||bI.isArray(b7)){e=bI._data(b6,i,bI.makeArray(b7))}else{e.push(b7)}}return e||[]}},dequeue:function(b9,b8){b8=b8||"fx";var i=bI.queue(b9,b8),ca=i.length,b7=i.shift(),e=bI._queueHooks(b9,b8),b6=function(){bI.dequeue(b9,b8)};if(b7==="inprogress"){b7=i.shift();ca--}if(b7){if(b8==="fx"){i.unshift("inprogress")}delete e.stop;b7.call(b9,b6,e)}if(!ca&&e){e.empty.fire()}},_queueHooks:function(b6,i){var e=i+"queueHooks";return bI._data(b6,e)||bI._data(b6,e,{empty:bI.Callbacks("once memory").add(function(){bI._removeData(b6,i+"queue");bI._removeData(b6,e)})})}});bI.fn.extend({queue:function(e,i){var b6=2;if(typeof e!=="string"){i=e;e="fx";b6--}if(arguments.length
    a";D.leadingWhitespace=b8.firstChild.nodeType===3;D.tbody=!b8.getElementsByTagName("tbody").length;D.htmlSerialize=!!b8.getElementsByTagName("link").length;D.html5Clone=n.createElement("nav").cloneNode(true).outerHTML!=="<:nav>";i.type="checkbox";i.checked=true;b6.appendChild(i);D.appendChecked=i.checked;b8.innerHTML="";D.noCloneChecked=!!b8.cloneNode(true).lastChild.defaultValue;b6.appendChild(b8);b8.innerHTML="";D.checkClone=b8.cloneNode(true).cloneNode(true).lastChild.checked;D.noCloneEvent=true;if(b8.attachEvent){b8.attachEvent("onclick",function(){D.noCloneEvent=false});b8.cloneNode(true).click()}if(D.deleteExpando==null){D.deleteExpando=true;try{delete b8.test}catch(b7){D.deleteExpando=false}}})();(function(){var b6,e,b7=n.createElement("div");for(b6 in {submit:true,change:true,focusin:true}){e="on"+b6;if(!(D[b6+"Bubbles"]=e in a5)){b7.setAttribute(e,"t");D[b6+"Bubbles"]=b7.attributes[e].expando===false}}b7=null})();var bG=/^(?:input|select|textarea)$/i,a6=/^key/,bM=/^(?:mouse|pointer|contextmenu)|click/,bC=/^(?:focusinfocus|focusoutblur)$/,bx=/^([^.]*)(?:\.(.+)|)$/;function U(){return true}function Z(){return false}function am(){try{return n.activeElement}catch(e){}}bI.event={global:{},add:function(b8,cd,ci,ca,b9){var cb,cj,ck,b6,cf,cc,ch,b7,cg,e,i,ce=bI._data(b8);if(!ce){return}if(ci.handler){b6=ci;ci=b6.handler;b9=b6.selector}if(!ci.guid){ci.guid=bI.guid++}if(!(cj=ce.events)){cj=ce.events={}}if(!(cc=ce.handle)){cc=ce.handle=function(cl){return typeof bI!==aC&&(!cl||bI.event.triggered!==cl.type)?bI.event.dispatch.apply(cc.elem,arguments):undefined};cc.elem=b8}cd=(cd||"").match(aF)||[""];ck=cd.length;while(ck--){cb=bx.exec(cd[ck])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){continue}cf=bI.event.special[cg]||{};cg=(b9?cf.delegateType:cf.bindType)||cg;cf=bI.event.special[cg]||{};ch=bI.extend({type:cg,origType:i,data:ca,handler:ci,guid:ci.guid,selector:b9,needsContext:b9&&bI.expr.match.needsContext.test(b9),namespace:e.join(".")},b6);if(!(b7=cj[cg])){b7=cj[cg]=[];b7.delegateCount=0;if(!cf.setup||cf.setup.call(b8,ca,e,cc)===false){if(b8.addEventListener){b8.addEventListener(cg,cc,false)}else{if(b8.attachEvent){b8.attachEvent("on"+cg,cc)}}}}if(cf.add){cf.add.call(b8,ch);if(!ch.handler.guid){ch.handler.guid=ci.guid}}if(b9){b7.splice(b7.delegateCount++,0,ch)}else{b7.push(ch)}bI.event.global[cg]=true}b8=null},remove:function(b7,cd,ck,b8,cc){var ca,ch,cb,b9,cj,ci,cf,b6,cg,e,i,ce=bI.hasData(b7)&&bI._data(b7);if(!ce||!(ci=ce.events)){return}cd=(cd||"").match(aF)||[""];cj=cd.length;while(cj--){cb=bx.exec(cd[cj])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){for(cg in ci){bI.event.remove(b7,cg+cd[cj],ck,b8,true)}continue}cf=bI.event.special[cg]||{};cg=(b8?cf.delegateType:cf.bindType)||cg;b6=ci[cg]||[];cb=cb[2]&&new RegExp("(^|\\.)"+e.join("\\.(?:.*\\.|)")+"(\\.|$)");b9=ca=b6.length;while(ca--){ch=b6[ca];if((cc||i===ch.origType)&&(!ck||ck.guid===ch.guid)&&(!cb||cb.test(ch.namespace))&&(!b8||b8===ch.selector||b8==="**"&&ch.selector)){b6.splice(ca,1);if(ch.selector){b6.delegateCount--}if(cf.remove){cf.remove.call(b7,ch)}}}if(b9&&!b6.length){if(!cf.teardown||cf.teardown.call(b7,e,ce.handle)===false){bI.removeEvent(b7,cg,ce.handle)}delete ci[cg]}}if(bI.isEmptyObject(ci)){delete ce.handle;bI._removeData(b7,"events")}},trigger:function(b6,cd,b9,ck){var ce,b8,ci,cj,cg,cc,cb,ca=[b9||n],ch=K.call(b6,"type")?b6.type:b6,b7=K.call(b6,"namespace")?b6.namespace.split("."):[];ci=cc=b9=b9||n;if(b9.nodeType===3||b9.nodeType===8){return}if(bC.test(ch+bI.event.triggered)){return}if(ch.indexOf(".")>=0){b7=ch.split(".");ch=b7.shift();b7.sort()}b8=ch.indexOf(":")<0&&"on"+ch;b6=b6[bI.expando]?b6:new bI.Event(ch,typeof b6==="object"&&b6);b6.isTrigger=ck?2:3;b6.namespace=b7.join(".");b6.namespace_re=b6.namespace?new RegExp("(^|\\.)"+b7.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;b6.result=undefined;if(!b6.target){b6.target=b9}cd=cd==null?[b6]:bI.makeArray(cd,[b6]);cg=bI.event.special[ch]||{};if(!ck&&cg.trigger&&cg.trigger.apply(b9,cd)===false){return}if(!ck&&!cg.noBubble&&!bI.isWindow(b9)){cj=cg.delegateType||ch;if(!bC.test(cj+ch)){ci=ci.parentNode}for(;ci;ci=ci.parentNode){ca.push(ci);cc=ci}if(cc===(b9.ownerDocument||n)){ca.push(cc.defaultView||cc.parentWindow||a5)}}cb=0;while((ci=ca[cb++])&&!b6.isPropagationStopped()){b6.type=cb>1?cj:cg.bindType||ch;ce=(bI._data(ci,"events")||{})[b6.type]&&bI._data(ci,"handle");if(ce){ce.apply(ci,cd)}ce=b8&&ci[b8];if(ce&&ce.apply&&bI.acceptData(ci)){b6.result=ce.apply(ci,cd);if(b6.result===false){b6.preventDefault()}}}b6.type=ch;if(!ck&&!b6.isDefaultPrevented()){if((!cg._default||cg._default.apply(ca.pop(),cd)===false)&&bI.acceptData(b9)){if(b8&&b9[ch]&&!bI.isWindow(b9)){cc=b9[b8];if(cc){b9[b8]=null}bI.event.triggered=ch;try{b9[ch]()}catch(cf){}bI.event.triggered=undefined;if(cc){b9[b8]=cc}}}}return b6.result},dispatch:function(e){e=bI.event.fix(e);var b9,ca,ce,b6,b8,cd=[],cc=P.call(arguments),b7=(bI._data(this,"events")||{})[e.type]||[],cb=bI.event.special[e.type]||{};cc[0]=e;e.delegateTarget=this;if(cb.preDispatch&&cb.preDispatch.call(this,e)===false){return}cd=bI.event.handlers.call(this,e,b7);b9=0;while((b6=cd[b9++])&&!e.isPropagationStopped()){e.currentTarget=b6.elem;b8=0;while((ce=b6.handlers[b8++])&&!e.isImmediatePropagationStopped()){if(!e.namespace_re||e.namespace_re.test(ce.namespace)){e.handleObj=ce;e.data=ce.data;ca=((bI.event.special[ce.origType]||{}).handle||ce.handler).apply(b6.elem,cc);if(ca!==undefined){if((e.result=ca)===false){e.preventDefault();e.stopPropagation()}}}}}if(cb.postDispatch){cb.postDispatch.call(this,e)}return e.result},handlers:function(e,b7){var b6,cc,ca,b9,cb=[],b8=b7.delegateCount,cd=e.target;if(b8&&cd.nodeType&&(!e.button||e.type!=="click")){for(;cd!=this;cd=cd.parentNode||this){if(cd.nodeType===1&&(cd.disabled!==true||e.type!=="click")){ca=[];for(b9=0;b9=0:bI.find(b6,this,null,[cd]).length}if(ca[b6]){ca.push(cc)}}if(ca.length){cb.push({elem:cd,handlers:ca})}}}}if(b8]","i"),b5=/^\s+/,aH=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,o=/<([\w:]+)/,b0=/\s*$/g,W={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:D.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},aT=B(n),k=aT.appendChild(n.createElement("div"));W.optgroup=W.option;W.tbody=W.tfoot=W.colgroup=W.caption=W.thead;W.th=W.td;function l(b8,e){var b6,b9,b7=0,ca=typeof b8.getElementsByTagName!==aC?b8.getElementsByTagName(e||"*"):typeof b8.querySelectorAll!==aC?b8.querySelectorAll(e||"*"):undefined;if(!ca){for(ca=[],b6=b8.childNodes||b8;(b9=b6[b7])!=null;b7++){if(!e||bI.nodeName(b9,e)){ca.push(b9)}else{bI.merge(ca,l(b9,e))}}}return e===undefined||e&&bI.nodeName(b8,e)?bI.merge([b8],ca):ca}function bY(e){if(aM.test(e.type)){e.defaultChecked=e.checked}}function a3(i,e){return bI.nodeName(i,"table")&&bI.nodeName(e.nodeType!==11?e:e.firstChild,"tr")?i.getElementsByTagName("tbody")[0]||i.appendChild(i.ownerDocument.createElement("tbody")):i}function u(e){e.type=(bI.find.attr(e,"type")!==null)+"/"+e.type;return e}function bf(i){var e=ar.exec(i.type);if(e){i.type=e[1]}else{i.removeAttribute("type")}return i}function bu(e,b7){var b8,b6=0;for(;(b8=e[b6])!=null;b6++){bI._data(b8,"globalEval",!b7||bI._data(b7[b6],"globalEval"))}}function at(cc,b6){if(b6.nodeType!==1||!bI.hasData(cc)){return}var b9,b8,e,cb=bI._data(cc),ca=bI._data(b6,cb),b7=cb.events;if(b7){delete ca.handle;ca.events={};for(b9 in b7){for(b8=0,e=b7[b9].length;b8")){cd=b6.cloneNode(true)}else{k.innerHTML=b6.outerHTML;k.removeChild(cd=k.firstChild)}if((!D.noCloneEvent||!D.noCloneChecked)&&(b6.nodeType===1||b6.nodeType===11)&&!bI.isXMLDoc(b6)){ca=l(cd);cb=l(b6);for(b9=0;(b7=cb[b9])!=null;++b9){if(ca[b9]){T(b7,ca[b9])}}}if(b8){if(e){cb=cb||l(b6);ca=ca||l(cd);for(b9=0;(b7=cb[b9])!=null;b9++){at(b7,ca[b9])}}else{at(b6,cd)}}ca=l(cd,"script");if(ca.length>0){bu(ca,!cc&&l(b6,"script"))}ca=cb=b7=null;return cd},buildFragment:function(b6,b8,cd,ci){var ce,ca,cc,ch,cj,cg,b7,cb=b6.length,b9=B(b8),e=[],cf=0;for(;cf")+b7[2];ce=b7[0];while(ce--){ch=ch.lastChild}if(!D.leadingWhitespace&&b5.test(ca)){e.push(b8.createTextNode(b5.exec(ca)[0]))}if(!D.tbody){ca=cj==="table"&&!b0.test(ca)?ch.firstChild:b7[1]===""&&!b0.test(ca)?ch:0;ce=ca&&ca.childNodes.length;while(ce--){if(bI.nodeName((cg=ca.childNodes[ce]),"tbody")&&!cg.childNodes.length){ca.removeChild(cg)}}}bI.merge(e,ch.childNodes);ch.textContent="";while(ch.firstChild){ch.removeChild(ch.firstChild)}ch=b9.lastChild}}}}if(ch){b9.removeChild(ch)}if(!D.appendChecked){bI.grep(l(e,"input"),bY)}cf=0;while((ca=e[cf++])){if(ci&&bI.inArray(ca,ci)!==-1){continue}cc=bI.contains(ca.ownerDocument,ca);ch=l(b9.appendChild(ca),"script");if(cc){bu(ch)}if(cd){ce=0;while((ca=ch[ce++])){if(bB.test(ca.type||"")){cd.push(ca)}}}}ch=null;return b9},cleanData:function(b6,ce){var b8,cd,b7,b9,ca=0,cf=bI.expando,e=bI.cache,cb=D.deleteExpando,cc=bI.event.special;for(;(b8=b6[ca])!=null;ca++){if(ce||bI.acceptData(b8)){b7=b8[cf];b9=b7&&e[b7];if(b9){if(b9.events){for(cd in b9.events){if(cc[cd]){bI.event.remove(b8,cd)}else{bI.removeEvent(b8,cd,b9.handle)}}}if(e[b7]){delete e[b7];if(cb){delete b8[cf]}else{if(typeof b8.removeAttribute!==aC){b8.removeAttribute(cf)}else{b8[cf]=null}}aP.push(b7)}}}}}});bI.fn.extend({text:function(e){return aB(this,function(i){return i===undefined?bI.text(this):this.empty().append((this[0]&&this[0].ownerDocument||n).createTextNode(i))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.insertBefore(e,i.firstChild)}})},before:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this)}})},after:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this.nextSibling)}})},remove:function(e,b9){var b8,b6=e?bI.filter(e,this):this,b7=0;for(;(b8=b6[b7])!=null;b7++){if(!b9&&b8.nodeType===1){bI.cleanData(l(b8))}if(b8.parentNode){if(b9&&bI.contains(b8.ownerDocument,b8)){bu(l(b8,"script"))}b8.parentNode.removeChild(b8)}}return this},empty:function(){var b6,e=0;for(;(b6=this[e])!=null;e++){if(b6.nodeType===1){bI.cleanData(l(b6,false))}while(b6.firstChild){b6.removeChild(b6.firstChild)}if(b6.options&&bI.nodeName(b6,"select")){b6.options.length=0}}return this},clone:function(i,e){i=i==null?false:i;e=e==null?i:e;return this.map(function(){return bI.clone(this,i,e)})},html:function(e){return aB(this,function(b9){var b8=this[0]||{},b7=0,b6=this.length;if(b9===undefined){return b8.nodeType===1?b8.innerHTML.replace(aD,""):undefined}if(typeof b9==="string"&&!an.test(b9)&&(D.htmlSerialize||!M.test(b9))&&(D.leadingWhitespace||!b5.test(b9))&&!W[(o.exec(b9)||["",""])[1].toLowerCase()]){b9=b9.replace(aH,"<$1>");try{for(;b71&&typeof ce==="string"&&!D.checkClone&&bW.test(ce))){return this.each(function(cj){var i=cf.eq(cj);if(b6){cd[0]=ce.call(this,cj,i.html())}i.domManip(cd,ci)})}if(b8){cc=bI.buildFragment(cd,this[0].ownerDocument,false,this);cb=cc.firstChild;if(cc.childNodes.length===1){cc=cb}if(cb){b9=bI.map(l(cc,"script"),u);e=b9.length;for(;ca")).appendTo(i.documentElement);i=(aI[0].contentWindow||aI[0].contentDocument).document;i.write();i.close();e=a4(b6,i);aI.detach()}bl[b6]=e}return e}(function(){var e;D.shrinkWrapBlocks=function(){if(e!=null){return e}e=false;var b7,i,b6;i=n.getElementsByTagName("body")[0];if(!i||!i.style){return}b7=n.createElement("div");b6=n.createElement("div");b6.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";i.appendChild(b6).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1";b7.appendChild(n.createElement("div")).style.width="5px";e=b7.offsetWidth!==3}i.removeChild(b6);return e}})();var aZ=(/^margin/);var Y=new RegExp("^("+aE+")(?!px)[a-z%]+$","i");var bq,G,bo=/^(top|right|bottom|left)$/;if(a5.getComputedStyle){bq=function(e){if(e.ownerDocument.defaultView.opener){return e.ownerDocument.defaultView.getComputedStyle(e,null)}return a5.getComputedStyle(e,null)};G=function(cb,i,ca){var b8,b7,b9,e,b6=cb.style;ca=ca||bq(cb);e=ca?ca.getPropertyValue(i)||ca[i]:undefined;if(ca){if(e===""&&!bI.contains(cb.ownerDocument,cb)){e=bI.style(cb,i)}if(Y.test(e)&&aZ.test(i)){b8=b6.width;b7=b6.minWidth;b9=b6.maxWidth;b6.minWidth=b6.maxWidth=b6.width=e;e=ca.width;b6.width=b8;b6.minWidth=b7;b6.maxWidth=b9}}return e===undefined?e:e+""}}else{if(n.documentElement.currentStyle){bq=function(e){return e.currentStyle};G=function(ca,b7,b9){var cb,i,e,b6,b8=ca.style;b9=b9||bq(ca);b6=b9?b9[b7]:undefined;if(b6==null&&b8&&b8[b7]){b6=b8[b7]}if(Y.test(b6)&&!bo.test(b7)){cb=b8.left;i=ca.runtimeStyle;e=i&&i.left;if(e){i.left=ca.currentStyle.left}b8.left=b7==="fontSize"?"1em":b6;b6=b8.pixelLeft+"px";b8.left=cb;if(e){i.left=e}}return b6===undefined?b6:b6+""||"auto"}}}function a7(e,i){return{get:function(){var b6=e();if(b6==null){return}if(b6){delete this.get;return}return(this.get=i).apply(this,arguments)}}}(function(){var cb,b9,b7,ca,b6,b8,i;cb=n.createElement("div");cb.innerHTML="
    a";b7=cb.getElementsByTagName("a")[0];b9=b7&&b7.style;if(!b9){return}b9.cssText="float:left;opacity:.5";D.opacity=b9.opacity==="0.5";D.cssFloat=!!b9.cssFloat;cb.style.backgroundClip="content-box";cb.cloneNode(true).style.backgroundClip="";D.clearCloneStyle=cb.style.backgroundClip==="content-box";D.boxSizing=b9.boxSizing===""||b9.MozBoxSizing===""||b9.WebkitBoxSizing==="";bI.extend(D,{reliableHiddenOffsets:function(){if(b8==null){e()}return b8},boxSizingReliable:function(){if(b6==null){e()}return b6},pixelPosition:function(){if(ca==null){e()}return ca},reliableMarginRight:function(){if(i==null){e()}return i}});function e(){var cf,cc,cd,ce;cc=n.getElementsByTagName("body")[0];if(!cc||!cc.style){return}cf=n.createElement("div");cd=n.createElement("div");cd.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";cc.appendChild(cd).appendChild(cf);cf.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute";ca=b6=false;i=true;if(a5.getComputedStyle){ca=(a5.getComputedStyle(cf,null)||{}).top!=="1%";b6=(a5.getComputedStyle(cf,null)||{width:"4px"}).width==="4px";ce=cf.appendChild(n.createElement("div"));ce.style.cssText=cf.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0";ce.style.marginRight=ce.style.width="0";cf.style.width="1px";i=!parseFloat((a5.getComputedStyle(ce,null)||{}).marginRight);cf.removeChild(ce)}cf.innerHTML="
    t
    ";ce=cf.getElementsByTagName("td");ce[0].style.cssText="margin:0;border:0;padding:0;display:none";b8=ce[0].offsetHeight===0;if(b8){ce[0].style.display="";ce[1].style.display="none";b8=ce[0].offsetHeight===0}cc.removeChild(cd)}})();bI.swap=function(b9,b8,ca,b7){var b6,i,e={};for(i in b8){e[i]=b9.style[i];b9.style[i]=b8[i]}b6=ca.apply(b9,b7||[]);for(i in b8){b9.style[i]=e[i]}return b6};var bj=/alpha\([^)]*\)/i,aU=/opacity\s*=\s*([^)]*)/,H=/^(none|table(?!-c[ea]).+)/,bb=new RegExp("^("+aE+")(.*)$","i"),V=new RegExp("^([+-])=("+aE+")","i"),be={position:"absolute",visibility:"hidden",display:"block"},bD={letterSpacing:"0",fontWeight:"400"},aw=["Webkit","O","Moz","ms"];function c(b8,b6){if(b6 in b8){return b6}var b9=b6.charAt(0).toUpperCase()+b6.slice(1),e=b6,b7=aw.length;while(b7--){b6=aw[b7]+b9;if(b6 in b8){return b6}}return e}function s(ca,e){var cb,b8,b9,i=[],b6=0,b7=ca.length;for(;b6=1||b9==="")&&bI.trim(b6.replace(bj,""))===""&&b7.removeAttribute){b7.removeAttribute("filter");if(b9===""||i&&!i.filter){return}}b7.filter=bj.test(b6)?b6.replace(bj,e):b6+" "+e}}}bI.cssHooks.marginRight=a7(D.reliableMarginRight,function(i,e){if(e){return bI.swap(i,{display:"inline-block"},G,[i,"marginRight"])}});bI.each({margin:"",padding:"",border:"Width"},function(e,i){bI.cssHooks[e+i]={expand:function(b8){var b7=0,b6={},b9=typeof b8==="string"?b8.split(" "):[b8];for(;b7<4;b7++){b6[e+bT[b7]+i]=b9[b7]||b9[b7-2]||b9[0]}return b6}};if(!aZ.test(e)){bI.cssHooks[e+i].set=aN}});bI.fn.extend({css:function(e,i){return aB(this,function(ca,b7,cb){var b9,b6,cc={},b8=0;if(bI.isArray(b7)){b9=bq(ca);b6=b7.length;for(;b81)},show:function(){return s(this,true)},hide:function(){return s(this)},toggle:function(e){if(typeof e==="boolean"){return e?this.show():this.hide()}return this.each(function(){if(S(this)){bI(this).show()}else{bI(this).hide()}})}});function J(b6,i,b8,e,b7){return new J.prototype.init(b6,i,b8,e,b7)}bI.Tween=J;J.prototype={constructor:J,init:function(b7,i,b9,e,b8,b6){this.elem=b7;this.prop=b9;this.easing=b8||"swing";this.options=i;this.start=this.now=this.cur();this.end=e;this.unit=b6||(bI.cssNumber[b9]?"":"px")},cur:function(){var e=J.propHooks[this.prop];return e&&e.get?e.get(this):J.propHooks._default.get(this)},run:function(b6){var i,e=J.propHooks[this.prop];if(this.options.duration){this.pos=i=bI.easing[this.easing](b6,this.options.duration*b6,0,1,this.options.duration)}else{this.pos=i=b6}this.now=(this.end-this.start)*i+this.start;if(this.options.step){this.options.step.call(this.elem,this.now,this)}if(e&&e.set){e.set(this)}else{J.propHooks._default.set(this)}return this}};J.prototype.init.prototype=J.prototype;J.propHooks={_default:{get:function(i){var e;if(i.elem[i.prop]!=null&&(!i.elem.style||i.elem.style[i.prop]==null)){return i.elem[i.prop]}e=bI.css(i.elem,i.prop,"");return !e||e==="auto"?0:e},set:function(e){if(bI.fx.step[e.prop]){bI.fx.step[e.prop](e)}else{if(e.elem.style&&(e.elem.style[bI.cssProps[e.prop]]!=null||bI.cssHooks[e.prop])){bI.style(e.elem,e.prop,e.now+e.unit)}else{e.elem[e.prop]=e.now}}}}};J.propHooks.scrollTop=J.propHooks.scrollLeft={set:function(e){if(e.elem.nodeType&&e.elem.parentNode){e.elem[e.prop]=e.now}}};bI.easing={linear:function(e){return e},swing:function(e){return 0.5-Math.cos(e*Math.PI)/2}};bI.fx=J.prototype.init;bI.fx.step={};var N,ae,bR=/^(?:toggle|show|hide)$/,bJ=new RegExp("^(?:([+-])=|)("+aE+")([a-z%]*)$","i"),bP=/queueHooks$/,aG=[h],a2={"*":[function(e,ca){var cc=this.createTween(e,ca),b8=cc.cur(),b7=bJ.exec(ca),cb=b7&&b7[3]||(bI.cssNumber[e]?"":"px"),i=(bI.cssNumber[e]||cb!=="px"&&+b8)&&bJ.exec(bI.css(cc.elem,e)),b6=1,b9=20;if(i&&i[3]!==cb){cb=cb||i[3];b7=b7||[];i=+b8||1;do{b6=b6||".5";i=i/b6;bI.style(cc.elem,e,i+cb)}while(b6!==(b6=cc.cur()/b8)&&b6!==1&&--b9)}if(b7){i=cc.start=+i||+b8||0;cc.unit=cb;cc.end=b7[1]?i+(b7[1]+1)*b7[2]:+b7[2]}return cc}]};function bn(){setTimeout(function(){N=undefined});return(N=bI.now())}function bH(b7,b9){var b8,e={height:b7},b6=0;b9=b9?1:0;for(;b6<4;b6+=2-b9){b8=bT[b6];e["margin"+b8]=e["padding"+b8]=b7}if(b9){e.opacity=e.width=b7}return e}function bd(b8,ca,b7){var i,b9=(a2[ca]||[]).concat(a2["*"]),e=0,b6=b9.length;for(;e
    a";i=b8.getElementsByTagName("a")[0];e=n.createElement("select");b7=e.appendChild(n.createElement("option"));b6=b8.getElementsByTagName("input")[0];i.style.cssText="top:1px";D.getSetAttribute=b8.className!=="t";D.style=/top/.test(i.getAttribute("style"));D.hrefNormalized=i.getAttribute("href")==="/a";D.checkOn=!!b6.value;D.optSelected=b7.selected;D.enctype=!!n.createElement("form").enctype;e.disabled=true;D.optDisabled=!b7.disabled;b6=n.createElement("input");b6.setAttribute("value","");D.input=b6.getAttribute("value")==="";b6.value="t";b6.setAttribute("type","radio");D.radioValue=b6.value==="t"})();var al=/\r/g;bI.fn.extend({val:function(b7){var e,i,b8,b6=this[0];if(!arguments.length){if(b6){e=bI.valHooks[b6.type]||bI.valHooks[b6.nodeName.toLowerCase()];if(e&&"get" in e&&(i=e.get(b6,"value"))!==undefined){return i}i=b6.value;return typeof i==="string"?i.replace(al,""):i==null?"":i}return}b8=bI.isFunction(b7);return this.each(function(b9){var ca;if(this.nodeType!==1){return}if(b8){ca=b7.call(this,b9,bI(this).val())}else{ca=b7}if(ca==null){ca=""}else{if(typeof ca==="number"){ca+=""}else{if(bI.isArray(ca)){ca=bI.map(ca,function(cb){return cb==null?"":cb+""})}}}e=bI.valHooks[this.type]||bI.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,ca,"value")===undefined){this.value=ca}})}});bI.extend({valHooks:{option:{get:function(e){var i=bI.find.attr(e,"value");return i!=null?i:bI.trim(bI.text(e))}},select:{get:function(e){var cb,b7,cd=e.options,b9=e.selectedIndex,b8=e.type==="select-one"||b9<0,cc=b8?null:[],ca=b8?b9+1:cd.length,b6=b9<0?ca:b8?b9:0;for(;b6=0){try{b9.selected=cc=true}catch(b6){b9.scrollHeight}}else{b9.selected=false}}if(!cc){ca.selectedIndex=-1}return b7}}}});bI.each(["radio","checkbox"],function(){bI.valHooks[this]={set:function(e,i){if(bI.isArray(i)){return(e.checked=bI.inArray(bI(e).val(),i)>=0)}}};if(!D.checkOn){bI.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value}}});var ba,b3,bO=bI.expr.attrHandle,aq=/^(?:checked|selected)$/i,bN=D.getSetAttribute,bF=D.input;bI.fn.extend({attr:function(e,i){return aB(this,bI.attr,e,i,arguments.length>1)},removeAttr:function(e){return this.each(function(){bI.removeAttr(this,e)})}});bI.extend({attr:function(b8,b7,b9){var e,b6,i=b8.nodeType;if(!b8||i===3||i===8||i===2){return}if(typeof b8.getAttribute===aC){return bI.prop(b8,b7,b9)}if(i!==1||!bI.isXMLDoc(b8)){b7=b7.toLowerCase();e=bI.attrHooks[b7]||(bI.expr.match.bool.test(b7)?b3:ba)}if(b9!==undefined){if(b9===null){bI.removeAttr(b8,b7)}else{if(e&&"set" in e&&(b6=e.set(b8,b9,b7))!==undefined){return b6}else{b8.setAttribute(b7,b9+"");return b9}}}else{if(e&&"get" in e&&(b6=e.get(b8,b7))!==null){return b6}else{b6=bI.find.attr(b8,b7);return b6==null?undefined:b6}}},removeAttr:function(b7,b9){var e,b8,b6=0,ca=b9&&b9.match(aF);if(ca&&b7.nodeType===1){while((e=ca[b6++])){b8=bI.propFix[e]||e;if(bI.expr.match.bool.test(e)){if(bF&&bN||!aq.test(e)){b7[b8]=false}else{b7[bI.camelCase("default-"+e)]=b7[b8]=false}}else{bI.attr(b7,e,"")}b7.removeAttribute(bN?e:b8)}}},attrHooks:{type:{set:function(e,i){if(!D.radioValue&&i==="radio"&&bI.nodeName(e,"input")){var b6=e.value;e.setAttribute("type",i);if(b6){e.value=b6}return i}}}}});b3={set:function(i,b6,e){if(b6===false){bI.removeAttr(i,e)}else{if(bF&&bN||!aq.test(e)){i.setAttribute(!bN&&bI.propFix[e]||e,e)}else{i[bI.camelCase("default-"+e)]=i[e]=true}}return e}};bI.each(bI.expr.match.bool.source.match(/\w+/g),function(b7,b6){var e=bO[b6]||bI.find.attr;bO[b6]=bF&&bN||!aq.test(b6)?function(b9,b8,cb){var i,ca;if(!cb){ca=bO[b8];bO[b8]=i;i=e(b9,b8,cb)!=null?b8.toLowerCase():null;bO[b8]=ca}return i}:function(b8,i,b9){if(!b9){return b8[bI.camelCase("default-"+i)]?i.toLowerCase():null}}});if(!bF||!bN){bI.attrHooks.value={set:function(i,b6,e){if(bI.nodeName(i,"input")){i.defaultValue=b6}else{return ba&&ba.set(i,b6,e)}}}}if(!bN){ba={set:function(b6,b7,i){var e=b6.getAttributeNode(i);if(!e){b6.setAttributeNode((e=b6.ownerDocument.createAttribute(i)))}e.value=b7+="";if(i==="value"||b7===b6.getAttribute(i)){return b7}}};bO.id=bO.name=bO.coords=function(b6,i,b7){var e;if(!b7){return(e=b6.getAttributeNode(i))&&e.value!==""?e.value:null}};bI.valHooks.button={get:function(b6,i){var e=b6.getAttributeNode(i);if(e&&e.specified){return e.value}},set:ba.set};bI.attrHooks.contenteditable={set:function(i,b6,e){ba.set(i,b6===""?false:b6,e)}};bI.each(["width","height"],function(b6,e){bI.attrHooks[e]={set:function(i,b7){if(b7===""){i.setAttribute(e,"auto");return b7}}}})}if(!D.style){bI.attrHooks.style={get:function(e){return e.style.cssText||undefined},set:function(e,i){return(e.style.cssText=i+"")}}}var aJ=/^(?:input|select|textarea|button|object)$/i,F=/^(?:a|area)$/i;bI.fn.extend({prop:function(e,i){return aB(this,bI.prop,e,i,arguments.length>1)},removeProp:function(e){e=bI.propFix[e]||e;return this.each(function(){try{this[e]=undefined;delete this[e]}catch(i){}})}});bI.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(b9,b7,ca){var b6,e,b8,i=b9.nodeType;if(!b9||i===3||i===8||i===2){return}b8=i!==1||!bI.isXMLDoc(b9);if(b8){b7=bI.propFix[b7]||b7;e=bI.propHooks[b7]}if(ca!==undefined){return e&&"set" in e&&(b6=e.set(b9,ca,b7))!==undefined?b6:(b9[b7]=ca)}else{return e&&"get" in e&&(b6=e.get(b9,b7))!==null?b6:b9[b7]}},propHooks:{tabIndex:{get:function(i){var e=bI.find.attr(i,"tabindex");return e?parseInt(e,10):aJ.test(i.nodeName)||F.test(i.nodeName)&&i.href?0:-1}}}});if(!D.hrefNormalized){bI.each(["href","src"],function(b6,e){bI.propHooks[e]={get:function(i){return i.getAttribute(e,4)}}})}if(!D.optSelected){bI.propHooks.selected={get:function(i){var e=i.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}}}bI.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){bI.propFix[this.toLowerCase()]=this});if(!D.enctype){bI.propFix.enctype="encoding"}var bL=/[\t\r\n\f]/g;bI.fn.extend({addClass:function(cd){var b7,b6,ce,cb,b8,e,b9=0,ca=this.length,cc=typeof cd==="string"&&cd;if(bI.isFunction(cd)){return this.each(function(i){bI(this).addClass(cd.call(this,i,this.className))})}if(cc){b7=(cd||"").match(aF)||[];for(;b9=0){ce=ce.replace(" "+cb+" "," ")}}e=cd?bI.trim(ce):"";if(b6.className!==e){b6.className=e}}}}return this},toggleClass:function(b6,e){var i=typeof b6;if(typeof e==="boolean"&&i==="string"){return e?this.addClass(b6):this.removeClass(b6)}if(bI.isFunction(b6)){return this.each(function(b7){bI(this).toggleClass(b6.call(this,b7,this.className,e),e)})}return this.each(function(){if(i==="string"){var b9,b8=0,b7=bI(this),ca=b6.match(aF)||[];while((b9=ca[b8++])){if(b7.hasClass(b9)){b7.removeClass(b9)}else{b7.addClass(b9)}}}else{if(i===aC||i==="boolean"){if(this.className){bI._data(this,"__className__",this.className)}this.className=this.className||b6===false?"":bI._data(this,"__className__")||""}}})},hasClass:function(e){var b8=" "+e+" ",b7=0,b6=this.length;for(;b7=0){return true}}return false}});bI.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(b6,e){bI.fn[e]=function(b7,i){return arguments.length>0?this.on(e,null,b7,i):this.trigger(e)}});bI.fn.extend({hover:function(e,i){return this.mouseenter(e).mouseleave(i||e)},bind:function(e,b6,i){return this.on(e,null,b6,i)},unbind:function(e,i){return this.off(e,null,i)},delegate:function(e,i,b7,b6){return this.on(i,e,b7,b6)},undelegate:function(e,i,b6){return arguments.length===1?this.off(e,"**"):this.off(i,e||"**",b6)}});var bp=bI.now();var bQ=(/\?/);var a1=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;bI.parseJSON=function(e){if(a5.JSON&&a5.JSON.parse){return a5.JSON.parse(e+"")}var b7,b6=null,i=bI.trim(e+"");return i&&!bI.trim(i.replace(a1,function(ca,b8,b9,cb){if(b7&&b8){b6=0}if(b6===0){return ca}b7=b9||b8;b6+=!cb-!b9;return""}))?(Function("return "+i))():bI.error("Invalid JSON: "+e)};bI.parseXML=function(b7){var i,b6;if(!b7||typeof b7!=="string"){return null}try{if(a5.DOMParser){b6=new DOMParser();i=b6.parseFromString(b7,"text/xml")}else{i=new ActiveXObject("Microsoft.XMLDOM");i.async="false";i.loadXML(b7)}}catch(b8){i=undefined}if(!i||!i.documentElement||i.getElementsByTagName("parsererror").length){bI.error("Invalid XML: "+b7)}return i};var b4,aa,ap=/#.*$/,R=/([?&])_=[^&]*/,ah=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,C=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,r=/^(?:GET|HEAD)$/,aK=/^\/\//,aV=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,w={},a9={},aX="*/".concat("*");try{aa=location.href}catch(bi){aa=n.createElement("a");aa.href="";aa=aa.href}b4=aV.exec(aa.toLowerCase())||[];function bK(e){return function(b9,ca){if(typeof b9!=="string"){ca=b9;b9="*"}var b6,b7=0,b8=b9.toLowerCase().match(aF)||[];if(bI.isFunction(ca)){while((b6=b8[b7++])){if(b6.charAt(0)==="+"){b6=b6.slice(1)||"*";(e[b6]=e[b6]||[]).unshift(ca)}else{(e[b6]=e[b6]||[]).push(ca)}}}}}function p(e,b6,ca,b7){var i={},b8=(e===a9);function b9(cb){var cc;i[cb]=true;bI.each(e[cb]||[],function(ce,cd){var cf=cd(b6,ca,b7);if(typeof cf==="string"&&!b8&&!i[cf]){b6.dataTypes.unshift(cf);b9(cf);return false}else{if(b8){return !(cc=cf)}}});return cc}return b9(b6.dataTypes[0])||!i["*"]&&b9("*")}function t(b6,b7){var e,i,b8=bI.ajaxSettings.flatOptions||{};for(i in b7){if(b7[i]!==undefined){(b8[i]?b6:(e||(e={})))[i]=b7[i]}}if(e){bI.extend(true,b6,e)}return b6}function g(cc,cb,b8){var e,b7,b6,b9,i=cc.contents,ca=cc.dataTypes;while(ca[0]==="*"){ca.shift();if(b7===undefined){b7=cc.mimeType||cb.getResponseHeader("Content-Type")}}if(b7){for(b9 in i){if(i[b9]&&i[b9].test(b7)){ca.unshift(b9);break}}}if(ca[0] in b8){b6=ca[0]}else{for(b9 in b8){if(!ca[0]||cc.converters[b9+" "+ca[0]]){b6=b9;break}if(!e){e=b9}}b6=b6||e}if(b6){if(b6!==ca[0]){ca.unshift(b6)}return b8[b6]}}function ag(cg,b8,cd,b6){var i,cb,ce,b9,b7,cf={},cc=cg.dataTypes.slice();if(cc[1]){for(ce in cg.converters){cf[ce.toLowerCase()]=cg.converters[ce]}}cb=cc.shift();while(cb){if(cg.responseFields[cb]){cd[cg.responseFields[cb]]=b8}if(!b7&&b6&&cg.dataFilter){b8=cg.dataFilter(b8,cg.dataType)}b7=cb;cb=cc.shift();if(cb){if(cb==="*"){cb=b7}else{if(b7!=="*"&&b7!==cb){ce=cf[b7+" "+cb]||cf["* "+cb];if(!ce){for(i in cf){b9=i.split(" ");if(b9[1]===cb){ce=cf[b7+" "+b9[0]]||cf["* "+b9[0]];if(ce){if(ce===true){ce=cf[i]}else{if(cf[i]!==true){cb=b9[0];cc.unshift(b9[1])}}break}}}}if(ce!==true){if(ce&&cg["throws"]){b8=ce(b8)}else{try{b8=ce(b8)}catch(ca){return{state:"parsererror",error:ce?ca:"No conversion from "+b7+" to "+cb}}}}}}}}return{state:"success",data:b8}}bI.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:aa,type:"GET",isLocal:C.test(b4[1]),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":aX,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":bI.parseJSON,"text xml":bI.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(i,e){return e?t(t(i,bI.ajaxSettings),e):t(bI.ajaxSettings,i)},ajaxPrefilter:bK(w),ajaxTransport:bK(a9),ajax:function(ca,b7){if(typeof ca==="object"){b7=ca;ca=undefined}b7=b7||{};var cj,cl,cb,cq,cf,b6,cm,b8,ce=bI.ajaxSetup({},b7),cs=ce.context||ce,ch=ce.context&&(cs.nodeType||cs.jquery)?bI(cs):bI.event,cr=bI.Deferred(),co=bI.Callbacks("once memory"),cc=ce.statusCode||{},ci={},cp={},b9=0,cd="canceled",ck={readyState:0,getResponseHeader:function(i){var e;if(b9===2){if(!b8){b8={};while((e=ah.exec(cq))){b8[e[1].toLowerCase()]=e[2]}}e=b8[i.toLowerCase()]}return e==null?null:e},getAllResponseHeaders:function(){return b9===2?cq:null},setRequestHeader:function(i,ct){var e=i.toLowerCase();if(!b9){i=cp[e]=cp[e]||i;ci[i]=ct}return this},overrideMimeType:function(e){if(!b9){ce.mimeType=e}return this},statusCode:function(i){var e;if(i){if(b9<2){for(e in i){cc[e]=[cc[e],i[e]]}}else{ck.always(i[ck.status])}}return this},abort:function(i){var e=i||cd;if(cm){cm.abort(e)}cg(0,e);return this}};cr.promise(ck).complete=co.add;ck.success=ck.done;ck.error=ck.fail;ce.url=((ca||ce.url||aa)+"").replace(ap,"").replace(aK,b4[1]+"//");ce.type=b7.method||b7.type||ce.method||ce.type;ce.dataTypes=bI.trim(ce.dataType||"*").toLowerCase().match(aF)||[""];if(ce.crossDomain==null){cj=aV.exec(ce.url.toLowerCase());ce.crossDomain=!!(cj&&(cj[1]!==b4[1]||cj[2]!==b4[2]||(cj[3]||(cj[1]==="http:"?"80":"443"))!==(b4[3]||(b4[1]==="http:"?"80":"443"))))}if(ce.data&&ce.processData&&typeof ce.data!=="string"){ce.data=bI.param(ce.data,ce.traditional)}p(w,ce,b7,ck);if(b9===2){return ck}b6=bI.event&&ce.global;if(b6&&bI.active++===0){bI.event.trigger("ajaxStart")}ce.type=ce.type.toUpperCase();ce.hasContent=!r.test(ce.type);cb=ce.url;if(!ce.hasContent){if(ce.data){cb=(ce.url+=(bQ.test(cb)?"&":"?")+ce.data);delete ce.data}if(ce.cache===false){ce.url=R.test(cb)?cb.replace(R,"$1_="+bp++):cb+(bQ.test(cb)?"&":"?")+"_="+bp++}}if(ce.ifModified){if(bI.lastModified[cb]){ck.setRequestHeader("If-Modified-Since",bI.lastModified[cb])}if(bI.etag[cb]){ck.setRequestHeader("If-None-Match",bI.etag[cb])}}if(ce.data&&ce.hasContent&&ce.contentType!==false||b7.contentType){ck.setRequestHeader("Content-Type",ce.contentType)}ck.setRequestHeader("Accept",ce.dataTypes[0]&&ce.accepts[ce.dataTypes[0]]?ce.accepts[ce.dataTypes[0]]+(ce.dataTypes[0]!=="*"?", "+aX+"; q=0.01":""):ce.accepts["*"]);for(cl in ce.headers){ck.setRequestHeader(cl,ce.headers[cl])}if(ce.beforeSend&&(ce.beforeSend.call(cs,ck,ce)===false||b9===2)){return ck.abort()}cd="abort";for(cl in {success:1,error:1,complete:1}){ck[cl](ce[cl])}cm=p(a9,ce,b7,ck);if(!cm){cg(-1,"No Transport")}else{ck.readyState=1;if(b6){ch.trigger("ajaxSend",[ck,ce])}if(ce.async&&ce.timeout>0){cf=setTimeout(function(){ck.abort("timeout")},ce.timeout)}try{b9=1;cm.send(ci,cg)}catch(cn){if(b9<2){cg(-1,cn)}else{throw cn}}}function cg(cw,i,cx,cu){var e,cA,cy,cv,cz,ct=i;if(b9===2){return}b9=2;if(cf){clearTimeout(cf)}cm=undefined;cq=cu||"";ck.readyState=cw>0?4:0;e=cw>=200&&cw<300||cw===304;if(cx){cv=g(ce,ck,cx)}cv=ag(ce,cv,ck,e);if(e){if(ce.ifModified){cz=ck.getResponseHeader("Last-Modified");if(cz){bI.lastModified[cb]=cz}cz=ck.getResponseHeader("etag");if(cz){bI.etag[cb]=cz}}if(cw===204||ce.type==="HEAD"){ct="nocontent"}else{if(cw===304){ct="notmodified"}else{ct=cv.state;cA=cv.data;cy=cv.error;e=!cy}}}else{cy=ct;if(cw||!ct){ct="error";if(cw<0){cw=0}}}ck.status=cw;ck.statusText=(i||ct)+"";if(e){cr.resolveWith(cs,[cA,ct,ck])}else{cr.rejectWith(cs,[ck,ct,cy])}ck.statusCode(cc);cc=undefined;if(b6){ch.trigger(e?"ajaxSuccess":"ajaxError",[ck,ce,e?cA:cy])}co.fireWith(cs,[ck,ct]);if(b6){ch.trigger("ajaxComplete",[ck,ce]);if(!(--bI.active)){bI.event.trigger("ajaxStop")}}}return ck},getJSON:function(e,i,b6){return bI.get(e,i,b6,"json")},getScript:function(e,i){return bI.get(e,undefined,i,"script")}});bI.each(["get","post"],function(e,b6){bI[b6]=function(i,b8,b9,b7){if(bI.isFunction(b8)){b7=b7||b9;b9=b8;b8=undefined}return bI.ajax({url:i,type:b6,dataType:b7,data:b8,success:b9})}});bI._evalUrl=function(e){return bI.ajax({url:e,type:"GET",dataType:"script",async:false,global:false,"throws":true})};bI.fn.extend({wrapAll:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapAll(e.call(this,b6))})}if(this[0]){var i=bI(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){i.insertBefore(this[0])}i.map(function(){var b6=this;while(b6.firstChild&&b6.firstChild.nodeType===1){b6=b6.firstChild}return b6}).append(this)}return this},wrapInner:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapInner(e.call(this,b6))})}return this.each(function(){var i=bI(this),b6=i.contents();if(b6.length){b6.wrapAll(e)}else{i.append(e)}})},wrap:function(e){var i=bI.isFunction(e);return this.each(function(b6){bI(this).wrapAll(i?e.call(this,b6):e)})},unwrap:function(){return this.parent().each(function(){if(!bI.nodeName(this,"body")){bI(this).replaceWith(this.childNodes)}}).end()}});bI.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||(!D.reliableHiddenOffsets()&&((e.style&&e.style.display)||bI.css(e,"display"))==="none")};bI.expr.filters.visible=function(e){return !bI.expr.filters.hidden(e)};var bw=/%20/g,aS=/\[\]$/,X=/\r?\n/g,b=/^(?:submit|button|image|reset|file)$/i,au=/^(?:input|select|textarea|keygen)/i;function j(b6,b8,i,b7){var e;if(bI.isArray(b8)){bI.each(b8,function(ca,b9){if(i||aS.test(b6)){b7(b6,b9)}else{j(b6+"["+(typeof b9==="object"?ca:"")+"]",b9,i,b7)}})}else{if(!i&&bI.type(b8)==="object"){for(e in b8){j(b6+"["+e+"]",b8[e],i,b7)}}else{b7(b6,b8)}}}bI.param=function(e,b6){var b7,i=[],b8=function(b9,ca){ca=bI.isFunction(ca)?ca():(ca==null?"":ca);i[i.length]=encodeURIComponent(b9)+"="+encodeURIComponent(ca)};if(b6===undefined){b6=bI.ajaxSettings&&bI.ajaxSettings.traditional}if(bI.isArray(e)||(e.jquery&&!bI.isPlainObject(e))){bI.each(e,function(){b8(this.name,this.value)})}else{for(b7 in e){j(b7,e[b7],b6,b8)}}return i.join("&").replace(bw,"+")};bI.fn.extend({serialize:function(){return bI.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=bI.prop(this,"elements");return e?bI.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!bI(this).is(":disabled")&&au.test(this.nodeName)&&!b.test(e)&&(this.checked||!aM.test(e))}).map(function(e,b6){var b7=bI(this).val();return b7==null?null:bI.isArray(b7)?bI.map(b7,function(i){return{name:b6.name,value:i.replace(X,"\r\n")}}):{name:b6.name,value:b7.replace(X,"\r\n")}}).get()}});bI.ajaxSettings.xhr=a5.ActiveXObject!==undefined?function(){return !this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&bE()||bg()}:bE;var aA=0,aj={},ay=bI.ajaxSettings.xhr();if(a5.attachEvent){a5.attachEvent("onunload",function(){for(var e in aj){aj[e](undefined,true)}})}D.cors=!!ay&&("withCredentials" in ay);ay=D.ajax=!!ay;if(ay){bI.ajaxTransport(function(e){if(!e.crossDomain||D.cors){var i;return{send:function(b9,b6){var b7,b8=e.xhr(),ca=++aA;b8.open(e.type,e.url,e.async,e.username,e.password);if(e.xhrFields){for(b7 in e.xhrFields){b8[b7]=e.xhrFields[b7]}}if(e.mimeType&&b8.overrideMimeType){b8.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!b9["X-Requested-With"]){b9["X-Requested-With"]="XMLHttpRequest"}for(b7 in b9){if(b9[b7]!==undefined){b8.setRequestHeader(b7,b9[b7]+"")}}b8.send((e.hasContent&&e.data)||null);i=function(cd,cc){var cb,cg,ce;if(i&&(cc||b8.readyState===4)){delete aj[ca];i=undefined;b8.onreadystatechange=bI.noop;if(cc){if(b8.readyState!==4){b8.abort()}}else{ce={};cb=b8.status;if(typeof b8.responseText==="string"){ce.text=b8.responseText}try{cg=b8.statusText}catch(cf){cg=""}if(!cb&&e.isLocal&&!e.crossDomain){cb=ce.text?200:404}else{if(cb===1223){cb=204}}}}if(ce){b6(cb,cg,ce,b8.getAllResponseHeaders())}};if(!e.async){i()}else{if(b8.readyState===4){setTimeout(i)}else{b8.onreadystatechange=aj[ca]=i}}},abort:function(){if(i){i(undefined,true)}}}}})}function bE(){try{return new a5.XMLHttpRequest()}catch(i){}}function bg(){try{return new a5.ActiveXObject("Microsoft.XMLHTTP")}catch(i){}}bI.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){bI.globalEval(e);return e}}});bI.ajaxPrefilter("script",function(e){if(e.cache===undefined){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});bI.ajaxTransport("script",function(b6){if(b6.crossDomain){var e,i=n.head||bI("head")[0]||n.documentElement;return{send:function(b7,b8){e=n.createElement("script");e.async=true;if(b6.scriptCharset){e.charset=b6.scriptCharset}e.src=b6.url;e.onload=e.onreadystatechange=function(ca,b9){if(b9||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(e.parentNode){e.parentNode.removeChild(e)}e=null;if(!b9){b8(200,"success")}}};i.insertBefore(e,i.firstChild)},abort:function(){if(e){e.onload(undefined,true)}}}}});var bs=[],a8=/(=)\?(?=&|$)|\?\?/;bI.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=bs.pop()||(bI.expando+"_"+(bp++));this[e]=true;return e}});bI.ajaxPrefilter("json jsonp",function(b7,e,b8){var ca,i,b6,b9=b7.jsonp!==false&&(a8.test(b7.url)?"url":typeof b7.data==="string"&&!(b7.contentType||"").indexOf("application/x-www-form-urlencoded")&&a8.test(b7.data)&&"data");if(b9||b7.dataTypes[0]==="jsonp"){ca=b7.jsonpCallback=bI.isFunction(b7.jsonpCallback)?b7.jsonpCallback():b7.jsonpCallback;if(b9){b7[b9]=b7[b9].replace(a8,"$1"+ca)}else{if(b7.jsonp!==false){b7.url+=(bQ.test(b7.url)?"&":"?")+b7.jsonp+"="+ca}}b7.converters["script json"]=function(){if(!b6){bI.error(ca+" was not called")}return b6[0]};b7.dataTypes[0]="json";i=a5[ca];a5[ca]=function(){b6=arguments};b8.always(function(){a5[ca]=i;if(b7[ca]){b7.jsonpCallback=e.jsonpCallback;bs.push(ca)}if(b6&&bI.isFunction(i)){i(b6[0])}b6=i=undefined});return"script"}});bI.parseHTML=function(b8,b6,b7){if(!b8||typeof b8!=="string"){return null}if(typeof b6==="boolean"){b7=b6;b6=false}b6=b6||n;var i=a.exec(b8),e=!b7&&[];if(i){return[b6.createElement(i[1])]}i=bI.buildFragment([b8],b6,e);if(e&&e.length){bI(e).remove()}return bI.merge([],i.childNodes)};var b1=bI.fn.load;bI.fn.load=function(b7,ca,cb){if(typeof b7!=="string"&&b1){return b1.apply(this,arguments)}var e,b6,b8,i=this,b9=b7.indexOf(" ");if(b9>=0){e=bI.trim(b7.slice(b9,b7.length));b7=b7.slice(0,b9)}if(bI.isFunction(ca)){cb=ca;ca=undefined}else{if(ca&&typeof ca==="object"){b8="POST"}}if(i.length>0){bI.ajax({url:b7,type:b8,dataType:"html",data:ca}).done(function(cc){b6=arguments;i.html(e?bI("
    ").append(bI.parseHTML(cc)).find(e):cc)}).complete(cb&&function(cd,cc){i.each(cb,b6||[cd.responseText,cc,cd])})}return this};bI.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,b6){bI.fn[b6]=function(i){return this.on(b6,i)}});bI.expr.filters.animated=function(e){return bI.grep(bI.timers,function(i){return e===i.elem}).length};var bX=a5.document.documentElement;function br(e){return bI.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}bI.offset={setOffset:function(b7,ch,cb){var cd,ca,e,b8,b6,cf,cg,cc=bI.css(b7,"position"),b9=bI(b7),ce={};if(cc==="static"){b7.style.position="relative"}b6=b9.offset();e=bI.css(b7,"top");cf=bI.css(b7,"left");cg=(cc==="absolute"||cc==="fixed")&&bI.inArray("auto",[e,cf])>-1;if(cg){cd=b9.position();b8=cd.top;ca=cd.left}else{b8=parseFloat(e)||0;ca=parseFloat(cf)||0}if(bI.isFunction(ch)){ch=ch.call(b7,cb,b6)}if(ch.top!=null){ce.top=(ch.top-b6.top)+b8}if(ch.left!=null){ce.left=(ch.left-b6.left)+ca}if("using" in ch){ch.using.call(b7,ce)}else{b9.css(ce)}}};bI.fn.extend({offset:function(i){if(arguments.length){return i===undefined?this:this.each(function(ca){bI.offset.setOffset(this,i,ca)})}var e,b9,b7={top:0,left:0},b6=this[0],b8=b6&&b6.ownerDocument;if(!b8){return}e=b8.documentElement;if(!bI.contains(e,b6)){return b7}if(typeof b6.getBoundingClientRect!==aC){b7=b6.getBoundingClientRect()}b9=br(b8);return{top:b7.top+(b9.pageYOffset||e.scrollTop)-(e.clientTop||0),left:b7.left+(b9.pageXOffset||e.scrollLeft)-(e.clientLeft||0)}},position:function(){if(!this[0]){return}var b6,b7,e={top:0,left:0},i=this[0];if(bI.css(i,"position")==="fixed"){b7=i.getBoundingClientRect()}else{b6=this.offsetParent();b7=this.offset();if(!bI.nodeName(b6[0],"html")){e=b6.offset()}e.top+=bI.css(b6[0],"borderTopWidth",true);e.left+=bI.css(b6[0],"borderLeftWidth",true)}return{top:b7.top-e.top-bI.css(i,"marginTop",true),left:b7.left-e.left-bI.css(i,"marginLeft",true)}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||bX;while(e&&(!bI.nodeName(e,"html")&&bI.css(e,"position")==="static")){e=e.offsetParent}return e||bX})}});bI.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b6,i){var e=/Y/.test(i);bI.fn[b6]=function(b7){return aB(this,function(b8,cb,ca){var b9=br(b8);if(ca===undefined){return b9?(i in b9)?b9[i]:b9.document.documentElement[cb]:b8[cb]}if(b9){b9.scrollTo(!e?ca:bI(b9).scrollLeft(),e?ca:bI(b9).scrollTop())}else{b8[cb]=ca}},b6,b7,arguments.length,null)}});bI.each(["top","left"],function(e,b6){bI.cssHooks[b6]=a7(D.pixelPosition,function(b7,i){if(i){i=G(b7,b6);return Y.test(i)?bI(b7).position()[b6]+"px":i}})});bI.each({Height:"height",Width:"width"},function(e,i){bI.each({padding:"inner"+e,content:i,"":"outer"+e},function(b6,b7){bI.fn[b7]=function(cb,ca){var b9=arguments.length&&(b6||typeof cb!=="boolean"),b8=b6||(cb===true||ca===true?"margin":"border");return aB(this,function(cd,cc,ce){var cf;if(bI.isWindow(cd)){return cd.document.documentElement["client"+e]}if(cd.nodeType===9){cf=cd.documentElement;return Math.max(cd.body["scroll"+e],cf["scroll"+e],cd.body["offset"+e],cf["offset"+e],cf["client"+e])}return ce===undefined?bI.css(cd,cc,b8):bI.style(cd,cc,ce,b8)},i,b9?cb:undefined,b9,null)}})});bI.fn.size=function(){return this.length};bI.fn.andSelf=bI.fn.addBack;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return bI})}var bk=a5.jQuery,I=a5.$;bI.noConflict=function(e){if(a5.$===bI){a5.$=I}if(e&&a5.jQuery===bI){a5.jQuery=bk}return bI};if(typeof av===aC){a5.jQuery=a5.$=bI}return bI}));!function(a){a(function(){a.support.transition=(function(){var b=(function(){var e=document.createElement("bootstrap"),d={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in d){if(e.style[c]!==undefined){return d[c]}}}());return b&&{end:b}})()})}(window.jQuery);!function(d){var c='[data-dismiss="alert"]',b=function(e){d(e).on("click",c,this.close)};b.prototype.close=function(j){var i=d(this),g=i.attr("data-target"),h;if(!g){g=i.attr("href");g=g&&g.replace(/.*(?=#[^\s]*$)/,"")}h=d(g);j&&j.preventDefault();h.length||(h=i.hasClass("alert")?i:i.parent());h.trigger(j=d.Event("close"));if(j.isDefaultPrevented()){return}h.removeClass("in");function f(){h.trigger("closed").remove()}d.support.transition&&h.hasClass("fade")?h.on(d.support.transition.end,f):f()};var a=d.fn.alert;d.fn.alert=function(e){return this.each(function(){var g=d(this),f=g.data("alert");if(!f){g.data("alert",(f=new b(this)))}if(typeof e=="string"){f[e].call(g)}})};d.fn.alert.Constructor=b;d.fn.alert.noConflict=function(){d.fn.alert=a;return this};d(document).on("click.alert.data-api",c,b.prototype.close)}(window.jQuery);!function(c){var b=function(e,d){this.$element=c(e);this.options=c.extend({},c.fn.button.defaults,d)};b.prototype.setState=function(g){var i="disabled",e=this.$element,f=e.data(),h=e.is("input")?"val":"html";g=g+"Text";f.resetText||e.data("resetText",e[h]());e[h](f[g]||this.options[g]);setTimeout(function(){g=="loadingText"?e.addClass(i).attr(i,i):e.removeClass(i).removeAttr(i)},0)};b.prototype.toggle=function(){var d=this.$element.closest('[data-toggle="buttons-radio"]');d&&d.find(".active").removeClass("active");this.$element.toggleClass("active")};var a=c.fn.button;c.fn.button=function(d){return this.each(function(){var g=c(this),f=g.data("button"),e=typeof d=="object"&&d;if(!f){g.data("button",(f=new b(this,e)))}if(d=="toggle"){f.toggle()}else{if(d){f.setState(d)}}})};c.fn.button.defaults={loadingText:"loading..."};c.fn.button.Constructor=b;c.fn.button.noConflict=function(){c.fn.button=a;return this};c(document).on("click.button.data-api","[data-toggle^=button]",function(f){var d=c(f.target);if(!d.hasClass("btn")){d=d.closest(".btn")}d.button("toggle")})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.$indicators=this.$element.find(".carousel-indicators");this.options=d;this.options.pause=="hover"&&this.$element.on("mouseenter",b.proxy(this.pause,this)).on("mouseleave",b.proxy(this.cycle,this))};c.prototype={cycle:function(d){if(!d){this.paused=false}if(this.interval){clearInterval(this.interval)}this.options.interval&&!this.paused&&(this.interval=setInterval(b.proxy(this.next,this),this.options.interval));return this},getActiveIndex:function(){this.$active=this.$element.find(".item.active");this.$items=this.$active.parent().children();return this.$items.index(this.$active)},to:function(f){var d=this.getActiveIndex(),e=this;if(f>(this.$items.length-1)||f<0){return}if(this.sliding){return this.$element.one("slid",function(){e.to(f)})}if(d==f){return this.pause().cycle()}return this.slide(f>d?"next":"prev",b(this.$items[f]))},pause:function(d){if(!d){this.paused=true}if(this.$element.find(".next, .prev").length&&b.support.transition.end){this.$element.trigger(b.support.transition.end);this.cycle(true)}clearInterval(this.interval);this.interval=null;return this},next:function(){if(this.sliding){return}return this.slide("next")},prev:function(){if(this.sliding){return}return this.slide("prev")},slide:function(k,f){var m=this.$element.find(".item.active"),d=f||m[k](),j=this.interval,l=k=="next"?"left":"right",g=k=="next"?"first":"last",h=this,i;this.sliding=true;j&&this.pause();d=d.length?d:this.$element.find(".item")[g]();i=b.Event("slide",{relatedTarget:d[0],direction:l});if(d.hasClass("active")){return}if(this.$indicators.length){this.$indicators.find(".active").removeClass("active");this.$element.one("slid",function(){var e=b(h.$indicators.children()[h.getActiveIndex()]);e&&e.addClass("active")})}if(b.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(i);if(i.isDefaultPrevented()){return}d.addClass(k);d[0].offsetWidth;m.addClass(l);d.addClass(l);this.$element.one(b.support.transition.end,function(){d.removeClass([k,l].join(" ")).addClass("active");m.removeClass(["active",l].join(" "));h.sliding=false;setTimeout(function(){h.$element.trigger("slid")},0)})}else{this.$element.trigger(i);if(i.isDefaultPrevented()){return}m.removeClass("active");d.addClass("active");this.sliding=false;this.$element.trigger("slid")}j&&this.cycle();return this}};var a=b.fn.carousel;b.fn.carousel=function(d){return this.each(function(){var h=b(this),g=h.data("carousel"),e=b.extend({},b.fn.carousel.defaults,typeof d=="object"&&d),f=typeof d=="string"?d:e.slide;if(!g){h.data("carousel",(g=new c(this,e)))}if(typeof d=="number"){g.to(d)}else{if(f){g[f]()}else{if(e.interval){g.pause().cycle()}}}})};b.fn.carousel.defaults={interval:5000,pause:"hover"};b.fn.carousel.Constructor=c;b.fn.carousel.noConflict=function(){b.fn.carousel=a;return this};b(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(j){var i=b(this),f,d=b(i.attr("data-target")||(f=i.attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")),g=b.extend({},d.data(),i.data()),h;d.carousel(g);if(h=i.attr("data-slide-to")){d.data("carousel").pause().to(h).cycle()}j.preventDefault()})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.options=b.extend({},b.fn.collapse.defaults,d);if(this.options.parent){this.$parent=b(this.options.parent)}this.options.toggle&&this.toggle()};c.prototype={constructor:c,dimension:function(){var d=this.$element.hasClass("width");return d?"width":"height"},show:function(){var g,d,f,e;if(this.transitioning||this.$element.hasClass("in")){return}g=this.dimension();d=b.camelCase(["scroll",g].join("-"));f=this.$parent&&this.$parent.find("> .accordion-group > .in");if(f&&f.length){e=f.data("collapse");if(e&&e.transitioning){return}f.collapse("hide");e||f.data("collapse",null)}this.$element[g](0);this.transition("addClass",b.Event("show"),"shown");b.support.transition&&this.$element[g](this.$element[0][d])},hide:function(){var d;if(this.transitioning||!this.$element.hasClass("in")){return}d=this.dimension();this.reset(this.$element[d]());this.transition("removeClass",b.Event("hide"),"hidden");this.$element[d](0)},reset:function(d){var e=this.dimension();this.$element.removeClass("collapse")[e](d||"auto")[0].offsetWidth;this.$element[d!==null?"addClass":"removeClass"]("collapse");return this},transition:function(h,e,f){var g=this,d=function(){if(e.type=="show"){g.reset()}g.transitioning=0;g.$element.trigger(f)};this.$element.trigger(e);if(e.isDefaultPrevented()){return}this.transitioning=1;this.$element[h]("in");b.support.transition&&this.$element.hasClass("collapse")?this.$element.one(b.support.transition.end,d):d()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var a=b.fn.collapse;b.fn.collapse=function(d){return this.each(function(){var g=b(this),f=g.data("collapse"),e=b.extend({},b.fn.collapse.defaults,g.data(),typeof d=="object"&&d);if(!f){g.data("collapse",(f=new c(this,e)))}if(typeof d=="string"){f[d]()}})};b.fn.collapse.defaults={toggle:true};b.fn.collapse.Constructor=c;b.fn.collapse.noConflict=function(){b.fn.collapse=a;return this};b(document).on("click.collapse.data-api","[data-toggle=collapse]",function(i){var h=b(this),d,g=h.attr("data-target")||i.preventDefault()||(d=h.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=b(g).data("collapse")?"toggle":h.data();h[b(g).hasClass("in")?"addClass":"removeClass"]("collapsed");b(g).collapse(f)})}(window.jQuery);!function(f){var b="[data-toggle=dropdown]",a=function(h){var g=f(h).on("click.dropdown.data-api",this.toggle);f("html").on("click.dropdown.data-api",function(){g.parent().removeClass("open")})};a.prototype={constructor:a,toggle:function(j){var i=f(this),h,g;if(i.is(".disabled, :disabled")){return}h=e(i);g=h.hasClass("open");d();if(!g){if("ontouchstart" in document.documentElement){f('
    -

    org.apache.maven:maven-core

    +

    org.apache.maven:maven-core

    @@ -1088,7 +1057,7 @@
    StatusType jar
    -

    org.apache.maven:maven-plugin-api

    +

    org.apache.maven:maven-plugin-api

    @@ -1112,7 +1081,7 @@
    StatusType jar
    -

    org.apache.maven:maven-settings

    +

    org.apache.maven:maven-settings

    @@ -1136,7 +1105,7 @@
    StatusType jar
    -

    org.apache.maven.plugin-testing:maven-plugin-testing-harness

    +

    org.apache.maven.plugin-testing:maven-plugin-testing-harness

    @@ -1160,7 +1129,7 @@
    StatusType jar
    -

    org.apache.maven.plugin-tools:maven-plugin-annotations

    +

    org.apache.maven.plugin-tools:maven-plugin-annotations

    @@ -1184,7 +1153,7 @@
    StatusType jar
    -

    org.apache.maven.plugins:maven-site-plugin

    +

    org.apache.maven.plugins:maven-site-plugin

    @@ -1208,7 +1177,7 @@
    StatusType jar
    -

    org.apache.maven.reporting:maven-reporting-api

    +

    org.apache.maven.reporting:maven-reporting-api

    @@ -1232,7 +1201,7 @@
    StatusType jar
    -

    org.apache.velocity:velocity

    +

    org.apache.velocity:velocity

    @@ -1256,7 +1225,31 @@
    StatusType jar
    -

    org.hamcrest:hamcrest-core

    +

    org.glassfish:javax.json

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.glassfish
    Artifact Idjavax.json
    Current Version1.0.4
    Scope
    Classifier
    Typejar
    +
    +

    org.hamcrest:hamcrest-core

    @@ -1280,11 +1273,11 @@
    StatusType jar
    -

    org.jmockit:jmockit

    +

    org.jmockit:jmockit

    - + @@ -1293,7 +1286,7 @@ - + @@ -1302,16 +1295,13 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.jmockit
    jmockit
    Current Version1.16
    1.19
    Scope test
    Typejar
    Newer versions1.17-beta1 Next Incremental
    1.17-beta2 Latest Incremental
    1.17 Next Minor
    +jar
    -

    org.jsoup:jsoup

    +

    org.jsoup:jsoup

    - + @@ -1320,7 +1310,7 @@ - + @@ -1329,12 +1319,9 @@ - - - -
    Status There is at least one newer incremental version available. Incremental updates are typically passive.
     No newer versions available.
    Group Id org.jsoup
    jsoup
    Current Version1.7.2
    1.8.3
    Scope
    Typejar
    Newer versions1.7.3 Next Incremental
    1.8.1 Next Minor
    1.8.2 Latest Minor
    +jar
    -

    org.slf4j:slf4j-api

    +

    org.slf4j:slf4j-api

    @@ -1358,55 +1345,7 @@
    StatusType jar
    -

    org.slf4j:slf4j-ext

    - - - - - - - - - - - - - - - - - - - - - -
    Status No newer versions available.
    Group Idorg.slf4j
    Artifact Idslf4j-ext
    Current Version1.7.12
    Scope
    Classifier
    Typejar
    -
    -

    org.slf4j:slf4j-jdk14

    - - - - - - - - - - - - - - - - - - - - - -
    Status No newer versions available.
    Group Idorg.slf4j
    Artifact Idslf4j-jdk14
    Current Version1.7.12
    Scope
    Classifier
    Typejar
    -
    -

    org.slf4j:slf4j-simple

    +

    org.slf4j:slf4j-simple

    @@ -1438,15 +1377,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-utils/findbugs.html b/dependency-check-utils/findbugs.html index 4373e21cb..221666570 100644 --- a/dependency-check-utils/findbugs.html +++ b/dependency-check-utils/findbugs.html @@ -1,21 +1,21 @@ - + - dependency-check-ant - FindBugs Bug Detector Report - + dependency-check-ant – FindBugs Bug Detector Report + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,108 +77,101 @@
    -
    +
    -
    +
    -

    FindBugs Bug Detector Report

    -

    The following document contains the results of FindBugs Report

    -

    FindBugs Version is 2.0.2

    +

    FindBugs Bug Detector Report

    +

    The following document contains the results of FindBugs

    +

    FindBugs Version is 3.0.1

    Threshold is medium

    Effort is min

    -

    Summary

    +

    Summary

    Status
    @@ -238,34 +231,16 @@ - - + +
    ClassesErrors Missing Classes
    471110 0 0
    -
    -

    org.owasp.dependencycheck.utils.URLConnectionFactory

    - - - - - - - - - - - - -
    BugCategoryDetailsLinePriority
    Redundant nullcheck of conn which is known to be null in org.owasp.dependencycheck.utils.URLConnectionFactory.createHttpURLConnection(URL)STYLERCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE84Medium
    +Bugs
    @@ -275,15 +250,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-utils/fonts/glyphicons-halflings-regular.eot b/dependency-check-utils/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..637452ea5404ac01670c10db5276e73114d16178 GIT binary patch literal 35283 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 literal 0 HcmV?d00001 diff --git a/dependency-check-utils/fonts/glyphicons-halflings-regular.svg b/dependency-check-utils/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 000000000..446948874 --- /dev/null +++ b/dependency-check-utils/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dependency-check-utils/fonts/glyphicons-halflings-regular.ttf b/dependency-check-utils/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..282401576351ef7d0eb7313e74a251694b6d78bc GIT binary patch literal 55016 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

    ;Iyg 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 DH|yT| literal 0 HcmV?d00001 diff --git a/dependency-check-utils/fonts/glyphicons-halflings-regular.woff b/dependency-check-utils/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..f824ac15a0ac59d8c236f346f3bd429542cdf8b9 GIT binary patch literal 41793 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 literal 33442 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 - + - dependency-check-ant - About - + dependency-check-ant – About + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@

  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,24 +77,24 @@
    -
    +
    -
    +

    About

    OWASP dependency-check-utils is a collection of common utility classes used within dependency-check that might be useful in other projects.

    @@ -150,15 +150,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-utils/integration.html b/dependency-check-utils/integration.html new file mode 100644 index 000000000..4d2a79c8a --- /dev/null +++ b/dependency-check-utils/integration.html @@ -0,0 +1,221 @@ + + + + + + + + + dependency-check-ant – Continuous Integration + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +
    +

    Overview

    +

    This project uses Continuous Integration System.

    +
    +

    Access

    +

    The following is a link to the continuous integration system used by the project:

    +
    +
    +

    Notifiers

    +

    No notifiers are defined. Please check back at a later date.

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/dependency-check-utils/issue-tracking.html b/dependency-check-utils/issue-tracking.html index b20599047..40caf2e5b 100644 --- a/dependency-check-utils/issue-tracking.html +++ b/dependency-check-utils/issue-tracking.html @@ -1,21 +1,21 @@ - + - dependency-check-ant - Issue Tracking - + dependency-check-ant – Issue Tracking + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -54,7 +54,7 @@
  • - + /
  • @@ -67,9 +67,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -77,66 +77,73 @@
    -
    +
    -
    +
    -

    Overview

    +

    Overview

    This project uses github to manage its issues.

    -

    Issue Tracking

    +

    Issue Tracking

    Issues, bugs, and feature requests should be submitted to the following issue tracking system for this project.

    -
    +
    @@ -198,15 +204,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-utils/js/apache-maven-fluido-1.4.min.js b/dependency-check-utils/js/apache-maven-fluido-1.4.min.js new file mode 100644 index 000000000..0537c09d6 --- /dev/null +++ b/dependency-check-utils/js/apache-maven-fluido-1.4.min.js @@ -0,0 +1,25 @@ +/*! + * jQuery JavaScript Library v1.11.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-17T15:27Z + */ +(function(b,a){if(typeof module==="object"&&typeof module.exports==="object"){module.exports=b.document?a(b,true):function(c){if(!c.document){throw new Error("jQuery requires a window with a document")}return a(c)}}else{a(b)}}(typeof window!=="undefined"?window:this,function(a5,av){var aP=[];var P=aP.slice;var az=aP.concat;var x=aP.push;var bU=aP.indexOf;var ac={};var y=ac.toString;var K=ac.hasOwnProperty;var D={};var ai="1.11.2",bI=function(e,i){return new bI.fn.init(e,i)},E=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bS=/^-ms-/,aW=/-([\da-z])/gi,O=function(e,i){return i.toUpperCase()};bI.fn=bI.prototype={jquery:ai,constructor:bI,selector:"",length:0,toArray:function(){return P.call(this)},get:function(e){return e!=null?(e<0?this[e+this.length]:this[e]):P.call(this)},pushStack:function(e){var i=bI.merge(this.constructor(),e);i.prevObject=this;i.context=this.context;return i},each:function(i,e){return bI.each(this,i,e)},map:function(e){return this.pushStack(bI.map(this,function(b7,b6){return e.call(b7,b6,b7)}))},slice:function(){return this.pushStack(P.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(b7){var e=this.length,b6=+b7+(b7<0?e:0);return this.pushStack(b6>=0&&b6=0},isEmptyObject:function(i){var e;for(e in i){return false}return true},isPlainObject:function(b7){var i;if(!b7||bI.type(b7)!=="object"||b7.nodeType||bI.isWindow(b7)){return false}try{if(b7.constructor&&!K.call(b7,"constructor")&&!K.call(b7.constructor.prototype,"isPrototypeOf")){return false}}catch(b6){return false}if(D.ownLast){for(i in b7){return K.call(b7,i)}}for(i in b7){}return i===undefined||K.call(b7,i)},type:function(e){if(e==null){return e+""}return typeof e==="object"||typeof e==="function"?ac[y.call(e)]||"object":typeof e},globalEval:function(e){if(e&&bI.trim(e)){(a5.execScript||function(i){a5["eval"].call(a5,i)})(e)}},camelCase:function(e){return e.replace(bS,"ms-").replace(aW,O)},nodeName:function(i,e){return i.nodeName&&i.nodeName.toLowerCase()===e.toLowerCase()},each:function(ca,cb,b6){var b9,b7=0,b8=ca.length,e=ad(ca);if(b6){if(e){for(;b70&&(i-1) in b6}var m= +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function(de){var cy,dh,cn,cH,cK,ci,cW,dg,dm,cI,cX,cZ,cC,co,c8,c3,df,ce,cF,da="sizzle"+1*new Date(),cJ=de.document,di=0,c4=0,b9=cA(),c9=cA(),cG=cA(),cE=function(i,e){if(i===e){cX=true}return 0},cQ=1<<31,cO=({}).hasOwnProperty,dc=[],dd=dc.pop,cM=dc.push,b7=dc.push,cm=dc.slice,cd=function(dq,dp){var dn=0,e=dq.length;for(;dn+~]|"+cp+")"+cp+"*"),ct=new RegExp("="+cp+"*([^\\]'\"]*?)"+cp+"*\\]","g"),cS=new RegExp(ck),cU=new RegExp("^"+cL+"$"),c2={ID:new RegExp("^#("+b6+")"),CLASS:new RegExp("^\\.("+b6+")"),TAG:new RegExp("^("+b6.replace("w","w*")+")"),ATTR:new RegExp("^"+c6),PSEUDO:new RegExp("^"+ck),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+cp+"*(even|odd|(([+-]|)(\\d*)n|)"+cp+"*(?:([+-]|)"+cp+"*(\\d+)|))"+cp+"*\\)|)","i"),bool:new RegExp("^(?:"+b8+")$","i"),needsContext:new RegExp("^"+cp+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+cp+"*((?:-\\d)?\\d*)"+cp+"*\\)|)(?=[^-]|$)","i")},cc=/^(?:input|select|textarea|button)$/i,cl=/^h\d$/i,cP=/^[^{]+\{\s*\[native \w/,cR=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,c1=/[+~]/,cN=/'|\\/g,cs=new RegExp("\\\\([\\da-f]{1,6}"+cp+"?|("+cp+")|.)","ig"),c5=function(e,dp,i){var dn="0x"+dp-65536;return dn!==dn||i?dp:dn<0?String.fromCharCode(dn+65536):String.fromCharCode(dn>>10|55296,dn&1023|56320)},dl=function(){cZ()};try{b7.apply((dc=cm.call(cJ.childNodes)),cJ.childNodes);dc[cJ.childNodes.length].nodeType}catch(cD){b7={apply:dc.length?function(i,e){cM.apply(i,cm.call(e))}:function(dq,dp){var e=dq.length,dn=0;while((dq[e++]=dp[dn++])){}dq.length=e-1}}}function cw(dv,dn,dz,dB){var dA,ds,dt,dx,dy,dr,dq,e,dp,dw;if((dn?dn.ownerDocument||dn:cJ)!==cC){cZ(dn)}dn=dn||cC;dz=dz||[];dx=dn.nodeType;if(typeof dv!=="string"||!dv||dx!==1&&dx!==9&&dx!==11){return dz}if(!dB&&c8){if(dx!==11&&(dA=cR.exec(dv))){if((dt=dA[1])){if(dx===9){ds=dn.getElementById(dt);if(ds&&ds.parentNode){if(ds.id===dt){dz.push(ds);return dz}}else{return dz}}else{if(dn.ownerDocument&&(ds=dn.ownerDocument.getElementById(dt))&&cF(dn,ds)&&ds.id===dt){dz.push(ds);return dz}}}else{if(dA[2]){b7.apply(dz,dn.getElementsByTagName(dv));return dz}else{if((dt=dA[3])&&dh.getElementsByClassName){b7.apply(dz,dn.getElementsByClassName(dt));return dz}}}}if(dh.qsa&&(!c3||!c3.test(dv))){e=dq=da;dp=dn;dw=dx!==1&&dv;if(dx===1&&dn.nodeName.toLowerCase()!=="object"){dr=ci(dv);if((dq=dn.getAttribute("id"))){e=dq.replace(cN,"\\$&")}else{dn.setAttribute("id",e)}e="[id='"+e+"'] ";dy=dr.length;while(dy--){dr[dy]=e+ch(dr[dy])}dp=c1.test(dv)&&cT(dn.parentNode)||dn;dw=dr.join(",")}if(dw){try{b7.apply(dz,dp.querySelectorAll(dw));return dz}catch(du){}finally{if(!dq){dn.removeAttribute("id")}}}}}return dg(dv.replace(cr,"$1"),dn,dz,dB)}function cA(){var i=[];function e(dn,dp){if(i.push(dn+" ")>cn.cacheLength){delete e[i.shift()]}return(e[dn+" "]=dp)}return e}function cj(e){e[da]=true;return e}function cf(i){var dp=cC.createElement("div");try{return !!i(dp)}catch(dn){return false}finally{if(dp.parentNode){dp.parentNode.removeChild(dp)}dp=null}}function dj(dn,dq){var e=dn.split("|"),dp=dn.length;while(dp--){cn.attrHandle[e[dp]]=dq}}function ca(i,e){var dp=e&&i,dn=dp&&i.nodeType===1&&e.nodeType===1&&(~e.sourceIndex||cQ)-(~i.sourceIndex||cQ);if(dn){return dn}if(dp){while((dp=dp.nextSibling)){if(dp===e){return -1}}}return i?1:-1}function cx(e){return function(dn){var i=dn.nodeName.toLowerCase();return i==="input"&&dn.type===e}}function cb(e){return function(dn){var i=dn.nodeName.toLowerCase();return(i==="input"||i==="button")&&dn.type===e}}function c7(e){return cj(function(i){i=+i;return cj(function(dn,ds){var dq,dp=e([],dn.length,i),dr=dp.length;while(dr--){if(dn[(dq=dp[dr])]){dn[dq]=!(ds[dq]=dn[dq])}}})})}function cT(e){return e&&typeof e.getElementsByTagName!=="undefined"&&e}dh=cw.support={};cK=cw.isXML=function(e){var i=e&&(e.ownerDocument||e).documentElement;return i?i.nodeName!=="HTML":false};cZ=cw.setDocument=function(dn){var e,i,dp=dn?dn.ownerDocument||dn:cJ;if(dp===cC||dp.nodeType!==9||!dp.documentElement){return cC}cC=dp;co=dp.documentElement;i=dp.defaultView;if(i&&i!==i.top){if(i.addEventListener){i.addEventListener("unload",dl,false)}else{if(i.attachEvent){i.attachEvent("onunload",dl)}}}c8=!cK(dp);dh.attributes=cf(function(dq){dq.className="i";return !dq.getAttribute("className")});dh.getElementsByTagName=cf(function(dq){dq.appendChild(dp.createComment(""));return !dq.getElementsByTagName("*").length});dh.getElementsByClassName=cP.test(dp.getElementsByClassName);dh.getById=cf(function(dq){co.appendChild(dq).id=da;return !dp.getElementsByName||!dp.getElementsByName(da).length});if(dh.getById){cn.find.ID=function(ds,dr){if(typeof dr.getElementById!=="undefined"&&c8){var dq=dr.getElementById(ds);return dq&&dq.parentNode?[dq]:[]}};cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(ds){return ds.getAttribute("id")===dq}}}else{delete cn.find.ID;cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(dt){var ds=typeof dt.getAttributeNode!=="undefined"&&dt.getAttributeNode("id");return ds&&ds.value===dq}}}cn.find.TAG=dh.getElementsByTagName?function(dq,dr){if(typeof dr.getElementsByTagName!=="undefined"){return dr.getElementsByTagName(dq)}else{if(dh.qsa){return dr.querySelectorAll(dq)}}}:function(dq,du){var dv,dt=[],ds=0,dr=du.getElementsByTagName(dq);if(dq==="*"){while((dv=dr[ds++])){if(dv.nodeType===1){dt.push(dv)}}return dt}return dr};cn.find.CLASS=dh.getElementsByClassName&&function(dr,dq){if(c8){return dq.getElementsByClassName(dr)}};df=[];c3=[];if((dh.qsa=cP.test(dp.querySelectorAll))){cf(function(dq){co.appendChild(dq).innerHTML="";if(dq.querySelectorAll("[msallowcapture^='']").length){c3.push("[*^$]="+cp+"*(?:''|\"\")")}if(!dq.querySelectorAll("[selected]").length){c3.push("\\["+cp+"*(?:value|"+b8+")")}if(!dq.querySelectorAll("[id~="+da+"-]").length){c3.push("~=")}if(!dq.querySelectorAll(":checked").length){c3.push(":checked")}if(!dq.querySelectorAll("a#"+da+"+*").length){c3.push(".#.+[+~]")}});cf(function(dr){var dq=dp.createElement("input");dq.setAttribute("type","hidden");dr.appendChild(dq).setAttribute("name","D");if(dr.querySelectorAll("[name=d]").length){c3.push("name"+cp+"*[*^$|!~]?=")}if(!dr.querySelectorAll(":enabled").length){c3.push(":enabled",":disabled")}dr.querySelectorAll("*,:x");c3.push(",.*:")})}if((dh.matchesSelector=cP.test((ce=co.matches||co.webkitMatchesSelector||co.mozMatchesSelector||co.oMatchesSelector||co.msMatchesSelector)))){cf(function(dq){dh.disconnectedMatch=ce.call(dq,"div");ce.call(dq,"[s!='']:x");df.push("!=",ck)})}c3=c3.length&&new RegExp(c3.join("|"));df=df.length&&new RegExp(df.join("|"));e=cP.test(co.compareDocumentPosition);cF=e||cP.test(co.contains)?function(dr,dq){var dt=dr.nodeType===9?dr.documentElement:dr,ds=dq&&dq.parentNode;return dr===ds||!!(ds&&ds.nodeType===1&&(dt.contains?dt.contains(ds):dr.compareDocumentPosition&&dr.compareDocumentPosition(ds)&16))}:function(dr,dq){if(dq){while((dq=dq.parentNode)){if(dq===dr){return true}}}return false};cE=e?function(dr,dq){if(dr===dq){cX=true;return 0}var ds=!dr.compareDocumentPosition-!dq.compareDocumentPosition;if(ds){return ds}ds=(dr.ownerDocument||dr)===(dq.ownerDocument||dq)?dr.compareDocumentPosition(dq):1;if(ds&1||(!dh.sortDetached&&dq.compareDocumentPosition(dr)===ds)){if(dr===dp||dr.ownerDocument===cJ&&cF(cJ,dr)){return -1}if(dq===dp||dq.ownerDocument===cJ&&cF(cJ,dq)){return 1}return cI?(cd(cI,dr)-cd(cI,dq)):0}return ds&4?-1:1}:function(dr,dq){if(dr===dq){cX=true;return 0}var dx,du=0,dw=dr.parentNode,dt=dq.parentNode,ds=[dr],dv=[dq];if(!dw||!dt){return dr===dp?-1:dq===dp?1:dw?-1:dt?1:cI?(cd(cI,dr)-cd(cI,dq)):0}else{if(dw===dt){return ca(dr,dq)}}dx=dr;while((dx=dx.parentNode)){ds.unshift(dx)}dx=dq;while((dx=dx.parentNode)){dv.unshift(dx)}while(ds[du]===dv[du]){du++}return du?ca(ds[du],dv[du]):ds[du]===cJ?-1:dv[du]===cJ?1:0};return dp};cw.matches=function(i,e){return cw(i,null,null,e)};cw.matchesSelector=function(dn,dq){if((dn.ownerDocument||dn)!==cC){cZ(dn)}dq=dq.replace(ct,"='$1']");if(dh.matchesSelector&&c8&&(!df||!df.test(dq))&&(!c3||!c3.test(dq))){try{var i=ce.call(dn,dq);if(i||dh.disconnectedMatch||dn.document&&dn.document.nodeType!==11){return i}}catch(dp){}}return cw(dq,cC,null,[dn]).length>0};cw.contains=function(e,i){if((e.ownerDocument||e)!==cC){cZ(e)}return cF(e,i)};cw.attr=function(dn,e){if((dn.ownerDocument||dn)!==cC){cZ(dn)}var i=cn.attrHandle[e.toLowerCase()],dp=i&&cO.call(cn.attrHandle,e.toLowerCase())?i(dn,e,!c8):undefined;return dp!==undefined?dp:dh.attributes||!c8?dn.getAttribute(e):(dp=dn.getAttributeNode(e))&&dp.specified?dp.value:null};cw.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};cw.uniqueSort=function(dp){var dq,dr=[],e=0,dn=0;cX=!dh.detectDuplicates;cI=!dh.sortStable&&dp.slice(0);dp.sort(cE);if(cX){while((dq=dp[dn++])){if(dq===dp[dn]){e=dr.push(dn)}}while(e--){dp.splice(dr[e],1)}}cI=null;return dp};cH=cw.getText=function(dr){var dq,dn="",dp=0,e=dr.nodeType;if(!e){while((dq=dr[dp++])){dn+=cH(dq)}}else{if(e===1||e===9||e===11){if(typeof dr.textContent==="string"){return dr.textContent}else{for(dr=dr.firstChild;dr;dr=dr.nextSibling){dn+=cH(dr)}}}else{if(e===3||e===4){return dr.nodeValue}}}return dn};cn=cw.selectors={cacheLength:50,createPseudo:cj,match:c2,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){e[1]=e[1].replace(cs,c5);e[3]=(e[3]||e[4]||e[5]||"").replace(cs,c5);if(e[2]==="~="){e[3]=" "+e[3]+" "}return e.slice(0,4)},CHILD:function(e){e[1]=e[1].toLowerCase();if(e[1].slice(0,3)==="nth"){if(!e[3]){cw.error(e[0])}e[4]=+(e[4]?e[5]+(e[6]||1):2*(e[3]==="even"||e[3]==="odd"));e[5]=+((e[7]+e[8])||e[3]==="odd")}else{if(e[3]){cw.error(e[0])}}return e},PSEUDO:function(i){var e,dn=!i[6]&&i[2];if(c2.CHILD.test(i[0])){return null}if(i[3]){i[2]=i[4]||i[5]||""}else{if(dn&&cS.test(dn)&&(e=ci(dn,true))&&(e=dn.indexOf(")",dn.length-e)-dn.length)){i[0]=i[0].slice(0,e);i[2]=dn.slice(0,e)}}return i.slice(0,3)}},filter:{TAG:function(i){var e=i.replace(cs,c5).toLowerCase();return i==="*"?function(){return true}:function(dn){return dn.nodeName&&dn.nodeName.toLowerCase()===e}},CLASS:function(e){var i=b9[e+" "];return i||(i=new RegExp("(^|"+cp+")"+e+"("+cp+"|$)"))&&b9(e,function(dn){return i.test(typeof dn.className==="string"&&dn.className||typeof dn.getAttribute!=="undefined"&&dn.getAttribute("class")||"")})},ATTR:function(dn,i,e){return function(dq){var dp=cw.attr(dq,dn);if(dp==null){return i==="!="}if(!i){return true}dp+="";return i==="="?dp===e:i==="!="?dp!==e:i==="^="?e&&dp.indexOf(e)===0:i==="*="?e&&dp.indexOf(e)>-1:i==="$="?e&&dp.slice(-e.length)===e:i==="~="?(" "+dp.replace(cu," ")+" ").indexOf(e)>-1:i==="|="?dp===e||dp.slice(0,e.length+1)===e+"-":false}},CHILD:function(i,dq,dp,dr,dn){var dt=i.slice(0,3)!=="nth",e=i.slice(-4)!=="last",ds=dq==="of-type";return dr===1&&dn===0?function(du){return !!du.parentNode}:function(dA,dy,dD){var du,dG,dB,dF,dC,dx,dz=dt!==e?"nextSibling":"previousSibling",dE=dA.parentNode,dw=ds&&dA.nodeName.toLowerCase(),dv=!dD&&!ds;if(dE){if(dt){while(dz){dB=dA;while((dB=dB[dz])){if(ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1){return false}}dx=dz=i==="only"&&!dx&&"nextSibling"}return true}dx=[e?dE.firstChild:dE.lastChild];if(e&&dv){dG=dE[da]||(dE[da]={});du=dG[i]||[];dC=du[0]===di&&du[1];dF=du[0]===di&&du[2];dB=dC&&dE.childNodes[dC];while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if(dB.nodeType===1&&++dF&&dB===dA){dG[i]=[di,dC,dF];break}}}else{if(dv&&(du=(dA[da]||(dA[da]={}))[i])&&du[0]===di){dF=du[1]}else{while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if((ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1)&&++dF){if(dv){(dB[da]||(dB[da]={}))[i]=[di,dF]}if(dB===dA){break}}}}}dF-=dn;return dF===dr||(dF%dr===0&&dF/dr>=0)}}},PSEUDO:function(dp,dn){var e,i=cn.pseudos[dp]||cn.setFilters[dp.toLowerCase()]||cw.error("unsupported pseudo: "+dp);if(i[da]){return i(dn)}if(i.length>1){e=[dp,dp,"",dn];return cn.setFilters.hasOwnProperty(dp.toLowerCase())?cj(function(ds,du){var dr,dq=i(ds,dn),dt=dq.length;while(dt--){dr=cd(ds,dq[dt]);ds[dr]=!(du[dr]=dq[dt])}}):function(dq){return i(dq,0,e)}}return i}},pseudos:{not:cj(function(e){var i=[],dn=[],dp=cW(e.replace(cr,"$1"));return dp[da]?cj(function(dr,dw,du,ds){var dv,dq=dp(dr,null,ds,[]),dt=dr.length;while(dt--){if((dv=dq[dt])){dr[dt]=!(dw[dt]=dv)}}}):function(ds,dr,dq){i[0]=ds;dp(i,null,dq,dn);i[0]=null;return !dn.pop()}}),has:cj(function(e){return function(i){return cw(e,i).length>0}}),contains:cj(function(e){e=e.replace(cs,c5);return function(i){return(i.textContent||i.innerText||cH(i)).indexOf(e)>-1}}),lang:cj(function(e){if(!cU.test(e||"")){cw.error("unsupported lang: "+e)}e=e.replace(cs,c5).toLowerCase();return function(dn){var i;do{if((i=c8?dn.lang:dn.getAttribute("xml:lang")||dn.getAttribute("lang"))){i=i.toLowerCase();return i===e||i.indexOf(e+"-")===0}}while((dn=dn.parentNode)&&dn.nodeType===1);return false}}),target:function(e){var i=de.location&&de.location.hash;return i&&i.slice(1)===e.id},root:function(e){return e===co},focus:function(e){return e===cC.activeElement&&(!cC.hasFocus||cC.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===false},disabled:function(e){return e.disabled===true},checked:function(e){var i=e.nodeName.toLowerCase();return(i==="input"&&!!e.checked)||(i==="option"&&!!e.selected)},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling){if(e.nodeType<6){return false}}return true},parent:function(e){return !cn.pseudos.empty(e)},header:function(e){return cl.test(e.nodeName)},input:function(e){return cc.test(e.nodeName)},button:function(i){var e=i.nodeName.toLowerCase();return e==="input"&&i.type==="button"||e==="button"},text:function(i){var e;return i.nodeName.toLowerCase()==="input"&&i.type==="text"&&((e=i.getAttribute("type"))==null||e.toLowerCase()==="text")},first:c7(function(){return[0]}),last:c7(function(e,i){return[i-1]}),eq:c7(function(e,dn,i){return[i<0?i+dn:i]}),even:c7(function(e,dp){var dn=0;for(;dn=0;){e.push(dn)}return e}),gt:c7(function(e,dq,dp){var dn=dp<0?dp+dq:dp;for(;++dn1?function(dr,dq,dn){var dp=e.length;while(dp--){if(!e[dp](dr,dq,dn)){return false}}return true}:e[0]}function cz(dn,dr,dq){var dp=0,e=dr.length;for(;dp-1){dC[dE]=!(dz[dE]=dw)}}}}else{dy=c0(dy===dz?dy.splice(dt,dy.length):dy);if(dr){dr(null,dz,dy,dB)}else{b7.apply(dz,dy)}}})}function db(dt){var dn,dr,dp,ds=dt.length,dw=cn.relative[dt[0].type],dx=dw||cn.relative[" "],dq=dw?1:0,du=cq(function(i){return i===dn},dx,true),dv=cq(function(i){return cd(dn,i)>-1},dx,true),e=[function(dA,dz,dy){var i=(!dw&&(dy||dz!==dm))||((dn=dz).nodeType?du(dA,dz,dy):dv(dA,dz,dy));dn=null;return i}];for(;dq1&&dk(e),dq>1&&ch(dt.slice(0,dq-1).concat({value:dt[dq-2].type===" "?"*":""})).replace(cr,"$1"),dr,dq0,dq=dp.length>0,i=function(dA,du,dz,dy,dD){var dv,dw,dB,dF=0,dx="0",dr=dA&&[],dG=[],dE=dm,dt=dA||dq&&cn.find.TAG("*",dD),ds=(di+=dE==null?1:Math.random()||0.1),dC=dt.length;if(dD){dm=du!==cC&&du}for(;dx!==dC&&(dv=dt[dx])!=null;dx++){if(dq&&dv){dw=0;while((dB=dp[dw++])){if(dB(dv,du,dz)){dy.push(dv);break}}if(dD){di=ds}}if(e){if((dv=!dB&&dv)){dF--}if(dA){dr.push(dv)}}}dF+=dx;if(e&&dx!==dF){dw=0;while((dB=dn[dw++])){dB(dr,dG,du,dz)}if(dA){if(dF>0){while(dx--){if(!(dr[dx]||dG[dx])){dG[dx]=dd.call(dy)}}}dG=c0(dG)}b7.apply(dy,dG);if(dD&&!dA&&dG.length>0&&(dF+dn.length)>1){cw.uniqueSort(dy)}}if(dD){di=ds;dm=dE}return dr};return e?cj(i):i}cW=cw.compile=function(e,dp){var dq,dn=[],ds=[],dr=cG[e+" "];if(!dr){if(!dp){dp=ci(e)}dq=dp.length;while(dq--){dr=db(dp[dq]);if(dr[da]){dn.push(dr)}else{ds.push(dr)}}dr=cG(e,cY(ds,dn));dr.selector=e}return dr};dg=cw.select=function(dp,e,dq,dt){var dr,dw,dn,dx,du,dv=typeof dp==="function"&&dp,ds=!dt&&ci((dp=dv.selector||dp));dq=dq||[];if(ds.length===1){dw=ds[0]=ds[0].slice(0);if(dw.length>2&&(dn=dw[0]).type==="ID"&&dh.getById&&e.nodeType===9&&c8&&cn.relative[dw[1].type]){e=(cn.find.ID(dn.matches[0].replace(cs,c5),e)||[])[0];if(!e){return dq}else{if(dv){e=e.parentNode}}dp=dp.slice(dw.shift().value.length)}dr=c2.needsContext.test(dp)?0:dw.length;while(dr--){dn=dw[dr];if(cn.relative[(dx=dn.type)]){break}if((du=cn.find[dx])){if((dt=du(dn.matches[0].replace(cs,c5),c1.test(dw[0].type)&&cT(e.parentNode)||e))){dw.splice(dr,1);dp=dt.length&&ch(dw);if(!dp){b7.apply(dq,dt);return dq}break}}}}(dv||cW(dp,ds))(dt,e,!c8,dq,c1.test(dp)&&cT(e.parentNode)||e);return dq};dh.sortStable=da.split("").sort(cE).join("")===da;dh.detectDuplicates=!!cX;cZ();dh.sortDetached=cf(function(e){return e.compareDocumentPosition(cC.createElement("div"))&1});if(!cf(function(e){e.innerHTML="";return e.firstChild.getAttribute("href")==="#"})){dj("type|href|height|width",function(i,e,dn){if(!dn){return i.getAttribute(e,e.toLowerCase()==="type"?1:2)}})}if(!dh.attributes||!cf(function(e){e.innerHTML="";e.firstChild.setAttribute("value","");return e.firstChild.getAttribute("value")===""})){dj("value",function(i,e,dn){if(!dn&&i.nodeName.toLowerCase()==="input"){return i.defaultValue}})}if(!cf(function(e){return e.getAttribute("disabled")==null})){dj(b8,function(i,e,dp){var dn;if(!dp){return i[e]===true?e.toLowerCase():(dn=i.getAttributeNode(e))&&dn.specified?dn.value:null}})}return cw})(a5);bI.find=m;bI.expr=m.selectors;bI.expr[":"]=bI.expr.pseudos;bI.unique=m.uniqueSort;bI.text=m.getText;bI.isXMLDoc=m.isXML;bI.contains=m.contains;var A=bI.expr.match.needsContext;var a=(/^<(\w+)\s*\/?>(?:<\/\1>|)$/);var aL=/^.[^:#\[\.,]*$/;function aR(b6,e,i){if(bI.isFunction(e)){return bI.grep(b6,function(b8,b7){return !!e.call(b8,b7,b8)!==i})}if(e.nodeType){return bI.grep(b6,function(b7){return(b7===e)!==i})}if(typeof e==="string"){if(aL.test(e)){return bI.filter(e,b6,i)}e=bI.filter(e,b6)}return bI.grep(b6,function(b7){return(bI.inArray(b7,e)>=0)!==i})}bI.filter=function(b7,e,b6){var i=e[0];if(b6){b7=":not("+b7+")"}return e.length===1&&i.nodeType===1?bI.find.matchesSelector(i,b7)?[i]:[]:bI.find.matches(b7,bI.grep(e,function(b8){return b8.nodeType===1}))};bI.fn.extend({find:function(b6){var b9,b8=[],b7=this,e=b7.length;if(typeof b6!=="string"){return this.pushStack(bI(b6).filter(function(){for(b9=0;b91?bI.unique(b8):b8);b8.selector=this.selector?this.selector+" "+b6:b6;return b8},filter:function(e){return this.pushStack(aR(this,e||[],false))},not:function(e){return this.pushStack(aR(this,e||[],true))},is:function(e){return !!aR(this,typeof e==="string"&&A.test(e)?bI(e):e||[],false).length}});var z,n=a5.document,bt=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,bV=bI.fn.init=function(e,b6){var i,b7;if(!e){return this}if(typeof e==="string"){if(e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3){i=[null,e,null]}else{i=bt.exec(e)}if(i&&(i[1]||!b6)){if(i[1]){b6=b6 instanceof bI?b6[0]:b6;bI.merge(this,bI.parseHTML(i[1],b6&&b6.nodeType?b6.ownerDocument||b6:n,true));if(a.test(i[1])&&bI.isPlainObject(b6)){for(i in b6){if(bI.isFunction(this[i])){this[i](b6[i])}else{this.attr(i,b6[i])}}}return this}else{b7=n.getElementById(i[2]);if(b7&&b7.parentNode){if(b7.id!==i[2]){return z.find(e)}this.length=1;this[0]=b7}this.context=n;this.selector=e;return this}}else{if(!b6||b6.jquery){return(b6||z).find(e)}else{return this.constructor(b6).find(e)}}}else{if(e.nodeType){this.context=this[0]=e;this.length=1;return this}else{if(bI.isFunction(e)){return typeof z.ready!=="undefined"?z.ready(e):e(bI)}}}if(e.selector!==undefined){this.selector=e.selector;this.context=e.context}return bI.makeArray(e,this)};bV.prototype=bI.fn;z=bI(n);var bv=/^(?:parents|prev(?:Until|All))/,bz={children:true,contents:true,next:true,prev:true};bI.extend({dir:function(b6,i,b8){var e=[],b7=b6[i];while(b7&&b7.nodeType!==9&&(b8===undefined||b7.nodeType!==1||!bI(b7).is(b8))){if(b7.nodeType===1){e.push(b7)}b7=b7[i]}return e},sibling:function(b6,i){var e=[];for(;b6;b6=b6.nextSibling){if(b6.nodeType===1&&b6!==i){e.push(b6)}}return e}});bI.fn.extend({has:function(b8){var b7,b6=bI(b8,this),e=b6.length;return this.filter(function(){for(b7=0;b7-1:ca.nodeType===1&&bI.find.matchesSelector(ca,b9))){e.push(ca);break}}}return this.pushStack(e.length>1?bI.unique(e):e)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.first().prevAll().length:-1}if(typeof e==="string"){return bI.inArray(this[0],bI(e))}return bI.inArray(e.jquery?e[0]:e,this)},add:function(e,i){return this.pushStack(bI.unique(bI.merge(this.get(),bI(e,i))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}});function aY(i,e){do{i=i[e]}while(i&&i.nodeType!==1);return i}bI.each({parent:function(i){var e=i.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return bI.dir(e,"parentNode")},parentsUntil:function(b6,e,b7){return bI.dir(b6,"parentNode",b7)},next:function(e){return aY(e,"nextSibling")},prev:function(e){return aY(e,"previousSibling")},nextAll:function(e){return bI.dir(e,"nextSibling")},prevAll:function(e){return bI.dir(e,"previousSibling")},nextUntil:function(b6,e,b7){return bI.dir(b6,"nextSibling",b7)},prevUntil:function(b6,e,b7){return bI.dir(b6,"previousSibling",b7)},siblings:function(e){return bI.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return bI.sibling(e.firstChild)},contents:function(e){return bI.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:bI.merge([],e.childNodes)}},function(e,i){bI.fn[e]=function(b8,b6){var b7=bI.map(this,i,b8);if(e.slice(-5)!=="Until"){b6=b8}if(b6&&typeof b6==="string"){b7=bI.filter(b6,b7)}if(this.length>1){if(!bz[e]){b7=bI.unique(b7)}if(bv.test(e)){b7=b7.reverse()}}return this.pushStack(b7)}});var aF=(/\S+/g);var b2={};function af(i){var e=b2[i]={};bI.each(i.match(aF)||[],function(b7,b6){e[b6]=true});return e}bI.Callbacks=function(ce){ce=typeof ce==="string"?(b2[ce]||af(ce)):bI.extend({},ce);var b8,b7,e,b9,ca,b6,cb=[],cc=!ce.once&&[],i=function(cf){b7=ce.memory&&cf;e=true;ca=b6||0;b6=0;b9=cb.length;b8=true;for(;cb&&ca-1){cb.splice(cg,1);if(b8){if(cg<=b9){b9--}if(cg<=ca){ca--}}}})}return this},has:function(cf){return cf?bI.inArray(cf,cb)>-1:!!(cb&&cb.length)},empty:function(){cb=[];b9=0;return this},disable:function(){cb=cc=b7=undefined;return this},disabled:function(){return !cb},lock:function(){cc=undefined;if(!b7){cd.disable()}return this},locked:function(){return !cc},fireWith:function(cg,cf){if(cb&&(!e||cc)){cf=cf||[];cf=[cg,cf.slice?cf.slice():cf];if(b8){cc.push(cf)}else{i(cf)}}return this},fire:function(){cd.fireWith(this,arguments);return this},fired:function(){return !!e}};return cd};bI.extend({Deferred:function(b6){var i=[["resolve","done",bI.Callbacks("once memory"),"resolved"],["reject","fail",bI.Callbacks("once memory"),"rejected"],["notify","progress",bI.Callbacks("memory")]],b7="pending",b8={state:function(){return b7},always:function(){e.done(arguments).fail(arguments);return this},then:function(){var b9=arguments;return bI.Deferred(function(ca){bI.each(i,function(cc,cb){var cd=bI.isFunction(b9[cc])&&b9[cc];e[cb[1]](function(){var ce=cd&&cd.apply(this,arguments);if(ce&&bI.isFunction(ce.promise)){ce.promise().done(ca.resolve).fail(ca.reject).progress(ca.notify)}else{ca[cb[0]+"With"](this===b8?ca.promise():this,cd?[ce]:arguments)}})});b9=null}).promise()},promise:function(b9){return b9!=null?bI.extend(b9,b8):b8}},e={};b8.pipe=b8.then;bI.each(i,function(ca,b9){var cc=b9[2],cb=b9[3];b8[b9[1]]=cc.add;if(cb){cc.add(function(){b7=cb},i[ca^1][2].disable,i[2][2].lock)}e[b9[0]]=function(){e[b9[0]+"With"](this===e?b8:this,arguments);return this};e[b9[0]+"With"]=cc.fireWith});b8.promise(e);if(b6){b6.call(e,e)}return e},when:function(b9){var b7=0,cb=P.call(arguments),e=cb.length,b6=e!==1||(b9&&bI.isFunction(b9.promise))?e:0,ce=b6===1?b9:bI.Deferred(),b8=function(cg,ch,cf){return function(i){ch[cg]=this;cf[cg]=arguments.length>1?P.call(arguments):i;if(cf===cd){ce.notifyWith(ch,cf)}else{if(!(--b6)){ce.resolveWith(ch,cf)}}}},cd,ca,cc;if(e>1){cd=new Array(e);ca=new Array(e);cc=new Array(e);for(;b70){return}ak.resolveWith(n,[bI]);if(bI.fn.triggerHandler){bI(n).triggerHandler("ready");bI(n).off("ready")}}});function bm(){if(n.addEventListener){n.removeEventListener("DOMContentLoaded",bZ,false);a5.removeEventListener("load",bZ,false)}else{n.detachEvent("onreadystatechange",bZ);a5.detachEvent("onload",bZ)}}function bZ(){if(n.addEventListener||event.type==="load"||n.readyState==="complete"){bm();bI.ready()}}bI.ready.promise=function(b8){if(!ak){ak=bI.Deferred();if(n.readyState==="complete"){setTimeout(bI.ready)}else{if(n.addEventListener){n.addEventListener("DOMContentLoaded",bZ,false);a5.addEventListener("load",bZ,false)}else{n.attachEvent("onreadystatechange",bZ);a5.attachEvent("onload",bZ);var b7=false;try{b7=a5.frameElement==null&&n.documentElement}catch(b6){}if(b7&&b7.doScroll){(function i(){if(!bI.isReady){try{b7.doScroll("left")}catch(b9){return setTimeout(i,50)}bm();bI.ready()}})()}}}}return ak.promise(b8)};var aC=typeof undefined;var bh;for(bh in bI(D)){break}D.ownLast=bh!=="0";D.inlineBlockNeedsLayout=false;bI(function(){var b6,b7,e,i;e=n.getElementsByTagName("body")[0];if(!e||!e.style){return}b7=n.createElement("div");i=n.createElement("div");i.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";e.appendChild(i).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";D.inlineBlockNeedsLayout=b6=b7.offsetWidth===3;if(b6){e.style.zoom=1}}e.removeChild(i)});(function(){var b6=n.createElement("div");if(D.deleteExpando==null){D.deleteExpando=true;try{delete b6.test}catch(i){D.deleteExpando=false}}b6=null})();bI.acceptData=function(b6){var i=bI.noData[(b6.nodeName+" ").toLowerCase()],e=+b6.nodeType||1;return e!==1&&e!==9?false:!i||i!==true&&b6.getAttribute("classid")===i};var by=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,aQ=/([A-Z])/g;function bA(b7,b6,b8){if(b8===undefined&&b7.nodeType===1){var i="data-"+b6.replace(aQ,"-$1").toLowerCase();b8=b7.getAttribute(i);if(typeof b8==="string"){try{b8=b8==="true"?true:b8==="false"?false:b8==="null"?null:+b8+""===b8?+b8:by.test(b8)?bI.parseJSON(b8):b8}catch(b9){}bI.data(b7,b6,b8)}else{b8=undefined}}return b8}function Q(i){var e;for(e in i){if(e==="data"&&bI.isEmptyObject(i[e])){continue}if(e!=="toJSON"){return false}}return true}function bc(b7,i,b9,b8){if(!bI.acceptData(b7)){return}var cb,ca,cc=bI.expando,cd=b7.nodeType,e=cd?bI.cache:b7,b6=cd?b7[cc]:b7[cc]&&cc;if((!b6||!e[b6]||(!b8&&!e[b6].data))&&b9===undefined&&typeof i==="string"){return}if(!b6){if(cd){b6=b7[cc]=aP.pop()||bI.guid++}else{b6=cc}}if(!e[b6]){e[b6]=cd?{}:{toJSON:bI.noop}}if(typeof i==="object"||typeof i==="function"){if(b8){e[b6]=bI.extend(e[b6],i)}else{e[b6].data=bI.extend(e[b6].data,i)}}ca=e[b6];if(!b8){if(!ca.data){ca.data={}}ca=ca.data}if(b9!==undefined){ca[bI.camelCase(i)]=b9}if(typeof i==="string"){cb=ca[i];if(cb==null){cb=ca[bI.camelCase(i)]}}else{cb=ca}return cb}function ab(b9,b7,e){if(!bI.acceptData(b9)){return}var cb,b8,ca=b9.nodeType,b6=ca?bI.cache:b9,cc=ca?b9[bI.expando]:bI.expando;if(!b6[cc]){return}if(b7){cb=e?b6[cc]:b6[cc].data;if(cb){if(!bI.isArray(b7)){if(b7 in cb){b7=[b7]}else{b7=bI.camelCase(b7);if(b7 in cb){b7=[b7]}else{b7=b7.split(" ")}}}else{b7=b7.concat(bI.map(b7,bI.camelCase))}b8=b7.length;while(b8--){delete cb[b7[b8]]}if(e?!Q(cb):!bI.isEmptyObject(cb)){return}}}if(!e){delete b6[cc].data;if(!Q(b6[cc])){return}}if(ca){bI.cleanData([b9],true)}else{if(D.deleteExpando||b6!=b6.window){delete b6[cc]}else{b6[cc]=null}}}bI.extend({cache:{},noData:{"applet ":true,"embed ":true,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){e=e.nodeType?bI.cache[e[bI.expando]]:e[bI.expando];return !!e&&!Q(e)},data:function(i,e,b6){return bc(i,e,b6)},removeData:function(i,e){return ab(i,e)},_data:function(i,e,b6){return bc(i,e,b6,true)},_removeData:function(i,e){return ab(i,e,true)}});bI.fn.extend({data:function(b8,cb){var b7,b6,ca,b9=this[0],e=b9&&b9.attributes;if(b8===undefined){if(this.length){ca=bI.data(b9);if(b9.nodeType===1&&!bI._data(b9,"parsedAttrs")){b7=e.length;while(b7--){if(e[b7]){b6=e[b7].name;if(b6.indexOf("data-")===0){b6=bI.camelCase(b6.slice(5));bA(b9,b6,ca[b6])}}}bI._data(b9,"parsedAttrs",true)}}return ca}if(typeof b8==="object"){return this.each(function(){bI.data(this,b8)})}return arguments.length>1?this.each(function(){bI.data(this,b8,cb)}):b9?bA(b9,b8,bI.data(b9,b8)):undefined},removeData:function(e){return this.each(function(){bI.removeData(this,e)})}});bI.extend({queue:function(b6,i,b7){var e;if(b6){i=(i||"fx")+"queue";e=bI._data(b6,i);if(b7){if(!e||bI.isArray(b7)){e=bI._data(b6,i,bI.makeArray(b7))}else{e.push(b7)}}return e||[]}},dequeue:function(b9,b8){b8=b8||"fx";var i=bI.queue(b9,b8),ca=i.length,b7=i.shift(),e=bI._queueHooks(b9,b8),b6=function(){bI.dequeue(b9,b8)};if(b7==="inprogress"){b7=i.shift();ca--}if(b7){if(b8==="fx"){i.unshift("inprogress")}delete e.stop;b7.call(b9,b6,e)}if(!ca&&e){e.empty.fire()}},_queueHooks:function(b6,i){var e=i+"queueHooks";return bI._data(b6,e)||bI._data(b6,e,{empty:bI.Callbacks("once memory").add(function(){bI._removeData(b6,i+"queue");bI._removeData(b6,e)})})}});bI.fn.extend({queue:function(e,i){var b6=2;if(typeof e!=="string"){i=e;e="fx";b6--}if(arguments.length
    a";D.leadingWhitespace=b8.firstChild.nodeType===3;D.tbody=!b8.getElementsByTagName("tbody").length;D.htmlSerialize=!!b8.getElementsByTagName("link").length;D.html5Clone=n.createElement("nav").cloneNode(true).outerHTML!=="<:nav>";i.type="checkbox";i.checked=true;b6.appendChild(i);D.appendChecked=i.checked;b8.innerHTML="";D.noCloneChecked=!!b8.cloneNode(true).lastChild.defaultValue;b6.appendChild(b8);b8.innerHTML="";D.checkClone=b8.cloneNode(true).cloneNode(true).lastChild.checked;D.noCloneEvent=true;if(b8.attachEvent){b8.attachEvent("onclick",function(){D.noCloneEvent=false});b8.cloneNode(true).click()}if(D.deleteExpando==null){D.deleteExpando=true;try{delete b8.test}catch(b7){D.deleteExpando=false}}})();(function(){var b6,e,b7=n.createElement("div");for(b6 in {submit:true,change:true,focusin:true}){e="on"+b6;if(!(D[b6+"Bubbles"]=e in a5)){b7.setAttribute(e,"t");D[b6+"Bubbles"]=b7.attributes[e].expando===false}}b7=null})();var bG=/^(?:input|select|textarea)$/i,a6=/^key/,bM=/^(?:mouse|pointer|contextmenu)|click/,bC=/^(?:focusinfocus|focusoutblur)$/,bx=/^([^.]*)(?:\.(.+)|)$/;function U(){return true}function Z(){return false}function am(){try{return n.activeElement}catch(e){}}bI.event={global:{},add:function(b8,cd,ci,ca,b9){var cb,cj,ck,b6,cf,cc,ch,b7,cg,e,i,ce=bI._data(b8);if(!ce){return}if(ci.handler){b6=ci;ci=b6.handler;b9=b6.selector}if(!ci.guid){ci.guid=bI.guid++}if(!(cj=ce.events)){cj=ce.events={}}if(!(cc=ce.handle)){cc=ce.handle=function(cl){return typeof bI!==aC&&(!cl||bI.event.triggered!==cl.type)?bI.event.dispatch.apply(cc.elem,arguments):undefined};cc.elem=b8}cd=(cd||"").match(aF)||[""];ck=cd.length;while(ck--){cb=bx.exec(cd[ck])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){continue}cf=bI.event.special[cg]||{};cg=(b9?cf.delegateType:cf.bindType)||cg;cf=bI.event.special[cg]||{};ch=bI.extend({type:cg,origType:i,data:ca,handler:ci,guid:ci.guid,selector:b9,needsContext:b9&&bI.expr.match.needsContext.test(b9),namespace:e.join(".")},b6);if(!(b7=cj[cg])){b7=cj[cg]=[];b7.delegateCount=0;if(!cf.setup||cf.setup.call(b8,ca,e,cc)===false){if(b8.addEventListener){b8.addEventListener(cg,cc,false)}else{if(b8.attachEvent){b8.attachEvent("on"+cg,cc)}}}}if(cf.add){cf.add.call(b8,ch);if(!ch.handler.guid){ch.handler.guid=ci.guid}}if(b9){b7.splice(b7.delegateCount++,0,ch)}else{b7.push(ch)}bI.event.global[cg]=true}b8=null},remove:function(b7,cd,ck,b8,cc){var ca,ch,cb,b9,cj,ci,cf,b6,cg,e,i,ce=bI.hasData(b7)&&bI._data(b7);if(!ce||!(ci=ce.events)){return}cd=(cd||"").match(aF)||[""];cj=cd.length;while(cj--){cb=bx.exec(cd[cj])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){for(cg in ci){bI.event.remove(b7,cg+cd[cj],ck,b8,true)}continue}cf=bI.event.special[cg]||{};cg=(b8?cf.delegateType:cf.bindType)||cg;b6=ci[cg]||[];cb=cb[2]&&new RegExp("(^|\\.)"+e.join("\\.(?:.*\\.|)")+"(\\.|$)");b9=ca=b6.length;while(ca--){ch=b6[ca];if((cc||i===ch.origType)&&(!ck||ck.guid===ch.guid)&&(!cb||cb.test(ch.namespace))&&(!b8||b8===ch.selector||b8==="**"&&ch.selector)){b6.splice(ca,1);if(ch.selector){b6.delegateCount--}if(cf.remove){cf.remove.call(b7,ch)}}}if(b9&&!b6.length){if(!cf.teardown||cf.teardown.call(b7,e,ce.handle)===false){bI.removeEvent(b7,cg,ce.handle)}delete ci[cg]}}if(bI.isEmptyObject(ci)){delete ce.handle;bI._removeData(b7,"events")}},trigger:function(b6,cd,b9,ck){var ce,b8,ci,cj,cg,cc,cb,ca=[b9||n],ch=K.call(b6,"type")?b6.type:b6,b7=K.call(b6,"namespace")?b6.namespace.split("."):[];ci=cc=b9=b9||n;if(b9.nodeType===3||b9.nodeType===8){return}if(bC.test(ch+bI.event.triggered)){return}if(ch.indexOf(".")>=0){b7=ch.split(".");ch=b7.shift();b7.sort()}b8=ch.indexOf(":")<0&&"on"+ch;b6=b6[bI.expando]?b6:new bI.Event(ch,typeof b6==="object"&&b6);b6.isTrigger=ck?2:3;b6.namespace=b7.join(".");b6.namespace_re=b6.namespace?new RegExp("(^|\\.)"+b7.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;b6.result=undefined;if(!b6.target){b6.target=b9}cd=cd==null?[b6]:bI.makeArray(cd,[b6]);cg=bI.event.special[ch]||{};if(!ck&&cg.trigger&&cg.trigger.apply(b9,cd)===false){return}if(!ck&&!cg.noBubble&&!bI.isWindow(b9)){cj=cg.delegateType||ch;if(!bC.test(cj+ch)){ci=ci.parentNode}for(;ci;ci=ci.parentNode){ca.push(ci);cc=ci}if(cc===(b9.ownerDocument||n)){ca.push(cc.defaultView||cc.parentWindow||a5)}}cb=0;while((ci=ca[cb++])&&!b6.isPropagationStopped()){b6.type=cb>1?cj:cg.bindType||ch;ce=(bI._data(ci,"events")||{})[b6.type]&&bI._data(ci,"handle");if(ce){ce.apply(ci,cd)}ce=b8&&ci[b8];if(ce&&ce.apply&&bI.acceptData(ci)){b6.result=ce.apply(ci,cd);if(b6.result===false){b6.preventDefault()}}}b6.type=ch;if(!ck&&!b6.isDefaultPrevented()){if((!cg._default||cg._default.apply(ca.pop(),cd)===false)&&bI.acceptData(b9)){if(b8&&b9[ch]&&!bI.isWindow(b9)){cc=b9[b8];if(cc){b9[b8]=null}bI.event.triggered=ch;try{b9[ch]()}catch(cf){}bI.event.triggered=undefined;if(cc){b9[b8]=cc}}}}return b6.result},dispatch:function(e){e=bI.event.fix(e);var b9,ca,ce,b6,b8,cd=[],cc=P.call(arguments),b7=(bI._data(this,"events")||{})[e.type]||[],cb=bI.event.special[e.type]||{};cc[0]=e;e.delegateTarget=this;if(cb.preDispatch&&cb.preDispatch.call(this,e)===false){return}cd=bI.event.handlers.call(this,e,b7);b9=0;while((b6=cd[b9++])&&!e.isPropagationStopped()){e.currentTarget=b6.elem;b8=0;while((ce=b6.handlers[b8++])&&!e.isImmediatePropagationStopped()){if(!e.namespace_re||e.namespace_re.test(ce.namespace)){e.handleObj=ce;e.data=ce.data;ca=((bI.event.special[ce.origType]||{}).handle||ce.handler).apply(b6.elem,cc);if(ca!==undefined){if((e.result=ca)===false){e.preventDefault();e.stopPropagation()}}}}}if(cb.postDispatch){cb.postDispatch.call(this,e)}return e.result},handlers:function(e,b7){var b6,cc,ca,b9,cb=[],b8=b7.delegateCount,cd=e.target;if(b8&&cd.nodeType&&(!e.button||e.type!=="click")){for(;cd!=this;cd=cd.parentNode||this){if(cd.nodeType===1&&(cd.disabled!==true||e.type!=="click")){ca=[];for(b9=0;b9=0:bI.find(b6,this,null,[cd]).length}if(ca[b6]){ca.push(cc)}}if(ca.length){cb.push({elem:cd,handlers:ca})}}}}if(b8]","i"),b5=/^\s+/,aH=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,o=/<([\w:]+)/,b0=/\s*$/g,W={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:D.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},aT=B(n),k=aT.appendChild(n.createElement("div"));W.optgroup=W.option;W.tbody=W.tfoot=W.colgroup=W.caption=W.thead;W.th=W.td;function l(b8,e){var b6,b9,b7=0,ca=typeof b8.getElementsByTagName!==aC?b8.getElementsByTagName(e||"*"):typeof b8.querySelectorAll!==aC?b8.querySelectorAll(e||"*"):undefined;if(!ca){for(ca=[],b6=b8.childNodes||b8;(b9=b6[b7])!=null;b7++){if(!e||bI.nodeName(b9,e)){ca.push(b9)}else{bI.merge(ca,l(b9,e))}}}return e===undefined||e&&bI.nodeName(b8,e)?bI.merge([b8],ca):ca}function bY(e){if(aM.test(e.type)){e.defaultChecked=e.checked}}function a3(i,e){return bI.nodeName(i,"table")&&bI.nodeName(e.nodeType!==11?e:e.firstChild,"tr")?i.getElementsByTagName("tbody")[0]||i.appendChild(i.ownerDocument.createElement("tbody")):i}function u(e){e.type=(bI.find.attr(e,"type")!==null)+"/"+e.type;return e}function bf(i){var e=ar.exec(i.type);if(e){i.type=e[1]}else{i.removeAttribute("type")}return i}function bu(e,b7){var b8,b6=0;for(;(b8=e[b6])!=null;b6++){bI._data(b8,"globalEval",!b7||bI._data(b7[b6],"globalEval"))}}function at(cc,b6){if(b6.nodeType!==1||!bI.hasData(cc)){return}var b9,b8,e,cb=bI._data(cc),ca=bI._data(b6,cb),b7=cb.events;if(b7){delete ca.handle;ca.events={};for(b9 in b7){for(b8=0,e=b7[b9].length;b8")){cd=b6.cloneNode(true)}else{k.innerHTML=b6.outerHTML;k.removeChild(cd=k.firstChild)}if((!D.noCloneEvent||!D.noCloneChecked)&&(b6.nodeType===1||b6.nodeType===11)&&!bI.isXMLDoc(b6)){ca=l(cd);cb=l(b6);for(b9=0;(b7=cb[b9])!=null;++b9){if(ca[b9]){T(b7,ca[b9])}}}if(b8){if(e){cb=cb||l(b6);ca=ca||l(cd);for(b9=0;(b7=cb[b9])!=null;b9++){at(b7,ca[b9])}}else{at(b6,cd)}}ca=l(cd,"script");if(ca.length>0){bu(ca,!cc&&l(b6,"script"))}ca=cb=b7=null;return cd},buildFragment:function(b6,b8,cd,ci){var ce,ca,cc,ch,cj,cg,b7,cb=b6.length,b9=B(b8),e=[],cf=0;for(;cf")+b7[2];ce=b7[0];while(ce--){ch=ch.lastChild}if(!D.leadingWhitespace&&b5.test(ca)){e.push(b8.createTextNode(b5.exec(ca)[0]))}if(!D.tbody){ca=cj==="table"&&!b0.test(ca)?ch.firstChild:b7[1]===""&&!b0.test(ca)?ch:0;ce=ca&&ca.childNodes.length;while(ce--){if(bI.nodeName((cg=ca.childNodes[ce]),"tbody")&&!cg.childNodes.length){ca.removeChild(cg)}}}bI.merge(e,ch.childNodes);ch.textContent="";while(ch.firstChild){ch.removeChild(ch.firstChild)}ch=b9.lastChild}}}}if(ch){b9.removeChild(ch)}if(!D.appendChecked){bI.grep(l(e,"input"),bY)}cf=0;while((ca=e[cf++])){if(ci&&bI.inArray(ca,ci)!==-1){continue}cc=bI.contains(ca.ownerDocument,ca);ch=l(b9.appendChild(ca),"script");if(cc){bu(ch)}if(cd){ce=0;while((ca=ch[ce++])){if(bB.test(ca.type||"")){cd.push(ca)}}}}ch=null;return b9},cleanData:function(b6,ce){var b8,cd,b7,b9,ca=0,cf=bI.expando,e=bI.cache,cb=D.deleteExpando,cc=bI.event.special;for(;(b8=b6[ca])!=null;ca++){if(ce||bI.acceptData(b8)){b7=b8[cf];b9=b7&&e[b7];if(b9){if(b9.events){for(cd in b9.events){if(cc[cd]){bI.event.remove(b8,cd)}else{bI.removeEvent(b8,cd,b9.handle)}}}if(e[b7]){delete e[b7];if(cb){delete b8[cf]}else{if(typeof b8.removeAttribute!==aC){b8.removeAttribute(cf)}else{b8[cf]=null}}aP.push(b7)}}}}}});bI.fn.extend({text:function(e){return aB(this,function(i){return i===undefined?bI.text(this):this.empty().append((this[0]&&this[0].ownerDocument||n).createTextNode(i))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.insertBefore(e,i.firstChild)}})},before:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this)}})},after:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this.nextSibling)}})},remove:function(e,b9){var b8,b6=e?bI.filter(e,this):this,b7=0;for(;(b8=b6[b7])!=null;b7++){if(!b9&&b8.nodeType===1){bI.cleanData(l(b8))}if(b8.parentNode){if(b9&&bI.contains(b8.ownerDocument,b8)){bu(l(b8,"script"))}b8.parentNode.removeChild(b8)}}return this},empty:function(){var b6,e=0;for(;(b6=this[e])!=null;e++){if(b6.nodeType===1){bI.cleanData(l(b6,false))}while(b6.firstChild){b6.removeChild(b6.firstChild)}if(b6.options&&bI.nodeName(b6,"select")){b6.options.length=0}}return this},clone:function(i,e){i=i==null?false:i;e=e==null?i:e;return this.map(function(){return bI.clone(this,i,e)})},html:function(e){return aB(this,function(b9){var b8=this[0]||{},b7=0,b6=this.length;if(b9===undefined){return b8.nodeType===1?b8.innerHTML.replace(aD,""):undefined}if(typeof b9==="string"&&!an.test(b9)&&(D.htmlSerialize||!M.test(b9))&&(D.leadingWhitespace||!b5.test(b9))&&!W[(o.exec(b9)||["",""])[1].toLowerCase()]){b9=b9.replace(aH,"<$1>");try{for(;b71&&typeof ce==="string"&&!D.checkClone&&bW.test(ce))){return this.each(function(cj){var i=cf.eq(cj);if(b6){cd[0]=ce.call(this,cj,i.html())}i.domManip(cd,ci)})}if(b8){cc=bI.buildFragment(cd,this[0].ownerDocument,false,this);cb=cc.firstChild;if(cc.childNodes.length===1){cc=cb}if(cb){b9=bI.map(l(cc,"script"),u);e=b9.length;for(;ca")).appendTo(i.documentElement);i=(aI[0].contentWindow||aI[0].contentDocument).document;i.write();i.close();e=a4(b6,i);aI.detach()}bl[b6]=e}return e}(function(){var e;D.shrinkWrapBlocks=function(){if(e!=null){return e}e=false;var b7,i,b6;i=n.getElementsByTagName("body")[0];if(!i||!i.style){return}b7=n.createElement("div");b6=n.createElement("div");b6.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";i.appendChild(b6).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1";b7.appendChild(n.createElement("div")).style.width="5px";e=b7.offsetWidth!==3}i.removeChild(b6);return e}})();var aZ=(/^margin/);var Y=new RegExp("^("+aE+")(?!px)[a-z%]+$","i");var bq,G,bo=/^(top|right|bottom|left)$/;if(a5.getComputedStyle){bq=function(e){if(e.ownerDocument.defaultView.opener){return e.ownerDocument.defaultView.getComputedStyle(e,null)}return a5.getComputedStyle(e,null)};G=function(cb,i,ca){var b8,b7,b9,e,b6=cb.style;ca=ca||bq(cb);e=ca?ca.getPropertyValue(i)||ca[i]:undefined;if(ca){if(e===""&&!bI.contains(cb.ownerDocument,cb)){e=bI.style(cb,i)}if(Y.test(e)&&aZ.test(i)){b8=b6.width;b7=b6.minWidth;b9=b6.maxWidth;b6.minWidth=b6.maxWidth=b6.width=e;e=ca.width;b6.width=b8;b6.minWidth=b7;b6.maxWidth=b9}}return e===undefined?e:e+""}}else{if(n.documentElement.currentStyle){bq=function(e){return e.currentStyle};G=function(ca,b7,b9){var cb,i,e,b6,b8=ca.style;b9=b9||bq(ca);b6=b9?b9[b7]:undefined;if(b6==null&&b8&&b8[b7]){b6=b8[b7]}if(Y.test(b6)&&!bo.test(b7)){cb=b8.left;i=ca.runtimeStyle;e=i&&i.left;if(e){i.left=ca.currentStyle.left}b8.left=b7==="fontSize"?"1em":b6;b6=b8.pixelLeft+"px";b8.left=cb;if(e){i.left=e}}return b6===undefined?b6:b6+""||"auto"}}}function a7(e,i){return{get:function(){var b6=e();if(b6==null){return}if(b6){delete this.get;return}return(this.get=i).apply(this,arguments)}}}(function(){var cb,b9,b7,ca,b6,b8,i;cb=n.createElement("div");cb.innerHTML="
    a";b7=cb.getElementsByTagName("a")[0];b9=b7&&b7.style;if(!b9){return}b9.cssText="float:left;opacity:.5";D.opacity=b9.opacity==="0.5";D.cssFloat=!!b9.cssFloat;cb.style.backgroundClip="content-box";cb.cloneNode(true).style.backgroundClip="";D.clearCloneStyle=cb.style.backgroundClip==="content-box";D.boxSizing=b9.boxSizing===""||b9.MozBoxSizing===""||b9.WebkitBoxSizing==="";bI.extend(D,{reliableHiddenOffsets:function(){if(b8==null){e()}return b8},boxSizingReliable:function(){if(b6==null){e()}return b6},pixelPosition:function(){if(ca==null){e()}return ca},reliableMarginRight:function(){if(i==null){e()}return i}});function e(){var cf,cc,cd,ce;cc=n.getElementsByTagName("body")[0];if(!cc||!cc.style){return}cf=n.createElement("div");cd=n.createElement("div");cd.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";cc.appendChild(cd).appendChild(cf);cf.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute";ca=b6=false;i=true;if(a5.getComputedStyle){ca=(a5.getComputedStyle(cf,null)||{}).top!=="1%";b6=(a5.getComputedStyle(cf,null)||{width:"4px"}).width==="4px";ce=cf.appendChild(n.createElement("div"));ce.style.cssText=cf.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0";ce.style.marginRight=ce.style.width="0";cf.style.width="1px";i=!parseFloat((a5.getComputedStyle(ce,null)||{}).marginRight);cf.removeChild(ce)}cf.innerHTML="
    t
    ";ce=cf.getElementsByTagName("td");ce[0].style.cssText="margin:0;border:0;padding:0;display:none";b8=ce[0].offsetHeight===0;if(b8){ce[0].style.display="";ce[1].style.display="none";b8=ce[0].offsetHeight===0}cc.removeChild(cd)}})();bI.swap=function(b9,b8,ca,b7){var b6,i,e={};for(i in b8){e[i]=b9.style[i];b9.style[i]=b8[i]}b6=ca.apply(b9,b7||[]);for(i in b8){b9.style[i]=e[i]}return b6};var bj=/alpha\([^)]*\)/i,aU=/opacity\s*=\s*([^)]*)/,H=/^(none|table(?!-c[ea]).+)/,bb=new RegExp("^("+aE+")(.*)$","i"),V=new RegExp("^([+-])=("+aE+")","i"),be={position:"absolute",visibility:"hidden",display:"block"},bD={letterSpacing:"0",fontWeight:"400"},aw=["Webkit","O","Moz","ms"];function c(b8,b6){if(b6 in b8){return b6}var b9=b6.charAt(0).toUpperCase()+b6.slice(1),e=b6,b7=aw.length;while(b7--){b6=aw[b7]+b9;if(b6 in b8){return b6}}return e}function s(ca,e){var cb,b8,b9,i=[],b6=0,b7=ca.length;for(;b6=1||b9==="")&&bI.trim(b6.replace(bj,""))===""&&b7.removeAttribute){b7.removeAttribute("filter");if(b9===""||i&&!i.filter){return}}b7.filter=bj.test(b6)?b6.replace(bj,e):b6+" "+e}}}bI.cssHooks.marginRight=a7(D.reliableMarginRight,function(i,e){if(e){return bI.swap(i,{display:"inline-block"},G,[i,"marginRight"])}});bI.each({margin:"",padding:"",border:"Width"},function(e,i){bI.cssHooks[e+i]={expand:function(b8){var b7=0,b6={},b9=typeof b8==="string"?b8.split(" "):[b8];for(;b7<4;b7++){b6[e+bT[b7]+i]=b9[b7]||b9[b7-2]||b9[0]}return b6}};if(!aZ.test(e)){bI.cssHooks[e+i].set=aN}});bI.fn.extend({css:function(e,i){return aB(this,function(ca,b7,cb){var b9,b6,cc={},b8=0;if(bI.isArray(b7)){b9=bq(ca);b6=b7.length;for(;b81)},show:function(){return s(this,true)},hide:function(){return s(this)},toggle:function(e){if(typeof e==="boolean"){return e?this.show():this.hide()}return this.each(function(){if(S(this)){bI(this).show()}else{bI(this).hide()}})}});function J(b6,i,b8,e,b7){return new J.prototype.init(b6,i,b8,e,b7)}bI.Tween=J;J.prototype={constructor:J,init:function(b7,i,b9,e,b8,b6){this.elem=b7;this.prop=b9;this.easing=b8||"swing";this.options=i;this.start=this.now=this.cur();this.end=e;this.unit=b6||(bI.cssNumber[b9]?"":"px")},cur:function(){var e=J.propHooks[this.prop];return e&&e.get?e.get(this):J.propHooks._default.get(this)},run:function(b6){var i,e=J.propHooks[this.prop];if(this.options.duration){this.pos=i=bI.easing[this.easing](b6,this.options.duration*b6,0,1,this.options.duration)}else{this.pos=i=b6}this.now=(this.end-this.start)*i+this.start;if(this.options.step){this.options.step.call(this.elem,this.now,this)}if(e&&e.set){e.set(this)}else{J.propHooks._default.set(this)}return this}};J.prototype.init.prototype=J.prototype;J.propHooks={_default:{get:function(i){var e;if(i.elem[i.prop]!=null&&(!i.elem.style||i.elem.style[i.prop]==null)){return i.elem[i.prop]}e=bI.css(i.elem,i.prop,"");return !e||e==="auto"?0:e},set:function(e){if(bI.fx.step[e.prop]){bI.fx.step[e.prop](e)}else{if(e.elem.style&&(e.elem.style[bI.cssProps[e.prop]]!=null||bI.cssHooks[e.prop])){bI.style(e.elem,e.prop,e.now+e.unit)}else{e.elem[e.prop]=e.now}}}}};J.propHooks.scrollTop=J.propHooks.scrollLeft={set:function(e){if(e.elem.nodeType&&e.elem.parentNode){e.elem[e.prop]=e.now}}};bI.easing={linear:function(e){return e},swing:function(e){return 0.5-Math.cos(e*Math.PI)/2}};bI.fx=J.prototype.init;bI.fx.step={};var N,ae,bR=/^(?:toggle|show|hide)$/,bJ=new RegExp("^(?:([+-])=|)("+aE+")([a-z%]*)$","i"),bP=/queueHooks$/,aG=[h],a2={"*":[function(e,ca){var cc=this.createTween(e,ca),b8=cc.cur(),b7=bJ.exec(ca),cb=b7&&b7[3]||(bI.cssNumber[e]?"":"px"),i=(bI.cssNumber[e]||cb!=="px"&&+b8)&&bJ.exec(bI.css(cc.elem,e)),b6=1,b9=20;if(i&&i[3]!==cb){cb=cb||i[3];b7=b7||[];i=+b8||1;do{b6=b6||".5";i=i/b6;bI.style(cc.elem,e,i+cb)}while(b6!==(b6=cc.cur()/b8)&&b6!==1&&--b9)}if(b7){i=cc.start=+i||+b8||0;cc.unit=cb;cc.end=b7[1]?i+(b7[1]+1)*b7[2]:+b7[2]}return cc}]};function bn(){setTimeout(function(){N=undefined});return(N=bI.now())}function bH(b7,b9){var b8,e={height:b7},b6=0;b9=b9?1:0;for(;b6<4;b6+=2-b9){b8=bT[b6];e["margin"+b8]=e["padding"+b8]=b7}if(b9){e.opacity=e.width=b7}return e}function bd(b8,ca,b7){var i,b9=(a2[ca]||[]).concat(a2["*"]),e=0,b6=b9.length;for(;e
    a";i=b8.getElementsByTagName("a")[0];e=n.createElement("select");b7=e.appendChild(n.createElement("option"));b6=b8.getElementsByTagName("input")[0];i.style.cssText="top:1px";D.getSetAttribute=b8.className!=="t";D.style=/top/.test(i.getAttribute("style"));D.hrefNormalized=i.getAttribute("href")==="/a";D.checkOn=!!b6.value;D.optSelected=b7.selected;D.enctype=!!n.createElement("form").enctype;e.disabled=true;D.optDisabled=!b7.disabled;b6=n.createElement("input");b6.setAttribute("value","");D.input=b6.getAttribute("value")==="";b6.value="t";b6.setAttribute("type","radio");D.radioValue=b6.value==="t"})();var al=/\r/g;bI.fn.extend({val:function(b7){var e,i,b8,b6=this[0];if(!arguments.length){if(b6){e=bI.valHooks[b6.type]||bI.valHooks[b6.nodeName.toLowerCase()];if(e&&"get" in e&&(i=e.get(b6,"value"))!==undefined){return i}i=b6.value;return typeof i==="string"?i.replace(al,""):i==null?"":i}return}b8=bI.isFunction(b7);return this.each(function(b9){var ca;if(this.nodeType!==1){return}if(b8){ca=b7.call(this,b9,bI(this).val())}else{ca=b7}if(ca==null){ca=""}else{if(typeof ca==="number"){ca+=""}else{if(bI.isArray(ca)){ca=bI.map(ca,function(cb){return cb==null?"":cb+""})}}}e=bI.valHooks[this.type]||bI.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,ca,"value")===undefined){this.value=ca}})}});bI.extend({valHooks:{option:{get:function(e){var i=bI.find.attr(e,"value");return i!=null?i:bI.trim(bI.text(e))}},select:{get:function(e){var cb,b7,cd=e.options,b9=e.selectedIndex,b8=e.type==="select-one"||b9<0,cc=b8?null:[],ca=b8?b9+1:cd.length,b6=b9<0?ca:b8?b9:0;for(;b6=0){try{b9.selected=cc=true}catch(b6){b9.scrollHeight}}else{b9.selected=false}}if(!cc){ca.selectedIndex=-1}return b7}}}});bI.each(["radio","checkbox"],function(){bI.valHooks[this]={set:function(e,i){if(bI.isArray(i)){return(e.checked=bI.inArray(bI(e).val(),i)>=0)}}};if(!D.checkOn){bI.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value}}});var ba,b3,bO=bI.expr.attrHandle,aq=/^(?:checked|selected)$/i,bN=D.getSetAttribute,bF=D.input;bI.fn.extend({attr:function(e,i){return aB(this,bI.attr,e,i,arguments.length>1)},removeAttr:function(e){return this.each(function(){bI.removeAttr(this,e)})}});bI.extend({attr:function(b8,b7,b9){var e,b6,i=b8.nodeType;if(!b8||i===3||i===8||i===2){return}if(typeof b8.getAttribute===aC){return bI.prop(b8,b7,b9)}if(i!==1||!bI.isXMLDoc(b8)){b7=b7.toLowerCase();e=bI.attrHooks[b7]||(bI.expr.match.bool.test(b7)?b3:ba)}if(b9!==undefined){if(b9===null){bI.removeAttr(b8,b7)}else{if(e&&"set" in e&&(b6=e.set(b8,b9,b7))!==undefined){return b6}else{b8.setAttribute(b7,b9+"");return b9}}}else{if(e&&"get" in e&&(b6=e.get(b8,b7))!==null){return b6}else{b6=bI.find.attr(b8,b7);return b6==null?undefined:b6}}},removeAttr:function(b7,b9){var e,b8,b6=0,ca=b9&&b9.match(aF);if(ca&&b7.nodeType===1){while((e=ca[b6++])){b8=bI.propFix[e]||e;if(bI.expr.match.bool.test(e)){if(bF&&bN||!aq.test(e)){b7[b8]=false}else{b7[bI.camelCase("default-"+e)]=b7[b8]=false}}else{bI.attr(b7,e,"")}b7.removeAttribute(bN?e:b8)}}},attrHooks:{type:{set:function(e,i){if(!D.radioValue&&i==="radio"&&bI.nodeName(e,"input")){var b6=e.value;e.setAttribute("type",i);if(b6){e.value=b6}return i}}}}});b3={set:function(i,b6,e){if(b6===false){bI.removeAttr(i,e)}else{if(bF&&bN||!aq.test(e)){i.setAttribute(!bN&&bI.propFix[e]||e,e)}else{i[bI.camelCase("default-"+e)]=i[e]=true}}return e}};bI.each(bI.expr.match.bool.source.match(/\w+/g),function(b7,b6){var e=bO[b6]||bI.find.attr;bO[b6]=bF&&bN||!aq.test(b6)?function(b9,b8,cb){var i,ca;if(!cb){ca=bO[b8];bO[b8]=i;i=e(b9,b8,cb)!=null?b8.toLowerCase():null;bO[b8]=ca}return i}:function(b8,i,b9){if(!b9){return b8[bI.camelCase("default-"+i)]?i.toLowerCase():null}}});if(!bF||!bN){bI.attrHooks.value={set:function(i,b6,e){if(bI.nodeName(i,"input")){i.defaultValue=b6}else{return ba&&ba.set(i,b6,e)}}}}if(!bN){ba={set:function(b6,b7,i){var e=b6.getAttributeNode(i);if(!e){b6.setAttributeNode((e=b6.ownerDocument.createAttribute(i)))}e.value=b7+="";if(i==="value"||b7===b6.getAttribute(i)){return b7}}};bO.id=bO.name=bO.coords=function(b6,i,b7){var e;if(!b7){return(e=b6.getAttributeNode(i))&&e.value!==""?e.value:null}};bI.valHooks.button={get:function(b6,i){var e=b6.getAttributeNode(i);if(e&&e.specified){return e.value}},set:ba.set};bI.attrHooks.contenteditable={set:function(i,b6,e){ba.set(i,b6===""?false:b6,e)}};bI.each(["width","height"],function(b6,e){bI.attrHooks[e]={set:function(i,b7){if(b7===""){i.setAttribute(e,"auto");return b7}}}})}if(!D.style){bI.attrHooks.style={get:function(e){return e.style.cssText||undefined},set:function(e,i){return(e.style.cssText=i+"")}}}var aJ=/^(?:input|select|textarea|button|object)$/i,F=/^(?:a|area)$/i;bI.fn.extend({prop:function(e,i){return aB(this,bI.prop,e,i,arguments.length>1)},removeProp:function(e){e=bI.propFix[e]||e;return this.each(function(){try{this[e]=undefined;delete this[e]}catch(i){}})}});bI.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(b9,b7,ca){var b6,e,b8,i=b9.nodeType;if(!b9||i===3||i===8||i===2){return}b8=i!==1||!bI.isXMLDoc(b9);if(b8){b7=bI.propFix[b7]||b7;e=bI.propHooks[b7]}if(ca!==undefined){return e&&"set" in e&&(b6=e.set(b9,ca,b7))!==undefined?b6:(b9[b7]=ca)}else{return e&&"get" in e&&(b6=e.get(b9,b7))!==null?b6:b9[b7]}},propHooks:{tabIndex:{get:function(i){var e=bI.find.attr(i,"tabindex");return e?parseInt(e,10):aJ.test(i.nodeName)||F.test(i.nodeName)&&i.href?0:-1}}}});if(!D.hrefNormalized){bI.each(["href","src"],function(b6,e){bI.propHooks[e]={get:function(i){return i.getAttribute(e,4)}}})}if(!D.optSelected){bI.propHooks.selected={get:function(i){var e=i.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}}}bI.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){bI.propFix[this.toLowerCase()]=this});if(!D.enctype){bI.propFix.enctype="encoding"}var bL=/[\t\r\n\f]/g;bI.fn.extend({addClass:function(cd){var b7,b6,ce,cb,b8,e,b9=0,ca=this.length,cc=typeof cd==="string"&&cd;if(bI.isFunction(cd)){return this.each(function(i){bI(this).addClass(cd.call(this,i,this.className))})}if(cc){b7=(cd||"").match(aF)||[];for(;b9=0){ce=ce.replace(" "+cb+" "," ")}}e=cd?bI.trim(ce):"";if(b6.className!==e){b6.className=e}}}}return this},toggleClass:function(b6,e){var i=typeof b6;if(typeof e==="boolean"&&i==="string"){return e?this.addClass(b6):this.removeClass(b6)}if(bI.isFunction(b6)){return this.each(function(b7){bI(this).toggleClass(b6.call(this,b7,this.className,e),e)})}return this.each(function(){if(i==="string"){var b9,b8=0,b7=bI(this),ca=b6.match(aF)||[];while((b9=ca[b8++])){if(b7.hasClass(b9)){b7.removeClass(b9)}else{b7.addClass(b9)}}}else{if(i===aC||i==="boolean"){if(this.className){bI._data(this,"__className__",this.className)}this.className=this.className||b6===false?"":bI._data(this,"__className__")||""}}})},hasClass:function(e){var b8=" "+e+" ",b7=0,b6=this.length;for(;b7=0){return true}}return false}});bI.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(b6,e){bI.fn[e]=function(b7,i){return arguments.length>0?this.on(e,null,b7,i):this.trigger(e)}});bI.fn.extend({hover:function(e,i){return this.mouseenter(e).mouseleave(i||e)},bind:function(e,b6,i){return this.on(e,null,b6,i)},unbind:function(e,i){return this.off(e,null,i)},delegate:function(e,i,b7,b6){return this.on(i,e,b7,b6)},undelegate:function(e,i,b6){return arguments.length===1?this.off(e,"**"):this.off(i,e||"**",b6)}});var bp=bI.now();var bQ=(/\?/);var a1=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;bI.parseJSON=function(e){if(a5.JSON&&a5.JSON.parse){return a5.JSON.parse(e+"")}var b7,b6=null,i=bI.trim(e+"");return i&&!bI.trim(i.replace(a1,function(ca,b8,b9,cb){if(b7&&b8){b6=0}if(b6===0){return ca}b7=b9||b8;b6+=!cb-!b9;return""}))?(Function("return "+i))():bI.error("Invalid JSON: "+e)};bI.parseXML=function(b7){var i,b6;if(!b7||typeof b7!=="string"){return null}try{if(a5.DOMParser){b6=new DOMParser();i=b6.parseFromString(b7,"text/xml")}else{i=new ActiveXObject("Microsoft.XMLDOM");i.async="false";i.loadXML(b7)}}catch(b8){i=undefined}if(!i||!i.documentElement||i.getElementsByTagName("parsererror").length){bI.error("Invalid XML: "+b7)}return i};var b4,aa,ap=/#.*$/,R=/([?&])_=[^&]*/,ah=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,C=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,r=/^(?:GET|HEAD)$/,aK=/^\/\//,aV=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,w={},a9={},aX="*/".concat("*");try{aa=location.href}catch(bi){aa=n.createElement("a");aa.href="";aa=aa.href}b4=aV.exec(aa.toLowerCase())||[];function bK(e){return function(b9,ca){if(typeof b9!=="string"){ca=b9;b9="*"}var b6,b7=0,b8=b9.toLowerCase().match(aF)||[];if(bI.isFunction(ca)){while((b6=b8[b7++])){if(b6.charAt(0)==="+"){b6=b6.slice(1)||"*";(e[b6]=e[b6]||[]).unshift(ca)}else{(e[b6]=e[b6]||[]).push(ca)}}}}}function p(e,b6,ca,b7){var i={},b8=(e===a9);function b9(cb){var cc;i[cb]=true;bI.each(e[cb]||[],function(ce,cd){var cf=cd(b6,ca,b7);if(typeof cf==="string"&&!b8&&!i[cf]){b6.dataTypes.unshift(cf);b9(cf);return false}else{if(b8){return !(cc=cf)}}});return cc}return b9(b6.dataTypes[0])||!i["*"]&&b9("*")}function t(b6,b7){var e,i,b8=bI.ajaxSettings.flatOptions||{};for(i in b7){if(b7[i]!==undefined){(b8[i]?b6:(e||(e={})))[i]=b7[i]}}if(e){bI.extend(true,b6,e)}return b6}function g(cc,cb,b8){var e,b7,b6,b9,i=cc.contents,ca=cc.dataTypes;while(ca[0]==="*"){ca.shift();if(b7===undefined){b7=cc.mimeType||cb.getResponseHeader("Content-Type")}}if(b7){for(b9 in i){if(i[b9]&&i[b9].test(b7)){ca.unshift(b9);break}}}if(ca[0] in b8){b6=ca[0]}else{for(b9 in b8){if(!ca[0]||cc.converters[b9+" "+ca[0]]){b6=b9;break}if(!e){e=b9}}b6=b6||e}if(b6){if(b6!==ca[0]){ca.unshift(b6)}return b8[b6]}}function ag(cg,b8,cd,b6){var i,cb,ce,b9,b7,cf={},cc=cg.dataTypes.slice();if(cc[1]){for(ce in cg.converters){cf[ce.toLowerCase()]=cg.converters[ce]}}cb=cc.shift();while(cb){if(cg.responseFields[cb]){cd[cg.responseFields[cb]]=b8}if(!b7&&b6&&cg.dataFilter){b8=cg.dataFilter(b8,cg.dataType)}b7=cb;cb=cc.shift();if(cb){if(cb==="*"){cb=b7}else{if(b7!=="*"&&b7!==cb){ce=cf[b7+" "+cb]||cf["* "+cb];if(!ce){for(i in cf){b9=i.split(" ");if(b9[1]===cb){ce=cf[b7+" "+b9[0]]||cf["* "+b9[0]];if(ce){if(ce===true){ce=cf[i]}else{if(cf[i]!==true){cb=b9[0];cc.unshift(b9[1])}}break}}}}if(ce!==true){if(ce&&cg["throws"]){b8=ce(b8)}else{try{b8=ce(b8)}catch(ca){return{state:"parsererror",error:ce?ca:"No conversion from "+b7+" to "+cb}}}}}}}}return{state:"success",data:b8}}bI.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:aa,type:"GET",isLocal:C.test(b4[1]),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":aX,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":bI.parseJSON,"text xml":bI.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(i,e){return e?t(t(i,bI.ajaxSettings),e):t(bI.ajaxSettings,i)},ajaxPrefilter:bK(w),ajaxTransport:bK(a9),ajax:function(ca,b7){if(typeof ca==="object"){b7=ca;ca=undefined}b7=b7||{};var cj,cl,cb,cq,cf,b6,cm,b8,ce=bI.ajaxSetup({},b7),cs=ce.context||ce,ch=ce.context&&(cs.nodeType||cs.jquery)?bI(cs):bI.event,cr=bI.Deferred(),co=bI.Callbacks("once memory"),cc=ce.statusCode||{},ci={},cp={},b9=0,cd="canceled",ck={readyState:0,getResponseHeader:function(i){var e;if(b9===2){if(!b8){b8={};while((e=ah.exec(cq))){b8[e[1].toLowerCase()]=e[2]}}e=b8[i.toLowerCase()]}return e==null?null:e},getAllResponseHeaders:function(){return b9===2?cq:null},setRequestHeader:function(i,ct){var e=i.toLowerCase();if(!b9){i=cp[e]=cp[e]||i;ci[i]=ct}return this},overrideMimeType:function(e){if(!b9){ce.mimeType=e}return this},statusCode:function(i){var e;if(i){if(b9<2){for(e in i){cc[e]=[cc[e],i[e]]}}else{ck.always(i[ck.status])}}return this},abort:function(i){var e=i||cd;if(cm){cm.abort(e)}cg(0,e);return this}};cr.promise(ck).complete=co.add;ck.success=ck.done;ck.error=ck.fail;ce.url=((ca||ce.url||aa)+"").replace(ap,"").replace(aK,b4[1]+"//");ce.type=b7.method||b7.type||ce.method||ce.type;ce.dataTypes=bI.trim(ce.dataType||"*").toLowerCase().match(aF)||[""];if(ce.crossDomain==null){cj=aV.exec(ce.url.toLowerCase());ce.crossDomain=!!(cj&&(cj[1]!==b4[1]||cj[2]!==b4[2]||(cj[3]||(cj[1]==="http:"?"80":"443"))!==(b4[3]||(b4[1]==="http:"?"80":"443"))))}if(ce.data&&ce.processData&&typeof ce.data!=="string"){ce.data=bI.param(ce.data,ce.traditional)}p(w,ce,b7,ck);if(b9===2){return ck}b6=bI.event&&ce.global;if(b6&&bI.active++===0){bI.event.trigger("ajaxStart")}ce.type=ce.type.toUpperCase();ce.hasContent=!r.test(ce.type);cb=ce.url;if(!ce.hasContent){if(ce.data){cb=(ce.url+=(bQ.test(cb)?"&":"?")+ce.data);delete ce.data}if(ce.cache===false){ce.url=R.test(cb)?cb.replace(R,"$1_="+bp++):cb+(bQ.test(cb)?"&":"?")+"_="+bp++}}if(ce.ifModified){if(bI.lastModified[cb]){ck.setRequestHeader("If-Modified-Since",bI.lastModified[cb])}if(bI.etag[cb]){ck.setRequestHeader("If-None-Match",bI.etag[cb])}}if(ce.data&&ce.hasContent&&ce.contentType!==false||b7.contentType){ck.setRequestHeader("Content-Type",ce.contentType)}ck.setRequestHeader("Accept",ce.dataTypes[0]&&ce.accepts[ce.dataTypes[0]]?ce.accepts[ce.dataTypes[0]]+(ce.dataTypes[0]!=="*"?", "+aX+"; q=0.01":""):ce.accepts["*"]);for(cl in ce.headers){ck.setRequestHeader(cl,ce.headers[cl])}if(ce.beforeSend&&(ce.beforeSend.call(cs,ck,ce)===false||b9===2)){return ck.abort()}cd="abort";for(cl in {success:1,error:1,complete:1}){ck[cl](ce[cl])}cm=p(a9,ce,b7,ck);if(!cm){cg(-1,"No Transport")}else{ck.readyState=1;if(b6){ch.trigger("ajaxSend",[ck,ce])}if(ce.async&&ce.timeout>0){cf=setTimeout(function(){ck.abort("timeout")},ce.timeout)}try{b9=1;cm.send(ci,cg)}catch(cn){if(b9<2){cg(-1,cn)}else{throw cn}}}function cg(cw,i,cx,cu){var e,cA,cy,cv,cz,ct=i;if(b9===2){return}b9=2;if(cf){clearTimeout(cf)}cm=undefined;cq=cu||"";ck.readyState=cw>0?4:0;e=cw>=200&&cw<300||cw===304;if(cx){cv=g(ce,ck,cx)}cv=ag(ce,cv,ck,e);if(e){if(ce.ifModified){cz=ck.getResponseHeader("Last-Modified");if(cz){bI.lastModified[cb]=cz}cz=ck.getResponseHeader("etag");if(cz){bI.etag[cb]=cz}}if(cw===204||ce.type==="HEAD"){ct="nocontent"}else{if(cw===304){ct="notmodified"}else{ct=cv.state;cA=cv.data;cy=cv.error;e=!cy}}}else{cy=ct;if(cw||!ct){ct="error";if(cw<0){cw=0}}}ck.status=cw;ck.statusText=(i||ct)+"";if(e){cr.resolveWith(cs,[cA,ct,ck])}else{cr.rejectWith(cs,[ck,ct,cy])}ck.statusCode(cc);cc=undefined;if(b6){ch.trigger(e?"ajaxSuccess":"ajaxError",[ck,ce,e?cA:cy])}co.fireWith(cs,[ck,ct]);if(b6){ch.trigger("ajaxComplete",[ck,ce]);if(!(--bI.active)){bI.event.trigger("ajaxStop")}}}return ck},getJSON:function(e,i,b6){return bI.get(e,i,b6,"json")},getScript:function(e,i){return bI.get(e,undefined,i,"script")}});bI.each(["get","post"],function(e,b6){bI[b6]=function(i,b8,b9,b7){if(bI.isFunction(b8)){b7=b7||b9;b9=b8;b8=undefined}return bI.ajax({url:i,type:b6,dataType:b7,data:b8,success:b9})}});bI._evalUrl=function(e){return bI.ajax({url:e,type:"GET",dataType:"script",async:false,global:false,"throws":true})};bI.fn.extend({wrapAll:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapAll(e.call(this,b6))})}if(this[0]){var i=bI(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){i.insertBefore(this[0])}i.map(function(){var b6=this;while(b6.firstChild&&b6.firstChild.nodeType===1){b6=b6.firstChild}return b6}).append(this)}return this},wrapInner:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapInner(e.call(this,b6))})}return this.each(function(){var i=bI(this),b6=i.contents();if(b6.length){b6.wrapAll(e)}else{i.append(e)}})},wrap:function(e){var i=bI.isFunction(e);return this.each(function(b6){bI(this).wrapAll(i?e.call(this,b6):e)})},unwrap:function(){return this.parent().each(function(){if(!bI.nodeName(this,"body")){bI(this).replaceWith(this.childNodes)}}).end()}});bI.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||(!D.reliableHiddenOffsets()&&((e.style&&e.style.display)||bI.css(e,"display"))==="none")};bI.expr.filters.visible=function(e){return !bI.expr.filters.hidden(e)};var bw=/%20/g,aS=/\[\]$/,X=/\r?\n/g,b=/^(?:submit|button|image|reset|file)$/i,au=/^(?:input|select|textarea|keygen)/i;function j(b6,b8,i,b7){var e;if(bI.isArray(b8)){bI.each(b8,function(ca,b9){if(i||aS.test(b6)){b7(b6,b9)}else{j(b6+"["+(typeof b9==="object"?ca:"")+"]",b9,i,b7)}})}else{if(!i&&bI.type(b8)==="object"){for(e in b8){j(b6+"["+e+"]",b8[e],i,b7)}}else{b7(b6,b8)}}}bI.param=function(e,b6){var b7,i=[],b8=function(b9,ca){ca=bI.isFunction(ca)?ca():(ca==null?"":ca);i[i.length]=encodeURIComponent(b9)+"="+encodeURIComponent(ca)};if(b6===undefined){b6=bI.ajaxSettings&&bI.ajaxSettings.traditional}if(bI.isArray(e)||(e.jquery&&!bI.isPlainObject(e))){bI.each(e,function(){b8(this.name,this.value)})}else{for(b7 in e){j(b7,e[b7],b6,b8)}}return i.join("&").replace(bw,"+")};bI.fn.extend({serialize:function(){return bI.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=bI.prop(this,"elements");return e?bI.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!bI(this).is(":disabled")&&au.test(this.nodeName)&&!b.test(e)&&(this.checked||!aM.test(e))}).map(function(e,b6){var b7=bI(this).val();return b7==null?null:bI.isArray(b7)?bI.map(b7,function(i){return{name:b6.name,value:i.replace(X,"\r\n")}}):{name:b6.name,value:b7.replace(X,"\r\n")}}).get()}});bI.ajaxSettings.xhr=a5.ActiveXObject!==undefined?function(){return !this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&bE()||bg()}:bE;var aA=0,aj={},ay=bI.ajaxSettings.xhr();if(a5.attachEvent){a5.attachEvent("onunload",function(){for(var e in aj){aj[e](undefined,true)}})}D.cors=!!ay&&("withCredentials" in ay);ay=D.ajax=!!ay;if(ay){bI.ajaxTransport(function(e){if(!e.crossDomain||D.cors){var i;return{send:function(b9,b6){var b7,b8=e.xhr(),ca=++aA;b8.open(e.type,e.url,e.async,e.username,e.password);if(e.xhrFields){for(b7 in e.xhrFields){b8[b7]=e.xhrFields[b7]}}if(e.mimeType&&b8.overrideMimeType){b8.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!b9["X-Requested-With"]){b9["X-Requested-With"]="XMLHttpRequest"}for(b7 in b9){if(b9[b7]!==undefined){b8.setRequestHeader(b7,b9[b7]+"")}}b8.send((e.hasContent&&e.data)||null);i=function(cd,cc){var cb,cg,ce;if(i&&(cc||b8.readyState===4)){delete aj[ca];i=undefined;b8.onreadystatechange=bI.noop;if(cc){if(b8.readyState!==4){b8.abort()}}else{ce={};cb=b8.status;if(typeof b8.responseText==="string"){ce.text=b8.responseText}try{cg=b8.statusText}catch(cf){cg=""}if(!cb&&e.isLocal&&!e.crossDomain){cb=ce.text?200:404}else{if(cb===1223){cb=204}}}}if(ce){b6(cb,cg,ce,b8.getAllResponseHeaders())}};if(!e.async){i()}else{if(b8.readyState===4){setTimeout(i)}else{b8.onreadystatechange=aj[ca]=i}}},abort:function(){if(i){i(undefined,true)}}}}})}function bE(){try{return new a5.XMLHttpRequest()}catch(i){}}function bg(){try{return new a5.ActiveXObject("Microsoft.XMLHTTP")}catch(i){}}bI.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){bI.globalEval(e);return e}}});bI.ajaxPrefilter("script",function(e){if(e.cache===undefined){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});bI.ajaxTransport("script",function(b6){if(b6.crossDomain){var e,i=n.head||bI("head")[0]||n.documentElement;return{send:function(b7,b8){e=n.createElement("script");e.async=true;if(b6.scriptCharset){e.charset=b6.scriptCharset}e.src=b6.url;e.onload=e.onreadystatechange=function(ca,b9){if(b9||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(e.parentNode){e.parentNode.removeChild(e)}e=null;if(!b9){b8(200,"success")}}};i.insertBefore(e,i.firstChild)},abort:function(){if(e){e.onload(undefined,true)}}}}});var bs=[],a8=/(=)\?(?=&|$)|\?\?/;bI.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=bs.pop()||(bI.expando+"_"+(bp++));this[e]=true;return e}});bI.ajaxPrefilter("json jsonp",function(b7,e,b8){var ca,i,b6,b9=b7.jsonp!==false&&(a8.test(b7.url)?"url":typeof b7.data==="string"&&!(b7.contentType||"").indexOf("application/x-www-form-urlencoded")&&a8.test(b7.data)&&"data");if(b9||b7.dataTypes[0]==="jsonp"){ca=b7.jsonpCallback=bI.isFunction(b7.jsonpCallback)?b7.jsonpCallback():b7.jsonpCallback;if(b9){b7[b9]=b7[b9].replace(a8,"$1"+ca)}else{if(b7.jsonp!==false){b7.url+=(bQ.test(b7.url)?"&":"?")+b7.jsonp+"="+ca}}b7.converters["script json"]=function(){if(!b6){bI.error(ca+" was not called")}return b6[0]};b7.dataTypes[0]="json";i=a5[ca];a5[ca]=function(){b6=arguments};b8.always(function(){a5[ca]=i;if(b7[ca]){b7.jsonpCallback=e.jsonpCallback;bs.push(ca)}if(b6&&bI.isFunction(i)){i(b6[0])}b6=i=undefined});return"script"}});bI.parseHTML=function(b8,b6,b7){if(!b8||typeof b8!=="string"){return null}if(typeof b6==="boolean"){b7=b6;b6=false}b6=b6||n;var i=a.exec(b8),e=!b7&&[];if(i){return[b6.createElement(i[1])]}i=bI.buildFragment([b8],b6,e);if(e&&e.length){bI(e).remove()}return bI.merge([],i.childNodes)};var b1=bI.fn.load;bI.fn.load=function(b7,ca,cb){if(typeof b7!=="string"&&b1){return b1.apply(this,arguments)}var e,b6,b8,i=this,b9=b7.indexOf(" ");if(b9>=0){e=bI.trim(b7.slice(b9,b7.length));b7=b7.slice(0,b9)}if(bI.isFunction(ca)){cb=ca;ca=undefined}else{if(ca&&typeof ca==="object"){b8="POST"}}if(i.length>0){bI.ajax({url:b7,type:b8,dataType:"html",data:ca}).done(function(cc){b6=arguments;i.html(e?bI("
    ").append(bI.parseHTML(cc)).find(e):cc)}).complete(cb&&function(cd,cc){i.each(cb,b6||[cd.responseText,cc,cd])})}return this};bI.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,b6){bI.fn[b6]=function(i){return this.on(b6,i)}});bI.expr.filters.animated=function(e){return bI.grep(bI.timers,function(i){return e===i.elem}).length};var bX=a5.document.documentElement;function br(e){return bI.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}bI.offset={setOffset:function(b7,ch,cb){var cd,ca,e,b8,b6,cf,cg,cc=bI.css(b7,"position"),b9=bI(b7),ce={};if(cc==="static"){b7.style.position="relative"}b6=b9.offset();e=bI.css(b7,"top");cf=bI.css(b7,"left");cg=(cc==="absolute"||cc==="fixed")&&bI.inArray("auto",[e,cf])>-1;if(cg){cd=b9.position();b8=cd.top;ca=cd.left}else{b8=parseFloat(e)||0;ca=parseFloat(cf)||0}if(bI.isFunction(ch)){ch=ch.call(b7,cb,b6)}if(ch.top!=null){ce.top=(ch.top-b6.top)+b8}if(ch.left!=null){ce.left=(ch.left-b6.left)+ca}if("using" in ch){ch.using.call(b7,ce)}else{b9.css(ce)}}};bI.fn.extend({offset:function(i){if(arguments.length){return i===undefined?this:this.each(function(ca){bI.offset.setOffset(this,i,ca)})}var e,b9,b7={top:0,left:0},b6=this[0],b8=b6&&b6.ownerDocument;if(!b8){return}e=b8.documentElement;if(!bI.contains(e,b6)){return b7}if(typeof b6.getBoundingClientRect!==aC){b7=b6.getBoundingClientRect()}b9=br(b8);return{top:b7.top+(b9.pageYOffset||e.scrollTop)-(e.clientTop||0),left:b7.left+(b9.pageXOffset||e.scrollLeft)-(e.clientLeft||0)}},position:function(){if(!this[0]){return}var b6,b7,e={top:0,left:0},i=this[0];if(bI.css(i,"position")==="fixed"){b7=i.getBoundingClientRect()}else{b6=this.offsetParent();b7=this.offset();if(!bI.nodeName(b6[0],"html")){e=b6.offset()}e.top+=bI.css(b6[0],"borderTopWidth",true);e.left+=bI.css(b6[0],"borderLeftWidth",true)}return{top:b7.top-e.top-bI.css(i,"marginTop",true),left:b7.left-e.left-bI.css(i,"marginLeft",true)}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||bX;while(e&&(!bI.nodeName(e,"html")&&bI.css(e,"position")==="static")){e=e.offsetParent}return e||bX})}});bI.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b6,i){var e=/Y/.test(i);bI.fn[b6]=function(b7){return aB(this,function(b8,cb,ca){var b9=br(b8);if(ca===undefined){return b9?(i in b9)?b9[i]:b9.document.documentElement[cb]:b8[cb]}if(b9){b9.scrollTo(!e?ca:bI(b9).scrollLeft(),e?ca:bI(b9).scrollTop())}else{b8[cb]=ca}},b6,b7,arguments.length,null)}});bI.each(["top","left"],function(e,b6){bI.cssHooks[b6]=a7(D.pixelPosition,function(b7,i){if(i){i=G(b7,b6);return Y.test(i)?bI(b7).position()[b6]+"px":i}})});bI.each({Height:"height",Width:"width"},function(e,i){bI.each({padding:"inner"+e,content:i,"":"outer"+e},function(b6,b7){bI.fn[b7]=function(cb,ca){var b9=arguments.length&&(b6||typeof cb!=="boolean"),b8=b6||(cb===true||ca===true?"margin":"border");return aB(this,function(cd,cc,ce){var cf;if(bI.isWindow(cd)){return cd.document.documentElement["client"+e]}if(cd.nodeType===9){cf=cd.documentElement;return Math.max(cd.body["scroll"+e],cf["scroll"+e],cd.body["offset"+e],cf["offset"+e],cf["client"+e])}return ce===undefined?bI.css(cd,cc,b8):bI.style(cd,cc,ce,b8)},i,b9?cb:undefined,b9,null)}})});bI.fn.size=function(){return this.length};bI.fn.andSelf=bI.fn.addBack;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return bI})}var bk=a5.jQuery,I=a5.$;bI.noConflict=function(e){if(a5.$===bI){a5.$=I}if(e&&a5.jQuery===bI){a5.jQuery=bk}return bI};if(typeof av===aC){a5.jQuery=a5.$=bI}return bI}));!function(a){a(function(){a.support.transition=(function(){var b=(function(){var e=document.createElement("bootstrap"),d={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in d){if(e.style[c]!==undefined){return d[c]}}}());return b&&{end:b}})()})}(window.jQuery);!function(d){var c='[data-dismiss="alert"]',b=function(e){d(e).on("click",c,this.close)};b.prototype.close=function(j){var i=d(this),g=i.attr("data-target"),h;if(!g){g=i.attr("href");g=g&&g.replace(/.*(?=#[^\s]*$)/,"")}h=d(g);j&&j.preventDefault();h.length||(h=i.hasClass("alert")?i:i.parent());h.trigger(j=d.Event("close"));if(j.isDefaultPrevented()){return}h.removeClass("in");function f(){h.trigger("closed").remove()}d.support.transition&&h.hasClass("fade")?h.on(d.support.transition.end,f):f()};var a=d.fn.alert;d.fn.alert=function(e){return this.each(function(){var g=d(this),f=g.data("alert");if(!f){g.data("alert",(f=new b(this)))}if(typeof e=="string"){f[e].call(g)}})};d.fn.alert.Constructor=b;d.fn.alert.noConflict=function(){d.fn.alert=a;return this};d(document).on("click.alert.data-api",c,b.prototype.close)}(window.jQuery);!function(c){var b=function(e,d){this.$element=c(e);this.options=c.extend({},c.fn.button.defaults,d)};b.prototype.setState=function(g){var i="disabled",e=this.$element,f=e.data(),h=e.is("input")?"val":"html";g=g+"Text";f.resetText||e.data("resetText",e[h]());e[h](f[g]||this.options[g]);setTimeout(function(){g=="loadingText"?e.addClass(i).attr(i,i):e.removeClass(i).removeAttr(i)},0)};b.prototype.toggle=function(){var d=this.$element.closest('[data-toggle="buttons-radio"]');d&&d.find(".active").removeClass("active");this.$element.toggleClass("active")};var a=c.fn.button;c.fn.button=function(d){return this.each(function(){var g=c(this),f=g.data("button"),e=typeof d=="object"&&d;if(!f){g.data("button",(f=new b(this,e)))}if(d=="toggle"){f.toggle()}else{if(d){f.setState(d)}}})};c.fn.button.defaults={loadingText:"loading..."};c.fn.button.Constructor=b;c.fn.button.noConflict=function(){c.fn.button=a;return this};c(document).on("click.button.data-api","[data-toggle^=button]",function(f){var d=c(f.target);if(!d.hasClass("btn")){d=d.closest(".btn")}d.button("toggle")})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.$indicators=this.$element.find(".carousel-indicators");this.options=d;this.options.pause=="hover"&&this.$element.on("mouseenter",b.proxy(this.pause,this)).on("mouseleave",b.proxy(this.cycle,this))};c.prototype={cycle:function(d){if(!d){this.paused=false}if(this.interval){clearInterval(this.interval)}this.options.interval&&!this.paused&&(this.interval=setInterval(b.proxy(this.next,this),this.options.interval));return this},getActiveIndex:function(){this.$active=this.$element.find(".item.active");this.$items=this.$active.parent().children();return this.$items.index(this.$active)},to:function(f){var d=this.getActiveIndex(),e=this;if(f>(this.$items.length-1)||f<0){return}if(this.sliding){return this.$element.one("slid",function(){e.to(f)})}if(d==f){return this.pause().cycle()}return this.slide(f>d?"next":"prev",b(this.$items[f]))},pause:function(d){if(!d){this.paused=true}if(this.$element.find(".next, .prev").length&&b.support.transition.end){this.$element.trigger(b.support.transition.end);this.cycle(true)}clearInterval(this.interval);this.interval=null;return this},next:function(){if(this.sliding){return}return this.slide("next")},prev:function(){if(this.sliding){return}return this.slide("prev")},slide:function(k,f){var m=this.$element.find(".item.active"),d=f||m[k](),j=this.interval,l=k=="next"?"left":"right",g=k=="next"?"first":"last",h=this,i;this.sliding=true;j&&this.pause();d=d.length?d:this.$element.find(".item")[g]();i=b.Event("slide",{relatedTarget:d[0],direction:l});if(d.hasClass("active")){return}if(this.$indicators.length){this.$indicators.find(".active").removeClass("active");this.$element.one("slid",function(){var e=b(h.$indicators.children()[h.getActiveIndex()]);e&&e.addClass("active")})}if(b.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(i);if(i.isDefaultPrevented()){return}d.addClass(k);d[0].offsetWidth;m.addClass(l);d.addClass(l);this.$element.one(b.support.transition.end,function(){d.removeClass([k,l].join(" ")).addClass("active");m.removeClass(["active",l].join(" "));h.sliding=false;setTimeout(function(){h.$element.trigger("slid")},0)})}else{this.$element.trigger(i);if(i.isDefaultPrevented()){return}m.removeClass("active");d.addClass("active");this.sliding=false;this.$element.trigger("slid")}j&&this.cycle();return this}};var a=b.fn.carousel;b.fn.carousel=function(d){return this.each(function(){var h=b(this),g=h.data("carousel"),e=b.extend({},b.fn.carousel.defaults,typeof d=="object"&&d),f=typeof d=="string"?d:e.slide;if(!g){h.data("carousel",(g=new c(this,e)))}if(typeof d=="number"){g.to(d)}else{if(f){g[f]()}else{if(e.interval){g.pause().cycle()}}}})};b.fn.carousel.defaults={interval:5000,pause:"hover"};b.fn.carousel.Constructor=c;b.fn.carousel.noConflict=function(){b.fn.carousel=a;return this};b(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(j){var i=b(this),f,d=b(i.attr("data-target")||(f=i.attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")),g=b.extend({},d.data(),i.data()),h;d.carousel(g);if(h=i.attr("data-slide-to")){d.data("carousel").pause().to(h).cycle()}j.preventDefault()})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.options=b.extend({},b.fn.collapse.defaults,d);if(this.options.parent){this.$parent=b(this.options.parent)}this.options.toggle&&this.toggle()};c.prototype={constructor:c,dimension:function(){var d=this.$element.hasClass("width");return d?"width":"height"},show:function(){var g,d,f,e;if(this.transitioning||this.$element.hasClass("in")){return}g=this.dimension();d=b.camelCase(["scroll",g].join("-"));f=this.$parent&&this.$parent.find("> .accordion-group > .in");if(f&&f.length){e=f.data("collapse");if(e&&e.transitioning){return}f.collapse("hide");e||f.data("collapse",null)}this.$element[g](0);this.transition("addClass",b.Event("show"),"shown");b.support.transition&&this.$element[g](this.$element[0][d])},hide:function(){var d;if(this.transitioning||!this.$element.hasClass("in")){return}d=this.dimension();this.reset(this.$element[d]());this.transition("removeClass",b.Event("hide"),"hidden");this.$element[d](0)},reset:function(d){var e=this.dimension();this.$element.removeClass("collapse")[e](d||"auto")[0].offsetWidth;this.$element[d!==null?"addClass":"removeClass"]("collapse");return this},transition:function(h,e,f){var g=this,d=function(){if(e.type=="show"){g.reset()}g.transitioning=0;g.$element.trigger(f)};this.$element.trigger(e);if(e.isDefaultPrevented()){return}this.transitioning=1;this.$element[h]("in");b.support.transition&&this.$element.hasClass("collapse")?this.$element.one(b.support.transition.end,d):d()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var a=b.fn.collapse;b.fn.collapse=function(d){return this.each(function(){var g=b(this),f=g.data("collapse"),e=b.extend({},b.fn.collapse.defaults,g.data(),typeof d=="object"&&d);if(!f){g.data("collapse",(f=new c(this,e)))}if(typeof d=="string"){f[d]()}})};b.fn.collapse.defaults={toggle:true};b.fn.collapse.Constructor=c;b.fn.collapse.noConflict=function(){b.fn.collapse=a;return this};b(document).on("click.collapse.data-api","[data-toggle=collapse]",function(i){var h=b(this),d,g=h.attr("data-target")||i.preventDefault()||(d=h.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=b(g).data("collapse")?"toggle":h.data();h[b(g).hasClass("in")?"addClass":"removeClass"]("collapsed");b(g).collapse(f)})}(window.jQuery);!function(f){var b="[data-toggle=dropdown]",a=function(h){var g=f(h).on("click.dropdown.data-api",this.toggle);f("html").on("click.dropdown.data-api",function(){g.parent().removeClass("open")})};a.prototype={constructor:a,toggle:function(j){var i=f(this),h,g;if(i.is(".disabled, :disabled")){return}h=e(i);g=h.hasClass("open");d();if(!g){if("ontouchstart" in document.documentElement){f('
    @@ -262,15 +254,14 @@ window.onLoad = init();
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/dependency-check-utils/xref-test/allclasses-frame.html b/dependency-check-utils/xref-test/allclasses-frame.html index e96969609..b875633aa 100644 --- a/dependency-check-utils/xref-test/allclasses-frame.html +++ b/dependency-check-utils/xref-test/allclasses-frame.html @@ -16,9 +16,6 @@
  • ChecksumTest -
  • -
  • - DirectoryScannerTest
  • DownloaderIntegrationTest diff --git a/dependency-check-utils/xref-test/index.html b/dependency-check-utils/xref-test/index.html index 9a331f944..e270b270a 100644 --- a/dependency-check-utils/xref-test/index.html +++ b/dependency-check-utils/xref-test/index.html @@ -4,7 +4,7 @@ - Dependency-Check Utils 1.3.0 Reference + Dependency-Check Utils 1.3.1 Reference diff --git a/dependency-check-utils/xref-test/org/owasp/dependencycheck/utils/ChecksumTest.html b/dependency-check-utils/xref-test/org/owasp/dependencycheck/utils/ChecksumTest.html index 9fdfedb97..cc4c9a843 100644 --- a/dependency-check-utils/xref-test/org/owasp/dependencycheck/utils/ChecksumTest.html +++ b/dependency-check-utils/xref-test/org/owasp/dependencycheck/utils/ChecksumTest.html @@ -34,108 +34,107 @@ 26 import org.junit.Test; 27 import org.junit.rules.ExpectedException; 28 import org.owasp.dependencycheck.utils.Checksum; -29 import org.owasp.dependencycheck.utils.Checksum; -30 -31 /** -32 * -33 * @author Jeremy Long -34 */ -35 public class ChecksumTest { -36 -37 @Rule -38 public ExpectedException expectedException = ExpectedException.none(); -39 -40 /** -41 * Test of getChecksum method, of class Checksum. -42 * -43 * @throws Exception thrown when an exception occurs. -44 */ -45 @Test -46 public void testGetChecksum() throws Exception { -47 String algorithm = "MD5"; -48 File file = new File(this.getClass().getClassLoader().getResource("checkSumTest.file").getPath()); -49 byte[] expResult = {-16, -111, 92, 95, 70, -72, -49, -94, -125, -27, -83, 103, -96, -101, 55, -109}; -50 byte[] result = Checksum.getChecksum(algorithm, file); -51 boolean arraysAreEqual = true; -52 if (expResult.length == result.length) { -53 for (int i = 0; arraysAreEqual && i < result.length; i++) { -54 arraysAreEqual = result[i] == expResult[i]; -55 } -56 } else { -57 Assert.fail("Checksum results do not match expected results."); -58 } -59 Assert.assertTrue(arraysAreEqual); -60 } -61 -62 /** -63 * Test of getChecksum method, of class Checksum. This checks that an exception is thrown when an invalid path is specified. -64 * -65 * @throws Exception is thrown when an exception occurs. -66 */ -67 @Test -68 public void testGetChecksum_FileNotFound() throws Exception { -69 String algorithm = "MD5"; -70 File file = new File("not a valid file"); -71 -72 expectedException.expect(IOException.class); -73 Checksum.getChecksum(algorithm, file); -74 } -75 -76 /** -77 * Test of getChecksum method, of class Checksum. This checks that an exception is thrown when an invalid algorithm is -78 * specified. -79 * -80 * @throws Exception is thrown when an exception occurs. -81 */ -82 @Test -83 public void testGetChecksum_NoSuchAlgorithm() throws Exception { -84 String algorithm = "some unknown algorithm"; -85 File file = new File(this.getClass().getClassLoader().getResource("checkSumTest.file").getPath()); -86 -87 expectedException.expect(NoSuchAlgorithmException.class); -88 Checksum.getChecksum(algorithm, file); -89 } -90 -91 /** -92 * Test of getMD5Checksum method, of class Checksum. -93 * -94 * @throws Exception is thrown when an exception occurs. -95 */ -96 @Test -97 public void testGetMD5Checksum() throws Exception { -98 File file = new File(this.getClass().getClassLoader().getResource("checkSumTest.file").getPath()); -99 //String expResult = "F0915C5F46B8CFA283E5AD67A09B3793"; -100 String expResult = "f0915c5f46b8cfa283e5ad67a09b3793"; -101 String result = Checksum.getMD5Checksum(file); -102 Assert.assertEquals(expResult, result); -103 } -104 -105 /** -106 * Test of getSHA1Checksum method, of class Checksum. -107 * -108 * @throws Exception is thrown when an exception occurs. -109 */ -110 @Test -111 public void testGetSHA1Checksum() throws Exception { -112 File file = new File(this.getClass().getClassLoader().getResource("checkSumTest.file").getPath()); -113 //String expResult = "B8A9FF28B21BCB1D0B50E24A5243D8B51766851A"; -114 String expResult = "b8a9ff28b21bcb1d0b50e24a5243d8b51766851a"; -115 String result = Checksum.getSHA1Checksum(file); -116 Assert.assertEquals(expResult, result); -117 } -118 -119 /** -120 * Test of getHex method, of class Checksum. -121 */ -122 @Test -123 public void testGetHex() { -124 byte[] raw = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; -125 //String expResult = "000102030405060708090A0B0C0D0E0F10"; -126 String expResult = "000102030405060708090a0b0c0d0e0f10"; -127 String result = Checksum.getHex(raw); -128 Assert.assertEquals(expResult, result); -129 } -130 } +29 +30 /** +31 * +32 * @author Jeremy Long +33 */ +34 public class ChecksumTest { +35 +36 @Rule +37 public ExpectedException expectedException = ExpectedException.none(); +38 +39 /** +40 * Test of getChecksum method, of class Checksum. +41 * +42 * @throws Exception thrown when an exception occurs. +43 */ +44 @Test +45 public void testGetChecksum() throws Exception { +46 String algorithm = "MD5"; +47 File file = new File(this.getClass().getClassLoader().getResource("checkSumTest.file").getPath()); +48 byte[] expResult = {-16, -111, 92, 95, 70, -72, -49, -94, -125, -27, -83, 103, -96, -101, 55, -109}; +49 byte[] result = Checksum.getChecksum(algorithm, file); +50 boolean arraysAreEqual = true; +51 if (expResult.length == result.length) { +52 for (int i = 0; arraysAreEqual && i < result.length; i++) { +53 arraysAreEqual = result[i] == expResult[i]; +54 } +55 } else { +56 Assert.fail("Checksum results do not match expected results."); +57 } +58 Assert.assertTrue(arraysAreEqual); +59 } +60 +61 /** +62 * Test of getChecksum method, of class Checksum. This checks that an exception is thrown when an invalid path is specified. +63 * +64 * @throws Exception is thrown when an exception occurs. +65 */ +66 @Test +67 public void testGetChecksum_FileNotFound() throws Exception { +68 String algorithm = "MD5"; +69 File file = new File("not a valid file"); +70 +71 expectedException.expect(IOException.class); +72 Checksum.getChecksum(algorithm, file); +73 } +74 +75 /** +76 * Test of getChecksum method, of class Checksum. This checks that an exception is thrown when an invalid algorithm is +77 * specified. +78 * +79 * @throws Exception is thrown when an exception occurs. +80 */ +81 @Test +82 public void testGetChecksum_NoSuchAlgorithm() throws Exception { +83 String algorithm = "some unknown algorithm"; +84 File file = new File(this.getClass().getClassLoader().getResource("checkSumTest.file").getPath()); +85 +86 expectedException.expect(NoSuchAlgorithmException.class); +87 Checksum.getChecksum(algorithm, file); +88 } +89 +90 /** +91 * Test of getMD5Checksum method, of class Checksum. +92 * +93 * @throws Exception is thrown when an exception occurs. +94 */ +95 @Test +96 public void testGetMD5Checksum() throws Exception { +97 File file = new File(this.getClass().getClassLoader().getResource("checkSumTest.file").getPath()); +98 //String expResult = "F0915C5F46B8CFA283E5AD67A09B3793"; +99 String expResult = "f0915c5f46b8cfa283e5ad67a09b3793"; +100 String result = Checksum.getMD5Checksum(file); +101 Assert.assertEquals(expResult, result); +102 } +103 +104 /** +105 * Test of getSHA1Checksum method, of class Checksum. +106 * +107 * @throws Exception is thrown when an exception occurs. +108 */ +109 @Test +110 public void testGetSHA1Checksum() throws Exception { +111 File file = new File(this.getClass().getClassLoader().getResource("checkSumTest.file").getPath()); +112 //String expResult = "B8A9FF28B21BCB1D0B50E24A5243D8B51766851A"; +113 String expResult = "b8a9ff28b21bcb1d0b50e24a5243d8b51766851a"; +114 String result = Checksum.getSHA1Checksum(file); +115 Assert.assertEquals(expResult, result); +116 } +117 +118 /** +119 * Test of getHex method, of class Checksum. +120 */ +121 @Test +122 public void testGetHex() { +123 byte[] raw = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; +124 //String expResult = "000102030405060708090A0B0C0D0E0F10"; +125 String expResult = "000102030405060708090a0b0c0d0e0f10"; +126 String result = Checksum.getHex(raw); +127 Assert.assertEquals(expResult, result); +128 } +129 }
    diff --git a/dependency-check-utils/xref-test/org/owasp/dependencycheck/utils/package-frame.html b/dependency-check-utils/xref-test/org/owasp/dependencycheck/utils/package-frame.html index ef928dcc0..dda62703d 100644 --- a/dependency-check-utils/xref-test/org/owasp/dependencycheck/utils/package-frame.html +++ b/dependency-check-utils/xref-test/org/owasp/dependencycheck/utils/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Utils 1.3.0 Reference Package org.owasp.dependencycheck.utils + Dependency-Check Utils 1.3.1 Reference Package org.owasp.dependencycheck.utils diff --git a/dependency-check-utils/xref-test/org/owasp/dependencycheck/utils/package-summary.html b/dependency-check-utils/xref-test/org/owasp/dependencycheck/utils/package-summary.html index 0403effe3..919257a95 100644 --- a/dependency-check-utils/xref-test/org/owasp/dependencycheck/utils/package-summary.html +++ b/dependency-check-utils/xref-test/org/owasp/dependencycheck/utils/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Utils 1.3.0 Reference Package org.owasp.dependencycheck.utils + Dependency-Check Utils 1.3.1 Reference Package org.owasp.dependencycheck.utils diff --git a/dependency-check-utils/xref-test/overview-frame.html b/dependency-check-utils/xref-test/overview-frame.html index 07d08522a..40f60c443 100644 --- a/dependency-check-utils/xref-test/overview-frame.html +++ b/dependency-check-utils/xref-test/overview-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Utils 1.3.0 Reference + Dependency-Check Utils 1.3.1 Reference @@ -16,9 +16,6 @@ diff --git a/dependency-check-utils/xref-test/overview-summary.html b/dependency-check-utils/xref-test/overview-summary.html index bc51856c2..d5a57b949 100644 --- a/dependency-check-utils/xref-test/overview-summary.html +++ b/dependency-check-utils/xref-test/overview-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Utils 1.3.0 Reference + Dependency-Check Utils 1.3.1 Reference @@ -24,7 +24,7 @@
  • -

    Dependency-Check Utils 1.3.0 Reference

    +

    Dependency-Check Utils 1.3.1 Reference

    @@ -34,11 +34,6 @@ - - - diff --git a/dependency-check-utils/xref/allclasses-frame.html b/dependency-check-utils/xref/allclasses-frame.html index ab9c5f8f8..240b791b8 100644 --- a/dependency-check-utils/xref/allclasses-frame.html +++ b/dependency-check-utils/xref/allclasses-frame.html @@ -12,118 +12,34 @@ diff --git a/dependency-check-utils/xref/index.html b/dependency-check-utils/xref/index.html index 9a331f944..e270b270a 100644 --- a/dependency-check-utils/xref/index.html +++ b/dependency-check-utils/xref/index.html @@ -4,7 +4,7 @@ - Dependency-Check Utils 1.3.0 Reference + Dependency-Check Utils 1.3.1 Reference diff --git a/dependency-check-utils/xref/org/owasp/dependencycheck/utils/FileUtils.html b/dependency-check-utils/xref/org/owasp/dependencycheck/utils/FileUtils.html index e0f8223fc..1af7b1149 100644 --- a/dependency-check-utils/xref/org/owasp/dependencycheck/utils/FileUtils.html +++ b/dependency-check-utils/xref/org/owasp/dependencycheck/utils/FileUtils.html @@ -30,139 +30,97 @@ 2223import java.io.File; 24import java.io.IOException; -25import java.io.UnsupportedEncodingException; -26import java.net.URLDecoder; -27import java.util.UUID; -28 -29/** -30 * A collection of utilities for processing information about files. -31 * -32 * @author Jeremy Long -33 */ -34publicfinalclassFileUtils { -35 -36/** -37 * The logger. -38 */ -39privatestaticfinal Logger LOGGER = LoggerFactory.getLogger(FileUtils.class); -40/** -41 * Bit bucket for non-Windows systems -42 */ -43privatestaticfinal String BIT_BUCKET_UNIX = "/dev/null"; -44 -45/** -46 * Bit bucket for Windows systems (yes, only one 'L') -47 */ -48privatestaticfinal String BIT_BUCKET_WIN = "NUL"; -49 -50/** -51 * Private constructor for a utility class. -52 */ -53privateFileUtils() { -54 } -55 -56/** -57 * Returns the (lowercase) file extension for a specified file. -58 * -59 * @param fileName the file name to retrieve the file extension from. -60 * @return the file extension. -61 */ -62publicstatic String getFileExtension(String fileName) { -63 String ret = null; -64finalint pos = fileName.lastIndexOf("."); -65if (pos >= 0) { -66 ret = fileName.substring(pos + 1, fileName.length()).toLowerCase(); -67 } -68return ret; -69 } -70 -71/** -72 * Deletes a file. If the File is a directory it will recursively delete the contents. -73 * -74 * @param file the File to delete -75 * @return true if the file was deleted successfully, otherwise false -76 */ -77publicstaticboolean delete(File file) { -78boolean success = true; -79if (!org.apache.commons.io.FileUtils.deleteQuietly(file)) { -80 success = false; -81 LOGGER.debug("Failed to delete file: {}; attempting to delete on exit.", file.getPath()); -82 file.deleteOnExit(); -83 } -84return success; -85 } -86 -87/** -88 * Generates a new temporary file name that is guaranteed to be unique. -89 * -90 * @param prefix the prefix for the file name to generate -91 * @param extension the extension of the generated file name -92 * @return a temporary File -93 * @throws java.io.IOException thrown if the temporary folder could not be created -94 */ -95publicstatic File getTempFile(String prefix, String extension) throws IOException { -96final File dir = Settings.getTempDirectory(); -97final String tempFileName = String.format("%s%s.%s", prefix, UUID.randomUUID().toString(), extension); -98final File tempFile = new File(dir, tempFileName); -99if (tempFile.exists()) { -100return getTempFile(prefix, extension); -101 } -102return tempFile; -103 } -104 -105/** -106 * Returns the data directory. If a path was specified in dependencycheck.properties or was specified using the Settings -107 * object, and the path exists, that path will be returned as a File object. If it does not exist, then a File object will be -108 * created based on the file location of the JAR containing the specified class. -109 * -110 * @param configuredFilePath the configured relative or absolute path -111 * @param clazz the class to resolve the path -112 * @return a File object -113 * @throws IOException is thrown if the path could not be decoded -114 * @deprecated This method should no longer be used. See the implementation in dependency-check-cli/App.java to see how the -115 * data directory should be set. -116 */ -117 @java.lang.Deprecated -118publicstatic File getDataDirectory(String configuredFilePath, Class clazz) throws IOException { -119final File file = new File(configuredFilePath); -120if (file.isDirectory() && file.canWrite()) { -121returnnew File(file.getCanonicalPath()); -122 } else { -123final File exePath = getPathToJar(clazz); -124returnnew File(exePath, configuredFilePath); -125 } -126 } -127 -128/** -129 * Retrieves the physical path to the parent directory containing the provided class. For example, if a JAR file contained a -130 * class org.something.clazz this method would return the parent directory of the JAR file. -131 * -132 * @param clazz the class to determine the parent directory of -133 * @return the parent directory of the file containing the specified class. -134 * @throws UnsupportedEncodingException thrown if UTF-8 is not supported. -135 * @deprecated this should no longer be used. -136 */ -137 @java.lang.Deprecated -138publicstatic File getPathToJar(Class clazz) throws UnsupportedEncodingException { -139final String filePath = clazz.getProtectionDomain().getCodeSource().getLocation().getPath(); -140final String decodedPath = URLDecoder.decode(filePath, "UTF-8"); -141final File jarPath = new File(decodedPath); -142return jarPath.getParentFile(); -143 } -144 -145/** -146 * Return the bit bucket for the OS. '/dev/null' for Unix and 'NUL' for Windows -147 * -148 * @return a String containing the bit bucket -149 */ -150publicstatic String getBitBucket() { -151if (System.getProperty("os.name").startsWith("Windows")) { -152return BIT_BUCKET_WIN; -153 } else { -154return BIT_BUCKET_UNIX; -155 } -156 } -157 } +25import java.util.UUID; +26 +27/** +28 * A collection of utilities for processing information about files. +29 * +30 * @author Jeremy Long +31 */ +32publicfinalclassFileUtils { +33 +34/** +35 * The logger. +36 */ +37privatestaticfinal Logger LOGGER = LoggerFactory.getLogger(FileUtils.class); +38/** +39 * Bit bucket for non-Windows systems +40 */ +41privatestaticfinal String BIT_BUCKET_UNIX = "/dev/null"; +42 +43/** +44 * Bit bucket for Windows systems (yes, only one 'L') +45 */ +46privatestaticfinal String BIT_BUCKET_WIN = "NUL"; +47 +48/** +49 * Private constructor for a utility class. +50 */ +51privateFileUtils() { +52 } +53 +54/** +55 * Returns the (lowercase) file extension for a specified file. +56 * +57 * @param fileName the file name to retrieve the file extension from. +58 * @return the file extension. +59 */ +60publicstatic String getFileExtension(String fileName) { +61 String ret = null; +62finalint pos = fileName.lastIndexOf("."); +63if (pos >= 0) { +64 ret = fileName.substring(pos + 1, fileName.length()).toLowerCase(); +65 } +66return ret; +67 } +68 +69/** +70 * Deletes a file. If the File is a directory it will recursively delete the contents. +71 * +72 * @param file the File to delete +73 * @return true if the file was deleted successfully, otherwise false +74 */ +75publicstaticboolean delete(File file) { +76boolean success = true; +77if (!org.apache.commons.io.FileUtils.deleteQuietly(file)) { +78 success = false; +79 LOGGER.debug("Failed to delete file: {}; attempting to delete on exit.", file.getPath()); +80 file.deleteOnExit(); +81 } +82return success; +83 } +84 +85/** +86 * Generates a new temporary file name that is guaranteed to be unique. +87 * +88 * @param prefix the prefix for the file name to generate +89 * @param extension the extension of the generated file name +90 * @return a temporary File +91 * @throws java.io.IOException thrown if the temporary folder could not be created +92 */ +93publicstatic File getTempFile(String prefix, String extension) throws IOException { +94final File dir = Settings.getTempDirectory(); +95final String tempFileName = String.format("%s%s.%s", prefix, UUID.randomUUID().toString(), extension); +96final File tempFile = new File(dir, tempFileName); +97if (tempFile.exists()) { +98return getTempFile(prefix, extension); +99 } +100return tempFile; +101 } +102 +103/** +104 * Return the bit bucket for the OS. '/dev/null' for Unix and 'NUL' for Windows +105 * +106 * @return a String containing the bit bucket +107 */ +108publicstatic String getBitBucket() { +109if (System.getProperty("os.name").startsWith("Windows")) { +110return BIT_BUCKET_WIN; +111 } else { +112return BIT_BUCKET_UNIX; +113 } +114 } +115 }
    diff --git a/dependency-check-utils/xref/org/owasp/dependencycheck/utils/Settings.html b/dependency-check-utils/xref/org/owasp/dependencycheck/utils/Settings.html index 605a4ba6b..4d0fdc90e 100644 --- a/dependency-check-utils/xref/org/owasp/dependencycheck/utils/Settings.html +++ b/dependency-check-utils/xref/org/owasp/dependencycheck/utils/Settings.html @@ -194,349 +194,349 @@ 186 */187publicstaticfinal String ANALYZER_ARCHIVE_ENABLED = "analyzer.archive.enabled"; 188/** -189 * The properties key for whether the Python Distribution analyzer is enabled. +189 * The properties key for whether the node.js package analyzer is enabled.190 */ -191publicstaticfinal String ANALYZER_PYTHON_DISTRIBUTION_ENABLED = "analyzer.python.distribution.enabled"; +191publicstaticfinal String ANALYZER_NODE_PACKAGE_ENABLED = "analyzer.node.package.enabled"; 192/** -193 * The properties key for whether the Python Package analyzer is enabled. +193 * The properties key for whether the composer lock file analyzer is enabled.194 */ -195publicstaticfinal String ANALYZER_PYTHON_PACKAGE_ENABLED = "analyzer.python.package.enabled"; +195publicstaticfinal String ANALYZER_COMPOSER_LOCK_ENABLED = "analyzer.composer.lock.enabled"; 196/** -197 * The properties key for whether the Autoconf analyzer is enabled. +197 * The properties key for whether the Python Distribution analyzer is enabled.198 */ -199publicstaticfinal String ANALYZER_AUTOCONF_ENABLED = "analyzer.autoconf.enabled"; +199publicstaticfinal String ANALYZER_PYTHON_DISTRIBUTION_ENABLED = "analyzer.python.distribution.enabled"; 200/** -201 * The properties key for whether the CMake analyzer is enabled. +201 * The properties key for whether the Python Package analyzer is enabled.202 */ -203publicstaticfinal String ANALYZER_CMAKE_ENABLED = "analyzer.cmake.enabled"; +203publicstaticfinal String ANALYZER_PYTHON_PACKAGE_ENABLED = "analyzer.python.package.enabled"; 204/** -205 * The properties key for whether the .NET Assembly analyzer is enabled. +205 * The properties key for whether the Ruby Gemspec Analyzer is enabled.206 */ -207publicstaticfinal String ANALYZER_ASSEMBLY_ENABLED = "analyzer.assembly.enabled"; +207publicstaticfinal String ANALYZER_RUBY_GEMSPEC_ENABLED = "analyzer.ruby.gemspec.enabled"; 208/** -209 * The properties key for whether the .NET Nuspec analyzer is enabled. +209 * The properties key for whether the Autoconf analyzer is enabled.210 */ -211publicstaticfinal String ANALYZER_NUSPEC_ENABLED = "analyzer.nuspec.enabled"; +211publicstaticfinal String ANALYZER_AUTOCONF_ENABLED = "analyzer.autoconf.enabled"; 212/** -213 * The properties key for whether the JavaScript analyzer is enabled. +213 * The properties key for whether the CMake analyzer is enabled.214 */ -215publicstaticfinal String ANALYZER_JAVASCRIPT_ENABLED = "analyzer.javascript.enabled"; +215publicstaticfinal String ANALYZER_CMAKE_ENABLED = "analyzer.cmake.enabled"; 216/** -217 * The properties key for whether the Nexus analyzer is enabled. +217 * The properties key for whether the .NET Assembly analyzer is enabled.218 */ -219publicstaticfinal String ANALYZER_NEXUS_ENABLED = "analyzer.nexus.enabled"; +219publicstaticfinal String ANALYZER_ASSEMBLY_ENABLED = "analyzer.assembly.enabled"; 220/** -221 * The properties key for the Nexus search URL. +221 * The properties key for whether the .NET Nuspec analyzer is enabled.222 */ -223publicstaticfinal String ANALYZER_NEXUS_URL = "analyzer.nexus.url"; +223publicstaticfinal String ANALYZER_NUSPEC_ENABLED = "analyzer.nuspec.enabled"; 224/** -225 * The properties key for using the proxy to reach Nexus. +225 * The properties key for whether the Nexus analyzer is enabled.226 */ -227publicstaticfinal String ANALYZER_NEXUS_PROXY = "analyzer.nexus.proxy"; +227publicstaticfinal String ANALYZER_NEXUS_ENABLED = "analyzer.nexus.enabled"; 228/** -229 * The properties key for whether the Central analyzer is enabled. +229 * The properties key for the Nexus search URL.230 */ -231publicstaticfinal String ANALYZER_CENTRAL_ENABLED = "analyzer.central.enabled"; +231publicstaticfinal String ANALYZER_NEXUS_URL = "analyzer.nexus.url"; 232/** -233 * The properties key for whether the OpenSSL analyzer is enabled. +233 * The properties key for using the proxy to reach Nexus.234 */ -235publicstaticfinal String ANALYZER_OPENSSL_ENABLED = "analyzer.openssl.enabled"; +235publicstaticfinal String ANALYZER_NEXUS_PROXY = "analyzer.nexus.proxy"; 236/** -237 * The properties key for the Central search URL. +237 * The properties key for whether the Central analyzer is enabled.238 */ -239publicstaticfinal String ANALYZER_CENTRAL_URL = "analyzer.central.url"; +239publicstaticfinal String ANALYZER_CENTRAL_ENABLED = "analyzer.central.enabled"; 240/** -241 * The path to mono, if available. +241 * The properties key for whether the OpenSSL analyzer is enabled.242 */ -243publicstaticfinal String ANALYZER_ASSEMBLY_MONO_PATH = "analyzer.assembly.mono.path"; +243publicstaticfinal String ANALYZER_OPENSSL_ENABLED = "analyzer.openssl.enabled"; 244/** -245 * The additional configured zip file extensions, if available. +245 * The properties key for the Central search URL.246 */ -247publicstaticfinal String ADDITIONAL_ZIP_EXTENSIONS = "extensions.zip"; +247publicstaticfinal String ANALYZER_CENTRAL_URL = "analyzer.central.url"; 248/** -249 * The properties key for whether Test Scope dependencies should be skipped. +249 * The path to mono, if available.250 */ -251publicstaticfinal String SKIP_TEST_SCOPE = "skip.test.scope"; +251publicstaticfinal String ANALYZER_ASSEMBLY_MONO_PATH = "analyzer.assembly.mono.path"; 252/** -253 * The properties key for whether Runtime Scope dependencies should be skipped. +253 * The additional configured zip file extensions, if available.254 */ -255publicstaticfinal String SKIP_RUNTIME_SCOPE = "skip.runtime.scope"; +255publicstaticfinal String ADDITIONAL_ZIP_EXTENSIONS = "extensions.zip"; 256/** -257 * The properties key for whether Provided Scope dependencies should be skipped. +257 * The properties key for whether Test Scope dependencies should be skipped.258 */ -259publicstaticfinal String SKIP_PROVIDED_SCOPE = "skip.provided.scope"; -260 -261/** -262 * The key to obtain the path to the VFEED data file. -263 */ -264publicstaticfinal String VFEED_DATA_FILE = "vfeed.data_file"; -265/** -266 * The key to obtain the VFEED connection string. -267 */ -268publicstaticfinal String VFEED_CONNECTION_STRING = "vfeed.connection_string"; -269 -270/** -271 * The key to obtain the base download URL for the VFeed data file. -272 */ -273publicstaticfinal String VFEED_DOWNLOAD_URL = "vfeed.download_url"; -274/** -275 * The key to obtain the download file name for the VFeed data. -276 */ -277publicstaticfinal String VFEED_DOWNLOAD_FILE = "vfeed.download_file"; +259publicstaticfinal String SKIP_TEST_SCOPE = "skip.test.scope"; +260/** +261 * The properties key for whether Runtime Scope dependencies should be skipped. +262 */ +263publicstaticfinal String SKIP_RUNTIME_SCOPE = "skip.runtime.scope"; +264/** +265 * The properties key for whether Provided Scope dependencies should be skipped. +266 */ +267publicstaticfinal String SKIP_PROVIDED_SCOPE = "skip.provided.scope"; +268 +269/** +270 * The key to obtain the path to the VFEED data file. +271 */ +272publicstaticfinal String VFEED_DATA_FILE = "vfeed.data_file"; +273/** +274 * The key to obtain the VFEED connection string. +275 */ +276publicstaticfinal String VFEED_CONNECTION_STRING = "vfeed.connection_string"; +277278/** -279 * The key to obtain the VFeed update status. +279 * The key to obtain the base download URL for the VFeed data file.280 */ -281publicstaticfinal String VFEED_UPDATE_STATUS = "vfeed.update_status"; -282 -283/** -284 * The HTTP request method for query last modified date. -285 */ -286publicstaticfinal String DOWNLOADER_QUICK_QUERY_TIMESTAMP = "downloader.quick.query.timestamp"; -287 } -288//</editor-fold> -289 -290/** -291 * The logger. -292 */ -293privatestaticfinal Logger LOGGER = LoggerFactory.getLogger(Settings.class); -294/** -295 * The properties file location. -296 */ -297privatestaticfinal String PROPERTIES_FILE = "dependencycheck.properties"; +281publicstaticfinal String VFEED_DOWNLOAD_URL = "vfeed.download_url"; +282/** +283 * The key to obtain the download file name for the VFeed data. +284 */ +285publicstaticfinal String VFEED_DOWNLOAD_FILE = "vfeed.download_file"; +286/** +287 * The key to obtain the VFeed update status. +288 */ +289publicstaticfinal String VFEED_UPDATE_STATUS = "vfeed.update_status"; +290 +291/** +292 * The HTTP request method for query last modified date. +293 */ +294publicstaticfinal String DOWNLOADER_QUICK_QUERY_TIMESTAMP = "downloader.quick.query.timestamp"; +295 } +296//</editor-fold> +297298/** -299 * Thread local settings. +299 * The logger.300 */ -301privatestatic ThreadLocal<Settings> localSettings = new ThreadLocal<Settings>(); +301privatestaticfinal Logger LOGGER = LoggerFactory.getLogger(Settings.class); 302/** -303 * The properties. +303 * The properties file location.304 */ -305private Properties props = null; -306 -307/** -308 * Private constructor for the Settings class. This class loads the properties files. -309 * -310 * @param propertiesFilePath the path to the base properties file to load -311 */ -312privateSettings(String propertiesFilePath) { -313 InputStream in = null; -314 props = new Properties(); -315try { -316 in = this.getClass().getClassLoader().getResourceAsStream(propertiesFilePath); -317 props.load(in); -318 } catch (IOException ex) { -319 LOGGER.error("Unable to load default settings."); -320 LOGGER.debug("", ex); -321 } finally { -322if (in != null) { -323try { -324 in.close(); -325 } catch (IOException ex) { -326 LOGGER.trace("", ex); -327 } -328 } -329 } -330 logProperties("Properties loaded", props); -331 } -332 -333/** -334 * Initializes the thread local settings object. Note, to use the settings object you must call this method. However, you must -335 * also call Settings.cleanup() to properly release resources. -336 */ -337publicstaticvoid initialize() { -338 localSettings.set(newSettings(PROPERTIES_FILE)); +305privatestaticfinal String PROPERTIES_FILE = "dependencycheck.properties"; +306/** +307 * Thread local settings. +308 */ +309privatestatic ThreadLocal<Settings> localSettings = new ThreadLocal<Settings>(); +310/** +311 * The properties. +312 */ +313private Properties props = null; +314 +315/** +316 * Private constructor for the Settings class. This class loads the properties files. +317 * +318 * @param propertiesFilePath the path to the base properties file to load +319 */ +320privateSettings(String propertiesFilePath) { +321 InputStream in = null; +322 props = new Properties(); +323try { +324 in = this.getClass().getClassLoader().getResourceAsStream(propertiesFilePath); +325 props.load(in); +326 } catch (IOException ex) { +327 LOGGER.error("Unable to load default settings."); +328 LOGGER.debug("", ex); +329 } finally { +330if (in != null) { +331try { +332 in.close(); +333 } catch (IOException ex) { +334 LOGGER.trace("", ex); +335 } +336 } +337 } +338 logProperties("Properties loaded", props); 339 } 340341/**342 * Initializes the thread local settings object. Note, to use the settings object you must call this method. However, you must343 * also call Settings.cleanup() to properly release resources. -344 * -345 * @param propertiesFilePath the path to the base properties file to load -346 */ -347publicstaticvoid initialize(String propertiesFilePath) { -348 localSettings.set(newSettings(propertiesFilePath)); -349 } -350 -351/** -352 * Cleans up resources to prevent memory leaks. -353 * +344 */ +345publicstaticvoid initialize() { +346 localSettings.set(newSettings(PROPERTIES_FILE)); +347 } +348 +349/** +350 * Initializes the thread local settings object. Note, to use the settings object you must call this method. However, you must +351 * also call Settings.cleanup() to properly release resources. +352 * +353 * @param propertiesFilePath the path to the base properties file to load354 */ -355publicstaticvoid cleanup() { -356 cleanup(true); +355publicstaticvoid initialize(String propertiesFilePath) { +356 localSettings.set(newSettings(propertiesFilePath)); 357 } 358359/**360 * Cleans up resources to prevent memory leaks.361 * -362 * @param deleteTemporary flag indicating whether any temporary directories generated should be removed -363 */ -364publicstaticvoid cleanup(boolean deleteTemporary) { -365if (deleteTemporary && tempDirectory != null && tempDirectory.exists()) { -366 FileUtils.delete(tempDirectory); -367 } -368try { -369 localSettings.remove(); -370 } catch (Throwable ex) { -371 LOGGER.debug("Error cleaning up Settings", ex); -372 } -373 } -374 -375/** -376 * Gets the underlying instance of the Settings object. -377 * -378 * @return the Settings object -379 */ -380publicstaticSettings getInstance() { -381return localSettings.get(); -382 } -383 -384/** -385 * Sets the instance of the Settings object to use in this thread. -386 * -387 * @param instance the instance of the settings object to use in this thread -388 */ -389publicstaticvoid setInstance(Settings instance) { -390 localSettings.set(instance); -391 } -392 -393/** -394 * Logs the properties. This will not log any properties that contain 'password' in the key. -395 * -396 * @param header the header to print with the log message -397 * @param properties the properties to log -398 */ -399privatestaticvoid logProperties(String header, Properties properties) { -400if (LOGGER.isDebugEnabled()) { -401final StringWriter sw = new StringWriter(); -402 PrintWriter pw = null; -403try { -404 pw = new PrintWriter(sw); -405 pw.format("%s:%n%n", header); -406final Enumeration<?> e = properties.propertyNames(); -407while (e.hasMoreElements()) { -408final String key = (String) e.nextElement(); -409if (key.contains("password")) { -410 pw.format("%s='*****'%n", key); -411 } else { -412final String value = properties.getProperty(key); -413if (value != null) { -414 pw.format("%s='%s'%n", key, value); -415 } -416 } -417 } -418 pw.flush(); -419 LOGGER.debug(sw.toString()); -420 } finally { -421if (pw != null) { -422 pw.close(); -423 } -424 } -425 -426 } -427 } -428 -429/** -430 * Sets a property value. -431 * -432 * @param key the key for the property -433 * @param value the value for the property -434 */ -435publicstaticvoid setString(String key, String value) { -436 localSettings.get().props.setProperty(key, value); -437 LOGGER.debug("Setting: {}='{}'", key, value); -438 } -439 -440/** -441 * Sets a property value. -442 * -443 * @param key the key for the property -444 * @param value the value for the property -445 */ -446publicstaticvoid setBoolean(String key, boolean value) { -447if (value) { -448 localSettings.get().props.setProperty(key, Boolean.TRUE.toString()); -449 } else { -450 localSettings.get().props.setProperty(key, Boolean.FALSE.toString()); -451 } -452 LOGGER.debug("Setting: {}='{}'", key, value); -453 } -454 -455/** -456 * Merges a new properties file into the current properties. This method allows for the loading of a user provided properties -457 * file.<br/><br/> -458 * Note: even if using this method - system properties will be loaded before properties loaded from files. -459 * -460 * @param filePath the path to the properties file to merge. -461 * @throws FileNotFoundException is thrown when the filePath points to a non-existent file -462 * @throws IOException is thrown when there is an exception loading/merging the properties -463 */ -464publicstaticvoid mergeProperties(File filePath) throws FileNotFoundException, IOException { -465 FileInputStream fis = null; -466try { -467 fis = new FileInputStream(filePath); -468 mergeProperties(fis); -469 } finally { -470if (fis != null) { -471try { -472 fis.close(); -473 } catch (IOException ex) { -474 LOGGER.trace("close error", ex); -475 } -476 } -477 } -478 } -479 -480/** -481 * Merges a new properties file into the current properties. This method allows for the loading of a user provided properties -482 * file.<br/><br/> -483 * Note: even if using this method - system properties will be loaded before properties loaded from files. -484 * -485 * @param filePath the path to the properties file to merge. -486 * @throws FileNotFoundException is thrown when the filePath points to a non-existent file -487 * @throws IOException is thrown when there is an exception loading/merging the properties -488 */ -489publicstaticvoid mergeProperties(String filePath) throws FileNotFoundException, IOException { -490 FileInputStream fis = null; -491try { -492 fis = new FileInputStream(filePath); -493 mergeProperties(fis); -494 } finally { -495if (fis != null) { -496try { -497 fis.close(); -498 } catch (IOException ex) { -499 LOGGER.trace("close error", ex); -500 } -501 } -502 } -503 } -504 -505/** -506 * Merges a new properties file into the current properties. This method allows for the loading of a user provided properties -507 * file.<br/><br/> -508 * Note: even if using this method - system properties will be loaded before properties loaded from files. -509 * -510 * @param stream an Input Stream pointing at a properties file to merge -511 * @throws IOException is thrown when there is an exception loading/merging the properties -512 */ -513publicstaticvoid mergeProperties(InputStream stream) throws IOException { -514 localSettings.get().props.load(stream); -515 logProperties("Properties updated via merge", localSettings.get().props); -516 } -517 -518/** -519 * Returns a value from the properties file as a File object. If the value was specified as a system property or passed in via -520 * the -Dprop=value argument - this method will return the value from the system properties before the values in the contained -521 * configuration file. -522 * -523 * @param key the key to lookup within the properties file -524 * @return the property from the properties file converted to a File object -525 */ -526publicstatic File getFile(String key) { -527final String file = getString(key); -528if (file == null) { -529returnnull; -530 } -531returnnew File(file); +362 */ +363publicstaticvoid cleanup() { +364 cleanup(true); +365 } +366 +367/** +368 * Cleans up resources to prevent memory leaks. +369 * +370 * @param deleteTemporary flag indicating whether any temporary directories generated should be removed +371 */ +372publicstaticvoid cleanup(boolean deleteTemporary) { +373if (deleteTemporary && tempDirectory != null && tempDirectory.exists()) { +374 FileUtils.delete(tempDirectory); +375if (tempDirectory.exists()) { +376try { +377 Thread.sleep(2000); +378 } catch (InterruptedException ex) { +379 LOGGER.trace("ignore", ex); +380 } +381 FileUtils.delete(tempDirectory); +382 } +383 } +384try { +385 localSettings.remove(); +386 } catch (Throwable ex) { +387 LOGGER.debug("Error cleaning up Settings", ex); +388 } +389 } +390 +391/** +392 * Gets the underlying instance of the Settings object. +393 * +394 * @return the Settings object +395 */ +396publicstaticSettings getInstance() { +397return localSettings.get(); +398 } +399 +400/** +401 * Sets the instance of the Settings object to use in this thread. +402 * +403 * @param instance the instance of the settings object to use in this thread +404 */ +405publicstaticvoid setInstance(Settings instance) { +406 localSettings.set(instance); +407 } +408 +409/** +410 * Logs the properties. This will not log any properties that contain 'password' in the key. +411 * +412 * @param header the header to print with the log message +413 * @param properties the properties to log +414 */ +415privatestaticvoid logProperties(String header, Properties properties) { +416if (LOGGER.isDebugEnabled()) { +417final StringWriter sw = new StringWriter(); +418 PrintWriter pw = null; +419try { +420 pw = new PrintWriter(sw); +421 pw.format("%s:%n%n", header); +422final Enumeration<?> e = properties.propertyNames(); +423while (e.hasMoreElements()) { +424final String key = (String) e.nextElement(); +425if (key.contains("password")) { +426 pw.format("%s='*****'%n", key); +427 } else { +428final String value = properties.getProperty(key); +429if (value != null) { +430 pw.format("%s='%s'%n", key, value); +431 } +432 } +433 } +434 pw.flush(); +435 LOGGER.debug(sw.toString()); +436 } finally { +437if (pw != null) { +438 pw.close(); +439 } +440 } +441 +442 } +443 } +444 +445/** +446 * Sets a property value. +447 * +448 * @param key the key for the property +449 * @param value the value for the property +450 */ +451publicstaticvoid setString(String key, String value) { +452 localSettings.get().props.setProperty(key, value); +453 LOGGER.debug("Setting: {}='{}'", key, value); +454 } +455 +456/** +457 * Sets a property value. +458 * +459 * @param key the key for the property +460 * @param value the value for the property +461 */ +462publicstaticvoid setBoolean(String key, boolean value) { +463if (value) { +464 localSettings.get().props.setProperty(key, Boolean.TRUE.toString()); +465 } else { +466 localSettings.get().props.setProperty(key, Boolean.FALSE.toString()); +467 } +468 LOGGER.debug("Setting: {}='{}'", key, value); +469 } +470 +471/** +472 * Merges a new properties file into the current properties. This method allows for the loading of a user provided properties +473 * file.<br/><br/> +474 * Note: even if using this method - system properties will be loaded before properties loaded from files. +475 * +476 * @param filePath the path to the properties file to merge. +477 * @throws FileNotFoundException is thrown when the filePath points to a non-existent file +478 * @throws IOException is thrown when there is an exception loading/merging the properties +479 */ +480publicstaticvoid mergeProperties(File filePath) throws FileNotFoundException, IOException { +481 FileInputStream fis = null; +482try { +483 fis = new FileInputStream(filePath); +484 mergeProperties(fis); +485 } finally { +486if (fis != null) { +487try { +488 fis.close(); +489 } catch (IOException ex) { +490 LOGGER.trace("close error", ex); +491 } +492 } +493 } +494 } +495 +496/** +497 * Merges a new properties file into the current properties. This method allows for the loading of a user provided properties +498 * file.<br/><br/> +499 * Note: even if using this method - system properties will be loaded before properties loaded from files. +500 * +501 * @param filePath the path to the properties file to merge. +502 * @throws FileNotFoundException is thrown when the filePath points to a non-existent file +503 * @throws IOException is thrown when there is an exception loading/merging the properties +504 */ +505publicstaticvoid mergeProperties(String filePath) throws FileNotFoundException, IOException { +506 FileInputStream fis = null; +507try { +508 fis = new FileInputStream(filePath); +509 mergeProperties(fis); +510 } finally { +511if (fis != null) { +512try { +513 fis.close(); +514 } catch (IOException ex) { +515 LOGGER.trace("close error", ex); +516 } +517 } +518 } +519 } +520 +521/** +522 * Merges a new properties file into the current properties. This method allows for the loading of a user provided properties +523 * file.<br/><br/> +524 * Note: even if using this method - system properties will be loaded before properties loaded from files. +525 * +526 * @param stream an Input Stream pointing at a properties file to merge +527 * @throws IOException is thrown when there is an exception loading/merging the properties +528 */ +529publicstaticvoid mergeProperties(InputStream stream) throws IOException { +530 localSettings.get().props.load(stream); +531 logProperties("Properties updated via merge", localSettings.get().props); 532 } 533534/** @@ -544,268 +544,282 @@ 536 * the -Dprop=value argument - this method will return the value from the system properties before the values in the contained537 * configuration file.538 * -539 * This method will check the configured base directory and will use this as the base of the file path. Additionally, if the -540 * base directory begins with a leading "[JAR]\" sequence with the path to the folder containing the JAR file containing this -541 * class. -542 * -543 * @param key the key to lookup within the properties file -544 * @return the property from the properties file converted to a File object -545 */ -546protectedstatic File getDataFile(String key) { -547final String file = getString(key); -548 LOGGER.debug("Settings.getDataFile() - file: '{}'", file); -549if (file == null) { -550returnnull; -551 } -552if (file.startsWith("[JAR]")) { -553 LOGGER.debug("Settings.getDataFile() - transforming filename"); -554final File jarPath = getJarPath(); -555 LOGGER.debug("Settings.getDataFile() - jar file: '{}'", jarPath.toString()); -556final File retVal = new File(jarPath, file.substring(6)); -557 LOGGER.debug("Settings.getDataFile() - returning: '{}'", retVal.toString()); -558return retVal; -559 } -560returnnew File(file); -561 } -562 -563/** -564 * Attempts to retrieve the folder containing the Jar file containing the Settings class. -565 * -566 * @return a File object -567 */ -568privatestatic File getJarPath() { -569final String jarPath = Settings.class.getProtectionDomain().getCodeSource().getLocation().getPath(); -570 String decodedPath = "."; -571try { -572 decodedPath = URLDecoder.decode(jarPath, "UTF-8"); -573 } catch (UnsupportedEncodingException ex) { -574 LOGGER.trace("", ex); +539 * @param key the key to lookup within the properties file +540 * @return the property from the properties file converted to a File object +541 */ +542publicstatic File getFile(String key) { +543final String file = getString(key); +544if (file == null) { +545returnnull; +546 } +547returnnew File(file); +548 } +549 +550/** +551 * Returns a value from the properties file as a File object. If the value was specified as a system property or passed in via +552 * the -Dprop=value argument - this method will return the value from the system properties before the values in the contained +553 * configuration file. +554 * +555 * This method will check the configured base directory and will use this as the base of the file path. Additionally, if the +556 * base directory begins with a leading "[JAR]\" sequence with the path to the folder containing the JAR file containing this +557 * class. +558 * +559 * @param key the key to lookup within the properties file +560 * @return the property from the properties file converted to a File object +561 */ +562protectedstatic File getDataFile(String key) { +563final String file = getString(key); +564 LOGGER.debug("Settings.getDataFile() - file: '{}'", file); +565if (file == null) { +566returnnull; +567 } +568if (file.startsWith("[JAR]")) { +569 LOGGER.debug("Settings.getDataFile() - transforming filename"); +570final File jarPath = getJarPath(); +571 LOGGER.debug("Settings.getDataFile() - jar file: '{}'", jarPath.toString()); +572final File retVal = new File(jarPath, file.substring(6)); +573 LOGGER.debug("Settings.getDataFile() - returning: '{}'", retVal.toString()); +574return retVal; 575 } -576 -577final File path = new File(decodedPath); -578if (path.getName().toLowerCase().endsWith(".jar")) { -579return path.getParentFile(); -580 } else { -581returnnew File("."); -582 } -583 } -584 -585/** -586 * Returns a value from the properties file. If the value was specified as a system property or passed in via the -Dprop=value -587 * argument - this method will return the value from the system properties before the values in the contained configuration -588 * file. -589 * -590 * @param key the key to lookup within the properties file -591 * @param defaultValue the default value for the requested property -592 * @return the property from the properties file -593 */ -594publicstatic String getString(String key, String defaultValue) { -595final String str = System.getProperty(key, localSettings.get().props.getProperty(key, defaultValue)); -596return str; -597 } -598 -599/** -600 * A reference to the temporary directory; used incase it needs to be deleted during cleanup. -601 */ -602privatestatic File tempDirectory = null; -603 -604/** -605 * Returns the temporary directory. -606 * -607 * @return the temporary directory -608 * @throws java.io.IOException thrown if the temporary directory does not exist and cannot be created +576returnnew File(file); +577 } +578 +579/** +580 * Attempts to retrieve the folder containing the Jar file containing the Settings class. +581 * +582 * @return a File object +583 */ +584privatestatic File getJarPath() { +585final String jarPath = Settings.class.getProtectionDomain().getCodeSource().getLocation().getPath(); +586 String decodedPath = "."; +587try { +588 decodedPath = URLDecoder.decode(jarPath, "UTF-8"); +589 } catch (UnsupportedEncodingException ex) { +590 LOGGER.trace("", ex); +591 } +592 +593final File path = new File(decodedPath); +594if (path.getName().toLowerCase().endsWith(".jar")) { +595return path.getParentFile(); +596 } else { +597returnnew File("."); +598 } +599 } +600 +601/** +602 * Returns a value from the properties file. If the value was specified as a system property or passed in via the -Dprop=value +603 * argument - this method will return the value from the system properties before the values in the contained configuration +604 * file. +605 * +606 * @param key the key to lookup within the properties file +607 * @param defaultValue the default value for the requested property +608 * @return the property from the properties file609 */ -610publicstatic File getTempDirectory() throws IOException { -611final File tmpDir = new File(Settings.getString(Settings.KEYS.TEMP_DIRECTORY, System.getProperty("java.io.tmpdir")), "dctemp"); -612if (!tmpDir.exists()) { -613if (!tmpDir.mkdirs()) { -614final String msg = String.format("Unable to make a temporary folder '%s'", tmpDir.getPath()); -615thrownew IOException(msg); -616 } -617 } -618 tempDirectory = tmpDir; -619return tmpDir; -620 } -621 -622/** -623 * Returns a value from the properties file. If the value was specified as a system property or passed in via the -Dprop=value -624 * argument - this method will return the value from the system properties before the values in the contained configuration -625 * file. -626 * -627 * @param key the key to lookup within the properties file -628 * @return the property from the properties file -629 */ -630publicstatic String getString(String key) { -631return System.getProperty(key, localSettings.get().props.getProperty(key)); -632 } -633 -634/** -635 * Removes a property from the local properties collection. This is mainly used in test cases. -636 * -637 * @param key the property key to remove -638 */ -639publicstaticvoid removeProperty(String key) { -640 localSettings.get().props.remove(key); -641 } -642 -643/** -644 * Returns an int value from the properties file. If the value was specified as a system property or passed in via the -645 * -Dprop=value argument - this method will return the value from the system properties before the values in the contained -646 * configuration file. -647 * -648 * @param key the key to lookup within the properties file -649 * @return the property from the properties file -650 * @throws InvalidSettingException is thrown if there is an error retrieving the setting -651 */ -652publicstaticint getInt(String key) throws InvalidSettingException { -653int value; -654try { -655 value = Integer.parseInt(Settings.getString(key)); -656 } catch (NumberFormatException ex) { -657thrownewInvalidSettingException("Could not convert property '" + key + "' to an int.", ex); -658 } -659return value; -660 } -661 -662/** -663 * Returns an int value from the properties file. If the value was specified as a system property or passed in via the -664 * -Dprop=value argument - this method will return the value from the system properties before the values in the contained -665 * configuration file. -666 * -667 * @param key the key to lookup within the properties file -668 * @param defaultValue the default value to return -669 * @return the property from the properties file or the defaultValue if the property does not exist or cannot be converted to -670 * an integer -671 */ -672publicstaticint getInt(String key, int defaultValue) { -673int value; -674try { -675 value = Integer.parseInt(Settings.getString(key)); -676 } catch (NumberFormatException ex) { -677 LOGGER.trace("Could not convert property '{}' to an int.", key, ex); -678 value = defaultValue; -679 } -680return value; -681 } -682 -683/** -684 * Returns a long value from the properties file. If the value was specified as a system property or passed in via the -685 * -Dprop=value argument - this method will return the value from the system properties before the values in the contained -686 * configuration file. -687 * -688 * @param key the key to lookup within the properties file -689 * @return the property from the properties file -690 * @throws InvalidSettingException is thrown if there is an error retrieving the setting -691 */ -692publicstaticlong getLong(String key) throws InvalidSettingException { -693long value; -694try { -695 value = Long.parseLong(Settings.getString(key)); -696 } catch (NumberFormatException ex) { -697thrownewInvalidSettingException("Could not convert property '" + key + "' to an int.", ex); -698 } -699return value; -700 } -701 -702/** -703 * Returns a boolean value from the properties file. If the value was specified as a system property or passed in via the -704 * <code>-Dprop=value</code> argument this method will return the value from the system properties before the values in the -705 * contained configuration file. -706 * -707 * @param key the key to lookup within the properties file -708 * @return the property from the properties file -709 * @throws InvalidSettingException is thrown if there is an error retrieving the setting -710 */ -711publicstaticboolean getBoolean(String key) throws InvalidSettingException { -712boolean value; -713try { -714 value = Boolean.parseBoolean(Settings.getString(key)); -715 } catch (NumberFormatException ex) { -716thrownewInvalidSettingException("Could not convert property '" + key + "' to an int.", ex); -717 } -718return value; -719 } -720 -721/** -722 * Returns a boolean value from the properties file. If the value was specified as a system property or passed in via the -723 * <code>-Dprop=value</code> argument this method will return the value from the system properties before the values in the -724 * contained configuration file. -725 * -726 * @param key the key to lookup within the properties file -727 * @param defaultValue the default value to return if the setting does not exist -728 * @return the property from the properties file -729 * @throws InvalidSettingException is thrown if there is an error retrieving the setting -730 */ -731publicstaticboolean getBoolean(String key, boolean defaultValue) throws InvalidSettingException { -732boolean value; -733try { -734final String strValue = Settings.getString(key); -735if (strValue == null) { -736return defaultValue; -737 } -738 value = Boolean.parseBoolean(strValue); -739 } catch (NumberFormatException ex) { -740thrownewInvalidSettingException("Could not convert property '" + key + "' to an int.", ex); -741 } -742return value; -743 } -744 -745/** -746 * Returns a connection string from the configured properties. If the connection string contains a %s, this method will -747 * determine the 'data' directory and replace the %s with the path to the data directory. If the data directory does not -748 * exists it will be created. -749 * -750 * @param connectionStringKey the property file key for the connection string -751 * @param dbFileNameKey the settings key for the db filename -752 * @return the connection string -753 * @throws IOException thrown the data directory cannot be created -754 * @throws InvalidSettingException thrown if there is an invalid setting -755 */ -756publicstatic String getConnectionString(String connectionStringKey, String dbFileNameKey) -757throws IOException, InvalidSettingException { -758final String connStr = Settings.getString(connectionStringKey); -759if (connStr == null) { -760final String msg = String.format("Invalid properties file; %s is missing.", connectionStringKey); -761thrownewInvalidSettingException(msg); -762 } -763if (connStr.contains("%s")) { -764final File directory = getDataDirectory(); -765 String fileName = null; -766if (dbFileNameKey != null) { -767 fileName = Settings.getString(dbFileNameKey); -768 } -769if (fileName == null) { -770final String msg = String.format("Invalid properties file to get a file based connection string; '%s' must be defined.", -771 dbFileNameKey); -772thrownewInvalidSettingException(msg); -773 } -774if (connStr.startsWith("jdbc:h2:file:") && fileName.endsWith(".h2.db")) { -775 fileName = fileName.substring(0, fileName.length() - 6); -776 } -777// yes, for H2 this path won't actually exists - but this is sufficient to get the value needed -778final File dbFile = new File(directory, fileName); -779final String cString = String.format(connStr, dbFile.getCanonicalPath()); -780 LOGGER.debug("Connection String: '{}'", cString); -781return cString; -782 } -783return connStr; -784 } -785 -786/** -787 * Retrieves the directory that the JAR file exists in so that we can ensure we always use a common data directory for the -788 * embedded H2 database. This is public solely for some unit tests; otherwise this should be private. -789 * -790 * @return the data directory to store data files -791 * @throws IOException is thrown if an IOException occurs of course... -792 */ -793publicstatic File getDataDirectory() throws IOException { -794final File path = Settings.getDataFile(Settings.KEYS.DATA_DIRECTORY); -795if (path.exists() || path.mkdirs()) { -796return path; -797 } -798thrownew IOException(String.format("Unable to create the data directory '%s'", path.getAbsolutePath())); -799 } -800 } +610publicstatic String getString(String key, String defaultValue) { +611final String str = System.getProperty(key, localSettings.get().props.getProperty(key, defaultValue)); +612return str; +613 } +614 +615/** +616 * A reference to the temporary directory; used incase it needs to be deleted during cleanup. +617 */ +618privatestatic File tempDirectory = null; +619 +620/** +621 * Returns the temporary directory. +622 * +623 * @return the temporary directory +624 * @throws java.io.IOException thrown if the temporary directory does not exist and cannot be created +625 */ +626publicstatic File getTempDirectory() throws IOException { +627final File tmpDir = new File(Settings.getString(Settings.KEYS.TEMP_DIRECTORY, System.getProperty("java.io.tmpdir")), "dctemp"); +628if (!tmpDir.exists() && !tmpDir.mkdirs()) { +629final String msg = String.format("Unable to make a temporary folder '%s'", tmpDir.getPath()); +630thrownew IOException(msg); +631 } +632 tempDirectory = tmpDir; +633return tmpDir; +634 } +635 +636/** +637 * Returns a value from the properties file. If the value was specified as a system property or passed in via the -Dprop=value +638 * argument - this method will return the value from the system properties before the values in the contained configuration +639 * file. +640 * +641 * @param key the key to lookup within the properties file +642 * @return the property from the properties file +643 */ +644publicstatic String getString(String key) { +645return System.getProperty(key, localSettings.get().props.getProperty(key)); +646 } +647 +648/** +649 * Removes a property from the local properties collection. This is mainly used in test cases. +650 * +651 * @param key the property key to remove +652 */ +653publicstaticvoid removeProperty(String key) { +654 localSettings.get().props.remove(key); +655 } +656 +657/** +658 * Returns an int value from the properties file. If the value was specified as a system property or passed in via the +659 * -Dprop=value argument - this method will return the value from the system properties before the values in the contained +660 * configuration file. +661 * +662 * @param key the key to lookup within the properties file +663 * @return the property from the properties file +664 * @throws InvalidSettingException is thrown if there is an error retrieving the setting +665 */ +666publicstaticint getInt(String key) throws InvalidSettingException { +667int value; +668try { +669 value = Integer.parseInt(Settings.getString(key)); +670 } catch (NumberFormatException ex) { +671thrownewInvalidSettingException("Could not convert property '" + key + "' to an int.", ex); +672 } +673return value; +674 } +675 +676/** +677 * Returns an int value from the properties file. If the value was specified as a system property or passed in via the +678 * -Dprop=value argument - this method will return the value from the system properties before the values in the contained +679 * configuration file. +680 * +681 * @param key the key to lookup within the properties file +682 * @param defaultValue the default value to return +683 * @return the property from the properties file or the defaultValue if the property does not exist or cannot be converted to +684 * an integer +685 */ +686publicstaticint getInt(String key, int defaultValue) { +687int value; +688try { +689 value = Integer.parseInt(Settings.getString(key)); +690 } catch (NumberFormatException ex) { +691 LOGGER.trace("Could not convert property '{}' to an int.", key, ex); +692 value = defaultValue; +693 } +694return value; +695 } +696 +697/** +698 * Returns a long value from the properties file. If the value was specified as a system property or passed in via the +699 * -Dprop=value argument - this method will return the value from the system properties before the values in the contained +700 * configuration file. +701 * +702 * @param key the key to lookup within the properties file +703 * @return the property from the properties file +704 * @throws InvalidSettingException is thrown if there is an error retrieving the setting +705 */ +706publicstaticlong getLong(String key) throws InvalidSettingException { +707long value; +708try { +709 value = Long.parseLong(Settings.getString(key)); +710 } catch (NumberFormatException ex) { +711thrownewInvalidSettingException("Could not convert property '" + key + "' to an int.", ex); +712 } +713return value; +714 } +715 +716/** +717 * Returns a boolean value from the properties file. If the value was specified as a system property or passed in via the +718 * <code>-Dprop=value</code> argument this method will return the value from the system properties before the values in the +719 * contained configuration file. +720 * +721 * @param key the key to lookup within the properties file +722 * @return the property from the properties file +723 * @throws InvalidSettingException is thrown if there is an error retrieving the setting +724 */ +725publicstaticboolean getBoolean(String key) throws InvalidSettingException { +726boolean value; +727try { +728 value = Boolean.parseBoolean(Settings.getString(key)); +729 } catch (NumberFormatException ex) { +730thrownewInvalidSettingException("Could not convert property '" + key + "' to an int.", ex); +731 } +732return value; +733 } +734 +735/** +736 * Returns a boolean value from the properties file. If the value was specified as a system property or passed in via the +737 * <code>-Dprop=value</code> argument this method will return the value from the system properties before the values in the +738 * contained configuration file. +739 * +740 * @param key the key to lookup within the properties file +741 * @param defaultValue the default value to return if the setting does not exist +742 * @return the property from the properties file +743 * @throws InvalidSettingException is thrown if there is an error retrieving the setting +744 */ +745publicstaticboolean getBoolean(String key, boolean defaultValue) throws InvalidSettingException { +746boolean value; +747try { +748final String strValue = Settings.getString(key); +749if (strValue == null) { +750return defaultValue; +751 } +752 value = Boolean.parseBoolean(strValue); +753 } catch (NumberFormatException ex) { +754thrownewInvalidSettingException("Could not convert property '" + key + "' to an int.", ex); +755 } +756return value; +757 } +758 +759/** +760 * Returns a connection string from the configured properties. If the connection string contains a %s, this method will +761 * determine the 'data' directory and replace the %s with the path to the data directory. If the data directory does not +762 * exists it will be created. +763 * +764 * @param connectionStringKey the property file key for the connection string +765 * @param dbFileNameKey the settings key for the db filename +766 * @return the connection string +767 * @throws IOException thrown the data directory cannot be created +768 * @throws InvalidSettingException thrown if there is an invalid setting +769 */ +770publicstatic String getConnectionString(String connectionStringKey, String dbFileNameKey) +771throws IOException, InvalidSettingException { +772final String connStr = Settings.getString(connectionStringKey); +773if (connStr == null) { +774final String msg = String.format("Invalid properties file; %s is missing.", connectionStringKey); +775thrownewInvalidSettingException(msg); +776 } +777if (connStr.contains("%s")) { +778final File directory = getDataDirectory(); +779 String fileName = null; +780if (dbFileNameKey != null) { +781 fileName = Settings.getString(dbFileNameKey); +782 } +783if (fileName == null) { +784final String msg = String.format("Invalid properties file to get a file based connection string; '%s' must be defined.", +785 dbFileNameKey); +786thrownewInvalidSettingException(msg); +787 } +788if (connStr.startsWith("jdbc:h2:file:") && fileName.endsWith(".h2.db")) { +789 fileName = fileName.substring(0, fileName.length() - 6); +790 } +791// yes, for H2 this path won't actually exists - but this is sufficient to get the value needed +792final File dbFile = new File(directory, fileName); +793final String cString = String.format(connStr, dbFile.getCanonicalPath()); +794 LOGGER.debug("Connection String: '{}'", cString); +795return cString; +796 } +797return connStr; +798 } +799 +800/** +801 * Retrieves the directory that the JAR file exists in so that we can ensure we always use a common data directory for the +802 * embedded H2 database. This is public solely for some unit tests; otherwise this should be private. +803 * +804 * @return the data directory to store data files +805 * @throws IOException is thrown if an IOException occurs of course... +806 */ +807publicstatic File getDataDirectory() throws IOException { +808final File path = Settings.getDataFile(Settings.KEYS.DATA_DIRECTORY); +809if (path.exists() || path.mkdirs()) { +810return path; +811 } +812thrownew IOException(String.format("Unable to create the data directory '%s'", path.getAbsolutePath())); +813 } +814 }
    diff --git a/dependency-check-utils/xref/org/owasp/dependencycheck/utils/URLConnectionFactory.html b/dependency-check-utils/xref/org/owasp/dependencycheck/utils/URLConnectionFactory.html index d5023ddff..78c98d3ea 100644 --- a/dependency-check-utils/xref/org/owasp/dependencycheck/utils/URLConnectionFactory.html +++ b/dependency-check-utils/xref/org/owasp/dependencycheck/utils/URLConnectionFactory.html @@ -25,107 +25,109 @@ 17 */18package org.owasp.dependencycheck.utils; 19 -20import java.io.IOException; -21import java.net.Authenticator; -22import java.net.HttpURLConnection; -23import java.net.InetSocketAddress; -24import java.net.PasswordAuthentication; -25import java.net.Proxy; -26import java.net.SocketAddress; -27import java.net.URL; -28 -29/** -30 * A URLConnection Factory to create new connections. This encapsulates several configuration checks to ensure that the connection -31 * uses the correct proxy settings. -32 * -33 * @author Jeremy Long -34 */ -35publicfinalclassURLConnectionFactory { -36 -37/** -38 * Private constructor for this factory. -39 */ -40privateURLConnectionFactory() { -41 } -42 -43/** -44 * Utility method to create an HttpURLConnection. If the application is configured to use a proxy this method will retrieve -45 * the proxy settings and use them when setting up the connection. -46 * -47 * @param url the url to connect to -48 * @return an HttpURLConnection -49 * @throws URLConnectionFailureException thrown if there is an exception -50 */ -51publicstatic HttpURLConnection createHttpURLConnection(URL url) throws URLConnectionFailureException { -52 HttpURLConnection conn = null; -53 Proxy proxy; -54final String proxyUrl = Settings.getString(Settings.KEYS.PROXY_SERVER); -55try { -56if (proxyUrl != null) { -57finalint proxyPort = Settings.getInt(Settings.KEYS.PROXY_PORT); -58final SocketAddress address = new InetSocketAddress(proxyUrl, proxyPort); -59 -60final String username = Settings.getString(Settings.KEYS.PROXY_USERNAME); -61final String password = Settings.getString(Settings.KEYS.PROXY_PASSWORD); -62if (username != null && password != null) { -63final Authenticator auth = new Authenticator() { -64 @Override -65public PasswordAuthentication getPasswordAuthentication() { -66if (getRequestorType().equals(Authenticator.RequestorType.PROXY)) { -67returnnew PasswordAuthentication(username, password.toCharArray()); -68 } -69returnsuper.getPasswordAuthentication(); -70 } -71 }; -72 Authenticator.setDefault(auth); -73 } -74 -75 proxy = new Proxy(Proxy.Type.HTTP, address); -76 conn = (HttpURLConnection) url.openConnection(proxy); -77 } else { -78 conn = (HttpURLConnection) url.openConnection(); -79 } -80finalint timeout = Settings.getInt(Settings.KEYS.CONNECTION_TIMEOUT, 10000); -81 conn.setConnectTimeout(timeout); -82 conn.setInstanceFollowRedirects(true); -83 } catch (IOException ex) { -84if (conn != null) { -85try { -86 conn.disconnect(); -87 } finally { -88 conn = null; -89 } -90 } -91thrownewURLConnectionFailureException("Error getting connection.", ex); -92 } -93return conn; -94 } -95 -96/** -97 * Utility method to create an HttpURLConnection. The use of a proxy here is optional as there may be cases where a proxy is -98 * configured but we don't want to use it (for example, if there's an internal repository configured) -99 * -100 * @param url the URL to connect to -101 * @param proxy whether to use the proxy (if configured) -102 * @return a newly constructed HttpURLConnection -103 * @throws URLConnectionFailureException thrown if there is an exception -104 */ -105publicstatic HttpURLConnection createHttpURLConnection(URL url, boolean proxy) throws URLConnectionFailureException { -106if (proxy) { -107return createHttpURLConnection(url); -108 } -109 HttpURLConnection conn = null; -110try { -111 conn = (HttpURLConnection) url.openConnection(); -112finalint timeout = Settings.getInt(Settings.KEYS.CONNECTION_TIMEOUT, 10000); -113 conn.setConnectTimeout(timeout); -114 conn.setInstanceFollowRedirects(true); -115 } catch (IOException ioe) { -116thrownewURLConnectionFailureException("Error getting connection.", ioe); -117 } -118return conn; -119 } -120 } +20import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +21import java.io.IOException; +22import java.net.Authenticator; +23import java.net.HttpURLConnection; +24import java.net.InetSocketAddress; +25import java.net.PasswordAuthentication; +26import java.net.Proxy; +27import java.net.SocketAddress; +28import java.net.URL; +29 +30/** +31 * A URLConnection Factory to create new connections. This encapsulates several configuration checks to ensure that the connection +32 * uses the correct proxy settings. +33 * +34 * @author Jeremy Long +35 */ +36publicfinalclassURLConnectionFactory { +37 +38/** +39 * Private constructor for this factory. +40 */ +41privateURLConnectionFactory() { +42 } +43 +44/** +45 * Utility method to create an HttpURLConnection. If the application is configured to use a proxy this method will retrieve +46 * the proxy settings and use them when setting up the connection. +47 * +48 * @param url the url to connect to +49 * @return an HttpURLConnection +50 * @throws URLConnectionFailureException thrown if there is an exception +51 */ +52 @SuppressFBWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE", justification = "Just being extra safe") +53publicstatic HttpURLConnection createHttpURLConnection(URL url) throws URLConnectionFailureException { +54 HttpURLConnection conn = null; +55 Proxy proxy; +56final String proxyUrl = Settings.getString(Settings.KEYS.PROXY_SERVER); +57try { +58if (proxyUrl != null) { +59finalint proxyPort = Settings.getInt(Settings.KEYS.PROXY_PORT); +60final SocketAddress address = new InetSocketAddress(proxyUrl, proxyPort); +61 +62final String username = Settings.getString(Settings.KEYS.PROXY_USERNAME); +63final String password = Settings.getString(Settings.KEYS.PROXY_PASSWORD); +64if (username != null && password != null) { +65final Authenticator auth = new Authenticator() { +66 @Override +67public PasswordAuthentication getPasswordAuthentication() { +68if (getRequestorType().equals(Authenticator.RequestorType.PROXY)) { +69returnnew PasswordAuthentication(username, password.toCharArray()); +70 } +71returnsuper.getPasswordAuthentication(); +72 } +73 }; +74 Authenticator.setDefault(auth); +75 } +76 +77 proxy = new Proxy(Proxy.Type.HTTP, address); +78 conn = (HttpURLConnection) url.openConnection(proxy); +79 } else { +80 conn = (HttpURLConnection) url.openConnection(); +81 } +82finalint timeout = Settings.getInt(Settings.KEYS.CONNECTION_TIMEOUT, 10000); +83 conn.setConnectTimeout(timeout); +84 conn.setInstanceFollowRedirects(true); +85 } catch (IOException ex) { +86if (conn != null) { +87try { +88 conn.disconnect(); +89 } finally { +90 conn = null; +91 } +92 } +93thrownewURLConnectionFailureException("Error getting connection.", ex); +94 } +95return conn; +96 } +97 +98/** +99 * Utility method to create an HttpURLConnection. The use of a proxy here is optional as there may be cases where a proxy is +100 * configured but we don't want to use it (for example, if there's an internal repository configured) +101 * +102 * @param url the URL to connect to +103 * @param proxy whether to use the proxy (if configured) +104 * @return a newly constructed HttpURLConnection +105 * @throws URLConnectionFailureException thrown if there is an exception +106 */ +107publicstatic HttpURLConnection createHttpURLConnection(URL url, boolean proxy) throws URLConnectionFailureException { +108if (proxy) { +109return createHttpURLConnection(url); +110 } +111 HttpURLConnection conn = null; +112try { +113 conn = (HttpURLConnection) url.openConnection(); +114finalint timeout = Settings.getInt(Settings.KEYS.CONNECTION_TIMEOUT, 10000); +115 conn.setConnectTimeout(timeout); +116 conn.setInstanceFollowRedirects(true); +117 } catch (IOException ioe) { +118thrownewURLConnectionFailureException("Error getting connection.", ioe); +119 } +120return conn; +121 } +122 }
    diff --git a/dependency-check-utils/xref/org/owasp/dependencycheck/utils/package-frame.html b/dependency-check-utils/xref/org/owasp/dependencycheck/utils/package-frame.html index 84c522074..bb3d2218f 100644 --- a/dependency-check-utils/xref/org/owasp/dependencycheck/utils/package-frame.html +++ b/dependency-check-utils/xref/org/owasp/dependencycheck/utils/package-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Utils 1.3.0 Reference Package org.owasp.dependencycheck.utils + Dependency-Check Utils 1.3.1 Reference Package org.owasp.dependencycheck.utils diff --git a/dependency-check-utils/xref/org/owasp/dependencycheck/utils/package-summary.html b/dependency-check-utils/xref/org/owasp/dependencycheck/utils/package-summary.html index 630a2d899..c661d5917 100644 --- a/dependency-check-utils/xref/org/owasp/dependencycheck/utils/package-summary.html +++ b/dependency-check-utils/xref/org/owasp/dependencycheck/utils/package-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Utils 1.3.0 Reference Package org.owasp.dependencycheck.utils + Dependency-Check Utils 1.3.1 Reference Package org.owasp.dependencycheck.utils diff --git a/dependency-check-utils/xref/overview-frame.html b/dependency-check-utils/xref/overview-frame.html index fc495c6f6..40f60c443 100644 --- a/dependency-check-utils/xref/overview-frame.html +++ b/dependency-check-utils/xref/overview-frame.html @@ -3,7 +3,7 @@ - Dependency-Check Utils 1.3.0 Reference + Dependency-Check Utils 1.3.1 Reference @@ -16,27 +16,6 @@ diff --git a/dependency-check-utils/xref/overview-summary.html b/dependency-check-utils/xref/overview-summary.html index 31b78ce26..d5a57b949 100644 --- a/dependency-check-utils/xref/overview-summary.html +++ b/dependency-check-utils/xref/overview-summary.html @@ -3,7 +3,7 @@ - Dependency-Check Utils 1.3.0 Reference + Dependency-Check Utils 1.3.1 Reference @@ -24,7 +24,7 @@ -

    Dependency-Check Utils 1.3.0 Reference

    +

    Dependency-Check Utils 1.3.1 Reference

    - org.owasp.dependencycheck.org.apache.tools.ant -
    org.owasp.dependencycheck.utils
    @@ -34,41 +34,6 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/dependency-check.pdf b/dependency-check.pdf deleted file mode 100644 index 1a4a46f1434ff94f052e1abfc3f909ad12d8a86f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329686 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

    #V6Tpd4gNuLK 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

    00mEvA(p*<=N6Z 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Ν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

    jWBu## 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

    O-xPCceST-`TWu;JsZ*lJX<&S zW?nov?zOhI=y4VUw6mnNfbvAk$g$$PdS&;9Pk#FG$*!*cK?gbqJ_EYS(x~F8Y|G}( zo}OxPadLdAoLcvVyLXLaMag+-2>a}YPe=kigx-QND zWR`*;u*vdCbm16K9m7PAG9$hMW}o2cI9+KMW;=IQ*b&XJMfN2K0yEKNSdbBtw=$As zP}s_#CFz^yESc&-w!orfDN4#!MSac+l(o8~zbwZJX>6t-kXZ?-k$(qJ@>D5MEe<9q z>v`vH?R${+Yy^IGvoE|bI&%F~u4lVz@EU)a%RJlpn(b1-NT^ki^Rftruw5B&R zyD&06Jriy3=;kp8xVC>XIl6Pc;YC~s#M*z^)3>U>Se)WPrnbH>fBA9SZf`@05RMeC zRvN`)BcsDFyfAzai+oD5*V{wXb=`}X4sEkYU<@>2Nv7nU^)Bs**SG1$t1%|STtOX> z(;bwKFW&vdCv3SUbiw9+H9@fjfMs_rxl;b-U;M>iJYQY?TH$Mgke4T3j!(bFT}1{( zvxMO~piH;Dpps4q74!Ld#(*BH?m)x$x9Zv8c)I@rbB(&z1VqrL^*YI4aT_v98kVl} zfK5r75J1BerE>wwDS_`$iD8EFl;#RJ>{vXkq|X={nrPM#WLA7D0T7Zey5paekC7vjx=sxT+67rfcCYsH4b($tA+BeQz%-h+oi z?ng$(hVT04uS|aK3s0mL@?)FU^hdVLOdMVHna@A4_~cVB9OCwURj%3HDwLbngvA*P z0h7CZj1l#g*I1-u-Rp|z>tY!fn0Wk!eJ@_LxUe)Q560p&{5dx)WZPKLWbCY=Ep$gC z?}h!Z8D!F4F(fmokHDBASdD3sHUyyUV!;i|0t!Qn1y0V-&u``ANfxCQ&TH*{4O{He zt+Ile39~F5fQ=4^fDEp_WuQY$!jQs6*STrZls&KL z5mOzTv{;@?R9Va9=tzqWA5z_f#q~{jMnP>Vm;Vv7k9=ZrJgT+@tNxUV&OQklhnKY-#!gfM5+5VF3*1f^~z#jRAF=NI~G7o}Syw6rI~2jY(9o zJ)Z2|lWg6xja?K=;+MwPriL;_n-dNy=^Oc zyN)6S~@mMU;Y1U8|mz5LRkS>5Qi)dzBAOV<=LVP|yqBF@;cCEZLulw2^ zYZ@0^uMAZw_I&QHuPzO2SX)Lu zNq&UDfNhpd){OQw${4G}9vqThmKseYei}hzkfo~-fM>>lN<)GGQn%>5ao$*>vEZSI zroYW*8}EnVg_Ux_f`JqlHluTw=B{&O3ms>9!W66WFTbR>uNfRoWt&p099OmKNO6`Z z7pyc1R`Rt>x}kJ^Tv?sV9H?BFt|7l!29B1F?P^Ann~xlwIQsrye_iy84?MMIc6Q;k z%FNFfCwE*n;2l14x}S&FD-8D6qY&Pcy}%pOTlz(;idMvW>ZBc|f6o&76MRl+wKK@=~8Z+w>-S&Q-AxZ`(1C&eB&!$ z8u;ZOZe9aGlwlT+Y`Nlav!zNaPi~p3v%og33mHH^0|>#9-_I5;x)}9(ds9ba-oe)W z`}TD5B>R9E(c37TePIEI3kcNJ0fZSt(7+2bNq z!S(}#h0vv|~@K)vvzrOo`7f zU~Gwy!d4{CjZukK<3>)POk6HpaXxNBpjmZrlZv#Y^7%06#U?}+5T)Km#nOm|)8Y=` zHk$mdNHfi?rZg`P>MRzk(WRNZKjoi-E>!t|Q+{PBT1uo-i@COrrH-z?YHLq_s-vsB zmo+n9U=C#iph(gJ8f9xdo9=8VLP8|H@6giJ=D~rbkKM4N`wRCxoc+qKaqllaaj%z6 z)r;7g6WnSW`0yR~G0aXSYvsA)HTZ97?Wm?w=`IYOc+8i}i;H9V#g0^}qkCaKzbeC= zE?5O}z!ORc1{nhse1vY#fCUI-4RuKa0xoWTGbP$tt2Pz^c8gUJI0RpZSc%!ugdhHc zxDL_=WUTK}fwqKcE>QKdE3S<#ociJg7?3aXO!HIEJ-4sxqKhvwpsA*;?Mna%5S?v7 ze2vB%ufP8K)PoN`$nU_M2``_RL^8STCjcE_(VY(IIB!h5WN!9f%#^m@UyKo!F zV2GPY-WBQg%cps&u-|7qIDDeecH1r6mpWRrnHLWX^Rry>P4tFeX_C)VCmp~{62W6gB-l+0+gLu8#Xe%z3J7=e7y2p>7Xg_*zC^r1UzWT_agA1pR zAD^0=n;S>Lv&mE{%CbcY7EC#k3$8q~Q1G)OC-Q8$?<&0Y$9LxDXQ%yr2PYPDxz0!` zlWT9(%EKt3lMMqC?HxTExmCt)q6k|{BkV2kTNp!hWm?*^{J_{EZ%`PGB~lDOB4(up zKUq9e0!NGtQH}skcPVU~t2Z^s!jaCaJ&FqpOD(Lz_~&n1m)09#WeG(>R#mjbx8ec~ z%Y8<}X55x9w@UMB1H_W#JOcIVv9=Y9<4+Hhqn}wTLHLRl{VNV;bJ=dQc*d7oRTV$_ zNKe7oFquvzcJJT+;_|IcvdsGGXraBQ=Ng_pc$Yd7&Vp^M1Q|_2?D=1$F97nIvSF5G z_>mfaKRsfG6s@;(Ucotl#ZqFOB9A>gQTwsiUtGL!`_@%^_da{7TIJTL-scg3PDg`Q zaPEL5cdAQ3Ii_hMXF%($oJ&`23pzb3qPPPt_0&dKU!xdpW9L_Lc;KuHkaonP*<37^ zOJc=gI$0$D6lxuBG;3H^mSh`Vrc!El=4VS?Cr(au9^8K{_1xYA^%oBeEgV07axy=+ zG)|x9)0tF;F<|FnG17AKRDNvj+V=cUyzTnln4fQXX7})DYkPN!7X`>gE%K)QF3rZG zQkXFtTv7&(COFS^!E{!$Xz4<;H=7(WW(a|10Mr_t(gNV9%=EaGR5q!PG61KMH-i6Yx)b<`X5m9yk zK!Bwn0BU^5gycDZ$bhsl!C3FIM0WjwczWeJL~Axm7K>{j@z_&i@hzMCkN@QVar>I1 zM~5oYQ?n-lY{xRdLZDeoXTbKgtf2s9){ycc(3U|a=!Sqpxttj|MO9^WX}CH{m-Y$r z`u3&KfzL$}71G=bsrs> z?0A0PNOaHh2djq<9i5q+o?|W7t4>Z87q^|WB9_iHI!=yOm)MZo#gE(oFxRfUqGQsK zXyZEL7=;4~1D?)pfG;pAor9a@0|*19TaS~A#R863tI?IbT)lAFrJGJ{+O&GJSv`>C z*8Nn+(NMa9(T?H+I_?EA7MY+up7HW5qwu5QI?;-R1gX#r0XGYe?I)LWq{FXrbKHc{jd z@@!?l;8dn{+eTqpDwI1G0>T+9()OliD_svierl12wx{3zwl}UG9Xnnd9UVK$Z9KUi z1Ax^HVPFbUipvu}XIs9PTSL17t+dpnI`+RzSM^B(X8=pX(%{b$Ev^#EcR+OMu1?qw z+XqO8&2q9lBXH8U)<`1N#mmFmQ>hkSN|B4C6Onu((l}AC6=p|9rt9fU`z$Xl>XLPr z5)JTl1~v%pViO=_8Z>_6B@7OzI*<67#rgSY6>u-ij*s(*#RPKJTPyq~)&=b8Nx1RZ z$rJqj3g|(YRZe0fT^Fi zFfiAeCo6^H{HRa!INho)E*9oCtY5cQKvM_-sHGWo+5u2;{u|BlLkADtX9f9M24P2A z$J-gJyk6^ol8srwvj8XysB}$MCMTy};At%V%CpSj70K+Tqw!S#S`n3k^pjdnahy}h zxj~fM@RED?&$ga8y>R%a-f?5wwryMbhKCPME-jYydv4s~Q+@ZRnEusyr5GUth?|g* zLfY52hE{~H5WEI3D!!syRufi%)?6fLSBcI(iVuz9j31TOzi_BTvBF0d4H>0)lUP?e zo$E|x+p^p~?ov6ahmz<-7b+Hv6W1HQrD!D(42;lG=QS>DR4XH?biMn1@47YD)mrbE zo*b);96P;GKybX#!mre#ZB0Ls>FtUfx$5eRHkqXps-OY(%yNcS(2et;X}}1;h+_1n zSd9q&T!3mu+PaD}&*+`Pr!hJUY^*td>p5GQAhIYy{u$7zo;#P^ z4A}KX%g~{rKex{Ebq0i;UGK%UY=bw17~Ulz9=KqV?RJ|$I5s+3q@ygm@Jp4xzd74^ zWtLfKR^$wP+RG|=q7^$httx>JgNS^k^Wn!%dEK44!|(jrx2$SwOSKFQ9XeKJ5e!RZ zKkaIYw&IEr32AT)&%dEHRAVYnb@3n6bhH9GAuScPvK$N;0q-tZ;B$Rao(!N^)3@P9 z>}g?$bU6XuFU{{Idy|!FdAw38O!=`yom*f0gc`J^eClc!xwd*K*xIC&OWbCp;s9D! z7Uf6dso27zm)!mAffMmWZgj_`8yi>e+>%bj>djN5`C3PNZ0y==wpBI`u301N=Ei-_ z(!IpG2}}V%WTB*Mxp9*CU{!UbJp&O(1E%to#z$jDTMwjQonIp@&mGv!i#0L~AqsfU z^Lx6x_cQ(N4XvOW(4_O4OOH9jdd8rTCd^ zs;I*pO{F>-Bc#g`)hQzcEa1xk03ZNKL_t)Gt}%;%B>)h&TZ}5|tP=x3E3Yw`(cxUb z%)ml3`{Qp zP~Pa+w|daKedQ*4!%L;;wplU*3vv2l>wM}pX_BA*&II}|aFA{j60*!Xs+@}P1v^$l zv=oyxERe1XDxTd~tRMJq2-VPZt+=#nP4Zl_cM- zJOkmXRjc@s8gD>jLCuPF1=<);OZqfuuG#Wp-qgh8A?ccD2Jj?7%3qpT#i0Z3%YoRam5w$V<$AU)odiVjTuV0I zibri}%_i6_lW6N`?eFBFqYi}K(b>h5YN_Vp!hC&^9~r6gYy-c0TI0F>q7Prx$}aFjmP{cudEA%i}`pvnonW_6XoC!ElTu;S8aI3t(R zwbVmNFV%L=rgDBylArL!sQZV;$0s}87%&(U%6%J;a`(YrLyco;qt>WhMb;S*@+;sw z9RS@=B7~C=_21pD)APAVjgVhhkUS4D@}u3z%4B98?=MkM>6Zp4Cic%V9zviab@S2QN zeW_4n-I$*?V)2(9Ds%jNLs{S&o8d=Rre@h7kmpVW3($;FaM2th8HPky3Ef{dHa*rB zPn~~mU*9wPimW@vTX>lo77$lhhf^juC=lMHWMc>>ozewLvyfzHHVwG!Zkj+R1UT?X zvcx$zU~y*PqJQQ>brgMoR8=7XO7!@EJwAexf}^QJm@h6|kfc=46;r<62En^r7$)Ra zU>}F!UYlKzRAnpop37t<<=&-hxnK$o>RNf)3@n^lxA9Z}L^WnO@TUUe#7v`l?KKz1zWmkCO!juKY|#rVZM%jc2Oa^eZqHeF zC@;&X4HQzketBE($q{)#$e^G1@;92MGfh4OGzB{-s&W)IO9uTgu5q7;XuqHXg~~Zl zs*G7l8ni!0(t%j@EEO;t36&rqQ!TV(p#WmXXuUGojh7h(bcrd}kGr}$FL1o@K$O5p z6=#*jGX{hHvCzt|G`L{qt-H79Jrvv=jsb;WjR9@JS~FyVTr$-1r%#WqfXEPyXgs)- zZasIEaTQ3>z(ibs%W>tM{c&yE0AC!6N#*M()35m4LbdDZeKV=yW3z{MTsqkJ>7RQ0 z$~9|y+9I*~!pz*vI6opYCIn-3m=IYlQ>b{Cpp2%{UBsn`bU>dg^>n2=D^s$H?Mvm2 z+jkyIv~E~EJzwi)mg-)$W^7p{qqjUh4Tyq6Vclp}O6C0C-Fr?v{rK+4bGr}5o_}uG zdw$=6^6}%R%bPcL1KVoX>G3j(inN++pdC!Ajfl~Kad9tehAvmH7ZEPnzF54II|$!6h=vp>;UO^t zC-t#NVY-rCx~QR7CtQxFC(0W?`PmaZBYSH4%IzJ~ufFNEJwNx(cdnkBn~AX2DCEJG>^{Z^9ct!@#fsI0a6x_ za3+pRZ`Lj#=|pV9h7E0aoizfPloh&PSw2A~93RT0@MAY~G&T=YT2EaUPjvH!PbWAP zHtev2IMC<>uYESoz91`25~OM-Lp?#2%A2 zY{P_?XemZxo$J_Z*P|c%(eu=J*SY!msipt)fjj%M?LFmku{aV-CfETT=aB%7VfmIx zweAM8K_;*SG`&{t1;>DhHcU*jPonb+UwU?+zdL^PhHEch!w^Al&@x`ky$ZOT3qUsR zLsCQRd&eyW`qA6YvgNEZh(bVFC=(|WB~&Oh^& zdzcLSo14wbVl&=8-HayJ3V1dkuQS2ZWePFuU3;RfuN@_ns-;rlyutLqbiUY}oL)MV z)t*6!OSX2=(pTmyPTmp@Or={oCzh7V>n=P$LDVaaMWj`GF2D?*4JSz?QsEtQ1nz-ZhUz>C;*GD-`q$hFYAm) ztP|lfi~tBeY!YI>AWnZ%b9u*Dd73BKr&UFSNbgPfVI zRRPXr9bH*Yi5Mi+I|;&oD8-Ym;+%`85U@goFd_?rv9S&@h|i49R5pyyRc&BzmXti( z1w>_AV7BtOQI0mTfW8eAD5oVHn_D9^t>I~$BCf+;C{Ok&KQnP`@2&?{>BYN9f7pw4 zZRCRFw?Q-uRD0CZ1L2~;e^d_($)?4ksZwddJ2mRXf9V&lZ$AIRkFn%ZTd$5!KJmn4@B7~U+QqlM?dF!Jp4{vIr#=zEWZGnq%8XqD>Ps2c;0n%_sw-Ait%maHhb)EW@#+#$O7TY?Hi&|x zNYEV2agt7#4Tu^d%j&S5n>L`RnI~XWgUG~q5V8eqE#a7;#f$PN!@Vf4uRDHlus^qP z_rpBOA4?zgqiOa?ici@`{Yja$P5T0+U&F!$77V&xpk;g@dw!m>%IAn=XqbacjQpErKfdvezEx%|KqEL zH@-er?QUuyny$>xFD>R5N(%=L&lN^z_ViIsr zcdW4=92+nst8fA%@hL9L6=T=s;M!d3(^(xq@U458~YZfdCavrr6sDx`Ni2Z zUPj7W1|Ve>mvz)pMgm&vMJvW8=XC;@&3;MHovU2lB|KQ{Ev1n(N;n)TN4X;N@j^Y(B;^?}IK;V@{)B}giI-n1CvDk@fJvMmg z$b6RN8-4_#>)4OKW$UUFC-1CIFG7tiI(1%fuzH~T@Qy3Ct^UmCo@GfaHo*_o_2lOh zeRFe*Oa@y9Cuj5eRnNoP@DPd4x1uv<^-b32nn|o#S0y;ER+hA%S$w9N4tGVm+plv_St3Z8PX79q!FAY zbLv-uRN~U@a8^_uG%!$6b=AHA=4dEEprE5lS6o6-oD&I90+8^8K6j-Gh$^EzN!vd&G&9Jg;u9b3OLH~2fh_0h@k(RzxtLn+)qYYXKT zN7z(WpL8owOC>rNQ0*><_{L1~Q@OmNmLGB+A6t@JT3V{FrM<}1Y@zI)(`fWHD#ga! zOg?*HXmaFz?|wsTVSZuL@Bh}DqV@8Ef8Q4$Ni8lECSjWgsS+D`MrI@6?-A3IgT`9A zN_Eh^U$br;`8S!U4A~}YXX%{$EUrT0lRlVSI4W-AH|l9zXZco+2EmC!EZ(MvoiKua zk$PiAekDX8(=1uRSwH|NKvKnAG992wV$-HgNpKhA_s+O-0iD(c)rgMfhILM+fXR<8 z>xJ418XR%urP%7|5-c_NQi?zof>X(OS;)H5=Gv6cN7m5M)JdRp_*QXKpdFnc)SZ_D zQ8QZEBGHg=1sYx55}eAL0*E_7il%tbxx4zs12^JH;mQokL56zDm#}!f*afYl?XB^( zANsvNIkA|JvMAe3l0gmEj<^khsQb$-w%NJHmZQ*UoKj~JD_PkrkC#vlH-pYjUDQs+P2`AGMtKKa?= z1NVOQ=-Alwu@FqU1EMjXte9xqIW$c+oLf2dOWUzXC&SWow6UV{ESWDc%SSkJE}Dpf zA=r8!WYT~3SSm|o7!xk=gWYLY{%AWiBH49{dZ&`DW(phbXm zV?qF^bKFd^QZ5Lr;td41MWUHg%kGo3mjKPz2{DDQcDCDi@@gt9N~2+~vv(q-x4QN0RsxnrxiMQMOPM6|TWo93KiMy22!A z?#|U-wWF7JES6S$uTHzykJQq`4lJr{qRQ!oh8NU}pwJOIl{>@2HR`Nb|>2+$S{vw+S83wV;7 zKq(sB9!=wQV?1kt7OCW(sB$0_QCUF!Y=J_x%&T>p%`yVi9h(kzTrtv-@F56Q6FJ01 z$7a4(OYAC94AMbGC>vTs!NkC*bSvo;rLqx9$nz(s zW=_|d9qX>Sd`&IdT#P;Z&`@Kcm`>Gev(v+ej!fQo!Rfe5GvV1e`Bp}SRK(Shm2#66*M^h?FO}C{*T;_~&34}LN1tTJP;Sup zGrlaJN&=z?A>hC@i>`<}*GxI<0G6Jz;TW-5t<6W9k-k=Lzah(*ymunrtj$dG9x0wo zlBE)2{dg)RUXC9-Rif?W3oo8J`mSHT(K~c-WZh!EFplTy+O%ck)*~mYYo2;;CVkgE z`<5QvJwDXYx8}fq{Pi~^Z@l)L7u{_=`e_QM_s|Z99J~z4T%qzD0G-8>5JO;^r9*Zm zb9l1*&gypnQ~@+JHtISf!g;)iq#`OAyK7$8^>nY$`eFPz7Lf@E1_)KL3K4cLnEB-yd{Kgyl z3;DUJ_CLGhQ-`9F)-3{{?aslXie+O;G@)UeYOQgSAz&7fJRA?3T&ZU>a-F-)A>34% z!OFF4yZo}EE&%Zti!`D$GrR!Ri?r!ZhF%^8-Bpo#xj8;Ik!m#0WrtB?<>eQwDE-V& z?MVHPzrCmHhMTWF-rm_cAcoXDwmz3kW(J2(E_p-8p0>Wa3s6dfRq=fmpd<@<1Y54L zbXP_omBq5Lq~Z|Qwyi*l9JxT$PiNdr@FFeO$dL_a5+l?bKDY5;3|%=3=qd=VaO z;SgrSAhr#(Dx^+uRJPI;v1Y`pl_OQcvQr5M+A3ppNLPIlRVTdKRY>I|P`j!{Hb@g8 z8?TV3GA_MQ`LWlmFaZ9^$Nv5h`y#feZ3SzKxEneI)=+t(9UPY}qSa76%9)i^IY8N{ zi~;hs$#i47y{CJfES)9~{7h|Pc6L#0wizF~pQa6mjY4U0F3$oS=S@HR*q+JCnt@fb zzwzt0#~!%nE2~CNoI2trAGlL0TYm(6Xd0Mwk#MduynBUy3Ume$le5^i`jA&0lOb)1 zhnIg$hN7chnNF;ePDezgJEX)*M5KNVrg*7=^rLpo8qyZD1v;Co0nTvD8EytK(srz!fTs z49j#i=#olXISGg?>mU)OS$Rt$PQF?(4g(q{I4kGss!b_LgrpdyqQJ%*Z|KV}EzGvx z@v*-<#8875Iw3Ss6qp(v>eaP&*-vK)>1N~Lb^Dl`|#17&*;6k5w=@A!v4^b66)A9!%>>0`%-Lx8Bs z5P*_p2rL0m{T1K@0;QV;GH|Q+I#<^uH@6I9?o)lWE|YEopd{x`aF$?ShCgClV4;0f zI`0}1T`EvO?MaS0Dj{63Rzc#-6{F6!xk(AQqLS^X(X+>a$JJ3ks|p=*gH>Q-U1ZJ< z;?g(`zR%7J<1Sxk1{g{TOlB4B=maAImZpe=6qJ)>L_w1g^-(8od?HOJ0ZP-> zVQ$j5t{>bml+0$hZ%utEh9j?rNYBkKl+8V=LkJno(5c8GZ>6MT*&OVd!o^kCH)Q^ts}a+JoY(^tauEfKD}|^mVGBG8#lfP#(@D*=Aei zNc?&&jJq(PVW877hznO{t$|Rq9_76Pu~-Fn%*N1QNk$eBSFGSHU^qeH?Hv@M6*WRz zvga zMQ~Kxq~j2D)XdjCC}j=8D|1BCHu=rQC=1UUxPU8{zv^~gLh0y{{QX06?32v!Wp?Ni9DyQJu;Tid zB@z%^y0Jjqx#ysa0akGVSLKxNCMA-HjSe^(6Y4u5^ghOu6=?GQE{WP!Q}r@1leaD^ zY4L0eC@U!*1x8*!SLY{&qZQGW3wE#n5a_Ug_UqvR0Es6O{6@B~9mm1&yvfV!tfXT~ z@i3SWAu2$MNvY6~5EO9doR~y72xLYk5EKO*RnG0tl@XYf6VeQ-*ww2F8WKB_oDe~z z!4*w41gpAX9lA61me-xL;m`i;FP5gK%DgSf4KoCM7ep+mVYHlr)VBUi_(4e>+z zA|vZ2{-rnpM6ZVvi1=e->R$$MYz*ecnhs!+1Nyga+bv7=fiwdjM+FC1rOPtu2u0df zIi2&xaF&l+;?#5mYy4Z#xwue(LK3MkN79wwEGymal8_fJ�X1gOjD?f!wu_;pYWD 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
    b@eoWO!k7#;~O)G8ct&Z$l>Pzw-iZo_^jAO=$ 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 S0yzSI=7>R{_)wtygZ>|%+auZl diff --git a/dependency-updates-report.html b/dependency-updates-report.html new file mode 100644 index 000000000..b8a34e7d6 --- /dev/null +++ b/dependency-updates-report.html @@ -0,0 +1,1438 @@ + + + + + + + + + dependency-check – Dependency Updates Report + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +

    + + + + + +
    +
    + +
    + + +
    + +
    +

    Overview

    +

    This report summarizes newer versions that may be available for your project's various dependencies.

    +

    =%>U|I~O(EQPS3xZ{odcIOJN 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

    - org.owasp.dependencycheck.org.apache.tools.ant -
    - org.owasp.dependencycheck.org.apache.tools.ant.launch -
    - org.owasp.dependencycheck.org.apache.tools.ant.taskdefs.condition -
    - org.owasp.dependencycheck.org.apache.tools.ant.types -
    - org.owasp.dependencycheck.org.apache.tools.ant.types.resources -
    - org.owasp.dependencycheck.org.apache.tools.ant.types.selectors -
    - org.owasp.dependencycheck.org.apache.tools.ant.util -
    org.owasp.dependencycheck.utils
    + + + + + + + + + + + + + + + + + + + +
    # of dependencies using the latest version available25
    # of dependencies where the next version available is smaller than an incremental version update0
    # of dependencies where the next version available is an incremental version update0
    # of dependencies where the next version available is a minor version update5
    # of dependencies where the next version available is a major version update0
    +
    +

    Dependency Management

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    StatusGroup IdArtifact IdCurrent VersionScopeClassifierTypeNext VersionNext IncrementalNext MinorNext Major
    ch.qos.logbacklogback-classic1.1.3jar
    ch.qos.logbacklogback-core1.1.3jar
    com.google.code.findbugsannotations3.0.0jar
    com.h2databaseh21.3.176jar1.4.177
    com.sun.mailmailapi1.5.4jar
    commons-clicommons-cli1.3.1jar
    commons-iocommons-io2.4jar
    junitjunit4.12testjar
    org.apache.antant1.9.6jar
    org.apache.antant-testutil1.9.6jar
    org.apache.commonscommons-compress1.10jar
    org.apache.commonscommons-lang33.4jar
    org.apache.lucenelucene-analyzers-common4.7.2jar4.8.05.0.0
    org.apache.lucenelucene-core4.7.2jar4.8.05.0.0
    org.apache.lucenelucene-queryparser4.7.2jar4.8.05.0.0
    org.apache.lucenelucene-test-framework4.7.2jar4.8.05.0.0
    org.apache.mavenmaven-core3.3.3jar
    org.apache.mavenmaven-plugin-api3.3.3jar
    org.apache.mavenmaven-settings3.3.3jar
    org.apache.maven.plugin-testingmaven-plugin-testing-harness3.3.0jar
    org.apache.maven.plugin-toolsmaven-plugin-annotations3.4jar
    org.apache.maven.pluginsmaven-site-plugin3.4jar
    org.apache.maven.reportingmaven-reporting-api3.0jar
    org.apache.velocityvelocity1.7jar
    org.glassfishjavax.json1.0.4jar
    org.hamcresthamcrest-core1.3testjar
    org.jmockitjmockit1.19testjar
    org.jsoupjsoup1.8.3jar
    org.slf4jslf4j-api1.7.12jar
    org.slf4jslf4j-simple1.7.12jar
    StatusGroup IdArtifact IdCurrent VersionScopeClassifierTypeNext VersionNext IncrementalNext MinorNext Major
    +
    +

    Dependencies

    +

    This project does not declare any dependencies.

    +
    +

    Dependency Updates

    +

    +
    +

    ch.qos.logback:logback-classic

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idch.qos.logback
    Artifact Idlogback-classic
    Current Version1.1.3
    Scope
    Classifier
    Typejar
    +
    +

    ch.qos.logback:logback-core

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idch.qos.logback
    Artifact Idlogback-core
    Current Version1.1.3
    Scope
    Classifier
    Typejar
    +
    +

    com.google.code.findbugs:annotations

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idcom.google.code.findbugs
    Artifact Idannotations
    Current Version3.0.0
    Scope
    Classifier
    Typejar
    +
    +

    com.h2database:h2

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Status There is at least one newer minor version available. Minor updates are sometimes passive.
    Group Idcom.h2database
    Artifact Idh2
    Current Version1.3.176
    Scope
    Classifier
    Typejar
    Newer versions1.4.177 Next Minor
    1.4.178
    1.4.179
    1.4.180
    1.4.181
    1.4.182
    1.4.183
    1.4.184
    1.4.185
    1.4.186
    1.4.187
    1.4.188
    1.4.189 Latest Minor
    +
    +

    com.sun.mail:mailapi

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idcom.sun.mail
    Artifact Idmailapi
    Current Version1.5.4
    Scope
    Classifier
    Typejar
    +
    +

    commons-cli:commons-cli

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idcommons-cli
    Artifact Idcommons-cli
    Current Version1.3.1
    Scope
    Classifier
    Typejar
    +
    +

    commons-io:commons-io

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idcommons-io
    Artifact Idcommons-io
    Current Version2.4
    Scope
    Classifier
    Typejar
    +
    +

    junit:junit

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idjunit
    Artifact Idjunit
    Current Version4.12
    Scopetest
    Classifier
    Typejar
    +
    +

    org.apache.ant:ant

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.ant
    Artifact Idant
    Current Version1.9.6
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.ant:ant-testutil

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.ant
    Artifact Idant-testutil
    Current Version1.9.6
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.commons:commons-compress

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.commons
    Artifact Idcommons-compress
    Current Version1.10
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.commons:commons-lang3

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.commons
    Artifact Idcommons-lang3
    Current Version3.4
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.lucene:lucene-analyzers-common

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Status There is at least one newer minor version available. Minor updates are sometimes passive.
    Group Idorg.apache.lucene
    Artifact Idlucene-analyzers-common
    Current Version4.7.2
    Scope
    Classifier
    Typejar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    +
    +

    org.apache.lucene:lucene-core

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Status There is at least one newer minor version available. Minor updates are sometimes passive.
    Group Idorg.apache.lucene
    Artifact Idlucene-core
    Current Version4.7.2
    Scope
    Classifier
    Typejar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    +
    +

    org.apache.lucene:lucene-queryparser

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Status There is at least one newer minor version available. Minor updates are sometimes passive.
    Group Idorg.apache.lucene
    Artifact Idlucene-queryparser
    Current Version4.7.2
    Scope
    Classifier
    Typejar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    +
    +

    org.apache.lucene:lucene-test-framework

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Status There is at least one newer minor version available. Minor updates are sometimes passive.
    Group Idorg.apache.lucene
    Artifact Idlucene-test-framework
    Current Version4.7.2
    Scope
    Classifier
    Typejar
    Newer versions4.8.0 Next Minor
    4.8.1
    4.9.0
    4.9.1
    4.10.0
    4.10.1
    4.10.2
    4.10.3
    4.10.4 Latest Minor
    5.0.0 Next Major
    5.1.0
    5.2.0
    5.2.1
    5.3.0 Latest Major
    +
    +

    org.apache.maven:maven-core

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.maven
    Artifact Idmaven-core
    Current Version3.3.3
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.maven:maven-plugin-api

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.maven
    Artifact Idmaven-plugin-api
    Current Version3.3.3
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.maven:maven-settings

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.maven
    Artifact Idmaven-settings
    Current Version3.3.3
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.maven.plugin-testing:maven-plugin-testing-harness

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.maven.plugin-testing
    Artifact Idmaven-plugin-testing-harness
    Current Version3.3.0
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.maven.plugin-tools:maven-plugin-annotations

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.maven.plugin-tools
    Artifact Idmaven-plugin-annotations
    Current Version3.4
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.maven.plugins:maven-site-plugin

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.maven.plugins
    Artifact Idmaven-site-plugin
    Current Version3.4
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.maven.reporting:maven-reporting-api

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.maven.reporting
    Artifact Idmaven-reporting-api
    Current Version3.0
    Scope
    Classifier
    Typejar
    +
    +

    org.apache.velocity:velocity

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.apache.velocity
    Artifact Idvelocity
    Current Version1.7
    Scope
    Classifier
    Typejar
    +
    +

    org.glassfish:javax.json

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.glassfish
    Artifact Idjavax.json
    Current Version1.0.4
    Scope
    Classifier
    Typejar
    +
    +

    org.hamcrest:hamcrest-core

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.hamcrest
    Artifact Idhamcrest-core
    Current Version1.3
    Scopetest
    Classifier
    Typejar
    +
    +

    org.jmockit:jmockit

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.jmockit
    Artifact Idjmockit
    Current Version1.19
    Scopetest
    Classifier
    Typejar
    +
    +

    org.jsoup:jsoup

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.jsoup
    Artifact Idjsoup
    Current Version1.8.3
    Scope
    Classifier
    Typejar
    +
    +

    org.slf4j:slf4j-api

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.slf4j
    Artifact Idslf4j-api
    Current Version1.7.12
    Scope
    Classifier
    Typejar
    +
    +

    org.slf4j:slf4j-simple

    + + + + + + + + + + + + + + + + + + + + + +
    Status No newer versions available.
    Group Idorg.slf4j
    Artifact Idslf4j-simple
    Current Version1.7.12
    Scope
    Classifier
    Typejar
    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/fonts/glyphicons-halflings-regular.eot b/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..637452ea5404ac01670c10db5276e73114d16178 GIT binary patch literal 35283 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 literal 0 HcmV?d00001 diff --git a/fonts/glyphicons-halflings-regular.svg b/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 000000000..446948874 --- /dev/null +++ b/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.ttf b/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..282401576351ef7d0eb7313e74a251694b6d78bc GIT binary patch literal 55016 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

    ;Iyg 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 DH|yT| literal 0 HcmV?d00001 diff --git a/fonts/glyphicons-halflings-regular.woff b/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..f824ac15a0ac59d8c236f346f3bd429542cdf8b9 GIT binary patch literal 41793 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 rud|qO%&t*s9p4=a>C(eVk5+BKxj-=M`2KEQ - + - dependency-check - How does dependency-check work? - + dependency-check – How does dependency-check work? + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -

  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,97 +72,111 @@
    -
    +
    -
    +

    How does dependency-check work?

    Dependency-check works by collecting information about the files it scans (using Analyzers). The information collected is called Evidence; there are three types of evidence collected: vendor, product, and version. For instance, the JarAnalyzer will collect information from the Manifest, pom.xml, and the package names within the JAR files scanned and it has heuristics to place the information from the various sources into one or more buckets of evidence.

    Within the NVD CVE Data (schema can be found here) each CVE Entry has a list of vulnerable software:

    -
      <entry id="CVE-2012-5055">
    +
      <entry id="CVE-2012-5055">
       ...
         <vuln:vulnerable-software-list>
           <vuln:product>cpe:/a:vmware:springsource_spring_security:3.1.2</vuln:product>
           <vuln:product>cpe:/a:vmware:springsource_spring_security:2.0.4</vuln:product>
           <vuln:product>cpe:/a:vmware:springsource_spring_security:3.0.1</vuln:product>
    -
    +

    These CPE entries are read “cpe:/[Entry Type]:[Vendor]:[Product]:[Version]:[Revision]:…”. The CPE data is collected and stored in a Lucene Index. Dependency-check then use the Evidence collected and attempt to match an entry from the Lucene CPE Index. If found, the CPEAnalyzer will add an Identifier to the Dependency and subsequently to the report. Once a CPE has been identified the associated CVE entries are added to the report.

    One important point about the evidence is that it is rated using different confidence levels - low, medium, high, and highest. These confidence levels are applied to each item of evidence. When the CPE is determined it is given a confidence level that is equal to the lowest level confidence level of evidence used during identification. If only highest confidence evidence was used in determining the CPE then the CPE would have a highest confidence level.

    Because of the way dependency-check works both false positives and false negatives may exist. Please read How to read the report to get a better understanding of sorting through the false positives and false negatives.

    @@ -230,15 +244,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/general/nvd_download.sh b/general/nvd_download.sh new file mode 100644 index 000000000..5af32b5b9 --- /dev/null +++ b/general/nvd_download.sh @@ -0,0 +1,5 @@ +#!/bin/sh +NVD_ROOT=$1/`date -I` +JAR_PATH=$2/nist-data-mirror-1.0.0.jar +java -jar $JAR_PATH $NVD_ROOT +rm $NVD_ROOT/*.xml # D-C works directly with .gz files anyway. \ No newline at end of file diff --git a/general/scan_iso.html b/general/scan_iso.html new file mode 100644 index 000000000..5acb97402 --- /dev/null +++ b/general/scan_iso.html @@ -0,0 +1,328 @@ + + + + + + + + + dependency-check – How to Mount ISO Files for Scanning + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +

    How to Mount ISO Files for Scanning

    +

    Dependency-Check can be used as one of your tools for vetting software distributed via an ISO image. (See File Type Analyzers for a list of what types of artifacts Dependency-Check is capable of scanning.) These disk image files are not a standard archive format, however. Tools must be used that can interpret the contained file system. As will be shown below, Linux, Mac OS X, and recent versions of Windows can be used to mount the image’s file system, which can then be scanned by Dependency-Check.

    +

    ISO images are named for the fact that they nearly always contain one of a pair of international file system standards published by ISO: ISO 9660 and ISO/IEC 13346, a.k.a. UDF. Other types of disk images (e.g., VHD) are outside the scope of this article, though the ideas presented here may likely be succesfully applied.

    +
    +

    Linux

    +

    Assume you’ve downloaded an ISO image called foo.iso, and you want to mount it at /mnt/foo. (Why /mnt? See the Filesystem Hierarchy Standard.) First make sure that the mount point exists using mkdir /mnt/foo. Then, the mount command must be run with root privileges. On Debian and Ubuntu Linux, this is accomplished by prefacing the command with sudo.

    + +
    +
    $ sudo mount -o loop foo.iso /mnt/foo
    +
    +

    Next, you can use Dependency-Check’s command line tool to scan the mount point. When you are finished, run the umount command with root privileges:

    + +
    +
    $ sudo umount -d /mnt/foo
    +
    +

    This will unmount the file system, and detach the loop device.

    +
    +

    Mac OS X

    +
    +

    Using the GUI

    +

    Simply double-click on the image file in Mac OS X Finder.

    +
    +

    Using a Terminal Window

    +

    Use the hdiutil command.

    + +
    +
    $ hdiutil attach foo.iso
    +
    +

    The output will show the /dev entry assigned as well as the mount point, which is where you may now read the files in the image’s file system.

    +

    To detach:

    + +
    +
    $ hdiutil detach foo.iso
    +
    +
    +

    Windows

    +

    Windows 8 and later versions support mounting ISO images as a virtual drive.

    +
    +

    Using the GUI

    + +
      + +
    1. In File Explorer, right-click on “foo.iso”.
    2. + +
    3. Select “Mount”
    4. +
    +

    File Explorer then redirects to showing the files on your virtual drive. You can then use the command line tool to scan the virtual drive. When finished, “Windows-E” will open File Explorer showing the various drives on your computer. To eject the virtual drive:

    + +
      + +
    1. Right-click on the virtual drive.
    2. + +
    3. Select “Eject”
    4. +
    +
    +

    Using PowerShell

    +

    To mount, use the Mount-DiskImage cmdlet:

    + +
    +
    $ Mount-DiskImage -ImagePath C:\Full\Path\to\foo.iso
    +
    +

    To view all drives (and find your virtual drive), use the Get-PSDrive cmdlet:

    + +
    +
    $ Get-PSDrive -PSProvider 'FileSystem'
    +
    +

    To dismount, use the Dismount-DiskImage cmdlet:

    + +
    +
    $ Dismount-DiskImage -ImagePath C:\Full\Path\to\file.iso
    +
    +
    +

    Windows 7

    +

    Third-party tools exist that can be used to mount ISO images. Without such tools, it is still possible to burn the ISO image to physical media, and scan the media:

    + +
      + +
    1. Right-click on “foo.iso”
    2. + +
    3. Select “Windows Disc Image Burner”
    4. + +
    5. Follow the instructions to burn the image.
    6. +
    +
    +

    Windows Vista

    +

    Just as with Windows 7, you will need a third-party tool to mount an ISO image. You will also need a third-party tool to burn the image to media. Many machines are shipped with such a tool included.

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/general/suppression.html b/general/suppression.html index 31ca61abb..99f0c4eb7 100644 --- a/general/suppression.html +++ b/general/suppression.html @@ -1,21 +1,21 @@ - + - dependency-check - Suppressing False Positives - + dependency-check – Suppressing False Positives + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,97 +72,111 @@
    -
    +
    -
    +

    Suppressing False Positives

    Due to how dependency-check identifies libraries false positives may occur (a CPE was identified that is incorrect). Suppressing these false positives is fairly easy using the HTML report. In the report next to each CPE identified (and on CVE entries) there is a suppress button. Clicking the suppression button will create a dialogue box which you can simple hit Control-C to copy the XML that you would place into a suppression XML file. If this is the first time you are creating the suppression file you should click the “Complete XML Doc” button on the top of the dialogue box to add the necessary schema elements.

    A sample suppression file would look like:

    -
    <?xml version="1.0" encoding="UTF-8"?>
    +
    <?xml version="1.0" encoding="UTF-8"?>
     <suppressions xmlns="https://www.owasp.org/index.php/OWASP_Dependency_Check_Suppression">
        <suppress>
           <notes><![CDATA[
    @@ -220,12 +234,12 @@
           <cpe>cpe:/a:apache:struts:2.0.0</cpe>
        </suppress>
     </suppressions>
    -
    +

    The above XML file will suppress the cpe:/a:apache:struts:2.0.0 from any file with the a matching SHA1 hash.

    The following shows some other ways to suppress individual findings. Note the ways to select files using either the sha1 hash or the filePath (the filePath can also be a regex). Additionally, there are several things that can be suppressed - individual CPEs, individual CVEs, or all CVE entries below a specified CVSS score. The most common would be suppressing CPEs based off of SHA1 hashes or filePath (regexes) - these entries can be generated using the HTML version of the report. The other common scenario would be to ignore all CVEs below a certain CVSS threshold.

    -
    <?xml version="1.0" encoding="UTF-8"?>
    +
    <?xml version="1.0" encoding="UTF-8"?>
     <suppressions
         xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
         xmlns='https://www.owasp.org/index.php/OWASP_Dependency_Check_Suppression'
    @@ -274,7 +288,7 @@
             <cpe>cpe:/a:mod_security:mod_security</cpe>
         </suppress>
     </suppressions>
    -
    +

    The full schema for suppression files can be found here: suppression.xsd

    Please see the appropriate configuration option in each interfaces configuration guide:

    @@ -297,15 +311,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/general/thereport.html b/general/thereport.html index 5c456ea5c..a34353dde 100644 --- a/general/thereport.html +++ b/general/thereport.html @@ -1,21 +1,21 @@ - + - dependency-check - How To Read The Reports - + dependency-check – How To Read The Reports + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,97 +72,111 @@
    -
    +
    -
    +

    How To Read The Reports

    The top of the report contains a list of the identified vulnerable components. By clicking the ‘Showing Vulnerable Dependencies’ link the list will be expanded to include all of the dependencies scanned. The table lists:

    @@ -239,15 +253,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/images/apache-maven-project-2.png b/images/apache-maven-project-2.png index 6c096ec0c7d50ecca14e76dd49b1fcb9382c3d07..a44db6ed08630e9fc59e65ea42a1a067f781ddae 100644 GIT binary patch literal 43073 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 literal 33442 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 - + - dependency-check - About - + dependency-check – About + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -

  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,97 +72,111 @@
    -
    +
    -
    +

    About

    -

    OWASP dependency-check is an open source solution the OWASP Top 10 2013 entry: A9 - Using Components with Known Vulnerabilities. Dependency-check can currently be used to scan Java, .NET, and Python applications (and their dependent libraries) to identify known vulnerable components. In addition, Dependency-check can be used to scan some source code, including OpenSSL source code and source code for projects that use Autoconf.

    +

    OWASP dependency-check is an open source solution the OWASP Top 10 2013 entry: A9 - Using Components with Known Vulnerabilities. Dependency-check can currently be used to scan Java, .NET, Python, Ruby (gemspec), PHP (composer), and Node.js applications (and their dependent libraries) to identify known vulnerable components. In addition, Dependency-check can be used to scan some source code, including OpenSSL source code and projects that use Autoconf or CMake.

    The problem with using known vulnerable components was covered in a paper by Jeff Williams and Arshan Dabirsiaghi titled, “The Unfortunate Reality of Insecure Libraries” (registration required). The gist of the paper is that we as a development community include third party libraries in our applications that contain well known published vulnerabilities (such as those at the National Vulnerability Database).

    More information about dependency-check can be found here:

    @@ -241,15 +255,14 @@
    -

    Copyright © 2012–2015 +

    Copyright © 2012–2015 OWASP. All rights reserved.

    -
    +
    -
    diff --git a/integration.html b/integration.html new file mode 100644 index 000000000..88d6195a1 --- /dev/null +++ b/integration.html @@ -0,0 +1,310 @@ + + + + + + + + + dependency-check – Continuous Integration + + + + + + + + + + + + + + + + + + + + + Fork me on GitHub + + + + + +
    + + + + + +
    +
    + +
    + + +
    + +
    +

    Overview

    +

    This project uses Continuous Integration System.

    +
    +

    Access

    +

    The following is a link to the continuous integration system used by the project:

    +
    +
    +

    Notifiers

    +

    No notifiers are defined. Please check back at a later date.

    +
    +
    +
    + +
    + +
    +
    +
    +

    Copyright © 2012–2015 + OWASP. + All rights reserved. + +

    +
    + + +
    +
    + + diff --git a/issue-tracking.html b/issue-tracking.html index e4d5c5a9b..f9d68203e 100644 --- a/issue-tracking.html +++ b/issue-tracking.html @@ -1,21 +1,21 @@ - + - dependency-check - Issue Tracking - + dependency-check – Issue Tracking + - + @@ -29,7 +29,7 @@ - + Fork me on GitHub @@ -62,9 +62,9 @@ -
  • | Last Published: 2015-08-04
  • +
  • | Last Published: 2015-09-20
  • - Version: 1.3.0 + Version: 1.3.1
  • @@ -72,148 +72,169 @@
    diff --git a/js/apache-maven-fluido-1.4.min.js b/js/apache-maven-fluido-1.4.min.js new file mode 100644 index 000000000..0537c09d6 --- /dev/null +++ b/js/apache-maven-fluido-1.4.min.js @@ -0,0 +1,25 @@ +/*! + * jQuery JavaScript Library v1.11.2 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-17T15:27Z + */ +(function(b,a){if(typeof module==="object"&&typeof module.exports==="object"){module.exports=b.document?a(b,true):function(c){if(!c.document){throw new Error("jQuery requires a window with a document")}return a(c)}}else{a(b)}}(typeof window!=="undefined"?window:this,function(a5,av){var aP=[];var P=aP.slice;var az=aP.concat;var x=aP.push;var bU=aP.indexOf;var ac={};var y=ac.toString;var K=ac.hasOwnProperty;var D={};var ai="1.11.2",bI=function(e,i){return new bI.fn.init(e,i)},E=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,bS=/^-ms-/,aW=/-([\da-z])/gi,O=function(e,i){return i.toUpperCase()};bI.fn=bI.prototype={jquery:ai,constructor:bI,selector:"",length:0,toArray:function(){return P.call(this)},get:function(e){return e!=null?(e<0?this[e+this.length]:this[e]):P.call(this)},pushStack:function(e){var i=bI.merge(this.constructor(),e);i.prevObject=this;i.context=this.context;return i},each:function(i,e){return bI.each(this,i,e)},map:function(e){return this.pushStack(bI.map(this,function(b7,b6){return e.call(b7,b6,b7)}))},slice:function(){return this.pushStack(P.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(b7){var e=this.length,b6=+b7+(b7<0?e:0);return this.pushStack(b6>=0&&b6=0},isEmptyObject:function(i){var e;for(e in i){return false}return true},isPlainObject:function(b7){var i;if(!b7||bI.type(b7)!=="object"||b7.nodeType||bI.isWindow(b7)){return false}try{if(b7.constructor&&!K.call(b7,"constructor")&&!K.call(b7.constructor.prototype,"isPrototypeOf")){return false}}catch(b6){return false}if(D.ownLast){for(i in b7){return K.call(b7,i)}}for(i in b7){}return i===undefined||K.call(b7,i)},type:function(e){if(e==null){return e+""}return typeof e==="object"||typeof e==="function"?ac[y.call(e)]||"object":typeof e},globalEval:function(e){if(e&&bI.trim(e)){(a5.execScript||function(i){a5["eval"].call(a5,i)})(e)}},camelCase:function(e){return e.replace(bS,"ms-").replace(aW,O)},nodeName:function(i,e){return i.nodeName&&i.nodeName.toLowerCase()===e.toLowerCase()},each:function(ca,cb,b6){var b9,b7=0,b8=ca.length,e=ad(ca);if(b6){if(e){for(;b70&&(i-1) in b6}var m= +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function(de){var cy,dh,cn,cH,cK,ci,cW,dg,dm,cI,cX,cZ,cC,co,c8,c3,df,ce,cF,da="sizzle"+1*new Date(),cJ=de.document,di=0,c4=0,b9=cA(),c9=cA(),cG=cA(),cE=function(i,e){if(i===e){cX=true}return 0},cQ=1<<31,cO=({}).hasOwnProperty,dc=[],dd=dc.pop,cM=dc.push,b7=dc.push,cm=dc.slice,cd=function(dq,dp){var dn=0,e=dq.length;for(;dn+~]|"+cp+")"+cp+"*"),ct=new RegExp("="+cp+"*([^\\]'\"]*?)"+cp+"*\\]","g"),cS=new RegExp(ck),cU=new RegExp("^"+cL+"$"),c2={ID:new RegExp("^#("+b6+")"),CLASS:new RegExp("^\\.("+b6+")"),TAG:new RegExp("^("+b6.replace("w","w*")+")"),ATTR:new RegExp("^"+c6),PSEUDO:new RegExp("^"+ck),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+cp+"*(even|odd|(([+-]|)(\\d*)n|)"+cp+"*(?:([+-]|)"+cp+"*(\\d+)|))"+cp+"*\\)|)","i"),bool:new RegExp("^(?:"+b8+")$","i"),needsContext:new RegExp("^"+cp+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+cp+"*((?:-\\d)?\\d*)"+cp+"*\\)|)(?=[^-]|$)","i")},cc=/^(?:input|select|textarea|button)$/i,cl=/^h\d$/i,cP=/^[^{]+\{\s*\[native \w/,cR=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,c1=/[+~]/,cN=/'|\\/g,cs=new RegExp("\\\\([\\da-f]{1,6}"+cp+"?|("+cp+")|.)","ig"),c5=function(e,dp,i){var dn="0x"+dp-65536;return dn!==dn||i?dp:dn<0?String.fromCharCode(dn+65536):String.fromCharCode(dn>>10|55296,dn&1023|56320)},dl=function(){cZ()};try{b7.apply((dc=cm.call(cJ.childNodes)),cJ.childNodes);dc[cJ.childNodes.length].nodeType}catch(cD){b7={apply:dc.length?function(i,e){cM.apply(i,cm.call(e))}:function(dq,dp){var e=dq.length,dn=0;while((dq[e++]=dp[dn++])){}dq.length=e-1}}}function cw(dv,dn,dz,dB){var dA,ds,dt,dx,dy,dr,dq,e,dp,dw;if((dn?dn.ownerDocument||dn:cJ)!==cC){cZ(dn)}dn=dn||cC;dz=dz||[];dx=dn.nodeType;if(typeof dv!=="string"||!dv||dx!==1&&dx!==9&&dx!==11){return dz}if(!dB&&c8){if(dx!==11&&(dA=cR.exec(dv))){if((dt=dA[1])){if(dx===9){ds=dn.getElementById(dt);if(ds&&ds.parentNode){if(ds.id===dt){dz.push(ds);return dz}}else{return dz}}else{if(dn.ownerDocument&&(ds=dn.ownerDocument.getElementById(dt))&&cF(dn,ds)&&ds.id===dt){dz.push(ds);return dz}}}else{if(dA[2]){b7.apply(dz,dn.getElementsByTagName(dv));return dz}else{if((dt=dA[3])&&dh.getElementsByClassName){b7.apply(dz,dn.getElementsByClassName(dt));return dz}}}}if(dh.qsa&&(!c3||!c3.test(dv))){e=dq=da;dp=dn;dw=dx!==1&&dv;if(dx===1&&dn.nodeName.toLowerCase()!=="object"){dr=ci(dv);if((dq=dn.getAttribute("id"))){e=dq.replace(cN,"\\$&")}else{dn.setAttribute("id",e)}e="[id='"+e+"'] ";dy=dr.length;while(dy--){dr[dy]=e+ch(dr[dy])}dp=c1.test(dv)&&cT(dn.parentNode)||dn;dw=dr.join(",")}if(dw){try{b7.apply(dz,dp.querySelectorAll(dw));return dz}catch(du){}finally{if(!dq){dn.removeAttribute("id")}}}}}return dg(dv.replace(cr,"$1"),dn,dz,dB)}function cA(){var i=[];function e(dn,dp){if(i.push(dn+" ")>cn.cacheLength){delete e[i.shift()]}return(e[dn+" "]=dp)}return e}function cj(e){e[da]=true;return e}function cf(i){var dp=cC.createElement("div");try{return !!i(dp)}catch(dn){return false}finally{if(dp.parentNode){dp.parentNode.removeChild(dp)}dp=null}}function dj(dn,dq){var e=dn.split("|"),dp=dn.length;while(dp--){cn.attrHandle[e[dp]]=dq}}function ca(i,e){var dp=e&&i,dn=dp&&i.nodeType===1&&e.nodeType===1&&(~e.sourceIndex||cQ)-(~i.sourceIndex||cQ);if(dn){return dn}if(dp){while((dp=dp.nextSibling)){if(dp===e){return -1}}}return i?1:-1}function cx(e){return function(dn){var i=dn.nodeName.toLowerCase();return i==="input"&&dn.type===e}}function cb(e){return function(dn){var i=dn.nodeName.toLowerCase();return(i==="input"||i==="button")&&dn.type===e}}function c7(e){return cj(function(i){i=+i;return cj(function(dn,ds){var dq,dp=e([],dn.length,i),dr=dp.length;while(dr--){if(dn[(dq=dp[dr])]){dn[dq]=!(ds[dq]=dn[dq])}}})})}function cT(e){return e&&typeof e.getElementsByTagName!=="undefined"&&e}dh=cw.support={};cK=cw.isXML=function(e){var i=e&&(e.ownerDocument||e).documentElement;return i?i.nodeName!=="HTML":false};cZ=cw.setDocument=function(dn){var e,i,dp=dn?dn.ownerDocument||dn:cJ;if(dp===cC||dp.nodeType!==9||!dp.documentElement){return cC}cC=dp;co=dp.documentElement;i=dp.defaultView;if(i&&i!==i.top){if(i.addEventListener){i.addEventListener("unload",dl,false)}else{if(i.attachEvent){i.attachEvent("onunload",dl)}}}c8=!cK(dp);dh.attributes=cf(function(dq){dq.className="i";return !dq.getAttribute("className")});dh.getElementsByTagName=cf(function(dq){dq.appendChild(dp.createComment(""));return !dq.getElementsByTagName("*").length});dh.getElementsByClassName=cP.test(dp.getElementsByClassName);dh.getById=cf(function(dq){co.appendChild(dq).id=da;return !dp.getElementsByName||!dp.getElementsByName(da).length});if(dh.getById){cn.find.ID=function(ds,dr){if(typeof dr.getElementById!=="undefined"&&c8){var dq=dr.getElementById(ds);return dq&&dq.parentNode?[dq]:[]}};cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(ds){return ds.getAttribute("id")===dq}}}else{delete cn.find.ID;cn.filter.ID=function(dr){var dq=dr.replace(cs,c5);return function(dt){var ds=typeof dt.getAttributeNode!=="undefined"&&dt.getAttributeNode("id");return ds&&ds.value===dq}}}cn.find.TAG=dh.getElementsByTagName?function(dq,dr){if(typeof dr.getElementsByTagName!=="undefined"){return dr.getElementsByTagName(dq)}else{if(dh.qsa){return dr.querySelectorAll(dq)}}}:function(dq,du){var dv,dt=[],ds=0,dr=du.getElementsByTagName(dq);if(dq==="*"){while((dv=dr[ds++])){if(dv.nodeType===1){dt.push(dv)}}return dt}return dr};cn.find.CLASS=dh.getElementsByClassName&&function(dr,dq){if(c8){return dq.getElementsByClassName(dr)}};df=[];c3=[];if((dh.qsa=cP.test(dp.querySelectorAll))){cf(function(dq){co.appendChild(dq).innerHTML="";if(dq.querySelectorAll("[msallowcapture^='']").length){c3.push("[*^$]="+cp+"*(?:''|\"\")")}if(!dq.querySelectorAll("[selected]").length){c3.push("\\["+cp+"*(?:value|"+b8+")")}if(!dq.querySelectorAll("[id~="+da+"-]").length){c3.push("~=")}if(!dq.querySelectorAll(":checked").length){c3.push(":checked")}if(!dq.querySelectorAll("a#"+da+"+*").length){c3.push(".#.+[+~]")}});cf(function(dr){var dq=dp.createElement("input");dq.setAttribute("type","hidden");dr.appendChild(dq).setAttribute("name","D");if(dr.querySelectorAll("[name=d]").length){c3.push("name"+cp+"*[*^$|!~]?=")}if(!dr.querySelectorAll(":enabled").length){c3.push(":enabled",":disabled")}dr.querySelectorAll("*,:x");c3.push(",.*:")})}if((dh.matchesSelector=cP.test((ce=co.matches||co.webkitMatchesSelector||co.mozMatchesSelector||co.oMatchesSelector||co.msMatchesSelector)))){cf(function(dq){dh.disconnectedMatch=ce.call(dq,"div");ce.call(dq,"[s!='']:x");df.push("!=",ck)})}c3=c3.length&&new RegExp(c3.join("|"));df=df.length&&new RegExp(df.join("|"));e=cP.test(co.compareDocumentPosition);cF=e||cP.test(co.contains)?function(dr,dq){var dt=dr.nodeType===9?dr.documentElement:dr,ds=dq&&dq.parentNode;return dr===ds||!!(ds&&ds.nodeType===1&&(dt.contains?dt.contains(ds):dr.compareDocumentPosition&&dr.compareDocumentPosition(ds)&16))}:function(dr,dq){if(dq){while((dq=dq.parentNode)){if(dq===dr){return true}}}return false};cE=e?function(dr,dq){if(dr===dq){cX=true;return 0}var ds=!dr.compareDocumentPosition-!dq.compareDocumentPosition;if(ds){return ds}ds=(dr.ownerDocument||dr)===(dq.ownerDocument||dq)?dr.compareDocumentPosition(dq):1;if(ds&1||(!dh.sortDetached&&dq.compareDocumentPosition(dr)===ds)){if(dr===dp||dr.ownerDocument===cJ&&cF(cJ,dr)){return -1}if(dq===dp||dq.ownerDocument===cJ&&cF(cJ,dq)){return 1}return cI?(cd(cI,dr)-cd(cI,dq)):0}return ds&4?-1:1}:function(dr,dq){if(dr===dq){cX=true;return 0}var dx,du=0,dw=dr.parentNode,dt=dq.parentNode,ds=[dr],dv=[dq];if(!dw||!dt){return dr===dp?-1:dq===dp?1:dw?-1:dt?1:cI?(cd(cI,dr)-cd(cI,dq)):0}else{if(dw===dt){return ca(dr,dq)}}dx=dr;while((dx=dx.parentNode)){ds.unshift(dx)}dx=dq;while((dx=dx.parentNode)){dv.unshift(dx)}while(ds[du]===dv[du]){du++}return du?ca(ds[du],dv[du]):ds[du]===cJ?-1:dv[du]===cJ?1:0};return dp};cw.matches=function(i,e){return cw(i,null,null,e)};cw.matchesSelector=function(dn,dq){if((dn.ownerDocument||dn)!==cC){cZ(dn)}dq=dq.replace(ct,"='$1']");if(dh.matchesSelector&&c8&&(!df||!df.test(dq))&&(!c3||!c3.test(dq))){try{var i=ce.call(dn,dq);if(i||dh.disconnectedMatch||dn.document&&dn.document.nodeType!==11){return i}}catch(dp){}}return cw(dq,cC,null,[dn]).length>0};cw.contains=function(e,i){if((e.ownerDocument||e)!==cC){cZ(e)}return cF(e,i)};cw.attr=function(dn,e){if((dn.ownerDocument||dn)!==cC){cZ(dn)}var i=cn.attrHandle[e.toLowerCase()],dp=i&&cO.call(cn.attrHandle,e.toLowerCase())?i(dn,e,!c8):undefined;return dp!==undefined?dp:dh.attributes||!c8?dn.getAttribute(e):(dp=dn.getAttributeNode(e))&&dp.specified?dp.value:null};cw.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)};cw.uniqueSort=function(dp){var dq,dr=[],e=0,dn=0;cX=!dh.detectDuplicates;cI=!dh.sortStable&&dp.slice(0);dp.sort(cE);if(cX){while((dq=dp[dn++])){if(dq===dp[dn]){e=dr.push(dn)}}while(e--){dp.splice(dr[e],1)}}cI=null;return dp};cH=cw.getText=function(dr){var dq,dn="",dp=0,e=dr.nodeType;if(!e){while((dq=dr[dp++])){dn+=cH(dq)}}else{if(e===1||e===9||e===11){if(typeof dr.textContent==="string"){return dr.textContent}else{for(dr=dr.firstChild;dr;dr=dr.nextSibling){dn+=cH(dr)}}}else{if(e===3||e===4){return dr.nodeValue}}}return dn};cn=cw.selectors={cacheLength:50,createPseudo:cj,match:c2,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){e[1]=e[1].replace(cs,c5);e[3]=(e[3]||e[4]||e[5]||"").replace(cs,c5);if(e[2]==="~="){e[3]=" "+e[3]+" "}return e.slice(0,4)},CHILD:function(e){e[1]=e[1].toLowerCase();if(e[1].slice(0,3)==="nth"){if(!e[3]){cw.error(e[0])}e[4]=+(e[4]?e[5]+(e[6]||1):2*(e[3]==="even"||e[3]==="odd"));e[5]=+((e[7]+e[8])||e[3]==="odd")}else{if(e[3]){cw.error(e[0])}}return e},PSEUDO:function(i){var e,dn=!i[6]&&i[2];if(c2.CHILD.test(i[0])){return null}if(i[3]){i[2]=i[4]||i[5]||""}else{if(dn&&cS.test(dn)&&(e=ci(dn,true))&&(e=dn.indexOf(")",dn.length-e)-dn.length)){i[0]=i[0].slice(0,e);i[2]=dn.slice(0,e)}}return i.slice(0,3)}},filter:{TAG:function(i){var e=i.replace(cs,c5).toLowerCase();return i==="*"?function(){return true}:function(dn){return dn.nodeName&&dn.nodeName.toLowerCase()===e}},CLASS:function(e){var i=b9[e+" "];return i||(i=new RegExp("(^|"+cp+")"+e+"("+cp+"|$)"))&&b9(e,function(dn){return i.test(typeof dn.className==="string"&&dn.className||typeof dn.getAttribute!=="undefined"&&dn.getAttribute("class")||"")})},ATTR:function(dn,i,e){return function(dq){var dp=cw.attr(dq,dn);if(dp==null){return i==="!="}if(!i){return true}dp+="";return i==="="?dp===e:i==="!="?dp!==e:i==="^="?e&&dp.indexOf(e)===0:i==="*="?e&&dp.indexOf(e)>-1:i==="$="?e&&dp.slice(-e.length)===e:i==="~="?(" "+dp.replace(cu," ")+" ").indexOf(e)>-1:i==="|="?dp===e||dp.slice(0,e.length+1)===e+"-":false}},CHILD:function(i,dq,dp,dr,dn){var dt=i.slice(0,3)!=="nth",e=i.slice(-4)!=="last",ds=dq==="of-type";return dr===1&&dn===0?function(du){return !!du.parentNode}:function(dA,dy,dD){var du,dG,dB,dF,dC,dx,dz=dt!==e?"nextSibling":"previousSibling",dE=dA.parentNode,dw=ds&&dA.nodeName.toLowerCase(),dv=!dD&&!ds;if(dE){if(dt){while(dz){dB=dA;while((dB=dB[dz])){if(ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1){return false}}dx=dz=i==="only"&&!dx&&"nextSibling"}return true}dx=[e?dE.firstChild:dE.lastChild];if(e&&dv){dG=dE[da]||(dE[da]={});du=dG[i]||[];dC=du[0]===di&&du[1];dF=du[0]===di&&du[2];dB=dC&&dE.childNodes[dC];while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if(dB.nodeType===1&&++dF&&dB===dA){dG[i]=[di,dC,dF];break}}}else{if(dv&&(du=(dA[da]||(dA[da]={}))[i])&&du[0]===di){dF=du[1]}else{while((dB=++dC&&dB&&dB[dz]||(dF=dC=0)||dx.pop())){if((ds?dB.nodeName.toLowerCase()===dw:dB.nodeType===1)&&++dF){if(dv){(dB[da]||(dB[da]={}))[i]=[di,dF]}if(dB===dA){break}}}}}dF-=dn;return dF===dr||(dF%dr===0&&dF/dr>=0)}}},PSEUDO:function(dp,dn){var e,i=cn.pseudos[dp]||cn.setFilters[dp.toLowerCase()]||cw.error("unsupported pseudo: "+dp);if(i[da]){return i(dn)}if(i.length>1){e=[dp,dp,"",dn];return cn.setFilters.hasOwnProperty(dp.toLowerCase())?cj(function(ds,du){var dr,dq=i(ds,dn),dt=dq.length;while(dt--){dr=cd(ds,dq[dt]);ds[dr]=!(du[dr]=dq[dt])}}):function(dq){return i(dq,0,e)}}return i}},pseudos:{not:cj(function(e){var i=[],dn=[],dp=cW(e.replace(cr,"$1"));return dp[da]?cj(function(dr,dw,du,ds){var dv,dq=dp(dr,null,ds,[]),dt=dr.length;while(dt--){if((dv=dq[dt])){dr[dt]=!(dw[dt]=dv)}}}):function(ds,dr,dq){i[0]=ds;dp(i,null,dq,dn);i[0]=null;return !dn.pop()}}),has:cj(function(e){return function(i){return cw(e,i).length>0}}),contains:cj(function(e){e=e.replace(cs,c5);return function(i){return(i.textContent||i.innerText||cH(i)).indexOf(e)>-1}}),lang:cj(function(e){if(!cU.test(e||"")){cw.error("unsupported lang: "+e)}e=e.replace(cs,c5).toLowerCase();return function(dn){var i;do{if((i=c8?dn.lang:dn.getAttribute("xml:lang")||dn.getAttribute("lang"))){i=i.toLowerCase();return i===e||i.indexOf(e+"-")===0}}while((dn=dn.parentNode)&&dn.nodeType===1);return false}}),target:function(e){var i=de.location&&de.location.hash;return i&&i.slice(1)===e.id},root:function(e){return e===co},focus:function(e){return e===cC.activeElement&&(!cC.hasFocus||cC.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===false},disabled:function(e){return e.disabled===true},checked:function(e){var i=e.nodeName.toLowerCase();return(i==="input"&&!!e.checked)||(i==="option"&&!!e.selected)},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling){if(e.nodeType<6){return false}}return true},parent:function(e){return !cn.pseudos.empty(e)},header:function(e){return cl.test(e.nodeName)},input:function(e){return cc.test(e.nodeName)},button:function(i){var e=i.nodeName.toLowerCase();return e==="input"&&i.type==="button"||e==="button"},text:function(i){var e;return i.nodeName.toLowerCase()==="input"&&i.type==="text"&&((e=i.getAttribute("type"))==null||e.toLowerCase()==="text")},first:c7(function(){return[0]}),last:c7(function(e,i){return[i-1]}),eq:c7(function(e,dn,i){return[i<0?i+dn:i]}),even:c7(function(e,dp){var dn=0;for(;dn=0;){e.push(dn)}return e}),gt:c7(function(e,dq,dp){var dn=dp<0?dp+dq:dp;for(;++dn1?function(dr,dq,dn){var dp=e.length;while(dp--){if(!e[dp](dr,dq,dn)){return false}}return true}:e[0]}function cz(dn,dr,dq){var dp=0,e=dr.length;for(;dp-1){dC[dE]=!(dz[dE]=dw)}}}}else{dy=c0(dy===dz?dy.splice(dt,dy.length):dy);if(dr){dr(null,dz,dy,dB)}else{b7.apply(dz,dy)}}})}function db(dt){var dn,dr,dp,ds=dt.length,dw=cn.relative[dt[0].type],dx=dw||cn.relative[" "],dq=dw?1:0,du=cq(function(i){return i===dn},dx,true),dv=cq(function(i){return cd(dn,i)>-1},dx,true),e=[function(dA,dz,dy){var i=(!dw&&(dy||dz!==dm))||((dn=dz).nodeType?du(dA,dz,dy):dv(dA,dz,dy));dn=null;return i}];for(;dq1&&dk(e),dq>1&&ch(dt.slice(0,dq-1).concat({value:dt[dq-2].type===" "?"*":""})).replace(cr,"$1"),dr,dq0,dq=dp.length>0,i=function(dA,du,dz,dy,dD){var dv,dw,dB,dF=0,dx="0",dr=dA&&[],dG=[],dE=dm,dt=dA||dq&&cn.find.TAG("*",dD),ds=(di+=dE==null?1:Math.random()||0.1),dC=dt.length;if(dD){dm=du!==cC&&du}for(;dx!==dC&&(dv=dt[dx])!=null;dx++){if(dq&&dv){dw=0;while((dB=dp[dw++])){if(dB(dv,du,dz)){dy.push(dv);break}}if(dD){di=ds}}if(e){if((dv=!dB&&dv)){dF--}if(dA){dr.push(dv)}}}dF+=dx;if(e&&dx!==dF){dw=0;while((dB=dn[dw++])){dB(dr,dG,du,dz)}if(dA){if(dF>0){while(dx--){if(!(dr[dx]||dG[dx])){dG[dx]=dd.call(dy)}}}dG=c0(dG)}b7.apply(dy,dG);if(dD&&!dA&&dG.length>0&&(dF+dn.length)>1){cw.uniqueSort(dy)}}if(dD){di=ds;dm=dE}return dr};return e?cj(i):i}cW=cw.compile=function(e,dp){var dq,dn=[],ds=[],dr=cG[e+" "];if(!dr){if(!dp){dp=ci(e)}dq=dp.length;while(dq--){dr=db(dp[dq]);if(dr[da]){dn.push(dr)}else{ds.push(dr)}}dr=cG(e,cY(ds,dn));dr.selector=e}return dr};dg=cw.select=function(dp,e,dq,dt){var dr,dw,dn,dx,du,dv=typeof dp==="function"&&dp,ds=!dt&&ci((dp=dv.selector||dp));dq=dq||[];if(ds.length===1){dw=ds[0]=ds[0].slice(0);if(dw.length>2&&(dn=dw[0]).type==="ID"&&dh.getById&&e.nodeType===9&&c8&&cn.relative[dw[1].type]){e=(cn.find.ID(dn.matches[0].replace(cs,c5),e)||[])[0];if(!e){return dq}else{if(dv){e=e.parentNode}}dp=dp.slice(dw.shift().value.length)}dr=c2.needsContext.test(dp)?0:dw.length;while(dr--){dn=dw[dr];if(cn.relative[(dx=dn.type)]){break}if((du=cn.find[dx])){if((dt=du(dn.matches[0].replace(cs,c5),c1.test(dw[0].type)&&cT(e.parentNode)||e))){dw.splice(dr,1);dp=dt.length&&ch(dw);if(!dp){b7.apply(dq,dt);return dq}break}}}}(dv||cW(dp,ds))(dt,e,!c8,dq,c1.test(dp)&&cT(e.parentNode)||e);return dq};dh.sortStable=da.split("").sort(cE).join("")===da;dh.detectDuplicates=!!cX;cZ();dh.sortDetached=cf(function(e){return e.compareDocumentPosition(cC.createElement("div"))&1});if(!cf(function(e){e.innerHTML="";return e.firstChild.getAttribute("href")==="#"})){dj("type|href|height|width",function(i,e,dn){if(!dn){return i.getAttribute(e,e.toLowerCase()==="type"?1:2)}})}if(!dh.attributes||!cf(function(e){e.innerHTML="";e.firstChild.setAttribute("value","");return e.firstChild.getAttribute("value")===""})){dj("value",function(i,e,dn){if(!dn&&i.nodeName.toLowerCase()==="input"){return i.defaultValue}})}if(!cf(function(e){return e.getAttribute("disabled")==null})){dj(b8,function(i,e,dp){var dn;if(!dp){return i[e]===true?e.toLowerCase():(dn=i.getAttributeNode(e))&&dn.specified?dn.value:null}})}return cw})(a5);bI.find=m;bI.expr=m.selectors;bI.expr[":"]=bI.expr.pseudos;bI.unique=m.uniqueSort;bI.text=m.getText;bI.isXMLDoc=m.isXML;bI.contains=m.contains;var A=bI.expr.match.needsContext;var a=(/^<(\w+)\s*\/?>(?:<\/\1>|)$/);var aL=/^.[^:#\[\.,]*$/;function aR(b6,e,i){if(bI.isFunction(e)){return bI.grep(b6,function(b8,b7){return !!e.call(b8,b7,b8)!==i})}if(e.nodeType){return bI.grep(b6,function(b7){return(b7===e)!==i})}if(typeof e==="string"){if(aL.test(e)){return bI.filter(e,b6,i)}e=bI.filter(e,b6)}return bI.grep(b6,function(b7){return(bI.inArray(b7,e)>=0)!==i})}bI.filter=function(b7,e,b6){var i=e[0];if(b6){b7=":not("+b7+")"}return e.length===1&&i.nodeType===1?bI.find.matchesSelector(i,b7)?[i]:[]:bI.find.matches(b7,bI.grep(e,function(b8){return b8.nodeType===1}))};bI.fn.extend({find:function(b6){var b9,b8=[],b7=this,e=b7.length;if(typeof b6!=="string"){return this.pushStack(bI(b6).filter(function(){for(b9=0;b91?bI.unique(b8):b8);b8.selector=this.selector?this.selector+" "+b6:b6;return b8},filter:function(e){return this.pushStack(aR(this,e||[],false))},not:function(e){return this.pushStack(aR(this,e||[],true))},is:function(e){return !!aR(this,typeof e==="string"&&A.test(e)?bI(e):e||[],false).length}});var z,n=a5.document,bt=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,bV=bI.fn.init=function(e,b6){var i,b7;if(!e){return this}if(typeof e==="string"){if(e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3){i=[null,e,null]}else{i=bt.exec(e)}if(i&&(i[1]||!b6)){if(i[1]){b6=b6 instanceof bI?b6[0]:b6;bI.merge(this,bI.parseHTML(i[1],b6&&b6.nodeType?b6.ownerDocument||b6:n,true));if(a.test(i[1])&&bI.isPlainObject(b6)){for(i in b6){if(bI.isFunction(this[i])){this[i](b6[i])}else{this.attr(i,b6[i])}}}return this}else{b7=n.getElementById(i[2]);if(b7&&b7.parentNode){if(b7.id!==i[2]){return z.find(e)}this.length=1;this[0]=b7}this.context=n;this.selector=e;return this}}else{if(!b6||b6.jquery){return(b6||z).find(e)}else{return this.constructor(b6).find(e)}}}else{if(e.nodeType){this.context=this[0]=e;this.length=1;return this}else{if(bI.isFunction(e)){return typeof z.ready!=="undefined"?z.ready(e):e(bI)}}}if(e.selector!==undefined){this.selector=e.selector;this.context=e.context}return bI.makeArray(e,this)};bV.prototype=bI.fn;z=bI(n);var bv=/^(?:parents|prev(?:Until|All))/,bz={children:true,contents:true,next:true,prev:true};bI.extend({dir:function(b6,i,b8){var e=[],b7=b6[i];while(b7&&b7.nodeType!==9&&(b8===undefined||b7.nodeType!==1||!bI(b7).is(b8))){if(b7.nodeType===1){e.push(b7)}b7=b7[i]}return e},sibling:function(b6,i){var e=[];for(;b6;b6=b6.nextSibling){if(b6.nodeType===1&&b6!==i){e.push(b6)}}return e}});bI.fn.extend({has:function(b8){var b7,b6=bI(b8,this),e=b6.length;return this.filter(function(){for(b7=0;b7-1:ca.nodeType===1&&bI.find.matchesSelector(ca,b9))){e.push(ca);break}}}return this.pushStack(e.length>1?bI.unique(e):e)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.first().prevAll().length:-1}if(typeof e==="string"){return bI.inArray(this[0],bI(e))}return bI.inArray(e.jquery?e[0]:e,this)},add:function(e,i){return this.pushStack(bI.unique(bI.merge(this.get(),bI(e,i))))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}});function aY(i,e){do{i=i[e]}while(i&&i.nodeType!==1);return i}bI.each({parent:function(i){var e=i.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return bI.dir(e,"parentNode")},parentsUntil:function(b6,e,b7){return bI.dir(b6,"parentNode",b7)},next:function(e){return aY(e,"nextSibling")},prev:function(e){return aY(e,"previousSibling")},nextAll:function(e){return bI.dir(e,"nextSibling")},prevAll:function(e){return bI.dir(e,"previousSibling")},nextUntil:function(b6,e,b7){return bI.dir(b6,"nextSibling",b7)},prevUntil:function(b6,e,b7){return bI.dir(b6,"previousSibling",b7)},siblings:function(e){return bI.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return bI.sibling(e.firstChild)},contents:function(e){return bI.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:bI.merge([],e.childNodes)}},function(e,i){bI.fn[e]=function(b8,b6){var b7=bI.map(this,i,b8);if(e.slice(-5)!=="Until"){b6=b8}if(b6&&typeof b6==="string"){b7=bI.filter(b6,b7)}if(this.length>1){if(!bz[e]){b7=bI.unique(b7)}if(bv.test(e)){b7=b7.reverse()}}return this.pushStack(b7)}});var aF=(/\S+/g);var b2={};function af(i){var e=b2[i]={};bI.each(i.match(aF)||[],function(b7,b6){e[b6]=true});return e}bI.Callbacks=function(ce){ce=typeof ce==="string"?(b2[ce]||af(ce)):bI.extend({},ce);var b8,b7,e,b9,ca,b6,cb=[],cc=!ce.once&&[],i=function(cf){b7=ce.memory&&cf;e=true;ca=b6||0;b6=0;b9=cb.length;b8=true;for(;cb&&ca-1){cb.splice(cg,1);if(b8){if(cg<=b9){b9--}if(cg<=ca){ca--}}}})}return this},has:function(cf){return cf?bI.inArray(cf,cb)>-1:!!(cb&&cb.length)},empty:function(){cb=[];b9=0;return this},disable:function(){cb=cc=b7=undefined;return this},disabled:function(){return !cb},lock:function(){cc=undefined;if(!b7){cd.disable()}return this},locked:function(){return !cc},fireWith:function(cg,cf){if(cb&&(!e||cc)){cf=cf||[];cf=[cg,cf.slice?cf.slice():cf];if(b8){cc.push(cf)}else{i(cf)}}return this},fire:function(){cd.fireWith(this,arguments);return this},fired:function(){return !!e}};return cd};bI.extend({Deferred:function(b6){var i=[["resolve","done",bI.Callbacks("once memory"),"resolved"],["reject","fail",bI.Callbacks("once memory"),"rejected"],["notify","progress",bI.Callbacks("memory")]],b7="pending",b8={state:function(){return b7},always:function(){e.done(arguments).fail(arguments);return this},then:function(){var b9=arguments;return bI.Deferred(function(ca){bI.each(i,function(cc,cb){var cd=bI.isFunction(b9[cc])&&b9[cc];e[cb[1]](function(){var ce=cd&&cd.apply(this,arguments);if(ce&&bI.isFunction(ce.promise)){ce.promise().done(ca.resolve).fail(ca.reject).progress(ca.notify)}else{ca[cb[0]+"With"](this===b8?ca.promise():this,cd?[ce]:arguments)}})});b9=null}).promise()},promise:function(b9){return b9!=null?bI.extend(b9,b8):b8}},e={};b8.pipe=b8.then;bI.each(i,function(ca,b9){var cc=b9[2],cb=b9[3];b8[b9[1]]=cc.add;if(cb){cc.add(function(){b7=cb},i[ca^1][2].disable,i[2][2].lock)}e[b9[0]]=function(){e[b9[0]+"With"](this===e?b8:this,arguments);return this};e[b9[0]+"With"]=cc.fireWith});b8.promise(e);if(b6){b6.call(e,e)}return e},when:function(b9){var b7=0,cb=P.call(arguments),e=cb.length,b6=e!==1||(b9&&bI.isFunction(b9.promise))?e:0,ce=b6===1?b9:bI.Deferred(),b8=function(cg,ch,cf){return function(i){ch[cg]=this;cf[cg]=arguments.length>1?P.call(arguments):i;if(cf===cd){ce.notifyWith(ch,cf)}else{if(!(--b6)){ce.resolveWith(ch,cf)}}}},cd,ca,cc;if(e>1){cd=new Array(e);ca=new Array(e);cc=new Array(e);for(;b70){return}ak.resolveWith(n,[bI]);if(bI.fn.triggerHandler){bI(n).triggerHandler("ready");bI(n).off("ready")}}});function bm(){if(n.addEventListener){n.removeEventListener("DOMContentLoaded",bZ,false);a5.removeEventListener("load",bZ,false)}else{n.detachEvent("onreadystatechange",bZ);a5.detachEvent("onload",bZ)}}function bZ(){if(n.addEventListener||event.type==="load"||n.readyState==="complete"){bm();bI.ready()}}bI.ready.promise=function(b8){if(!ak){ak=bI.Deferred();if(n.readyState==="complete"){setTimeout(bI.ready)}else{if(n.addEventListener){n.addEventListener("DOMContentLoaded",bZ,false);a5.addEventListener("load",bZ,false)}else{n.attachEvent("onreadystatechange",bZ);a5.attachEvent("onload",bZ);var b7=false;try{b7=a5.frameElement==null&&n.documentElement}catch(b6){}if(b7&&b7.doScroll){(function i(){if(!bI.isReady){try{b7.doScroll("left")}catch(b9){return setTimeout(i,50)}bm();bI.ready()}})()}}}}return ak.promise(b8)};var aC=typeof undefined;var bh;for(bh in bI(D)){break}D.ownLast=bh!=="0";D.inlineBlockNeedsLayout=false;bI(function(){var b6,b7,e,i;e=n.getElementsByTagName("body")[0];if(!e||!e.style){return}b7=n.createElement("div");i=n.createElement("div");i.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";e.appendChild(i).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";D.inlineBlockNeedsLayout=b6=b7.offsetWidth===3;if(b6){e.style.zoom=1}}e.removeChild(i)});(function(){var b6=n.createElement("div");if(D.deleteExpando==null){D.deleteExpando=true;try{delete b6.test}catch(i){D.deleteExpando=false}}b6=null})();bI.acceptData=function(b6){var i=bI.noData[(b6.nodeName+" ").toLowerCase()],e=+b6.nodeType||1;return e!==1&&e!==9?false:!i||i!==true&&b6.getAttribute("classid")===i};var by=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,aQ=/([A-Z])/g;function bA(b7,b6,b8){if(b8===undefined&&b7.nodeType===1){var i="data-"+b6.replace(aQ,"-$1").toLowerCase();b8=b7.getAttribute(i);if(typeof b8==="string"){try{b8=b8==="true"?true:b8==="false"?false:b8==="null"?null:+b8+""===b8?+b8:by.test(b8)?bI.parseJSON(b8):b8}catch(b9){}bI.data(b7,b6,b8)}else{b8=undefined}}return b8}function Q(i){var e;for(e in i){if(e==="data"&&bI.isEmptyObject(i[e])){continue}if(e!=="toJSON"){return false}}return true}function bc(b7,i,b9,b8){if(!bI.acceptData(b7)){return}var cb,ca,cc=bI.expando,cd=b7.nodeType,e=cd?bI.cache:b7,b6=cd?b7[cc]:b7[cc]&&cc;if((!b6||!e[b6]||(!b8&&!e[b6].data))&&b9===undefined&&typeof i==="string"){return}if(!b6){if(cd){b6=b7[cc]=aP.pop()||bI.guid++}else{b6=cc}}if(!e[b6]){e[b6]=cd?{}:{toJSON:bI.noop}}if(typeof i==="object"||typeof i==="function"){if(b8){e[b6]=bI.extend(e[b6],i)}else{e[b6].data=bI.extend(e[b6].data,i)}}ca=e[b6];if(!b8){if(!ca.data){ca.data={}}ca=ca.data}if(b9!==undefined){ca[bI.camelCase(i)]=b9}if(typeof i==="string"){cb=ca[i];if(cb==null){cb=ca[bI.camelCase(i)]}}else{cb=ca}return cb}function ab(b9,b7,e){if(!bI.acceptData(b9)){return}var cb,b8,ca=b9.nodeType,b6=ca?bI.cache:b9,cc=ca?b9[bI.expando]:bI.expando;if(!b6[cc]){return}if(b7){cb=e?b6[cc]:b6[cc].data;if(cb){if(!bI.isArray(b7)){if(b7 in cb){b7=[b7]}else{b7=bI.camelCase(b7);if(b7 in cb){b7=[b7]}else{b7=b7.split(" ")}}}else{b7=b7.concat(bI.map(b7,bI.camelCase))}b8=b7.length;while(b8--){delete cb[b7[b8]]}if(e?!Q(cb):!bI.isEmptyObject(cb)){return}}}if(!e){delete b6[cc].data;if(!Q(b6[cc])){return}}if(ca){bI.cleanData([b9],true)}else{if(D.deleteExpando||b6!=b6.window){delete b6[cc]}else{b6[cc]=null}}}bI.extend({cache:{},noData:{"applet ":true,"embed ":true,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){e=e.nodeType?bI.cache[e[bI.expando]]:e[bI.expando];return !!e&&!Q(e)},data:function(i,e,b6){return bc(i,e,b6)},removeData:function(i,e){return ab(i,e)},_data:function(i,e,b6){return bc(i,e,b6,true)},_removeData:function(i,e){return ab(i,e,true)}});bI.fn.extend({data:function(b8,cb){var b7,b6,ca,b9=this[0],e=b9&&b9.attributes;if(b8===undefined){if(this.length){ca=bI.data(b9);if(b9.nodeType===1&&!bI._data(b9,"parsedAttrs")){b7=e.length;while(b7--){if(e[b7]){b6=e[b7].name;if(b6.indexOf("data-")===0){b6=bI.camelCase(b6.slice(5));bA(b9,b6,ca[b6])}}}bI._data(b9,"parsedAttrs",true)}}return ca}if(typeof b8==="object"){return this.each(function(){bI.data(this,b8)})}return arguments.length>1?this.each(function(){bI.data(this,b8,cb)}):b9?bA(b9,b8,bI.data(b9,b8)):undefined},removeData:function(e){return this.each(function(){bI.removeData(this,e)})}});bI.extend({queue:function(b6,i,b7){var e;if(b6){i=(i||"fx")+"queue";e=bI._data(b6,i);if(b7){if(!e||bI.isArray(b7)){e=bI._data(b6,i,bI.makeArray(b7))}else{e.push(b7)}}return e||[]}},dequeue:function(b9,b8){b8=b8||"fx";var i=bI.queue(b9,b8),ca=i.length,b7=i.shift(),e=bI._queueHooks(b9,b8),b6=function(){bI.dequeue(b9,b8)};if(b7==="inprogress"){b7=i.shift();ca--}if(b7){if(b8==="fx"){i.unshift("inprogress")}delete e.stop;b7.call(b9,b6,e)}if(!ca&&e){e.empty.fire()}},_queueHooks:function(b6,i){var e=i+"queueHooks";return bI._data(b6,e)||bI._data(b6,e,{empty:bI.Callbacks("once memory").add(function(){bI._removeData(b6,i+"queue");bI._removeData(b6,e)})})}});bI.fn.extend({queue:function(e,i){var b6=2;if(typeof e!=="string"){i=e;e="fx";b6--}if(arguments.length
    a";D.leadingWhitespace=b8.firstChild.nodeType===3;D.tbody=!b8.getElementsByTagName("tbody").length;D.htmlSerialize=!!b8.getElementsByTagName("link").length;D.html5Clone=n.createElement("nav").cloneNode(true).outerHTML!=="<:nav>";i.type="checkbox";i.checked=true;b6.appendChild(i);D.appendChecked=i.checked;b8.innerHTML="";D.noCloneChecked=!!b8.cloneNode(true).lastChild.defaultValue;b6.appendChild(b8);b8.innerHTML="";D.checkClone=b8.cloneNode(true).cloneNode(true).lastChild.checked;D.noCloneEvent=true;if(b8.attachEvent){b8.attachEvent("onclick",function(){D.noCloneEvent=false});b8.cloneNode(true).click()}if(D.deleteExpando==null){D.deleteExpando=true;try{delete b8.test}catch(b7){D.deleteExpando=false}}})();(function(){var b6,e,b7=n.createElement("div");for(b6 in {submit:true,change:true,focusin:true}){e="on"+b6;if(!(D[b6+"Bubbles"]=e in a5)){b7.setAttribute(e,"t");D[b6+"Bubbles"]=b7.attributes[e].expando===false}}b7=null})();var bG=/^(?:input|select|textarea)$/i,a6=/^key/,bM=/^(?:mouse|pointer|contextmenu)|click/,bC=/^(?:focusinfocus|focusoutblur)$/,bx=/^([^.]*)(?:\.(.+)|)$/;function U(){return true}function Z(){return false}function am(){try{return n.activeElement}catch(e){}}bI.event={global:{},add:function(b8,cd,ci,ca,b9){var cb,cj,ck,b6,cf,cc,ch,b7,cg,e,i,ce=bI._data(b8);if(!ce){return}if(ci.handler){b6=ci;ci=b6.handler;b9=b6.selector}if(!ci.guid){ci.guid=bI.guid++}if(!(cj=ce.events)){cj=ce.events={}}if(!(cc=ce.handle)){cc=ce.handle=function(cl){return typeof bI!==aC&&(!cl||bI.event.triggered!==cl.type)?bI.event.dispatch.apply(cc.elem,arguments):undefined};cc.elem=b8}cd=(cd||"").match(aF)||[""];ck=cd.length;while(ck--){cb=bx.exec(cd[ck])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){continue}cf=bI.event.special[cg]||{};cg=(b9?cf.delegateType:cf.bindType)||cg;cf=bI.event.special[cg]||{};ch=bI.extend({type:cg,origType:i,data:ca,handler:ci,guid:ci.guid,selector:b9,needsContext:b9&&bI.expr.match.needsContext.test(b9),namespace:e.join(".")},b6);if(!(b7=cj[cg])){b7=cj[cg]=[];b7.delegateCount=0;if(!cf.setup||cf.setup.call(b8,ca,e,cc)===false){if(b8.addEventListener){b8.addEventListener(cg,cc,false)}else{if(b8.attachEvent){b8.attachEvent("on"+cg,cc)}}}}if(cf.add){cf.add.call(b8,ch);if(!ch.handler.guid){ch.handler.guid=ci.guid}}if(b9){b7.splice(b7.delegateCount++,0,ch)}else{b7.push(ch)}bI.event.global[cg]=true}b8=null},remove:function(b7,cd,ck,b8,cc){var ca,ch,cb,b9,cj,ci,cf,b6,cg,e,i,ce=bI.hasData(b7)&&bI._data(b7);if(!ce||!(ci=ce.events)){return}cd=(cd||"").match(aF)||[""];cj=cd.length;while(cj--){cb=bx.exec(cd[cj])||[];cg=i=cb[1];e=(cb[2]||"").split(".").sort();if(!cg){for(cg in ci){bI.event.remove(b7,cg+cd[cj],ck,b8,true)}continue}cf=bI.event.special[cg]||{};cg=(b8?cf.delegateType:cf.bindType)||cg;b6=ci[cg]||[];cb=cb[2]&&new RegExp("(^|\\.)"+e.join("\\.(?:.*\\.|)")+"(\\.|$)");b9=ca=b6.length;while(ca--){ch=b6[ca];if((cc||i===ch.origType)&&(!ck||ck.guid===ch.guid)&&(!cb||cb.test(ch.namespace))&&(!b8||b8===ch.selector||b8==="**"&&ch.selector)){b6.splice(ca,1);if(ch.selector){b6.delegateCount--}if(cf.remove){cf.remove.call(b7,ch)}}}if(b9&&!b6.length){if(!cf.teardown||cf.teardown.call(b7,e,ce.handle)===false){bI.removeEvent(b7,cg,ce.handle)}delete ci[cg]}}if(bI.isEmptyObject(ci)){delete ce.handle;bI._removeData(b7,"events")}},trigger:function(b6,cd,b9,ck){var ce,b8,ci,cj,cg,cc,cb,ca=[b9||n],ch=K.call(b6,"type")?b6.type:b6,b7=K.call(b6,"namespace")?b6.namespace.split("."):[];ci=cc=b9=b9||n;if(b9.nodeType===3||b9.nodeType===8){return}if(bC.test(ch+bI.event.triggered)){return}if(ch.indexOf(".")>=0){b7=ch.split(".");ch=b7.shift();b7.sort()}b8=ch.indexOf(":")<0&&"on"+ch;b6=b6[bI.expando]?b6:new bI.Event(ch,typeof b6==="object"&&b6);b6.isTrigger=ck?2:3;b6.namespace=b7.join(".");b6.namespace_re=b6.namespace?new RegExp("(^|\\.)"+b7.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;b6.result=undefined;if(!b6.target){b6.target=b9}cd=cd==null?[b6]:bI.makeArray(cd,[b6]);cg=bI.event.special[ch]||{};if(!ck&&cg.trigger&&cg.trigger.apply(b9,cd)===false){return}if(!ck&&!cg.noBubble&&!bI.isWindow(b9)){cj=cg.delegateType||ch;if(!bC.test(cj+ch)){ci=ci.parentNode}for(;ci;ci=ci.parentNode){ca.push(ci);cc=ci}if(cc===(b9.ownerDocument||n)){ca.push(cc.defaultView||cc.parentWindow||a5)}}cb=0;while((ci=ca[cb++])&&!b6.isPropagationStopped()){b6.type=cb>1?cj:cg.bindType||ch;ce=(bI._data(ci,"events")||{})[b6.type]&&bI._data(ci,"handle");if(ce){ce.apply(ci,cd)}ce=b8&&ci[b8];if(ce&&ce.apply&&bI.acceptData(ci)){b6.result=ce.apply(ci,cd);if(b6.result===false){b6.preventDefault()}}}b6.type=ch;if(!ck&&!b6.isDefaultPrevented()){if((!cg._default||cg._default.apply(ca.pop(),cd)===false)&&bI.acceptData(b9)){if(b8&&b9[ch]&&!bI.isWindow(b9)){cc=b9[b8];if(cc){b9[b8]=null}bI.event.triggered=ch;try{b9[ch]()}catch(cf){}bI.event.triggered=undefined;if(cc){b9[b8]=cc}}}}return b6.result},dispatch:function(e){e=bI.event.fix(e);var b9,ca,ce,b6,b8,cd=[],cc=P.call(arguments),b7=(bI._data(this,"events")||{})[e.type]||[],cb=bI.event.special[e.type]||{};cc[0]=e;e.delegateTarget=this;if(cb.preDispatch&&cb.preDispatch.call(this,e)===false){return}cd=bI.event.handlers.call(this,e,b7);b9=0;while((b6=cd[b9++])&&!e.isPropagationStopped()){e.currentTarget=b6.elem;b8=0;while((ce=b6.handlers[b8++])&&!e.isImmediatePropagationStopped()){if(!e.namespace_re||e.namespace_re.test(ce.namespace)){e.handleObj=ce;e.data=ce.data;ca=((bI.event.special[ce.origType]||{}).handle||ce.handler).apply(b6.elem,cc);if(ca!==undefined){if((e.result=ca)===false){e.preventDefault();e.stopPropagation()}}}}}if(cb.postDispatch){cb.postDispatch.call(this,e)}return e.result},handlers:function(e,b7){var b6,cc,ca,b9,cb=[],b8=b7.delegateCount,cd=e.target;if(b8&&cd.nodeType&&(!e.button||e.type!=="click")){for(;cd!=this;cd=cd.parentNode||this){if(cd.nodeType===1&&(cd.disabled!==true||e.type!=="click")){ca=[];for(b9=0;b9=0:bI.find(b6,this,null,[cd]).length}if(ca[b6]){ca.push(cc)}}if(ca.length){cb.push({elem:cd,handlers:ca})}}}}if(b8]","i"),b5=/^\s+/,aH=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,o=/<([\w:]+)/,b0=/\s*$/g,W={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:D.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},aT=B(n),k=aT.appendChild(n.createElement("div"));W.optgroup=W.option;W.tbody=W.tfoot=W.colgroup=W.caption=W.thead;W.th=W.td;function l(b8,e){var b6,b9,b7=0,ca=typeof b8.getElementsByTagName!==aC?b8.getElementsByTagName(e||"*"):typeof b8.querySelectorAll!==aC?b8.querySelectorAll(e||"*"):undefined;if(!ca){for(ca=[],b6=b8.childNodes||b8;(b9=b6[b7])!=null;b7++){if(!e||bI.nodeName(b9,e)){ca.push(b9)}else{bI.merge(ca,l(b9,e))}}}return e===undefined||e&&bI.nodeName(b8,e)?bI.merge([b8],ca):ca}function bY(e){if(aM.test(e.type)){e.defaultChecked=e.checked}}function a3(i,e){return bI.nodeName(i,"table")&&bI.nodeName(e.nodeType!==11?e:e.firstChild,"tr")?i.getElementsByTagName("tbody")[0]||i.appendChild(i.ownerDocument.createElement("tbody")):i}function u(e){e.type=(bI.find.attr(e,"type")!==null)+"/"+e.type;return e}function bf(i){var e=ar.exec(i.type);if(e){i.type=e[1]}else{i.removeAttribute("type")}return i}function bu(e,b7){var b8,b6=0;for(;(b8=e[b6])!=null;b6++){bI._data(b8,"globalEval",!b7||bI._data(b7[b6],"globalEval"))}}function at(cc,b6){if(b6.nodeType!==1||!bI.hasData(cc)){return}var b9,b8,e,cb=bI._data(cc),ca=bI._data(b6,cb),b7=cb.events;if(b7){delete ca.handle;ca.events={};for(b9 in b7){for(b8=0,e=b7[b9].length;b8")){cd=b6.cloneNode(true)}else{k.innerHTML=b6.outerHTML;k.removeChild(cd=k.firstChild)}if((!D.noCloneEvent||!D.noCloneChecked)&&(b6.nodeType===1||b6.nodeType===11)&&!bI.isXMLDoc(b6)){ca=l(cd);cb=l(b6);for(b9=0;(b7=cb[b9])!=null;++b9){if(ca[b9]){T(b7,ca[b9])}}}if(b8){if(e){cb=cb||l(b6);ca=ca||l(cd);for(b9=0;(b7=cb[b9])!=null;b9++){at(b7,ca[b9])}}else{at(b6,cd)}}ca=l(cd,"script");if(ca.length>0){bu(ca,!cc&&l(b6,"script"))}ca=cb=b7=null;return cd},buildFragment:function(b6,b8,cd,ci){var ce,ca,cc,ch,cj,cg,b7,cb=b6.length,b9=B(b8),e=[],cf=0;for(;cf")+b7[2];ce=b7[0];while(ce--){ch=ch.lastChild}if(!D.leadingWhitespace&&b5.test(ca)){e.push(b8.createTextNode(b5.exec(ca)[0]))}if(!D.tbody){ca=cj==="table"&&!b0.test(ca)?ch.firstChild:b7[1]===""&&!b0.test(ca)?ch:0;ce=ca&&ca.childNodes.length;while(ce--){if(bI.nodeName((cg=ca.childNodes[ce]),"tbody")&&!cg.childNodes.length){ca.removeChild(cg)}}}bI.merge(e,ch.childNodes);ch.textContent="";while(ch.firstChild){ch.removeChild(ch.firstChild)}ch=b9.lastChild}}}}if(ch){b9.removeChild(ch)}if(!D.appendChecked){bI.grep(l(e,"input"),bY)}cf=0;while((ca=e[cf++])){if(ci&&bI.inArray(ca,ci)!==-1){continue}cc=bI.contains(ca.ownerDocument,ca);ch=l(b9.appendChild(ca),"script");if(cc){bu(ch)}if(cd){ce=0;while((ca=ch[ce++])){if(bB.test(ca.type||"")){cd.push(ca)}}}}ch=null;return b9},cleanData:function(b6,ce){var b8,cd,b7,b9,ca=0,cf=bI.expando,e=bI.cache,cb=D.deleteExpando,cc=bI.event.special;for(;(b8=b6[ca])!=null;ca++){if(ce||bI.acceptData(b8)){b7=b8[cf];b9=b7&&e[b7];if(b9){if(b9.events){for(cd in b9.events){if(cc[cd]){bI.event.remove(b8,cd)}else{bI.removeEvent(b8,cd,b9.handle)}}}if(e[b7]){delete e[b7];if(cb){delete b8[cf]}else{if(typeof b8.removeAttribute!==aC){b8.removeAttribute(cf)}else{b8[cf]=null}}aP.push(b7)}}}}}});bI.fn.extend({text:function(e){return aB(this,function(i){return i===undefined?bI.text(this):this.empty().append((this[0]&&this[0].ownerDocument||n).createTextNode(i))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var i=a3(this,e);i.insertBefore(e,i.firstChild)}})},before:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this)}})},after:function(){return this.domManip(arguments,function(e){if(this.parentNode){this.parentNode.insertBefore(e,this.nextSibling)}})},remove:function(e,b9){var b8,b6=e?bI.filter(e,this):this,b7=0;for(;(b8=b6[b7])!=null;b7++){if(!b9&&b8.nodeType===1){bI.cleanData(l(b8))}if(b8.parentNode){if(b9&&bI.contains(b8.ownerDocument,b8)){bu(l(b8,"script"))}b8.parentNode.removeChild(b8)}}return this},empty:function(){var b6,e=0;for(;(b6=this[e])!=null;e++){if(b6.nodeType===1){bI.cleanData(l(b6,false))}while(b6.firstChild){b6.removeChild(b6.firstChild)}if(b6.options&&bI.nodeName(b6,"select")){b6.options.length=0}}return this},clone:function(i,e){i=i==null?false:i;e=e==null?i:e;return this.map(function(){return bI.clone(this,i,e)})},html:function(e){return aB(this,function(b9){var b8=this[0]||{},b7=0,b6=this.length;if(b9===undefined){return b8.nodeType===1?b8.innerHTML.replace(aD,""):undefined}if(typeof b9==="string"&&!an.test(b9)&&(D.htmlSerialize||!M.test(b9))&&(D.leadingWhitespace||!b5.test(b9))&&!W[(o.exec(b9)||["",""])[1].toLowerCase()]){b9=b9.replace(aH,"<$1>");try{for(;b71&&typeof ce==="string"&&!D.checkClone&&bW.test(ce))){return this.each(function(cj){var i=cf.eq(cj);if(b6){cd[0]=ce.call(this,cj,i.html())}i.domManip(cd,ci)})}if(b8){cc=bI.buildFragment(cd,this[0].ownerDocument,false,this);cb=cc.firstChild;if(cc.childNodes.length===1){cc=cb}if(cb){b9=bI.map(l(cc,"script"),u);e=b9.length;for(;ca")).appendTo(i.documentElement);i=(aI[0].contentWindow||aI[0].contentDocument).document;i.write();i.close();e=a4(b6,i);aI.detach()}bl[b6]=e}return e}(function(){var e;D.shrinkWrapBlocks=function(){if(e!=null){return e}e=false;var b7,i,b6;i=n.getElementsByTagName("body")[0];if(!i||!i.style){return}b7=n.createElement("div");b6=n.createElement("div");b6.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";i.appendChild(b6).appendChild(b7);if(typeof b7.style.zoom!==aC){b7.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1";b7.appendChild(n.createElement("div")).style.width="5px";e=b7.offsetWidth!==3}i.removeChild(b6);return e}})();var aZ=(/^margin/);var Y=new RegExp("^("+aE+")(?!px)[a-z%]+$","i");var bq,G,bo=/^(top|right|bottom|left)$/;if(a5.getComputedStyle){bq=function(e){if(e.ownerDocument.defaultView.opener){return e.ownerDocument.defaultView.getComputedStyle(e,null)}return a5.getComputedStyle(e,null)};G=function(cb,i,ca){var b8,b7,b9,e,b6=cb.style;ca=ca||bq(cb);e=ca?ca.getPropertyValue(i)||ca[i]:undefined;if(ca){if(e===""&&!bI.contains(cb.ownerDocument,cb)){e=bI.style(cb,i)}if(Y.test(e)&&aZ.test(i)){b8=b6.width;b7=b6.minWidth;b9=b6.maxWidth;b6.minWidth=b6.maxWidth=b6.width=e;e=ca.width;b6.width=b8;b6.minWidth=b7;b6.maxWidth=b9}}return e===undefined?e:e+""}}else{if(n.documentElement.currentStyle){bq=function(e){return e.currentStyle};G=function(ca,b7,b9){var cb,i,e,b6,b8=ca.style;b9=b9||bq(ca);b6=b9?b9[b7]:undefined;if(b6==null&&b8&&b8[b7]){b6=b8[b7]}if(Y.test(b6)&&!bo.test(b7)){cb=b8.left;i=ca.runtimeStyle;e=i&&i.left;if(e){i.left=ca.currentStyle.left}b8.left=b7==="fontSize"?"1em":b6;b6=b8.pixelLeft+"px";b8.left=cb;if(e){i.left=e}}return b6===undefined?b6:b6+""||"auto"}}}function a7(e,i){return{get:function(){var b6=e();if(b6==null){return}if(b6){delete this.get;return}return(this.get=i).apply(this,arguments)}}}(function(){var cb,b9,b7,ca,b6,b8,i;cb=n.createElement("div");cb.innerHTML="
    a";b7=cb.getElementsByTagName("a")[0];b9=b7&&b7.style;if(!b9){return}b9.cssText="float:left;opacity:.5";D.opacity=b9.opacity==="0.5";D.cssFloat=!!b9.cssFloat;cb.style.backgroundClip="content-box";cb.cloneNode(true).style.backgroundClip="";D.clearCloneStyle=cb.style.backgroundClip==="content-box";D.boxSizing=b9.boxSizing===""||b9.MozBoxSizing===""||b9.WebkitBoxSizing==="";bI.extend(D,{reliableHiddenOffsets:function(){if(b8==null){e()}return b8},boxSizingReliable:function(){if(b6==null){e()}return b6},pixelPosition:function(){if(ca==null){e()}return ca},reliableMarginRight:function(){if(i==null){e()}return i}});function e(){var cf,cc,cd,ce;cc=n.getElementsByTagName("body")[0];if(!cc||!cc.style){return}cf=n.createElement("div");cd=n.createElement("div");cd.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";cc.appendChild(cd).appendChild(cf);cf.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute";ca=b6=false;i=true;if(a5.getComputedStyle){ca=(a5.getComputedStyle(cf,null)||{}).top!=="1%";b6=(a5.getComputedStyle(cf,null)||{width:"4px"}).width==="4px";ce=cf.appendChild(n.createElement("div"));ce.style.cssText=cf.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0";ce.style.marginRight=ce.style.width="0";cf.style.width="1px";i=!parseFloat((a5.getComputedStyle(ce,null)||{}).marginRight);cf.removeChild(ce)}cf.innerHTML="
    t
    ";ce=cf.getElementsByTagName("td");ce[0].style.cssText="margin:0;border:0;padding:0;display:none";b8=ce[0].offsetHeight===0;if(b8){ce[0].style.display="";ce[1].style.display="none";b8=ce[0].offsetHeight===0}cc.removeChild(cd)}})();bI.swap=function(b9,b8,ca,b7){var b6,i,e={};for(i in b8){e[i]=b9.style[i];b9.style[i]=b8[i]}b6=ca.apply(b9,b7||[]);for(i in b8){b9.style[i]=e[i]}return b6};var bj=/alpha\([^)]*\)/i,aU=/opacity\s*=\s*([^)]*)/,H=/^(none|table(?!-c[ea]).+)/,bb=new RegExp("^("+aE+")(.*)$","i"),V=new RegExp("^([+-])=("+aE+")","i"),be={position:"absolute",visibility:"hidden",display:"block"},bD={letterSpacing:"0",fontWeight:"400"},aw=["Webkit","O","Moz","ms"];function c(b8,b6){if(b6 in b8){return b6}var b9=b6.charAt(0).toUpperCase()+b6.slice(1),e=b6,b7=aw.length;while(b7--){b6=aw[b7]+b9;if(b6 in b8){return b6}}return e}function s(ca,e){var cb,b8,b9,i=[],b6=0,b7=ca.length;for(;b6=1||b9==="")&&bI.trim(b6.replace(bj,""))===""&&b7.removeAttribute){b7.removeAttribute("filter");if(b9===""||i&&!i.filter){return}}b7.filter=bj.test(b6)?b6.replace(bj,e):b6+" "+e}}}bI.cssHooks.marginRight=a7(D.reliableMarginRight,function(i,e){if(e){return bI.swap(i,{display:"inline-block"},G,[i,"marginRight"])}});bI.each({margin:"",padding:"",border:"Width"},function(e,i){bI.cssHooks[e+i]={expand:function(b8){var b7=0,b6={},b9=typeof b8==="string"?b8.split(" "):[b8];for(;b7<4;b7++){b6[e+bT[b7]+i]=b9[b7]||b9[b7-2]||b9[0]}return b6}};if(!aZ.test(e)){bI.cssHooks[e+i].set=aN}});bI.fn.extend({css:function(e,i){return aB(this,function(ca,b7,cb){var b9,b6,cc={},b8=0;if(bI.isArray(b7)){b9=bq(ca);b6=b7.length;for(;b81)},show:function(){return s(this,true)},hide:function(){return s(this)},toggle:function(e){if(typeof e==="boolean"){return e?this.show():this.hide()}return this.each(function(){if(S(this)){bI(this).show()}else{bI(this).hide()}})}});function J(b6,i,b8,e,b7){return new J.prototype.init(b6,i,b8,e,b7)}bI.Tween=J;J.prototype={constructor:J,init:function(b7,i,b9,e,b8,b6){this.elem=b7;this.prop=b9;this.easing=b8||"swing";this.options=i;this.start=this.now=this.cur();this.end=e;this.unit=b6||(bI.cssNumber[b9]?"":"px")},cur:function(){var e=J.propHooks[this.prop];return e&&e.get?e.get(this):J.propHooks._default.get(this)},run:function(b6){var i,e=J.propHooks[this.prop];if(this.options.duration){this.pos=i=bI.easing[this.easing](b6,this.options.duration*b6,0,1,this.options.duration)}else{this.pos=i=b6}this.now=(this.end-this.start)*i+this.start;if(this.options.step){this.options.step.call(this.elem,this.now,this)}if(e&&e.set){e.set(this)}else{J.propHooks._default.set(this)}return this}};J.prototype.init.prototype=J.prototype;J.propHooks={_default:{get:function(i){var e;if(i.elem[i.prop]!=null&&(!i.elem.style||i.elem.style[i.prop]==null)){return i.elem[i.prop]}e=bI.css(i.elem,i.prop,"");return !e||e==="auto"?0:e},set:function(e){if(bI.fx.step[e.prop]){bI.fx.step[e.prop](e)}else{if(e.elem.style&&(e.elem.style[bI.cssProps[e.prop]]!=null||bI.cssHooks[e.prop])){bI.style(e.elem,e.prop,e.now+e.unit)}else{e.elem[e.prop]=e.now}}}}};J.propHooks.scrollTop=J.propHooks.scrollLeft={set:function(e){if(e.elem.nodeType&&e.elem.parentNode){e.elem[e.prop]=e.now}}};bI.easing={linear:function(e){return e},swing:function(e){return 0.5-Math.cos(e*Math.PI)/2}};bI.fx=J.prototype.init;bI.fx.step={};var N,ae,bR=/^(?:toggle|show|hide)$/,bJ=new RegExp("^(?:([+-])=|)("+aE+")([a-z%]*)$","i"),bP=/queueHooks$/,aG=[h],a2={"*":[function(e,ca){var cc=this.createTween(e,ca),b8=cc.cur(),b7=bJ.exec(ca),cb=b7&&b7[3]||(bI.cssNumber[e]?"":"px"),i=(bI.cssNumber[e]||cb!=="px"&&+b8)&&bJ.exec(bI.css(cc.elem,e)),b6=1,b9=20;if(i&&i[3]!==cb){cb=cb||i[3];b7=b7||[];i=+b8||1;do{b6=b6||".5";i=i/b6;bI.style(cc.elem,e,i+cb)}while(b6!==(b6=cc.cur()/b8)&&b6!==1&&--b9)}if(b7){i=cc.start=+i||+b8||0;cc.unit=cb;cc.end=b7[1]?i+(b7[1]+1)*b7[2]:+b7[2]}return cc}]};function bn(){setTimeout(function(){N=undefined});return(N=bI.now())}function bH(b7,b9){var b8,e={height:b7},b6=0;b9=b9?1:0;for(;b6<4;b6+=2-b9){b8=bT[b6];e["margin"+b8]=e["padding"+b8]=b7}if(b9){e.opacity=e.width=b7}return e}function bd(b8,ca,b7){var i,b9=(a2[ca]||[]).concat(a2["*"]),e=0,b6=b9.length;for(;e
    a";i=b8.getElementsByTagName("a")[0];e=n.createElement("select");b7=e.appendChild(n.createElement("option"));b6=b8.getElementsByTagName("input")[0];i.style.cssText="top:1px";D.getSetAttribute=b8.className!=="t";D.style=/top/.test(i.getAttribute("style"));D.hrefNormalized=i.getAttribute("href")==="/a";D.checkOn=!!b6.value;D.optSelected=b7.selected;D.enctype=!!n.createElement("form").enctype;e.disabled=true;D.optDisabled=!b7.disabled;b6=n.createElement("input");b6.setAttribute("value","");D.input=b6.getAttribute("value")==="";b6.value="t";b6.setAttribute("type","radio");D.radioValue=b6.value==="t"})();var al=/\r/g;bI.fn.extend({val:function(b7){var e,i,b8,b6=this[0];if(!arguments.length){if(b6){e=bI.valHooks[b6.type]||bI.valHooks[b6.nodeName.toLowerCase()];if(e&&"get" in e&&(i=e.get(b6,"value"))!==undefined){return i}i=b6.value;return typeof i==="string"?i.replace(al,""):i==null?"":i}return}b8=bI.isFunction(b7);return this.each(function(b9){var ca;if(this.nodeType!==1){return}if(b8){ca=b7.call(this,b9,bI(this).val())}else{ca=b7}if(ca==null){ca=""}else{if(typeof ca==="number"){ca+=""}else{if(bI.isArray(ca)){ca=bI.map(ca,function(cb){return cb==null?"":cb+""})}}}e=bI.valHooks[this.type]||bI.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,ca,"value")===undefined){this.value=ca}})}});bI.extend({valHooks:{option:{get:function(e){var i=bI.find.attr(e,"value");return i!=null?i:bI.trim(bI.text(e))}},select:{get:function(e){var cb,b7,cd=e.options,b9=e.selectedIndex,b8=e.type==="select-one"||b9<0,cc=b8?null:[],ca=b8?b9+1:cd.length,b6=b9<0?ca:b8?b9:0;for(;b6=0){try{b9.selected=cc=true}catch(b6){b9.scrollHeight}}else{b9.selected=false}}if(!cc){ca.selectedIndex=-1}return b7}}}});bI.each(["radio","checkbox"],function(){bI.valHooks[this]={set:function(e,i){if(bI.isArray(i)){return(e.checked=bI.inArray(bI(e).val(),i)>=0)}}};if(!D.checkOn){bI.valHooks[this].get=function(e){return e.getAttribute("value")===null?"on":e.value}}});var ba,b3,bO=bI.expr.attrHandle,aq=/^(?:checked|selected)$/i,bN=D.getSetAttribute,bF=D.input;bI.fn.extend({attr:function(e,i){return aB(this,bI.attr,e,i,arguments.length>1)},removeAttr:function(e){return this.each(function(){bI.removeAttr(this,e)})}});bI.extend({attr:function(b8,b7,b9){var e,b6,i=b8.nodeType;if(!b8||i===3||i===8||i===2){return}if(typeof b8.getAttribute===aC){return bI.prop(b8,b7,b9)}if(i!==1||!bI.isXMLDoc(b8)){b7=b7.toLowerCase();e=bI.attrHooks[b7]||(bI.expr.match.bool.test(b7)?b3:ba)}if(b9!==undefined){if(b9===null){bI.removeAttr(b8,b7)}else{if(e&&"set" in e&&(b6=e.set(b8,b9,b7))!==undefined){return b6}else{b8.setAttribute(b7,b9+"");return b9}}}else{if(e&&"get" in e&&(b6=e.get(b8,b7))!==null){return b6}else{b6=bI.find.attr(b8,b7);return b6==null?undefined:b6}}},removeAttr:function(b7,b9){var e,b8,b6=0,ca=b9&&b9.match(aF);if(ca&&b7.nodeType===1){while((e=ca[b6++])){b8=bI.propFix[e]||e;if(bI.expr.match.bool.test(e)){if(bF&&bN||!aq.test(e)){b7[b8]=false}else{b7[bI.camelCase("default-"+e)]=b7[b8]=false}}else{bI.attr(b7,e,"")}b7.removeAttribute(bN?e:b8)}}},attrHooks:{type:{set:function(e,i){if(!D.radioValue&&i==="radio"&&bI.nodeName(e,"input")){var b6=e.value;e.setAttribute("type",i);if(b6){e.value=b6}return i}}}}});b3={set:function(i,b6,e){if(b6===false){bI.removeAttr(i,e)}else{if(bF&&bN||!aq.test(e)){i.setAttribute(!bN&&bI.propFix[e]||e,e)}else{i[bI.camelCase("default-"+e)]=i[e]=true}}return e}};bI.each(bI.expr.match.bool.source.match(/\w+/g),function(b7,b6){var e=bO[b6]||bI.find.attr;bO[b6]=bF&&bN||!aq.test(b6)?function(b9,b8,cb){var i,ca;if(!cb){ca=bO[b8];bO[b8]=i;i=e(b9,b8,cb)!=null?b8.toLowerCase():null;bO[b8]=ca}return i}:function(b8,i,b9){if(!b9){return b8[bI.camelCase("default-"+i)]?i.toLowerCase():null}}});if(!bF||!bN){bI.attrHooks.value={set:function(i,b6,e){if(bI.nodeName(i,"input")){i.defaultValue=b6}else{return ba&&ba.set(i,b6,e)}}}}if(!bN){ba={set:function(b6,b7,i){var e=b6.getAttributeNode(i);if(!e){b6.setAttributeNode((e=b6.ownerDocument.createAttribute(i)))}e.value=b7+="";if(i==="value"||b7===b6.getAttribute(i)){return b7}}};bO.id=bO.name=bO.coords=function(b6,i,b7){var e;if(!b7){return(e=b6.getAttributeNode(i))&&e.value!==""?e.value:null}};bI.valHooks.button={get:function(b6,i){var e=b6.getAttributeNode(i);if(e&&e.specified){return e.value}},set:ba.set};bI.attrHooks.contenteditable={set:function(i,b6,e){ba.set(i,b6===""?false:b6,e)}};bI.each(["width","height"],function(b6,e){bI.attrHooks[e]={set:function(i,b7){if(b7===""){i.setAttribute(e,"auto");return b7}}}})}if(!D.style){bI.attrHooks.style={get:function(e){return e.style.cssText||undefined},set:function(e,i){return(e.style.cssText=i+"")}}}var aJ=/^(?:input|select|textarea|button|object)$/i,F=/^(?:a|area)$/i;bI.fn.extend({prop:function(e,i){return aB(this,bI.prop,e,i,arguments.length>1)},removeProp:function(e){e=bI.propFix[e]||e;return this.each(function(){try{this[e]=undefined;delete this[e]}catch(i){}})}});bI.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(b9,b7,ca){var b6,e,b8,i=b9.nodeType;if(!b9||i===3||i===8||i===2){return}b8=i!==1||!bI.isXMLDoc(b9);if(b8){b7=bI.propFix[b7]||b7;e=bI.propHooks[b7]}if(ca!==undefined){return e&&"set" in e&&(b6=e.set(b9,ca,b7))!==undefined?b6:(b9[b7]=ca)}else{return e&&"get" in e&&(b6=e.get(b9,b7))!==null?b6:b9[b7]}},propHooks:{tabIndex:{get:function(i){var e=bI.find.attr(i,"tabindex");return e?parseInt(e,10):aJ.test(i.nodeName)||F.test(i.nodeName)&&i.href?0:-1}}}});if(!D.hrefNormalized){bI.each(["href","src"],function(b6,e){bI.propHooks[e]={get:function(i){return i.getAttribute(e,4)}}})}if(!D.optSelected){bI.propHooks.selected={get:function(i){var e=i.parentNode;if(e){e.selectedIndex;if(e.parentNode){e.parentNode.selectedIndex}}return null}}}bI.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){bI.propFix[this.toLowerCase()]=this});if(!D.enctype){bI.propFix.enctype="encoding"}var bL=/[\t\r\n\f]/g;bI.fn.extend({addClass:function(cd){var b7,b6,ce,cb,b8,e,b9=0,ca=this.length,cc=typeof cd==="string"&&cd;if(bI.isFunction(cd)){return this.each(function(i){bI(this).addClass(cd.call(this,i,this.className))})}if(cc){b7=(cd||"").match(aF)||[];for(;b9=0){ce=ce.replace(" "+cb+" "," ")}}e=cd?bI.trim(ce):"";if(b6.className!==e){b6.className=e}}}}return this},toggleClass:function(b6,e){var i=typeof b6;if(typeof e==="boolean"&&i==="string"){return e?this.addClass(b6):this.removeClass(b6)}if(bI.isFunction(b6)){return this.each(function(b7){bI(this).toggleClass(b6.call(this,b7,this.className,e),e)})}return this.each(function(){if(i==="string"){var b9,b8=0,b7=bI(this),ca=b6.match(aF)||[];while((b9=ca[b8++])){if(b7.hasClass(b9)){b7.removeClass(b9)}else{b7.addClass(b9)}}}else{if(i===aC||i==="boolean"){if(this.className){bI._data(this,"__className__",this.className)}this.className=this.className||b6===false?"":bI._data(this,"__className__")||""}}})},hasClass:function(e){var b8=" "+e+" ",b7=0,b6=this.length;for(;b7=0){return true}}return false}});bI.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu").split(" "),function(b6,e){bI.fn[e]=function(b7,i){return arguments.length>0?this.on(e,null,b7,i):this.trigger(e)}});bI.fn.extend({hover:function(e,i){return this.mouseenter(e).mouseleave(i||e)},bind:function(e,b6,i){return this.on(e,null,b6,i)},unbind:function(e,i){return this.off(e,null,i)},delegate:function(e,i,b7,b6){return this.on(i,e,b7,b6)},undelegate:function(e,i,b6){return arguments.length===1?this.off(e,"**"):this.off(i,e||"**",b6)}});var bp=bI.now();var bQ=(/\?/);var a1=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;bI.parseJSON=function(e){if(a5.JSON&&a5.JSON.parse){return a5.JSON.parse(e+"")}var b7,b6=null,i=bI.trim(e+"");return i&&!bI.trim(i.replace(a1,function(ca,b8,b9,cb){if(b7&&b8){b6=0}if(b6===0){return ca}b7=b9||b8;b6+=!cb-!b9;return""}))?(Function("return "+i))():bI.error("Invalid JSON: "+e)};bI.parseXML=function(b7){var i,b6;if(!b7||typeof b7!=="string"){return null}try{if(a5.DOMParser){b6=new DOMParser();i=b6.parseFromString(b7,"text/xml")}else{i=new ActiveXObject("Microsoft.XMLDOM");i.async="false";i.loadXML(b7)}}catch(b8){i=undefined}if(!i||!i.documentElement||i.getElementsByTagName("parsererror").length){bI.error("Invalid XML: "+b7)}return i};var b4,aa,ap=/#.*$/,R=/([?&])_=[^&]*/,ah=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,C=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,r=/^(?:GET|HEAD)$/,aK=/^\/\//,aV=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,w={},a9={},aX="*/".concat("*");try{aa=location.href}catch(bi){aa=n.createElement("a");aa.href="";aa=aa.href}b4=aV.exec(aa.toLowerCase())||[];function bK(e){return function(b9,ca){if(typeof b9!=="string"){ca=b9;b9="*"}var b6,b7=0,b8=b9.toLowerCase().match(aF)||[];if(bI.isFunction(ca)){while((b6=b8[b7++])){if(b6.charAt(0)==="+"){b6=b6.slice(1)||"*";(e[b6]=e[b6]||[]).unshift(ca)}else{(e[b6]=e[b6]||[]).push(ca)}}}}}function p(e,b6,ca,b7){var i={},b8=(e===a9);function b9(cb){var cc;i[cb]=true;bI.each(e[cb]||[],function(ce,cd){var cf=cd(b6,ca,b7);if(typeof cf==="string"&&!b8&&!i[cf]){b6.dataTypes.unshift(cf);b9(cf);return false}else{if(b8){return !(cc=cf)}}});return cc}return b9(b6.dataTypes[0])||!i["*"]&&b9("*")}function t(b6,b7){var e,i,b8=bI.ajaxSettings.flatOptions||{};for(i in b7){if(b7[i]!==undefined){(b8[i]?b6:(e||(e={})))[i]=b7[i]}}if(e){bI.extend(true,b6,e)}return b6}function g(cc,cb,b8){var e,b7,b6,b9,i=cc.contents,ca=cc.dataTypes;while(ca[0]==="*"){ca.shift();if(b7===undefined){b7=cc.mimeType||cb.getResponseHeader("Content-Type")}}if(b7){for(b9 in i){if(i[b9]&&i[b9].test(b7)){ca.unshift(b9);break}}}if(ca[0] in b8){b6=ca[0]}else{for(b9 in b8){if(!ca[0]||cc.converters[b9+" "+ca[0]]){b6=b9;break}if(!e){e=b9}}b6=b6||e}if(b6){if(b6!==ca[0]){ca.unshift(b6)}return b8[b6]}}function ag(cg,b8,cd,b6){var i,cb,ce,b9,b7,cf={},cc=cg.dataTypes.slice();if(cc[1]){for(ce in cg.converters){cf[ce.toLowerCase()]=cg.converters[ce]}}cb=cc.shift();while(cb){if(cg.responseFields[cb]){cd[cg.responseFields[cb]]=b8}if(!b7&&b6&&cg.dataFilter){b8=cg.dataFilter(b8,cg.dataType)}b7=cb;cb=cc.shift();if(cb){if(cb==="*"){cb=b7}else{if(b7!=="*"&&b7!==cb){ce=cf[b7+" "+cb]||cf["* "+cb];if(!ce){for(i in cf){b9=i.split(" ");if(b9[1]===cb){ce=cf[b7+" "+b9[0]]||cf["* "+b9[0]];if(ce){if(ce===true){ce=cf[i]}else{if(cf[i]!==true){cb=b9[0];cc.unshift(b9[1])}}break}}}}if(ce!==true){if(ce&&cg["throws"]){b8=ce(b8)}else{try{b8=ce(b8)}catch(ca){return{state:"parsererror",error:ce?ca:"No conversion from "+b7+" to "+cb}}}}}}}}return{state:"success",data:b8}}bI.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:aa,type:"GET",isLocal:C.test(b4[1]),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":aX,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":bI.parseJSON,"text xml":bI.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(i,e){return e?t(t(i,bI.ajaxSettings),e):t(bI.ajaxSettings,i)},ajaxPrefilter:bK(w),ajaxTransport:bK(a9),ajax:function(ca,b7){if(typeof ca==="object"){b7=ca;ca=undefined}b7=b7||{};var cj,cl,cb,cq,cf,b6,cm,b8,ce=bI.ajaxSetup({},b7),cs=ce.context||ce,ch=ce.context&&(cs.nodeType||cs.jquery)?bI(cs):bI.event,cr=bI.Deferred(),co=bI.Callbacks("once memory"),cc=ce.statusCode||{},ci={},cp={},b9=0,cd="canceled",ck={readyState:0,getResponseHeader:function(i){var e;if(b9===2){if(!b8){b8={};while((e=ah.exec(cq))){b8[e[1].toLowerCase()]=e[2]}}e=b8[i.toLowerCase()]}return e==null?null:e},getAllResponseHeaders:function(){return b9===2?cq:null},setRequestHeader:function(i,ct){var e=i.toLowerCase();if(!b9){i=cp[e]=cp[e]||i;ci[i]=ct}return this},overrideMimeType:function(e){if(!b9){ce.mimeType=e}return this},statusCode:function(i){var e;if(i){if(b9<2){for(e in i){cc[e]=[cc[e],i[e]]}}else{ck.always(i[ck.status])}}return this},abort:function(i){var e=i||cd;if(cm){cm.abort(e)}cg(0,e);return this}};cr.promise(ck).complete=co.add;ck.success=ck.done;ck.error=ck.fail;ce.url=((ca||ce.url||aa)+"").replace(ap,"").replace(aK,b4[1]+"//");ce.type=b7.method||b7.type||ce.method||ce.type;ce.dataTypes=bI.trim(ce.dataType||"*").toLowerCase().match(aF)||[""];if(ce.crossDomain==null){cj=aV.exec(ce.url.toLowerCase());ce.crossDomain=!!(cj&&(cj[1]!==b4[1]||cj[2]!==b4[2]||(cj[3]||(cj[1]==="http:"?"80":"443"))!==(b4[3]||(b4[1]==="http:"?"80":"443"))))}if(ce.data&&ce.processData&&typeof ce.data!=="string"){ce.data=bI.param(ce.data,ce.traditional)}p(w,ce,b7,ck);if(b9===2){return ck}b6=bI.event&&ce.global;if(b6&&bI.active++===0){bI.event.trigger("ajaxStart")}ce.type=ce.type.toUpperCase();ce.hasContent=!r.test(ce.type);cb=ce.url;if(!ce.hasContent){if(ce.data){cb=(ce.url+=(bQ.test(cb)?"&":"?")+ce.data);delete ce.data}if(ce.cache===false){ce.url=R.test(cb)?cb.replace(R,"$1_="+bp++):cb+(bQ.test(cb)?"&":"?")+"_="+bp++}}if(ce.ifModified){if(bI.lastModified[cb]){ck.setRequestHeader("If-Modified-Since",bI.lastModified[cb])}if(bI.etag[cb]){ck.setRequestHeader("If-None-Match",bI.etag[cb])}}if(ce.data&&ce.hasContent&&ce.contentType!==false||b7.contentType){ck.setRequestHeader("Content-Type",ce.contentType)}ck.setRequestHeader("Accept",ce.dataTypes[0]&&ce.accepts[ce.dataTypes[0]]?ce.accepts[ce.dataTypes[0]]+(ce.dataTypes[0]!=="*"?", "+aX+"; q=0.01":""):ce.accepts["*"]);for(cl in ce.headers){ck.setRequestHeader(cl,ce.headers[cl])}if(ce.beforeSend&&(ce.beforeSend.call(cs,ck,ce)===false||b9===2)){return ck.abort()}cd="abort";for(cl in {success:1,error:1,complete:1}){ck[cl](ce[cl])}cm=p(a9,ce,b7,ck);if(!cm){cg(-1,"No Transport")}else{ck.readyState=1;if(b6){ch.trigger("ajaxSend",[ck,ce])}if(ce.async&&ce.timeout>0){cf=setTimeout(function(){ck.abort("timeout")},ce.timeout)}try{b9=1;cm.send(ci,cg)}catch(cn){if(b9<2){cg(-1,cn)}else{throw cn}}}function cg(cw,i,cx,cu){var e,cA,cy,cv,cz,ct=i;if(b9===2){return}b9=2;if(cf){clearTimeout(cf)}cm=undefined;cq=cu||"";ck.readyState=cw>0?4:0;e=cw>=200&&cw<300||cw===304;if(cx){cv=g(ce,ck,cx)}cv=ag(ce,cv,ck,e);if(e){if(ce.ifModified){cz=ck.getResponseHeader("Last-Modified");if(cz){bI.lastModified[cb]=cz}cz=ck.getResponseHeader("etag");if(cz){bI.etag[cb]=cz}}if(cw===204||ce.type==="HEAD"){ct="nocontent"}else{if(cw===304){ct="notmodified"}else{ct=cv.state;cA=cv.data;cy=cv.error;e=!cy}}}else{cy=ct;if(cw||!ct){ct="error";if(cw<0){cw=0}}}ck.status=cw;ck.statusText=(i||ct)+"";if(e){cr.resolveWith(cs,[cA,ct,ck])}else{cr.rejectWith(cs,[ck,ct,cy])}ck.statusCode(cc);cc=undefined;if(b6){ch.trigger(e?"ajaxSuccess":"ajaxError",[ck,ce,e?cA:cy])}co.fireWith(cs,[ck,ct]);if(b6){ch.trigger("ajaxComplete",[ck,ce]);if(!(--bI.active)){bI.event.trigger("ajaxStop")}}}return ck},getJSON:function(e,i,b6){return bI.get(e,i,b6,"json")},getScript:function(e,i){return bI.get(e,undefined,i,"script")}});bI.each(["get","post"],function(e,b6){bI[b6]=function(i,b8,b9,b7){if(bI.isFunction(b8)){b7=b7||b9;b9=b8;b8=undefined}return bI.ajax({url:i,type:b6,dataType:b7,data:b8,success:b9})}});bI._evalUrl=function(e){return bI.ajax({url:e,type:"GET",dataType:"script",async:false,global:false,"throws":true})};bI.fn.extend({wrapAll:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapAll(e.call(this,b6))})}if(this[0]){var i=bI(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){i.insertBefore(this[0])}i.map(function(){var b6=this;while(b6.firstChild&&b6.firstChild.nodeType===1){b6=b6.firstChild}return b6}).append(this)}return this},wrapInner:function(e){if(bI.isFunction(e)){return this.each(function(b6){bI(this).wrapInner(e.call(this,b6))})}return this.each(function(){var i=bI(this),b6=i.contents();if(b6.length){b6.wrapAll(e)}else{i.append(e)}})},wrap:function(e){var i=bI.isFunction(e);return this.each(function(b6){bI(this).wrapAll(i?e.call(this,b6):e)})},unwrap:function(){return this.parent().each(function(){if(!bI.nodeName(this,"body")){bI(this).replaceWith(this.childNodes)}}).end()}});bI.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0||(!D.reliableHiddenOffsets()&&((e.style&&e.style.display)||bI.css(e,"display"))==="none")};bI.expr.filters.visible=function(e){return !bI.expr.filters.hidden(e)};var bw=/%20/g,aS=/\[\]$/,X=/\r?\n/g,b=/^(?:submit|button|image|reset|file)$/i,au=/^(?:input|select|textarea|keygen)/i;function j(b6,b8,i,b7){var e;if(bI.isArray(b8)){bI.each(b8,function(ca,b9){if(i||aS.test(b6)){b7(b6,b9)}else{j(b6+"["+(typeof b9==="object"?ca:"")+"]",b9,i,b7)}})}else{if(!i&&bI.type(b8)==="object"){for(e in b8){j(b6+"["+e+"]",b8[e],i,b7)}}else{b7(b6,b8)}}}bI.param=function(e,b6){var b7,i=[],b8=function(b9,ca){ca=bI.isFunction(ca)?ca():(ca==null?"":ca);i[i.length]=encodeURIComponent(b9)+"="+encodeURIComponent(ca)};if(b6===undefined){b6=bI.ajaxSettings&&bI.ajaxSettings.traditional}if(bI.isArray(e)||(e.jquery&&!bI.isPlainObject(e))){bI.each(e,function(){b8(this.name,this.value)})}else{for(b7 in e){j(b7,e[b7],b6,b8)}}return i.join("&").replace(bw,"+")};bI.fn.extend({serialize:function(){return bI.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=bI.prop(this,"elements");return e?bI.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!bI(this).is(":disabled")&&au.test(this.nodeName)&&!b.test(e)&&(this.checked||!aM.test(e))}).map(function(e,b6){var b7=bI(this).val();return b7==null?null:bI.isArray(b7)?bI.map(b7,function(i){return{name:b6.name,value:i.replace(X,"\r\n")}}):{name:b6.name,value:b7.replace(X,"\r\n")}}).get()}});bI.ajaxSettings.xhr=a5.ActiveXObject!==undefined?function(){return !this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&bE()||bg()}:bE;var aA=0,aj={},ay=bI.ajaxSettings.xhr();if(a5.attachEvent){a5.attachEvent("onunload",function(){for(var e in aj){aj[e](undefined,true)}})}D.cors=!!ay&&("withCredentials" in ay);ay=D.ajax=!!ay;if(ay){bI.ajaxTransport(function(e){if(!e.crossDomain||D.cors){var i;return{send:function(b9,b6){var b7,b8=e.xhr(),ca=++aA;b8.open(e.type,e.url,e.async,e.username,e.password);if(e.xhrFields){for(b7 in e.xhrFields){b8[b7]=e.xhrFields[b7]}}if(e.mimeType&&b8.overrideMimeType){b8.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!b9["X-Requested-With"]){b9["X-Requested-With"]="XMLHttpRequest"}for(b7 in b9){if(b9[b7]!==undefined){b8.setRequestHeader(b7,b9[b7]+"")}}b8.send((e.hasContent&&e.data)||null);i=function(cd,cc){var cb,cg,ce;if(i&&(cc||b8.readyState===4)){delete aj[ca];i=undefined;b8.onreadystatechange=bI.noop;if(cc){if(b8.readyState!==4){b8.abort()}}else{ce={};cb=b8.status;if(typeof b8.responseText==="string"){ce.text=b8.responseText}try{cg=b8.statusText}catch(cf){cg=""}if(!cb&&e.isLocal&&!e.crossDomain){cb=ce.text?200:404}else{if(cb===1223){cb=204}}}}if(ce){b6(cb,cg,ce,b8.getAllResponseHeaders())}};if(!e.async){i()}else{if(b8.readyState===4){setTimeout(i)}else{b8.onreadystatechange=aj[ca]=i}}},abort:function(){if(i){i(undefined,true)}}}}})}function bE(){try{return new a5.XMLHttpRequest()}catch(i){}}function bg(){try{return new a5.ActiveXObject("Microsoft.XMLHTTP")}catch(i){}}bI.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){bI.globalEval(e);return e}}});bI.ajaxPrefilter("script",function(e){if(e.cache===undefined){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});bI.ajaxTransport("script",function(b6){if(b6.crossDomain){var e,i=n.head||bI("head")[0]||n.documentElement;return{send:function(b7,b8){e=n.createElement("script");e.async=true;if(b6.scriptCharset){e.charset=b6.scriptCharset}e.src=b6.url;e.onload=e.onreadystatechange=function(ca,b9){if(b9||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(e.parentNode){e.parentNode.removeChild(e)}e=null;if(!b9){b8(200,"success")}}};i.insertBefore(e,i.firstChild)},abort:function(){if(e){e.onload(undefined,true)}}}}});var bs=[],a8=/(=)\?(?=&|$)|\?\?/;bI.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=bs.pop()||(bI.expando+"_"+(bp++));this[e]=true;return e}});bI.ajaxPrefilter("json jsonp",function(b7,e,b8){var ca,i,b6,b9=b7.jsonp!==false&&(a8.test(b7.url)?"url":typeof b7.data==="string"&&!(b7.contentType||"").indexOf("application/x-www-form-urlencoded")&&a8.test(b7.data)&&"data");if(b9||b7.dataTypes[0]==="jsonp"){ca=b7.jsonpCallback=bI.isFunction(b7.jsonpCallback)?b7.jsonpCallback():b7.jsonpCallback;if(b9){b7[b9]=b7[b9].replace(a8,"$1"+ca)}else{if(b7.jsonp!==false){b7.url+=(bQ.test(b7.url)?"&":"?")+b7.jsonp+"="+ca}}b7.converters["script json"]=function(){if(!b6){bI.error(ca+" was not called")}return b6[0]};b7.dataTypes[0]="json";i=a5[ca];a5[ca]=function(){b6=arguments};b8.always(function(){a5[ca]=i;if(b7[ca]){b7.jsonpCallback=e.jsonpCallback;bs.push(ca)}if(b6&&bI.isFunction(i)){i(b6[0])}b6=i=undefined});return"script"}});bI.parseHTML=function(b8,b6,b7){if(!b8||typeof b8!=="string"){return null}if(typeof b6==="boolean"){b7=b6;b6=false}b6=b6||n;var i=a.exec(b8),e=!b7&&[];if(i){return[b6.createElement(i[1])]}i=bI.buildFragment([b8],b6,e);if(e&&e.length){bI(e).remove()}return bI.merge([],i.childNodes)};var b1=bI.fn.load;bI.fn.load=function(b7,ca,cb){if(typeof b7!=="string"&&b1){return b1.apply(this,arguments)}var e,b6,b8,i=this,b9=b7.indexOf(" ");if(b9>=0){e=bI.trim(b7.slice(b9,b7.length));b7=b7.slice(0,b9)}if(bI.isFunction(ca)){cb=ca;ca=undefined}else{if(ca&&typeof ca==="object"){b8="POST"}}if(i.length>0){bI.ajax({url:b7,type:b8,dataType:"html",data:ca}).done(function(cc){b6=arguments;i.html(e?bI("
    ").append(bI.parseHTML(cc)).find(e):cc)}).complete(cb&&function(cd,cc){i.each(cb,b6||[cd.responseText,cc,cd])})}return this};bI.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,b6){bI.fn[b6]=function(i){return this.on(b6,i)}});bI.expr.filters.animated=function(e){return bI.grep(bI.timers,function(i){return e===i.elem}).length};var bX=a5.document.documentElement;function br(e){return bI.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}bI.offset={setOffset:function(b7,ch,cb){var cd,ca,e,b8,b6,cf,cg,cc=bI.css(b7,"position"),b9=bI(b7),ce={};if(cc==="static"){b7.style.position="relative"}b6=b9.offset();e=bI.css(b7,"top");cf=bI.css(b7,"left");cg=(cc==="absolute"||cc==="fixed")&&bI.inArray("auto",[e,cf])>-1;if(cg){cd=b9.position();b8=cd.top;ca=cd.left}else{b8=parseFloat(e)||0;ca=parseFloat(cf)||0}if(bI.isFunction(ch)){ch=ch.call(b7,cb,b6)}if(ch.top!=null){ce.top=(ch.top-b6.top)+b8}if(ch.left!=null){ce.left=(ch.left-b6.left)+ca}if("using" in ch){ch.using.call(b7,ce)}else{b9.css(ce)}}};bI.fn.extend({offset:function(i){if(arguments.length){return i===undefined?this:this.each(function(ca){bI.offset.setOffset(this,i,ca)})}var e,b9,b7={top:0,left:0},b6=this[0],b8=b6&&b6.ownerDocument;if(!b8){return}e=b8.documentElement;if(!bI.contains(e,b6)){return b7}if(typeof b6.getBoundingClientRect!==aC){b7=b6.getBoundingClientRect()}b9=br(b8);return{top:b7.top+(b9.pageYOffset||e.scrollTop)-(e.clientTop||0),left:b7.left+(b9.pageXOffset||e.scrollLeft)-(e.clientLeft||0)}},position:function(){if(!this[0]){return}var b6,b7,e={top:0,left:0},i=this[0];if(bI.css(i,"position")==="fixed"){b7=i.getBoundingClientRect()}else{b6=this.offsetParent();b7=this.offset();if(!bI.nodeName(b6[0],"html")){e=b6.offset()}e.top+=bI.css(b6[0],"borderTopWidth",true);e.left+=bI.css(b6[0],"borderLeftWidth",true)}return{top:b7.top-e.top-bI.css(i,"marginTop",true),left:b7.left-e.left-bI.css(i,"marginLeft",true)}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||bX;while(e&&(!bI.nodeName(e,"html")&&bI.css(e,"position")==="static")){e=e.offsetParent}return e||bX})}});bI.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b6,i){var e=/Y/.test(i);bI.fn[b6]=function(b7){return aB(this,function(b8,cb,ca){var b9=br(b8);if(ca===undefined){return b9?(i in b9)?b9[i]:b9.document.documentElement[cb]:b8[cb]}if(b9){b9.scrollTo(!e?ca:bI(b9).scrollLeft(),e?ca:bI(b9).scrollTop())}else{b8[cb]=ca}},b6,b7,arguments.length,null)}});bI.each(["top","left"],function(e,b6){bI.cssHooks[b6]=a7(D.pixelPosition,function(b7,i){if(i){i=G(b7,b6);return Y.test(i)?bI(b7).position()[b6]+"px":i}})});bI.each({Height:"height",Width:"width"},function(e,i){bI.each({padding:"inner"+e,content:i,"":"outer"+e},function(b6,b7){bI.fn[b7]=function(cb,ca){var b9=arguments.length&&(b6||typeof cb!=="boolean"),b8=b6||(cb===true||ca===true?"margin":"border");return aB(this,function(cd,cc,ce){var cf;if(bI.isWindow(cd)){return cd.document.documentElement["client"+e]}if(cd.nodeType===9){cf=cd.documentElement;return Math.max(cd.body["scroll"+e],cf["scroll"+e],cd.body["offset"+e],cf["offset"+e],cf["client"+e])}return ce===undefined?bI.css(cd,cc,b8):bI.style(cd,cc,ce,b8)},i,b9?cb:undefined,b9,null)}})});bI.fn.size=function(){return this.length};bI.fn.andSelf=bI.fn.addBack;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return bI})}var bk=a5.jQuery,I=a5.$;bI.noConflict=function(e){if(a5.$===bI){a5.$=I}if(e&&a5.jQuery===bI){a5.jQuery=bk}return bI};if(typeof av===aC){a5.jQuery=a5.$=bI}return bI}));!function(a){a(function(){a.support.transition=(function(){var b=(function(){var e=document.createElement("bootstrap"),d={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in d){if(e.style[c]!==undefined){return d[c]}}}());return b&&{end:b}})()})}(window.jQuery);!function(d){var c='[data-dismiss="alert"]',b=function(e){d(e).on("click",c,this.close)};b.prototype.close=function(j){var i=d(this),g=i.attr("data-target"),h;if(!g){g=i.attr("href");g=g&&g.replace(/.*(?=#[^\s]*$)/,"")}h=d(g);j&&j.preventDefault();h.length||(h=i.hasClass("alert")?i:i.parent());h.trigger(j=d.Event("close"));if(j.isDefaultPrevented()){return}h.removeClass("in");function f(){h.trigger("closed").remove()}d.support.transition&&h.hasClass("fade")?h.on(d.support.transition.end,f):f()};var a=d.fn.alert;d.fn.alert=function(e){return this.each(function(){var g=d(this),f=g.data("alert");if(!f){g.data("alert",(f=new b(this)))}if(typeof e=="string"){f[e].call(g)}})};d.fn.alert.Constructor=b;d.fn.alert.noConflict=function(){d.fn.alert=a;return this};d(document).on("click.alert.data-api",c,b.prototype.close)}(window.jQuery);!function(c){var b=function(e,d){this.$element=c(e);this.options=c.extend({},c.fn.button.defaults,d)};b.prototype.setState=function(g){var i="disabled",e=this.$element,f=e.data(),h=e.is("input")?"val":"html";g=g+"Text";f.resetText||e.data("resetText",e[h]());e[h](f[g]||this.options[g]);setTimeout(function(){g=="loadingText"?e.addClass(i).attr(i,i):e.removeClass(i).removeAttr(i)},0)};b.prototype.toggle=function(){var d=this.$element.closest('[data-toggle="buttons-radio"]');d&&d.find(".active").removeClass("active");this.$element.toggleClass("active")};var a=c.fn.button;c.fn.button=function(d){return this.each(function(){var g=c(this),f=g.data("button"),e=typeof d=="object"&&d;if(!f){g.data("button",(f=new b(this,e)))}if(d=="toggle"){f.toggle()}else{if(d){f.setState(d)}}})};c.fn.button.defaults={loadingText:"loading..."};c.fn.button.Constructor=b;c.fn.button.noConflict=function(){c.fn.button=a;return this};c(document).on("click.button.data-api","[data-toggle^=button]",function(f){var d=c(f.target);if(!d.hasClass("btn")){d=d.closest(".btn")}d.button("toggle")})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.$indicators=this.$element.find(".carousel-indicators");this.options=d;this.options.pause=="hover"&&this.$element.on("mouseenter",b.proxy(this.pause,this)).on("mouseleave",b.proxy(this.cycle,this))};c.prototype={cycle:function(d){if(!d){this.paused=false}if(this.interval){clearInterval(this.interval)}this.options.interval&&!this.paused&&(this.interval=setInterval(b.proxy(this.next,this),this.options.interval));return this},getActiveIndex:function(){this.$active=this.$element.find(".item.active");this.$items=this.$active.parent().children();return this.$items.index(this.$active)},to:function(f){var d=this.getActiveIndex(),e=this;if(f>(this.$items.length-1)||f<0){return}if(this.sliding){return this.$element.one("slid",function(){e.to(f)})}if(d==f){return this.pause().cycle()}return this.slide(f>d?"next":"prev",b(this.$items[f]))},pause:function(d){if(!d){this.paused=true}if(this.$element.find(".next, .prev").length&&b.support.transition.end){this.$element.trigger(b.support.transition.end);this.cycle(true)}clearInterval(this.interval);this.interval=null;return this},next:function(){if(this.sliding){return}return this.slide("next")},prev:function(){if(this.sliding){return}return this.slide("prev")},slide:function(k,f){var m=this.$element.find(".item.active"),d=f||m[k](),j=this.interval,l=k=="next"?"left":"right",g=k=="next"?"first":"last",h=this,i;this.sliding=true;j&&this.pause();d=d.length?d:this.$element.find(".item")[g]();i=b.Event("slide",{relatedTarget:d[0],direction:l});if(d.hasClass("active")){return}if(this.$indicators.length){this.$indicators.find(".active").removeClass("active");this.$element.one("slid",function(){var e=b(h.$indicators.children()[h.getActiveIndex()]);e&&e.addClass("active")})}if(b.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(i);if(i.isDefaultPrevented()){return}d.addClass(k);d[0].offsetWidth;m.addClass(l);d.addClass(l);this.$element.one(b.support.transition.end,function(){d.removeClass([k,l].join(" ")).addClass("active");m.removeClass(["active",l].join(" "));h.sliding=false;setTimeout(function(){h.$element.trigger("slid")},0)})}else{this.$element.trigger(i);if(i.isDefaultPrevented()){return}m.removeClass("active");d.addClass("active");this.sliding=false;this.$element.trigger("slid")}j&&this.cycle();return this}};var a=b.fn.carousel;b.fn.carousel=function(d){return this.each(function(){var h=b(this),g=h.data("carousel"),e=b.extend({},b.fn.carousel.defaults,typeof d=="object"&&d),f=typeof d=="string"?d:e.slide;if(!g){h.data("carousel",(g=new c(this,e)))}if(typeof d=="number"){g.to(d)}else{if(f){g[f]()}else{if(e.interval){g.pause().cycle()}}}})};b.fn.carousel.defaults={interval:5000,pause:"hover"};b.fn.carousel.Constructor=c;b.fn.carousel.noConflict=function(){b.fn.carousel=a;return this};b(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(j){var i=b(this),f,d=b(i.attr("data-target")||(f=i.attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")),g=b.extend({},d.data(),i.data()),h;d.carousel(g);if(h=i.attr("data-slide-to")){d.data("carousel").pause().to(h).cycle()}j.preventDefault()})}(window.jQuery);!function(b){var c=function(e,d){this.$element=b(e);this.options=b.extend({},b.fn.collapse.defaults,d);if(this.options.parent){this.$parent=b(this.options.parent)}this.options.toggle&&this.toggle()};c.prototype={constructor:c,dimension:function(){var d=this.$element.hasClass("width");return d?"width":"height"},show:function(){var g,d,f,e;if(this.transitioning||this.$element.hasClass("in")){return}g=this.dimension();d=b.camelCase(["scroll",g].join("-"));f=this.$parent&&this.$parent.find("> .accordion-group > .in");if(f&&f.length){e=f.data("collapse");if(e&&e.transitioning){return}f.collapse("hide");e||f.data("collapse",null)}this.$element[g](0);this.transition("addClass",b.Event("show"),"shown");b.support.transition&&this.$element[g](this.$element[0][d])},hide:function(){var d;if(this.transitioning||!this.$element.hasClass("in")){return}d=this.dimension();this.reset(this.$element[d]());this.transition("removeClass",b.Event("hide"),"hidden");this.$element[d](0)},reset:function(d){var e=this.dimension();this.$element.removeClass("collapse")[e](d||"auto")[0].offsetWidth;this.$element[d!==null?"addClass":"removeClass"]("collapse");return this},transition:function(h,e,f){var g=this,d=function(){if(e.type=="show"){g.reset()}g.transitioning=0;g.$element.trigger(f)};this.$element.trigger(e);if(e.isDefaultPrevented()){return}this.transitioning=1;this.$element[h]("in");b.support.transition&&this.$element.hasClass("collapse")?this.$element.one(b.support.transition.end,d):d()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var a=b.fn.collapse;b.fn.collapse=function(d){return this.each(function(){var g=b(this),f=g.data("collapse"),e=b.extend({},b.fn.collapse.defaults,g.data(),typeof d=="object"&&d);if(!f){g.data("collapse",(f=new c(this,e)))}if(typeof d=="string"){f[d]()}})};b.fn.collapse.defaults={toggle:true};b.fn.collapse.Constructor=c;b.fn.collapse.noConflict=function(){b.fn.collapse=a;return this};b(document).on("click.collapse.data-api","[data-toggle=collapse]",function(i){var h=b(this),d,g=h.attr("data-target")||i.preventDefault()||(d=h.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=b(g).data("collapse")?"toggle":h.data();h[b(g).hasClass("in")?"addClass":"removeClass"]("collapsed");b(g).collapse(f)})}(window.jQuery);!function(f){var b="[data-toggle=dropdown]",a=function(h){var g=f(h).on("click.dropdown.data-api",this.toggle);f("html").on("click.dropdown.data-api",function(){g.parent().removeClass("open")})};a.prototype={constructor:a,toggle:function(j){var i=f(this),h,g;if(i.is(".disabled, :disabled")){return}h=e(i);g=h.hasClass("open");d();if(!g){if("ontouchstart" in document.documentElement){f('