+Package `gorilla/mux` implements a request router and dispatcher.
+
+The name mux stands for "HTTP request multiplexer". Like the standard `http.ServeMux`, `mux.Router` matches incoming requests against a list of registered routes and calls a handler for the route that matches the URL or other conditions. The main features are:
+
+* Requests can be matched based on URL host, path, path prefix, schemes, header and query values, HTTP methods or using custom matchers.
+* URL hosts and paths can have variables with an optional regular expression.
+* Registered URLs can be built, or "reversed", which helps maintaining references to resources.
+* Routes can be used as subrouters: nested routes are only tested if the parent route matches. This is useful to define groups of routes that share common conditions like a host, a path prefix or other repeated attributes. As a bonus, this optimizes request matching.
+* It implements the `http.Handler` interface so it is compatible with the standard `http.ServeMux`.
+
+Let's start registering a couple of URL paths and handlers:
+
+```go
+func main() {
+ r := mux.NewRouter()
+ r.HandleFunc("/", HomeHandler)
+ r.HandleFunc("/products", ProductsHandler)
+ r.HandleFunc("/articles", ArticlesHandler)
+ http.Handle("/", r)
+}
+```
+
+Here we register three routes mapping URL paths to handlers. This is equivalent to how `http.HandleFunc()` works: if an incoming request URL matches one of the paths, the corresponding handler is called passing (`http.ResponseWriter`, `*http.Request`) as parameters.
+
+Paths can have variables. They are defined using the format `{name}` or `{name:pattern}`. If a regular expression pattern is not defined, the matched variable will be anything until the next slash. For example:
+...and finally, it is possible to combine several matchers in a single route:
+
+```go
+r.HandleFunc("/products", ProductsHandler).
+ Host("www.example.com").
+ Methods("GET").
+ Schemes("http")
+```
+
+Setting the same matching conditions again and again can be boring, so we have a way to group several routes that share the same requirements. We call it "subrouting".
+
+For example, let's say we have several URLs that should only match when the host is `www.example.com`. Create a route for that host and get a "subrouter" from it:
+The three URL paths we registered above will only be tested if the domain is `www.example.com`, because the subrouter is tested first. This is not only convenient, but also optimizes request matching. You can create subrouters combining any attribute matchers accepted by a route.
+
+Subrouters can be used to create domain or path "namespaces": you define subrouters in a central place and then parts of the app can register its paths relatively to a given subrouter.
+
+There's one more thing about subroutes. When a subrouter has a path prefix, the inner routes use it as base for their paths:
+Routes can be named. All routes that define a name can have their URLs built, or "reversed". We define a name calling `Name()` on a route. For example:
+To build a URL, get the route and call the `URL()` method, passing a sequence of key/value pairs for the route variables. For the previous route, we would do:
+All variables defined in the route are required, and their values must conform to the corresponding patterns. These requirements guarantee that a generated URL will always match a registered route -- the only exception is for explicitly defined "build-only" routes which never match.
+
+Regex support also exists for matching Headers within a route. For example, we could do:
+...and the route will match both requests with a Content-Type of `application/json` as well as `application/text`
+
+There's also a way to build only the URL host or path for a route: use the methods `URLHost()` or `URLPath()` instead. For the previous route, we would do:
+bson/bson.go:103:5: error var SetZero should have name of the form ErrFoo
+bson/bson.go:187:6: type ObjectId should be ObjectID
+bson/bson.go:192:6: func ObjectIdHex should be ObjectIDHex
+bson/bson.go:202:6: func IsObjectIdHex should be IsObjectIDHex
+bson/bson.go:249:6: func NewObjectId should be NewObjectID
+bson/bson.go:273:6: func NewObjectIdWithTime should be NewObjectIDWithTime
+bson/bson.go:470:2: struct field Id should be ID
+bson/bson.go:587:21: error strings should not be capitalized or end with punctuation or a newline
+bson/bson.go:589:21: error strings should not be capitalized or end with punctuation or a newline
+bson/bson.go:613:21: error strings should not be capitalized or end with punctuation or a newline
+bson/bson.go:615:21: error strings should not be capitalized or end with punctuation or a newline
+bson/encode.go:46:2: var typeObjectId should be typeObjectID
+bson/internal/json/stream_test.go:196:3: struct field Id should be ID
+bson/internal/json/stream_test.go:221:3: struct field Id should be ID
+bson/internal/json/stream_test.go:285:22: should omit type []tokenStreamCase from declaration of var tokenStreamCases; it will be inferred from the right-hand side
+bson/internal/testutil/close_helper.go:14:1: exported function CloseReadOnlyFile should have comment or be unexported
+bson/internal/testutil/close_helper.go:8:1: exported function CloseOrError should have comment or be unexported
+bson/json.go:246:6: func jdecObjectId should be jdecObjectID
+bson/json.go:263:6: func jencObjectId should be jencObjectID
+mongo/internal/testutil/helpers/helpers.go:10:1: exported function RequireNoErrorOnClose should have comment or be unexported
+mongo/internal/testutil/helpers/helpers.go:14:1: exported function FindJSONFilesInDir should have comment or be unexported
+mongo/internal/testutil/helpers/helpers.go:45:1: exported function VerifyConnStringOptions should have comment or be unexported
+mongo/options/find_and_modify.go:19:1: exported function CopyFindOneAndReplaceOptions should have comment or be unexported
+mongo/options/find_and_modify.go:29:1: exported function CopyFindOneAndUpdateOptions should have comment or be unexported
+mongo/options/find_and_modify.go:9:1: exported function CopyFindOneAndDeleteOptions should have comment or be unexported
+mongo/options.go:157:1: exported function OplogReplay should have comment or be unexported
+mongo/options.go:177:56: exported func ReadPreference returns unexported type *mongo.optReadPreference, which can be annoying to use
+bson/internal/jsonparser/bytes.go:9:10: should omit type bool from declaration of var neg; it will be inferred from the right-hand side
+bson/internal/jsonparser/bytes.go:25:9: if block ends with a return statement, so drop this else and outdent its block
+bson/internal/jsonparser/escape.go:113:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
+bson/internal/jsonparser/escape.go:123:1: comment on exported function Unescape should be of the form "Unescape ..."
+bson/internal/jsonparser/parser.go:14:2: error var KeyPathNotFoundError should have name of the form ErrFoo
+bson/internal/jsonparser/parser.go:15:2: error var UnknownValueTypeError should have name of the form ErrFoo
+bson/internal/jsonparser/parser.go:16:2: error var MalformedJsonError should have name of the form ErrFoo
+bson/internal/jsonparser/parser.go:16:2: var MalformedJsonError should be MalformedJSONError
+bson/internal/jsonparser/parser.go:17:2: error var MalformedStringError should have name of the form ErrFoo
+bson/internal/jsonparser/parser.go:18:2: error var MalformedArrayError should have name of the form ErrFoo
+bson/internal/jsonparser/parser.go:19:2: error var MalformedObjectError should have name of the form ErrFoo
+bson/internal/jsonparser/parser.go:20:2: error var MalformedValueError should have name of the form ErrFoo
+bson/internal/jsonparser/parser.go:21:2: error var MalformedStringEscapeError should have name of the form ErrFoo
+bson/internal/jsonparser/parser.go:147:11: if block ends with a return statement, so drop this else and outdent its block
+bson/internal/jsonparser/parser.go:285:6: should replace curIdx += 1 with curIdx++
+bson/internal/jsonparser/parser.go:292:12: if block ends with a return statement, so drop this else and outdent its block
+bson/internal/jsonparser/parser.go:303:12: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
+bson/internal/jsonparser/parser.go:329:6: don't use underscores in Go names; range var pi_1 should be pi1
+bson/internal/jsonparser/parser.go:329:12: don't use underscores in Go names; range var p_1 should be p1
+bson/internal/jsonparser/parser.go:338:1: exported function EachKey should have comment or be unexported
+bson/internal/jsonparser/parser.go:489:6: should replace curIdx += 1 with curIdx++
+bson/internal/jsonparser/parser.go:503:12: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
+bson/internal/jsonparser/parser.go:517:1: comment on exported type ValueType should be of the form "ValueType ..." (with optional leading article)
+bson/internal/jsonparser/parser.go:521:2: exported const NotExist should have comment (or a comment on this block) or be unexported
+bson/internal/jsonparser/parser.go:582:1: comment on exported function Delete should be of the form "Delete ..."
+bson/internal/jsonparser/parser.go:931:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
+bson/internal/jsonparser/parser.go:971:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
+bson/internal/jsonparser/parser.go:980:11: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
+bson/internal/jsonparser/parser.go:1006:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
+bson/internal/jsonparser/parser.go:1021:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
+bson/internal/jsonparser/parser.go:1128:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
+bson/internal/jsonparser/parser.go:1133:1: comment on exported function ParseFloat should be of the form "ParseFloat ..."
+bson/internal/jsonparser/parser.go:1137:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
+bson/internal/jsonparser/parser.go:1146:9: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
+bson/internal/jsonparser/parser_test.go:1361:5: var testJson should be testJSON
+bson/internal/jsonpretty/pretty.go:7:1: comment on exported type Options should be of the form "Options ..." (with optional leading article)
+examples/documentation_examples/examples.go:10:1: don't use an underscore in package name
+Thank you for your interest in contributing to the MongoDB Go driver.
+
+We are building this software together and strongly encourage contributions from the community that are within the guidelines set forth
+below.
+
+## Bug Fixes and New Features
+
+Before starting to write code, look for existing [tickets](https://jira.mongodb.org/browse/GODRIVER) or
+[create one](https://jira.mongodb.org/secure/CreateIssue!default.jspa) for your bug, issue, or feature request. This helps the community
+avoid working on something that might not be of interest or which has already been addressed.
+
+## Pull Requests & Patches
+
+The Go Driver team is experimenting with GerritHub for contributions. GerritHub uses GitHub for authentication and uses a patch based
+workflow. Since GerritHub supports importing of Pull Requests we will also accept Pull Requests, but Code Review will be done in
+GerritHub.
+
+Patches should generally be made against the master (default) branch and include relevant tests, if applicable.
+
+Code should compile and tests should pass under all go versions which the driver currently supports. Currently the driver
+supports a minimum version of go 1.7. Please ensure the following tools have been run on the code: gofmt, golint, errcheck,
+go test (with coverage and with the race detector), and go vet. For convenience, you can run 'make' to run all these tools.
+**By default, running the tests requires that you have a mongod server running on localhost, listening on the default port.**
+At minimum, please test against the latest release version of the MongoDB server.
+
+If any tests do not pass, or relevant tests are not included, the patch will not be considered.
+
+If you are working on a bug or feature listed in Jira, please include the ticket number prefixed with GODRIVER in the commit,
+e.g. GODRIVER-123. For the patch commit message itself, please follow the [How to Write a Git Commit Message](https://chris.beams.io/posts/git-commit/) guide.
+
+## Talk To Us
+
+If you want to work on the driver, write documentation, or have questions/complaints, please reach out to use either via
+the [mongo-go-driver Google Group](https://groups.google.com/forum/#!forum/mongodb-go-driver) or by creating a Question
+issue at (https://jira.mongodb.org/secure/CreateIssue!default.jspa).
+Additional examples and documentation can be found under the examples directory and [on the MongoDB Documentation website](https://docs.mongodb.com/ecosystem/drivers/go/).
+
+-------------------------
+## Bugs / Feature Reporting
+
+New Features and bugs can be reported on jira: https://jira.mongodb.org/browse/GODRIVER
+
+-------------------------
+## Testing / Development
+
+The driver tests can be run against several database configurations. The most simple configuration is a standalone mongod with no auth, no ssl, and no compression. To run these basic driver tests, make sure a standalone MongoDB server instance is running at localhost:27017. To run the tests, you can run `make` (on Windows, run `nmake`). This will run coverage, run go-lint, run go-vet, and build the examples.
+
+### Testing Different Topologies
+
+To test a **replica set** or **sharded cluster**, set `MONGODB_URI="<connection-string>"` for the `make` command.
+For example, for a local replica set named `rs1` comprised of three nodes on ports 27017, 27018, and 27019:
+
+```
+MONGODB_URI="mongodb://localhost:27017,localhost:27018,localhost:27018/?replicaSet=rs1" make
+```
+
+### Testing Auth and SSL
+
+To test authentication and SSL, first set up a MongoDB cluster with auth and SSL configured. Testing authentication requires a user with the `root` role on the `admin` database. The Go Driver repository comes with example certificates in the `data/certificates` directory. These certs can be used for testing. Here is an example command that would run a mongod with SSL correctly configured for tests:
+To run the tests with `make`, set `MONGO_GO_DRIVER_CA_FILE` to the location of the CA file used by the database, set `MONGODB_URI` to the connection string of the server, set `AUTH=auth`, and set `SSL=ssl`. For example:
+
+```
+AUTH=auth SSL=ssl MONGO_GO_DRIVER_CA_FILE=$(pwd)/data/certificates/ca.pem MONGODB_URI="mongodb://user:password@localhost:27017/?authSource=admin" make
+```
+
+Notes:
+- The `--sslWeakCertificateValidation` flag is required on the server for the test suite to work correctly.
+- The test suite requires the auth database to be set with `?authSource=admin`, not `/admin`.
+
+### Testing Compression
+
+The MongoDB Go Driver supports wire protocol compression using Snappy, zLib, or zstd. To run tests with wire protocol compression, set `MONGO_GO_DRIVER_COMPRESSOR` to `snappy`, `zlib`, or `zstd`. For example:
+
+```
+MONGO_GO_DRIVER_COMPRESSOR=snappy make
+```
+
+Ensure the [`--networkMessageCompressors` flag](https://docs.mongodb.com/manual/reference/program/mongod/#cmdoption-mongod-networkmessagecompressors) on mongod or mongos includes `zlib` if testing zLib compression.
+
+-------------------------
+## Feedback
+
+The MongoDB Go Driver is not feature complete, so any help is appreciated. Check out the [project page](https://jira.mongodb.org/browse/GODRIVER)
+for tickets that need completing. See our [contribution guidelines](CONTRIBUTING.md) for details.
+
+-------------------------
+## Continuous Integration
+
+Commits to master are run automatically on [evergreen](https://evergreen.mongodb.com/waterfall/mongo-go-driver).
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.