aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/golangci
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-07-04 11:12:55 +0200
committerDmitry Vyukov <dvyukov@google.com>2020-07-04 15:05:30 +0200
commitc7d7f10bdff703e4a3c0414e8a33d4e45c91eb35 (patch)
tree0dff0ee1f98dbfa3ad8776112053a450d176592b /vendor/github.com/golangci
parent9573094ce235bd9afe88f5da27a47dd6bcc1e13b (diff)
go.mod: vendor golangci-lint
Diffstat (limited to 'vendor/github.com/golangci')
-rw-r--r--vendor/github.com/golangci/check/LICENSE674
-rw-r--r--vendor/github.com/golangci/check/cmd/structcheck/structcheck.go193
-rw-r--r--vendor/github.com/golangci/check/cmd/varcheck/varcheck.go163
-rw-r--r--vendor/github.com/golangci/dupl/.travis.yml5
-rw-r--r--vendor/github.com/golangci/dupl/LICENSE21
-rw-r--r--vendor/github.com/golangci/dupl/README.md63
-rw-r--r--vendor/github.com/golangci/dupl/job/buildtree.go22
-rw-r--r--vendor/github.com/golangci/dupl/job/parse.go36
-rw-r--r--vendor/github.com/golangci/dupl/main.go148
-rw-r--r--vendor/github.com/golangci/dupl/printer/html.go120
-rw-r--r--vendor/github.com/golangci/dupl/printer/plumbing.go50
-rw-r--r--vendor/github.com/golangci/dupl/printer/printer.go11
-rw-r--r--vendor/github.com/golangci/dupl/printer/text.go100
-rw-r--r--vendor/github.com/golangci/dupl/suffixtree/dupl.go98
-rw-r--r--vendor/github.com/golangci/dupl/suffixtree/suffixtree.go216
-rw-r--r--vendor/github.com/golangci/dupl/syntax/golang/golang.go392
-rw-r--r--vendor/github.com/golangci/dupl/syntax/syntax.go175
-rw-r--r--vendor/github.com/golangci/errcheck/LICENSE22
-rw-r--r--vendor/github.com/golangci/errcheck/golangci/golangci.go85
-rw-r--r--vendor/github.com/golangci/errcheck/internal/errcheck/errcheck.go538
-rw-r--r--vendor/github.com/golangci/go-misc/LICENSE27
-rw-r--r--vendor/github.com/golangci/go-misc/deadcode/README.md18
-rw-r--r--vendor/github.com/golangci/go-misc/deadcode/deadcode.go135
-rw-r--r--vendor/github.com/golangci/goconst/LICENSE21
-rw-r--r--vendor/github.com/golangci/goconst/README.md49
-rw-r--r--vendor/github.com/golangci/goconst/parser.go188
-rw-r--r--vendor/github.com/golangci/goconst/visitor.go143
-rw-r--r--vendor/github.com/golangci/gocyclo/CONTRIBUTORS7
-rw-r--r--vendor/github.com/golangci/gocyclo/LICENSE27
-rw-r--r--vendor/github.com/golangci/gocyclo/pkg/gocyclo/gocyclo.go82
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/LICENSE27
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/doc.go104
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/gofmt.go327
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/golangci.go46
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/internal.go176
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/rewrite.go303
-rw-r--r--vendor/github.com/golangci/gofmt/gofmt/simplify.go165
-rw-r--r--vendor/github.com/golangci/gofmt/goimports/LICENSE27
-rw-r--r--vendor/github.com/golangci/gofmt/goimports/goimports.go358
-rw-r--r--vendor/github.com/golangci/gofmt/goimports/golangci.go33
-rw-r--r--vendor/github.com/golangci/golangci-lint/LICENSE674
-rw-r--r--vendor/github.com/golangci/golangci-lint/cmd/golangci-lint/main.go25
-rw-r--r--vendor/github.com/golangci/golangci-lint/cmd/golangci-lint/mod_version.go19
-rw-r--r--vendor/github.com/golangci/golangci-lint/internal/cache/cache.go544
-rw-r--r--vendor/github.com/golangci/golangci-lint/internal/cache/default.go87
-rw-r--r--vendor/github.com/golangci/golangci-lint/internal/cache/hash.go186
-rw-r--r--vendor/github.com/golangci/golangci-lint/internal/errorutil/errors.go23
-rw-r--r--vendor/github.com/golangci/golangci-lint/internal/pkgcache/pkgcache.go229
-rw-r--r--vendor/github.com/golangci/golangci-lint/internal/renameio/renameio.go93
-rw-r--r--vendor/github.com/golangci/golangci-lint/internal/robustio/robustio.go53
-rw-r--r--vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_darwin.go29
-rw-r--r--vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_flaky.go93
-rw-r--r--vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_other.go28
-rw-r--r--vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_windows.go33
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/commands/cache.go84
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/commands/completion.go53
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/commands/config.go66
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/commands/executor.go245
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/commands/help.go84
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/commands/linters.go51
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/commands/root.go165
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/commands/run.go534
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/commands/version.go17
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/config/config.go491
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/config/config_gocritic.go367
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/config/reader.go204
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/exitcodes/exitcodes.go34
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/fsutils/filecache.go67
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/fsutils/fsutils.go100
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/fsutils/linecache.go70
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/asciicheck.go19
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/bodyclose.go21
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go52
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/depguard.go112
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/dogsled.go97
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/dupl.go83
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/errcheck.go217
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/funlen.go64
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/adapters.go36
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/issue.go31
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/linter.go519
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/load/guard.go30
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/metalinter.go99
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go1363
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecknoglobals.go100
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecknoinits.go74
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/gocognit.go69
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/goconst.go81
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/gocritic.go162
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/gocyclo.go69
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/godot.go63
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/godox.go63
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/goerr113.go19
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/gofmt.go72
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/gofmt_common.go269
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/goimports.go73
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/golint.go78
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/gomnd.go27
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/gomodguard.go88
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/goprintffuncname.go17
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/gosec.go97
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/gosimple.go19
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/govet.go165
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/ineffassign.go61
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/interfacer.go67
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/lll.go124
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/maligned.go58
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/megacheck.go30
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/misspell.go132
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/nakedret.go123
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/nestif.go65
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/nolintlint.go92
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/nolintlint/README.md31
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/nolintlint/nolintlint.go239
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/prealloc.go57
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/rowerrcheck.go23
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/scopelint.go178
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/staticcheck.go19
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/structcheck.go55
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/stylecheck.go19
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/testpackage.go23
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/typecheck.go26
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/unconvert.go53
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/unparam.go77
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/unused.go65
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/util.go24
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/varcheck.go55
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/whitespace.go85
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/golinters/wsl.go81
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/goutil/env.go61
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/lint/linter/config.go89
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/lint/linter/context.go49
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/lint/linter/linter.go13
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/enabled_set.go187
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go374
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/validator.go99
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/lint/load.go308
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/lint/runner.go256
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/logutils/log.go31
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/logutils/logutils.go49
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/logutils/mock.go47
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/logutils/out.go9
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/logutils/stderr_log.go121
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/packages/errors.go39
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/packages/skip.go25
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/packages/util.go71
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/printers/checkstyle.go80
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/printers/codeclimate.go62
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/printers/github.go39
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/printers/json.go41
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/printers/junitxml.go79
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/printers/printer.go11
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/printers/tab.go58
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/printers/text.go90
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/report/data.go26
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/report/log.go64
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/issue.go78
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/autogenerated_exclude.go152
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/cgo.go58
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/diff.go74
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/exclude.go59
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/exclude_rules.go143
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/filename_unadjuster.go123
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/fixer.go248
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/identifier_marker.go125
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/max_from_linter.go54
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/max_per_file_from_linter.go60
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/max_same_issues.go81
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/nolint.go304
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/path_prettifier.go48
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/path_shortener.go40
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/processor.go11
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/skip_dirs.go143
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/skip_files.go52
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/source_code.go47
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/uniq_by_line.go58
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/result/processors/utils.go62
-rw-r--r--vendor/github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go116
-rw-r--r--vendor/github.com/golangci/ineffassign/.gitignore30
-rw-r--r--vendor/github.com/golangci/ineffassign/LICENSE21
-rw-r--r--vendor/github.com/golangci/ineffassign/README.md4
-rw-r--r--vendor/github.com/golangci/ineffassign/bugs7
-rw-r--r--vendor/github.com/golangci/ineffassign/ineffassign.go620
-rw-r--r--vendor/github.com/golangci/ineffassign/list25
-rw-r--r--vendor/github.com/golangci/ineffassign/liststd131
-rw-r--r--vendor/github.com/golangci/lint-1/.travis.yml19
-rw-r--r--vendor/github.com/golangci/lint-1/CONTRIBUTING.md15
-rw-r--r--vendor/github.com/golangci/lint-1/LICENSE27
-rw-r--r--vendor/github.com/golangci/lint-1/README.md88
-rw-r--r--vendor/github.com/golangci/lint-1/go.mod3
-rw-r--r--vendor/github.com/golangci/lint-1/go.sum6
-rw-r--r--vendor/github.com/golangci/lint-1/lint.go1655
-rw-r--r--vendor/github.com/golangci/maligned/LICENSE27
-rw-r--r--vendor/github.com/golangci/maligned/README7
-rw-r--r--vendor/github.com/golangci/maligned/maligned.go253
-rw-r--r--vendor/github.com/golangci/misspell/.gitignore34
-rw-r--r--vendor/github.com/golangci/misspell/.travis.yml20
-rw-r--r--vendor/github.com/golangci/misspell/Dockerfile37
-rw-r--r--vendor/github.com/golangci/misspell/Gopkg.lock24
-rw-r--r--vendor/github.com/golangci/misspell/Gopkg.toml34
-rw-r--r--vendor/github.com/golangci/misspell/LICENSE22
-rw-r--r--vendor/github.com/golangci/misspell/Makefile74
-rw-r--r--vendor/github.com/golangci/misspell/README.md424
-rw-r--r--vendor/github.com/golangci/misspell/RELEASE-HOWTO.md38
-rw-r--r--vendor/github.com/golangci/misspell/ascii.go62
-rw-r--r--vendor/github.com/golangci/misspell/case.go59
-rw-r--r--vendor/github.com/golangci/misspell/goreleaser.yml38
-rw-r--r--vendor/github.com/golangci/misspell/install-misspell.sh362
-rw-r--r--vendor/github.com/golangci/misspell/legal.go48
-rw-r--r--vendor/github.com/golangci/misspell/mime.go210
-rw-r--r--vendor/github.com/golangci/misspell/notwords.go85
-rw-r--r--vendor/github.com/golangci/misspell/replace.go246
-rw-r--r--vendor/github.com/golangci/misspell/stringreplacer.go336
-rw-r--r--vendor/github.com/golangci/misspell/stringreplacer_test.gox421
-rw-r--r--vendor/github.com/golangci/misspell/url.go17
-rw-r--r--vendor/github.com/golangci/misspell/words.go31194
-rw-r--r--vendor/github.com/golangci/prealloc/LICENSE21
-rw-r--r--vendor/github.com/golangci/prealloc/README.md198
-rw-r--r--vendor/github.com/golangci/prealloc/import.go310
-rw-r--r--vendor/github.com/golangci/prealloc/prealloc.go403
-rw-r--r--vendor/github.com/golangci/revgrep/.gitignore1
-rw-r--r--vendor/github.com/golangci/revgrep/.travis.yml7
-rw-r--r--vendor/github.com/golangci/revgrep/LICENSE201
-rw-r--r--vendor/github.com/golangci/revgrep/README.md58
-rw-r--r--vendor/github.com/golangci/revgrep/revgrep.go395
-rw-r--r--vendor/github.com/golangci/unconvert/LICENSE27
-rw-r--r--vendor/github.com/golangci/unconvert/README36
-rw-r--r--vendor/github.com/golangci/unconvert/unconvert.go665
228 files changed, 59912 insertions, 0 deletions
diff --git a/vendor/github.com/golangci/check/LICENSE b/vendor/github.com/golangci/check/LICENSE
new file mode 100644
index 000000000..5a1774b8e
--- /dev/null
+++ b/vendor/github.com/golangci/check/LICENSE
@@ -0,0 +1,674 @@
+GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. {http://fsf.org/}
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ {one line to give the program's name and a brief idea of what it does.}
+ Copyright (C) {year} {name of author}
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see {http://www.gnu.org/licenses/}.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ opennota Copyright (C) 2013 opennota
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+{http://www.gnu.org/licenses/}.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+{http://www.gnu.org/philosophy/why-not-lgpl.html}.
diff --git a/vendor/github.com/golangci/check/cmd/structcheck/structcheck.go b/vendor/github.com/golangci/check/cmd/structcheck/structcheck.go
new file mode 100644
index 000000000..5dc5f8380
--- /dev/null
+++ b/vendor/github.com/golangci/check/cmd/structcheck/structcheck.go
@@ -0,0 +1,193 @@
+// structcheck
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+package structcheck
+
+import (
+ "flag"
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+
+ "golang.org/x/tools/go/loader"
+)
+
+var (
+ assignmentsOnly = flag.Bool("structcheck.a", false, "Count assignments only")
+ loadTestFiles = flag.Bool("structcheck.t", false, "Load test files too")
+ buildTags = flag.String("structcheck.tags", "", "Build tags")
+)
+
+type visitor struct {
+ prog *loader.Program
+ pkg *loader.PackageInfo
+ m map[types.Type]map[string]int
+ skip map[types.Type]struct{}
+}
+
+func (v *visitor) decl(t types.Type, fieldName string) {
+ if _, ok := v.m[t]; !ok {
+ v.m[t] = make(map[string]int)
+ }
+ if _, ok := v.m[t][fieldName]; !ok {
+ v.m[t][fieldName] = 0
+ }
+}
+
+func (v *visitor) assignment(t types.Type, fieldName string) {
+ if _, ok := v.m[t]; !ok {
+ v.m[t] = make(map[string]int)
+ }
+ if _, ok := v.m[t][fieldName]; ok {
+ v.m[t][fieldName]++
+ } else {
+ v.m[t][fieldName] = 1
+ }
+}
+
+func (v *visitor) typeSpec(node *ast.TypeSpec) {
+ if strukt, ok := node.Type.(*ast.StructType); ok {
+ t := v.pkg.Info.Defs[node.Name].Type()
+ for _, f := range strukt.Fields.List {
+ if len(f.Names) > 0 {
+ fieldName := f.Names[0].Name
+ v.decl(t, fieldName)
+ }
+ }
+ }
+}
+
+func (v *visitor) typeAndFieldName(expr *ast.SelectorExpr) (types.Type, string, bool) {
+ selection := v.pkg.Info.Selections[expr]
+ if selection == nil {
+ return nil, "", false
+ }
+ recv := selection.Recv()
+ if ptr, ok := recv.(*types.Pointer); ok {
+ recv = ptr.Elem()
+ }
+ return recv, selection.Obj().Name(), true
+}
+
+func (v *visitor) assignStmt(node *ast.AssignStmt) {
+ for _, lhs := range node.Lhs {
+ var selector *ast.SelectorExpr
+ switch expr := lhs.(type) {
+ case *ast.SelectorExpr:
+ selector = expr
+ case *ast.IndexExpr:
+ if expr, ok := expr.X.(*ast.SelectorExpr); ok {
+ selector = expr
+ }
+ }
+ if selector != nil {
+ if t, fn, ok := v.typeAndFieldName(selector); ok {
+ v.assignment(t, fn)
+ }
+ }
+ }
+}
+
+func (v *visitor) compositeLiteral(node *ast.CompositeLit) {
+ t := v.pkg.Info.Types[node.Type].Type
+ for _, expr := range node.Elts {
+ if kv, ok := expr.(*ast.KeyValueExpr); ok {
+ if ident, ok := kv.Key.(*ast.Ident); ok {
+ v.assignment(t, ident.Name)
+ }
+ } else {
+ // Struct literal with positional values.
+ // All the fields are assigned.
+ v.skip[t] = struct{}{}
+ break
+ }
+ }
+}
+
+func (v *visitor) Visit(node ast.Node) ast.Visitor {
+ switch node := node.(type) {
+ case *ast.TypeSpec:
+ v.typeSpec(node)
+
+ case *ast.AssignStmt:
+ if *assignmentsOnly {
+ v.assignStmt(node)
+ }
+
+ case *ast.SelectorExpr:
+ if !*assignmentsOnly {
+ if t, fn, ok := v.typeAndFieldName(node); ok {
+ v.assignment(t, fn)
+ }
+ }
+
+ case *ast.CompositeLit:
+ v.compositeLiteral(node)
+ }
+
+ return v
+}
+
+type Issue struct {
+ Pos token.Position
+ Type string
+ FieldName string
+}
+
+func Run(program *loader.Program, reportExported bool) []Issue {
+ var issues []Issue
+ for _, pkg := range program.InitialPackages() {
+ visitor := &visitor{
+ m: make(map[types.Type]map[string]int),
+ skip: make(map[types.Type]struct{}),
+ prog: program,
+ pkg: pkg,
+ }
+ for _, f := range pkg.Files {
+ ast.Walk(visitor, f)
+ }
+
+ for t := range visitor.m {
+ if _, skip := visitor.skip[t]; skip {
+ continue
+ }
+ for fieldName, v := range visitor.m[t] {
+ if !reportExported && ast.IsExported(fieldName) {
+ continue
+ }
+ if v == 0 {
+ field, _, _ := types.LookupFieldOrMethod(t, false, pkg.Pkg, fieldName)
+ if field == nil {
+ fmt.Printf("%s: unknown field or method: %s.%s\n", pkg.Pkg.Path(), t, fieldName)
+ continue
+ }
+ if fieldName == "XMLName" {
+ if named, ok := field.Type().(*types.Named); ok && named.Obj().Pkg().Path() == "encoding/xml" {
+ continue
+ }
+ }
+ pos := program.Fset.Position(field.Pos())
+ issues = append(issues, Issue{
+ Pos: pos,
+ Type: types.TypeString(t, nil),
+ FieldName: fieldName,
+ })
+ }
+ }
+ }
+ }
+
+ return issues
+}
diff --git a/vendor/github.com/golangci/check/cmd/varcheck/varcheck.go b/vendor/github.com/golangci/check/cmd/varcheck/varcheck.go
new file mode 100644
index 000000000..8e93e0473
--- /dev/null
+++ b/vendor/github.com/golangci/check/cmd/varcheck/varcheck.go
@@ -0,0 +1,163 @@
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+package varcheck
+
+import (
+ "flag"
+ "go/ast"
+ "go/token"
+ "strings"
+
+ "go/types"
+
+ "golang.org/x/tools/go/loader"
+)
+
+var (
+ buildTags = flag.String("varcheck.tags", "", "Build tags")
+)
+
+type object struct {
+ pkgPath string
+ name string
+}
+
+type visitor struct {
+ prog *loader.Program
+ pkg *loader.PackageInfo
+ uses map[object]int
+ positions map[object]token.Position
+ insideFunc bool
+}
+
+func getKey(obj types.Object) object {
+ if obj == nil {
+ return object{}
+ }
+
+ pkg := obj.Pkg()
+ pkgPath := ""
+ if pkg != nil {
+ pkgPath = pkg.Path()
+ }
+
+ return object{
+ pkgPath: pkgPath,
+ name: obj.Name(),
+ }
+}
+
+func (v *visitor) decl(obj types.Object) {
+ key := getKey(obj)
+ if _, ok := v.uses[key]; !ok {
+ v.uses[key] = 0
+ }
+ if _, ok := v.positions[key]; !ok {
+ v.positions[key] = v.prog.Fset.Position(obj.Pos())
+ }
+}
+
+func (v *visitor) use(obj types.Object) {
+ key := getKey(obj)
+ if _, ok := v.uses[key]; ok {
+ v.uses[key]++
+ } else {
+ v.uses[key] = 1
+ }
+}
+
+func isReserved(name string) bool {
+ return name == "_" || strings.HasPrefix(strings.ToLower(name), "_cgo_")
+}
+
+func (v *visitor) Visit(node ast.Node) ast.Visitor {
+ switch node := node.(type) {
+ case *ast.Ident:
+ v.use(v.pkg.Info.Uses[node])
+
+ case *ast.ValueSpec:
+ if !v.insideFunc {
+ for _, ident := range node.Names {
+ if !isReserved(ident.Name) {
+ v.decl(v.pkg.Info.Defs[ident])
+ }
+ }
+ }
+ for _, val := range node.Values {
+ ast.Walk(v, val)
+ }
+ if node.Type != nil {
+ ast.Walk(v, node.Type)
+ }
+ return nil
+
+ case *ast.FuncDecl:
+ if node.Body != nil {
+ v.insideFunc = true
+ ast.Walk(v, node.Body)
+ v.insideFunc = false
+ }
+
+ if node.Recv != nil {
+ ast.Walk(v, node.Recv)
+ }
+ if node.Type != nil {
+ ast.Walk(v, node.Type)
+ }
+
+ return nil
+ }
+
+ return v
+}
+
+type Issue struct {
+ Pos token.Position
+ VarName string
+}
+
+func Run(program *loader.Program, reportExported bool) []Issue {
+ var issues []Issue
+ uses := make(map[object]int)
+ positions := make(map[object]token.Position)
+
+ for _, pkgInfo := range program.InitialPackages() {
+ if pkgInfo.Pkg.Path() == "unsafe" {
+ continue
+ }
+
+ v := &visitor{
+ prog: program,
+ pkg: pkgInfo,
+ uses: uses,
+ positions: positions,
+ }
+
+ for _, f := range v.pkg.Files {
+ ast.Walk(v, f)
+ }
+ }
+
+ for obj, useCount := range uses {
+ if useCount == 0 && (reportExported || !ast.IsExported(obj.name)) {
+ pos := positions[obj]
+ issues = append(issues, Issue{
+ Pos: pos,
+ VarName: obj.name,
+ })
+ }
+ }
+
+ return issues
+}
diff --git a/vendor/github.com/golangci/dupl/.travis.yml b/vendor/github.com/golangci/dupl/.travis.yml
new file mode 100644
index 000000000..33de24c0f
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/.travis.yml
@@ -0,0 +1,5 @@
+language: go
+go:
+ - 1.3
+ - 1.8
+ - 1.9
diff --git a/vendor/github.com/golangci/dupl/LICENSE b/vendor/github.com/golangci/dupl/LICENSE
new file mode 100644
index 000000000..ab317d841
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Michal Bohuslávek
+
+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.
diff --git a/vendor/github.com/golangci/dupl/README.md b/vendor/github.com/golangci/dupl/README.md
new file mode 100644
index 000000000..f34901d7a
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/README.md
@@ -0,0 +1,63 @@
+# dupl [![Build Status](https://travis-ci.org/mibk/dupl.png)](https://travis-ci.org/mibk/dupl)
+
+**dupl** is a tool written in Go for finding code clones. So far it can find clones only
+in the Go source files. The method uses suffix tree for serialized ASTs. It ignores values
+of AST nodes. It just operates with their types (e.g. `if a == 13 {}` and `if x == 100 {}` are
+considered the same provided it exceeds the minimal token sequence size).
+
+Due to the used method dupl can report so called "false positives" on the output. These are
+the ones we do not consider clones (whether they are too small, or the values of the matched
+tokens are completely different).
+
+## Installation
+
+```bash
+go get -u github.com/golangci/dupl
+```
+
+## Usage
+
+```
+Usage of dupl:
+ dupl [flags] [paths]
+
+Paths:
+ If the given path is a file, dupl will use it regardless of
+ the file extension. If it is a directory it will recursively
+ search for *.go files in that directory.
+
+ If no path is given dupl will recursively search for *.go
+ files in the current directory.
+
+Flags:
+ -files
+ read file names from stdin one at each line
+ -html
+ output the results as HTML, including duplicate code fragments
+ -plumbing
+ plumbing (easy-to-parse) output for consumption by scripts or tools
+ -t, -threshold size
+ minimum token sequence size as a clone (default 15)
+ -vendor
+ check files in vendor directory
+ -v, -verbose
+ explain what is being done
+
+Examples:
+ dupl -t 100
+ Search clones in the current directory of size at least
+ 100 tokens.
+ dupl $(find app/ -name '*_test.go')
+ Search for clones in tests in the app directory.
+ find app/ -name '*_test.go' |dupl -files
+ The same as above.
+```
+
+## Example
+
+The reduced output of this command with the following parameters for the [Docker](https://www.docker.com) source code
+looks like [this](http://htmlpreview.github.io/?https://github.com/golangci/dupl/blob/master/_output_example/docker.html).
+
+```bash
+$ dupl -t 200 -html >docker.html
+```
diff --git a/vendor/github.com/golangci/dupl/job/buildtree.go b/vendor/github.com/golangci/dupl/job/buildtree.go
new file mode 100644
index 000000000..e9aad54c0
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/job/buildtree.go
@@ -0,0 +1,22 @@
+package job
+
+import (
+ "github.com/golangci/dupl/suffixtree"
+ "github.com/golangci/dupl/syntax"
+)
+
+func BuildTree(schan chan []*syntax.Node) (t *suffixtree.STree, d *[]*syntax.Node, done chan bool) {
+ t = suffixtree.New()
+ data := make([]*syntax.Node, 0, 100)
+ done = make(chan bool)
+ go func() {
+ for seq := range schan {
+ data = append(data, seq...)
+ for _, node := range seq {
+ t.Update(node)
+ }
+ }
+ done <- true
+ }()
+ return t, &data, done
+}
diff --git a/vendor/github.com/golangci/dupl/job/parse.go b/vendor/github.com/golangci/dupl/job/parse.go
new file mode 100644
index 000000000..eb9d7c625
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/job/parse.go
@@ -0,0 +1,36 @@
+package job
+
+import (
+ "log"
+
+ "github.com/golangci/dupl/syntax"
+ "github.com/golangci/dupl/syntax/golang"
+)
+
+func Parse(fchan chan string) chan []*syntax.Node {
+
+ // parse AST
+ achan := make(chan *syntax.Node)
+ go func() {
+ for file := range fchan {
+ ast, err := golang.Parse(file)
+ if err != nil {
+ log.Println(err)
+ continue
+ }
+ achan <- ast
+ }
+ close(achan)
+ }()
+
+ // serialize
+ schan := make(chan []*syntax.Node)
+ go func() {
+ for ast := range achan {
+ seq := syntax.Serialize(ast)
+ schan <- seq
+ }
+ close(schan)
+ }()
+ return schan
+}
diff --git a/vendor/github.com/golangci/dupl/main.go b/vendor/github.com/golangci/dupl/main.go
new file mode 100644
index 000000000..3030a97ae
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/main.go
@@ -0,0 +1,148 @@
+package dupl
+
+import (
+ "flag"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "sort"
+
+ "github.com/golangci/dupl/job"
+ "github.com/golangci/dupl/printer"
+ "github.com/golangci/dupl/syntax"
+)
+
+const defaultThreshold = 15
+
+var (
+ paths = []string{"."}
+ vendor = flag.Bool("dupl.vendor", false, "")
+ verbose = flag.Bool("dupl.verbose", false, "")
+ files = flag.Bool("dupl.files", false, "")
+
+ html = flag.Bool("dupl.html", false, "")
+ plumbing = flag.Bool("dupl.plumbing", false, "")
+)
+
+const (
+ vendorDirPrefix = "vendor" + string(filepath.Separator)
+ vendorDirInPath = string(filepath.Separator) + vendorDirPrefix
+)
+
+func init() {
+ flag.BoolVar(verbose, "dupl.v", false, "alias for -verbose")
+}
+
+func Run(files []string, threshold int) ([]printer.Issue, error) {
+ fchan := make(chan string, 1024)
+ go func() {
+ for _, f := range files {
+ fchan <- f
+ }
+ close(fchan)
+ }()
+ schan := job.Parse(fchan)
+ t, data, done := job.BuildTree(schan)
+ <-done
+
+ // finish stream
+ t.Update(&syntax.Node{Type: -1})
+
+ mchan := t.FindDuplOver(threshold)
+ duplChan := make(chan syntax.Match)
+ go func() {
+ for m := range mchan {
+ match := syntax.FindSyntaxUnits(*data, m, threshold)
+ if len(match.Frags) > 0 {
+ duplChan <- match
+ }
+ }
+ close(duplChan)
+ }()
+
+ return makeIssues(duplChan)
+}
+
+func makeIssues(duplChan <-chan syntax.Match) ([]printer.Issue, error) {
+ groups := make(map[string][][]*syntax.Node)
+ for dupl := range duplChan {
+ groups[dupl.Hash] = append(groups[dupl.Hash], dupl.Frags...)
+ }
+ keys := make([]string, 0, len(groups))
+ for k := range groups {
+ keys = append(keys, k)
+ }
+ sort.Strings(keys)
+
+ p := printer.NewPlumbing(ioutil.ReadFile)
+
+ var issues []printer.Issue
+ for _, k := range keys {
+ uniq := unique(groups[k])
+ if len(uniq) > 1 {
+ i, err := p.MakeIssues(uniq)
+ if err != nil {
+ return nil, err
+ }
+ issues = append(issues, i...)
+ }
+ }
+
+ return issues, nil
+}
+
+func unique(group [][]*syntax.Node) [][]*syntax.Node {
+ fileMap := make(map[string]map[int]struct{})
+
+ var newGroup [][]*syntax.Node
+ for _, seq := range group {
+ node := seq[0]
+ file, ok := fileMap[node.Filename]
+ if !ok {
+ file = make(map[int]struct{})
+ fileMap[node.Filename] = file
+ }
+ if _, ok := file[node.Pos]; !ok {
+ file[node.Pos] = struct{}{}
+ newGroup = append(newGroup, seq)
+ }
+ }
+ return newGroup
+}
+
+func usage() {
+ fmt.Fprintln(os.Stderr, `Usage: dupl [flags] [paths]
+
+Paths:
+ If the given path is a file, dupl will use it regardless of
+ the file extension. If it is a directory, it will recursively
+ search for *.go files in that directory.
+
+ If no path is given, dupl will recursively search for *.go
+ files in the current directory.
+
+Flags:
+ -files
+ read file names from stdin one at each line
+ -html
+ output the results as HTML, including duplicate code fragments
+ -plumbing
+ plumbing (easy-to-parse) output for consumption by scripts or tools
+ -t, -threshold size
+ minimum token sequence size as a clone (default 15)
+ -vendor
+ check files in vendor directory
+ -v, -verbose
+ explain what is being done
+
+Examples:
+ dupl -t 100
+ Search clones in the current directory of size at least
+ 100 tokens.
+ dupl $(find app/ -name '*_test.go')
+ Search for clones in tests in the app directory.
+ find app/ -name '*_test.go' |dupl -files
+ The same as above.`)
+ os.Exit(2)
+}
diff --git a/vendor/github.com/golangci/dupl/printer/html.go b/vendor/github.com/golangci/dupl/printer/html.go
new file mode 100644
index 000000000..5ad9e25c7
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/printer/html.go
@@ -0,0 +1,120 @@
+package printer
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "regexp"
+ "sort"
+
+ "github.com/golangci/dupl/syntax"
+)
+
+type html struct {
+ iota int
+ w io.Writer
+ ReadFile
+}
+
+func NewHTML(w io.Writer, fread ReadFile) Printer {
+ return &html{w: w, ReadFile: fread}
+}
+
+func (p *html) PrintHeader() error {
+ _, err := fmt.Fprint(p.w, `<!DOCTYPE html>
+<meta charset="utf-8"/>
+<title>Duplicates</title>
+<style>
+ pre {
+ background-color: #FFD;
+ border: 1px solid #E2E2E2;
+ padding: 1ex;
+ }
+</style>
+`)
+ return err
+}
+
+func (p *html) PrintClones(dups [][]*syntax.Node) error {
+ p.iota++
+ fmt.Fprintf(p.w, "<h1>#%d found %d clones</h1>\n", p.iota, len(dups))
+
+ clones := make([]clone, len(dups))
+ for i, dup := range dups {
+ cnt := len(dup)
+ if cnt == 0 {
+ panic("zero length dup")
+ }
+ nstart := dup[0]
+ nend := dup[cnt-1]
+
+ file, err := p.ReadFile(nstart.Filename)
+ if err != nil {
+ return err
+ }
+
+ lineStart, _ := blockLines(file, nstart.Pos, nend.End)
+ cl := clone{filename: nstart.Filename, lineStart: lineStart}
+ start := findLineBeg(file, nstart.Pos)
+ content := append(toWhitespace(file[start:nstart.Pos]), file[nstart.Pos:nend.End]...)
+ cl.fragment = deindent(content)
+ clones[i] = cl
+ }
+
+ sort.Sort(byNameAndLine(clones))
+ for _, cl := range clones {
+ fmt.Fprintf(p.w, "<h2>%s:%d</h2>\n<pre>%s</pre>\n", cl.filename, cl.lineStart, cl.fragment)
+ }
+ return nil
+}
+
+func (*html) PrintFooter() error { return nil }
+
+func findLineBeg(file []byte, index int) int {
+ for i := index; i >= 0; i-- {
+ if file[i] == '\n' {
+ return i + 1
+ }
+ }
+ return 0
+}
+
+func toWhitespace(str []byte) []byte {
+ var out []byte
+ for _, c := range bytes.Runes(str) {
+ if c == '\t' {
+ out = append(out, '\t')
+ } else {
+ out = append(out, ' ')
+ }
+ }
+ return out
+}
+
+func deindent(block []byte) []byte {
+ const maxVal = 99
+ min := maxVal
+ re := regexp.MustCompile(`(^|\n)(\t*)\S`)
+ for _, line := range re.FindAllSubmatch(block, -1) {
+ indent := line[2]
+ if len(indent) < min {
+ min = len(indent)
+ }
+ }
+ if min == 0 || min == maxVal {
+ return block
+ }
+ block = block[min:]
+Loop:
+ for i := 0; i < len(block); i++ {
+ if block[i] == '\n' && i != len(block)-1 {
+ for j := 0; j < min; j++ {
+ if block[i+j+1] != '\t' {
+ continue Loop
+ }
+ }
+ block = append(block[:i+1], block[i+1+min:]...)
+ }
+ }
+ return block
+}
diff --git a/vendor/github.com/golangci/dupl/printer/plumbing.go b/vendor/github.com/golangci/dupl/printer/plumbing.go
new file mode 100644
index 000000000..cf39d01b7
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/printer/plumbing.go
@@ -0,0 +1,50 @@
+package printer
+
+import (
+ "sort"
+
+ "github.com/golangci/dupl/syntax"
+)
+
+type Clone clone
+
+func (c Clone) Filename() string {
+ return c.filename
+}
+
+func (c Clone) LineStart() int {
+ return c.lineStart
+}
+
+func (c Clone) LineEnd() int {
+ return c.lineEnd
+}
+
+type Issue struct {
+ From, To Clone
+}
+
+type Plumbing struct {
+ ReadFile
+}
+
+func NewPlumbing(fread ReadFile) *Plumbing {
+ return &Plumbing{fread}
+}
+
+func (p *Plumbing) MakeIssues(dups [][]*syntax.Node) ([]Issue, error) {
+ clones, err := prepareClonesInfo(p.ReadFile, dups)
+ if err != nil {
+ return nil, err
+ }
+ sort.Sort(byNameAndLine(clones))
+ var issues []Issue
+ for i, cl := range clones {
+ nextCl := clones[(i+1)%len(clones)]
+ issues = append(issues, Issue{
+ From: Clone(cl),
+ To: Clone(nextCl),
+ })
+ }
+ return issues, nil
+}
diff --git a/vendor/github.com/golangci/dupl/printer/printer.go b/vendor/github.com/golangci/dupl/printer/printer.go
new file mode 100644
index 000000000..385217bfc
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/printer/printer.go
@@ -0,0 +1,11 @@
+package printer
+
+import "github.com/golangci/dupl/syntax"
+
+type ReadFile func(filename string) ([]byte, error)
+
+type Printer interface {
+ PrintHeader() error
+ PrintClones(dups [][]*syntax.Node) error
+ PrintFooter() error
+}
diff --git a/vendor/github.com/golangci/dupl/printer/text.go b/vendor/github.com/golangci/dupl/printer/text.go
new file mode 100644
index 000000000..8359fa76f
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/printer/text.go
@@ -0,0 +1,100 @@
+package printer
+
+import (
+ "fmt"
+ "io"
+ "sort"
+
+ "github.com/golangci/dupl/syntax"
+)
+
+type text struct {
+ cnt int
+ w io.Writer
+ ReadFile
+}
+
+func NewText(w io.Writer, fread ReadFile) Printer {
+ return &text{w: w, ReadFile: fread}
+}
+
+func (p *text) PrintHeader() error { return nil }
+
+func (p *text) PrintClones(dups [][]*syntax.Node) error {
+ p.cnt++
+ fmt.Fprintf(p.w, "found %d clones:\n", len(dups))
+ clones, err := prepareClonesInfo(p.ReadFile, dups)
+ if err != nil {
+ return err
+ }
+ sort.Sort(byNameAndLine(clones))
+ for _, cl := range clones {
+ fmt.Fprintf(p.w, " %s:%d,%d\n", cl.filename, cl.lineStart, cl.lineEnd)
+ }
+ return nil
+}
+
+func (p *text) PrintFooter() error {
+ _, err := fmt.Fprintf(p.w, "\nFound total %d clone groups.\n", p.cnt)
+ return err
+}
+
+func prepareClonesInfo(fread ReadFile, dups [][]*syntax.Node) ([]clone, error) {
+ clones := make([]clone, len(dups))
+ for i, dup := range dups {
+ cnt := len(dup)
+ if cnt == 0 {
+ panic("zero length dup")
+ }
+ nstart := dup[0]
+ nend := dup[cnt-1]
+
+ file, err := fread(nstart.Filename)
+ if err != nil {
+ return nil, err
+ }
+
+ cl := clone{filename: nstart.Filename}
+ cl.lineStart, cl.lineEnd = blockLines(file, nstart.Pos, nend.End)
+ clones[i] = cl
+ }
+ return clones, nil
+}
+
+func blockLines(file []byte, from, to int) (int, int) {
+ line := 1
+ lineStart, lineEnd := 0, 0
+ for offset, b := range file {
+ if b == '\n' {
+ line++
+ }
+ if offset == from {
+ lineStart = line
+ }
+ if offset == to-1 {
+ lineEnd = line
+ break
+ }
+ }
+ return lineStart, lineEnd
+}
+
+type clone struct {
+ filename string
+ lineStart int
+ lineEnd int
+ fragment []byte
+}
+
+type byNameAndLine []clone
+
+func (c byNameAndLine) Len() int { return len(c) }
+
+func (c byNameAndLine) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
+
+func (c byNameAndLine) Less(i, j int) bool {
+ if c[i].filename == c[j].filename {
+ return c[i].lineStart < c[j].lineStart
+ }
+ return c[i].filename < c[j].filename
+}
diff --git a/vendor/github.com/golangci/dupl/suffixtree/dupl.go b/vendor/github.com/golangci/dupl/suffixtree/dupl.go
new file mode 100644
index 000000000..ab145b4f3
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/suffixtree/dupl.go
@@ -0,0 +1,98 @@
+package suffixtree
+
+import "sort"
+
+type Match struct {
+ Ps []Pos
+ Len Pos
+}
+
+type posList struct {
+ positions []Pos
+}
+
+func newPosList() *posList {
+ return &posList{make([]Pos, 0)}
+}
+
+func (p *posList) append(p2 *posList) {
+ p.positions = append(p.positions, p2.positions...)
+}
+
+func (p *posList) add(pos Pos) {
+ p.positions = append(p.positions, pos)
+}
+
+type contextList struct {
+ lists map[int]*posList
+}
+
+func newContextList() *contextList {
+ return &contextList{make(map[int]*posList)}
+}
+
+func (c *contextList) getAll() []Pos {
+ keys := make([]int, 0, len(c.lists))
+ for k := range c.lists {
+ keys = append(keys, k)
+ }
+ sort.Ints(keys)
+ var ps []Pos
+ for _, k := range keys {
+ ps = append(ps, c.lists[k].positions...)
+ }
+ return ps
+}
+
+func (c *contextList) append(c2 *contextList) {
+ for lc, pl := range c2.lists {
+ if _, ok := c.lists[lc]; ok {
+ c.lists[lc].append(pl)
+ } else {
+ c.lists[lc] = pl
+ }
+ }
+}
+
+// FindDuplOver find pairs of maximal duplicities over a threshold
+// length.
+func (t *STree) FindDuplOver(threshold int) <-chan Match {
+ auxTran := newTran(0, 0, t.root)
+ ch := make(chan Match)
+ go func() {
+ walkTrans(auxTran, 0, threshold, ch)
+ close(ch)
+ }()
+ return ch
+}
+
+func walkTrans(parent *tran, length, threshold int, ch chan<- Match) *contextList {
+ s := parent.state
+
+ cl := newContextList()
+
+ if len(s.trans) == 0 {
+ pl := newPosList()
+ start := parent.end + 1 - Pos(length)
+ pl.add(start)
+ ch := 0
+ if start > 0 {
+ ch = s.tree.data[start-1].Val()
+ }
+ cl.lists[ch] = pl
+ return cl
+ }
+
+ for _, t := range s.trans {
+ ln := length + t.len()
+ cl2 := walkTrans(t, ln, threshold, ch)
+ if ln >= threshold {
+ cl.append(cl2)
+ }
+ }
+ if length >= threshold && len(cl.lists) > 1 {
+ m := Match{cl.getAll(), Pos(length)}
+ ch <- m
+ }
+ return cl
+}
diff --git a/vendor/github.com/golangci/dupl/suffixtree/suffixtree.go b/vendor/github.com/golangci/dupl/suffixtree/suffixtree.go
new file mode 100644
index 000000000..738015025
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/suffixtree/suffixtree.go
@@ -0,0 +1,216 @@
+package suffixtree
+
+import (
+ "bytes"
+ "fmt"
+ "math"
+ "strings"
+)
+
+const infinity = math.MaxInt32
+
+// Pos denotes position in data slice.
+type Pos int32
+
+type Token interface {
+ Val() int
+}
+
+// STree is a struct representing a suffix tree.
+type STree struct {
+ data []Token
+ root *state
+ auxState *state // auxiliary state
+
+ // active point
+ s *state
+ start, end Pos
+}
+
+// New creates new suffix tree.
+func New() *STree {
+ t := new(STree)
+ t.data = make([]Token, 0, 50)
+ t.root = newState(t)
+ t.auxState = newState(t)
+ t.root.linkState = t.auxState
+ t.s = t.root
+ return t
+}
+
+// Update refreshes the suffix tree to by new data.
+func (t *STree) Update(data ...Token) {
+ t.data = append(t.data, data...)
+ for _ = range data {
+ t.update()
+ t.s, t.start = t.canonize(t.s, t.start, t.end)
+ t.end++
+ }
+}
+
+// update transforms suffix tree T(n) to T(n+1).
+func (t *STree) update() {
+ oldr := t.root
+
+ // (s, (start, end)) is the canonical reference pair for the active point
+ s := t.s
+ start, end := t.start, t.end
+ var r *state
+ for {
+ var endPoint bool
+ r, endPoint = t.testAndSplit(s, start, end-1)
+ if endPoint {
+ break
+ }
+ r.fork(end)
+ if oldr != t.root {
+ oldr.linkState = r
+ }
+ oldr = r
+ s, start = t.canonize(s.linkState, start, end-1)
+ }
+ if oldr != t.root {
+ oldr.linkState = r
+ }
+
+ // update active point
+ t.s = s
+ t.start = start
+}
+
+// testAndSplit tests whether a state with canonical ref. pair
+// (s, (start, end)) is the end point, that is, a state that have
+// a c-transition. If not, then state (exs, (start, end)) is made
+// explicit (if not already so).
+func (t *STree) testAndSplit(s *state, start, end Pos) (exs *state, endPoint bool) {
+ c := t.data[t.end]
+ if start <= end {
+ tr := s.findTran(t.data[start])
+ splitPoint := tr.start + end - start + 1
+ if t.data[splitPoint].Val() == c.Val() {
+ return s, true
+ }
+ // make the (s, (start, end)) state explicit
+ newSt := newState(s.tree)
+ newSt.addTran(splitPoint, tr.end, tr.state)
+ tr.end = splitPoint - 1
+ tr.state = newSt
+ return newSt, false
+ }
+ if s == t.auxState || s.findTran(c) != nil {
+ return s, true
+ }
+ return s, false
+}
+
+// canonize returns updated state and start position for ref. pair
+// (s, (start, end)) of state r so the new ref. pair is canonical,
+// that is, referenced from the closest explicit ancestor of r.
+func (t *STree) canonize(s *state, start, end Pos) (*state, Pos) {
+ if s == t.auxState {
+ s, start = t.root, start+1
+ }
+ if start > end {
+ return s, start
+ }
+
+ var tr *tran
+ for {
+ if start <= end {
+ tr = s.findTran(t.data[start])
+ if tr == nil {
+ panic(fmt.Sprintf("there should be some transition for '%d' at %d",
+ t.data[start].Val(), start))
+ }
+ }
+ if tr.end-tr.start > end-start {
+ break
+ }
+ start += tr.end - tr.start + 1
+ s = tr.state
+ }
+ if s == nil {
+ panic("there should always be some suffix link resolution")
+ }
+ return s, start
+}
+
+func (t *STree) At(p Pos) Token {
+ if p < 0 || p >= Pos(len(t.data)) {
+ panic("position out of bounds")
+ }
+ return t.data[p]
+}
+
+func (t *STree) String() string {
+ buf := new(bytes.Buffer)
+ printState(buf, t.root, 0)
+ return buf.String()
+}
+
+func printState(buf *bytes.Buffer, s *state, ident int) {
+ for _, tr := range s.trans {
+ fmt.Fprint(buf, strings.Repeat(" ", ident))
+ fmt.Fprintf(buf, "* (%d, %d)\n", tr.start, tr.ActEnd())
+ printState(buf, tr.state, ident+1)
+ }
+}
+
+// state is an explicit state of the suffix tree.
+type state struct {
+ tree *STree
+ trans []*tran
+ linkState *state
+}
+
+func newState(t *STree) *state {
+ return &state{
+ tree: t,
+ trans: make([]*tran, 0),
+ linkState: nil,
+ }
+}
+
+func (s *state) addTran(start, end Pos, r *state) {
+ s.trans = append(s.trans, newTran(start, end, r))
+}
+
+// fork creates a new branch from the state s.
+func (s *state) fork(i Pos) *state {
+ r := newState(s.tree)
+ s.addTran(i, infinity, r)
+ return r
+}
+
+// findTran finds c-transition.
+func (s *state) findTran(c Token) *tran {
+ for _, tran := range s.trans {
+ if s.tree.data[tran.start].Val() == c.Val() {
+ return tran
+ }
+ }
+ return nil
+}
+
+// tran represents a state's transition.
+type tran struct {
+ start, end Pos
+ state *state
+}
+
+func newTran(start, end Pos, s *state) *tran {
+ return &tran{start, end, s}
+}
+
+func (t *tran) len() int {
+ return int(t.end - t.start + 1)
+}
+
+// ActEnd returns actual end position as consistent with
+// the actual length of the data in the STree.
+func (t *tran) ActEnd() Pos {
+ if t.end == infinity {
+ return Pos(len(t.state.tree.data)) - 1
+ }
+ return t.end
+}
diff --git a/vendor/github.com/golangci/dupl/syntax/golang/golang.go b/vendor/github.com/golangci/dupl/syntax/golang/golang.go
new file mode 100644
index 000000000..a0b1e77e1
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/syntax/golang/golang.go
@@ -0,0 +1,392 @@
+package golang
+
+import (
+ "go/ast"
+ "go/parser"
+ "go/token"
+
+ "github.com/golangci/dupl/syntax"
+)
+
+const (
+ BadNode = iota
+ File
+ ArrayType
+ AssignStmt
+ BasicLit
+ BinaryExpr
+ BlockStmt
+ BranchStmt
+ CallExpr
+ CaseClause
+ ChanType
+ CommClause
+ CompositeLit
+ DeclStmt
+ DeferStmt
+ Ellipsis
+ EmptyStmt
+ ExprStmt
+ Field
+ FieldList
+ ForStmt
+ FuncDecl
+ FuncLit
+ FuncType
+ GenDecl
+ GoStmt
+ Ident
+ IfStmt
+ IncDecStmt
+ IndexExpr
+ InterfaceType
+ KeyValueExpr
+ LabeledStmt
+ MapType
+ ParenExpr
+ RangeStmt
+ ReturnStmt
+ SelectStmt
+ SelectorExpr
+ SendStmt
+ SliceExpr
+ StarExpr
+ StructType
+ SwitchStmt
+ TypeAssertExpr
+ TypeSpec
+ TypeSwitchStmt
+ UnaryExpr
+ ValueSpec
+)
+
+// Parse the given file and return uniform syntax tree.
+func Parse(filename string) (*syntax.Node, error) {
+ fset := token.NewFileSet()
+ file, err := parser.ParseFile(fset, filename, nil, 0)
+ if err != nil {
+ return nil, err
+ }
+ t := &transformer{
+ fileset: fset,
+ filename: filename,
+ }
+ return t.trans(file), nil
+}
+
+type transformer struct {
+ fileset *token.FileSet
+ filename string
+}
+
+// trans transforms given golang AST to uniform tree structure.
+func (t *transformer) trans(node ast.Node) (o *syntax.Node) {
+ o = syntax.NewNode()
+ o.Filename = t.filename
+ st, end := node.Pos(), node.End()
+ o.Pos, o.End = t.fileset.File(st).Offset(st), t.fileset.File(end).Offset(end)
+
+ switch n := node.(type) {
+ case *ast.ArrayType:
+ o.Type = ArrayType
+ if n.Len != nil {
+ o.AddChildren(t.trans(n.Len))
+ }
+ o.AddChildren(t.trans(n.Elt))
+
+ case *ast.AssignStmt:
+ o.Type = AssignStmt
+ for _, e := range n.Rhs {
+ o.AddChildren(t.trans(e))
+ }
+
+ for _, e := range n.Lhs {
+ o.AddChildren(t.trans(e))
+ }
+
+ case *ast.BasicLit:
+ o.Type = BasicLit
+
+ case *ast.BinaryExpr:
+ o.Type = BinaryExpr
+ o.AddChildren(t.trans(n.X), t.trans(n.Y))
+
+ case *ast.BlockStmt:
+ o.Type = BlockStmt
+ for _, stmt := range n.List {
+ o.AddChildren(t.trans(stmt))
+ }
+
+ case *ast.BranchStmt:
+ o.Type = BranchStmt
+ if n.Label != nil {
+ o.AddChildren(t.trans(n.Label))
+ }
+
+ case *ast.CallExpr:
+ o.Type = CallExpr
+ o.AddChildren(t.trans(n.Fun))
+ for _, arg := range n.Args {
+ o.AddChildren(t.trans(arg))
+ }
+
+ case *ast.CaseClause:
+ o.Type = CaseClause
+ for _, e := range n.List {
+ o.AddChildren(t.trans(e))
+ }
+ for _, stmt := range n.Body {
+ o.AddChildren(t.trans(stmt))
+ }
+
+ case *ast.ChanType:
+ o.Type = ChanType
+ o.AddChildren(t.trans(n.Value))
+
+ case *ast.CommClause:
+ o.Type = CommClause
+ if n.Comm != nil {
+ o.AddChildren(t.trans(n.Comm))
+ }
+ for _, stmt := range n.Body {
+ o.AddChildren(t.trans(stmt))
+ }
+
+ case *ast.CompositeLit:
+ o.Type = CompositeLit
+ if n.Type != nil {
+ o.AddChildren(t.trans(n.Type))
+ }
+ for _, e := range n.Elts {
+ o.AddChildren(t.trans(e))
+ }
+
+ case *ast.DeclStmt:
+ o.Type = DeclStmt
+ o.AddChildren(t.trans(n.Decl))
+
+ case *ast.DeferStmt:
+ o.Type = DeferStmt
+ o.AddChildren(t.trans(n.Call))
+
+ case *ast.Ellipsis:
+ o.Type = Ellipsis
+ if n.Elt != nil {
+ o.AddChildren(t.trans(n.Elt))
+ }
+
+ case *ast.EmptyStmt:
+ o.Type = EmptyStmt
+
+ case *ast.ExprStmt:
+ o.Type = ExprStmt
+ o.AddChildren(t.trans(n.X))
+
+ case *ast.Field:
+ o.Type = Field
+ for _, name := range n.Names {
+ o.AddChildren(t.trans(name))
+ }
+ o.AddChildren(t.trans(n.Type))
+
+ case *ast.FieldList:
+ o.Type = FieldList
+ for _, field := range n.List {
+ o.AddChildren(t.trans(field))
+ }
+
+ case *ast.File:
+ o.Type = File
+ for _, decl := range n.Decls {
+ if genDecl, ok := decl.(*ast.GenDecl); ok && genDecl.Tok == token.IMPORT {
+ // skip import declarations
+ continue
+ }
+ o.AddChildren(t.trans(decl))
+ }
+
+ case *ast.ForStmt:
+ o.Type = ForStmt
+ if n.Init != nil {
+ o.AddChildren(t.trans(n.Init))
+ }
+ if n.Cond != nil {
+ o.AddChildren(t.trans(n.Cond))
+ }
+ if n.Post != nil {
+ o.AddChildren(t.trans(n.Post))
+ }
+ o.AddChildren(t.trans(n.Body))
+
+ case *ast.FuncDecl:
+ o.Type = FuncDecl
+ if n.Recv != nil {
+ o.AddChildren(t.trans(n.Recv))
+ }
+ o.AddChildren(t.trans(n.Name), t.trans(n.Type))
+ if n.Body != nil {
+ o.AddChildren(t.trans(n.Body))
+ }
+
+ case *ast.FuncLit:
+ o.Type = FuncLit
+ o.AddChildren(t.trans(n.Type), t.trans(n.Body))
+
+ case *ast.FuncType:
+ o.Type = FuncType
+ o.AddChildren(t.trans(n.Params))
+ if n.Results != nil {
+ o.AddChildren(t.trans(n.Results))
+ }
+
+ case *ast.GenDecl:
+ o.Type = GenDecl
+ for _, spec := range n.Specs {
+ o.AddChildren(t.trans(spec))
+ }
+
+ case *ast.GoStmt:
+ o.Type = GoStmt
+ o.AddChildren(t.trans(n.Call))
+
+ case *ast.Ident:
+ o.Type = Ident
+
+ case *ast.IfStmt:
+ o.Type = IfStmt
+ if n.Init != nil {
+ o.AddChildren(t.trans(n.Init))
+ }
+ o.AddChildren(t.trans(n.Cond), t.trans(n.Body))
+ if n.Else != nil {
+ o.AddChildren(t.trans(n.Else))
+ }
+
+ case *ast.IncDecStmt:
+ o.Type = IncDecStmt
+ o.AddChildren(t.trans(n.X))
+
+ case *ast.IndexExpr:
+ o.Type = IndexExpr
+ o.AddChildren(t.trans(n.X), t.trans(n.Index))
+
+ case *ast.InterfaceType:
+ o.Type = InterfaceType
+ o.AddChildren(t.trans(n.Methods))
+
+ case *ast.KeyValueExpr:
+ o.Type = KeyValueExpr
+ o.AddChildren(t.trans(n.Key), t.trans(n.Value))
+
+ case *ast.LabeledStmt:
+ o.Type = LabeledStmt
+ o.AddChildren(t.trans(n.Label), t.trans(n.Stmt))
+
+ case *ast.MapType:
+ o.Type = MapType
+ o.AddChildren(t.trans(n.Key), t.trans(n.Value))
+
+ case *ast.ParenExpr:
+ o.Type = ParenExpr
+ o.AddChildren(t.trans(n.X))
+
+ case *ast.RangeStmt:
+ o.Type = RangeStmt
+ if n.Key != nil {
+ o.AddChildren(t.trans(n.Key))
+ }
+ if n.Value != nil {
+ o.AddChildren(t.trans(n.Value))
+ }
+ o.AddChildren(t.trans(n.X), t.trans(n.Body))
+
+ case *ast.ReturnStmt:
+ o.Type = ReturnStmt
+ for _, e := range n.Results {
+ o.AddChildren(t.trans(e))
+ }
+
+ case *ast.SelectStmt:
+ o.Type = SelectStmt
+ o.AddChildren(t.trans(n.Body))
+
+ case *ast.SelectorExpr:
+ o.Type = SelectorExpr
+ o.AddChildren(t.trans(n.X), t.trans(n.Sel))
+
+ case *ast.SendStmt:
+ o.Type = SendStmt
+ o.AddChildren(t.trans(n.Chan), t.trans(n.Value))
+
+ case *ast.SliceExpr:
+ o.Type = SliceExpr
+ o.AddChildren(t.trans(n.X))
+ if n.Low != nil {
+ o.AddChildren(t.trans(n.Low))
+ }
+ if n.High != nil {
+ o.AddChildren(t.trans(n.High))
+ }
+ if n.Max != nil {
+ o.AddChildren(t.trans(n.Max))
+ }
+
+ case *ast.StarExpr:
+ o.Type = StarExpr
+ o.AddChildren(t.trans(n.X))
+
+ case *ast.StructType:
+ o.Type = StructType
+ o.AddChildren(t.trans(n.Fields))
+
+ case *ast.SwitchStmt:
+ o.Type = SwitchStmt
+ if n.Init != nil {
+ o.AddChildren(t.trans(n.Init))
+ }
+ if n.Tag != nil {
+ o.AddChildren(t.trans(n.Tag))
+ }
+ o.AddChildren(t.trans(n.Body))
+
+ case *ast.TypeAssertExpr:
+ o.Type = TypeAssertExpr
+ o.AddChildren(t.trans(n.X))
+ if n.Type != nil {
+ o.AddChildren(t.trans(n.Type))
+ }
+
+ case *ast.TypeSpec:
+ o.Type = TypeSpec
+ o.AddChildren(t.trans(n.Name), t.trans(n.Type))
+
+ case *ast.TypeSwitchStmt:
+ o.Type = TypeSwitchStmt
+ if n.Init != nil {
+ o.AddChildren(t.trans(n.Init))
+ }
+ o.AddChildren(t.trans(n.Assign), t.trans(n.Body))
+
+ case *ast.UnaryExpr:
+ o.Type = UnaryExpr
+ o.AddChildren(t.trans(n.X))
+
+ case *ast.ValueSpec:
+ o.Type = ValueSpec
+ for _, name := range n.Names {
+ o.AddChildren(t.trans(name))
+ }
+ if n.Type != nil {
+ o.AddChildren(t.trans(n.Type))
+ }
+ for _, val := range n.Values {
+ o.AddChildren(t.trans(val))
+ }
+
+ default:
+ o.Type = BadNode
+
+ }
+
+ return o
+}
diff --git a/vendor/github.com/golangci/dupl/syntax/syntax.go b/vendor/github.com/golangci/dupl/syntax/syntax.go
new file mode 100644
index 000000000..e2c750afd
--- /dev/null
+++ b/vendor/github.com/golangci/dupl/syntax/syntax.go
@@ -0,0 +1,175 @@
+package syntax
+
+import (
+ "crypto/sha1"
+
+ "github.com/golangci/dupl/suffixtree"
+)
+
+type Node struct {
+ Type int
+ Filename string
+ Pos, End int
+ Children []*Node
+ Owns int
+}
+
+func NewNode() *Node {
+ return &Node{}
+}
+
+func (n *Node) AddChildren(children ...*Node) {
+ n.Children = append(n.Children, children...)
+}
+
+func (n *Node) Val() int {
+ return n.Type
+}
+
+type Match struct {
+ Hash string
+ Frags [][]*Node
+}
+
+func Serialize(n *Node) []*Node {
+ stream := make([]*Node, 0, 10)
+ serial(n, &stream)
+ return stream
+}
+
+func serial(n *Node, stream *[]*Node) int {
+ *stream = append(*stream, n)
+ var count int
+ for _, child := range n.Children {
+ count += serial(child, stream)
+ }
+ n.Owns = count
+ return count + 1
+}
+
+// FindSyntaxUnits finds all complete syntax units in the match group and returns them
+// with the corresponding hash.
+func FindSyntaxUnits(data []*Node, m suffixtree.Match, threshold int) Match {
+ if len(m.Ps) == 0 {
+ return Match{}
+ }
+ firstSeq := data[m.Ps[0] : m.Ps[0]+m.Len]
+ indexes := getUnitsIndexes(firstSeq, threshold)
+
+ // TODO: is this really working?
+ indexCnt := len(indexes)
+ if indexCnt > 0 {
+ lasti := indexes[indexCnt-1]
+ firstn := firstSeq[lasti]
+ for i := 1; i < len(m.Ps); i++ {
+ n := data[int(m.Ps[i])+lasti]
+ if firstn.Owns != n.Owns {
+ indexes = indexes[:indexCnt-1]
+ break
+ }
+ }
+ }
+ if len(indexes) == 0 || isCyclic(indexes, firstSeq) || spansMultipleFiles(indexes, firstSeq) {
+ return Match{}
+ }
+
+ match := Match{Frags: make([][]*Node, len(m.Ps))}
+ for i, pos := range m.Ps {
+ match.Frags[i] = make([]*Node, len(indexes))
+ for j, index := range indexes {
+ match.Frags[i][j] = data[int(pos)+index]
+ }
+ }
+
+ lastIndex := indexes[len(indexes)-1]
+ match.Hash = hashSeq(firstSeq[indexes[0] : lastIndex+firstSeq[lastIndex].Owns])
+ return match
+}
+
+func getUnitsIndexes(nodeSeq []*Node, threshold int) []int {
+ var indexes []int
+ var split bool
+ for i := 0; i < len(nodeSeq); {
+ n := nodeSeq[i]
+ switch {
+ case n.Owns >= len(nodeSeq)-i:
+ // not complete syntax unit
+ i++
+ split = true
+ continue
+ case n.Owns+1 < threshold:
+ split = true
+ default:
+ if split {
+ indexes = indexes[:0]
+ split = false
+ }
+ indexes = append(indexes, i)
+ }
+ i += n.Owns + 1
+ }
+ return indexes
+}
+
+// isCyclic finds out whether there is a repetive pattern in the found clone. If positive,
+// it return false to point out that the clone would be redundant.
+func isCyclic(indexes []int, nodes []*Node) bool {
+ cnt := len(indexes)
+ if cnt <= 1 {
+ return false
+ }
+
+ alts := make(map[int]bool)
+ for i := 1; i <= cnt/2; i++ {
+ if cnt%i == 0 {
+ alts[i] = true
+ }
+ }
+
+ for i := 0; i < indexes[cnt/2]; i++ {
+ nstart := nodes[i+indexes[0]]
+ AltLoop:
+ for alt := range alts {
+ for j := alt; j < cnt; j += alt {
+ index := i + indexes[j]
+ if index < len(nodes) {
+ nalt := nodes[index]
+ if nstart.Owns == nalt.Owns && nstart.Type == nalt.Type {
+ continue
+ }
+ } else if i >= indexes[alt] {
+ return true
+ }
+ delete(alts, alt)
+ continue AltLoop
+ }
+ }
+ if len(alts) == 0 {
+ return false
+ }
+ }
+ return true
+}
+
+func spansMultipleFiles(indexes []int, nodes []*Node) bool {
+ if len(indexes) < 2 {
+ return false
+ }
+ f := nodes[indexes[0]].Filename
+ for i := 1; i < len(indexes); i++ {
+ if nodes[indexes[i]].Filename != f {
+ return true
+ }
+ }
+ return false
+}
+
+func hashSeq(nodes []*Node) string {
+ h := sha1.New()
+ bytes := make([]byte, len(nodes))
+ for i, node := range nodes {
+ bytes[i] = byte(node.Type)
+ }
+ h.Write(bytes)
+ return string(h.Sum(nil))
+}
diff --git a/vendor/github.com/golangci/errcheck/LICENSE b/vendor/github.com/golangci/errcheck/LICENSE
new file mode 100644
index 000000000..a2b16b5bd
--- /dev/null
+++ b/vendor/github.com/golangci/errcheck/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2013 Kamil Kisiel
+
+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.
diff --git a/vendor/github.com/golangci/errcheck/golangci/golangci.go b/vendor/github.com/golangci/errcheck/golangci/golangci.go
new file mode 100644
index 000000000..1095adeb4
--- /dev/null
+++ b/vendor/github.com/golangci/errcheck/golangci/golangci.go
@@ -0,0 +1,85 @@
+package golangci
+
+import (
+ "regexp"
+
+ "github.com/golangci/errcheck/internal/errcheck"
+ "golang.org/x/tools/go/loader"
+)
+
+var dotStar = regexp.MustCompile(".*")
+
+type Issue errcheck.UncheckedError
+
+func Run(program *loader.Program, checkBlank, checkAsserts bool) ([]Issue, error) {
+ return RunWithConfig(program, &Config{
+ Blank: checkBlank,
+ Asserts: checkAsserts,
+ })
+}
+
+// Config is a copy of the `errcheck.Checker` with exported `Exclude` field.
+type Config struct {
+ // ignore is a map of package names to regular expressions. Identifiers from a package are
+ // checked against its regular expressions and if any of the expressions match the call
+ // is not checked.
+ Ignore map[string]*regexp.Regexp
+
+ // If blank is true then assignments to the blank identifier are also considered to be
+ // ignored errors.
+ Blank bool
+
+ // If asserts is true then ignored type assertion results are also checked
+ Asserts bool
+
+ // build tags
+ Tags []string
+
+ Verbose bool
+
+ // If true, checking of _test.go files is disabled
+ WithoutTests bool
+
+ // Excluded functions.
+ Exclude map[string]bool
+}
+
+// RunWithConfig runs the `errchecker` linter with all its options.
+func RunWithConfig(program *loader.Program, c *Config) ([]Issue, error) {
+ checker := errcheck.NewChecker()
+ checker.Tags = c.Tags
+ checker.Blank = c.Blank
+ checker.Asserts = c.Asserts
+ checker.Verbose = c.Verbose
+ checker.WithoutTests = c.WithoutTests
+
+ checker.SetExclude(c.Exclude)
+
+ checker.Ignore = map[string]*regexp.Regexp{}
+ for pkg, re := range c.Ignore {
+ checker.Ignore[pkg] = re
+ }
+
+ if err := checker.CheckProgram(program); err != nil {
+ if e, ok := err.(*errcheck.UncheckedErrors); ok {
+ return makeIssues(e), nil
+ }
+ if err == errcheck.ErrNoGoFiles {
+ return nil, nil
+ }
+
+ return nil, err
+ }
+
+ // no issues
+ return nil, nil
+}
+
+func makeIssues(e *errcheck.UncheckedErrors) []Issue {
+ var ret []Issue
+ for _, uncheckedError := range e.Errors {
+ ret = append(ret, Issue(uncheckedError))
+ }
+
+ return ret
+}
diff --git a/vendor/github.com/golangci/errcheck/internal/errcheck/errcheck.go b/vendor/github.com/golangci/errcheck/internal/errcheck/errcheck.go
new file mode 100644
index 000000000..2a698fcee
--- /dev/null
+++ b/vendor/github.com/golangci/errcheck/internal/errcheck/errcheck.go
@@ -0,0 +1,538 @@
+// Package errcheck is the library used to implement the errcheck command-line tool.
+//
+// Note: The API of this package has not been finalized and may change at any point.
+package errcheck
+
+import (
+ "bufio"
+ "errors"
+ "fmt"
+ "go/ast"
+ "go/build"
+ "go/token"
+ "go/types"
+ "os"
+ "regexp"
+ "sort"
+ "strings"
+ "sync"
+
+ "golang.org/x/tools/go/loader"
+)
+
+var errorType *types.Interface
+
+func init() {
+ errorType = types.Universe.Lookup("error").Type().Underlying().(*types.Interface)
+
+}
+
+var (
+ // ErrNoGoFiles is returned when CheckPackage is run on a package with no Go source files
+ ErrNoGoFiles = errors.New("package contains no go source files")
+)
+
+// UncheckedError indicates the position of an unchecked error return.
+type UncheckedError struct {
+ Pos token.Position
+ Line string
+ FuncName string
+}
+
+// UncheckedErrors is returned from the CheckPackage function if the package contains
+// any unchecked errors.
+// Errors should be appended using the Append method, which is safe to use concurrently.
+type UncheckedErrors struct {
+ mu sync.Mutex
+
+ // Errors is a list of all the unchecked errors in the package.
+ // Printing an error reports its position within the file and the contents of the line.
+ Errors []UncheckedError
+}
+
+func (e *UncheckedErrors) Append(errors ...UncheckedError) {
+ e.mu.Lock()
+ defer e.mu.Unlock()
+ e.Errors = append(e.Errors, errors...)
+}
+
+func (e *UncheckedErrors) Error() string {
+ return fmt.Sprintf("%d unchecked errors", len(e.Errors))
+}
+
+// Len is the number of elements in the collection.
+func (e *UncheckedErrors) Len() int { return len(e.Errors) }
+
+// Swap swaps the elements with indexes i and j.
+func (e *UncheckedErrors) Swap(i, j int) { e.Errors[i], e.Errors[j] = e.Errors[j], e.Errors[i] }
+
+type byName struct{ *UncheckedErrors }
+
+// Less reports whether the element with index i should sort before the element with index j.
+func (e byName) Less(i, j int) bool {
+ ei, ej := e.Errors[i], e.Errors[j]
+
+ pi, pj := ei.Pos, ej.Pos
+
+ if pi.Filename != pj.Filename {
+ return pi.Filename < pj.Filename
+ }
+ if pi.Line != pj.Line {
+ return pi.Line < pj.Line
+ }
+ if pi.Column != pj.Column {
+ return pi.Column < pj.Column
+ }
+
+ return ei.Line < ej.Line
+}
+
+type Checker struct {
+ // ignore is a map of package names to regular expressions. Identifiers from a package are
+ // checked against its regular expressions and if any of the expressions match the call
+ // is not checked.
+ Ignore map[string]*regexp.Regexp
+
+ // If blank is true then assignments to the blank identifier are also considered to be
+ // ignored errors.
+ Blank bool
+
+ // If asserts is true then ignored type assertion results are also checked
+ Asserts bool
+
+ // build tags
+ Tags []string
+
+ Verbose bool
+
+ // If true, checking of _test.go files is disabled
+ WithoutTests bool
+
+ exclude map[string]bool
+}
+
+func NewChecker() *Checker {
+ c := Checker{}
+ c.SetExclude(map[string]bool{})
+ return &c
+}
+
+func (c *Checker) SetExclude(l map[string]bool) {
+ // Default exclude for stdlib functions
+ c.exclude = map[string]bool{
+ "math/rand.Read": true,
+ "(*math/rand.Rand).Read": true,
+
+ "(*bytes.Buffer).Write": true,
+ "(*bytes.Buffer).WriteByte": true,
+ "(*bytes.Buffer).WriteRune": true,
+ "(*bytes.Buffer).WriteString": true,
+
+ "(*strings.Builder).Write": true,
+ "(*strings.Builder).WriteByte": true,
+ "(*strings.Builder).WriteRune": true,
+ "(*strings.Builder).WriteString": true,
+ }
+ for k := range l {
+ c.exclude[k] = true
+ }
+}
+
+func (c *Checker) logf(msg string, args ...interface{}) {
+ if c.Verbose {
+ fmt.Fprintf(os.Stderr, msg+"\n", args...)
+ }
+}
+
+func (c *Checker) load(paths ...string) (*loader.Program, error) {
+ ctx := build.Default
+ for _, tag := range c.Tags {
+ ctx.BuildTags = append(ctx.BuildTags, tag)
+ }
+ loadcfg := loader.Config{
+ Build: &ctx,
+ }
+ rest, err := loadcfg.FromArgs(paths, !c.WithoutTests)
+ if err != nil {
+ return nil, fmt.Errorf("could not parse arguments: %s", err)
+ }
+ if len(rest) > 0 {
+ return nil, fmt.Errorf("unhandled extra arguments: %v", rest)
+ }
+
+ return loadcfg.Load()
+}
+
+func (c *Checker) CheckProgram(program *loader.Program) error {
+ var wg sync.WaitGroup
+ u := &UncheckedErrors{}
+ for _, pkgInfo := range program.InitialPackages() {
+ if pkgInfo.Pkg.Path() == "unsafe" { // not a real package
+ continue
+ }
+
+ wg.Add(1)
+
+ go func(pkgInfo *loader.PackageInfo) {
+ defer wg.Done()
+ c.logf("Checking %s", pkgInfo.Pkg.Path())
+
+ v := &visitor{
+ prog: program,
+ pkg: pkgInfo,
+ ignore: c.Ignore,
+ blank: c.Blank,
+ asserts: c.Asserts,
+ lines: make(map[string][]string),
+ exclude: c.exclude,
+ errors: []UncheckedError{},
+ }
+
+ for _, astFile := range v.pkg.Files {
+ ast.Walk(v, astFile)
+ }
+ u.Append(v.errors...)
+ }(pkgInfo)
+ }
+
+ wg.Wait()
+ if u.Len() > 0 {
+ sort.Sort(byName{u})
+ return u
+ }
+ return nil
+}
+
+// CheckPackages checks packages for errors.
+func (c *Checker) CheckPackages(paths ...string) error {
+ program, err := c.load(paths...)
+ if err != nil {
+ return fmt.Errorf("could not type check: %s", err)
+ }
+
+ return c.CheckProgram(program)
+}
+
+// visitor implements the errcheck algorithm
+type visitor struct {
+ prog *loader.Program
+ pkg *loader.PackageInfo
+ ignore map[string]*regexp.Regexp
+ blank bool
+ asserts bool
+ lines map[string][]string
+ exclude map[string]bool
+
+ errors []UncheckedError
+}
+
+func getSelName(sel *ast.SelectorExpr) string {
+ if ident, ok := sel.X.(*ast.Ident); ok {
+ return fmt.Sprintf("%s.%s", ident.Name, sel.Sel.Name)
+ }
+
+ if s, ok := sel.X.(*ast.SelectorExpr); ok {
+ return fmt.Sprintf("%s.%s", getSelName(s), sel.Sel.Name)
+ }
+
+ return ""
+}
+
+func (v *visitor) fullNameForPrinting(call *ast.CallExpr) (string, bool) {
+ if ident, ok := call.Fun.(*ast.Ident); ok {
+ return ident.Name, true
+ }
+
+ sel, ok := call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return "", false
+ }
+
+ name := getSelName(sel)
+ if name != "" {
+ return name, true
+ }
+
+ fn, ok := v.pkg.ObjectOf(sel.Sel).(*types.Func)
+ if !ok {
+ // Shouldn't happen, but be paranoid
+ return "", false
+ }
+ // The name is fully qualified by the import path, possible type,
+ // function/method name and pointer receiver.
+ //
+ // TODO(dh): vendored packages will have /vendor/ in their name,
+ // thus not matching vendored standard library packages. If we
+ // want to support vendored stdlib packages, we need to implement
+ // FullName with our own logic.
+ return fn.FullName(), true
+}
+
+func (v *visitor) fullName(call *ast.CallExpr) (string, bool) {
+ if ident, ok := call.Fun.(*ast.Ident); ok {
+ return ident.Name, true
+ }
+
+ sel, ok := call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return "", false
+ }
+
+ fn, ok := v.pkg.ObjectOf(sel.Sel).(*types.Func)
+ if !ok {
+ // Shouldn't happen, but be paranoid
+ return "", false
+ }
+ // The name is fully qualified by the import path, possible type,
+ // function/method name and pointer receiver.
+ //
+ // TODO(dh): vendored packages will have /vendor/ in their name,
+ // thus not matching vendored standard library packages. If we
+ // want to support vendored stdlib packages, we need to implement
+ // FullName with our own logic.
+ return fn.FullName(), true
+}
+
+func (v *visitor) excludeCall(call *ast.CallExpr) bool {
+ if name, ok := v.fullName(call); ok {
+ return v.exclude[name]
+ }
+
+ return false
+}
+
+func (v *visitor) ignoreCall(call *ast.CallExpr) bool {
+ if v.excludeCall(call) {
+ return true
+ }
+
+ // Try to get an identifier.
+ // Currently only supports simple expressions:
+ // 1. f()
+ // 2. x.y.f()
+ var id *ast.Ident
+ switch exp := call.Fun.(type) {
+ case (*ast.Ident):
+ id = exp
+ case (*ast.SelectorExpr):
+ id = exp.Sel
+ default:
+ // eg: *ast.SliceExpr, *ast.IndexExpr
+ }
+
+ if id == nil {
+ return false
+ }
+
+ // If we got an identifier for the function, see if it is ignored
+ if re, ok := v.ignore[""]; ok && re.MatchString(id.Name) {
+ return true
+ }
+
+ if obj := v.pkg.Uses[id]; obj != nil {
+ if pkg := obj.Pkg(); pkg != nil {
+ if re, ok := v.ignore[pkg.Path()]; ok {
+ return re.MatchString(id.Name)
+ }
+
+ // if current package being considered is vendored, check to see if it should be ignored based
+ // on the unvendored path.
+ if nonVendoredPkg, ok := nonVendoredPkgPath(pkg.Path()); ok {
+ if re, ok := v.ignore[nonVendoredPkg]; ok {
+ return re.MatchString(id.Name)
+ }
+ }
+ }
+ }
+
+ return false
+}
+
+// nonVendoredPkgPath returns the unvendored version of the provided package path (or returns the provided path if it
+// does not represent a vendored path). The second return value is true if the provided package was vendored, false
+// otherwise.
+func nonVendoredPkgPath(pkgPath string) (string, bool) {
+ lastVendorIndex := strings.LastIndex(pkgPath, "/vendor/")
+ if lastVendorIndex == -1 {
+ return pkgPath, false
+ }
+ return pkgPath[lastVendorIndex+len("/vendor/"):], true
+}
+
+// errorsByArg returns a slice s such that
+// len(s) == number of return types of call
+// s[i] == true iff return type at position i from left is an error type
+func (v *visitor) errorsByArg(call *ast.CallExpr) []bool {
+ switch t := v.pkg.Types[call].Type.(type) {
+ case *types.Named:
+ // Single return
+ return []bool{isErrorType(t)}
+ case *types.Pointer:
+ // Single return via pointer
+ return []bool{isErrorType(t)}
+ case *types.Tuple:
+ // Multiple returns
+ s := make([]bool, t.Len())
+ for i := 0; i < t.Len(); i++ {
+ switch et := t.At(i).Type().(type) {
+ case *types.Named:
+ // Single return
+ s[i] = isErrorType(et)
+ case *types.Pointer:
+ // Single return via pointer
+ s[i] = isErrorType(et)
+ default:
+ s[i] = false
+ }
+ }
+ return s
+ }
+ return []bool{false}
+}
+
+func (v *visitor) callReturnsError(call *ast.CallExpr) bool {
+ if v.isRecover(call) {
+ return true
+ }
+ for _, isError := range v.errorsByArg(call) {
+ if isError {
+ return true
+ }
+ }
+ return false
+}
+
+// isRecover returns true if the given CallExpr is a call to the built-in recover() function.
+func (v *visitor) isRecover(call *ast.CallExpr) bool {
+ if fun, ok := call.Fun.(*ast.Ident); ok {
+ if _, ok := v.pkg.Uses[fun].(*types.Builtin); ok {
+ return fun.Name == "recover"
+ }
+ }
+ return false
+}
+
+func (v *visitor) addErrorAtPosition(position token.Pos, call *ast.CallExpr) {
+ pos := v.prog.Fset.Position(position)
+ lines, ok := v.lines[pos.Filename]
+ if !ok {
+ lines = readfile(pos.Filename)
+ v.lines[pos.Filename] = lines
+ }
+
+ line := "??"
+ if pos.Line-1 < len(lines) {
+ line = strings.TrimSpace(lines[pos.Line-1])
+ }
+
+ var name string
+ if call != nil {
+ name, _ = v.fullNameForPrinting(call)
+ }
+
+ v.errors = append(v.errors, UncheckedError{pos, line, name})
+}
+
+func readfile(filename string) []string {
+ var f, err = os.Open(filename)
+ if err != nil {
+ return nil
+ }
+ defer f.Close()
+
+ var lines []string
+ var scanner = bufio.NewScanner(f)
+ for scanner.Scan() {
+ lines = append(lines, scanner.Text())
+ }
+ return lines
+}
+
+func (v *visitor) Visit(node ast.Node) ast.Visitor {
+ switch stmt := node.(type) {
+ case *ast.ExprStmt:
+ if call, ok := stmt.X.(*ast.CallExpr); ok {
+ if !v.ignoreCall(call) && v.callReturnsError(call) {
+ v.addErrorAtPosition(call.Lparen, call)
+ }
+ }
+ case *ast.GoStmt:
+ if !v.ignoreCall(stmt.Call) && v.callReturnsError(stmt.Call) {
+ v.addErrorAtPosition(stmt.Call.Lparen, stmt.Call)
+ }
+ case *ast.DeferStmt:
+ if !v.ignoreCall(stmt.Call) && v.callReturnsError(stmt.Call) {
+ v.addErrorAtPosition(stmt.Call.Lparen, stmt.Call)
+ }
+ case *ast.AssignStmt:
+ if len(stmt.Rhs) == 1 {
+ // single value on rhs; check against lhs identifiers
+ if call, ok := stmt.Rhs[0].(*ast.CallExpr); ok {
+ if !v.blank {
+ break
+ }
+ if v.ignoreCall(call) {
+ break
+ }
+ isError := v.errorsByArg(call)
+ for i := 0; i < len(stmt.Lhs); i++ {
+ if id, ok := stmt.Lhs[i].(*ast.Ident); ok {
+ // We shortcut calls to recover() because errorsByArg can't
+ // check its return types for errors since it returns interface{}.
+ if id.Name == "_" && (v.isRecover(call) || isError[i]) {
+ v.addErrorAtPosition(id.NamePos, call)
+ }
+ }
+ }
+ } else if assert, ok := stmt.Rhs[0].(*ast.TypeAssertExpr); ok {
+ if !v.asserts {
+ break
+ }
+ if assert.Type == nil {
+ // type switch
+ break
+ }
+ if len(stmt.Lhs) < 2 {
+ // assertion result not read
+ v.addErrorAtPosition(stmt.Rhs[0].Pos(), nil)
+ } else if id, ok := stmt.Lhs[1].(*ast.Ident); ok && v.blank && id.Name == "_" {
+ // assertion result ignored
+ v.addErrorAtPosition(id.NamePos, nil)
+ }
+ }
+ } else {
+ // multiple value on rhs; in this case a call can't return
+ // multiple values. Assume len(stmt.Lhs) == len(stmt.Rhs)
+ for i := 0; i < len(stmt.Lhs); i++ {
+ if id, ok := stmt.Lhs[i].(*ast.Ident); ok {
+ if call, ok := stmt.Rhs[i].(*ast.CallExpr); ok {
+ if !v.blank {
+ continue
+ }
+ if v.ignoreCall(call) {
+ continue
+ }
+ if id.Name == "_" && v.callReturnsError(call) {
+ v.addErrorAtPosition(id.NamePos, call)
+ }
+ } else if assert, ok := stmt.Rhs[i].(*ast.TypeAssertExpr); ok {
+ if !v.asserts {
+ continue
+ }
+ if assert.Type == nil {
+ // Shouldn't happen anyway, no multi assignment in type switches
+ continue
+ }
+ v.addErrorAtPosition(id.NamePos, nil)
+ }
+ }
+ }
+ }
+ default:
+ }
+ return v
+}
+
+func isErrorType(t types.Type) bool {
+ return types.Implements(t, errorType)
+}
diff --git a/vendor/github.com/golangci/go-misc/LICENSE b/vendor/github.com/golangci/go-misc/LICENSE
new file mode 100644
index 000000000..cc42dd45d
--- /dev/null
+++ b/vendor/github.com/golangci/go-misc/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2012 Rémy Oudompheng. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * The name of Rémy Oudompheng may not be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/vendor/github.com/golangci/go-misc/deadcode/README.md b/vendor/github.com/golangci/go-misc/deadcode/README.md
new file mode 100644
index 000000000..550423128
--- /dev/null
+++ b/vendor/github.com/golangci/go-misc/deadcode/README.md
@@ -0,0 +1,18 @@
+# deadcode
+
+`deadcode` is a very simple utility which detects unused declarations in a Go package.
+
+## Usage
+```
+deadcode [-test] [packages]
+
+ -test Include test files
+ packages A list of packages using the same conventions as the go tool
+```
+
+## Limitations
+
+* Self-referential unused code is not currently reported
+* A single package can be tested at a time
+* Unused methods are not reported
+
diff --git a/vendor/github.com/golangci/go-misc/deadcode/deadcode.go b/vendor/github.com/golangci/go-misc/deadcode/deadcode.go
new file mode 100644
index 000000000..2e7cfc962
--- /dev/null
+++ b/vendor/github.com/golangci/go-misc/deadcode/deadcode.go
@@ -0,0 +1,135 @@
+package deadcode
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+
+ "golang.org/x/tools/go/loader"
+)
+
+var exitCode int
+
+var (
+ withTestFiles bool
+)
+
+type Issue struct {
+ Pos token.Position
+ UnusedIdentName string
+}
+
+func Run(program *loader.Program) ([]Issue, error) {
+ ctx := &Context{
+ program: program,
+ }
+ report := ctx.Process()
+ var issues []Issue
+ for _, obj := range report {
+ issues = append(issues, Issue{
+ Pos: program.Fset.Position(obj.Pos()),
+ UnusedIdentName: obj.Name(),
+ })
+ }
+
+ return issues, nil
+}
+
+func fatalf(format string, args ...interface{}) {
+ panic(fmt.Errorf(format, args...))
+}
+
+type Context struct {
+ cwd string
+ withTests bool
+
+ program *loader.Program
+}
+
+// pos resolves a compact position encoding into a verbose one
+func (ctx *Context) pos(pos token.Pos) token.Position {
+ if ctx.cwd == "" {
+ ctx.cwd, _ = os.Getwd()
+ }
+ p := ctx.program.Fset.Position(pos)
+ f, err := filepath.Rel(ctx.cwd, p.Filename)
+ if err == nil {
+ p.Filename = f
+ }
+ return p
+}
+
+// error formats the error to standard error, adding program
+// identification and a newline
+func (ctx *Context) errorf(pos token.Pos, format string, args ...interface{}) {
+ p := ctx.pos(pos)
+ fmt.Fprintf(os.Stderr, p.String()+": "+format+"\n", args...)
+ exitCode = 2
+}
+
+func (ctx *Context) Load(args ...string) {
+ // TODO
+}
+
+func (ctx *Context) Process() []types.Object {
+ prog := ctx.program
+ var allUnused []types.Object
+ for _, pkg := range prog.Imported {
+ unused := ctx.doPackage(prog, pkg)
+ allUnused = append(allUnused, unused...)
+ }
+ for _, pkg := range prog.Created {
+ unused := ctx.doPackage(prog, pkg)
+ allUnused = append(allUnused, unused...)
+ }
+ sort.Sort(objects(allUnused))
+ return allUnused
+}
+
+func isTestFuncByName(name string) bool {
+ return strings.HasPrefix(name, "Test") || strings.HasPrefix(name, "Benchmark") || strings.HasPrefix(name, "Example")
+}
+
+func (ctx *Context) doPackage(prog *loader.Program, pkg *loader.PackageInfo) []types.Object {
+ used := make(map[types.Object]bool)
+ for _, file := range pkg.Files {
+ ast.Inspect(file, func(n ast.Node) bool {
+ id, ok := n.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ obj := pkg.Info.Uses[id]
+ if obj != nil {
+ used[obj] = true
+ }
+ return false
+ })
+ }
+
+ global := pkg.Pkg.Scope()
+ var unused []types.Object
+ for _, name := range global.Names() {
+ if pkg.Pkg.Name() == "main" && name == "main" {
+ continue
+ }
+ obj := global.Lookup(name)
+ _, isSig := obj.Type().(*types.Signature)
+ pos := ctx.pos(obj.Pos())
+ isTestMethod := isSig && isTestFuncByName(obj.Name()) && strings.HasSuffix(pos.Filename, "_test.go")
+ if !used[obj] && ((pkg.Pkg.Name() == "main" && !isTestMethod) || !ast.IsExported(name)) {
+ unused = append(unused, obj)
+ }
+ }
+ return unused
+}
+
+type objects []types.Object
+
+func (s objects) Len() int { return len(s) }
+func (s objects) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
+func (s objects) Less(i, j int) bool { return s[i].Pos() < s[j].Pos() }
diff --git a/vendor/github.com/golangci/goconst/LICENSE b/vendor/github.com/golangci/goconst/LICENSE
new file mode 100644
index 000000000..e92649543
--- /dev/null
+++ b/vendor/github.com/golangci/goconst/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Jonathan Gautheron
+
+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.
diff --git a/vendor/github.com/golangci/goconst/README.md b/vendor/github.com/golangci/goconst/README.md
new file mode 100644
index 000000000..04fc9b015
--- /dev/null
+++ b/vendor/github.com/golangci/goconst/README.md
@@ -0,0 +1,49 @@
+# goconst
+
+Find repeated strings that could be replaced by a constant.
+
+### Motivation
+
+There are obvious benefits to using constants instead of repeating strings, mostly to ease maintenance. Cannot argue against changing a single constant versus many strings.
+
+While this could be considered a beginner mistake, across time, multiple packages and large codebases, some repetition could have slipped in.
+
+### Get Started
+
+ $ go get github.com/jgautheron/goconst/cmd/goconst
+ $ goconst ./...
+
+### Usage
+
+```
+Usage:
+
+ goconst ARGS <directory>
+
+Flags:
+
+ -ignore exclude files matching the given regular expression
+ -ignore-tests exclude tests from the search (default: true)
+ -min-occurrences report from how many occurrences (default: 2)
+ -min-length only report strings with the minimum given length (default: 3)
+ -match-constant look for existing constants matching the values
+ -numbers search also for duplicated numbers
+ -min minimum value, only works with -numbers
+ -max maximum value, only works with -numbers
+ -output output formatting (text or json)
+
+Examples:
+
+ goconst ./...
+ goconst -ignore "yacc|\.pb\." $GOPATH/src/github.com/cockroachdb/cockroach/...
+ goconst -min-occurrences 3 -output json $GOPATH/src/github.com/cockroachdb/cockroach
+ goconst -numbers -min 60 -max 512 .
+```
+
+### Other static analysis tools
+
+- [gogetimports](https://github.com/jgautheron/gogetimports): Get a JSON-formatted list of imports.
+- [usedexports](https://github.com/jgautheron/usedexports): Find exported variables that could be unexported.
+
+### License
+MIT
diff --git a/vendor/github.com/golangci/goconst/parser.go b/vendor/github.com/golangci/goconst/parser.go
new file mode 100644
index 000000000..ab5f99a50
--- /dev/null
+++ b/vendor/github.com/golangci/goconst/parser.go
@@ -0,0 +1,188 @@
+// Package goconst finds repeated strings that could be replaced by a constant.
+//
+// There are obvious benefits to using constants instead of repeating strings,
+// mostly to ease maintenance. Cannot argue against changing a single constant versus many strings.
+// While this could be considered a beginner mistake, across time,
+// multiple packages and large codebases, some repetition could have slipped in.
+package goconst
+
+import (
+ "go/ast"
+ "go/parser"
+ "go/token"
+ "log"
+ "os"
+ "path/filepath"
+ "regexp"
+ "strings"
+)
+
+const (
+ testSuffix = "_test.go"
+)
+
+type Parser struct {
+ // Meant to be passed via New()
+ path, ignore string
+ ignoreTests, matchConstant bool
+ minLength int
+
+ supportedTokens []token.Token
+
+ // Internals
+ strs Strings
+ consts Constants
+}
+
+// New creates a new instance of the parser.
+// This is your entry point if you'd like to use goconst as an API.
+func New(path, ignore string, ignoreTests, matchConstant, numbers bool, minLength int) *Parser {
+ supportedTokens := []token.Token{token.STRING}
+ if numbers {
+ supportedTokens = append(supportedTokens, token.INT, token.FLOAT)
+ }
+
+ return &Parser{
+ path: path,
+ ignore: ignore,
+ ignoreTests: ignoreTests,
+ matchConstant: matchConstant,
+ minLength: minLength,
+ supportedTokens: supportedTokens,
+
+ // Initialize the maps
+ strs: Strings{},
+ consts: Constants{},
+ }
+}
+
+// ParseTree will search the given path for occurrences that could be moved into constants.
+// If "..." is appended, the search will be recursive.
+func (p *Parser) ParseTree() (Strings, Constants, error) {
+ pathLen := len(p.path)
+ // Parse recursively the given path if the recursive notation is found
+ if pathLen >= 5 && p.path[pathLen-3:] == "..." {
+ filepath.Walk(p.path[:pathLen-3], func(path string, f os.FileInfo, err error) error {
+ if err != nil {
+ log.Println(err)
+ // resume walking
+ return nil
+ }
+
+ if f.IsDir() {
+ p.parseDir(path)
+ }
+ return nil
+ })
+ } else {
+ p.parseDir(p.path)
+ }
+ return p.strs, p.consts, nil
+}
+
+func (p *Parser) parseDir(dir string) error {
+ fset := token.NewFileSet()
+ pkgs, err := parser.ParseDir(fset, dir, func(info os.FileInfo) bool {
+ valid, name := true, info.Name()
+
+ if p.ignoreTests {
+ if strings.HasSuffix(name, testSuffix) {
+ valid = false
+ }
+ }
+
+ if len(p.ignore) != 0 {
+ match, err := regexp.MatchString(p.ignore, dir+name)
+ if err != nil {
+ log.Fatal(err)
+ return true
+ }
+ if match {
+ valid = false
+ }
+ }
+
+ return valid
+ }, 0)
+ if err != nil {
+ return err
+ }
+
+ for _, pkg := range pkgs {
+ for fn, f := range pkg.Files {
+ ast.Walk(&treeVisitor{
+ fileSet: fset,
+ packageName: pkg.Name,
+ fileName: fn,
+ p: p,
+ }, f)
+ }
+ }
+
+ return nil
+}
+
+type Strings map[string][]ExtendedPos
+type Constants map[string]ConstType
+
+type ConstType struct {
+ token.Position
+ Name, packageName string
+}
+
+type ExtendedPos struct {
+ token.Position
+ packageName string
+}
+
+type Issue struct {
+ Pos token.Position
+ OccurencesCount int
+ Str string
+ MatchingConst string
+}
+
+type Config struct {
+ MatchWithConstants bool
+ MinStringLength int
+ MinOccurrences int
+}
+
+func Run(files []*ast.File, fset *token.FileSet, cfg *Config) ([]Issue, error) {
+ p := New("", "", false, cfg.MatchWithConstants, false, cfg.MinStringLength)
+ var issues []Issue
+ for _, f := range files {
+ ast.Walk(&treeVisitor{
+ fileSet: fset,
+ packageName: "",
+ fileName: "",
+ p: p,
+ }, f)
+ }
+
+ for str, item := range p.strs {
+ // Filter out items whose occurrences don't match the min value
+ if len(item) < cfg.MinOccurrences {
+ delete(p.strs, str)
+ }
+ }
+
+ for str, item := range p.strs {
+ fi := item[0]
+ i := Issue{
+ Pos: fi.Position,
+ OccurencesCount: len(item),
+ Str: str,
+ }
+
+ if len(p.consts) != 0 {
+ if cst, ok := p.consts[str]; ok {
+ // const should be in the same package and exported
+ i.MatchingConst = cst.Name
+ }
+ }
+ issues = append(issues, i)
+ }
+
+ return issues, nil
+}
diff --git a/vendor/github.com/golangci/goconst/visitor.go b/vendor/github.com/golangci/goconst/visitor.go
new file mode 100644
index 000000000..a86421f6d
--- /dev/null
+++ b/vendor/github.com/golangci/goconst/visitor.go
@@ -0,0 +1,143 @@
+package goconst
+
+import (
+ "go/ast"
+ "go/token"
+ "strings"
+)
+
+// treeVisitor carries the package name and file name
+// for passing it to the imports map, and the fileSet for
+// retrieving the token.Position.
+type treeVisitor struct {
+ p *Parser
+ fileSet *token.FileSet
+ packageName, fileName string
+}
+
+// Visit browses the AST tree for strings that could be potentially
+// replaced by constants.
+// A map of existing constants is built as well (-match-constant).
+func (v *treeVisitor) Visit(node ast.Node) ast.Visitor {
+ if node == nil {
+ return v
+ }
+
+ // A single case with "ast.BasicLit" would be much easier
+ // but then we wouldn't be able to tell in which context
+ // the string is defined (could be a constant definition).
+ switch t := node.(type) {
+ // Scan for constants in an attempt to match strings with existing constants
+ case *ast.GenDecl:
+ if !v.p.matchConstant {
+ return v
+ }
+ if t.Tok != token.CONST {
+ return v
+ }
+
+ for _, spec := range t.Specs {
+ val := spec.(*ast.ValueSpec)
+ for i, str := range val.Values {
+ lit, ok := str.(*ast.BasicLit)
+ if !ok || !v.isSupported(lit.Kind) {
+ continue
+ }
+
+ v.addConst(val.Names[i].Name, lit.Value, val.Names[i].Pos())
+ }
+ }
+
+ // foo := "moo"
+ case *ast.AssignStmt:
+ for _, rhs := range t.Rhs {
+ lit, ok := rhs.(*ast.BasicLit)
+ if !ok || !v.isSupported(lit.Kind) {
+ continue
+ }
+
+ v.addString(lit.Value, rhs.(*ast.BasicLit).Pos())
+ }
+
+ // if foo == "moo"
+ case *ast.BinaryExpr:
+ if t.Op != token.EQL && t.Op != token.NEQ {
+ return v
+ }
+
+ var lit *ast.BasicLit
+ var ok bool
+
+ lit, ok = t.X.(*ast.BasicLit)
+ if ok && v.isSupported(lit.Kind) {
+ v.addString(lit.Value, lit.Pos())
+ }
+
+ lit, ok = t.Y.(*ast.BasicLit)
+ if ok && v.isSupported(lit.Kind) {
+ v.addString(lit.Value, lit.Pos())
+ }
+
+ // case "foo":
+ case *ast.CaseClause:
+ for _, item := range t.List {
+ lit, ok := item.(*ast.BasicLit)
+ if ok && v.isSupported(lit.Kind) {
+ v.addString(lit.Value, lit.Pos())
+ }
+ }
+
+ // return "boo"
+ case *ast.ReturnStmt:
+ for _, item := range t.Results {
+ lit, ok := item.(*ast.BasicLit)
+ if ok && v.isSupported(lit.Kind) {
+ v.addString(lit.Value, lit.Pos())
+ }
+ }
+ }
+
+ return v
+}
+
+// addString adds a string in the map along with its position in the tree.
+func (v *treeVisitor) addString(str string, pos token.Pos) {
+ str = strings.Replace(str, `"`, "", 2)
+
+ // Ignore empty strings
+ if len(str) == 0 {
+ return
+ }
+
+ if len(str) < v.p.minLength {
+ return
+ }
+
+ _, ok := v.p.strs[str]
+ if !ok {
+ v.p.strs[str] = make([]ExtendedPos, 0)
+ }
+ v.p.strs[str] = append(v.p.strs[str], ExtendedPos{
+ packageName: v.packageName,
+ Position: v.fileSet.Position(pos),
+ })
+}
+
+// addConst adds a const in the map along with its position in the tree.
+func (v *treeVisitor) addConst(name string, val string, pos token.Pos) {
+ val = strings.Replace(val, `"`, "", 2)
+ v.p.consts[val] = ConstType{
+ Name: name,
+ packageName: v.packageName,
+ Position: v.fileSet.Position(pos),
+ }
+}
+
+func (v *treeVisitor) isSupported(tk token.Token) bool {
+ for _, s := range v.p.supportedTokens {
+ if tk == s {
+ return true
+ }
+ }
+ return false
+}
diff --git a/vendor/github.com/golangci/gocyclo/CONTRIBUTORS b/vendor/github.com/golangci/gocyclo/CONTRIBUTORS
new file mode 100644
index 000000000..1c09f1a06
--- /dev/null
+++ b/vendor/github.com/golangci/gocyclo/CONTRIBUTORS
@@ -0,0 +1,7 @@
+# Names should be added to this file like so:
+# Name <email address>
+
+# Please keep the list sorted.
+
+Frederik Zipp <fzipp@gmx.de>
+Harshavardhana <harsha@harshavardhana.net>
diff --git a/vendor/github.com/golangci/gocyclo/LICENSE b/vendor/github.com/golangci/gocyclo/LICENSE
new file mode 100644
index 000000000..45f88d6cb
--- /dev/null
+++ b/vendor/github.com/golangci/gocyclo/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2013 Frederik Zipp. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of the copyright owner nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/golangci/gocyclo/pkg/gocyclo/gocyclo.go b/vendor/github.com/golangci/gocyclo/pkg/gocyclo/gocyclo.go
new file mode 100644
index 000000000..a1f33310f
--- /dev/null
+++ b/vendor/github.com/golangci/gocyclo/pkg/gocyclo/gocyclo.go
@@ -0,0 +1,82 @@
+package gocyclo
+
+import (
+ "fmt"
+ "go/token"
+
+ "go/ast"
+)
+
+type Stat struct {
+ PkgName string
+ FuncName string
+ Complexity int
+ Pos token.Position
+}
+
+func (s Stat) String() string {
+ return fmt.Sprintf("%d %s %s %s", s.Complexity, s.PkgName, s.FuncName, s.Pos)
+}
+
+func BuildStats(f *ast.File, fset *token.FileSet, stats []Stat) []Stat {
+ for _, decl := range f.Decls {
+ if fn, ok := decl.(*ast.FuncDecl); ok {
+ stats = append(stats, Stat{
+ PkgName: f.Name.Name,
+ FuncName: funcName(fn),
+ Complexity: complexity(fn),
+ Pos: fset.Position(fn.Pos()),
+ })
+ }
+ }
+ return stats
+}
+
+// funcName returns the name representation of a function or method:
+// "(Type).Name" for methods or simply "Name" for functions.
+func funcName(fn *ast.FuncDecl) string {
+ if fn.Recv != nil {
+ if fn.Recv.NumFields() > 0 {
+ typ := fn.Recv.List[0].Type
+ return fmt.Sprintf("(%s).%s", recvString(typ), fn.Name)
+ }
+ }
+ return fn.Name.Name
+}
+
+// recvString returns a string representation of recv of the
+// form "T", "*T", or "BADRECV" (if not a proper receiver type).
+func recvString(recv ast.Expr) string {
+ switch t := recv.(type) {
+ case *ast.Ident:
+ return t.Name
+ case *ast.StarExpr:
+ return "*" + recvString(t.X)
+ }
+ return "BADRECV"
+}
+
+// complexity calculates the cyclomatic complexity of a function.
+func complexity(fn *ast.FuncDecl) int {
+ v := complexityVisitor{}
+ ast.Walk(&v, fn)
+ return v.Complexity
+}
+
+type complexityVisitor struct {
+ // Complexity is the cyclomatic complexity
+ Complexity int
+}
+
+// Visit implements the ast.Visitor interface.
+func (v *complexityVisitor) Visit(n ast.Node) ast.Visitor {
+ switch n := n.(type) {
+ case *ast.FuncDecl, *ast.IfStmt, *ast.ForStmt, *ast.RangeStmt, *ast.CaseClause, *ast.CommClause:
+ v.Complexity++
+ case *ast.BinaryExpr:
+ if n.Op == token.LAND || n.Op == token.LOR {
+ v.Complexity++
+ }
+ }
+ return v
+}
diff --git a/vendor/github.com/golangci/gofmt/gofmt/LICENSE b/vendor/github.com/golangci/gofmt/gofmt/LICENSE
new file mode 100644
index 000000000..6a66aea5e
--- /dev/null
+++ b/vendor/github.com/golangci/gofmt/gofmt/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/golangci/gofmt/gofmt/doc.go b/vendor/github.com/golangci/gofmt/gofmt/doc.go
new file mode 100644
index 000000000..da0c8581d
--- /dev/null
+++ b/vendor/github.com/golangci/gofmt/gofmt/doc.go
@@ -0,0 +1,104 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/*
+Gofmt formats Go programs.
+It uses tabs for indentation and blanks for alignment.
+Alignment assumes that an editor is using a fixed-width font.
+
+Without an explicit path, it processes the standard input. Given a file,
+it operates on that file; given a directory, it operates on all .go files in
+that directory, recursively. (Files starting with a period are ignored.)
+By default, gofmt prints the reformatted sources to standard output.
+
+Usage:
+ gofmt [flags] [path ...]
+
+The flags are:
+ -d
+ Do not print reformatted sources to standard output.
+ If a file's formatting is different than gofmt's, print diffs
+ to standard output.
+ -e
+ Print all (including spurious) errors.
+ -l
+ Do not print reformatted sources to standard output.
+ If a file's formatting is different from gofmt's, print its name
+ to standard output.
+ -r rule
+ Apply the rewrite rule to the source before reformatting.
+ -s
+ Try to simplify code (after applying the rewrite rule, if any).
+ -w
+ Do not print reformatted sources to standard output.
+ If a file's formatting is different from gofmt's, overwrite it
+ with gofmt's version. If an error occurred during overwriting,
+ the original file is restored from an automatic backup.
+
+Debugging support:
+ -cpuprofile filename
+ Write cpu profile to the specified file.
+
+
+The rewrite rule specified with the -r flag must be a string of the form:
+
+ pattern -> replacement
+
+Both pattern and replacement must be valid Go expressions.
+In the pattern, single-character lowercase identifiers serve as
+wildcards matching arbitrary sub-expressions; those expressions
+will be substituted for the same identifiers in the replacement.
+
+When gofmt reads from standard input, it accepts either a full Go program
+or a program fragment. A program fragment must be a syntactically
+valid declaration list, statement list, or expression. When formatting
+such a fragment, gofmt preserves leading indentation as well as leading
+and trailing spaces, so that individual sections of a Go program can be
+formatted by piping them through gofmt.
+
+Examples
+
+To check files for unnecessary parentheses:
+
+ gofmt -r '(a) -> a' -l *.go
+
+To remove the parentheses:
+
+ gofmt -r '(a) -> a' -w *.go
+
+To convert the package tree from explicit slice upper bounds to implicit ones:
+
+ gofmt -r 'α[β:len(α)] -> α[β:]' -w $GOROOT/src
+
+The simplify command
+
+When invoked with -s gofmt will make the following source transformations where possible.
+
+ An array, slice, or map composite literal of the form:
+ []T{T{}, T{}}
+ will be simplified to:
+ []T{{}, {}}
+
+ A slice expression of the form:
+ s[a:len(s)]
+ will be simplified to:
+ s[a:]
+
+ A range of the form:
+ for x, _ = range v {...}
+ will be simplified to:
+ for x = range v {...}
+
+ A range of the form:
+ for _ = range v {...}
+ will be simplified to:
+ for range v {...}
+
+This may result in changes that are incompatible with earlier versions of Go.
+*/
+package gofmt
+
+// BUG(rsc): The implementation of -r is a bit slow.
+// BUG(gri): If -w fails, the restored original file may not have some of the
+// original file attributes.
diff --git a/vendor/github.com/golangci/gofmt/gofmt/gofmt.go b/vendor/github.com/golangci/gofmt/gofmt/gofmt.go
new file mode 100644
index 000000000..fb9c8cb37
--- /dev/null
+++ b/vendor/github.com/golangci/gofmt/gofmt/gofmt.go
@@ -0,0 +1,327 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gofmt
+
+import (
+ "bytes"
+ "flag"
+ "fmt"
+ "go/ast"
+ "go/parser"
+ "go/printer"
+ "go/scanner"
+ "go/token"
+ "io"
+ "io/ioutil"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "runtime"
+ "runtime/pprof"
+ "strings"
+ "sync"
+)
+
+var (
+ // main operation modes
+ list = flag.Bool("gofmt.l", false, "list files whose formatting differs from gofmt's")
+ write = flag.Bool("gofmt.w", false, "write result to (source) file instead of stdout")
+ rewriteRule = flag.String("gofmt.r", "", "rewrite rule (e.g., 'a[b:len(a)] -> a[b:]')")
+ simplifyAST = flag.Bool("gofmt.s", false, "simplify code")
+ doDiff = flag.Bool("gofmt.d", false, "display diffs instead of rewriting files")
+ allErrors = flag.Bool("gofmt.e", false, "report all errors (not just the first 10 on different lines)")
+
+ // debugging
+ cpuprofile = flag.String("gofmt.cpuprofile", "", "write cpu profile to this file")
+)
+
+const (
+ tabWidth = 8
+ printerMode = printer.UseSpaces | printer.TabIndent
+)
+
+var (
+ fileSet = token.NewFileSet() // per process FileSet
+ exitCode = 0
+ rewrite func(*ast.File) *ast.File
+ parserMode parser.Mode
+ parserModeInitOnce sync.Once
+)
+
+func report(err error) {
+ scanner.PrintError(os.Stderr, err)
+ exitCode = 2
+}
+
+func usage() {
+ fmt.Fprintf(os.Stderr, "usage: gofmt [flags] [path ...]\n")
+ flag.PrintDefaults()
+}
+
+func initParserMode() {
+ parserModeInitOnce.Do(func() {
+ parserMode = parser.ParseComments
+ if *allErrors {
+ parserMode |= parser.AllErrors
+ }
+ })
+}
+
+func isGoFile(f os.FileInfo) bool {
+ // ignore non-Go files
+ name := f.Name()
+ return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
+}
+
+// If in == nil, the source is the contents of the file with the given filename.
+func processFile(filename string, in io.Reader, out io.Writer, stdin bool) error {
+ var perm os.FileMode = 0644
+ if in == nil {
+ f, err := os.Open(filename)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ fi, err := f.Stat()
+ if err != nil {
+ return err
+ }
+ in = f
+ perm = fi.Mode().Perm()
+ }
+
+ src, err := ioutil.ReadAll(in)
+ if err != nil {
+ return err
+ }
+
+ file, sourceAdj, indentAdj, err := parse(fileSet, filename, src, stdin)
+ if err != nil {
+ return err
+ }
+
+ if rewrite != nil {
+ if sourceAdj == nil {
+ file = rewrite(file)
+ } else {
+ fmt.Fprintf(os.Stderr, "warning: rewrite ignored for incomplete programs\n")
+ }
+ }
+
+ ast.SortImports(fileSet, file)
+
+ if *simplifyAST {
+ simplify(file)
+ }
+
+ res, err := format(fileSet, file, sourceAdj, indentAdj, src, printer.Config{Mode: printerMode, Tabwidth: tabWidth})
+ if err != nil {
+ return err
+ }
+
+ if !bytes.Equal(src, res) {
+ // formatting has changed
+ if *list {
+ fmt.Fprintln(out, filename)
+ }
+ if *write {
+ // make a temporary backup before overwriting original
+ bakname, err := backupFile(filename+".", src, perm)
+ if err != nil {
+ return err
+ }
+ err = ioutil.WriteFile(filename, res, perm)
+ if err != nil {
+ os.Rename(bakname, filename)
+ return err
+ }
+ err = os.Remove(bakname)
+ if err != nil {
+ return err
+ }
+ }
+ if *doDiff {
+ data, err := diff(src, res, filename)
+ if err != nil {
+ return fmt.Errorf("computing diff: %s", err)
+ }
+ fmt.Printf("diff -u %s %s\n", filepath.ToSlash(filename+".orig"), filepath.ToSlash(filename))
+ out.Write(data)
+ }
+ }
+
+ if !*list && !*write && !*doDiff {
+ _, err = out.Write(res)
+ }
+
+ return err
+}
+
+func visitFile(path string, f os.FileInfo, err error) error {
+ if err == nil && isGoFile(f) {
+ err = processFile(path, nil, os.Stdout, false)
+ }
+ // Don't complain if a file was deleted in the meantime (i.e.
+ // the directory changed concurrently while running gofmt).
+ if err != nil && !os.IsNotExist(err) {
+ report(err)
+ }
+ return nil
+}
+
+func walkDir(path string) {
+ filepath.Walk(path, visitFile)
+}
+
+func gofmtMain() {
+ flag.Usage = usage
+ flag.Parse()
+
+ if *cpuprofile != "" {
+ f, err := os.Create(*cpuprofile)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "creating cpu profile: %s\n", err)
+ exitCode = 2
+ return
+ }
+ defer f.Close()
+ pprof.StartCPUProfile(f)
+ defer pprof.StopCPUProfile()
+ }
+
+ initParserMode()
+ initRewrite()
+
+ if flag.NArg() == 0 {
+ if *write {
+ fmt.Fprintln(os.Stderr, "error: cannot use -w with standard input")
+ exitCode = 2
+ return
+ }
+ if err := processFile("<standard input>", os.Stdin, os.Stdout, true); err != nil {
+ report(err)
+ }
+ return
+ }
+
+ for i := 0; i < flag.NArg(); i++ {
+ path := flag.Arg(i)
+ switch dir, err := os.Stat(path); {
+ case err != nil:
+ report(err)
+ case dir.IsDir():
+ walkDir(path)
+ default:
+ if err := processFile(path, nil, os.Stdout, false); err != nil {
+ report(err)
+ }
+ }
+ }
+}
+
+func writeTempFile(dir, prefix string, data []byte) (string, error) {
+ file, err := ioutil.TempFile(dir, prefix)
+ if err != nil {
+ return "", err
+ }
+ _, err = file.Write(data)
+ if err1 := file.Close(); err == nil {
+ err = err1
+ }
+ if err != nil {
+ os.Remove(file.Name())
+ return "", err
+ }
+ return file.Name(), nil
+}
+
+func diff(b1, b2 []byte, filename string) (data []byte, err error) {
+ f1, err := writeTempFile("", "gofmt", b1)
+ if err != nil {
+ return
+ }
+ defer os.Remove(f1)
+
+ f2, err := writeTempFile("", "gofmt", b2)
+ if err != nil {
+ return
+ }
+ defer os.Remove(f2)
+
+ cmd := "diff"
+ if runtime.GOOS == "plan9" {
+ cmd = "/bin/ape/diff"
+ }
+
+ data, err = exec.Command(cmd, "-u", f1, f2).CombinedOutput()
+ if len(data) > 0 {
+ // diff exits with a non-zero status when the files don't match.
+ // Ignore that failure as long as we get output.
+ return replaceTempFilename(data, filename)
+ }
+ return
+}
+
+// replaceTempFilename replaces temporary filenames in diff with actual one.
+//
+// --- /tmp/gofmt316145376 2017-02-03 19:13:00.280468375 -0500
+// +++ /tmp/gofmt617882815 2017-02-03 19:13:00.280468375 -0500
+// ...
+// ->
+// --- path/to/file.go.orig 2017-02-03 19:13:00.280468375 -0500
+// +++ path/to/file.go 2017-02-03 19:13:00.280468375 -0500
+// ...
+func replaceTempFilename(diff []byte, filename string) ([]byte, error) {
+ bs := bytes.SplitN(diff, []byte{'\n'}, 3)
+ if len(bs) < 3 {
+ return nil, fmt.Errorf("got unexpected diff for %s", filename)
+ }
+ // Preserve timestamps.
+ var t0, t1 []byte
+ if i := bytes.LastIndexByte(bs[0], '\t'); i != -1 {
+ t0 = bs[0][i:]
+ }
+ if i := bytes.LastIndexByte(bs[1], '\t'); i != -1 {
+ t1 = bs[1][i:]
+ }
+ // Always print filepath with slash separator.
+ f := filepath.ToSlash(filename)
+ bs[0] = []byte(fmt.Sprintf("--- %s%s", f+".orig", t0))
+ bs[1] = []byte(fmt.Sprintf("+++ %s%s", f, t1))
+ return bytes.Join(bs, []byte{'\n'}), nil
+}
+
+const chmodSupported = runtime.GOOS != "windows"
+
+// backupFile writes data to a new file named filename<number> with permissions perm,
+// with <number randomly chosen such that the file name is unique. backupFile returns
+// the chosen file name.
+func backupFile(filename string, data []byte, perm os.FileMode) (string, error) {
+ // create backup file
+ f, err := ioutil.TempFile(filepath.Dir(filename), filepath.Base(filename))
+ if err != nil {
+ return "", err
+ }
+ bakname := f.Name()
+ if chmodSupported {
+ err = f.Chmod(perm)
+ if err != nil {
+ f.Close()
+ os.Remove(bakname)
+ return bakname, err
+ }
+ }
+
+ // write data to backup file
+ n, err := f.Write(data)
+ if err == nil && n < len(data) {
+ err = io.ErrShortWrite
+ }
+ if err1 := f.Close(); err == nil {
+ err = err1
+ }
+
+ return bakname, err
+}
diff --git a/vendor/github.com/golangci/gofmt/gofmt/golangci.go b/vendor/github.com/golangci/gofmt/gofmt/golangci.go
new file mode 100644
index 000000000..0f5a0d408
--- /dev/null
+++ b/vendor/github.com/golangci/gofmt/gofmt/golangci.go
@@ -0,0 +1,46 @@
+package gofmt
+
+import (
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/printer"
+ "io/ioutil"
+)
+
+func Run(filename string, needSimplify bool) ([]byte, error) {
+ src, err := ioutil.ReadFile(filename)
+ if err != nil {
+ return nil, err
+ }
+
+ initParserMode()
+
+ file, sourceAdj, indentAdj, err := parse(fileSet, filename, src, false)
+ if err != nil {
+ return nil, err
+ }
+
+ ast.SortImports(fileSet, file)
+
+ if needSimplify {
+ simplify(file)
+ }
+
+ res, err := format(fileSet, file, sourceAdj, indentAdj, src, printer.Config{Mode: printerMode, Tabwidth: tabWidth})
+ if err != nil {
+ return nil, err
+ }
+
+ if bytes.Equal(src, res) {
+ return nil, nil
+ }
+
+ // formatting has changed
+ data, err := diff(src, res, filename)
+ if err != nil {
+ return nil, fmt.Errorf("error computing diff: %s", err)
+ }
+
+ return data, nil
+}
diff --git a/vendor/github.com/golangci/gofmt/gofmt/internal.go b/vendor/github.com/golangci/gofmt/gofmt/internal.go
new file mode 100644
index 000000000..8b76d39d5
--- /dev/null
+++ b/vendor/github.com/golangci/gofmt/gofmt/internal.go
@@ -0,0 +1,176 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// TODO(gri): This file and the file src/go/format/internal.go are
+// the same (but for this comment and the package name). Do not modify
+// one without the other. Determine if we can factor out functionality
+// in a public API. See also #11844 for context.
+
+package gofmt
+
+import (
+ "bytes"
+ "go/ast"
+ "go/parser"
+ "go/printer"
+ "go/token"
+ "strings"
+)
+
+// parse parses src, which was read from the named file,
+// as a Go source file, declaration, or statement list.
+func parse(fset *token.FileSet, filename string, src []byte, fragmentOk bool) (
+ file *ast.File,
+ sourceAdj func(src []byte, indent int) []byte,
+ indentAdj int,
+ err error,
+) {
+ // Try as whole source file.
+ file, err = parser.ParseFile(fset, filename, src, parserMode)
+ // If there's no error, return. If the error is that the source file didn't begin with a
+ // package line and source fragments are ok, fall through to
+ // try as a source fragment. Stop and return on any other error.
+ if err == nil || !fragmentOk || !strings.Contains(err.Error(), "expected 'package'") {
+ return
+ }
+
+ // If this is a declaration list, make it a source file
+ // by inserting a package clause.
+ // Insert using a ;, not a newline, so that the line numbers
+ // in psrc match the ones in src.
+ psrc := append([]byte("package p;"), src...)
+ file, err = parser.ParseFile(fset, filename, psrc, parserMode)
+ if err == nil {
+ sourceAdj = func(src []byte, indent int) []byte {
+ // Remove the package clause.
+ // Gofmt has turned the ; into a \n.
+ src = src[indent+len("package p\n"):]
+ return bytes.TrimSpace(src)
+ }
+ return
+ }
+ // If the error is that the source file didn't begin with a
+ // declaration, fall through to try as a statement list.
+ // Stop and return on any other error.
+ if !strings.Contains(err.Error(), "expected declaration") {
+ return
+ }
+
+ // If this is a statement list, make it a source file
+ // by inserting a package clause and turning the list
+ // into a function body. This handles expressions too.
+ // Insert using a ;, not a newline, so that the line numbers
+ // in fsrc match the ones in src. Add an extra '\n' before the '}'
+ // to make sure comments are flushed before the '}'.
+ fsrc := append(append([]byte("package p; func _() {"), src...), '\n', '\n', '}')
+ file, err = parser.ParseFile(fset, filename, fsrc, parserMode)
+ if err == nil {
+ sourceAdj = func(src []byte, indent int) []byte {
+ // Cap adjusted indent to zero.
+ if indent < 0 {
+ indent = 0
+ }
+ // Remove the wrapping.
+ // Gofmt has turned the ; into a \n\n.
+ // There will be two non-blank lines with indent, hence 2*indent.
+ src = src[2*indent+len("package p\n\nfunc _() {"):]
+ // Remove only the "}\n" suffix: remaining whitespaces will be trimmed anyway
+ src = src[:len(src)-len("}\n")]
+ return bytes.TrimSpace(src)
+ }
+ // Gofmt has also indented the function body one level.
+ // Adjust that with indentAdj.
+ indentAdj = -1
+ }
+
+ // Succeeded, or out of options.
+ return
+}
+
+// format formats the given package file originally obtained from src
+// and adjusts the result based on the original source via sourceAdj
+// and indentAdj.
+func format(
+ fset *token.FileSet,
+ file *ast.File,
+ sourceAdj func(src []byte, indent int) []byte,
+ indentAdj int,
+ src []byte,
+ cfg printer.Config,
+) ([]byte, error) {
+ if sourceAdj == nil {
+ // Complete source file.
+ var buf bytes.Buffer
+ err := cfg.Fprint(&buf, fset, file)
+ if err != nil {
+ return nil, err
+ }
+ return buf.Bytes(), nil
+ }
+
+ // Partial source file.
+ // Determine and prepend leading space.
+ i, j := 0, 0
+ for j < len(src) && isSpace(src[j]) {
+ if src[j] == '\n' {
+ i = j + 1 // byte offset of last line in leading space
+ }
+ j++
+ }
+ var res []byte
+ res = append(res, src[:i]...)
+
+ // Determine and prepend indentation of first code line.
+ // Spaces are ignored unless there are no tabs,
+ // in which case spaces count as one tab.
+ indent := 0
+ hasSpace := false
+ for _, b := range src[i:j] {
+ switch b {
+ case ' ':
+ hasSpace = true
+ case '\t':
+ indent++
+ }
+ }
+ if indent == 0 && hasSpace {
+ indent = 1
+ }
+ for i := 0; i < indent; i++ {
+ res = append(res, '\t')
+ }
+
+ // Format the source.
+ // Write it without any leading and trailing space.
+ cfg.Indent = indent + indentAdj
+ var buf bytes.Buffer
+ err := cfg.Fprint(&buf, fset, file)
+ if err != nil {
+ return nil, err
+ }
+ out := sourceAdj(buf.Bytes(), cfg.Indent)
+
+ // If the adjusted output is empty, the source
+ // was empty but (possibly) for white space.
+ // The result is the incoming source.
+ if len(out) == 0 {
+ return src, nil
+ }
+
+ // Otherwise, append output to leading space.
+ res = append(res, out...)
+
+ // Determine and append trailing space.
+ i = len(src)
+ for i > 0 && isSpace(src[i-1]) {
+ i--
+ }
+ return append(res, src[i:]...), nil
+}
+
+// isSpace reports whether the byte is a space character.
+// isSpace defines a space as being among the following bytes: ' ', '\t', '\n' and '\r'.
+func isSpace(b byte) bool {
+ return b == ' ' || b == '\t' || b == '\n' || b == '\r'
+}
diff --git a/vendor/github.com/golangci/gofmt/gofmt/rewrite.go b/vendor/github.com/golangci/gofmt/gofmt/rewrite.go
new file mode 100644
index 000000000..73741e0a9
--- /dev/null
+++ b/vendor/github.com/golangci/gofmt/gofmt/rewrite.go
@@ -0,0 +1,303 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gofmt
+
+import (
+ "fmt"
+ "go/ast"
+ "go/parser"
+ "go/token"
+ "os"
+ "reflect"
+ "strings"
+ "unicode"
+ "unicode/utf8"
+)
+
+func initRewrite() {
+ if *rewriteRule == "" {
+ rewrite = nil // disable any previous rewrite
+ return
+ }
+ f := strings.Split(*rewriteRule, "->")
+ if len(f) != 2 {
+ fmt.Fprintf(os.Stderr, "rewrite rule must be of the form 'pattern -> replacement'\n")
+ os.Exit(2)
+ }
+ pattern := parseExpr(f[0], "pattern")
+ replace := parseExpr(f[1], "replacement")
+ rewrite = func(p *ast.File) *ast.File { return rewriteFile(pattern, replace, p) }
+}
+
+// parseExpr parses s as an expression.
+// It might make sense to expand this to allow statement patterns,
+// but there are problems with preserving formatting and also
+// with what a wildcard for a statement looks like.
+func parseExpr(s, what string) ast.Expr {
+ x, err := parser.ParseExpr(s)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "parsing %s %s at %s\n", what, s, err)
+ os.Exit(2)
+ }
+ return x
+}
+
+// Keep this function for debugging.
+/*
+func dump(msg string, val reflect.Value) {
+ fmt.Printf("%s:\n", msg)
+ ast.Print(fileSet, val.Interface())
+ fmt.Println()
+}
+*/
+
+// rewriteFile applies the rewrite rule 'pattern -> replace' to an entire file.
+func rewriteFile(pattern, replace ast.Expr, p *ast.File) *ast.File {
+ cmap := ast.NewCommentMap(fileSet, p, p.Comments)
+ m := make(map[string]reflect.Value)
+ pat := reflect.ValueOf(pattern)
+ repl := reflect.ValueOf(replace)
+
+ var rewriteVal func(val reflect.Value) reflect.Value
+ rewriteVal = func(val reflect.Value) reflect.Value {
+ // don't bother if val is invalid to start with
+ if !val.IsValid() {
+ return reflect.Value{}
+ }
+ val = apply(rewriteVal, val)
+ for k := range m {
+ delete(m, k)
+ }
+ if match(m, pat, val) {
+ val = subst(m, repl, reflect.ValueOf(val.Interface().(ast.Node).Pos()))
+ }
+ return val
+ }
+
+ r := apply(rewriteVal, reflect.ValueOf(p)).Interface().(*ast.File)
+ r.Comments = cmap.Filter(r).Comments() // recreate comments list
+ return r
+}
+
+// set is a wrapper for x.Set(y); it protects the caller from panics if x cannot be changed to y.
+func set(x, y reflect.Value) {
+ // don't bother if x cannot be set or y is invalid
+ if !x.CanSet() || !y.IsValid() {
+ return
+ }
+ defer func() {
+ if x := recover(); x != nil {
+ if s, ok := x.(string); ok &&
+ (strings.Contains(s, "type mismatch") || strings.Contains(s, "not assignable")) {
+ // x cannot be set to y - ignore this rewrite
+ return
+ }
+ panic(x)
+ }
+ }()
+ x.Set(y)
+}
+
+// Values/types for special cases.
+var (
+ objectPtrNil = reflect.ValueOf((*ast.Object)(nil))
+ scopePtrNil = reflect.ValueOf((*ast.Scope)(nil))
+
+ identType = reflect.TypeOf((*ast.Ident)(nil))
+ objectPtrType = reflect.TypeOf((*ast.Object)(nil))
+ positionType = reflect.TypeOf(token.NoPos)
+ callExprType = reflect.TypeOf((*ast.CallExpr)(nil))
+ scopePtrType = reflect.TypeOf((*ast.Scope)(nil))
+)
+
+// apply replaces each AST field x in val with f(x), returning val.
+// To avoid extra conversions, f operates on the reflect.Value form.
+func apply(f func(reflect.Value) reflect.Value, val reflect.Value) reflect.Value {
+ if !val.IsValid() {
+ return reflect.Value{}
+ }
+
+ // *ast.Objects introduce cycles and are likely incorrect after
+ // rewrite; don't follow them but replace with nil instead
+ if val.Type() == objectPtrType {
+ return objectPtrNil
+ }
+
+ // similarly for scopes: they are likely incorrect after a rewrite;
+ // replace them with nil
+ if val.Type() == scopePtrType {
+ return scopePtrNil
+ }
+
+ switch v := reflect.Indirect(val); v.Kind() {
+ case reflect.Slice:
+ for i := 0; i < v.Len(); i++ {
+ e := v.Index(i)
+ set(e, f(e))
+ }
+ case reflect.Struct:
+ for i := 0; i < v.NumField(); i++ {
+ e := v.Field(i)
+ set(e, f(e))
+ }
+ case reflect.Interface:
+ e := v.Elem()
+ set(v, f(e))
+ }
+ return val
+}
+
+func isWildcard(s string) bool {
+ rune, size := utf8.DecodeRuneInString(s)
+ return size == len(s) && unicode.IsLower(rune)
+}
+
+// match reports whether pattern matches val,
+// recording wildcard submatches in m.
+// If m == nil, match checks whether pattern == val.
+func match(m map[string]reflect.Value, pattern, val reflect.Value) bool {
+ // Wildcard matches any expression. If it appears multiple
+ // times in the pattern, it must match the same expression
+ // each time.
+ if m != nil && pattern.IsValid() && pattern.Type() == identType {
+ name := pattern.Interface().(*ast.Ident).Name
+ if isWildcard(name) && val.IsValid() {
+ // wildcards only match valid (non-nil) expressions.
+ if _, ok := val.Interface().(ast.Expr); ok && !val.IsNil() {
+ if old, ok := m[name]; ok {
+ return match(nil, old, val)
+ }
+ m[name] = val
+ return true
+ }
+ }
+ }
+
+ // Otherwise, pattern and val must match recursively.
+ if !pattern.IsValid() || !val.IsValid() {
+ return !pattern.IsValid() && !val.IsValid()
+ }
+ if pattern.Type() != val.Type() {
+ return false
+ }
+
+ // Special cases.
+ switch pattern.Type() {
+ case identType:
+ // For identifiers, only the names need to match
+ // (and none of the other *ast.Object information).
+ // This is a common case, handle it all here instead
+ // of recursing down any further via reflection.
+ p := pattern.Interface().(*ast.Ident)
+ v := val.Interface().(*ast.Ident)
+ return p == nil && v == nil || p != nil && v != nil && p.Name == v.Name
+ case objectPtrType, positionType:
+ // object pointers and token positions always match
+ return true
+ case callExprType:
+ // For calls, the Ellipsis fields (token.Position) must
+ // match since that is how f(x) and f(x...) are different.
+ // Check them here but fall through for the remaining fields.
+ p := pattern.Interface().(*ast.CallExpr)
+ v := val.Interface().(*ast.CallExpr)
+ if p.Ellipsis.IsValid() != v.Ellipsis.IsValid() {
+ return false
+ }
+ }
+
+ p := reflect.Indirect(pattern)
+ v := reflect.Indirect(val)
+ if !p.IsValid() || !v.IsValid() {
+ return !p.IsValid() && !v.IsValid()
+ }
+
+ switch p.Kind() {
+ case reflect.Slice:
+ if p.Len() != v.Len() {
+ return false
+ }
+ for i := 0; i < p.Len(); i++ {
+ if !match(m, p.Index(i), v.Index(i)) {
+ return false
+ }
+ }
+ return true
+
+ case reflect.Struct:
+ for i := 0; i < p.NumField(); i++ {
+ if !match(m, p.Field(i), v.Field(i)) {
+ return false
+ }
+ }
+ return true
+
+ case reflect.Interface:
+ return match(m, p.Elem(), v.Elem())
+ }
+
+ // Handle token integers, etc.
+ return p.Interface() == v.Interface()
+}
+
+// subst returns a copy of pattern with values from m substituted in place
+// of wildcards and pos used as the position of tokens from the pattern.
+// if m == nil, subst returns a copy of pattern and doesn't change the line
+// number information.
+func subst(m map[string]reflect.Value, pattern reflect.Value, pos reflect.Value) reflect.Value {
+ if !pattern.IsValid() {
+ return reflect.Value{}
+ }
+
+ // Wildcard gets replaced with map value.
+ if m != nil && pattern.Type() == identType {
+ name := pattern.Interface().(*ast.Ident).Name
+ if isWildcard(name) {
+ if old, ok := m[name]; ok {
+ return subst(nil, old, reflect.Value{})
+ }
+ }
+ }
+
+ if pos.IsValid() && pattern.Type() == positionType {
+ // use new position only if old position was valid in the first place
+ if old := pattern.Interface().(token.Pos); !old.IsValid() {
+ return pattern
+ }
+ return pos
+ }
+
+ // Otherwise copy.
+ switch p := pattern; p.Kind() {
+ case reflect.Slice:
+ v := reflect.MakeSlice(p.Type(), p.Len(), p.Len())
+ for i := 0; i < p.Len(); i++ {
+ v.Index(i).Set(subst(m, p.Index(i), pos))
+ }
+ return v
+
+ case reflect.Struct:
+ v := reflect.New(p.Type()).Elem()
+ for i := 0; i < p.NumField(); i++ {
+ v.Field(i).Set(subst(m, p.Field(i), pos))
+ }
+ return v
+
+ case reflect.Ptr:
+ v := reflect.New(p.Type()).Elem()
+ if elem := p.Elem(); elem.IsValid() {
+ v.Set(subst(m, elem, pos).Addr())
+ }
+ return v
+
+ case reflect.Interface:
+ v := reflect.New(p.Type()).Elem()
+ if elem := p.Elem(); elem.IsValid() {
+ v.Set(subst(m, elem, pos))
+ }
+ return v
+ }
+
+ return pattern
+}
diff --git a/vendor/github.com/golangci/gofmt/gofmt/simplify.go b/vendor/github.com/golangci/gofmt/gofmt/simplify.go
new file mode 100644
index 000000000..2c75495a6
--- /dev/null
+++ b/vendor/github.com/golangci/gofmt/gofmt/simplify.go
@@ -0,0 +1,165 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gofmt
+
+import (
+ "go/ast"
+ "go/token"
+ "reflect"
+)
+
+type simplifier struct{}
+
+func (s simplifier) Visit(node ast.Node) ast.Visitor {
+ switch n := node.(type) {
+ case *ast.CompositeLit:
+ // array, slice, and map composite literals may be simplified
+ outer := n
+ var keyType, eltType ast.Expr
+ switch typ := outer.Type.(type) {
+ case *ast.ArrayType:
+ eltType = typ.Elt
+ case *ast.MapType:
+ keyType = typ.Key
+ eltType = typ.Value
+ }
+
+ if eltType != nil {
+ var ktyp reflect.Value
+ if keyType != nil {
+ ktyp = reflect.ValueOf(keyType)
+ }
+ typ := reflect.ValueOf(eltType)
+ for i, x := range outer.Elts {
+ px := &outer.Elts[i]
+ // look at value of indexed/named elements
+ if t, ok := x.(*ast.KeyValueExpr); ok {
+ if keyType != nil {
+ s.simplifyLiteral(ktyp, keyType, t.Key, &t.Key)
+ }
+ x = t.Value
+ px = &t.Value
+ }
+ s.simplifyLiteral(typ, eltType, x, px)
+ }
+ // node was simplified - stop walk (there are no subnodes to simplify)
+ return nil
+ }
+
+ case *ast.SliceExpr:
+ // a slice expression of the form: s[a:len(s)]
+ // can be simplified to: s[a:]
+ // if s is "simple enough" (for now we only accept identifiers)
+ //
+ // Note: This may not be correct because len may have been redeclared in another
+ // file belonging to the same package. However, this is extremely unlikely
+ // and so far (April 2016, after years of supporting this rewrite feature)
+ // has never come up, so let's keep it working as is (see also #15153).
+ if n.Max != nil {
+ // - 3-index slices always require the 2nd and 3rd index
+ break
+ }
+ if s, _ := n.X.(*ast.Ident); s != nil && s.Obj != nil {
+ // the array/slice object is a single, resolved identifier
+ if call, _ := n.High.(*ast.CallExpr); call != nil && len(call.Args) == 1 && !call.Ellipsis.IsValid() {
+ // the high expression is a function call with a single argument
+ if fun, _ := call.Fun.(*ast.Ident); fun != nil && fun.Name == "len" && fun.Obj == nil {
+ // the function called is "len" and it is not locally defined; and
+ // because we don't have dot imports, it must be the predefined len()
+ if arg, _ := call.Args[0].(*ast.Ident); arg != nil && arg.Obj == s.Obj {
+ // the len argument is the array/slice object
+ n.High = nil
+ }
+ }
+ }
+ }
+ // Note: We could also simplify slice expressions of the form s[0:b] to s[:b]
+ // but we leave them as is since sometimes we want to be very explicit
+ // about the lower bound.
+ // An example where the 0 helps:
+ // x, y, z := b[0:2], b[2:4], b[4:6]
+ // An example where it does not:
+ // x, y := b[:n], b[n:]
+
+ case *ast.RangeStmt:
+ // - a range of the form: for x, _ = range v {...}
+ // can be simplified to: for x = range v {...}
+ // - a range of the form: for _ = range v {...}
+ // can be simplified to: for range v {...}
+ if isBlank(n.Value) {
+ n.Value = nil
+ }
+ if isBlank(n.Key) && n.Value == nil {
+ n.Key = nil
+ }
+ }
+
+ return s
+}
+
+func (s simplifier) simplifyLiteral(typ reflect.Value, astType, x ast.Expr, px *ast.Expr) {
+ ast.Walk(s, x) // simplify x
+
+ // if the element is a composite literal and its literal type
+ // matches the outer literal's element type exactly, the inner
+ // literal type may be omitted
+ if inner, ok := x.(*ast.CompositeLit); ok {
+ if match(nil, typ, reflect.ValueOf(inner.Type)) {
+ inner.Type = nil
+ }
+ }
+ // if the outer literal's element type is a pointer type *T
+ // and the element is & of a composite literal of type T,
+ // the inner &T may be omitted.
+ if ptr, ok := astType.(*ast.StarExpr); ok {
+ if addr, ok := x.(*ast.UnaryExpr); ok && addr.Op == token.AND {
+ if inner, ok := addr.X.(*ast.CompositeLit); ok {
+ if match(nil, reflect.ValueOf(ptr.X), reflect.ValueOf(inner.Type)) {
+ inner.Type = nil // drop T
+ *px = inner // drop &
+ }
+ }
+ }
+ }
+}
+
+func isBlank(x ast.Expr) bool {
+ ident, ok := x.(*ast.Ident)
+ return ok && ident.Name == "_"
+}
+
+func simplify(f *ast.File) {
+ // remove empty declarations such as "const ()", etc
+ removeEmptyDeclGroups(f)
+
+ var s simplifier
+ ast.Walk(s, f)
+}
+
+func removeEmptyDeclGroups(f *ast.File) {
+ i := 0
+ for _, d := range f.Decls {
+ if g, ok := d.(*ast.GenDecl); !ok || !isEmpty(f, g) {
+ f.Decls[i] = d
+ i++
+ }
+ }
+ f.Decls = f.Decls[:i]
+}
+
+func isEmpty(f *ast.File, g *ast.GenDecl) bool {
+ if g.Doc != nil || g.Specs != nil {
+ return false
+ }
+
+ for _, c := range f.Comments {
+ // if there is a comment in the declaration, it is not considered empty
+ if g.Pos() <= c.Pos() && c.End() <= g.End() {
+ return false
+ }
+ }
+
+ return true
+}
diff --git a/vendor/github.com/golangci/gofmt/goimports/LICENSE b/vendor/github.com/golangci/gofmt/goimports/LICENSE
new file mode 100644
index 000000000..6a66aea5e
--- /dev/null
+++ b/vendor/github.com/golangci/gofmt/goimports/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/golangci/gofmt/goimports/goimports.go b/vendor/github.com/golangci/gofmt/goimports/goimports.go
new file mode 100644
index 000000000..8878b700d
--- /dev/null
+++ b/vendor/github.com/golangci/gofmt/goimports/goimports.go
@@ -0,0 +1,358 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package goimports
+
+import (
+ "bufio"
+ "bytes"
+ "errors"
+ "flag"
+ "fmt"
+ "go/scanner"
+ "io"
+ "io/ioutil"
+ "log"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "runtime"
+ "runtime/pprof"
+ "strings"
+
+ "golang.org/x/tools/imports"
+)
+
+var (
+ // main operation modes
+ list = flag.Bool("goimports.l", false, "list files whose formatting differs from goimport's")
+ write = flag.Bool("goimports.w", false, "write result to (source) file instead of stdout")
+ doDiff = flag.Bool("goimports.d", false, "display diffs instead of rewriting files")
+ srcdir = flag.String("goimports.srcdir", "", "choose imports as if source code is from `dir`. When operating on a single file, dir may instead be the complete file name.")
+ verbose bool // verbose logging
+
+ cpuProfile = flag.String("goimports.cpuprofile", "", "CPU profile output")
+ memProfile = flag.String("goimports.memprofile", "", "memory profile output")
+ memProfileRate = flag.Int("goimports.memrate", 0, "if > 0, sets runtime.MemProfileRate")
+
+ options = &imports.Options{
+ TabWidth: 8,
+ TabIndent: true,
+ Comments: true,
+ Fragment: true,
+ }
+ exitCode = 0
+)
+
+func init() {
+ flag.BoolVar(&options.AllErrors, "goimports.e", false, "report all errors (not just the first 10 on different lines)")
+ flag.StringVar(&imports.LocalPrefix, "goimports.local", "", "put imports beginning with this string after 3rd-party packages; comma-separated list")
+}
+
+func report(err error) {
+ scanner.PrintError(os.Stderr, err)
+ exitCode = 2
+}
+
+func usage() {
+ fmt.Fprintf(os.Stderr, "usage: goimports [flags] [path ...]\n")
+ flag.PrintDefaults()
+ os.Exit(2)
+}
+
+func isGoFile(f os.FileInfo) bool {
+ // ignore non-Go files
+ name := f.Name()
+ return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
+}
+
+// argumentType is which mode goimports was invoked as.
+type argumentType int
+
+const (
+ // fromStdin means the user is piping their source into goimports.
+ fromStdin argumentType = iota
+
+ // singleArg is the common case from editors, when goimports is run on
+ // a single file.
+ singleArg
+
+ // multipleArg is when the user ran "goimports file1.go file2.go"
+ // or ran goimports on a directory tree.
+ multipleArg
+)
+
+func processFile(filename string, in io.Reader, out io.Writer, argType argumentType) error {
+ opt := options
+ if argType == fromStdin {
+ nopt := *options
+ nopt.Fragment = true
+ opt = &nopt
+ }
+
+ if in == nil {
+ f, err := os.Open(filename)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ in = f
+ }
+
+ src, err := ioutil.ReadAll(in)
+ if err != nil {
+ return err
+ }
+
+ target := filename
+ if *srcdir != "" {
+ // Determine whether the provided -srcdirc is a directory or file
+ // and then use it to override the target.
+ //
+ // See https://github.com/dominikh/go-mode.el/issues/146
+ if isFile(*srcdir) {
+ if argType == multipleArg {
+ return errors.New("-srcdir value can't be a file when passing multiple arguments or when walking directories")
+ }
+ target = *srcdir
+ } else if argType == singleArg && strings.HasSuffix(*srcdir, ".go") && !isDir(*srcdir) {
+ // For a file which doesn't exist on disk yet, but might shortly.
+ // e.g. user in editor opens $DIR/newfile.go and newfile.go doesn't yet exist on disk.
+ // The goimports on-save hook writes the buffer to a temp file
+ // first and runs goimports before the actual save to newfile.go.
+ // The editor's buffer is named "newfile.go" so that is passed to goimports as:
+ // goimports -srcdir=/gopath/src/pkg/newfile.go /tmp/gofmtXXXXXXXX.go
+ // and then the editor reloads the result from the tmp file and writes
+ // it to newfile.go.
+ target = *srcdir
+ } else {
+ // Pretend that file is from *srcdir in order to decide
+ // visible imports correctly.
+ target = filepath.Join(*srcdir, filepath.Base(filename))
+ }
+ }
+
+ res, err := imports.Process(target, src, opt)
+ if err != nil {
+ return err
+ }
+
+ if !bytes.Equal(src, res) {
+ // formatting has changed
+ if *list {
+ fmt.Fprintln(out, filename)
+ }
+ if *write {
+ if argType == fromStdin {
+ // filename is "<standard input>"
+ return errors.New("can't use -w on stdin")
+ }
+ err = ioutil.WriteFile(filename, res, 0)
+ if err != nil {
+ return err
+ }
+ }
+ if *doDiff {
+ if argType == fromStdin {
+ filename = "stdin.go" // because <standard input>.orig looks silly
+ }
+ data, err := diff(src, res, filename)
+ if err != nil {
+ return fmt.Errorf("computing diff: %s", err)
+ }
+ fmt.Printf("diff -u %s %s\n", filepath.ToSlash(filename+".orig"), filepath.ToSlash(filename))
+ out.Write(data)
+ }
+ }
+
+ if !*list && !*write && !*doDiff {
+ _, err = out.Write(res)
+ }
+
+ return err
+}
+
+func visitFile(path string, f os.FileInfo, err error) error {
+ if err == nil && isGoFile(f) {
+ err = processFile(path, nil, os.Stdout, multipleArg)
+ }
+ if err != nil {
+ report(err)
+ }
+ return nil
+}
+
+func walkDir(path string) {
+ filepath.Walk(path, visitFile)
+}
+
+// parseFlags parses command line flags and returns the paths to process.
+// It's a var so that custom implementations can replace it in other files.
+var parseFlags = func() []string {
+ flag.BoolVar(&verbose, "v", false, "verbose logging")
+
+ flag.Parse()
+ return flag.Args()
+}
+
+func bufferedFileWriter(dest string) (w io.Writer, close func()) {
+ f, err := os.Create(dest)
+ if err != nil {
+ log.Fatal(err)
+ }
+ bw := bufio.NewWriter(f)
+ return bw, func() {
+ if err := bw.Flush(); err != nil {
+ log.Fatalf("error flushing %v: %v", dest, err)
+ }
+ if err := f.Close(); err != nil {
+ log.Fatal(err)
+ }
+ }
+}
+
+func gofmtMain() {
+ flag.Usage = usage
+ paths := parseFlags()
+
+ if *cpuProfile != "" {
+ bw, flush := bufferedFileWriter(*cpuProfile)
+ pprof.StartCPUProfile(bw)
+ defer flush()
+ defer pprof.StopCPUProfile()
+ }
+ // doTrace is a conditionally compiled wrapper around runtime/trace. It is
+ // used to allow goimports to compile under gccgo, which does not support
+ // runtime/trace. See https://golang.org/issue/15544.
+ if *memProfileRate > 0 {
+ runtime.MemProfileRate = *memProfileRate
+ bw, flush := bufferedFileWriter(*memProfile)
+ defer func() {
+ runtime.GC() // materialize all statistics
+ if err := pprof.WriteHeapProfile(bw); err != nil {
+ log.Fatal(err)
+ }
+ flush()
+ }()
+ }
+
+ if verbose {
+ log.SetFlags(log.LstdFlags | log.Lmicroseconds)
+ imports.Debug = true
+ }
+ if options.TabWidth < 0 {
+ fmt.Fprintf(os.Stderr, "negative tabwidth %d\n", options.TabWidth)
+ exitCode = 2
+ return
+ }
+
+ if len(paths) == 0 {
+ if err := processFile("<standard input>", os.Stdin, os.Stdout, fromStdin); err != nil {
+ report(err)
+ }
+ return
+ }
+
+ argType := singleArg
+ if len(paths) > 1 {
+ argType = multipleArg
+ }
+
+ for _, path := range paths {
+ switch dir, err := os.Stat(path); {
+ case err != nil:
+ report(err)
+ case dir.IsDir():
+ walkDir(path)
+ default:
+ if err := processFile(path, nil, os.Stdout, argType); err != nil {
+ report(err)
+ }
+ }
+ }
+}
+
+func writeTempFile(dir, prefix string, data []byte) (string, error) {
+ file, err := ioutil.TempFile(dir, prefix)
+ if err != nil {
+ return "", err
+ }
+ _, err = file.Write(data)
+ if err1 := file.Close(); err == nil {
+ err = err1
+ }
+ if err != nil {
+ os.Remove(file.Name())
+ return "", err
+ }
+ return file.Name(), nil
+}
+
+func diff(b1, b2 []byte, filename string) (data []byte, err error) {
+ f1, err := writeTempFile("", "gofmt", b1)
+ if err != nil {
+ return
+ }
+ defer os.Remove(f1)
+
+ f2, err := writeTempFile("", "gofmt", b2)
+ if err != nil {
+ return
+ }
+ defer os.Remove(f2)
+
+ cmd := "diff"
+ if runtime.GOOS == "plan9" {
+ cmd = "/bin/ape/diff"
+ }
+
+ data, err = exec.Command(cmd, "-u", f1, f2).CombinedOutput()
+ if len(data) > 0 {
+ // diff exits with a non-zero status when the files don't match.
+ // Ignore that failure as long as we get output.
+ return replaceTempFilename(data, filename)
+ }
+ return
+}
+
+// replaceTempFilename replaces temporary filenames in diff with actual one.
+//
+// --- /tmp/gofmt316145376 2017-02-03 19:13:00.280468375 -0500
+// +++ /tmp/gofmt617882815 2017-02-03 19:13:00.280468375 -0500
+// ...
+// ->
+// --- path/to/file.go.orig 2017-02-03 19:13:00.280468375 -0500
+// +++ path/to/file.go 2017-02-03 19:13:00.280468375 -0500
+// ...
+func replaceTempFilename(diff []byte, filename string) ([]byte, error) {
+ bs := bytes.SplitN(diff, []byte{'\n'}, 3)
+ if len(bs) < 3 {
+ return nil, fmt.Errorf("got unexpected diff for %s", filename)
+ }
+ // Preserve timestamps.
+ var t0, t1 []byte
+ if i := bytes.LastIndexByte(bs[0], '\t'); i != -1 {
+ t0 = bs[0][i:]
+ }
+ if i := bytes.LastIndexByte(bs[1], '\t'); i != -1 {
+ t1 = bs[1][i:]
+ }
+ // Always print filepath with slash separator.
+ f := filepath.ToSlash(filename)
+ bs[0] = []byte(fmt.Sprintf("--- %s%s", f+".orig", t0))
+ bs[1] = []byte(fmt.Sprintf("+++ %s%s", f, t1))
+ return bytes.Join(bs, []byte{'\n'}), nil
+}
+
+// isFile reports whether name is a file.
+func isFile(name string) bool {
+ fi, err := os.Stat(name)
+ return err == nil && fi.Mode().IsRegular()
+}
+
+// isDir reports whether name is a directory.
+func isDir(name string) bool {
+ fi, err := os.Stat(name)
+ return err == nil && fi.IsDir()
+}
diff --git a/vendor/github.com/golangci/gofmt/goimports/golangci.go b/vendor/github.com/golangci/gofmt/goimports/golangci.go
new file mode 100644
index 000000000..e9d013d58
--- /dev/null
+++ b/vendor/github.com/golangci/gofmt/goimports/golangci.go
@@ -0,0 +1,33 @@
+package goimports
+
+import (
+ "bytes"
+ "fmt"
+ "io/ioutil"
+
+ "golang.org/x/tools/imports"
+)
+
+func Run(filename string) ([]byte, error) {
+ src, err := ioutil.ReadFile(filename)
+ if err != nil {
+ return nil, err
+ }
+
+ res, err := imports.Process(filename, src, options)
+ if err != nil {
+ return nil, err
+ }
+
+ if bytes.Equal(src, res) {
+ return nil, nil
+ }
+
+ // formatting has changed
+ data, err := diff(src, res, filename)
+ if err != nil {
+ return nil, fmt.Errorf("error computing diff: %s", err)
+ }
+
+ return data, nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/LICENSE b/vendor/github.com/golangci/golangci-lint/LICENSE
new file mode 100644
index 000000000..e72bfddab
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>. \ No newline at end of file
diff --git a/vendor/github.com/golangci/golangci-lint/cmd/golangci-lint/main.go b/vendor/github.com/golangci/golangci-lint/cmd/golangci-lint/main.go
new file mode 100644
index 000000000..282d794b8
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/cmd/golangci-lint/main.go
@@ -0,0 +1,25 @@
+package main
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/golangci/golangci-lint/pkg/commands"
+ "github.com/golangci/golangci-lint/pkg/exitcodes"
+)
+
+var (
+ // Populated by goreleaser during build
+ version = "master"
+ commit = "?"
+ date = ""
+)
+
+func main() {
+ e := commands.NewExecutor(version, commit, date)
+
+ if err := e.Execute(); err != nil {
+ fmt.Fprintf(os.Stderr, "failed executing command with error %v\n", err)
+ os.Exit(exitcodes.Failure)
+ }
+}
diff --git a/vendor/github.com/golangci/golangci-lint/cmd/golangci-lint/mod_version.go b/vendor/github.com/golangci/golangci-lint/cmd/golangci-lint/mod_version.go
new file mode 100644
index 000000000..7b596728e
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/cmd/golangci-lint/mod_version.go
@@ -0,0 +1,19 @@
+// +build go1.12
+
+package main
+
+import (
+ "fmt"
+ "runtime/debug"
+)
+
+//nolint:gochecknoinits
+func init() {
+ if info, available := debug.ReadBuildInfo(); available {
+ if date == "" {
+ version = info.Main.Version
+ commit = fmt.Sprintf("(unknown, mod sum: %q)", info.Main.Sum)
+ date = "(unknown)"
+ }
+ }
+}
diff --git a/vendor/github.com/golangci/golangci-lint/internal/cache/cache.go b/vendor/github.com/golangci/golangci-lint/internal/cache/cache.go
new file mode 100644
index 000000000..ae5b7da18
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/internal/cache/cache.go
@@ -0,0 +1,544 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package cache implements a build artifact cache.
+//
+// This package is a slightly modified fork of Go's
+// cmd/go/internal/cache package.
+package cache
+
+import (
+ "bytes"
+ "crypto/sha256"
+ "encoding/hex"
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "strconv"
+ "strings"
+ "time"
+
+ "github.com/pkg/errors"
+
+ "github.com/golangci/golangci-lint/internal/renameio"
+ "github.com/golangci/golangci-lint/internal/robustio"
+)
+
+// An ActionID is a cache action key, the hash of a complete description of a
+// repeatable computation (command line, environment variables,
+// input file contents, executable contents).
+type ActionID [HashSize]byte
+
+// An OutputID is a cache output key, the hash of an output of a computation.
+type OutputID [HashSize]byte
+
+// A Cache is a package cache, backed by a file system directory tree.
+type Cache struct {
+ dir string
+ now func() time.Time
+}
+
+// Open opens and returns the cache in the given directory.
+//
+// It is safe for multiple processes on a single machine to use the
+// same cache directory in a local file system simultaneously.
+// They will coordinate using operating system file locks and may
+// duplicate effort but will not corrupt the cache.
+//
+// However, it is NOT safe for multiple processes on different machines
+// to share a cache directory (for example, if the directory were stored
+// in a network file system). File locking is notoriously unreliable in
+// network file systems and may not suffice to protect the cache.
+//
+func Open(dir string) (*Cache, error) {
+ info, err := os.Stat(dir)
+ if err != nil {
+ return nil, err
+ }
+ if !info.IsDir() {
+ return nil, &os.PathError{Op: "open", Path: dir, Err: fmt.Errorf("not a directory")}
+ }
+ for i := 0; i < 256; i++ {
+ name := filepath.Join(dir, fmt.Sprintf("%02x", i))
+ if err := os.MkdirAll(name, 0744); err != nil {
+ return nil, err
+ }
+ }
+ c := &Cache{
+ dir: dir,
+ now: time.Now,
+ }
+ return c, nil
+}
+
+// fileName returns the name of the file corresponding to the given id.
+func (c *Cache) fileName(id [HashSize]byte, key string) string {
+ return filepath.Join(c.dir, fmt.Sprintf("%02x", id[0]), fmt.Sprintf("%x", id)+"-"+key)
+}
+
+var errMissing = errors.New("cache entry not found")
+
+func IsErrMissing(err error) bool {
+ return err == errMissing
+}
+
+const (
+ // action entry file is "v1 <hex id> <hex out> <decimal size space-padded to 20 bytes> <unixnano space-padded to 20 bytes>\n"
+ hexSize = HashSize * 2
+ entrySize = 2 + 1 + hexSize + 1 + hexSize + 1 + 20 + 1 + 20 + 1
+)
+
+// verify controls whether to run the cache in verify mode.
+// In verify mode, the cache always returns errMissing from Get
+// but then double-checks in Put that the data being written
+// exactly matches any existing entry. This provides an easy
+// way to detect program behavior that would have been different
+// had the cache entry been returned from Get.
+//
+// verify is enabled by setting the environment variable
+// GODEBUG=gocacheverify=1.
+var verify = false
+
+// DebugTest is set when GODEBUG=gocachetest=1 is in the environment.
+var DebugTest = false
+
+func init() { initEnv() }
+
+func initEnv() {
+ verify = false
+ debugHash = false
+ debug := strings.Split(os.Getenv("GODEBUG"), ",")
+ for _, f := range debug {
+ if f == "gocacheverify=1" {
+ verify = true
+ }
+ if f == "gocachehash=1" {
+ debugHash = true
+ }
+ if f == "gocachetest=1" {
+ DebugTest = true
+ }
+ }
+}
+
+// Get looks up the action ID in the cache,
+// returning the corresponding output ID and file size, if any.
+// Note that finding an output ID does not guarantee that the
+// saved file for that output ID is still available.
+func (c *Cache) Get(id ActionID) (Entry, error) {
+ if verify {
+ return Entry{}, errMissing
+ }
+ return c.get(id)
+}
+
+type Entry struct {
+ OutputID OutputID
+ Size int64
+ Time time.Time
+}
+
+// get is Get but does not respect verify mode, so that Put can use it.
+func (c *Cache) get(id ActionID) (Entry, error) {
+ missing := func() (Entry, error) {
+ return Entry{}, errMissing
+ }
+ failed := func(err error) (Entry, error) {
+ return Entry{}, err
+ }
+ fileName := c.fileName(id, "a")
+ f, err := os.Open(fileName)
+ if err != nil {
+ if os.IsNotExist(err) {
+ return missing()
+ }
+ return failed(err)
+ }
+ defer f.Close()
+ entry := make([]byte, entrySize+1) // +1 to detect whether f is too long
+ if n, readErr := io.ReadFull(f, entry); n != entrySize || readErr != io.ErrUnexpectedEOF {
+ return failed(fmt.Errorf("read %d/%d bytes from %s with error %s", n, entrySize, fileName, readErr))
+ }
+ if entry[0] != 'v' || entry[1] != '1' || entry[2] != ' ' || entry[3+hexSize] != ' ' || entry[3+hexSize+1+hexSize] != ' ' || entry[3+hexSize+1+hexSize+1+20] != ' ' || entry[entrySize-1] != '\n' {
+ return failed(fmt.Errorf("bad data in %s", fileName))
+ }
+ eid, entry := entry[3:3+hexSize], entry[3+hexSize:]
+ eout, entry := entry[1:1+hexSize], entry[1+hexSize:]
+ esize, entry := entry[1:1+20], entry[1+20:]
+ etime := entry[1 : 1+20]
+ var buf [HashSize]byte
+ if _, err = hex.Decode(buf[:], eid); err != nil || buf != id {
+ return failed(errors.Wrapf(err, "failed to hex decode eid data in %s", fileName))
+ }
+ if _, err = hex.Decode(buf[:], eout); err != nil {
+ return failed(errors.Wrapf(err, "failed to hex decode eout data in %s", fileName))
+ }
+ i := 0
+ for i < len(esize) && esize[i] == ' ' {
+ i++
+ }
+ size, err := strconv.ParseInt(string(esize[i:]), 10, 64)
+ if err != nil || size < 0 {
+ return failed(fmt.Errorf("failed to parse esize int from %s with error %s", fileName, err))
+ }
+ i = 0
+ for i < len(etime) && etime[i] == ' ' {
+ i++
+ }
+ tm, err := strconv.ParseInt(string(etime[i:]), 10, 64)
+ if err != nil || tm < 0 {
+ return failed(fmt.Errorf("failed to parse etime int from %s with error %s", fileName, err))
+ }
+
+ if err = c.used(fileName); err != nil {
+ return failed(errors.Wrapf(err, "failed to mark %s as used", fileName))
+ }
+
+ return Entry{buf, size, time.Unix(0, tm)}, nil
+}
+
+// GetFile looks up the action ID in the cache and returns
+// the name of the corresponding data file.
+func (c *Cache) GetFile(id ActionID) (file string, entry Entry, err error) {
+ entry, err = c.Get(id)
+ if err != nil {
+ return "", Entry{}, err
+ }
+
+ file, err = c.OutputFile(entry.OutputID)
+ if err != nil {
+ return "", Entry{}, err
+ }
+
+ info, err := os.Stat(file)
+ if err != nil || info.Size() != entry.Size {
+ return "", Entry{}, errMissing
+ }
+ return file, entry, nil
+}
+
+// GetBytes looks up the action ID in the cache and returns
+// the corresponding output bytes.
+// GetBytes should only be used for data that can be expected to fit in memory.
+func (c *Cache) GetBytes(id ActionID) ([]byte, Entry, error) {
+ entry, err := c.Get(id)
+ if err != nil {
+ return nil, entry, err
+ }
+ outputFile, err := c.OutputFile(entry.OutputID)
+ if err != nil {
+ return nil, entry, err
+ }
+
+ data, err := robustio.ReadFile(outputFile)
+ if err != nil {
+ return nil, entry, err
+ }
+
+ if sha256.Sum256(data) != entry.OutputID {
+ return nil, entry, errMissing
+ }
+ return data, entry, nil
+}
+
+// OutputFile returns the name of the cache file storing output with the given OutputID.
+func (c *Cache) OutputFile(out OutputID) (string, error) {
+ file := c.fileName(out, "d")
+ if err := c.used(file); err != nil {
+ return "", err
+ }
+ return file, nil
+}
+
+// Time constants for cache expiration.
+//
+// We set the mtime on a cache file on each use, but at most one per mtimeInterval (1 hour),
+// to avoid causing many unnecessary inode updates. The mtimes therefore
+// roughly reflect "time of last use" but may in fact be older by at most an hour.
+//
+// We scan the cache for entries to delete at most once per trimInterval (1 day).
+//
+// When we do scan the cache, we delete entries that have not been used for
+// at least trimLimit (5 days). Statistics gathered from a month of usage by
+// Go developers found that essentially all reuse of cached entries happened
+// within 5 days of the previous reuse. See golang.org/issue/22990.
+const (
+ mtimeInterval = 1 * time.Hour
+ trimInterval = 24 * time.Hour
+ trimLimit = 5 * 24 * time.Hour
+)
+
+// used makes a best-effort attempt to update mtime on file,
+// so that mtime reflects cache access time.
+//
+// Because the reflection only needs to be approximate,
+// and to reduce the amount of disk activity caused by using
+// cache entries, used only updates the mtime if the current
+// mtime is more than an hour old. This heuristic eliminates
+// nearly all of the mtime updates that would otherwise happen,
+// while still keeping the mtimes useful for cache trimming.
+func (c *Cache) used(file string) error {
+ info, err := os.Stat(file)
+ if err != nil {
+ return errors.Wrapf(err, "failed to stat file %s", file)
+ }
+
+ if c.now().Sub(info.ModTime()) < mtimeInterval {
+ return nil
+ }
+
+ if err := os.Chtimes(file, c.now(), c.now()); err != nil {
+ return errors.Wrapf(err, "failed to change time of file %s", file)
+ }
+
+ return nil
+}
+
+// Trim removes old cache entries that are likely not to be reused.
+func (c *Cache) Trim() {
+ now := c.now()
+
+ // We maintain in dir/trim.txt the time of the last completed cache trim.
+ // If the cache has been trimmed recently enough, do nothing.
+ // This is the common case.
+ data, _ := renameio.ReadFile(filepath.Join(c.dir, "trim.txt"))
+ t, err := strconv.ParseInt(strings.TrimSpace(string(data)), 10, 64)
+ if err == nil && now.Sub(time.Unix(t, 0)) < trimInterval {
+ return
+ }
+
+ // Trim each of the 256 subdirectories.
+ // We subtract an additional mtimeInterval
+ // to account for the imprecision of our "last used" mtimes.
+ cutoff := now.Add(-trimLimit - mtimeInterval)
+ for i := 0; i < 256; i++ {
+ subdir := filepath.Join(c.dir, fmt.Sprintf("%02x", i))
+ c.trimSubdir(subdir, cutoff)
+ }
+
+ // Ignore errors from here: if we don't write the complete timestamp, the
+ // cache will appear older than it is, and we'll trim it again next time.
+ _ = renameio.WriteFile(filepath.Join(c.dir, "trim.txt"), []byte(fmt.Sprintf("%d", now.Unix())), 0666)
+}
+
+// trimSubdir trims a single cache subdirectory.
+func (c *Cache) trimSubdir(subdir string, cutoff time.Time) {
+ // Read all directory entries from subdir before removing
+ // any files, in case removing files invalidates the file offset
+ // in the directory scan. Also, ignore error from f.Readdirnames,
+ // because we don't care about reporting the error and we still
+ // want to process any entries found before the error.
+ f, err := os.Open(subdir)
+ if err != nil {
+ return
+ }
+ names, _ := f.Readdirnames(-1)
+ f.Close()
+
+ for _, name := range names {
+ // Remove only cache entries (xxxx-a and xxxx-d).
+ if !strings.HasSuffix(name, "-a") && !strings.HasSuffix(name, "-d") {
+ continue
+ }
+ entry := filepath.Join(subdir, name)
+ info, err := os.Stat(entry)
+ if err == nil && info.ModTime().Before(cutoff) {
+ os.Remove(entry)
+ }
+ }
+}
+
+// putIndexEntry adds an entry to the cache recording that executing the action
+// with the given id produces an output with the given output id (hash) and size.
+func (c *Cache) putIndexEntry(id ActionID, out OutputID, size int64, allowVerify bool) error {
+ // Note: We expect that for one reason or another it may happen
+ // that repeating an action produces a different output hash
+ // (for example, if the output contains a time stamp or temp dir name).
+ // While not ideal, this is also not a correctness problem, so we
+ // don't make a big deal about it. In particular, we leave the action
+ // cache entries writable specifically so that they can be overwritten.
+ //
+ // Setting GODEBUG=gocacheverify=1 does make a big deal:
+ // in verify mode we are double-checking that the cache entries
+ // are entirely reproducible. As just noted, this may be unrealistic
+ // in some cases but the check is also useful for shaking out real bugs.
+ entry := fmt.Sprintf("v1 %x %x %20d %20d\n", id, out, size, time.Now().UnixNano())
+
+ if verify && allowVerify {
+ old, err := c.get(id)
+ if err == nil && (old.OutputID != out || old.Size != size) {
+ // panic to show stack trace, so we can see what code is generating this cache entry.
+ msg := fmt.Sprintf("go: internal cache error: cache verify failed: id=%x changed:<<<\n%s\n>>>\nold: %x %d\nnew: %x %d", id, reverseHash(id), out, size, old.OutputID, old.Size)
+ panic(msg)
+ }
+ }
+ file := c.fileName(id, "a")
+
+ // Copy file to cache directory.
+ mode := os.O_WRONLY | os.O_CREATE
+ f, err := os.OpenFile(file, mode, 0666)
+ if err != nil {
+ return err
+ }
+ _, err = f.WriteString(entry)
+ if err == nil {
+ // Truncate the file only *after* writing it.
+ // (This should be a no-op, but truncate just in case of previous corruption.)
+ //
+ // This differs from ioutil.WriteFile, which truncates to 0 *before* writing
+ // via os.O_TRUNC. Truncating only after writing ensures that a second write
+ // of the same content to the same file is idempotent, and does not — even
+ // temporarily! — undo the effect of the first write.
+ err = f.Truncate(int64(len(entry)))
+ }
+ if closeErr := f.Close(); err == nil {
+ err = closeErr
+ }
+ if err != nil {
+ // TODO(bcmills): This Remove potentially races with another go command writing to file.
+ // Can we eliminate it?
+ os.Remove(file)
+ return err
+ }
+ if err = os.Chtimes(file, c.now(), c.now()); err != nil { // mainly for tests
+ return errors.Wrapf(err, "failed to change time of file %s", file)
+ }
+
+ return nil
+}
+
+// Put stores the given output in the cache as the output for the action ID.
+// It may read file twice. The content of file must not change between the two passes.
+func (c *Cache) Put(id ActionID, file io.ReadSeeker) (OutputID, int64, error) {
+ return c.put(id, file, true)
+}
+
+// PutNoVerify is like Put but disables the verify check
+// when GODEBUG=goverifycache=1 is set.
+// It is meant for data that is OK to cache but that we expect to vary slightly from run to run,
+// like test output containing times and the like.
+func (c *Cache) PutNoVerify(id ActionID, file io.ReadSeeker) (OutputID, int64, error) {
+ return c.put(id, file, false)
+}
+
+func (c *Cache) put(id ActionID, file io.ReadSeeker, allowVerify bool) (OutputID, int64, error) {
+ // Compute output ID.
+ h := sha256.New()
+ if _, err := file.Seek(0, 0); err != nil {
+ return OutputID{}, 0, err
+ }
+ size, err := io.Copy(h, file)
+ if err != nil {
+ return OutputID{}, 0, err
+ }
+ var out OutputID
+ h.Sum(out[:0])
+
+ // Copy to cached output file (if not already present).
+ if err := c.copyFile(file, out, size); err != nil {
+ return out, size, err
+ }
+
+ // Add to cache index.
+ return out, size, c.putIndexEntry(id, out, size, allowVerify)
+}
+
+// PutBytes stores the given bytes in the cache as the output for the action ID.
+func (c *Cache) PutBytes(id ActionID, data []byte) error {
+ _, _, err := c.Put(id, bytes.NewReader(data))
+ return err
+}
+
+// copyFile copies file into the cache, expecting it to have the given
+// output ID and size, if that file is not present already.
+func (c *Cache) copyFile(file io.ReadSeeker, out OutputID, size int64) error {
+ name := c.fileName(out, "d")
+ info, err := os.Stat(name)
+ if err == nil && info.Size() == size {
+ // Check hash.
+ if f, openErr := os.Open(name); openErr == nil {
+ h := sha256.New()
+ if _, copyErr := io.Copy(h, f); copyErr != nil {
+ return errors.Wrap(copyErr, "failed to copy to sha256")
+ }
+
+ f.Close()
+ var out2 OutputID
+ h.Sum(out2[:0])
+ if out == out2 {
+ return nil
+ }
+ }
+ // Hash did not match. Fall through and rewrite file.
+ }
+
+ // Copy file to cache directory.
+ mode := os.O_RDWR | os.O_CREATE
+ if err == nil && info.Size() > size { // shouldn't happen but fix in case
+ mode |= os.O_TRUNC
+ }
+ f, err := os.OpenFile(name, mode, 0666)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ if size == 0 {
+ // File now exists with correct size.
+ // Only one possible zero-length file, so contents are OK too.
+ // Early return here makes sure there's a "last byte" for code below.
+ return nil
+ }
+
+ // From here on, if any of the I/O writing the file fails,
+ // we make a best-effort attempt to truncate the file f
+ // before returning, to avoid leaving bad bytes in the file.
+
+ // Copy file to f, but also into h to double-check hash.
+ if _, err = file.Seek(0, 0); err != nil {
+ _ = f.Truncate(0)
+ return err
+ }
+ h := sha256.New()
+ w := io.MultiWriter(f, h)
+ if _, err = io.CopyN(w, file, size-1); err != nil {
+ _ = f.Truncate(0)
+ return err
+ }
+ // Check last byte before writing it; writing it will make the size match
+ // what other processes expect to find and might cause them to start
+ // using the file.
+ buf := make([]byte, 1)
+ if _, err = file.Read(buf); err != nil {
+ _ = f.Truncate(0)
+ return err
+ }
+ if n, wErr := h.Write(buf); n != len(buf) {
+ return fmt.Errorf("wrote to hash %d/%d bytes with error %s", n, len(buf), wErr)
+ }
+
+ sum := h.Sum(nil)
+ if !bytes.Equal(sum, out[:]) {
+ _ = f.Truncate(0)
+ return fmt.Errorf("file content changed underfoot")
+ }
+
+ // Commit cache file entry.
+ if _, err = f.Write(buf); err != nil {
+ _ = f.Truncate(0)
+ return err
+ }
+ if err = f.Close(); err != nil {
+ // Data might not have been written,
+ // but file may look like it is the right size.
+ // To be extra careful, remove cached file.
+ os.Remove(name)
+ return err
+ }
+ if err = os.Chtimes(name, c.now(), c.now()); err != nil { // mainly for tests
+ return errors.Wrapf(err, "failed to change time of file %s", name)
+ }
+
+ return nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/internal/cache/default.go b/vendor/github.com/golangci/golangci-lint/internal/cache/default.go
new file mode 100644
index 000000000..e8866cb30
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/internal/cache/default.go
@@ -0,0 +1,87 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cache
+
+import (
+ "fmt"
+ "io/ioutil"
+ "log"
+ "os"
+ "path/filepath"
+ "sync"
+)
+
+// Default returns the default cache to use.
+func Default() (*Cache, error) {
+ defaultOnce.Do(initDefaultCache)
+ return defaultCache, defaultDirErr
+}
+
+var (
+ defaultOnce sync.Once
+ defaultCache *Cache
+)
+
+// cacheREADME is a message stored in a README in the cache directory.
+// Because the cache lives outside the normal Go trees, we leave the
+// README as a courtesy to explain where it came from.
+const cacheREADME = `This directory holds cached build artifacts from golangci-lint.
+`
+
+// initDefaultCache does the work of finding the default cache
+// the first time Default is called.
+func initDefaultCache() {
+ dir := DefaultDir()
+ if err := os.MkdirAll(dir, 0744); err != nil {
+ log.Fatalf("failed to initialize build cache at %s: %s\n", dir, err)
+ }
+ if _, err := os.Stat(filepath.Join(dir, "README")); err != nil {
+ // Best effort.
+ if wErr := ioutil.WriteFile(filepath.Join(dir, "README"), []byte(cacheREADME), 0666); wErr != nil {
+ log.Fatalf("Failed to write README file to cache dir %s: %s", dir, err)
+ }
+ }
+
+ c, err := Open(dir)
+ if err != nil {
+ log.Fatalf("failed to initialize build cache at %s: %s\n", dir, err)
+ }
+ defaultCache = c
+}
+
+var (
+ defaultDirOnce sync.Once
+ defaultDir string
+ defaultDirErr error
+)
+
+// DefaultDir returns the effective GOLANGCI_LINT_CACHE setting.
+func DefaultDir() string {
+ // Save the result of the first call to DefaultDir for later use in
+ // initDefaultCache. cmd/go/main.go explicitly sets GOCACHE so that
+ // subprocesses will inherit it, but that means initDefaultCache can't
+ // otherwise distinguish between an explicit "off" and a UserCacheDir error.
+
+ defaultDirOnce.Do(func() {
+ defaultDir = os.Getenv("GOLANGCI_LINT_CACHE")
+ if filepath.IsAbs(defaultDir) {
+ return
+ }
+ if defaultDir != "" {
+ defaultDirErr = fmt.Errorf("GOLANGCI_LINT_CACHE is not an absolute path")
+ return
+ }
+
+ // Compute default location.
+ dir, err := os.UserCacheDir()
+ if err != nil {
+ defaultDirErr = fmt.Errorf("GOLANGCI_LINT_CACHE is not defined and %v", err)
+ return
+ }
+ defaultDir = filepath.Join(dir, "golangci-lint")
+ })
+
+ return defaultDir
+}
diff --git a/vendor/github.com/golangci/golangci-lint/internal/cache/hash.go b/vendor/github.com/golangci/golangci-lint/internal/cache/hash.go
new file mode 100644
index 000000000..4ce79e325
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/internal/cache/hash.go
@@ -0,0 +1,186 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cache
+
+import (
+ "bytes"
+ "crypto/sha256"
+ "fmt"
+ "hash"
+ "io"
+ "os"
+ "sync"
+)
+
+var debugHash = false // set when GODEBUG=gocachehash=1
+
+// HashSize is the number of bytes in a hash.
+const HashSize = 32
+
+// A Hash provides access to the canonical hash function used to index the cache.
+// The current implementation uses salted SHA256, but clients must not assume this.
+type Hash struct {
+ h hash.Hash
+ name string // for debugging
+ buf *bytes.Buffer // for verify
+}
+
+// hashSalt is a salt string added to the beginning of every hash
+// created by NewHash. Using the golangci-lint version makes sure that different
+// versions of the command do not address the same cache
+// entries, so that a bug in one version does not affect the execution
+// of other versions. This salt will result in additional ActionID files
+// in the cache, but not additional copies of the large output files,
+// which are still addressed by unsalted SHA256.
+var hashSalt []byte
+
+func SetSalt(b []byte) {
+ hashSalt = b
+}
+
+// Subkey returns an action ID corresponding to mixing a parent
+// action ID with a string description of the subkey.
+func Subkey(parent ActionID, desc string) (ActionID, error) {
+ h := sha256.New()
+ const subkeyPrefix = "subkey:"
+ if n, err := h.Write([]byte(subkeyPrefix)); n != len(subkeyPrefix) {
+ return ActionID{}, fmt.Errorf("wrote %d/%d bytes of subkey prefix with error %s", n, len(subkeyPrefix), err)
+ }
+ if n, err := h.Write(parent[:]); n != len(parent) {
+ return ActionID{}, fmt.Errorf("wrote %d/%d bytes of parent with error %s", n, len(parent), err)
+ }
+ if n, err := h.Write([]byte(desc)); n != len(desc) {
+ return ActionID{}, fmt.Errorf("wrote %d/%d bytes of desc with error %s", n, len(desc), err)
+ }
+
+ var out ActionID
+ h.Sum(out[:0])
+ if debugHash {
+ fmt.Fprintf(os.Stderr, "HASH subkey %x %q = %x\n", parent, desc, out)
+ }
+ if verify {
+ hashDebug.Lock()
+ hashDebug.m[out] = fmt.Sprintf("subkey %x %q", parent, desc)
+ hashDebug.Unlock()
+ }
+ return out, nil
+}
+
+// NewHash returns a new Hash.
+// The caller is expected to Write data to it and then call Sum.
+func NewHash(name string) (*Hash, error) {
+ h := &Hash{h: sha256.New(), name: name}
+ if debugHash {
+ fmt.Fprintf(os.Stderr, "HASH[%s]\n", h.name)
+ }
+ if n, err := h.Write(hashSalt); n != len(hashSalt) {
+ return nil, fmt.Errorf("wrote %d/%d bytes of hash salt with error %s", n, len(hashSalt), err)
+ }
+ if verify {
+ h.buf = new(bytes.Buffer)
+ }
+ return h, nil
+}
+
+// Write writes data to the running hash.
+func (h *Hash) Write(b []byte) (int, error) {
+ if debugHash {
+ fmt.Fprintf(os.Stderr, "HASH[%s]: %q\n", h.name, b)
+ }
+ if h.buf != nil {
+ h.buf.Write(b)
+ }
+ return h.h.Write(b)
+}
+
+// Sum returns the hash of the data written previously.
+func (h *Hash) Sum() [HashSize]byte {
+ var out [HashSize]byte
+ h.h.Sum(out[:0])
+ if debugHash {
+ fmt.Fprintf(os.Stderr, "HASH[%s]: %x\n", h.name, out)
+ }
+ if h.buf != nil {
+ hashDebug.Lock()
+ if hashDebug.m == nil {
+ hashDebug.m = make(map[[HashSize]byte]string)
+ }
+ hashDebug.m[out] = h.buf.String()
+ hashDebug.Unlock()
+ }
+ return out
+}
+
+// In GODEBUG=gocacheverify=1 mode,
+// hashDebug holds the input to every computed hash ID,
+// so that we can work backward from the ID involved in a
+// cache entry mismatch to a description of what should be there.
+var hashDebug struct {
+ sync.Mutex
+ m map[[HashSize]byte]string
+}
+
+// reverseHash returns the input used to compute the hash id.
+func reverseHash(id [HashSize]byte) string {
+ hashDebug.Lock()
+ s := hashDebug.m[id]
+ hashDebug.Unlock()
+ return s
+}
+
+var hashFileCache struct {
+ sync.Mutex
+ m map[string][HashSize]byte
+}
+
+// FileHash returns the hash of the named file.
+// It caches repeated lookups for a given file,
+// and the cache entry for a file can be initialized
+// using SetFileHash.
+// The hash used by FileHash is not the same as
+// the hash used by NewHash.
+func FileHash(file string) ([HashSize]byte, error) {
+ hashFileCache.Lock()
+ out, ok := hashFileCache.m[file]
+ hashFileCache.Unlock()
+
+ if ok {
+ return out, nil
+ }
+
+ h := sha256.New()
+ f, err := os.Open(file)
+ if err != nil {
+ if debugHash {
+ fmt.Fprintf(os.Stderr, "HASH %s: %v\n", file, err)
+ }
+ return [HashSize]byte{}, err
+ }
+ _, err = io.Copy(h, f)
+ f.Close()
+ if err != nil {
+ if debugHash {
+ fmt.Fprintf(os.Stderr, "HASH %s: %v\n", file, err)
+ }
+ return [HashSize]byte{}, err
+ }
+ h.Sum(out[:0])
+ if debugHash {
+ fmt.Fprintf(os.Stderr, "HASH %s: %x\n", file, out)
+ }
+
+ SetFileHash(file, out)
+ return out, nil
+}
+
+// SetFileHash sets the hash returned by FileHash for file.
+func SetFileHash(file string, sum [HashSize]byte) {
+ hashFileCache.Lock()
+ if hashFileCache.m == nil {
+ hashFileCache.m = make(map[string][HashSize]byte)
+ }
+ hashFileCache.m[file] = sum
+ hashFileCache.Unlock()
+}
diff --git a/vendor/github.com/golangci/golangci-lint/internal/errorutil/errors.go b/vendor/github.com/golangci/golangci-lint/internal/errorutil/errors.go
new file mode 100644
index 000000000..5cb86d669
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/internal/errorutil/errors.go
@@ -0,0 +1,23 @@
+package errorutil
+
+import (
+ "fmt"
+)
+
+// PanicError can be used to not print stacktrace twice
+type PanicError struct {
+ recovered interface{}
+ stack []byte
+}
+
+func NewPanicError(recovered interface{}, stack []byte) *PanicError {
+ return &PanicError{recovered: recovered, stack: stack}
+}
+
+func (e PanicError) Error() string {
+ return fmt.Sprint(e.recovered)
+}
+
+func (e PanicError) Stack() []byte {
+ return e.stack
+}
diff --git a/vendor/github.com/golangci/golangci-lint/internal/pkgcache/pkgcache.go b/vendor/github.com/golangci/golangci-lint/internal/pkgcache/pkgcache.go
new file mode 100644
index 000000000..86007d042
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/internal/pkgcache/pkgcache.go
@@ -0,0 +1,229 @@
+package pkgcache
+
+import (
+ "bytes"
+ "encoding/gob"
+ "encoding/hex"
+ "fmt"
+ "runtime"
+ "sort"
+ "sync"
+
+ "github.com/pkg/errors"
+ "golang.org/x/tools/go/packages"
+
+ "github.com/golangci/golangci-lint/internal/cache"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/timeutils"
+)
+
+type HashMode int
+
+const (
+ HashModeNeedOnlySelf HashMode = iota
+ HashModeNeedDirectDeps
+ HashModeNeedAllDeps
+)
+
+// Cache is a per-package data cache. A cached data is invalidated when
+// package or it's dependencies change.
+type Cache struct {
+ lowLevelCache *cache.Cache
+ pkgHashes sync.Map
+ sw *timeutils.Stopwatch
+ log logutils.Log // not used now, but may be needed for future debugging purposes
+ ioSem chan struct{} // semaphore limiting parallel IO
+}
+
+func NewCache(sw *timeutils.Stopwatch, log logutils.Log) (*Cache, error) {
+ c, err := cache.Default()
+ if err != nil {
+ return nil, err
+ }
+ return &Cache{
+ lowLevelCache: c,
+ sw: sw,
+ log: log,
+ ioSem: make(chan struct{}, runtime.GOMAXPROCS(-1)),
+ }, nil
+}
+
+func (c *Cache) Trim() {
+ c.sw.TrackStage("trim", func() {
+ c.lowLevelCache.Trim()
+ })
+}
+
+func (c *Cache) Put(pkg *packages.Package, mode HashMode, key string, data interface{}) error {
+ var err error
+ buf := &bytes.Buffer{}
+ c.sw.TrackStage("gob", func() {
+ err = gob.NewEncoder(buf).Encode(data)
+ })
+ if err != nil {
+ return errors.Wrap(err, "failed to gob encode")
+ }
+
+ var aID cache.ActionID
+
+ c.sw.TrackStage("key build", func() {
+ aID, err = c.pkgActionID(pkg, mode)
+ if err == nil {
+ subkey, subkeyErr := cache.Subkey(aID, key)
+ if subkeyErr != nil {
+ err = errors.Wrap(subkeyErr, "failed to build subkey")
+ }
+ aID = subkey
+ }
+ })
+ if err != nil {
+ return errors.Wrapf(err, "failed to calculate package %s action id", pkg.Name)
+ }
+ c.ioSem <- struct{}{}
+ c.sw.TrackStage("cache io", func() {
+ err = c.lowLevelCache.PutBytes(aID, buf.Bytes())
+ })
+ <-c.ioSem
+ if err != nil {
+ return errors.Wrapf(err, "failed to save data to low-level cache by key %s for package %s", key, pkg.Name)
+ }
+
+ return nil
+}
+
+var ErrMissing = errors.New("missing data")
+
+func (c *Cache) Get(pkg *packages.Package, mode HashMode, key string, data interface{}) error {
+ var aID cache.ActionID
+ var err error
+ c.sw.TrackStage("key build", func() {
+ aID, err = c.pkgActionID(pkg, mode)
+ if err == nil {
+ subkey, subkeyErr := cache.Subkey(aID, key)
+ if subkeyErr != nil {
+ err = errors.Wrap(subkeyErr, "failed to build subkey")
+ }
+ aID = subkey
+ }
+ })
+ if err != nil {
+ return errors.Wrapf(err, "failed to calculate package %s action id", pkg.Name)
+ }
+
+ var b []byte
+ c.ioSem <- struct{}{}
+ c.sw.TrackStage("cache io", func() {
+ b, _, err = c.lowLevelCache.GetBytes(aID)
+ })
+ <-c.ioSem
+ if err != nil {
+ if cache.IsErrMissing(err) {
+ return ErrMissing
+ }
+ return errors.Wrapf(err, "failed to get data from low-level cache by key %s for package %s", key, pkg.Name)
+ }
+
+ c.sw.TrackStage("gob", func() {
+ err = gob.NewDecoder(bytes.NewReader(b)).Decode(data)
+ })
+ if err != nil {
+ return errors.Wrap(err, "failed to gob decode")
+ }
+
+ return nil
+}
+
+func (c *Cache) pkgActionID(pkg *packages.Package, mode HashMode) (cache.ActionID, error) {
+ hash, err := c.packageHash(pkg, mode)
+ if err != nil {
+ return cache.ActionID{}, errors.Wrap(err, "failed to get package hash")
+ }
+
+ key, err := cache.NewHash("action ID")
+ if err != nil {
+ return cache.ActionID{}, errors.Wrap(err, "failed to make a hash")
+ }
+ fmt.Fprintf(key, "pkgpath %s\n", pkg.PkgPath)
+ fmt.Fprintf(key, "pkghash %s\n", hash)
+
+ return key.Sum(), nil
+}
+
+// packageHash computes a package's hash. The hash is based on all Go
+// files that make up the package, as well as the hashes of imported
+// packages.
+func (c *Cache) packageHash(pkg *packages.Package, mode HashMode) (string, error) {
+ type hashResults map[HashMode]string
+ hashResI, ok := c.pkgHashes.Load(pkg)
+ if ok {
+ hashRes := hashResI.(hashResults)
+ if _, ok := hashRes[mode]; !ok {
+ return "", fmt.Errorf("no mode %d in hash result", mode)
+ }
+ return hashRes[mode], nil
+ }
+
+ hashRes := hashResults{}
+
+ key, err := cache.NewHash("package hash")
+ if err != nil {
+ return "", errors.Wrap(err, "failed to make a hash")
+ }
+
+ fmt.Fprintf(key, "pkgpath %s\n", pkg.PkgPath)
+ for _, f := range pkg.CompiledGoFiles {
+ c.ioSem <- struct{}{}
+ h, fErr := cache.FileHash(f)
+ <-c.ioSem
+ if fErr != nil {
+ return "", errors.Wrapf(fErr, "failed to calculate file %s hash", f)
+ }
+ fmt.Fprintf(key, "file %s %x\n", f, h)
+ }
+ curSum := key.Sum()
+ hashRes[HashModeNeedOnlySelf] = hex.EncodeToString(curSum[:])
+
+ imps := make([]*packages.Package, 0, len(pkg.Imports))
+ for _, imp := range pkg.Imports {
+ imps = append(imps, imp)
+ }
+ sort.Slice(imps, func(i, j int) bool {
+ return imps[i].PkgPath < imps[j].PkgPath
+ })
+
+ calcDepsHash := func(depMode HashMode) error {
+ for _, dep := range imps {
+ if dep.PkgPath == "unsafe" {
+ continue
+ }
+
+ depHash, depErr := c.packageHash(dep, depMode)
+ if depErr != nil {
+ return errors.Wrapf(depErr, "failed to calculate hash for dependency %s with mode %d", dep.Name, depMode)
+ }
+
+ fmt.Fprintf(key, "import %s %s\n", dep.PkgPath, depHash)
+ }
+ return nil
+ }
+
+ if err := calcDepsHash(HashModeNeedOnlySelf); err != nil {
+ return "", err
+ }
+
+ curSum = key.Sum()
+ hashRes[HashModeNeedDirectDeps] = hex.EncodeToString(curSum[:])
+
+ if err := calcDepsHash(HashModeNeedAllDeps); err != nil {
+ return "", err
+ }
+ curSum = key.Sum()
+ hashRes[HashModeNeedAllDeps] = hex.EncodeToString(curSum[:])
+
+ if _, ok := hashRes[mode]; !ok {
+ return "", fmt.Errorf("invalid mode %d", mode)
+ }
+
+ c.pkgHashes.Store(pkg, hashRes)
+ return hashRes[mode], nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/internal/renameio/renameio.go b/vendor/github.com/golangci/golangci-lint/internal/renameio/renameio.go
new file mode 100644
index 000000000..fa9d93bf7
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/internal/renameio/renameio.go
@@ -0,0 +1,93 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package renameio writes files atomically by renaming temporary files.
+package renameio
+
+import (
+ "bytes"
+ "io"
+ "math/rand"
+ "os"
+ "path/filepath"
+ "strconv"
+
+ "github.com/golangci/golangci-lint/internal/robustio"
+)
+
+const patternSuffix = ".tmp"
+
+// Pattern returns a glob pattern that matches the unrenamed temporary files
+// created when writing to filename.
+func Pattern(filename string) string {
+ return filepath.Join(filepath.Dir(filename), filepath.Base(filename)+patternSuffix)
+}
+
+// WriteFile is like ioutil.WriteFile, but first writes data to an arbitrary
+// file in the same directory as filename, then renames it atomically to the
+// final name.
+//
+// That ensures that the final location, if it exists, is always a complete file.
+func WriteFile(filename string, data []byte, perm os.FileMode) (err error) {
+ return WriteToFile(filename, bytes.NewReader(data), perm)
+}
+
+// WriteToFile is a variant of WriteFile that accepts the data as an io.Reader
+// instead of a slice.
+func WriteToFile(filename string, data io.Reader, perm os.FileMode) (err error) {
+ f, err := tempFile(filepath.Dir(filename), filepath.Base(filename), perm)
+ if err != nil {
+ return err
+ }
+ defer func() {
+ // Only call os.Remove on f.Name() if we failed to rename it: otherwise,
+ // some other process may have created a new file with the same name after
+ // that.
+ if err != nil {
+ f.Close()
+ os.Remove(f.Name())
+ }
+ }()
+
+ if _, err := io.Copy(f, data); err != nil {
+ return err
+ }
+ // Sync the file before renaming it: otherwise, after a crash the reader may
+ // observe a 0-length file instead of the actual contents.
+ // See https://golang.org/issue/22397#issuecomment-380831736.
+ if err := f.Sync(); err != nil {
+ return err
+ }
+ if err := f.Close(); err != nil {
+ return err
+ }
+
+ return robustio.Rename(f.Name(), filename)
+}
+
+// tempFile creates a new temporary file with given permission bits.
+func tempFile(dir, prefix string, perm os.FileMode) (f *os.File, err error) {
+ for i := 0; i < 10000; i++ {
+ name := filepath.Join(dir, prefix+strconv.Itoa(rand.Intn(1000000000))+patternSuffix)
+ f, err = os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, perm)
+ if os.IsExist(err) {
+ continue
+ }
+ break
+ }
+ return
+}
+
+// ReadFile is like ioutil.ReadFile, but on Windows retries spurious errors that
+// may occur if the file is concurrently replaced.
+//
+// Errors are classified heuristically and retries are bounded, so even this
+// function may occasionally return a spurious error on Windows.
+// If so, the error will likely wrap one of:
+// - syscall.ERROR_ACCESS_DENIED
+// - syscall.ERROR_FILE_NOT_FOUND
+// - internal/syscall/windows.ERROR_SHARING_VIOLATION
+func ReadFile(filename string) ([]byte, error) {
+ return robustio.ReadFile(filename)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio.go b/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio.go
new file mode 100644
index 000000000..76e47ad1f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio.go
@@ -0,0 +1,53 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package robustio wraps I/O functions that are prone to failure on Windows,
+// transparently retrying errors up to an arbitrary timeout.
+//
+// Errors are classified heuristically and retries are bounded, so the functions
+// in this package do not completely eliminate spurious errors. However, they do
+// significantly reduce the rate of failure in practice.
+//
+// If so, the error will likely wrap one of:
+// The functions in this package do not completely eliminate spurious errors,
+// but substantially reduce their rate of occurrence in practice.
+package robustio
+
+// Rename is like os.Rename, but on Windows retries errors that may occur if the
+// file is concurrently read or overwritten.
+//
+// (See golang.org/issue/31247 and golang.org/issue/32188.)
+func Rename(oldpath, newpath string) error {
+ return rename(oldpath, newpath)
+}
+
+// ReadFile is like ioutil.ReadFile, but on Windows retries errors that may
+// occur if the file is concurrently replaced.
+//
+// (See golang.org/issue/31247 and golang.org/issue/32188.)
+func ReadFile(filename string) ([]byte, error) {
+ return readFile(filename)
+}
+
+// RemoveAll is like os.RemoveAll, but on Windows retries errors that may occur
+// if an executable file in the directory has recently been executed.
+//
+// (See golang.org/issue/19491.)
+func RemoveAll(path string) error {
+ return removeAll(path)
+}
+
+// IsEphemeralError reports whether err is one of the errors that the functions
+// in this package attempt to mitigate.
+//
+// Errors considered ephemeral include:
+// - syscall.ERROR_ACCESS_DENIED
+// - syscall.ERROR_FILE_NOT_FOUND
+// - internal/syscall/windows.ERROR_SHARING_VIOLATION
+//
+// This set may be expanded in the future; programs must not rely on the
+// non-ephemerality of any given error.
+func IsEphemeralError(err error) bool {
+ return isEphemeralError(err)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_darwin.go b/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_darwin.go
new file mode 100644
index 000000000..1ac0d10d7
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_darwin.go
@@ -0,0 +1,29 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package robustio
+
+import (
+ "os"
+ "syscall"
+)
+
+const errFileNotFound = syscall.ENOENT
+
+// isEphemeralError returns true if err may be resolved by waiting.
+func isEphemeralError(err error) bool {
+ switch werr := err.(type) {
+ case *os.PathError:
+ err = werr.Err
+ case *os.LinkError:
+ err = werr.Err
+ case *os.SyscallError:
+ err = werr.Err
+
+ }
+ if errno, ok := err.(syscall.Errno); ok {
+ return errno == errFileNotFound
+ }
+ return false
+}
diff --git a/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_flaky.go b/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_flaky.go
new file mode 100644
index 000000000..e0bf5b9b3
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_flaky.go
@@ -0,0 +1,93 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build windows darwin
+
+package robustio
+
+import (
+ "io/ioutil"
+ "math/rand"
+ "os"
+ "syscall"
+ "time"
+)
+
+const arbitraryTimeout = 500 * time.Millisecond
+
+const ERROR_SHARING_VIOLATION = 32
+
+// retry retries ephemeral errors from f up to an arbitrary timeout
+// to work around filesystem flakiness on Windows and Darwin.
+func retry(f func() (err error, mayRetry bool)) error {
+ var (
+ bestErr error
+ lowestErrno syscall.Errno
+ start time.Time
+ nextSleep time.Duration = 1 * time.Millisecond
+ )
+ for {
+ err, mayRetry := f()
+ if err == nil || !mayRetry {
+ return err
+ }
+
+ if errno, ok := err.(syscall.Errno); ok && (lowestErrno == 0 || errno < lowestErrno) {
+ bestErr = err
+ lowestErrno = errno
+ } else if bestErr == nil {
+ bestErr = err
+ }
+
+ if start.IsZero() {
+ start = time.Now()
+ } else if d := time.Since(start) + nextSleep; d >= arbitraryTimeout {
+ break
+ }
+ time.Sleep(nextSleep)
+ nextSleep += time.Duration(rand.Int63n(int64(nextSleep)))
+ }
+
+ return bestErr
+}
+
+// rename is like os.Rename, but retries ephemeral errors.
+//
+// On windows it wraps os.Rename, which (as of 2019-06-04) uses MoveFileEx with
+// MOVEFILE_REPLACE_EXISTING.
+//
+// Windows also provides a different system call, ReplaceFile,
+// that provides similar semantics, but perhaps preserves more metadata. (The
+// documentation on the differences between the two is very sparse.)
+//
+// Empirical error rates with MoveFileEx are lower under modest concurrency, so
+// for now we're sticking with what the os package already provides.
+func rename(oldpath, newpath string) (err error) {
+ return retry(func() (err error, mayRetry bool) {
+ err = os.Rename(oldpath, newpath)
+ return err, isEphemeralError(err)
+ })
+}
+
+// readFile is like ioutil.ReadFile, but retries ephemeral errors.
+func readFile(filename string) ([]byte, error) {
+ var b []byte
+ err := retry(func() (err error, mayRetry bool) {
+ b, err = ioutil.ReadFile(filename)
+
+ // Unlike in rename, we do not retry errFileNotFound here: it can occur
+ // as a spurious error, but the file may also genuinely not exist, so the
+ // increase in robustness is probably not worth the extra latency.
+
+ return err, isEphemeralError(err) && err != errFileNotFound
+ })
+ return b, err
+}
+
+func removeAll(path string) error {
+ return retry(func() (err error, mayRetry bool) {
+ err = os.RemoveAll(path)
+ return err, isEphemeralError(err)
+ })
+}
diff --git a/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_other.go b/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_other.go
new file mode 100644
index 000000000..a2428856f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_other.go
@@ -0,0 +1,28 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//+build !windows,!darwin
+
+package robustio
+
+import (
+ "io/ioutil"
+ "os"
+)
+
+func rename(oldpath, newpath string) error {
+ return os.Rename(oldpath, newpath)
+}
+
+func readFile(filename string) ([]byte, error) {
+ return ioutil.ReadFile(filename)
+}
+
+func removeAll(path string) error {
+ return os.RemoveAll(path)
+}
+
+func isEphemeralError(err error) bool {
+ return false
+}
diff --git a/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_windows.go b/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_windows.go
new file mode 100644
index 000000000..a35237d44
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/internal/robustio/robustio_windows.go
@@ -0,0 +1,33 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package robustio
+
+import (
+ "os"
+ "syscall"
+)
+
+const errFileNotFound = syscall.ERROR_FILE_NOT_FOUND
+
+// isEphemeralError returns true if err may be resolved by waiting.
+func isEphemeralError(err error) bool {
+ switch werr := err.(type) {
+ case *os.PathError:
+ err = werr.Err
+ case *os.LinkError:
+ err = werr.Err
+ case *os.SyscallError:
+ err = werr.Err
+ }
+ if errno, ok := err.(syscall.Errno); ok {
+ switch errno {
+ case syscall.ERROR_ACCESS_DENIED,
+ syscall.ERROR_FILE_NOT_FOUND,
+ ERROR_SHARING_VIOLATION:
+ return true
+ }
+ }
+ return false
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/commands/cache.go b/vendor/github.com/golangci/golangci-lint/pkg/commands/cache.go
new file mode 100644
index 000000000..359e2d63c
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/cache.go
@@ -0,0 +1,84 @@
+package commands
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+
+ "github.com/spf13/cobra"
+
+ "github.com/golangci/golangci-lint/internal/cache"
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+func (e *Executor) initCache() {
+ cacheCmd := &cobra.Command{
+ Use: "cache",
+ Short: "Cache control and information",
+ Run: func(cmd *cobra.Command, args []string) {
+ if len(args) != 0 {
+ e.log.Fatalf("Usage: golangci-lint cache")
+ }
+ if err := cmd.Help(); err != nil {
+ e.log.Fatalf("Can't run cache: %s", err)
+ }
+ },
+ }
+ e.rootCmd.AddCommand(cacheCmd)
+
+ cacheCmd.AddCommand(&cobra.Command{
+ Use: "clean",
+ Short: "Clean cache",
+ Run: e.executeCleanCache,
+ })
+ cacheCmd.AddCommand(&cobra.Command{
+ Use: "status",
+ Short: "Show cache status",
+ Run: e.executeCacheStatus,
+ })
+
+ // TODO: add trim command?
+}
+
+func (e *Executor) executeCleanCache(_ *cobra.Command, args []string) {
+ if len(args) != 0 {
+ e.log.Fatalf("Usage: golangci-lint cache clean")
+ }
+
+ cacheDir := cache.DefaultDir()
+ if err := os.RemoveAll(cacheDir); err != nil {
+ e.log.Fatalf("Failed to remove dir %s: %s", cacheDir, err)
+ }
+
+ os.Exit(0)
+}
+
+func (e *Executor) executeCacheStatus(_ *cobra.Command, args []string) {
+ if len(args) != 0 {
+ e.log.Fatalf("Usage: golangci-lint cache status")
+ }
+
+ cacheDir := cache.DefaultDir()
+ fmt.Fprintf(logutils.StdOut, "Dir: %s\n", cacheDir)
+ cacheSizeBytes, err := dirSizeBytes(cacheDir)
+ if err == nil {
+ fmt.Fprintf(logutils.StdOut, "Size: %s\n", fsutils.PrettifyBytesCount(cacheSizeBytes))
+ }
+
+ os.Exit(0)
+}
+
+func dirSizeBytes(path string) (int64, error) {
+ var size int64
+ err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+ if !info.IsDir() {
+ size += info.Size()
+ }
+ return err
+ })
+ return size, err
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/commands/completion.go b/vendor/github.com/golangci/golangci-lint/pkg/commands/completion.go
new file mode 100644
index 000000000..7d919d197
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/completion.go
@@ -0,0 +1,53 @@
+package commands
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/pkg/errors"
+ "github.com/spf13/cobra"
+)
+
+func (e *Executor) initCompletion() {
+ completionCmd := &cobra.Command{
+ Use: "completion",
+ Short: "Output completion script",
+ }
+ e.rootCmd.AddCommand(completionCmd)
+
+ bashCmd := &cobra.Command{
+ Use: "bash",
+ Short: "Output bash completion script",
+ RunE: e.executeBashCompletion,
+ }
+ completionCmd.AddCommand(bashCmd)
+
+ zshCmd := &cobra.Command{
+ Use: "zsh",
+ Short: "Output zsh completion script",
+ RunE: e.executeZshCompletion,
+ }
+ completionCmd.AddCommand(zshCmd)
+}
+
+func (e *Executor) executeBashCompletion(cmd *cobra.Command, args []string) error {
+ err := cmd.Root().GenBashCompletion(os.Stdout)
+ if err != nil {
+ return errors.Wrap(err, "unable to generate bash completions: %v")
+ }
+
+ return nil
+}
+
+func (e *Executor) executeZshCompletion(cmd *cobra.Command, args []string) error {
+ err := cmd.Root().GenZshCompletion(os.Stdout)
+ if err != nil {
+ return errors.Wrap(err, "unable to generate zsh completions: %v")
+ }
+ // Add extra compdef directive to support sourcing command directly.
+ // https://github.com/spf13/cobra/issues/881
+ // https://github.com/spf13/cobra/pull/887
+ fmt.Println("compdef _golangci-lint golangci-lint")
+
+ return nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/commands/config.go b/vendor/github.com/golangci/golangci-lint/pkg/commands/config.go
new file mode 100644
index 000000000..4b63e2e52
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/config.go
@@ -0,0 +1,66 @@
+package commands
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/spf13/cobra"
+ "github.com/spf13/viper"
+
+ "github.com/golangci/golangci-lint/pkg/exitcodes"
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+)
+
+func (e *Executor) initConfig() {
+ cmd := &cobra.Command{
+ Use: "config",
+ Short: "Config",
+ Run: func(cmd *cobra.Command, args []string) {
+ if len(args) != 0 {
+ e.log.Fatalf("Usage: golangci-lint config")
+ }
+ if err := cmd.Help(); err != nil {
+ e.log.Fatalf("Can't run help: %s", err)
+ }
+ },
+ }
+ e.rootCmd.AddCommand(cmd)
+
+ pathCmd := &cobra.Command{
+ Use: "path",
+ Short: "Print used config path",
+ Run: e.executePathCmd,
+ }
+ e.initRunConfiguration(pathCmd) // allow --config
+ cmd.AddCommand(pathCmd)
+}
+
+func (e *Executor) getUsedConfig() string {
+ usedConfigFile := viper.ConfigFileUsed()
+ if usedConfigFile == "" {
+ return ""
+ }
+
+ prettyUsedConfigFile, err := fsutils.ShortestRelPath(usedConfigFile, "")
+ if err != nil {
+ e.log.Warnf("Can't pretty print config file path: %s", err)
+ return usedConfigFile
+ }
+
+ return prettyUsedConfigFile
+}
+
+func (e *Executor) executePathCmd(_ *cobra.Command, args []string) {
+ if len(args) != 0 {
+ e.log.Fatalf("Usage: golangci-lint config path")
+ }
+
+ usedConfigFile := e.getUsedConfig()
+ if usedConfigFile == "" {
+ e.log.Warnf("No config file detected")
+ os.Exit(exitcodes.NoConfigFileDetected)
+ }
+
+ fmt.Println(usedConfigFile)
+ os.Exit(0)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/commands/executor.go b/vendor/github.com/golangci/golangci-lint/pkg/commands/executor.go
new file mode 100644
index 000000000..9581acab2
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/executor.go
@@ -0,0 +1,245 @@
+package commands
+
+import (
+ "bytes"
+ "context"
+ "crypto/sha256"
+ "encoding/json"
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+
+ "github.com/fatih/color"
+ "github.com/gofrs/flock"
+ "github.com/pkg/errors"
+ "github.com/spf13/cobra"
+ "github.com/spf13/pflag"
+
+ "github.com/golangci/golangci-lint/internal/cache"
+ "github.com/golangci/golangci-lint/internal/pkgcache"
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis/load"
+ "github.com/golangci/golangci-lint/pkg/goutil"
+ "github.com/golangci/golangci-lint/pkg/lint"
+ "github.com/golangci/golangci-lint/pkg/lint/lintersdb"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/report"
+ "github.com/golangci/golangci-lint/pkg/timeutils"
+)
+
+type Executor struct {
+ rootCmd *cobra.Command
+ runCmd *cobra.Command
+ lintersCmd *cobra.Command
+
+ exitCode int
+ version, commit, date string
+
+ cfg *config.Config
+ log logutils.Log
+ reportData report.Data
+ DBManager *lintersdb.Manager
+ EnabledLintersSet *lintersdb.EnabledSet
+ contextLoader *lint.ContextLoader
+ goenv *goutil.Env
+ fileCache *fsutils.FileCache
+ lineCache *fsutils.LineCache
+ pkgCache *pkgcache.Cache
+ debugf logutils.DebugFunc
+ sw *timeutils.Stopwatch
+
+ loadGuard *load.Guard
+ flock *flock.Flock
+}
+
+func NewExecutor(version, commit, date string) *Executor {
+ startedAt := time.Now()
+ e := &Executor{
+ cfg: config.NewDefault(),
+ version: version,
+ commit: commit,
+ date: date,
+ DBManager: lintersdb.NewManager(nil, nil),
+ debugf: logutils.Debug("exec"),
+ }
+
+ e.debugf("Starting execution...")
+ e.log = report.NewLogWrapper(logutils.NewStderrLog(""), &e.reportData)
+
+ // to setup log level early we need to parse config from command line extra time to
+ // find `-v` option
+ commandLineCfg, err := e.getConfigForCommandLine()
+ if err != nil && err != pflag.ErrHelp {
+ e.log.Fatalf("Can't get config for command line: %s", err)
+ }
+ if commandLineCfg != nil {
+ logutils.SetupVerboseLog(e.log, commandLineCfg.Run.IsVerbose)
+
+ switch commandLineCfg.Output.Color {
+ case "always":
+ color.NoColor = false
+ case "never":
+ color.NoColor = true
+ case "auto":
+ // nothing
+ default:
+ e.log.Fatalf("invalid value %q for --color; must be 'always', 'auto', or 'never'", commandLineCfg.Output.Color)
+ }
+ }
+
+ // init of commands must be done before config file reading because
+ // init sets config with the default values of flags
+ e.initRoot()
+ e.initRun()
+ e.initHelp()
+ e.initLinters()
+ e.initConfig()
+ e.initCompletion()
+ e.initVersion()
+ e.initCache()
+
+ // init e.cfg by values from config: flags parse will see these values
+ // like the default ones. It will overwrite them only if the same option
+ // is found in command-line: it's ok, command-line has higher priority.
+
+ r := config.NewFileReader(e.cfg, commandLineCfg, e.log.Child("config_reader"))
+ if err = r.Read(); err != nil {
+ e.log.Fatalf("Can't read config: %s", err)
+ }
+
+ // recreate after getting config
+ e.DBManager = lintersdb.NewManager(e.cfg, e.log).WithCustomLinters()
+
+ e.cfg.LintersSettings.Gocritic.InferEnabledChecks(e.log)
+ if err = e.cfg.LintersSettings.Gocritic.Validate(e.log); err != nil {
+ e.log.Fatalf("Invalid gocritic settings: %s", err)
+ }
+
+ // Slice options must be explicitly set for proper merging of config and command-line options.
+ fixSlicesFlags(e.runCmd.Flags())
+ fixSlicesFlags(e.lintersCmd.Flags())
+
+ e.EnabledLintersSet = lintersdb.NewEnabledSet(e.DBManager,
+ lintersdb.NewValidator(e.DBManager), e.log.Child("lintersdb"), e.cfg)
+ e.goenv = goutil.NewEnv(e.log.Child("goenv"))
+ e.fileCache = fsutils.NewFileCache()
+ e.lineCache = fsutils.NewLineCache(e.fileCache)
+
+ e.sw = timeutils.NewStopwatch("pkgcache", e.log.Child("stopwatch"))
+ e.pkgCache, err = pkgcache.NewCache(e.sw, e.log.Child("pkgcache"))
+ if err != nil {
+ e.log.Fatalf("Failed to build packages cache: %s", err)
+ }
+ e.loadGuard = load.NewGuard()
+ e.contextLoader = lint.NewContextLoader(e.cfg, e.log.Child("loader"), e.goenv,
+ e.lineCache, e.fileCache, e.pkgCache, e.loadGuard)
+ if err = e.initHashSalt(version); err != nil {
+ e.log.Fatalf("Failed to init hash salt: %s", err)
+ }
+ e.debugf("Initialized executor in %s", time.Since(startedAt))
+ return e
+}
+
+func (e *Executor) Execute() error {
+ return e.rootCmd.Execute()
+}
+
+func (e *Executor) initHashSalt(version string) error {
+ binSalt, err := computeBinarySalt(version)
+ if err != nil {
+ return errors.Wrap(err, "failed to calculate binary salt")
+ }
+
+ configSalt, err := computeConfigSalt(e.cfg)
+ if err != nil {
+ return errors.Wrap(err, "failed to calculate config salt")
+ }
+
+ var b bytes.Buffer
+ b.Write(binSalt)
+ b.Write(configSalt)
+ cache.SetSalt(b.Bytes())
+ return nil
+}
+
+func computeBinarySalt(version string) ([]byte, error) {
+ if version != "" && version != "(devel)" {
+ return []byte(version), nil
+ }
+
+ if logutils.HaveDebugTag("bin_salt") {
+ return []byte("debug"), nil
+ }
+
+ p, err := os.Executable()
+ if err != nil {
+ return nil, err
+ }
+ f, err := os.Open(p)
+ if err != nil {
+ return nil, err
+ }
+ defer f.Close()
+ h := sha256.New()
+ if _, err := io.Copy(h, f); err != nil {
+ return nil, err
+ }
+ return h.Sum(nil), nil
+}
+
+func computeConfigSalt(cfg *config.Config) ([]byte, error) {
+ // We don't hash all config fields to reduce meaningless cache
+ // invalidations. At least, it has a huge impact on tests speed.
+
+ lintersSettingsBytes, err := json.Marshal(cfg.LintersSettings)
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to json marshal config linter settings")
+ }
+
+ var configData bytes.Buffer
+ configData.WriteString("linters-settings=")
+ configData.Write(lintersSettingsBytes)
+ configData.WriteString("\nbuild-tags=%s" + strings.Join(cfg.Run.BuildTags, ","))
+
+ h := sha256.New()
+ h.Write(configData.Bytes()) //nolint:errcheck
+ return h.Sum(nil), nil
+}
+
+func (e *Executor) acquireFileLock() bool {
+ if e.cfg.Run.AllowParallelRunners {
+ e.debugf("Parallel runners are allowed, no locking")
+ return true
+ }
+
+ lockFile := filepath.Join(os.TempDir(), "golangci-lint.lock")
+ e.debugf("Locking on file %s...", lockFile)
+ f := flock.New(lockFile)
+ const totalTimeout = 5 * time.Second
+ const retryDelay = time.Second
+ ctx, finish := context.WithTimeout(context.Background(), totalTimeout)
+ defer finish()
+
+ if ok, _ := f.TryLockContext(ctx, retryDelay); !ok {
+ return false
+ }
+
+ e.flock = f
+ return true
+}
+
+func (e *Executor) releaseFileLock() {
+ if e.cfg.Run.AllowParallelRunners {
+ return
+ }
+
+ if err := e.flock.Unlock(); err != nil {
+ e.debugf("Failed to unlock on file: %s", err)
+ }
+ if err := os.Remove(e.flock.Path()); err != nil {
+ e.debugf("Failed to remove lock file: %s", err)
+ }
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/commands/help.go b/vendor/github.com/golangci/golangci-lint/pkg/commands/help.go
new file mode 100644
index 000000000..16fef33eb
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/help.go
@@ -0,0 +1,84 @@
+package commands
+
+import (
+ "fmt"
+ "os"
+ "sort"
+ "strings"
+
+ "github.com/fatih/color"
+ "github.com/spf13/cobra"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+func (e *Executor) initHelp() {
+ helpCmd := &cobra.Command{
+ Use: "help",
+ Short: "Help",
+ Run: func(cmd *cobra.Command, args []string) {
+ if len(args) != 0 {
+ e.log.Fatalf("Usage: golangci-lint help")
+ }
+ if err := cmd.Help(); err != nil {
+ e.log.Fatalf("Can't run help: %s", err)
+ }
+ },
+ }
+ e.rootCmd.SetHelpCommand(helpCmd)
+
+ lintersHelpCmd := &cobra.Command{
+ Use: "linters",
+ Short: "Help about linters",
+ Run: e.executeLintersHelp,
+ }
+ helpCmd.AddCommand(lintersHelpCmd)
+}
+
+func printLinterConfigs(lcs []*linter.Config) {
+ sort.Slice(lcs, func(i, j int) bool {
+ return strings.Compare(lcs[i].Name(), lcs[j].Name()) < 0
+ })
+ for _, lc := range lcs {
+ altNamesStr := ""
+ if len(lc.AlternativeNames) != 0 {
+ altNamesStr = fmt.Sprintf(" (%s)", strings.Join(lc.AlternativeNames, ", "))
+ }
+ fmt.Fprintf(logutils.StdOut, "%s%s: %s [fast: %t, auto-fix: %t]\n", color.YellowString(lc.Name()),
+ altNamesStr, lc.Linter.Desc(), !lc.IsSlowLinter(), lc.CanAutoFix)
+ }
+}
+
+func (e *Executor) executeLintersHelp(_ *cobra.Command, args []string) {
+ if len(args) != 0 {
+ e.log.Fatalf("Usage: golangci-lint help linters")
+ }
+
+ var enabledLCs, disabledLCs []*linter.Config
+ for _, lc := range e.DBManager.GetAllSupportedLinterConfigs() {
+ if lc.EnabledByDefault {
+ enabledLCs = append(enabledLCs, lc)
+ } else {
+ disabledLCs = append(disabledLCs, lc)
+ }
+ }
+
+ color.Green("Enabled by default linters:\n")
+ printLinterConfigs(enabledLCs)
+ color.Red("\nDisabled by default linters:\n")
+ printLinterConfigs(disabledLCs)
+
+ color.Green("\nLinters presets:")
+ for _, p := range e.DBManager.AllPresets() {
+ linters := e.DBManager.GetAllLinterConfigsForPreset(p)
+ linterNames := []string{}
+ for _, lc := range linters {
+ linterNames = append(linterNames, lc.Name())
+ }
+ sort.Strings(linterNames)
+ fmt.Fprintf(logutils.StdOut, "%s: %s\n", color.YellowString(p), strings.Join(linterNames, ", "))
+ }
+
+ os.Exit(0)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/commands/linters.go b/vendor/github.com/golangci/golangci-lint/pkg/commands/linters.go
new file mode 100644
index 000000000..873dab817
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/linters.go
@@ -0,0 +1,51 @@
+package commands
+
+import (
+ "log"
+ "os"
+
+ "github.com/fatih/color"
+ "github.com/spf13/cobra"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+)
+
+func (e *Executor) initLinters() {
+ e.lintersCmd = &cobra.Command{
+ Use: "linters",
+ Short: "List current linters configuration",
+ Run: e.executeLinters,
+ }
+ e.rootCmd.AddCommand(e.lintersCmd)
+ e.initRunConfiguration(e.lintersCmd)
+}
+
+func (e *Executor) executeLinters(_ *cobra.Command, args []string) {
+ if len(args) != 0 {
+ e.log.Fatalf("Usage: golangci-lint linters")
+ }
+
+ enabledLintersMap, err := e.EnabledLintersSet.GetEnabledLintersMap()
+ if err != nil {
+ log.Fatalf("Can't get enabled linters: %s", err)
+ }
+
+ color.Green("Enabled by your configuration linters:\n")
+ enabledLinters := make([]*linter.Config, 0, len(enabledLintersMap))
+ for _, linter := range enabledLintersMap {
+ enabledLinters = append(enabledLinters, linter)
+ }
+ printLinterConfigs(enabledLinters)
+
+ var disabledLCs []*linter.Config
+ for _, lc := range e.DBManager.GetAllSupportedLinterConfigs() {
+ if enabledLintersMap[lc.Name()] == nil {
+ disabledLCs = append(disabledLCs, lc)
+ }
+ }
+
+ color.Red("\nDisabled by your configuration linters:\n")
+ printLinterConfigs(disabledLCs)
+
+ os.Exit(0)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/commands/root.go b/vendor/github.com/golangci/golangci-lint/pkg/commands/root.go
new file mode 100644
index 000000000..f90df9901
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/root.go
@@ -0,0 +1,165 @@
+package commands
+
+import (
+ "fmt"
+ "os"
+ "runtime"
+ "runtime/pprof"
+ "runtime/trace"
+ "strconv"
+
+ "github.com/spf13/cobra"
+ "github.com/spf13/pflag"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+func (e *Executor) persistentPreRun(_ *cobra.Command, _ []string) {
+ if e.cfg.Run.PrintVersion {
+ fmt.Fprintf(logutils.StdOut, "golangci-lint has version %s built from %s on %s\n", e.version, e.commit, e.date)
+ os.Exit(0)
+ }
+
+ runtime.GOMAXPROCS(e.cfg.Run.Concurrency)
+
+ if e.cfg.Run.CPUProfilePath != "" {
+ f, err := os.Create(e.cfg.Run.CPUProfilePath)
+ if err != nil {
+ e.log.Fatalf("Can't create file %s: %s", e.cfg.Run.CPUProfilePath, err)
+ }
+ if err := pprof.StartCPUProfile(f); err != nil {
+ e.log.Fatalf("Can't start CPU profiling: %s", err)
+ }
+ }
+
+ if e.cfg.Run.MemProfilePath != "" {
+ if rate := os.Getenv("GL_MEMPROFILE_RATE"); rate != "" {
+ runtime.MemProfileRate, _ = strconv.Atoi(rate)
+ }
+ }
+
+ if e.cfg.Run.TracePath != "" {
+ f, err := os.Create(e.cfg.Run.TracePath)
+ if err != nil {
+ e.log.Fatalf("Can't create file %s: %s", e.cfg.Run.TracePath, err)
+ }
+ if err = trace.Start(f); err != nil {
+ e.log.Fatalf("Can't start tracing: %s", err)
+ }
+ }
+}
+
+func (e *Executor) persistentPostRun(_ *cobra.Command, _ []string) {
+ if e.cfg.Run.CPUProfilePath != "" {
+ pprof.StopCPUProfile()
+ }
+ if e.cfg.Run.MemProfilePath != "" {
+ f, err := os.Create(e.cfg.Run.MemProfilePath)
+ if err != nil {
+ e.log.Fatalf("Can't create file %s: %s", e.cfg.Run.MemProfilePath, err)
+ }
+
+ var ms runtime.MemStats
+ runtime.ReadMemStats(&ms)
+ printMemStats(&ms, e.log)
+
+ if err := pprof.WriteHeapProfile(f); err != nil {
+ e.log.Fatalf("Can't write heap profile: %s", err)
+ }
+ f.Close()
+ }
+ if e.cfg.Run.TracePath != "" {
+ trace.Stop()
+ }
+
+ os.Exit(e.exitCode)
+}
+
+func printMemStats(ms *runtime.MemStats, logger logutils.Log) {
+ logger.Infof("Mem stats: alloc=%s total_alloc=%s sys=%s "+
+ "heap_alloc=%s heap_sys=%s heap_idle=%s heap_released=%s heap_in_use=%s "+
+ "stack_in_use=%s stack_sys=%s "+
+ "mspan_sys=%s mcache_sys=%s buck_hash_sys=%s gc_sys=%s other_sys=%s "+
+ "mallocs_n=%d frees_n=%d heap_objects_n=%d gc_cpu_fraction=%.2f",
+ formatMemory(ms.Alloc), formatMemory(ms.TotalAlloc), formatMemory(ms.Sys),
+ formatMemory(ms.HeapAlloc), formatMemory(ms.HeapSys),
+ formatMemory(ms.HeapIdle), formatMemory(ms.HeapReleased), formatMemory(ms.HeapInuse),
+ formatMemory(ms.StackInuse), formatMemory(ms.StackSys),
+ formatMemory(ms.MSpanSys), formatMemory(ms.MCacheSys), formatMemory(ms.BuckHashSys),
+ formatMemory(ms.GCSys), formatMemory(ms.OtherSys),
+ ms.Mallocs, ms.Frees, ms.HeapObjects, ms.GCCPUFraction)
+}
+
+func formatMemory(memBytes uint64) string {
+ const Kb = 1024
+ const Mb = Kb * 1024
+
+ if memBytes < Kb {
+ return fmt.Sprintf("%db", memBytes)
+ }
+ if memBytes < Mb {
+ return fmt.Sprintf("%dkb", memBytes/Kb)
+ }
+ return fmt.Sprintf("%dmb", memBytes/Mb)
+}
+
+func getDefaultConcurrency() int {
+ if os.Getenv("HELP_RUN") == "1" {
+ // Make stable concurrency for README help generating builds.
+ const prettyConcurrency = 8
+ return prettyConcurrency
+ }
+
+ return runtime.NumCPU()
+}
+
+func (e *Executor) initRoot() {
+ rootCmd := &cobra.Command{
+ Use: "golangci-lint",
+ Short: "golangci-lint is a smart linters runner.",
+ Long: `Smart, fast linters runner. Run it in cloud for every GitHub pull request on https://golangci.com`,
+ Run: func(cmd *cobra.Command, args []string) {
+ if len(args) != 0 {
+ e.log.Fatalf("Usage: golangci-lint")
+ }
+ if err := cmd.Help(); err != nil {
+ e.log.Fatalf("Can't run help: %s", err)
+ }
+ },
+ PersistentPreRun: e.persistentPreRun,
+ PersistentPostRun: e.persistentPostRun,
+ }
+
+ initRootFlagSet(rootCmd.PersistentFlags(), e.cfg, e.needVersionOption())
+ e.rootCmd = rootCmd
+}
+
+func (e *Executor) needVersionOption() bool {
+ return e.date != ""
+}
+
+func initRootFlagSet(fs *pflag.FlagSet, cfg *config.Config, needVersionOption bool) {
+ fs.BoolVarP(&cfg.Run.IsVerbose, "verbose", "v", false, wh("verbose output"))
+
+ var silent bool
+ fs.BoolVarP(&silent, "silent", "s", false, wh("disables congrats outputs"))
+ if err := fs.MarkHidden("silent"); err != nil {
+ panic(err)
+ }
+ err := fs.MarkDeprecated("silent",
+ "now golangci-lint by default is silent: it doesn't print Congrats message")
+ if err != nil {
+ panic(err)
+ }
+
+ fs.StringVar(&cfg.Run.CPUProfilePath, "cpu-profile-path", "", wh("Path to CPU profile output file"))
+ fs.StringVar(&cfg.Run.MemProfilePath, "mem-profile-path", "", wh("Path to memory profile output file"))
+ fs.StringVar(&cfg.Run.TracePath, "trace-path", "", wh("Path to trace output file"))
+ fs.IntVarP(&cfg.Run.Concurrency, "concurrency", "j", getDefaultConcurrency(), wh("Concurrency (default NumCPU)"))
+ if needVersionOption {
+ fs.BoolVar(&cfg.Run.PrintVersion, "version", false, wh("Print version"))
+ }
+
+ fs.StringVar(&cfg.Output.Color, "color", "auto", wh("Use color when printing; can be 'always', 'auto', or 'never'"))
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/commands/run.go b/vendor/github.com/golangci/golangci-lint/pkg/commands/run.go
new file mode 100644
index 000000000..e4887d587
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/run.go
@@ -0,0 +1,534 @@
+package commands
+
+import (
+ "context"
+ "fmt"
+ "io/ioutil"
+ "log"
+ "os"
+ "runtime"
+ "strings"
+ "time"
+
+ "github.com/fatih/color"
+ "github.com/pkg/errors"
+ "github.com/spf13/cobra"
+ "github.com/spf13/pflag"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/exitcodes"
+ "github.com/golangci/golangci-lint/pkg/lint"
+ "github.com/golangci/golangci-lint/pkg/lint/lintersdb"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/packages"
+ "github.com/golangci/golangci-lint/pkg/printers"
+ "github.com/golangci/golangci-lint/pkg/result"
+ "github.com/golangci/golangci-lint/pkg/result/processors"
+)
+
+func getDefaultIssueExcludeHelp() string {
+ parts := []string{"Use or not use default excludes:"}
+ for _, ep := range config.DefaultExcludePatterns {
+ parts = append(parts,
+ fmt.Sprintf(" # %s %s: %s", ep.ID, ep.Linter, ep.Why),
+ fmt.Sprintf(" - %s", color.YellowString(ep.Pattern)),
+ "",
+ )
+ }
+ return strings.Join(parts, "\n")
+}
+
+func getDefaultDirectoryExcludeHelp() string {
+ parts := []string{"Use or not use default excluded directories:"}
+ for _, dir := range packages.StdExcludeDirRegexps {
+ parts = append(parts, fmt.Sprintf(" - %s", color.YellowString(dir)))
+ }
+ parts = append(parts, "")
+ return strings.Join(parts, "\n")
+}
+
+const welcomeMessage = "Run this tool in cloud on every github pull " +
+ "request in https://golangci.com for free (public repos)"
+
+func wh(text string) string {
+ return color.GreenString(text)
+}
+
+const defaultTimeout = time.Minute
+
+//nolint:funlen
+func initFlagSet(fs *pflag.FlagSet, cfg *config.Config, m *lintersdb.Manager, isFinalInit bool) {
+ hideFlag := func(name string) {
+ if err := fs.MarkHidden(name); err != nil {
+ panic(err)
+ }
+
+ // we run initFlagSet multiple times, but we wouldn't like to see deprecation message multiple times
+ if isFinalInit {
+ const deprecateMessage = "flag will be removed soon, please, use .golangci.yml config"
+ if err := fs.MarkDeprecated(name, deprecateMessage); err != nil {
+ panic(err)
+ }
+ }
+ }
+
+ // Output config
+ oc := &cfg.Output
+ fs.StringVar(&oc.Format, "out-format",
+ config.OutFormatColoredLineNumber,
+ wh(fmt.Sprintf("Format of output: %s", strings.Join(config.OutFormats, "|"))))
+ fs.BoolVar(&oc.PrintIssuedLine, "print-issued-lines", true, wh("Print lines of code with issue"))
+ fs.BoolVar(&oc.PrintLinterName, "print-linter-name", true, wh("Print linter name in issue line"))
+ fs.BoolVar(&oc.UniqByLine, "uniq-by-line", true, wh("Make issues output unique by line"))
+ fs.BoolVar(&oc.PrintWelcomeMessage, "print-welcome", false, wh("Print welcome message"))
+ hideFlag("print-welcome") // no longer used
+
+ // Run config
+ rc := &cfg.Run
+ fs.StringVar(&rc.ModulesDownloadMode, "modules-download-mode", "",
+ "Modules download mode. If not empty, passed as -mod=<mode> to go tools")
+ fs.IntVar(&rc.ExitCodeIfIssuesFound, "issues-exit-code",
+ exitcodes.IssuesFound, wh("Exit code when issues were found"))
+ fs.StringSliceVar(&rc.BuildTags, "build-tags", nil, wh("Build tags"))
+
+ fs.DurationVar(&rc.Timeout, "deadline", defaultTimeout, wh("Deadline for total work"))
+ if err := fs.MarkHidden("deadline"); err != nil {
+ panic(err)
+ }
+ fs.DurationVar(&rc.Timeout, "timeout", defaultTimeout, wh("Timeout for total work"))
+
+ fs.BoolVar(&rc.AnalyzeTests, "tests", true, wh("Analyze tests (*_test.go)"))
+ fs.BoolVar(&rc.PrintResourcesUsage, "print-resources-usage", false,
+ wh("Print avg and max memory usage of golangci-lint and total time"))
+ fs.StringVarP(&rc.Config, "config", "c", "", wh("Read config from file path `PATH`"))
+ fs.BoolVar(&rc.NoConfig, "no-config", false, wh("Don't read config"))
+ fs.StringSliceVar(&rc.SkipDirs, "skip-dirs", nil, wh("Regexps of directories to skip"))
+ fs.BoolVar(&rc.UseDefaultSkipDirs, "skip-dirs-use-default", true, getDefaultDirectoryExcludeHelp())
+ fs.StringSliceVar(&rc.SkipFiles, "skip-files", nil, wh("Regexps of files to skip"))
+
+ const allowParallelDesc = "Allow multiple parallel golangci-lint instances running. " +
+ "If false (default) - golangci-lint acquires file lock on start."
+ fs.BoolVar(&rc.AllowParallelRunners, "allow-parallel-runners", false, wh(allowParallelDesc))
+
+ // Linters settings config
+ lsc := &cfg.LintersSettings
+
+ // Hide all linters settings flags: they were initially visible,
+ // but when number of linters started to grow it became obvious that
+ // we can't fill 90% of flags by linters settings: common flags became hard to find.
+ // New linters settings should be done only through config file.
+ fs.BoolVar(&lsc.Errcheck.CheckTypeAssertions, "errcheck.check-type-assertions",
+ false, "Errcheck: check for ignored type assertion results")
+ hideFlag("errcheck.check-type-assertions")
+ fs.BoolVar(&lsc.Errcheck.CheckAssignToBlank, "errcheck.check-blank", false,
+ "Errcheck: check for errors assigned to blank identifier: _ = errFunc()")
+ hideFlag("errcheck.check-blank")
+ fs.StringVar(&lsc.Errcheck.Exclude, "errcheck.exclude", "",
+ "Path to a file containing a list of functions to exclude from checking")
+ hideFlag("errcheck.exclude")
+ fs.StringVar(&lsc.Errcheck.Ignore, "errcheck.ignore", "fmt:.*",
+ `Comma-separated list of pairs of the form pkg:regex. The regex is used to ignore names within pkg`)
+ hideFlag("errcheck.ignore")
+
+ fs.BoolVar(&lsc.Govet.CheckShadowing, "govet.check-shadowing", false,
+ "Govet: check for shadowed variables")
+ hideFlag("govet.check-shadowing")
+
+ fs.Float64Var(&lsc.Golint.MinConfidence, "golint.min-confidence", 0.8,
+ "Golint: minimum confidence of a problem to print it")
+ hideFlag("golint.min-confidence")
+
+ fs.BoolVar(&lsc.Gofmt.Simplify, "gofmt.simplify", true, "Gofmt: simplify code")
+ hideFlag("gofmt.simplify")
+
+ fs.IntVar(&lsc.Gocyclo.MinComplexity, "gocyclo.min-complexity",
+ 30, "Minimal complexity of function to report it")
+ hideFlag("gocyclo.min-complexity")
+
+ fs.BoolVar(&lsc.Maligned.SuggestNewOrder, "maligned.suggest-new", false,
+ "Maligned: print suggested more optimal struct fields ordering")
+ hideFlag("maligned.suggest-new")
+
+ fs.IntVar(&lsc.Dupl.Threshold, "dupl.threshold",
+ 150, "Dupl: Minimal threshold to detect copy-paste")
+ hideFlag("dupl.threshold")
+
+ fs.IntVar(&lsc.Goconst.MinStringLen, "goconst.min-len",
+ 3, "Goconst: minimum constant string length")
+ hideFlag("goconst.min-len")
+ fs.IntVar(&lsc.Goconst.MinOccurrencesCount, "goconst.min-occurrences",
+ 3, "Goconst: minimum occurrences of constant string count to trigger issue")
+ hideFlag("goconst.min-occurrences")
+
+ // (@dixonwille) These flag is only used for testing purposes.
+ fs.StringSliceVar(&lsc.Depguard.Packages, "depguard.packages", nil,
+ "Depguard: packages to add to the list")
+ hideFlag("depguard.packages")
+
+ fs.BoolVar(&lsc.Depguard.IncludeGoRoot, "depguard.include-go-root", false,
+ "Depguard: check list against standard lib")
+ hideFlag("depguard.include-go-root")
+
+ fs.IntVar(&lsc.Lll.TabWidth, "lll.tab-width", 1,
+ "Lll: tab width in spaces")
+ hideFlag("lll.tab-width")
+
+ // Linters config
+ lc := &cfg.Linters
+ fs.StringSliceVarP(&lc.Enable, "enable", "E", nil, wh("Enable specific linter"))
+ fs.StringSliceVarP(&lc.Disable, "disable", "D", nil, wh("Disable specific linter"))
+ fs.BoolVar(&lc.EnableAll, "enable-all", false, wh("Enable all linters"))
+ if err := fs.MarkHidden("enable-all"); err != nil {
+ panic(err)
+ }
+ // TODO: run hideFlag("enable-all") to print deprecation message.
+
+ fs.BoolVar(&lc.DisableAll, "disable-all", false, wh("Disable all linters"))
+ fs.StringSliceVarP(&lc.Presets, "presets", "p", nil,
+ wh(fmt.Sprintf("Enable presets (%s) of linters. Run 'golangci-lint linters' to see "+
+ "them. This option implies option --disable-all", strings.Join(m.AllPresets(), "|"))))
+ fs.BoolVar(&lc.Fast, "fast", false, wh("Run only fast linters from enabled linters set (first run won't be fast)"))
+
+ // Issues config
+ ic := &cfg.Issues
+ fs.StringSliceVarP(&ic.ExcludePatterns, "exclude", "e", nil, wh("Exclude issue by regexp"))
+ fs.BoolVar(&ic.UseDefaultExcludes, "exclude-use-default", true, getDefaultIssueExcludeHelp())
+ fs.BoolVar(&ic.ExcludeCaseSensitive, "exclude-case-sensitive", false, wh("If set to true exclude "+
+ "and exclude rules regular expressions are case sensitive"))
+
+ fs.IntVar(&ic.MaxIssuesPerLinter, "max-issues-per-linter", 50,
+ wh("Maximum issues count per one linter. Set to 0 to disable"))
+ fs.IntVar(&ic.MaxSameIssues, "max-same-issues", 3,
+ wh("Maximum count of issues with the same text. Set to 0 to disable"))
+
+ fs.BoolVarP(&ic.Diff, "new", "n", false,
+ wh("Show only new issues: if there are unstaged changes or untracked files, only those changes "+
+ "are analyzed, else only changes in HEAD~ are analyzed.\nIt's a super-useful option for integration "+
+ "of golangci-lint into existing large codebase.\nIt's not practical to fix all existing issues at "+
+ "the moment of integration: much better to not allow issues in new code.\nFor CI setups, prefer "+
+ "--new-from-rev=HEAD~, as --new can skip linting the current patch if any scripts generate "+
+ "unstaged files before golangci-lint runs."))
+ fs.StringVar(&ic.DiffFromRevision, "new-from-rev", "",
+ wh("Show only new issues created after git revision `REV`"))
+ fs.StringVar(&ic.DiffPatchFilePath, "new-from-patch", "",
+ wh("Show only new issues created in git patch with file path `PATH`"))
+ fs.BoolVar(&ic.NeedFix, "fix", false, "Fix found issues (if it's supported by the linter)")
+}
+
+func (e *Executor) initRunConfiguration(cmd *cobra.Command) {
+ fs := cmd.Flags()
+ fs.SortFlags = false // sort them as they are defined here
+ initFlagSet(fs, e.cfg, e.DBManager, true)
+}
+
+func (e *Executor) getConfigForCommandLine() (*config.Config, error) {
+ // We use another pflag.FlagSet here to not set `changed` flag
+ // on cmd.Flags() options. Otherwise string slice options will be duplicated.
+ fs := pflag.NewFlagSet("config flag set", pflag.ContinueOnError)
+
+ var cfg config.Config
+ // Don't do `fs.AddFlagSet(cmd.Flags())` because it shares flags representations:
+ // `changed` variable inside string slice vars will be shared.
+ // Use another config variable here, not e.cfg, to not
+ // affect main parsing by this parsing of only config option.
+ initFlagSet(fs, &cfg, e.DBManager, false)
+
+ // Parse max options, even force version option: don't want
+ // to get access to Executor here: it's error-prone to use
+ // cfg vs e.cfg.
+ initRootFlagSet(fs, &cfg, true)
+
+ fs.Usage = func() {} // otherwise help text will be printed twice
+ if err := fs.Parse(os.Args); err != nil {
+ if err == pflag.ErrHelp {
+ return nil, err
+ }
+
+ return nil, fmt.Errorf("can't parse args: %s", err)
+ }
+
+ return &cfg, nil
+}
+
+func (e *Executor) initRun() {
+ e.runCmd = &cobra.Command{
+ Use: "run",
+ Short: welcomeMessage,
+ Run: e.executeRun,
+ PreRun: func(_ *cobra.Command, _ []string) {
+ if ok := e.acquireFileLock(); !ok {
+ e.log.Fatalf("Parallel golangci-lint is running")
+ }
+ },
+ PostRun: func(_ *cobra.Command, _ []string) {
+ e.releaseFileLock()
+ },
+ }
+ e.rootCmd.AddCommand(e.runCmd)
+
+ e.runCmd.SetOutput(logutils.StdOut) // use custom output to properly color it in Windows terminals
+
+ e.initRunConfiguration(e.runCmd)
+}
+
+func fixSlicesFlags(fs *pflag.FlagSet) {
+ // It's a dirty hack to set flag.Changed to true for every string slice flag.
+ // It's necessary to merge config and command-line slices: otherwise command-line
+ // flags will always overwrite ones from the config.
+ fs.VisitAll(func(f *pflag.Flag) {
+ if f.Value.Type() != "stringSlice" {
+ return
+ }
+
+ s, err := fs.GetStringSlice(f.Name)
+ if err != nil {
+ return
+ }
+
+ if s == nil { // assume that every string slice flag has nil as the default
+ return
+ }
+
+ // calling Set sets Changed to true: next Set calls will append, not overwrite
+ _ = f.Value.Set(strings.Join(s, ","))
+ })
+}
+
+func (e *Executor) runAnalysis(ctx context.Context, args []string) ([]result.Issue, error) {
+ e.cfg.Run.Args = args
+
+ lintersToRun, err := e.EnabledLintersSet.GetOptimizedLinters()
+ if err != nil {
+ return nil, err
+ }
+
+ enabledLintersMap, err := e.EnabledLintersSet.GetEnabledLintersMap()
+ if err != nil {
+ return nil, err
+ }
+
+ for _, lc := range e.DBManager.GetAllSupportedLinterConfigs() {
+ isEnabled := enabledLintersMap[lc.Name()] != nil
+ e.reportData.AddLinter(lc.Name(), isEnabled, lc.EnabledByDefault)
+ }
+
+ lintCtx, err := e.contextLoader.Load(ctx, lintersToRun)
+ if err != nil {
+ return nil, errors.Wrap(err, "context loading failed")
+ }
+ lintCtx.Log = e.log.Child("linters context")
+
+ runner, err := lint.NewRunner(e.cfg, e.log.Child("runner"),
+ e.goenv, e.EnabledLintersSet, e.lineCache, e.DBManager, lintCtx.Packages)
+ if err != nil {
+ return nil, err
+ }
+
+ issues, err := runner.Run(ctx, lintersToRun, lintCtx)
+ if err != nil {
+ return nil, err
+ }
+
+ fixer := processors.NewFixer(e.cfg, e.log, e.fileCache)
+ return fixer.Process(issues), nil
+}
+
+func (e *Executor) setOutputToDevNull() (savedStdout, savedStderr *os.File) {
+ savedStdout, savedStderr = os.Stdout, os.Stderr
+ devNull, err := os.Open(os.DevNull)
+ if err != nil {
+ e.log.Warnf("Can't open null device %q: %s", os.DevNull, err)
+ return
+ }
+
+ os.Stdout, os.Stderr = devNull, devNull
+ return
+}
+
+func (e *Executor) setExitCodeIfIssuesFound(issues []result.Issue) {
+ if len(issues) != 0 {
+ e.exitCode = e.cfg.Run.ExitCodeIfIssuesFound
+ }
+}
+
+func (e *Executor) runAndPrint(ctx context.Context, args []string) error {
+ if err := e.goenv.Discover(ctx); err != nil {
+ e.log.Warnf("Failed to discover go env: %s", err)
+ }
+
+ if !logutils.HaveDebugTag("linters_output") {
+ // Don't allow linters and loader to print anything
+ log.SetOutput(ioutil.Discard)
+ savedStdout, savedStderr := e.setOutputToDevNull()
+ defer func() {
+ os.Stdout, os.Stderr = savedStdout, savedStderr
+ }()
+ }
+
+ issues, err := e.runAnalysis(ctx, args)
+ if err != nil {
+ return err // XXX: don't loose type
+ }
+
+ p, err := e.createPrinter()
+ if err != nil {
+ return err
+ }
+
+ e.setExitCodeIfIssuesFound(issues)
+
+ if err = p.Print(ctx, issues); err != nil {
+ return fmt.Errorf("can't print %d issues: %s", len(issues), err)
+ }
+
+ e.fileCache.PrintStats(e.log)
+
+ return nil
+}
+
+func (e *Executor) createPrinter() (printers.Printer, error) {
+ var p printers.Printer
+ format := e.cfg.Output.Format
+ switch format {
+ case config.OutFormatJSON:
+ p = printers.NewJSON(&e.reportData)
+ case config.OutFormatColoredLineNumber, config.OutFormatLineNumber:
+ p = printers.NewText(e.cfg.Output.PrintIssuedLine,
+ format == config.OutFormatColoredLineNumber, e.cfg.Output.PrintLinterName,
+ e.log.Child("text_printer"))
+ case config.OutFormatTab:
+ p = printers.NewTab(e.cfg.Output.PrintLinterName, e.log.Child("tab_printer"))
+ case config.OutFormatCheckstyle:
+ p = printers.NewCheckstyle()
+ case config.OutFormatCodeClimate:
+ p = printers.NewCodeClimate()
+ case config.OutFormatJunitXML:
+ p = printers.NewJunitXML()
+ case config.OutFormatGithubActions:
+ p = printers.NewGithub()
+ default:
+ return nil, fmt.Errorf("unknown output format %s", format)
+ }
+
+ return p, nil
+}
+
+func (e *Executor) executeRun(_ *cobra.Command, args []string) {
+ needTrackResources := e.cfg.Run.IsVerbose || e.cfg.Run.PrintResourcesUsage
+ trackResourcesEndCh := make(chan struct{})
+ defer func() { // XXX: this defer must be before ctx.cancel defer
+ if needTrackResources { // wait until resource tracking finished to print properly
+ <-trackResourcesEndCh
+ }
+ }()
+
+ e.setTimeoutToDeadlineIfOnlyDeadlineIsSet()
+ ctx, cancel := context.WithTimeout(context.Background(), e.cfg.Run.Timeout)
+ defer cancel()
+
+ if needTrackResources {
+ go watchResources(ctx, trackResourcesEndCh, e.log, e.debugf)
+ }
+
+ if err := e.runAndPrint(ctx, args); err != nil {
+ e.log.Errorf("Running error: %s", err)
+ if e.exitCode == exitcodes.Success {
+ if exitErr, ok := errors.Cause(err).(*exitcodes.ExitError); ok {
+ e.exitCode = exitErr.Code
+ } else {
+ e.exitCode = exitcodes.Failure
+ }
+ }
+ }
+
+ e.setupExitCode(ctx)
+}
+
+// to be removed when deadline is finally decommissioned
+func (e *Executor) setTimeoutToDeadlineIfOnlyDeadlineIsSet() {
+ //lint:ignore SA1019 We want to promoted the deprecated config value when needed
+ deadlineValue := e.cfg.Run.Deadline // nolint:staticcheck
+ if deadlineValue != 0 && e.cfg.Run.Timeout == defaultTimeout {
+ e.cfg.Run.Timeout = deadlineValue
+ }
+}
+
+func (e *Executor) setupExitCode(ctx context.Context) {
+ if ctx.Err() != nil {
+ e.exitCode = exitcodes.Timeout
+ e.log.Errorf("Timeout exceeded: try increasing it by passing --timeout option")
+ return
+ }
+
+ if e.exitCode != exitcodes.Success {
+ return
+ }
+
+ needFailOnWarnings := (os.Getenv("GL_TEST_RUN") == "1" || os.Getenv("FAIL_ON_WARNINGS") == "1")
+ if needFailOnWarnings && len(e.reportData.Warnings) != 0 {
+ e.exitCode = exitcodes.WarningInTest
+ return
+ }
+
+ if e.reportData.Error != "" {
+ // it's a case e.g. when typecheck linter couldn't parse and error and just logged it
+ e.exitCode = exitcodes.ErrorWasLogged
+ return
+ }
+}
+
+func watchResources(ctx context.Context, done chan struct{}, logger logutils.Log, debugf logutils.DebugFunc) {
+ startedAt := time.Now()
+ debugf("Started tracking time")
+
+ var maxRSSMB, totalRSSMB float64
+ var iterationsCount int
+
+ const intervalMS = 100
+ ticker := time.NewTicker(intervalMS * time.Millisecond)
+ defer ticker.Stop()
+
+ logEveryRecord := os.Getenv("GL_MEM_LOG_EVERY") == "1"
+ const MB = 1024 * 1024
+
+ track := func() {
+ var m runtime.MemStats
+ runtime.ReadMemStats(&m)
+
+ if logEveryRecord {
+ debugf("Stopping memory tracing iteration, printing ...")
+ printMemStats(&m, logger)
+ }
+
+ rssMB := float64(m.Sys) / MB
+ if rssMB > maxRSSMB {
+ maxRSSMB = rssMB
+ }
+ totalRSSMB += rssMB
+ iterationsCount++
+ }
+
+ for {
+ track()
+
+ stop := false
+ select {
+ case <-ctx.Done():
+ stop = true
+ debugf("Stopped resources tracking")
+ case <-ticker.C:
+ }
+
+ if stop {
+ break
+ }
+ }
+ track()
+
+ avgRSSMB := totalRSSMB / float64(iterationsCount)
+
+ logger.Infof("Memory: %d samples, avg is %.1fMB, max is %.1fMB",
+ iterationsCount, avgRSSMB, maxRSSMB)
+ logger.Infof("Execution took %s", time.Since(startedAt))
+ close(done)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/commands/version.go b/vendor/github.com/golangci/golangci-lint/pkg/commands/version.go
new file mode 100644
index 000000000..fdb5aa884
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/version.go
@@ -0,0 +1,17 @@
+package commands
+
+import (
+ "github.com/spf13/cobra"
+)
+
+func (e *Executor) initVersion() {
+ versionCmd := &cobra.Command{
+ Use: "version",
+ Short: "Version",
+ Run: func(cmd *cobra.Command, _ []string) {
+ cmd.Printf("golangci-lint has version %s built from %s on %s\n", e.version, e.commit, e.date)
+ },
+ }
+
+ e.rootCmd.AddCommand(versionCmd)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/config/config.go b/vendor/github.com/golangci/golangci-lint/pkg/config/config.go
new file mode 100644
index 000000000..89e3559c1
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/config/config.go
@@ -0,0 +1,491 @@
+package config
+
+import (
+ "errors"
+ "fmt"
+ "regexp"
+ "time"
+)
+
+const (
+ OutFormatJSON = "json"
+ OutFormatLineNumber = "line-number"
+ OutFormatColoredLineNumber = "colored-line-number"
+ OutFormatTab = "tab"
+ OutFormatCheckstyle = "checkstyle"
+ OutFormatCodeClimate = "code-climate"
+ OutFormatJunitXML = "junit-xml"
+ OutFormatGithubActions = "github-actions"
+)
+
+var OutFormats = []string{
+ OutFormatColoredLineNumber,
+ OutFormatLineNumber,
+ OutFormatJSON,
+ OutFormatTab,
+ OutFormatCheckstyle,
+ OutFormatCodeClimate,
+ OutFormatJunitXML,
+ OutFormatGithubActions,
+}
+
+type ExcludePattern struct {
+ ID string
+ Pattern string
+ Linter string
+ Why string
+}
+
+var DefaultExcludePatterns = []ExcludePattern{
+ {
+ ID: "EXC0001",
+ Pattern: "Error return value of .((os\\.)?std(out|err)\\..*|.*Close" +
+ "|.*Flush|os\\.Remove(All)?|.*print(f|ln)?|os\\.(Un)?Setenv). is not checked",
+ Linter: "errcheck",
+ Why: "Almost all programs ignore errors on these functions and in most cases it's ok",
+ },
+ {
+ ID: "EXC0002",
+ Pattern: "(comment on exported (method|function|type|const)|" +
+ "should have( a package)? comment|comment should be of the form)",
+ Linter: "golint",
+ Why: "Annoying issue about not having a comment. The rare codebase has such comments",
+ },
+ {
+ ID: "EXC0003",
+ Pattern: "func name will be used as test\\.Test.* by other packages, and that stutters; consider calling this",
+ Linter: "golint",
+ Why: "False positive when tests are defined in package 'test'",
+ },
+ {
+ ID: "EXC0004",
+ Pattern: "(possible misuse of unsafe.Pointer|should have signature)",
+ Linter: "govet",
+ Why: "Common false positives",
+ },
+ {
+ ID: "EXC0005",
+ Pattern: "ineffective break statement. Did you mean to break out of the outer loop",
+ Linter: "staticcheck",
+ Why: "Developers tend to write in C-style with an explicit 'break' in a 'switch', so it's ok to ignore",
+ },
+ {
+ ID: "EXC0006",
+ Pattern: "Use of unsafe calls should be audited",
+ Linter: "gosec",
+ Why: "Too many false-positives on 'unsafe' usage",
+ },
+ {
+ ID: "EXC0007",
+ Pattern: "Subprocess launch(ed with variable|ing should be audited)",
+ Linter: "gosec",
+ Why: "Too many false-positives for parametrized shell calls",
+ },
+ {
+ ID: "EXC0008",
+ Pattern: "(G104|G307)",
+ Linter: "gosec",
+ Why: "Duplicated errcheck checks",
+ },
+ {
+ ID: "EXC0009",
+ Pattern: "(Expect directory permissions to be 0750 or less|Expect file permissions to be 0600 or less)",
+ Linter: "gosec",
+ Why: "Too many issues in popular repos",
+ },
+ {
+ ID: "EXC0010",
+ Pattern: "Potential file inclusion via variable",
+ Linter: "gosec",
+ Why: "False positive is triggered by 'src, err := ioutil.ReadFile(filename)'",
+ },
+}
+
+func GetDefaultExcludePatternsStrings() []string {
+ return GetExcludePatternsStrings(nil)
+}
+
+func GetExcludePatternsStrings(include []string) []string {
+ includeMap := make(map[string]bool, len(include))
+ for _, inc := range include {
+ includeMap[inc] = true
+ }
+
+ var ret []string
+ for _, p := range DefaultExcludePatterns {
+ if !includeMap[p.ID] {
+ ret = append(ret, p.Pattern)
+ }
+ }
+
+ return ret
+}
+
+type Run struct {
+ IsVerbose bool `mapstructure:"verbose"`
+ Silent bool
+ CPUProfilePath string
+ MemProfilePath string
+ TracePath string
+ Concurrency int
+ PrintResourcesUsage bool `mapstructure:"print-resources-usage"`
+
+ Config string
+ NoConfig bool
+
+ Args []string
+
+ BuildTags []string `mapstructure:"build-tags"`
+ ModulesDownloadMode string `mapstructure:"modules-download-mode"`
+
+ ExitCodeIfIssuesFound int `mapstructure:"issues-exit-code"`
+ AnalyzeTests bool `mapstructure:"tests"`
+
+ // Deprecated: Deadline exists for historical compatibility
+ // and should not be used. To set run timeout use Timeout instead.
+ Deadline time.Duration
+ Timeout time.Duration
+
+ PrintVersion bool
+ SkipFiles []string `mapstructure:"skip-files"`
+ SkipDirs []string `mapstructure:"skip-dirs"`
+ UseDefaultSkipDirs bool `mapstructure:"skip-dirs-use-default"`
+
+ AllowParallelRunners bool `mapstructure:"allow-parallel-runners"`
+}
+
+type LintersSettings struct {
+ Govet GovetSettings
+ Golint struct {
+ MinConfidence float64 `mapstructure:"min-confidence"`
+ }
+ Gofmt struct {
+ Simplify bool
+ }
+ Goimports struct {
+ LocalPrefixes string `mapstructure:"local-prefixes"`
+ }
+ Gocyclo struct {
+ MinComplexity int `mapstructure:"min-complexity"`
+ }
+ Varcheck struct {
+ CheckExportedFields bool `mapstructure:"exported-fields"`
+ }
+ Structcheck struct {
+ CheckExportedFields bool `mapstructure:"exported-fields"`
+ }
+ Maligned struct {
+ SuggestNewOrder bool `mapstructure:"suggest-new"`
+ }
+ Dupl struct {
+ Threshold int
+ }
+ Goconst struct {
+ MinStringLen int `mapstructure:"min-len"`
+ MinOccurrencesCount int `mapstructure:"min-occurrences"`
+ }
+ Gomnd struct {
+ Settings map[string]map[string]interface{}
+ }
+ Depguard struct {
+ ListType string `mapstructure:"list-type"`
+ Packages []string
+ IncludeGoRoot bool `mapstructure:"include-go-root"`
+ PackagesWithErrorMessage map[string]string `mapstructure:"packages-with-error-message"`
+ }
+ Misspell struct {
+ Locale string
+ IgnoreWords []string `mapstructure:"ignore-words"`
+ }
+ Unused struct {
+ CheckExported bool `mapstructure:"check-exported"`
+ }
+ Funlen struct {
+ Lines int
+ Statements int
+ }
+ Whitespace struct {
+ MultiIf bool `mapstructure:"multi-if"`
+ MultiFunc bool `mapstructure:"multi-func"`
+ }
+ RowsErrCheck struct {
+ Packages []string
+ }
+ Gomodguard struct {
+ Allowed struct {
+ Modules []string `mapstructure:"modules"`
+ Domains []string `mapstructure:"domains"`
+ } `mapstructure:"allowed"`
+ Blocked struct {
+ Modules []map[string]struct {
+ Recommendations []string `mapstructure:"recommendations"`
+ Reason string `mapstructure:"reason"`
+ } `mapstructure:"modules"`
+ } `mapstructure:"blocked"`
+ }
+
+ WSL WSLSettings
+ Lll LllSettings
+ Unparam UnparamSettings
+ Nakedret NakedretSettings
+ Prealloc PreallocSettings
+ Errcheck ErrcheckSettings
+ Gocritic GocriticSettings
+ Godox GodoxSettings
+ Dogsled DogsledSettings
+ Gocognit GocognitSettings
+ Godot GodotSettings
+ Testpackage TestpackageSettings
+ Nestif NestifSettings
+ NoLintLint NoLintLintSettings
+
+ Custom map[string]CustomLinterSettings
+}
+
+type GovetSettings struct {
+ CheckShadowing bool `mapstructure:"check-shadowing"`
+ Settings map[string]map[string]interface{}
+
+ Enable []string
+ Disable []string
+ EnableAll bool `mapstructure:"enable-all"`
+ DisableAll bool `mapstructure:"disable-all"`
+}
+
+func (cfg GovetSettings) Validate() error {
+ if cfg.EnableAll && cfg.DisableAll {
+ return errors.New("enable-all and disable-all can't be combined")
+ }
+ if cfg.EnableAll && len(cfg.Enable) != 0 {
+ return errors.New("enable-all and enable can't be combined")
+ }
+ if cfg.DisableAll && len(cfg.Disable) != 0 {
+ return errors.New("disable-all and disable can't be combined")
+ }
+ return nil
+}
+
+type ErrcheckSettings struct {
+ CheckTypeAssertions bool `mapstructure:"check-type-assertions"`
+ CheckAssignToBlank bool `mapstructure:"check-blank"`
+ Ignore string `mapstructure:"ignore"`
+ Exclude string `mapstructure:"exclude"`
+}
+
+type LllSettings struct {
+ LineLength int `mapstructure:"line-length"`
+ TabWidth int `mapstructure:"tab-width"`
+}
+
+type UnparamSettings struct {
+ CheckExported bool `mapstructure:"check-exported"`
+ Algo string
+}
+
+type NakedretSettings struct {
+ MaxFuncLines int `mapstructure:"max-func-lines"`
+}
+
+type PreallocSettings struct {
+ Simple bool
+ RangeLoops bool `mapstructure:"range-loops"`
+ ForLoops bool `mapstructure:"for-loops"`
+}
+
+type GodoxSettings struct {
+ Keywords []string
+}
+
+type DogsledSettings struct {
+ MaxBlankIdentifiers int `mapstructure:"max-blank-identifiers"`
+}
+
+type GocognitSettings struct {
+ MinComplexity int `mapstructure:"min-complexity"`
+}
+
+type WSLSettings struct {
+ StrictAppend bool `mapstructure:"strict-append"`
+ AllowAssignAndCallCuddle bool `mapstructure:"allow-assign-and-call"`
+ AllowMultiLineAssignCuddle bool `mapstructure:"allow-multiline-assign"`
+ AllowCuddleDeclaration bool `mapstructure:"allow-cuddle-declarations"`
+ AllowTrailingComment bool `mapstructure:"allow-trailing-comment"`
+ AllowSeparatedLeadingComment bool `mapstructure:"allow-separated-leading-comment"`
+ ForceCuddleErrCheckAndAssign bool `mapstructure:"force-err-cuddling"`
+ ForceCaseTrailingWhitespaceLimit int `mapstructure:"force-case-trailing-whitespace"`
+}
+
+type GodotSettings struct {
+ CheckAll bool `mapstructure:"check-all"`
+}
+
+type NoLintLintSettings struct {
+ RequireExplanation bool `mapstructure:"require-explanation"`
+ AllowLeadingSpace bool `mapstructure:"allow-leading-space"`
+ RequireSpecific bool `mapstructure:"require-specific"`
+ AllowNoExplanation []string `mapstructure:"allow-no-explanation"`
+ AllowUnused bool `mapstructure:"allow-unused"`
+}
+
+type TestpackageSettings struct {
+ SkipRegexp string `mapstructure:"skip-regexp"`
+}
+
+type NestifSettings struct {
+ MinComplexity int `mapstructure:"min-complexity"`
+}
+
+var defaultLintersSettings = LintersSettings{
+ Lll: LllSettings{
+ LineLength: 120,
+ TabWidth: 1,
+ },
+ Unparam: UnparamSettings{
+ Algo: "cha",
+ },
+ Nakedret: NakedretSettings{
+ MaxFuncLines: 30,
+ },
+ Prealloc: PreallocSettings{
+ Simple: true,
+ RangeLoops: true,
+ ForLoops: false,
+ },
+ Gocritic: GocriticSettings{
+ SettingsPerCheck: map[string]GocriticCheckSettings{},
+ },
+ Godox: GodoxSettings{
+ Keywords: []string{},
+ },
+ Dogsled: DogsledSettings{
+ MaxBlankIdentifiers: 2,
+ },
+ Gocognit: GocognitSettings{
+ MinComplexity: 30,
+ },
+ WSL: WSLSettings{
+ StrictAppend: true,
+ AllowAssignAndCallCuddle: true,
+ AllowMultiLineAssignCuddle: true,
+ AllowCuddleDeclaration: false,
+ AllowTrailingComment: false,
+ AllowSeparatedLeadingComment: false,
+ ForceCuddleErrCheckAndAssign: false,
+ ForceCaseTrailingWhitespaceLimit: 0,
+ },
+ NoLintLint: NoLintLintSettings{
+ RequireExplanation: false,
+ AllowLeadingSpace: true,
+ RequireSpecific: false,
+ AllowUnused: false,
+ },
+ Testpackage: TestpackageSettings{
+ SkipRegexp: `(export|internal)_test\.go`,
+ },
+ Nestif: NestifSettings{
+ MinComplexity: 5,
+ },
+}
+
+type CustomLinterSettings struct {
+ Path string
+ Description string
+ OriginalURL string `mapstructure:"original-url"`
+}
+
+type Linters struct {
+ Enable []string
+ Disable []string
+ EnableAll bool `mapstructure:"enable-all"`
+ DisableAll bool `mapstructure:"disable-all"`
+ Fast bool
+
+ Presets []string
+}
+
+type ExcludeRule struct {
+ Linters []string
+ Path string
+ Text string
+ Source string
+}
+
+func validateOptionalRegex(value string) error {
+ if value == "" {
+ return nil
+ }
+ _, err := regexp.Compile(value)
+ return err
+}
+
+func (e ExcludeRule) Validate() error {
+ if err := validateOptionalRegex(e.Path); err != nil {
+ return fmt.Errorf("invalid path regex: %v", err)
+ }
+ if err := validateOptionalRegex(e.Text); err != nil {
+ return fmt.Errorf("invalid text regex: %v", err)
+ }
+ if err := validateOptionalRegex(e.Source); err != nil {
+ return fmt.Errorf("invalid source regex: %v", err)
+ }
+ nonBlank := 0
+ if len(e.Linters) > 0 {
+ nonBlank++
+ }
+ if e.Path != "" {
+ nonBlank++
+ }
+ if e.Text != "" {
+ nonBlank++
+ }
+ if e.Source != "" {
+ nonBlank++
+ }
+ const minConditionsCount = 2
+ if nonBlank < minConditionsCount {
+ return errors.New("at least 2 of (text, source, path, linters) should be set")
+ }
+ return nil
+}
+
+type Issues struct {
+ IncludeDefaultExcludes []string `mapstructure:"include"`
+ ExcludeCaseSensitive bool `mapstructure:"exclude-case-sensitive"`
+ ExcludePatterns []string `mapstructure:"exclude"`
+ ExcludeRules []ExcludeRule `mapstructure:"exclude-rules"`
+ UseDefaultExcludes bool `mapstructure:"exclude-use-default"`
+
+ MaxIssuesPerLinter int `mapstructure:"max-issues-per-linter"`
+ MaxSameIssues int `mapstructure:"max-same-issues"`
+
+ DiffFromRevision string `mapstructure:"new-from-rev"`
+ DiffPatchFilePath string `mapstructure:"new-from-patch"`
+ Diff bool `mapstructure:"new"`
+
+ NeedFix bool `mapstructure:"fix"`
+}
+
+type Config struct {
+ Run Run
+
+ Output struct {
+ Format string
+ Color string
+ PrintIssuedLine bool `mapstructure:"print-issued-lines"`
+ PrintLinterName bool `mapstructure:"print-linter-name"`
+ UniqByLine bool `mapstructure:"uniq-by-line"`
+ PrintWelcomeMessage bool `mapstructure:"print-welcome"`
+ }
+
+ LintersSettings LintersSettings `mapstructure:"linters-settings"`
+ Linters Linters
+ Issues Issues
+
+ InternalTest bool // Option is used only for testing golangci-lint code, don't use it
+}
+
+func NewDefault() *Config {
+ return &Config{
+ LintersSettings: defaultLintersSettings,
+ }
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/config/config_gocritic.go b/vendor/github.com/golangci/golangci-lint/pkg/config/config_gocritic.go
new file mode 100644
index 000000000..bbfd7bb13
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/config/config_gocritic.go
@@ -0,0 +1,367 @@
+package config
+
+import (
+ "fmt"
+ "sort"
+ "strings"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/pkg/errors"
+
+ _ "github.com/go-critic/go-critic/checkers" // this import register checkers
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+const gocriticDebugKey = "gocritic"
+
+var (
+ gocriticDebugf = logutils.Debug(gocriticDebugKey)
+ isGocriticDebug = logutils.HaveDebugTag(gocriticDebugKey)
+ allGocriticCheckers = lintpack.GetCheckersInfo()
+ allGocriticCheckerMap = func() map[string]*lintpack.CheckerInfo {
+ checkInfoMap := make(map[string]*lintpack.CheckerInfo)
+ for _, checkInfo := range allGocriticCheckers {
+ checkInfoMap[checkInfo.Name] = checkInfo
+ }
+ return checkInfoMap
+ }()
+)
+
+type GocriticCheckSettings map[string]interface{}
+
+type GocriticSettings struct {
+ EnabledChecks []string `mapstructure:"enabled-checks"`
+ DisabledChecks []string `mapstructure:"disabled-checks"`
+ EnabledTags []string `mapstructure:"enabled-tags"`
+ DisabledTags []string `mapstructure:"disabled-tags"`
+ SettingsPerCheck map[string]GocriticCheckSettings `mapstructure:"settings"`
+
+ inferredEnabledChecks map[string]bool
+}
+
+func debugChecksListf(checks []string, format string, args ...interface{}) {
+ if isGocriticDebug {
+ prefix := fmt.Sprintf(format, args...)
+ gocriticDebugf(prefix+" checks (%d): %s", len(checks), sprintStrings(checks))
+ }
+}
+
+func stringsSliceToSet(ss []string) map[string]bool {
+ ret := map[string]bool{}
+ for _, s := range ss {
+ ret[s] = true
+ }
+
+ return ret
+}
+
+func buildGocriticTagToCheckersMap() map[string][]string {
+ tagToCheckers := map[string][]string{}
+ for _, checker := range allGocriticCheckers {
+ for _, tag := range checker.Tags {
+ tagToCheckers[tag] = append(tagToCheckers[tag], checker.Name)
+ }
+ }
+ return tagToCheckers
+}
+
+func gocriticCheckerTagsDebugf() {
+ if !isGocriticDebug {
+ return
+ }
+
+ tagToCheckers := buildGocriticTagToCheckersMap()
+
+ var allTags []string
+ for tag := range tagToCheckers {
+ allTags = append(allTags, tag)
+ }
+ sort.Strings(allTags)
+
+ gocriticDebugf("All gocritic existing tags and checks:")
+ for _, tag := range allTags {
+ debugChecksListf(tagToCheckers[tag], " tag %q", tag)
+ }
+}
+
+func (s *GocriticSettings) gocriticDisabledCheckersDebugf() {
+ if !isGocriticDebug {
+ return
+ }
+
+ var disabledCheckers []string
+ for _, checker := range allGocriticCheckers {
+ if s.inferredEnabledChecks[strings.ToLower(checker.Name)] {
+ continue
+ }
+
+ disabledCheckers = append(disabledCheckers, checker.Name)
+ }
+
+ if len(disabledCheckers) == 0 {
+ gocriticDebugf("All checks are enabled")
+ } else {
+ debugChecksListf(disabledCheckers, "Final not used")
+ }
+}
+
+func (s *GocriticSettings) InferEnabledChecks(log logutils.Log) {
+ gocriticCheckerTagsDebugf()
+
+ enabledByDefaultChecks := getDefaultEnabledGocriticCheckersNames()
+ debugChecksListf(enabledByDefaultChecks, "Enabled by default")
+
+ disabledByDefaultChecks := getDefaultDisabledGocriticCheckersNames()
+ debugChecksListf(disabledByDefaultChecks, "Disabled by default")
+
+ var enabledChecks []string
+
+ // EnabledTags
+ if len(s.EnabledTags) != 0 {
+ tagToCheckers := buildGocriticTagToCheckersMap()
+ for _, tag := range s.EnabledTags {
+ enabledChecks = append(enabledChecks, tagToCheckers[tag]...)
+ }
+ debugChecksListf(enabledChecks, "Enabled by config tags %s", sprintStrings(s.EnabledTags))
+ }
+
+ if !(len(s.EnabledTags) == 0 && len(s.EnabledChecks) != 0) {
+ // don't use default checks only if we have no enabled tags and enable some checks manually
+ enabledChecks = append(enabledChecks, enabledByDefaultChecks...)
+ }
+
+ // DisabledTags
+ if len(s.DisabledTags) != 0 {
+ enabledChecks = filterByDisableTags(enabledChecks, s.DisabledTags, log)
+ }
+
+ // EnabledChecks
+ if len(s.EnabledChecks) != 0 {
+ debugChecksListf(s.EnabledChecks, "Enabled by config")
+
+ alreadyEnabledChecksSet := stringsSliceToSet(enabledChecks)
+ for _, enabledCheck := range s.EnabledChecks {
+ if alreadyEnabledChecksSet[enabledCheck] {
+ log.Warnf("No need to enable check %q: it's already enabled", enabledCheck)
+ continue
+ }
+ enabledChecks = append(enabledChecks, enabledCheck)
+ }
+ }
+
+ // DisabledChecks
+ if len(s.DisabledChecks) != 0 {
+ debugChecksListf(s.DisabledChecks, "Disabled by config")
+
+ enabledChecksSet := stringsSliceToSet(enabledChecks)
+ for _, disabledCheck := range s.DisabledChecks {
+ if !enabledChecksSet[disabledCheck] {
+ log.Warnf("Gocritic check %q was explicitly disabled via config. However, as this check"+
+ "is disabled by default, there is no need to explicitly disable it via config.", disabledCheck)
+ continue
+ }
+ delete(enabledChecksSet, disabledCheck)
+ }
+
+ enabledChecks = nil
+ for enabledCheck := range enabledChecksSet {
+ enabledChecks = append(enabledChecks, enabledCheck)
+ }
+ }
+
+ s.inferredEnabledChecks = map[string]bool{}
+ for _, check := range enabledChecks {
+ s.inferredEnabledChecks[strings.ToLower(check)] = true
+ }
+
+ debugChecksListf(enabledChecks, "Final used")
+ s.gocriticDisabledCheckersDebugf()
+}
+
+func validateStringsUniq(ss []string) error {
+ set := map[string]bool{}
+ for _, s := range ss {
+ _, ok := set[s]
+ if ok {
+ return fmt.Errorf("%q occurs multiple times in list", s)
+ }
+ set[s] = true
+ }
+
+ return nil
+}
+
+func intersectStringSlice(s1, s2 []string) []string {
+ s1Map := make(map[string]struct{})
+ for _, s := range s1 {
+ s1Map[s] = struct{}{}
+ }
+
+ result := make([]string, 0)
+ for _, s := range s2 {
+ if _, exists := s1Map[s]; exists {
+ result = append(result, s)
+ }
+ }
+
+ return result
+}
+
+func (s *GocriticSettings) Validate(log logutils.Log) error {
+ if len(s.EnabledTags) == 0 {
+ if len(s.EnabledChecks) != 0 && len(s.DisabledChecks) != 0 {
+ return errors.New("both enabled and disabled check aren't allowed for gocritic")
+ }
+ } else {
+ if err := validateStringsUniq(s.EnabledTags); err != nil {
+ return errors.Wrap(err, "validate enabled tags")
+ }
+
+ tagToCheckers := buildGocriticTagToCheckersMap()
+ for _, tag := range s.EnabledTags {
+ if _, ok := tagToCheckers[tag]; !ok {
+ return fmt.Errorf("gocritic [enabled]tag %q doesn't exist", tag)
+ }
+ }
+ }
+
+ if len(s.DisabledTags) > 0 {
+ tagToCheckers := buildGocriticTagToCheckersMap()
+ for _, tag := range s.EnabledTags {
+ if _, ok := tagToCheckers[tag]; !ok {
+ return fmt.Errorf("gocritic [disabled]tag %q doesn't exist", tag)
+ }
+ }
+ }
+
+ if err := validateStringsUniq(s.EnabledChecks); err != nil {
+ return errors.Wrap(err, "validate enabled checks")
+ }
+ if err := validateStringsUniq(s.DisabledChecks); err != nil {
+ return errors.Wrap(err, "validate disabled checks")
+ }
+
+ for checkName := range s.SettingsPerCheck {
+ if !s.IsCheckEnabled(checkName) {
+ log.Warnf("Gocritic settings were provided for not enabled check %q", checkName)
+ }
+ }
+
+ if err := s.validateCheckerNames(); err != nil {
+ return errors.Wrap(err, "validation failed")
+ }
+
+ return nil
+}
+
+func (s *GocriticSettings) IsCheckEnabled(name string) bool {
+ return s.inferredEnabledChecks[strings.ToLower(name)]
+}
+
+func sprintAllowedCheckerNames(allowedNames map[string]bool) string {
+ var namesSlice []string
+ for name := range allowedNames {
+ namesSlice = append(namesSlice, name)
+ }
+ return sprintStrings(namesSlice)
+}
+
+func sprintStrings(ss []string) string {
+ sort.Strings(ss)
+ return fmt.Sprint(ss)
+}
+
+func getAllCheckerNames() map[string]bool {
+ allCheckerNames := map[string]bool{}
+ for _, checker := range allGocriticCheckers {
+ allCheckerNames[strings.ToLower(checker.Name)] = true
+ }
+
+ return allCheckerNames
+}
+
+func isEnabledByDefaultGocriticCheck(info *lintpack.CheckerInfo) bool {
+ return !info.HasTag("experimental") &&
+ !info.HasTag("opinionated") &&
+ !info.HasTag("performance")
+}
+
+func getDefaultEnabledGocriticCheckersNames() []string {
+ var enabled []string
+ for _, info := range allGocriticCheckers {
+ // get in sync with lintpack behavior in bindDefaultEnabledList
+ // in https://github.com/go-lintpack/lintpack/blob/master/linter/lintmain/internal/check/check.go#L317
+
+ enable := isEnabledByDefaultGocriticCheck(info)
+ if enable {
+ enabled = append(enabled, info.Name)
+ }
+ }
+
+ return enabled
+}
+
+func getDefaultDisabledGocriticCheckersNames() []string {
+ var disabled []string
+ for _, info := range allGocriticCheckers {
+ // get in sync with lintpack behavior in bindDefaultEnabledList
+ // in https://github.com/go-lintpack/lintpack/blob/master/linter/lintmain/internal/check/check.go#L317
+
+ enable := isEnabledByDefaultGocriticCheck(info)
+ if !enable {
+ disabled = append(disabled, info.Name)
+ }
+ }
+
+ return disabled
+}
+
+func (s *GocriticSettings) validateCheckerNames() error {
+ allowedNames := getAllCheckerNames()
+
+ for _, name := range s.EnabledChecks {
+ if !allowedNames[strings.ToLower(name)] {
+ return fmt.Errorf("enabled checker %s doesn't exist, all existing checkers: %s",
+ name, sprintAllowedCheckerNames(allowedNames))
+ }
+ }
+
+ for _, name := range s.DisabledChecks {
+ if !allowedNames[strings.ToLower(name)] {
+ return fmt.Errorf("disabled checker %s doesn't exist, all existing checkers: %s",
+ name, sprintAllowedCheckerNames(allowedNames))
+ }
+ }
+
+ return nil
+}
+
+func (s *GocriticSettings) GetLowercasedParams() map[string]GocriticCheckSettings {
+ ret := map[string]GocriticCheckSettings{}
+ for checker, params := range s.SettingsPerCheck {
+ ret[strings.ToLower(checker)] = params
+ }
+ return ret
+}
+
+func filterByDisableTags(enabledChecks, disableTags []string, log logutils.Log) []string {
+ enabledChecksSet := stringsSliceToSet(enabledChecks)
+ for _, enabledCheck := range enabledChecks {
+ checkInfo, checkInfoExists := allGocriticCheckerMap[enabledCheck]
+ if !checkInfoExists {
+ log.Warnf("Gocritic check %q was not exists via filtering disabled tags", enabledCheck)
+ continue
+ }
+ hitTags := intersectStringSlice(checkInfo.Tags, disableTags)
+ if len(hitTags) != 0 {
+ delete(enabledChecksSet, enabledCheck)
+ }
+ debugChecksListf(enabledChecks, "Disabled by config tags %s", sprintStrings(disableTags))
+ }
+ enabledChecks = nil
+ for enabledCheck := range enabledChecksSet {
+ enabledChecks = append(enabledChecks, enabledCheck)
+ }
+ return enabledChecks
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/config/reader.go b/vendor/github.com/golangci/golangci-lint/pkg/config/reader.go
new file mode 100644
index 000000000..1e355e722
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/config/reader.go
@@ -0,0 +1,204 @@
+package config
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+
+ homedir "github.com/mitchellh/go-homedir"
+ "github.com/spf13/viper"
+
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+type FileReader struct {
+ log logutils.Log
+ cfg *Config
+ commandLineCfg *Config
+}
+
+func NewFileReader(toCfg, commandLineCfg *Config, log logutils.Log) *FileReader {
+ return &FileReader{
+ log: log,
+ cfg: toCfg,
+ commandLineCfg: commandLineCfg,
+ }
+}
+
+func (r *FileReader) Read() error {
+ // XXX: hack with double parsing for 2 purposes:
+ // 1. to access "config" option here.
+ // 2. to give config less priority than command line.
+
+ configFile, err := r.parseConfigOption()
+ if err != nil {
+ if err == errConfigDisabled {
+ return nil
+ }
+
+ return fmt.Errorf("can't parse --config option: %s", err)
+ }
+
+ if configFile != "" {
+ viper.SetConfigFile(configFile)
+ } else {
+ r.setupConfigFileSearch()
+ }
+
+ return r.parseConfig()
+}
+
+func (r *FileReader) parseConfig() error {
+ if err := viper.ReadInConfig(); err != nil {
+ if _, ok := err.(viper.ConfigFileNotFoundError); ok {
+ return nil
+ }
+
+ return fmt.Errorf("can't read viper config: %s", err)
+ }
+
+ usedConfigFile := viper.ConfigFileUsed()
+ if usedConfigFile == "" {
+ return nil
+ }
+
+ usedConfigFile, err := fsutils.ShortestRelPath(usedConfigFile, "")
+ if err != nil {
+ r.log.Warnf("Can't pretty print config file path: %s", err)
+ }
+ r.log.Infof("Used config file %s", usedConfigFile)
+
+ if err := viper.Unmarshal(r.cfg); err != nil {
+ return fmt.Errorf("can't unmarshal config by viper: %s", err)
+ }
+
+ if err := r.validateConfig(); err != nil {
+ return fmt.Errorf("can't validate config: %s", err)
+ }
+
+ if r.cfg.InternalTest { // just for testing purposes: to detect config file usage
+ fmt.Fprintln(logutils.StdOut, "test")
+ os.Exit(0)
+ }
+
+ return nil
+}
+
+func (r *FileReader) validateConfig() error {
+ c := r.cfg
+ if len(c.Run.Args) != 0 {
+ return errors.New("option run.args in config isn't supported now")
+ }
+
+ if c.Run.CPUProfilePath != "" {
+ return errors.New("option run.cpuprofilepath in config isn't allowed")
+ }
+
+ if c.Run.MemProfilePath != "" {
+ return errors.New("option run.memprofilepath in config isn't allowed")
+ }
+
+ if c.Run.TracePath != "" {
+ return errors.New("option run.tracepath in config isn't allowed")
+ }
+
+ if c.Run.IsVerbose {
+ return errors.New("can't set run.verbose option with config: only on command-line")
+ }
+ for i, rule := range c.Issues.ExcludeRules {
+ if err := rule.Validate(); err != nil {
+ return fmt.Errorf("error in exclude rule #%d: %v", i, err)
+ }
+ }
+ if err := c.LintersSettings.Govet.Validate(); err != nil {
+ return fmt.Errorf("error in govet config: %v", err)
+ }
+ return nil
+}
+
+func getFirstPathArg() string {
+ args := os.Args
+
+ // skip all args ([golangci-lint, run/linters]) before files/dirs list
+ for len(args) != 0 {
+ if args[0] == "run" {
+ args = args[1:]
+ break
+ }
+
+ args = args[1:]
+ }
+
+ // find first file/dir arg
+ firstArg := "./..."
+ for _, arg := range args {
+ if !strings.HasPrefix(arg, "-") {
+ firstArg = arg
+ break
+ }
+ }
+
+ return firstArg
+}
+
+func (r *FileReader) setupConfigFileSearch() {
+ firstArg := getFirstPathArg()
+ absStartPath, err := filepath.Abs(firstArg)
+ if err != nil {
+ r.log.Warnf("Can't make abs path for %q: %s", firstArg, err)
+ absStartPath = filepath.Clean(firstArg)
+ }
+
+ // start from it
+ var curDir string
+ if fsutils.IsDir(absStartPath) {
+ curDir = absStartPath
+ } else {
+ curDir = filepath.Dir(absStartPath)
+ }
+
+ // find all dirs from it up to the root
+ configSearchPaths := []string{"./"}
+ for {
+ configSearchPaths = append(configSearchPaths, curDir)
+ newCurDir := filepath.Dir(curDir)
+ if curDir == newCurDir || newCurDir == "" {
+ break
+ }
+ curDir = newCurDir
+ }
+
+ r.log.Infof("Config search paths: %s", configSearchPaths)
+ viper.SetConfigName(".golangci")
+ for _, p := range configSearchPaths {
+ viper.AddConfigPath(p)
+ }
+}
+
+var errConfigDisabled = errors.New("config is disabled by --no-config")
+
+func (r *FileReader) parseConfigOption() (string, error) {
+ cfg := r.commandLineCfg
+ if cfg == nil {
+ return "", nil
+ }
+
+ configFile := cfg.Run.Config
+ if cfg.Run.NoConfig && configFile != "" {
+ return "", fmt.Errorf("can't combine option --config and --no-config")
+ }
+
+ if cfg.Run.NoConfig {
+ return "", errConfigDisabled
+ }
+
+ configFile, err := homedir.Expand(configFile)
+ if err != nil {
+ return "", fmt.Errorf("failed to expand configuration path")
+ }
+
+ return configFile, nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/exitcodes/exitcodes.go b/vendor/github.com/golangci/golangci-lint/pkg/exitcodes/exitcodes.go
new file mode 100644
index 000000000..536f90361
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/exitcodes/exitcodes.go
@@ -0,0 +1,34 @@
+package exitcodes
+
+const (
+ Success = 0
+ IssuesFound = 1
+ WarningInTest = 2
+ Failure = 3
+ Timeout = 4
+ NoGoFiles = 5
+ NoConfigFileDetected = 6
+ ErrorWasLogged = 7
+)
+
+type ExitError struct {
+ Message string
+ Code int
+}
+
+func (e ExitError) Error() string {
+ return e.Message
+}
+
+var (
+ ErrNoGoFiles = &ExitError{
+ Message: "no go files to analyze",
+ Code: NoGoFiles,
+ }
+ ErrFailure = &ExitError{
+ Message: "failed to analyze",
+ Code: Failure,
+ }
+)
+
+// 1
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/fsutils/filecache.go b/vendor/github.com/golangci/golangci-lint/pkg/fsutils/filecache.go
new file mode 100644
index 000000000..2b17a0398
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/fsutils/filecache.go
@@ -0,0 +1,67 @@
+package fsutils
+
+import (
+ "fmt"
+ "io/ioutil"
+ "sync"
+
+ "github.com/pkg/errors"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+type FileCache struct {
+ files sync.Map
+}
+
+func NewFileCache() *FileCache {
+ return &FileCache{}
+}
+
+func (fc *FileCache) GetFileBytes(filePath string) ([]byte, error) {
+ cachedBytes, ok := fc.files.Load(filePath)
+ if ok {
+ return cachedBytes.([]byte), nil
+ }
+
+ fileBytes, err := ioutil.ReadFile(filePath)
+ if err != nil {
+ return nil, errors.Wrapf(err, "can't read file %s", filePath)
+ }
+
+ fc.files.Store(filePath, fileBytes)
+ return fileBytes, nil
+}
+
+func PrettifyBytesCount(n int64) string {
+ const (
+ Multiplexer = 1024
+ KiB = 1 * Multiplexer
+ MiB = KiB * Multiplexer
+ GiB = MiB * Multiplexer
+ )
+
+ if n >= GiB {
+ return fmt.Sprintf("%.1fGiB", float64(n)/GiB)
+ }
+ if n >= MiB {
+ return fmt.Sprintf("%.1fMiB", float64(n)/MiB)
+ }
+ if n >= KiB {
+ return fmt.Sprintf("%.1fKiB", float64(n)/KiB)
+ }
+ return fmt.Sprintf("%dB", n)
+}
+
+func (fc *FileCache) PrintStats(log logutils.Log) {
+ var size int64
+ var mapLen int
+ fc.files.Range(func(_, fileBytes interface{}) bool {
+ mapLen++
+ size += int64(len(fileBytes.([]byte)))
+
+ return true
+ })
+
+ log.Infof("File cache stats: %d entries of total size %s", mapLen, PrettifyBytesCount(size))
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/fsutils/fsutils.go b/vendor/github.com/golangci/golangci-lint/pkg/fsutils/fsutils.go
new file mode 100644
index 000000000..a39c105e4
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/fsutils/fsutils.go
@@ -0,0 +1,100 @@
+package fsutils
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "sync"
+)
+
+func IsDir(filename string) bool {
+ fi, err := os.Stat(filename)
+ return err == nil && fi.IsDir()
+}
+
+var cachedWd string
+var cachedWdError error
+var getWdOnce sync.Once
+var useCache = true
+
+func UseWdCache(use bool) {
+ useCache = use
+}
+
+func Getwd() (string, error) {
+ if !useCache { // for tests
+ return os.Getwd()
+ }
+
+ getWdOnce.Do(func() {
+ cachedWd, cachedWdError = os.Getwd()
+ if cachedWdError != nil {
+ return
+ }
+
+ evaledWd, err := EvalSymlinks(cachedWd)
+ if err != nil {
+ cachedWd, cachedWdError = "", fmt.Errorf("can't eval symlinks on wd %s: %s", cachedWd, err)
+ return
+ }
+
+ cachedWd = evaledWd
+ })
+
+ return cachedWd, cachedWdError
+}
+
+var evalSymlinkCache sync.Map
+
+type evalSymlinkRes struct {
+ path string
+ err error
+}
+
+func EvalSymlinks(path string) (string, error) {
+ r, ok := evalSymlinkCache.Load(path)
+ if ok {
+ er := r.(evalSymlinkRes)
+ return er.path, er.err
+ }
+
+ var er evalSymlinkRes
+ er.path, er.err = filepath.EvalSymlinks(path)
+ evalSymlinkCache.Store(path, er)
+
+ return er.path, er.err
+}
+
+func ShortestRelPath(path, wd string) (string, error) {
+ if wd == "" { // get it if user don't have cached working dir
+ var err error
+ wd, err = Getwd()
+ if err != nil {
+ return "", fmt.Errorf("can't get working directory: %s", err)
+ }
+ }
+
+ evaledPath, err := EvalSymlinks(path)
+ if err != nil {
+ return "", fmt.Errorf("can't eval symlinks for path %s: %s", path, err)
+ }
+ path = evaledPath
+
+ // make path absolute and then relative to be able to fix this case:
+ // we are in /test dir, we want to normalize ../test, and have file file.go in this dir;
+ // it must have normalized path file.go, not ../test/file.go,
+ var absPath string
+ if filepath.IsAbs(path) {
+ absPath = path
+ } else {
+ absPath = filepath.Join(wd, path)
+ }
+
+ relPath, err := filepath.Rel(wd, absPath)
+ if err != nil {
+ return "", fmt.Errorf("can't get relative path for path %s and root %s: %s",
+ absPath, wd, err)
+ }
+
+ return relPath, nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/fsutils/linecache.go b/vendor/github.com/golangci/golangci-lint/pkg/fsutils/linecache.go
new file mode 100644
index 000000000..ab408e7d5
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/fsutils/linecache.go
@@ -0,0 +1,70 @@
+package fsutils
+
+import (
+ "bytes"
+ "fmt"
+ "sync"
+
+ "github.com/pkg/errors"
+)
+
+type fileLinesCache [][]byte
+
+type LineCache struct {
+ files sync.Map
+ fileCache *FileCache
+}
+
+func NewLineCache(fc *FileCache) *LineCache {
+ return &LineCache{
+ fileCache: fc,
+ }
+}
+
+// GetLine returns a index1-th (1-based index) line from the file on filePath
+func (lc *LineCache) GetLine(filePath string, index1 int) (string, error) {
+ if index1 == 0 { // some linters, e.g. gosec can do it: it really means first line
+ index1 = 1
+ }
+
+ const index1To0Offset = -1
+ rawLine, err := lc.getRawLine(filePath, index1+index1To0Offset)
+ if err != nil {
+ return "", err
+ }
+
+ return string(bytes.Trim(rawLine, "\r")), nil
+}
+
+func (lc *LineCache) getRawLine(filePath string, index0 int) ([]byte, error) {
+ fc, err := lc.getFileCache(filePath)
+ if err != nil {
+ return nil, errors.Wrapf(err, "failed to get file %s lines cache", filePath)
+ }
+
+ if index0 < 0 {
+ return nil, fmt.Errorf("invalid file line index0 < 0: %d", index0)
+ }
+
+ if index0 >= len(fc) {
+ return nil, fmt.Errorf("invalid file line index0 (%d) >= len(fc) (%d)", index0, len(fc))
+ }
+
+ return fc[index0], nil
+}
+
+func (lc *LineCache) getFileCache(filePath string) (fileLinesCache, error) {
+ loadedFc, ok := lc.files.Load(filePath)
+ if ok {
+ return loadedFc.(fileLinesCache), nil
+ }
+
+ fileBytes, err := lc.fileCache.GetFileBytes(filePath)
+ if err != nil {
+ return nil, errors.Wrapf(err, "can't get file %s bytes from cache", filePath)
+ }
+
+ fc := bytes.Split(fileBytes, []byte("\n"))
+ lc.files.Store(filePath, fileLinesCache(fc))
+ return fc, nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/asciicheck.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/asciicheck.go
new file mode 100644
index 000000000..7700c33e7
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/asciicheck.go
@@ -0,0 +1,19 @@
+package golinters
+
+import (
+ "github.com/tdakkota/asciicheck"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewAsciicheck() *goanalysis.Linter {
+ return goanalysis.NewLinter(
+ "asciicheck",
+ "Simple linter to check that your code does not contain non-ASCII identifiers",
+ []*analysis.Analyzer{
+ asciicheck.NewAnalyzer(),
+ },
+ nil,
+ )
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/bodyclose.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/bodyclose.go
new file mode 100644
index 000000000..0e03813d1
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/bodyclose.go
@@ -0,0 +1,21 @@
+package golinters
+
+import (
+ "github.com/timakin/bodyclose/passes/bodyclose"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewBodyclose() *goanalysis.Linter {
+ analyzers := []*analysis.Analyzer{
+ bodyclose.Analyzer,
+ }
+
+ return goanalysis.NewLinter(
+ "bodyclose",
+ "checks whether HTTP response body is closed successfully",
+ analyzers,
+ nil,
+ ).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go
new file mode 100644
index 000000000..6ff38909f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go
@@ -0,0 +1,52 @@
+package golinters
+
+import (
+ "fmt"
+ "sync"
+
+ deadcodeAPI "github.com/golangci/go-misc/deadcode"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func NewDeadcode() *goanalysis.Linter {
+ const linterName = "deadcode"
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: linterName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ Run: func(pass *analysis.Pass) (interface{}, error) {
+ prog := goanalysis.MakeFakeLoaderProgram(pass)
+ issues, err := deadcodeAPI.Run(prog)
+ if err != nil {
+ return nil, err
+ }
+ res := make([]goanalysis.Issue, 0, len(issues))
+ for _, i := range issues {
+ res = append(res, goanalysis.NewIssue(&result.Issue{
+ Pos: i.Pos,
+ Text: fmt.Sprintf("%s is unused", formatCode(i.UnusedIdentName, nil)),
+ FromLinter: linterName,
+ }, pass))
+ }
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ },
+ }
+ return goanalysis.NewLinter(
+ linterName,
+ "Finds unused code",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/depguard.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/depguard.go
new file mode 100644
index 000000000..3bd854811
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/depguard.go
@@ -0,0 +1,112 @@
+package golinters
+
+import (
+ "fmt"
+ "strings"
+ "sync"
+
+ "github.com/OpenPeeDeeP/depguard"
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/loader"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func setDepguardListType(dg *depguard.Depguard, lintCtx *linter.Context) error {
+ listType := lintCtx.Settings().Depguard.ListType
+ var found bool
+ dg.ListType, found = depguard.StringToListType[strings.ToLower(listType)]
+ if !found {
+ if listType != "" {
+ return fmt.Errorf("unsure what list type %s is", listType)
+ }
+ dg.ListType = depguard.LTBlacklist
+ }
+
+ return nil
+}
+
+func setupDepguardPackages(dg *depguard.Depguard, lintCtx *linter.Context) {
+ if dg.ListType == depguard.LTBlacklist {
+ // if the list type was a blacklist the packages with error messages should
+ // be included in the blacklist package list
+
+ noMessagePackages := make(map[string]bool)
+ for _, pkg := range dg.Packages {
+ noMessagePackages[pkg] = true
+ }
+
+ for pkg := range lintCtx.Settings().Depguard.PackagesWithErrorMessage {
+ if _, ok := noMessagePackages[pkg]; !ok {
+ dg.Packages = append(dg.Packages, pkg)
+ }
+ }
+ }
+}
+
+func NewDepguard() *goanalysis.Linter {
+ const linterName = "depguard"
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: linterName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ linterName,
+ "Go linter that checks if package imports are in a list of acceptable packages",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ dgSettings := &lintCtx.Settings().Depguard
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ prog := goanalysis.MakeFakeLoaderProgram(pass)
+ dg := &depguard.Depguard{
+ Packages: dgSettings.Packages,
+ IncludeGoRoot: dgSettings.IncludeGoRoot,
+ }
+ if err := setDepguardListType(dg, lintCtx); err != nil {
+ return nil, err
+ }
+ setupDepguardPackages(dg, lintCtx)
+
+ loadConfig := &loader.Config{
+ Cwd: "", // fallbacked to os.Getcwd
+ Build: nil, // fallbacked to build.Default
+ }
+ issues, err := dg.Run(loadConfig, prog)
+ if err != nil {
+ return nil, err
+ }
+ if len(issues) == 0 {
+ return nil, nil
+ }
+ msgSuffix := "is in the blacklist"
+ if dg.ListType == depguard.LTWhitelist {
+ msgSuffix = "is not in the whitelist"
+ }
+ res := make([]goanalysis.Issue, 0, len(issues))
+ for _, i := range issues {
+ userSuppliedMsgSuffix := dgSettings.PackagesWithErrorMessage[i.PackageName]
+ if userSuppliedMsgSuffix != "" {
+ userSuppliedMsgSuffix = ": " + userSuppliedMsgSuffix
+ }
+ res = append(res, goanalysis.NewIssue(&result.Issue{
+ Pos: i.Position,
+ Text: fmt.Sprintf("%s %s%s", formatCode(i.PackageName, lintCtx.Cfg), msgSuffix, userSuppliedMsgSuffix),
+ FromLinter: linterName,
+ }, pass))
+ }
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/dogsled.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/dogsled.go
new file mode 100644
index 000000000..8978ff913
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/dogsled.go
@@ -0,0 +1,97 @@
+package golinters
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "sync"
+
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const dogsledLinterName = "dogsled"
+
+func NewDogsled() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: dogsledLinterName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ dogsledLinterName,
+ "Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f())",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var pkgIssues []goanalysis.Issue
+ for _, f := range pass.Files {
+ v := returnsVisitor{
+ maxBlanks: lintCtx.Settings().Dogsled.MaxBlankIdentifiers,
+ f: pass.Fset,
+ }
+ ast.Walk(&v, f)
+ for i := range v.issues {
+ pkgIssues = append(pkgIssues, goanalysis.NewIssue(&v.issues[i], pass))
+ }
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, pkgIssues...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
+
+type returnsVisitor struct {
+ f *token.FileSet
+ maxBlanks int
+ issues []result.Issue
+}
+
+func (v *returnsVisitor) Visit(node ast.Node) ast.Visitor {
+ funcDecl, ok := node.(*ast.FuncDecl)
+ if !ok {
+ return v
+ }
+ if funcDecl.Body == nil {
+ return v
+ }
+
+ for _, expr := range funcDecl.Body.List {
+ assgnStmt, ok := expr.(*ast.AssignStmt)
+ if !ok {
+ continue
+ }
+
+ numBlank := 0
+ for _, left := range assgnStmt.Lhs {
+ ident, ok := left.(*ast.Ident)
+ if !ok {
+ continue
+ }
+ if ident.Name == "_" {
+ numBlank++
+ }
+ }
+
+ if numBlank > v.maxBlanks {
+ v.issues = append(v.issues, result.Issue{
+ FromLinter: dogsledLinterName,
+ Text: fmt.Sprintf("declaration has %v blank identifiers", numBlank),
+ Pos: v.f.Position(assgnStmt.Pos()),
+ })
+ }
+ }
+ return v
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/dupl.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/dupl.go
new file mode 100644
index 000000000..ed1c4fcbd
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/dupl.go
@@ -0,0 +1,83 @@
+package golinters
+
+import (
+ "fmt"
+ "go/token"
+ "sync"
+
+ duplAPI "github.com/golangci/dupl"
+ "github.com/pkg/errors"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const duplLinterName = "dupl"
+
+func NewDupl() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: duplLinterName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ duplLinterName,
+ "Tool for code clone detection",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var fileNames []string
+ for _, f := range pass.Files {
+ pos := pass.Fset.PositionFor(f.Pos(), false)
+ fileNames = append(fileNames, pos.Filename)
+ }
+
+ issues, err := duplAPI.Run(fileNames, lintCtx.Settings().Dupl.Threshold)
+ if err != nil {
+ return nil, err
+ }
+
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]goanalysis.Issue, 0, len(issues))
+ for _, i := range issues {
+ toFilename, err := fsutils.ShortestRelPath(i.To.Filename(), "")
+ if err != nil {
+ return nil, errors.Wrapf(err, "failed to get shortest rel path for %q", i.To.Filename())
+ }
+ dupl := fmt.Sprintf("%s:%d-%d", toFilename, i.To.LineStart(), i.To.LineEnd())
+ text := fmt.Sprintf("%d-%d lines are duplicate of %s",
+ i.From.LineStart(), i.From.LineEnd(),
+ formatCode(dupl, lintCtx.Cfg))
+ res = append(res, goanalysis.NewIssue(&result.Issue{
+ Pos: token.Position{
+ Filename: i.From.Filename(),
+ Line: i.From.LineStart(),
+ },
+ LineRange: &result.Range{
+ From: i.From.LineStart(),
+ To: i.From.LineEnd(),
+ },
+ Text: text,
+ FromLinter: duplLinterName,
+ }, pass))
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/errcheck.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/errcheck.go
new file mode 100644
index 000000000..7df11fc87
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/errcheck.go
@@ -0,0 +1,217 @@
+package golinters
+
+import (
+ "bufio"
+ "fmt"
+ "os"
+ "os/user"
+ "path/filepath"
+ "regexp"
+ "strings"
+ "sync"
+
+ errcheck "github.com/golangci/errcheck/golangci"
+ "github.com/pkg/errors"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func NewErrcheck() *goanalysis.Linter {
+ const linterName = "errcheck"
+ var mu sync.Mutex
+ var res []goanalysis.Issue
+ analyzer := &analysis.Analyzer{
+ Name: linterName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ linterName,
+ "Errcheck is a program for checking for unchecked errors "+
+ "in go programs. These unchecked errors can be critical bugs in some cases",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ prog := goanalysis.MakeFakeLoaderProgram(pass)
+ errCfg, err := genConfig(&lintCtx.Settings().Errcheck)
+ if err != nil {
+ return nil, err
+ }
+ errcheckIssues, err := errcheck.RunWithConfig(prog, errCfg)
+ if err != nil {
+ return nil, err
+ }
+
+ if len(errcheckIssues) == 0 {
+ return nil, nil
+ }
+
+ issues := make([]goanalysis.Issue, 0, len(errcheckIssues))
+ for _, i := range errcheckIssues {
+ var text string
+ if i.FuncName != "" {
+ text = fmt.Sprintf("Error return value of %s is not checked", formatCode(i.FuncName, lintCtx.Cfg))
+ } else {
+ text = "Error return value is not checked"
+ }
+ issues = append(issues, goanalysis.NewIssue(&result.Issue{
+ FromLinter: linterName,
+ Text: text,
+ Pos: i.Pos,
+ }, pass))
+ }
+ mu.Lock()
+ res = append(res, issues...)
+ mu.Unlock()
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return res
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
+
+// parseIgnoreConfig was taken from errcheck in order to keep the API identical.
+// https://github.com/kisielk/errcheck/blob/1787c4bee836470bf45018cfbc783650db3c6501/main.go#L25-L60
+func parseIgnoreConfig(s string) (map[string]*regexp.Regexp, error) {
+ if s == "" {
+ return nil, nil
+ }
+
+ cfg := map[string]*regexp.Regexp{}
+
+ for _, pair := range strings.Split(s, ",") {
+ colonIndex := strings.Index(pair, ":")
+ var pkg, re string
+ if colonIndex == -1 {
+ pkg = ""
+ re = pair
+ } else {
+ pkg = pair[:colonIndex]
+ re = pair[colonIndex+1:]
+ }
+ regex, err := regexp.Compile(re)
+ if err != nil {
+ return nil, err
+ }
+ cfg[pkg] = regex
+ }
+
+ return cfg, nil
+}
+
+func genConfig(errCfg *config.ErrcheckSettings) (*errcheck.Config, error) {
+ ignoreConfig, err := parseIgnoreConfig(errCfg.Ignore)
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to parse 'ignore' directive")
+ }
+
+ c := &errcheck.Config{
+ Ignore: ignoreConfig,
+ Blank: errCfg.CheckAssignToBlank,
+ Asserts: errCfg.CheckTypeAssertions,
+ }
+
+ if errCfg.Exclude != "" {
+ exclude, err := readExcludeFile(errCfg.Exclude)
+ if err != nil {
+ return nil, err
+ }
+ c.Exclude = exclude
+ }
+
+ return c, nil
+}
+
+func getFirstPathArg() string {
+ args := os.Args
+
+ // skip all args ([golangci-lint, run/linters]) before files/dirs list
+ for len(args) != 0 {
+ if args[0] == "run" {
+ args = args[1:]
+ break
+ }
+
+ args = args[1:]
+ }
+
+ // find first file/dir arg
+ firstArg := "./..."
+ for _, arg := range args {
+ if !strings.HasPrefix(arg, "-") {
+ firstArg = arg
+ break
+ }
+ }
+
+ return firstArg
+}
+
+func setupConfigFileSearch(name string) []string {
+ if strings.HasPrefix(name, "~") {
+ if u, err := user.Current(); err == nil {
+ name = strings.Replace(name, "~", u.HomeDir, 1)
+ }
+ }
+
+ if filepath.IsAbs(name) {
+ return []string{name}
+ }
+
+ firstArg := getFirstPathArg()
+
+ absStartPath, err := filepath.Abs(firstArg)
+ if err != nil {
+ absStartPath = filepath.Clean(firstArg)
+ }
+
+ // start from it
+ var curDir string
+ if fsutils.IsDir(absStartPath) {
+ curDir = absStartPath
+ } else {
+ curDir = filepath.Dir(absStartPath)
+ }
+
+ // find all dirs from it up to the root
+ configSearchPaths := []string{filepath.Join(".", name)}
+ for {
+ configSearchPaths = append(configSearchPaths, filepath.Join(curDir, name))
+ newCurDir := filepath.Dir(curDir)
+ if curDir == newCurDir || newCurDir == "" {
+ break
+ }
+ curDir = newCurDir
+ }
+
+ return configSearchPaths
+}
+
+func readExcludeFile(name string) (map[string]bool, error) {
+ var err error
+ var fh *os.File
+
+ for _, path := range setupConfigFileSearch(name) {
+ if fh, err = os.Open(path); err == nil {
+ break
+ }
+ }
+
+ if fh == nil {
+ return nil, errors.Wrapf(err, "failed reading exclude file: %s", name)
+ }
+ scanner := bufio.NewScanner(fh)
+ exclude := make(map[string]bool)
+ for scanner.Scan() {
+ exclude[scanner.Text()] = true
+ }
+ if err := scanner.Err(); err != nil {
+ return nil, errors.Wrapf(err, "failed scanning file: %s", name)
+ }
+ return exclude, nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/funlen.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/funlen.go
new file mode 100644
index 000000000..29cb6b7ef
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/funlen.go
@@ -0,0 +1,64 @@
+package golinters
+
+import (
+ "go/token"
+ "strings"
+ "sync"
+
+ "github.com/ultraware/funlen"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const funlenLinterName = "funlen"
+
+func NewFunlen() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: funlenLinterName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ funlenLinterName,
+ "Tool for detection of long functions",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var issues []funlen.Message
+ for _, file := range pass.Files {
+ fileIssues := funlen.Run(file, pass.Fset, lintCtx.Settings().Funlen.Lines, lintCtx.Settings().Funlen.Statements)
+ issues = append(issues, fileIssues...)
+ }
+
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]goanalysis.Issue, len(issues))
+ for k, i := range issues {
+ res[k] = goanalysis.NewIssue(&result.Issue{
+ Pos: token.Position{
+ Filename: i.Pos.Filename,
+ Line: i.Pos.Line,
+ },
+ Text: strings.TrimRight(i.Message, "\n"),
+ FromLinter: funlenLinterName,
+ }, pass)
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/adapters.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/adapters.go
new file mode 100644
index 000000000..830c4d882
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/adapters.go
@@ -0,0 +1,36 @@
+package goanalysis
+
+import (
+ "go/types"
+
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/loader"
+)
+
+func MakeFakeLoaderProgram(pass *analysis.Pass) *loader.Program {
+ prog := &loader.Program{
+ Fset: pass.Fset,
+ Created: []*loader.PackageInfo{
+ {
+ Pkg: pass.Pkg,
+ Importable: true, // not used
+ TransitivelyErrorFree: true, // TODO
+
+ Files: pass.Files,
+ Errors: nil,
+ Info: *pass.TypesInfo,
+ },
+ },
+ AllPackages: map[*types.Package]*loader.PackageInfo{
+ pass.Pkg: {
+ Pkg: pass.Pkg,
+ Importable: true,
+ TransitivelyErrorFree: true,
+ Files: pass.Files,
+ Errors: nil,
+ Info: *pass.TypesInfo,
+ },
+ },
+ }
+ return prog
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/issue.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/issue.go
new file mode 100644
index 000000000..f331a3ab9
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/issue.go
@@ -0,0 +1,31 @@
+package goanalysis
+
+import (
+ "go/token"
+
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Issue struct {
+ result.Issue
+ Pass *analysis.Pass
+}
+
+func NewIssue(i *result.Issue, pass *analysis.Pass) Issue {
+ return Issue{
+ Issue: *i,
+ Pass: pass,
+ }
+}
+
+type EncodingIssue struct {
+ FromLinter string
+ Text string
+ Pos token.Position
+ LineRange *result.Range
+ Replacement *result.Replacement
+ ExpectNoLint bool
+ ExpectedNoLintLinter string
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/linter.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/linter.go
new file mode 100644
index 000000000..f1cfcca83
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/linter.go
@@ -0,0 +1,519 @@
+package goanalysis
+
+import (
+ "context"
+ "flag"
+ "fmt"
+ "runtime"
+ "sort"
+ "strings"
+ "sync"
+ "sync/atomic"
+ "time"
+
+ "github.com/pkg/errors"
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/packages"
+
+ "github.com/golangci/golangci-lint/internal/pkgcache"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ libpackages "github.com/golangci/golangci-lint/pkg/packages"
+ "github.com/golangci/golangci-lint/pkg/result"
+ "github.com/golangci/golangci-lint/pkg/timeutils"
+)
+
+const (
+ TheOnlyAnalyzerName = "the_only_name"
+ TheOnlyanalyzerDoc = "the_only_doc"
+)
+
+type LoadMode int
+
+const (
+ LoadModeNone LoadMode = iota
+ LoadModeSyntax
+ LoadModeTypesInfo
+ LoadModeWholeProgram
+)
+
+var issuesCacheDebugf = logutils.Debug("goanalysis/issues/cache")
+
+func (loadMode LoadMode) String() string {
+ switch loadMode {
+ case LoadModeNone:
+ return "none"
+ case LoadModeSyntax:
+ return "syntax"
+ case LoadModeTypesInfo:
+ return "types info"
+ case LoadModeWholeProgram:
+ return "whole program"
+ }
+ panic(fmt.Sprintf("unknown load mode %d", loadMode))
+}
+
+type Linter struct {
+ name, desc string
+ analyzers []*analysis.Analyzer
+ cfg map[string]map[string]interface{}
+ issuesReporter func(*linter.Context) []Issue
+ contextSetter func(*linter.Context)
+ loadMode LoadMode
+ needUseOriginalPackages bool
+ isTypecheckModeOn bool
+}
+
+func NewLinter(name, desc string, analyzers []*analysis.Analyzer, cfg map[string]map[string]interface{}) *Linter {
+ return &Linter{name: name, desc: desc, analyzers: analyzers, cfg: cfg}
+}
+
+func (lnt *Linter) UseOriginalPackages() {
+ lnt.needUseOriginalPackages = true
+}
+
+func (lnt *Linter) SetTypecheckMode() {
+ lnt.isTypecheckModeOn = true
+}
+
+func (lnt *Linter) LoadMode() LoadMode {
+ return lnt.loadMode
+}
+
+func (lnt *Linter) WithLoadMode(loadMode LoadMode) *Linter {
+ lnt.loadMode = loadMode
+ return lnt
+}
+
+func (lnt *Linter) WithIssuesReporter(r func(*linter.Context) []Issue) *Linter {
+ lnt.issuesReporter = r
+ return lnt
+}
+
+func (lnt *Linter) WithContextSetter(cs func(*linter.Context)) *Linter {
+ lnt.contextSetter = cs
+ return lnt
+}
+
+func (lnt *Linter) Name() string {
+ return lnt.name
+}
+
+func (lnt *Linter) Desc() string {
+ return lnt.desc
+}
+
+func (lnt *Linter) allAnalyzerNames() []string {
+ var ret []string
+ for _, a := range lnt.analyzers {
+ ret = append(ret, a.Name)
+ }
+ return ret
+}
+
+func allFlagNames(fs *flag.FlagSet) []string {
+ var ret []string
+ fs.VisitAll(func(f *flag.Flag) {
+ ret = append(ret, f.Name)
+ })
+ return ret
+}
+
+func valueToString(v interface{}) string {
+ if ss, ok := v.([]string); ok {
+ return strings.Join(ss, ",")
+ }
+
+ if is, ok := v.([]interface{}); ok {
+ var ss []string
+ for _, i := range is {
+ ss = append(ss, fmt.Sprint(i))
+ }
+ return valueToString(ss)
+ }
+
+ return fmt.Sprint(v)
+}
+
+func (lnt *Linter) configureAnalyzer(a *analysis.Analyzer, cfg map[string]interface{}) error {
+ for k, v := range cfg {
+ f := a.Flags.Lookup(k)
+ if f == nil {
+ validFlagNames := allFlagNames(&a.Flags)
+ if len(validFlagNames) == 0 {
+ return fmt.Errorf("analyzer doesn't have settings")
+ }
+
+ return fmt.Errorf("analyzer doesn't have setting %q, valid settings: %v",
+ k, validFlagNames)
+ }
+
+ if err := f.Value.Set(valueToString(v)); err != nil {
+ return errors.Wrapf(err, "failed to set analyzer setting %q with value %v", k, v)
+ }
+ }
+
+ return nil
+}
+
+func (lnt *Linter) configure() error {
+ analyzersMap := map[string]*analysis.Analyzer{}
+ for _, a := range lnt.analyzers {
+ analyzersMap[a.Name] = a
+ }
+
+ for analyzerName, analyzerSettings := range lnt.cfg {
+ a := analyzersMap[analyzerName]
+ if a == nil {
+ return fmt.Errorf("settings key %q must be valid analyzer name, valid analyzers: %v",
+ analyzerName, lnt.allAnalyzerNames())
+ }
+
+ if err := lnt.configureAnalyzer(a, analyzerSettings); err != nil {
+ return errors.Wrapf(err, "failed to configure analyzer %s", analyzerName)
+ }
+ }
+
+ return nil
+}
+
+func parseError(srcErr packages.Error) (*result.Issue, error) {
+ pos, err := libpackages.ParseErrorPosition(srcErr.Pos)
+ if err != nil {
+ return nil, err
+ }
+
+ return &result.Issue{
+ Pos: *pos,
+ Text: srcErr.Msg,
+ FromLinter: "typecheck",
+ }, nil
+}
+
+func buildIssuesFromErrorsForTypecheckMode(errs []error, lintCtx *linter.Context) ([]result.Issue, error) {
+ var issues []result.Issue
+ uniqReportedIssues := map[string]bool{}
+ for _, err := range errs {
+ itErr, ok := errors.Cause(err).(*IllTypedError)
+ if !ok {
+ return nil, err
+ }
+ for _, err := range libpackages.ExtractErrors(itErr.Pkg) {
+ i, perr := parseError(err)
+ if perr != nil { // failed to parse
+ if uniqReportedIssues[err.Msg] {
+ continue
+ }
+ uniqReportedIssues[err.Msg] = true
+ lintCtx.Log.Errorf("typechecking error: %s", err.Msg)
+ } else {
+ i.Pkg = itErr.Pkg // to save to cache later
+ issues = append(issues, *i)
+ }
+ }
+ }
+ return issues, nil
+}
+
+func buildIssues(diags []Diagnostic, linterNameBuilder func(diag *Diagnostic) string) []result.Issue {
+ var issues []result.Issue
+ for i := range diags {
+ diag := &diags[i]
+ linterName := linterNameBuilder(diag)
+ var text string
+ if diag.Analyzer.Name == linterName {
+ text = diag.Message
+ } else {
+ text = fmt.Sprintf("%s: %s", diag.Analyzer.Name, diag.Message)
+ }
+ issues = append(issues, result.Issue{
+ FromLinter: linterName,
+ Text: text,
+ Pos: diag.Position,
+ Pkg: diag.Pkg,
+ })
+ }
+ return issues
+}
+
+func (lnt *Linter) preRun(lintCtx *linter.Context) error {
+ if err := analysis.Validate(lnt.analyzers); err != nil {
+ return errors.Wrap(err, "failed to validate analyzers")
+ }
+
+ if err := lnt.configure(); err != nil {
+ return errors.Wrap(err, "failed to configure analyzers")
+ }
+
+ if lnt.contextSetter != nil {
+ lnt.contextSetter(lintCtx)
+ }
+
+ return nil
+}
+
+func (lnt *Linter) getName() string {
+ return lnt.name
+}
+
+func (lnt *Linter) getLinterNameForDiagnostic(*Diagnostic) string {
+ return lnt.name
+}
+
+func (lnt *Linter) getAnalyzers() []*analysis.Analyzer {
+ return lnt.analyzers
+}
+
+func (lnt *Linter) useOriginalPackages() bool {
+ return lnt.needUseOriginalPackages
+}
+
+func (lnt *Linter) isTypecheckMode() bool {
+ return lnt.isTypecheckModeOn
+}
+
+func (lnt *Linter) reportIssues(lintCtx *linter.Context) []Issue {
+ if lnt.issuesReporter != nil {
+ return lnt.issuesReporter(lintCtx)
+ }
+ return nil
+}
+
+func (lnt *Linter) getLoadMode() LoadMode {
+ return lnt.loadMode
+}
+
+type runAnalyzersConfig interface {
+ getName() string
+ getLinterNameForDiagnostic(*Diagnostic) string
+ getAnalyzers() []*analysis.Analyzer
+ useOriginalPackages() bool
+ isTypecheckMode() bool
+ reportIssues(*linter.Context) []Issue
+ getLoadMode() LoadMode
+}
+
+func getIssuesCacheKey(analyzers []*analysis.Analyzer) string {
+ return "lint/result:" + analyzersHashID(analyzers)
+}
+
+func saveIssuesToCache(allPkgs []*packages.Package, pkgsFromCache map[*packages.Package]bool,
+ issues []result.Issue, lintCtx *linter.Context, analyzers []*analysis.Analyzer) {
+ startedAt := time.Now()
+ perPkgIssues := map[*packages.Package][]result.Issue{}
+ for ind := range issues {
+ i := &issues[ind]
+ perPkgIssues[i.Pkg] = append(perPkgIssues[i.Pkg], *i)
+ }
+
+ savedIssuesCount := int32(0)
+ lintResKey := getIssuesCacheKey(analyzers)
+
+ workerCount := runtime.GOMAXPROCS(-1)
+ var wg sync.WaitGroup
+ wg.Add(workerCount)
+
+ pkgCh := make(chan *packages.Package, len(allPkgs))
+ for i := 0; i < workerCount; i++ {
+ go func() {
+ defer wg.Done()
+ for pkg := range pkgCh {
+ pkgIssues := perPkgIssues[pkg]
+ encodedIssues := make([]EncodingIssue, 0, len(pkgIssues))
+ for ind := range pkgIssues {
+ i := &pkgIssues[ind]
+ encodedIssues = append(encodedIssues, EncodingIssue{
+ FromLinter: i.FromLinter,
+ Text: i.Text,
+ Pos: i.Pos,
+ LineRange: i.LineRange,
+ Replacement: i.Replacement,
+ ExpectNoLint: i.ExpectNoLint,
+ ExpectedNoLintLinter: i.ExpectedNoLintLinter,
+ })
+ }
+
+ atomic.AddInt32(&savedIssuesCount, int32(len(encodedIssues)))
+ if err := lintCtx.PkgCache.Put(pkg, pkgcache.HashModeNeedAllDeps, lintResKey, encodedIssues); err != nil {
+ lintCtx.Log.Infof("Failed to save package %s issues (%d) to cache: %s", pkg, len(pkgIssues), err)
+ } else {
+ issuesCacheDebugf("Saved package %s issues (%d) to cache", pkg, len(pkgIssues))
+ }
+ }
+ }()
+ }
+
+ for _, pkg := range allPkgs {
+ if pkgsFromCache[pkg] {
+ continue
+ }
+
+ pkgCh <- pkg
+ }
+ close(pkgCh)
+ wg.Wait()
+
+ issuesCacheDebugf("Saved %d issues from %d packages to cache in %s", savedIssuesCount, len(allPkgs), time.Since(startedAt))
+}
+
+//nolint:gocritic
+func loadIssuesFromCache(pkgs []*packages.Package, lintCtx *linter.Context,
+ analyzers []*analysis.Analyzer) ([]result.Issue, map[*packages.Package]bool) {
+ startedAt := time.Now()
+
+ lintResKey := getIssuesCacheKey(analyzers)
+ type cacheRes struct {
+ issues []result.Issue
+ loadErr error
+ }
+ pkgToCacheRes := make(map[*packages.Package]*cacheRes, len(pkgs))
+ for _, pkg := range pkgs {
+ pkgToCacheRes[pkg] = &cacheRes{}
+ }
+
+ workerCount := runtime.GOMAXPROCS(-1)
+ var wg sync.WaitGroup
+ wg.Add(workerCount)
+
+ pkgCh := make(chan *packages.Package, len(pkgs))
+ for i := 0; i < workerCount; i++ {
+ go func() {
+ defer wg.Done()
+ for pkg := range pkgCh {
+ var pkgIssues []EncodingIssue
+ err := lintCtx.PkgCache.Get(pkg, pkgcache.HashModeNeedAllDeps, lintResKey, &pkgIssues)
+ cacheRes := pkgToCacheRes[pkg]
+ cacheRes.loadErr = err
+ if err != nil {
+ continue
+ }
+ if len(pkgIssues) == 0 {
+ continue
+ }
+
+ issues := make([]result.Issue, 0, len(pkgIssues))
+ for _, i := range pkgIssues {
+ issues = append(issues, result.Issue{
+ FromLinter: i.FromLinter,
+ Text: i.Text,
+ Pos: i.Pos,
+ LineRange: i.LineRange,
+ Replacement: i.Replacement,
+ Pkg: pkg,
+ ExpectNoLint: i.ExpectNoLint,
+ ExpectedNoLintLinter: i.ExpectedNoLintLinter,
+ })
+ }
+ cacheRes.issues = issues
+ }
+ }()
+ }
+
+ for _, pkg := range pkgs {
+ pkgCh <- pkg
+ }
+ close(pkgCh)
+ wg.Wait()
+
+ loadedIssuesCount := 0
+ var issues []result.Issue
+ pkgsFromCache := map[*packages.Package]bool{}
+ for pkg, cacheRes := range pkgToCacheRes {
+ if cacheRes.loadErr == nil {
+ loadedIssuesCount += len(cacheRes.issues)
+ pkgsFromCache[pkg] = true
+ issues = append(issues, cacheRes.issues...)
+ issuesCacheDebugf("Loaded package %s issues (%d) from cache", pkg, len(cacheRes.issues))
+ } else {
+ issuesCacheDebugf("Didn't load package %s issues from cache: %s", pkg, cacheRes.loadErr)
+ }
+ }
+ issuesCacheDebugf("Loaded %d issues from cache in %s, analyzing %d/%d packages",
+ loadedIssuesCount, time.Since(startedAt), len(pkgs)-len(pkgsFromCache), len(pkgs))
+ return issues, pkgsFromCache
+}
+
+func runAnalyzers(cfg runAnalyzersConfig, lintCtx *linter.Context) ([]result.Issue, error) {
+ log := lintCtx.Log.Child("goanalysis")
+ sw := timeutils.NewStopwatch("analyzers", log)
+
+ const stagesToPrint = 10
+ defer sw.PrintTopStages(stagesToPrint)
+
+ runner := newRunner(cfg.getName(), log, lintCtx.PkgCache, lintCtx.LoadGuard, cfg.getLoadMode(), sw)
+
+ pkgs := lintCtx.Packages
+ if cfg.useOriginalPackages() {
+ pkgs = lintCtx.OriginalPackages
+ }
+
+ issues, pkgsFromCache := loadIssuesFromCache(pkgs, lintCtx, cfg.getAnalyzers())
+ var pkgsToAnalyze []*packages.Package
+ for _, pkg := range pkgs {
+ if !pkgsFromCache[pkg] {
+ pkgsToAnalyze = append(pkgsToAnalyze, pkg)
+ }
+ }
+
+ diags, errs, passToPkg := runner.run(cfg.getAnalyzers(), pkgsToAnalyze)
+
+ defer func() {
+ if len(errs) == 0 {
+ // If we try to save to cache even if we have compilation errors
+ // we won't see them on repeated runs.
+ saveIssuesToCache(pkgs, pkgsFromCache, issues, lintCtx, cfg.getAnalyzers())
+ }
+ }()
+
+ buildAllIssues := func() []result.Issue {
+ var retIssues []result.Issue
+ reportedIssues := cfg.reportIssues(lintCtx)
+ for i := range reportedIssues {
+ issue := &reportedIssues[i].Issue
+ if issue.Pkg == nil {
+ issue.Pkg = passToPkg[reportedIssues[i].Pass]
+ }
+ retIssues = append(retIssues, *issue)
+ }
+ retIssues = append(retIssues, buildIssues(diags, cfg.getLinterNameForDiagnostic)...)
+ return retIssues
+ }
+
+ if cfg.isTypecheckMode() {
+ errIssues, err := buildIssuesFromErrorsForTypecheckMode(errs, lintCtx)
+ if err != nil {
+ return nil, err
+ }
+
+ issues = append(issues, errIssues...)
+ issues = append(issues, buildAllIssues()...)
+
+ return issues, nil
+ }
+
+ // Don't print all errs: they can duplicate.
+ if len(errs) != 0 {
+ return nil, errs[0]
+ }
+
+ issues = append(issues, buildAllIssues()...)
+ return issues, nil
+}
+
+func (lnt *Linter) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ if err := lnt.preRun(lintCtx); err != nil {
+ return nil, err
+ }
+
+ return runAnalyzers(lnt, lintCtx)
+}
+
+func analyzersHashID(analyzers []*analysis.Analyzer) string {
+ names := make([]string, 0, len(analyzers))
+ for _, a := range analyzers {
+ names = append(names, a.Name)
+ }
+
+ sort.Strings(names)
+ return strings.Join(names, ",")
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/load/guard.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/load/guard.go
new file mode 100644
index 000000000..ab7775cc8
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/load/guard.go
@@ -0,0 +1,30 @@
+package load
+
+import (
+ "sync"
+
+ "golang.org/x/tools/go/packages"
+)
+
+type Guard struct {
+ loadMutexes map[*packages.Package]*sync.Mutex
+ mutex sync.Mutex
+}
+
+func NewGuard() *Guard {
+ return &Guard{
+ loadMutexes: map[*packages.Package]*sync.Mutex{},
+ }
+}
+
+func (g *Guard) AddMutexForPkg(pkg *packages.Package) {
+ g.loadMutexes[pkg] = &sync.Mutex{}
+}
+
+func (g *Guard) MutexForPkg(pkg *packages.Package) *sync.Mutex {
+ return g.loadMutexes[pkg]
+}
+
+func (g *Guard) Mutex() *sync.Mutex {
+ return &g.mutex
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/metalinter.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/metalinter.go
new file mode 100644
index 000000000..5975e2057
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/metalinter.go
@@ -0,0 +1,99 @@
+package goanalysis
+
+import (
+ "context"
+
+ "github.com/pkg/errors"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type MetaLinter struct {
+ linters []*Linter
+ analyzerToLinterName map[*analysis.Analyzer]string
+}
+
+func NewMetaLinter(linters []*Linter) *MetaLinter {
+ ml := &MetaLinter{linters: linters}
+ ml.analyzerToLinterName = ml.getAnalyzerToLinterNameMapping()
+ return ml
+}
+
+func (ml MetaLinter) Name() string {
+ return "goanalysis_metalinter"
+}
+
+func (ml MetaLinter) Desc() string {
+ return ""
+}
+
+func (ml MetaLinter) isTypecheckMode() bool {
+ for _, linter := range ml.linters {
+ if linter.isTypecheckMode() {
+ return true
+ }
+ }
+ return false
+}
+
+func (ml MetaLinter) getLoadMode() LoadMode {
+ loadMode := LoadModeNone
+ for _, linter := range ml.linters {
+ if linter.loadMode > loadMode {
+ loadMode = linter.loadMode
+ }
+ }
+ return loadMode
+}
+
+func (ml MetaLinter) getAnalyzers() []*analysis.Analyzer {
+ var allAnalyzers []*analysis.Analyzer
+ for _, linter := range ml.linters {
+ allAnalyzers = append(allAnalyzers, linter.analyzers...)
+ }
+ return allAnalyzers
+}
+
+func (ml MetaLinter) getName() string {
+ return "metalinter"
+}
+
+func (ml MetaLinter) useOriginalPackages() bool {
+ return false // `unused` can't be run by this metalinter
+}
+
+func (ml MetaLinter) reportIssues(lintCtx *linter.Context) []Issue {
+ var ret []Issue
+ for _, lnt := range ml.linters {
+ if lnt.issuesReporter != nil {
+ ret = append(ret, lnt.issuesReporter(lintCtx)...)
+ }
+ }
+ return ret
+}
+
+func (ml MetaLinter) getLinterNameForDiagnostic(diag *Diagnostic) string {
+ return ml.analyzerToLinterName[diag.Analyzer]
+}
+
+func (ml MetaLinter) getAnalyzerToLinterNameMapping() map[*analysis.Analyzer]string {
+ analyzerToLinterName := map[*analysis.Analyzer]string{}
+ for _, linter := range ml.linters {
+ for _, a := range linter.analyzers {
+ analyzerToLinterName[a] = linter.Name()
+ }
+ }
+ return analyzerToLinterName
+}
+
+func (ml MetaLinter) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ for _, linter := range ml.linters {
+ if err := linter.preRun(lintCtx); err != nil {
+ return nil, errors.Wrapf(err, "failed to pre-run %s", linter.Name())
+ }
+ }
+
+ return runAnalyzers(ml, lintCtx)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go
new file mode 100644
index 000000000..d07294245
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go
@@ -0,0 +1,1363 @@
+// checker is a partial copy of https://github.com/golang/tools/blob/master/go/analysis/internal/checker
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package checker defines the implementation of the checker commands.
+// The same code drives the multi-analysis driver, the single-analysis
+// driver that is conventionally provided for convenience along with
+// each analysis package, and the test driver.
+package goanalysis
+
+import (
+ "bytes"
+ "encoding/gob"
+ "fmt"
+ "go/ast"
+ "go/parser"
+ "go/scanner"
+ "go/token"
+ "go/types"
+ "os"
+ "reflect"
+ "runtime"
+ "runtime/debug"
+ "sort"
+ "strings"
+ "sync"
+ "sync/atomic"
+ "time"
+
+ "github.com/pkg/errors"
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/gcexportdata"
+ "golang.org/x/tools/go/packages"
+ "golang.org/x/tools/go/types/objectpath"
+
+ "github.com/golangci/golangci-lint/internal/errorutil"
+ "github.com/golangci/golangci-lint/internal/pkgcache"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis/load"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/timeutils"
+)
+
+var (
+ // Debug is a set of single-letter flags:
+ //
+ // f show [f]acts as they are created
+ // p disable [p]arallel execution of analyzers
+ // s do additional [s]anity checks on fact types and serialization
+ // t show [t]iming info (NB: use 'p' flag to avoid GC/scheduler noise)
+ // v show [v]erbose logging
+ //
+
+ debugf = logutils.Debug("goanalysis")
+ factsDebugf = logutils.Debug("goanalysis/facts")
+ factsInheritDebugf = logutils.Debug("goanalysis/facts/inherit")
+ factsExportDebugf = logutils.Debug("goanalysis/facts")
+ isFactsExportDebug = logutils.HaveDebugTag("goanalysis/facts/export")
+ isMemoryDebug = logutils.HaveDebugTag("goanalysis/memory")
+
+ factsCacheDebugf = logutils.Debug("goanalysis/facts/cache")
+ analyzeDebugf = logutils.Debug("goanalysis/analyze")
+
+ Debug = os.Getenv("GL_GOANALYSIS_DEBUG")
+
+ unsafePkgName = "unsafe"
+)
+
+type Diagnostic struct {
+ analysis.Diagnostic
+ Analyzer *analysis.Analyzer
+ Position token.Position
+ Pkg *packages.Package
+}
+
+type runner struct {
+ log logutils.Log
+ prefix string // ensure unique analyzer names
+ pkgCache *pkgcache.Cache
+ loadGuard *load.Guard
+ loadMode LoadMode
+ passToPkg map[*analysis.Pass]*packages.Package
+ passToPkgGuard sync.Mutex
+ sw *timeutils.Stopwatch
+}
+
+func newRunner(prefix string, logger logutils.Log, pkgCache *pkgcache.Cache, loadGuard *load.Guard,
+ loadMode LoadMode, sw *timeutils.Stopwatch) *runner {
+ return &runner{
+ prefix: prefix,
+ log: logger,
+ pkgCache: pkgCache,
+ loadGuard: loadGuard,
+ loadMode: loadMode,
+ passToPkg: map[*analysis.Pass]*packages.Package{},
+ sw: sw,
+ }
+}
+
+// Run loads the packages specified by args using go/packages,
+// then applies the specified analyzers to them.
+// Analysis flags must already have been set.
+// It provides most of the logic for the main functions of both the
+// singlechecker and the multi-analysis commands.
+// It returns the appropriate exit code.
+func (r *runner) run(analyzers []*analysis.Analyzer, initialPackages []*packages.Package) ([]Diagnostic,
+ []error, map[*analysis.Pass]*packages.Package) {
+ debugf("Analyzing %d packages on load mode %s", len(initialPackages), r.loadMode)
+ defer r.pkgCache.Trim()
+
+ roots := r.analyze(initialPackages, analyzers)
+ diags, errs := extractDiagnostics(roots)
+ return diags, errs, r.passToPkg
+}
+
+type actKey struct {
+ *analysis.Analyzer
+ *packages.Package
+}
+
+func (r *runner) markAllActions(a *analysis.Analyzer, pkg *packages.Package, markedActions map[actKey]struct{}) {
+ k := actKey{a, pkg}
+ if _, ok := markedActions[k]; ok {
+ return
+ }
+
+ for _, req := range a.Requires {
+ r.markAllActions(req, pkg, markedActions)
+ }
+
+ if len(a.FactTypes) != 0 {
+ for path := range pkg.Imports {
+ r.markAllActions(a, pkg.Imports[path], markedActions)
+ }
+ }
+
+ markedActions[k] = struct{}{}
+}
+
+func (r *runner) makeAction(a *analysis.Analyzer, pkg *packages.Package,
+ initialPkgs map[*packages.Package]bool, actions map[actKey]*action, actAlloc *actionAllocator) *action {
+ k := actKey{a, pkg}
+ act, ok := actions[k]
+ if ok {
+ return act
+ }
+
+ act = actAlloc.alloc()
+ act.a = a
+ act.pkg = pkg
+ act.r = r
+ act.isInitialPkg = initialPkgs[pkg]
+ act.needAnalyzeSource = initialPkgs[pkg]
+ act.analysisDoneCh = make(chan struct{})
+
+ depsCount := len(a.Requires)
+ if len(a.FactTypes) > 0 {
+ depsCount += len(pkg.Imports)
+ }
+ act.deps = make([]*action, 0, depsCount)
+
+ // Add a dependency on each required analyzers.
+ for _, req := range a.Requires {
+ act.deps = append(act.deps, r.makeAction(req, pkg, initialPkgs, actions, actAlloc))
+ }
+
+ r.buildActionFactDeps(act, a, pkg, initialPkgs, actions, actAlloc)
+
+ actions[k] = act
+ return act
+}
+
+func (r *runner) buildActionFactDeps(act *action, a *analysis.Analyzer, pkg *packages.Package,
+ initialPkgs map[*packages.Package]bool, actions map[actKey]*action, actAlloc *actionAllocator) {
+ // An analysis that consumes/produces facts
+ // must run on the package's dependencies too.
+ if len(a.FactTypes) == 0 {
+ return
+ }
+
+ act.objectFacts = make(map[objectFactKey]analysis.Fact)
+ act.packageFacts = make(map[packageFactKey]analysis.Fact)
+
+ paths := make([]string, 0, len(pkg.Imports))
+ for path := range pkg.Imports {
+ paths = append(paths, path)
+ }
+ sort.Strings(paths) // for determinism
+ for _, path := range paths {
+ dep := r.makeAction(a, pkg.Imports[path], initialPkgs, actions, actAlloc)
+ act.deps = append(act.deps, dep)
+ }
+
+ // Need to register fact types for pkgcache proper gob encoding.
+ for _, f := range a.FactTypes {
+ gob.Register(f)
+ }
+}
+
+type actionAllocator struct {
+ allocatedActions []action
+ nextFreeIndex int
+}
+
+func newActionAllocator(maxCount int) *actionAllocator {
+ return &actionAllocator{
+ allocatedActions: make([]action, maxCount),
+ nextFreeIndex: 0,
+ }
+}
+
+func (actAlloc *actionAllocator) alloc() *action {
+ if actAlloc.nextFreeIndex == len(actAlloc.allocatedActions) {
+ panic(fmt.Sprintf("Made too many allocations of actions: %d allowed", len(actAlloc.allocatedActions)))
+ }
+ act := &actAlloc.allocatedActions[actAlloc.nextFreeIndex]
+ actAlloc.nextFreeIndex++
+ return act
+}
+
+//nolint:gocritic
+func (r *runner) prepareAnalysis(pkgs []*packages.Package,
+ analyzers []*analysis.Analyzer) (map[*packages.Package]bool, []*action, []*action) {
+ // Construct the action graph.
+
+ // Each graph node (action) is one unit of analysis.
+ // Edges express package-to-package (vertical) dependencies,
+ // and analysis-to-analysis (horizontal) dependencies.
+
+ // This place is memory-intensive: e.g. Istio project has 120k total actions.
+ // Therefore optimize it carefully.
+ markedActions := make(map[actKey]struct{}, len(analyzers)*len(pkgs))
+ for _, a := range analyzers {
+ for _, pkg := range pkgs {
+ r.markAllActions(a, pkg, markedActions)
+ }
+ }
+ totalActionsCount := len(markedActions)
+
+ actions := make(map[actKey]*action, totalActionsCount)
+ actAlloc := newActionAllocator(totalActionsCount)
+
+ initialPkgs := make(map[*packages.Package]bool, len(pkgs))
+ for _, pkg := range pkgs {
+ initialPkgs[pkg] = true
+ }
+
+ // Build nodes for initial packages.
+ roots := make([]*action, 0, len(pkgs)*len(analyzers))
+ for _, a := range analyzers {
+ for _, pkg := range pkgs {
+ root := r.makeAction(a, pkg, initialPkgs, actions, actAlloc)
+ root.isroot = true
+ roots = append(roots, root)
+ }
+ }
+
+ allActions := make([]*action, 0, len(actions))
+ for _, act := range actions {
+ allActions = append(allActions, act)
+ }
+
+ debugf("Built %d actions", len(actions))
+
+ return initialPkgs, allActions, roots
+}
+
+func (r *runner) analyze(pkgs []*packages.Package, analyzers []*analysis.Analyzer) []*action {
+ initialPkgs, actions, rootActions := r.prepareAnalysis(pkgs, analyzers)
+
+ actionPerPkg := map[*packages.Package][]*action{}
+ for _, act := range actions {
+ actionPerPkg[act.pkg] = append(actionPerPkg[act.pkg], act)
+ }
+
+ // Fill Imports field.
+ loadingPackages := map[*packages.Package]*loadingPackage{}
+ var dfs func(pkg *packages.Package)
+ dfs = func(pkg *packages.Package) {
+ if loadingPackages[pkg] != nil {
+ return
+ }
+
+ imports := map[string]*loadingPackage{}
+ for impPath, imp := range pkg.Imports {
+ dfs(imp)
+ impLp := loadingPackages[imp]
+ impLp.dependents++
+ imports[impPath] = impLp
+ }
+
+ loadingPackages[pkg] = &loadingPackage{
+ pkg: pkg,
+ imports: imports,
+ isInitial: initialPkgs[pkg],
+ log: r.log,
+ actions: actionPerPkg[pkg],
+ loadGuard: r.loadGuard,
+ dependents: 1, // self dependent
+ }
+ }
+ for _, act := range actions {
+ dfs(act.pkg)
+ }
+
+ // Limit memory and IO usage.
+ gomaxprocs := runtime.GOMAXPROCS(-1)
+ debugf("Analyzing at most %d packages in parallel", gomaxprocs)
+ loadSem := make(chan struct{}, gomaxprocs)
+
+ var wg sync.WaitGroup
+ debugf("There are %d initial and %d total packages", len(initialPkgs), len(loadingPackages))
+ for _, lp := range loadingPackages {
+ if lp.isInitial {
+ wg.Add(1)
+ go func(lp *loadingPackage) {
+ lp.analyzeRecursive(r.loadMode, loadSem)
+ wg.Done()
+ }(lp)
+ }
+ }
+ wg.Wait()
+
+ return rootActions
+}
+
+//nolint:nakedret
+func extractDiagnostics(roots []*action) (retDiags []Diagnostic, retErrors []error) {
+ extracted := make(map[*action]bool)
+ var extract func(*action)
+ var visitAll func(actions []*action)
+ visitAll = func(actions []*action) {
+ for _, act := range actions {
+ if !extracted[act] {
+ extracted[act] = true
+ visitAll(act.deps)
+ extract(act)
+ }
+ }
+ }
+
+ // De-duplicate diagnostics by position (not token.Pos) to
+ // avoid double-reporting in source files that belong to
+ // multiple packages, such as foo and foo.test.
+ type key struct {
+ token.Position
+ *analysis.Analyzer
+ message string
+ }
+ seen := make(map[key]bool)
+
+ extract = func(act *action) {
+ if act.err != nil {
+ if pe, ok := act.err.(*errorutil.PanicError); ok {
+ panic(pe)
+ }
+ retErrors = append(retErrors, errors.Wrap(act.err, act.a.Name))
+ return
+ }
+
+ if act.isroot {
+ for _, diag := range act.diagnostics {
+ // We don't display a.Name/f.Category
+ // as most users don't care.
+
+ posn := act.pkg.Fset.Position(diag.Pos)
+ k := key{posn, act.a, diag.Message}
+ if seen[k] {
+ continue // duplicate
+ }
+ seen[k] = true
+
+ retDiag := Diagnostic{
+ Diagnostic: diag,
+ Analyzer: act.a,
+ Position: posn,
+ Pkg: act.pkg,
+ }
+ retDiags = append(retDiags, retDiag)
+ }
+ }
+ }
+ visitAll(roots)
+ return
+}
+
+// An action represents one unit of analysis work: the application of
+// one analysis to one package. Actions form a DAG, both within a
+// package (as different analyzers are applied, either in sequence or
+// parallel), and across packages (as dependencies are analyzed).
+type action struct {
+ a *analysis.Analyzer
+ pkg *packages.Package
+ pass *analysis.Pass
+ deps []*action
+ objectFacts map[objectFactKey]analysis.Fact
+ packageFacts map[packageFactKey]analysis.Fact
+ result interface{}
+ diagnostics []analysis.Diagnostic
+ err error
+ r *runner
+ analysisDoneCh chan struct{}
+ loadCachedFactsDone bool
+ loadCachedFactsOk bool
+ isroot bool
+ isInitialPkg bool
+ needAnalyzeSource bool
+}
+
+type objectFactKey struct {
+ obj types.Object
+ typ reflect.Type
+}
+
+type packageFactKey struct {
+ pkg *types.Package
+ typ reflect.Type
+}
+
+func (act *action) String() string {
+ return fmt.Sprintf("%s@%s", act.a, act.pkg)
+}
+
+func (act *action) loadCachedFacts() bool {
+ if act.loadCachedFactsDone { // can't be set in parallel
+ return act.loadCachedFactsOk
+ }
+
+ res := func() bool {
+ if act.isInitialPkg {
+ return true // load cached facts only for non-initial packages
+ }
+
+ if len(act.a.FactTypes) == 0 {
+ return true // no need to load facts
+ }
+
+ return act.loadPersistedFacts()
+ }()
+ act.loadCachedFactsDone = true
+ act.loadCachedFactsOk = res
+ return res
+}
+
+func (act *action) waitUntilDependingAnalyzersWorked() {
+ for _, dep := range act.deps {
+ if dep.pkg == act.pkg {
+ <-dep.analysisDoneCh
+ }
+ }
+}
+
+type IllTypedError struct {
+ Pkg *packages.Package
+}
+
+func (e *IllTypedError) Error() string {
+ return fmt.Sprintf("errors in package: %v", e.Pkg.Errors)
+}
+
+type FailedPrerequisitesError struct {
+ errors map[string][]string
+}
+
+func (f FailedPrerequisitesError) NotEmpty() bool {
+ return len(f.errors) > 0
+}
+
+func (f *FailedPrerequisitesError) Consume(name string, err error) {
+ if f.errors == nil {
+ f.errors = map[string][]string{}
+ }
+ k := fmt.Sprintf("%v", err)
+ f.errors[k] = append(f.errors[k], name)
+}
+
+type groupedPrerequisiteErr struct {
+ names []string
+ err string
+}
+
+func (g groupedPrerequisiteErr) String() string {
+ if len(g.names) == 1 {
+ return fmt.Sprintf("%s: %s", g.names[0], g.err)
+ }
+ return fmt.Sprintf("(%s): %s", strings.Join(g.names, ", "), g.err)
+}
+
+func (f FailedPrerequisitesError) Error() string {
+ var errs []string
+ for err := range f.errors {
+ errs = append(errs, err)
+ }
+ var groups []groupedPrerequisiteErr
+ for _, err := range errs {
+ groups = append(groups, groupedPrerequisiteErr{
+ err: err,
+ names: f.errors[err],
+ })
+ }
+ return fmt.Sprintf("failed prerequisites: %s", groups)
+}
+
+func (act *action) analyzeSafe() {
+ defer func() {
+ if p := recover(); p != nil {
+ act.err = errorutil.NewPanicError(fmt.Sprintf("%s: package %q (isInitialPkg: %t, needAnalyzeSource: %t): %s",
+ act.a.Name, act.pkg.Name, act.isInitialPkg, act.needAnalyzeSource, p), debug.Stack())
+ }
+ }()
+ act.r.sw.TrackStage(act.a.Name, func() {
+ act.analyze()
+ })
+}
+
+func (act *action) analyze() {
+ defer close(act.analysisDoneCh) // unblock actions depending on this action
+
+ if !act.needAnalyzeSource {
+ return
+ }
+
+ defer func(now time.Time) {
+ analyzeDebugf("go/analysis: %s: %s: analyzed package %q in %s", act.r.prefix, act.a.Name, act.pkg.Name, time.Since(now))
+ }(time.Now())
+
+ // Report an error if any dependency failures.
+ var depErr FailedPrerequisitesError
+ for _, dep := range act.deps {
+ if dep.err == nil {
+ continue
+ }
+ depErr.Consume(dep.String(), dep.err)
+ }
+ if depErr.NotEmpty() {
+ act.err = depErr
+ return
+ }
+
+ // Plumb the output values of the dependencies
+ // into the inputs of this action. Also facts.
+ inputs := make(map[*analysis.Analyzer]interface{})
+ startedAt := time.Now()
+ for _, dep := range act.deps {
+ if dep.pkg == act.pkg {
+ // Same package, different analysis (horizontal edge):
+ // in-memory outputs of prerequisite analyzers
+ // become inputs to this analysis pass.
+ inputs[dep.a] = dep.result
+ } else if dep.a == act.a { // (always true)
+ // Same analysis, different package (vertical edge):
+ // serialized facts produced by prerequisite analysis
+ // become available to this analysis pass.
+ inheritFacts(act, dep)
+ }
+ }
+ factsDebugf("%s: Inherited facts in %s", act, time.Since(startedAt))
+
+ // Run the analysis.
+ pass := &analysis.Pass{
+ Analyzer: act.a,
+ Fset: act.pkg.Fset,
+ Files: act.pkg.Syntax,
+ OtherFiles: act.pkg.OtherFiles,
+ Pkg: act.pkg.Types,
+ TypesInfo: act.pkg.TypesInfo,
+ TypesSizes: act.pkg.TypesSizes,
+ ResultOf: inputs,
+ Report: func(d analysis.Diagnostic) { act.diagnostics = append(act.diagnostics, d) },
+ ImportObjectFact: act.importObjectFact,
+ ExportObjectFact: act.exportObjectFact,
+ ImportPackageFact: act.importPackageFact,
+ ExportPackageFact: act.exportPackageFact,
+ AllObjectFacts: act.allObjectFacts,
+ AllPackageFacts: act.allPackageFacts,
+ }
+ act.pass = pass
+ act.r.passToPkgGuard.Lock()
+ act.r.passToPkg[pass] = act.pkg
+ act.r.passToPkgGuard.Unlock()
+
+ var err error
+ if act.pkg.IllTyped {
+ // It looks like there should be !pass.Analyzer.RunDespiteErrors
+ // but govet's cgocall crashes on it. Govet itself contains !pass.Analyzer.RunDespiteErrors condition here
+ // but it exit before it if packages.Load have failed.
+ err = errors.Wrap(&IllTypedError{Pkg: act.pkg}, "analysis skipped")
+ } else {
+ startedAt = time.Now()
+ act.result, err = pass.Analyzer.Run(pass)
+ analyzedIn := time.Since(startedAt)
+ if analyzedIn > time.Millisecond*10 {
+ debugf("%s: run analyzer in %s", act, analyzedIn)
+ }
+ }
+ act.err = err
+
+ // disallow calls after Run
+ pass.ExportObjectFact = nil
+ pass.ExportPackageFact = nil
+
+ if err := act.persistFactsToCache(); err != nil {
+ act.r.log.Warnf("Failed to persist facts to cache: %s", err)
+ }
+}
+
+// inheritFacts populates act.facts with
+// those it obtains from its dependency, dep.
+func inheritFacts(act, dep *action) {
+ serialize := false
+
+ for key, fact := range dep.objectFacts {
+ // Filter out facts related to objects
+ // that are irrelevant downstream
+ // (equivalently: not in the compiler export data).
+ if !exportedFrom(key.obj, dep.pkg.Types) {
+ factsInheritDebugf("%v: discarding %T fact from %s for %s: %s", act, fact, dep, key.obj, fact)
+ continue
+ }
+
+ // Optionally serialize/deserialize fact
+ // to verify that it works across address spaces.
+ if serialize {
+ var err error
+ fact, err = codeFact(fact)
+ if err != nil {
+ act.r.log.Panicf("internal error: encoding of %T fact failed in %v", fact, act)
+ }
+ }
+
+ factsInheritDebugf("%v: inherited %T fact for %s: %s", act, fact, key.obj, fact)
+ act.objectFacts[key] = fact
+ }
+
+ for key, fact := range dep.packageFacts {
+ // TODO: filter out facts that belong to
+ // packages not mentioned in the export data
+ // to prevent side channels.
+
+ // Optionally serialize/deserialize fact
+ // to verify that it works across address spaces
+ // and is deterministic.
+ if serialize {
+ var err error
+ fact, err = codeFact(fact)
+ if err != nil {
+ act.r.log.Panicf("internal error: encoding of %T fact failed in %v", fact, act)
+ }
+ }
+
+ factsInheritDebugf("%v: inherited %T fact for %s: %s", act, fact, key.pkg.Path(), fact)
+ act.packageFacts[key] = fact
+ }
+}
+
+// codeFact encodes then decodes a fact,
+// just to exercise that logic.
+func codeFact(fact analysis.Fact) (analysis.Fact, error) {
+ // We encode facts one at a time.
+ // A real modular driver would emit all facts
+ // into one encoder to improve gob efficiency.
+ var buf bytes.Buffer
+ if err := gob.NewEncoder(&buf).Encode(fact); err != nil {
+ return nil, err
+ }
+
+ // Encode it twice and assert that we get the same bits.
+ // This helps detect nondeterministic Gob encoding (e.g. of maps).
+ var buf2 bytes.Buffer
+ if err := gob.NewEncoder(&buf2).Encode(fact); err != nil {
+ return nil, err
+ }
+ if !bytes.Equal(buf.Bytes(), buf2.Bytes()) {
+ return nil, fmt.Errorf("encoding of %T fact is nondeterministic", fact)
+ }
+
+ newFact := reflect.New(reflect.TypeOf(fact).Elem()).Interface().(analysis.Fact)
+ if err := gob.NewDecoder(&buf).Decode(newFact); err != nil {
+ return nil, err
+ }
+ return newFact, nil
+}
+
+// exportedFrom reports whether obj may be visible to a package that imports pkg.
+// This includes not just the exported members of pkg, but also unexported
+// constants, types, fields, and methods, perhaps belonging to oether packages,
+// that find there way into the API.
+// This is an overapproximation of the more accurate approach used by
+// gc export data, which walks the type graph, but it's much simpler.
+//
+// TODO(adonovan): do more accurate filtering by walking the type graph.
+func exportedFrom(obj types.Object, pkg *types.Package) bool {
+ switch obj := obj.(type) {
+ case *types.Func:
+ return obj.Exported() && obj.Pkg() == pkg ||
+ obj.Type().(*types.Signature).Recv() != nil
+ case *types.Var:
+ return obj.Exported() && obj.Pkg() == pkg ||
+ obj.IsField()
+ case *types.TypeName, *types.Const:
+ return true
+ }
+ return false // Nil, Builtin, Label, or PkgName
+}
+
+// importObjectFact implements Pass.ImportObjectFact.
+// Given a non-nil pointer ptr of type *T, where *T satisfies Fact,
+// importObjectFact copies the fact value to *ptr.
+func (act *action) importObjectFact(obj types.Object, ptr analysis.Fact) bool {
+ if obj == nil {
+ panic("nil object")
+ }
+ key := objectFactKey{obj, act.factType(ptr)}
+ if v, ok := act.objectFacts[key]; ok {
+ reflect.ValueOf(ptr).Elem().Set(reflect.ValueOf(v).Elem())
+ return true
+ }
+ return false
+}
+
+// exportObjectFact implements Pass.ExportObjectFact.
+func (act *action) exportObjectFact(obj types.Object, fact analysis.Fact) {
+ if obj.Pkg() != act.pkg.Types {
+ act.r.log.Panicf("internal error: in analysis %s of package %s: Fact.Set(%s, %T): can't set facts on objects belonging another package",
+ act.a, act.pkg, obj, fact)
+ }
+
+ key := objectFactKey{obj, act.factType(fact)}
+ act.objectFacts[key] = fact // clobber any existing entry
+ if isFactsExportDebug {
+ objstr := types.ObjectString(obj, (*types.Package).Name)
+ factsExportDebugf("%s: object %s has fact %s\n",
+ act.pkg.Fset.Position(obj.Pos()), objstr, fact)
+ }
+}
+
+func (act *action) allObjectFacts() []analysis.ObjectFact {
+ out := make([]analysis.ObjectFact, 0, len(act.objectFacts))
+ for key, fact := range act.objectFacts {
+ out = append(out, analysis.ObjectFact{
+ Object: key.obj,
+ Fact: fact,
+ })
+ }
+ return out
+}
+
+// importPackageFact implements Pass.ImportPackageFact.
+// Given a non-nil pointer ptr of type *T, where *T satisfies Fact,
+// fact copies the fact value to *ptr.
+func (act *action) importPackageFact(pkg *types.Package, ptr analysis.Fact) bool {
+ if pkg == nil {
+ panic("nil package")
+ }
+ key := packageFactKey{pkg, act.factType(ptr)}
+ if v, ok := act.packageFacts[key]; ok {
+ reflect.ValueOf(ptr).Elem().Set(reflect.ValueOf(v).Elem())
+ return true
+ }
+ return false
+}
+
+// exportPackageFact implements Pass.ExportPackageFact.
+func (act *action) exportPackageFact(fact analysis.Fact) {
+ key := packageFactKey{act.pass.Pkg, act.factType(fact)}
+ act.packageFacts[key] = fact // clobber any existing entry
+ factsDebugf("%s: package %s has fact %s\n",
+ act.pkg.Fset.Position(act.pass.Files[0].Pos()), act.pass.Pkg.Path(), fact)
+}
+
+func (act *action) allPackageFacts() []analysis.PackageFact {
+ out := make([]analysis.PackageFact, 0, len(act.packageFacts))
+ for key, fact := range act.packageFacts {
+ out = append(out, analysis.PackageFact{
+ Package: key.pkg,
+ Fact: fact,
+ })
+ }
+ return out
+}
+
+func (act *action) factType(fact analysis.Fact) reflect.Type {
+ t := reflect.TypeOf(fact)
+ if t.Kind() != reflect.Ptr {
+ act.r.log.Fatalf("invalid Fact type: got %T, want pointer", t)
+ }
+ return t
+}
+
+type Fact struct {
+ Path string // non-empty only for object facts
+ Fact analysis.Fact
+}
+
+func (act *action) persistFactsToCache() error {
+ analyzer := act.a
+ if len(analyzer.FactTypes) == 0 {
+ return nil
+ }
+
+ // Merge new facts into the package and persist them.
+ var facts []Fact
+ for key, fact := range act.packageFacts {
+ if key.pkg != act.pkg.Types {
+ // The fact is from inherited facts from another package
+ continue
+ }
+ facts = append(facts, Fact{
+ Path: "",
+ Fact: fact,
+ })
+ }
+ for key, fact := range act.objectFacts {
+ obj := key.obj
+ if obj.Pkg() != act.pkg.Types {
+ // The fact is from inherited facts from another package
+ continue
+ }
+
+ path, err := objectpath.For(obj)
+ if err != nil {
+ // The object is not globally addressable
+ continue
+ }
+
+ facts = append(facts, Fact{
+ Path: string(path),
+ Fact: fact,
+ })
+ }
+
+ factsCacheDebugf("Caching %d facts for package %q and analyzer %s", len(facts), act.pkg.Name, act.a.Name)
+
+ key := fmt.Sprintf("%s/facts", analyzer.Name)
+ return act.r.pkgCache.Put(act.pkg, pkgcache.HashModeNeedAllDeps, key, facts)
+}
+
+func (act *action) loadPersistedFacts() bool {
+ var facts []Fact
+ key := fmt.Sprintf("%s/facts", act.a.Name)
+ if err := act.r.pkgCache.Get(act.pkg, pkgcache.HashModeNeedAllDeps, key, &facts); err != nil {
+ if err != pkgcache.ErrMissing {
+ act.r.log.Warnf("Failed to get persisted facts: %s", err)
+ }
+
+ factsCacheDebugf("No cached facts for package %q and analyzer %s", act.pkg.Name, act.a.Name)
+ return false
+ }
+
+ factsCacheDebugf("Loaded %d cached facts for package %q and analyzer %s", len(facts), act.pkg.Name, act.a.Name)
+
+ for _, f := range facts {
+ if f.Path == "" { // this is a package fact
+ key := packageFactKey{act.pkg.Types, act.factType(f.Fact)}
+ act.packageFacts[key] = f.Fact
+ continue
+ }
+ obj, err := objectpath.Object(act.pkg.Types, objectpath.Path(f.Path))
+ if err != nil {
+ // Be lenient about these errors. For example, when
+ // analyzing io/ioutil from source, we may get a fact
+ // for methods on the devNull type, and objectpath
+ // will happily create a path for them. However, when
+ // we later load io/ioutil from export data, the path
+ // no longer resolves.
+ //
+ // If an exported type embeds the unexported type,
+ // then (part of) the unexported type will become part
+ // of the type information and our path will resolve
+ // again.
+ continue
+ }
+ factKey := objectFactKey{obj, act.factType(f.Fact)}
+ act.objectFacts[factKey] = f.Fact
+ }
+
+ return true
+}
+
+type loadingPackage struct {
+ pkg *packages.Package
+ imports map[string]*loadingPackage
+ isInitial bool
+ log logutils.Log
+ actions []*action // all actions with this package
+ loadGuard *load.Guard
+ dependents int32 // number of depending on it packages
+ analyzeOnce sync.Once
+ decUseMutex sync.Mutex
+}
+
+func (lp *loadingPackage) String() string {
+ return fmt.Sprintf("%s@%s", lp.pkg.PkgPath, lp.pkg.Name)
+}
+
+func sizeOfValueTreeBytes(v interface{}) int {
+ return sizeOfReflectValueTreeBytes(reflect.ValueOf(v), map[uintptr]struct{}{})
+}
+
+func sizeOfReflectValueTreeBytes(rv reflect.Value, visitedPtrs map[uintptr]struct{}) int {
+ switch rv.Kind() {
+ case reflect.Ptr:
+ ptrSize := int(rv.Type().Size())
+ if rv.IsNil() {
+ return ptrSize
+ }
+ ptr := rv.Pointer()
+ if _, ok := visitedPtrs[ptr]; ok {
+ return 0
+ }
+ visitedPtrs[ptr] = struct{}{}
+ return ptrSize + sizeOfReflectValueTreeBytes(rv.Elem(), visitedPtrs)
+ case reflect.Interface:
+ if rv.IsNil() {
+ return 0
+ }
+ return sizeOfReflectValueTreeBytes(rv.Elem(), visitedPtrs)
+ case reflect.Struct:
+ ret := 0
+ for i := 0; i < rv.NumField(); i++ {
+ ret += sizeOfReflectValueTreeBytes(rv.Field(i), visitedPtrs)
+ }
+ return ret
+ case reflect.Slice, reflect.Array, reflect.Chan:
+ return int(rv.Type().Size()) + rv.Cap()*int(rv.Type().Elem().Size())
+ case reflect.Map:
+ ret := 0
+ for _, key := range rv.MapKeys() {
+ mv := rv.MapIndex(key)
+ ret += sizeOfReflectValueTreeBytes(key, visitedPtrs)
+ ret += sizeOfReflectValueTreeBytes(mv, visitedPtrs)
+ }
+ return ret
+ case reflect.String:
+ return rv.Len()
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
+ reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
+ reflect.Uintptr, reflect.Bool, reflect.Float32, reflect.Float64, reflect.UnsafePointer:
+ return int(rv.Type().Size())
+ case reflect.Invalid:
+ return 0
+ default:
+ panic("unknown rv of type " + fmt.Sprint(rv))
+ }
+}
+
+func (lp *loadingPackage) decUse(canClearTypes bool) {
+ lp.decUseMutex.Lock()
+ defer lp.decUseMutex.Unlock()
+
+ for _, act := range lp.actions {
+ pass := act.pass
+ if pass == nil {
+ continue
+ }
+
+ pass.Files = nil
+ pass.TypesInfo = nil
+ pass.TypesSizes = nil
+ pass.ResultOf = nil
+ pass.Pkg = nil
+ pass.OtherFiles = nil
+ pass.AllObjectFacts = nil
+ pass.AllPackageFacts = nil
+ pass.ImportObjectFact = nil
+ pass.ExportObjectFact = nil
+ pass.ImportPackageFact = nil
+ pass.ExportPackageFact = nil
+ act.pass = nil
+ act.deps = nil
+ if act.result != nil {
+ if isMemoryDebug {
+ debugf("%s: decUse: nilling act result of size %d bytes", act, sizeOfValueTreeBytes(act.result))
+ }
+ act.result = nil
+ }
+ }
+
+ lp.pkg.Syntax = nil
+ lp.pkg.TypesInfo = nil
+ lp.pkg.TypesSizes = nil
+
+ // Can't set lp.pkg.Imports to nil because of loadFromExportData.visit.
+
+ dependents := atomic.AddInt32(&lp.dependents, -1)
+ if dependents != 0 {
+ return
+ }
+
+ if canClearTypes {
+ // canClearTypes is set to true if we can discard type
+ // information after the package and its dependents have been
+ // processed. This is the case when no whole program checkers (unused) are
+ // being run.
+ lp.pkg.Types = nil
+ }
+ lp.pkg = nil
+
+ for _, imp := range lp.imports {
+ imp.decUse(canClearTypes)
+ }
+ lp.imports = nil
+
+ for _, act := range lp.actions {
+ if !lp.isInitial {
+ act.pkg = nil
+ }
+ act.packageFacts = nil
+ act.objectFacts = nil
+ }
+ lp.actions = nil
+}
+
+func (lp *loadingPackage) analyzeRecursive(loadMode LoadMode, loadSem chan struct{}) {
+ lp.analyzeOnce.Do(func() {
+ // Load the direct dependencies, in parallel.
+ var wg sync.WaitGroup
+ wg.Add(len(lp.imports))
+ for _, imp := range lp.imports {
+ go func(imp *loadingPackage) {
+ imp.analyzeRecursive(loadMode, loadSem)
+ wg.Done()
+ }(imp)
+ }
+ wg.Wait()
+ lp.analyze(loadMode, loadSem)
+ })
+}
+
+func (lp *loadingPackage) analyze(loadMode LoadMode, loadSem chan struct{}) {
+ loadSem <- struct{}{}
+ defer func() {
+ <-loadSem
+ }()
+
+ // Save memory on unused more fields.
+ defer lp.decUse(loadMode < LoadModeWholeProgram)
+
+ if err := lp.loadWithFacts(loadMode); err != nil {
+ werr := errors.Wrapf(err, "failed to load package %s", lp.pkg.Name)
+ // Don't need to write error to errCh, it will be extracted and reported on another layer.
+ // Unblock depending actions and propagate error.
+ for _, act := range lp.actions {
+ close(act.analysisDoneCh)
+ act.err = werr
+ }
+ return
+ }
+
+ var actsWg sync.WaitGroup
+ actsWg.Add(len(lp.actions))
+ for _, act := range lp.actions {
+ go func(act *action) {
+ defer actsWg.Done()
+
+ act.waitUntilDependingAnalyzersWorked()
+
+ act.analyzeSafe()
+ }(act)
+ }
+ actsWg.Wait()
+}
+
+func (lp *loadingPackage) loadFromSource(loadMode LoadMode) error {
+ pkg := lp.pkg
+
+ // Many packages have few files, much fewer than there
+ // are CPU cores. Additionally, parsing each individual file is
+ // very fast. A naive parallel implementation of this loop won't
+ // be faster, and tends to be slower due to extra scheduling,
+ // bookkeeping and potentially false sharing of cache lines.
+ pkg.Syntax = make([]*ast.File, 0, len(pkg.CompiledGoFiles))
+ for _, file := range pkg.CompiledGoFiles {
+ f, err := parser.ParseFile(pkg.Fset, file, nil, parser.ParseComments)
+ if err != nil {
+ pkg.Errors = append(pkg.Errors, lp.convertError(err)...)
+ continue
+ }
+ pkg.Syntax = append(pkg.Syntax, f)
+ }
+ if len(pkg.Errors) != 0 {
+ pkg.IllTyped = true
+ return nil
+ }
+
+ if loadMode == LoadModeSyntax {
+ return nil
+ }
+
+ // Call NewPackage directly with explicit name.
+ // This avoids skew between golist and go/types when the files'
+ // package declarations are inconsistent.
+ // Subtle: we populate all Types fields with an empty Package
+ // before loading export data so that export data processing
+ // never has to create a types.Package for an indirect dependency,
+ // which would then require that such created packages be explicitly
+ // inserted back into the Import graph as a final step after export data loading.
+ pkg.Types = types.NewPackage(pkg.PkgPath, pkg.Name)
+
+ pkg.IllTyped = true
+
+ pkg.TypesInfo = &types.Info{
+ Types: make(map[ast.Expr]types.TypeAndValue),
+ Defs: make(map[*ast.Ident]types.Object),
+ Uses: make(map[*ast.Ident]types.Object),
+ Implicits: make(map[ast.Node]types.Object),
+ Scopes: make(map[ast.Node]*types.Scope),
+ Selections: make(map[*ast.SelectorExpr]*types.Selection),
+ }
+
+ importer := func(path string) (*types.Package, error) {
+ if path == unsafePkgName {
+ return types.Unsafe, nil
+ }
+ if path == "C" {
+ // go/packages doesn't tell us that cgo preprocessing
+ // failed. When we subsequently try to parse the package,
+ // we'll encounter the raw C import.
+ return nil, errors.New("cgo preprocessing failed")
+ }
+ imp := pkg.Imports[path]
+ if imp == nil {
+ return nil, nil
+ }
+ if len(imp.Errors) > 0 {
+ return nil, imp.Errors[0]
+ }
+ return imp.Types, nil
+ }
+ tc := &types.Config{
+ Importer: importerFunc(importer),
+ Error: func(err error) {
+ pkg.Errors = append(pkg.Errors, lp.convertError(err)...)
+ },
+ }
+ _ = types.NewChecker(tc, pkg.Fset, pkg.Types, pkg.TypesInfo).Files(pkg.Syntax)
+ // Don't handle error here: errors are adding by tc.Error function.
+
+ illTyped := len(pkg.Errors) != 0
+ if !illTyped {
+ for _, imp := range lp.imports {
+ if imp.pkg.IllTyped {
+ illTyped = true
+ break
+ }
+ }
+ }
+ pkg.IllTyped = illTyped
+ return nil
+}
+
+func (lp *loadingPackage) loadFromExportData() error {
+ pkg := lp.pkg
+
+ // Call NewPackage directly with explicit name.
+ // This avoids skew between golist and go/types when the files'
+ // package declarations are inconsistent.
+ // Subtle: we populate all Types fields with an empty Package
+ // before loading export data so that export data processing
+ // never has to create a types.Package for an indirect dependency,
+ // which would then require that such created packages be explicitly
+ // inserted back into the Import graph as a final step after export data loading.
+ pkg.Types = types.NewPackage(pkg.PkgPath, pkg.Name)
+
+ pkg.IllTyped = true
+ for path, pkg := range pkg.Imports {
+ if pkg.Types == nil {
+ return fmt.Errorf("dependency %q hasn't been loaded yet", path)
+ }
+ }
+ if pkg.ExportFile == "" {
+ return fmt.Errorf("no export data for %q", pkg.ID)
+ }
+ f, err := os.Open(pkg.ExportFile)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ r, err := gcexportdata.NewReader(f)
+ if err != nil {
+ return err
+ }
+
+ view := make(map[string]*types.Package) // view seen by gcexportdata
+ seen := make(map[*packages.Package]bool) // all visited packages
+ var visit func(pkgs map[string]*packages.Package)
+ visit = func(pkgs map[string]*packages.Package) {
+ for _, pkg := range pkgs {
+ if !seen[pkg] {
+ seen[pkg] = true
+ view[pkg.PkgPath] = pkg.Types
+ visit(pkg.Imports)
+ }
+ }
+ }
+ visit(pkg.Imports)
+ tpkg, err := gcexportdata.Read(r, pkg.Fset, view, pkg.PkgPath)
+ if err != nil {
+ return err
+ }
+ pkg.Types = tpkg
+ pkg.IllTyped = false
+ return nil
+}
+
+func (act *action) markDepsForAnalyzingSource() {
+ // Horizontal deps (analyzer.Requires) must be loaded from source and analyzed before analyzing
+ // this action.
+ for _, dep := range act.deps {
+ if dep.pkg == act.pkg {
+ // Analyze source only for horizontal dependencies, e.g. from "buildssa".
+ dep.needAnalyzeSource = true // can't be set in parallel
+ }
+ }
+}
+
+func (lp *loadingPackage) loadWithFacts(loadMode LoadMode) error {
+ pkg := lp.pkg
+
+ if pkg.PkgPath == unsafePkgName {
+ // Fill in the blanks to avoid surprises.
+ pkg.Syntax = []*ast.File{}
+ if loadMode >= LoadModeTypesInfo {
+ pkg.Types = types.Unsafe
+ pkg.TypesInfo = new(types.Info)
+ }
+ return nil
+ }
+
+ if pkg.TypesInfo != nil {
+ // Already loaded package, e.g. because another not go/analysis linter required types for deps.
+ // Try load cached facts for it.
+
+ for _, act := range lp.actions {
+ if !act.loadCachedFacts() {
+ // Cached facts loading failed: analyze later the action from source.
+ act.needAnalyzeSource = true
+ factsCacheDebugf("Loading of facts for already loaded %s failed, analyze it from source later", act)
+ act.markDepsForAnalyzingSource()
+ }
+ }
+ return nil
+ }
+
+ if lp.isInitial {
+ // No need to load cached facts: the package will be analyzed from source
+ // because it's the initial.
+ return lp.loadFromSource(loadMode)
+ }
+
+ return lp.loadImportedPackageWithFacts(loadMode)
+}
+
+func (lp *loadingPackage) loadImportedPackageWithFacts(loadMode LoadMode) error {
+ pkg := lp.pkg
+
+ // Load package from export data
+ if loadMode >= LoadModeTypesInfo {
+ if err := lp.loadFromExportData(); err != nil {
+ // We asked Go to give us up to date export data, yet
+ // we can't load it. There must be something wrong.
+ //
+ // Attempt loading from source. This should fail (because
+ // otherwise there would be export data); we just want to
+ // get the compile errors. If loading from source succeeds
+ // we discard the result, anyway. Otherwise we'll fail
+ // when trying to reload from export data later.
+
+ // Otherwise it panics because uses already existing (from exported data) types.
+ pkg.Types = types.NewPackage(pkg.PkgPath, pkg.Name)
+ if srcErr := lp.loadFromSource(loadMode); srcErr != nil {
+ return srcErr
+ }
+ // Make sure this package can't be imported successfully
+ pkg.Errors = append(pkg.Errors, packages.Error{
+ Pos: "-",
+ Msg: fmt.Sprintf("could not load export data: %s", err),
+ Kind: packages.ParseError,
+ })
+ return errors.Wrap(err, "could not load export data")
+ }
+ }
+
+ needLoadFromSource := false
+ for _, act := range lp.actions {
+ if act.loadCachedFacts() {
+ continue
+ }
+
+ // Cached facts loading failed: analyze later the action from source.
+ factsCacheDebugf("Loading of facts for %s failed, analyze it from source later", act)
+ act.needAnalyzeSource = true // can't be set in parallel
+ needLoadFromSource = true
+
+ act.markDepsForAnalyzingSource()
+ }
+
+ if needLoadFromSource {
+ // Cached facts loading failed: analyze later the action from source. To perform
+ // the analysis we need to load the package from source code.
+
+ // Otherwise it panics because uses already existing (from exported data) types.
+ if loadMode >= LoadModeTypesInfo {
+ pkg.Types = types.NewPackage(pkg.PkgPath, pkg.Name)
+ }
+ return lp.loadFromSource(loadMode)
+ }
+
+ return nil
+}
+
+func (lp *loadingPackage) convertError(err error) []packages.Error {
+ var errs []packages.Error
+ // taken from go/packages
+ switch err := err.(type) {
+ case packages.Error:
+ // from driver
+ errs = append(errs, err)
+
+ case *os.PathError:
+ // from parser
+ errs = append(errs, packages.Error{
+ Pos: err.Path + ":1",
+ Msg: err.Err.Error(),
+ Kind: packages.ParseError,
+ })
+
+ case scanner.ErrorList:
+ // from parser
+ for _, err := range err {
+ errs = append(errs, packages.Error{
+ Pos: err.Pos.String(),
+ Msg: err.Msg,
+ Kind: packages.ParseError,
+ })
+ }
+
+ case types.Error:
+ // from type checker
+ errs = append(errs, packages.Error{
+ Pos: err.Fset.Position(err.Pos).String(),
+ Msg: err.Msg,
+ Kind: packages.TypeError,
+ })
+
+ default:
+ // unexpected impoverished error from parser?
+ errs = append(errs, packages.Error{
+ Pos: "-",
+ Msg: err.Error(),
+ Kind: packages.UnknownError,
+ })
+
+ // If you see this error message, please file a bug.
+ lp.log.Warnf("Internal error: error %q (%T) without position", err, err)
+ }
+ return errs
+}
+
+type importerFunc func(path string) (*types.Package, error)
+
+func (f importerFunc) Import(path string) (*types.Package, error) { return f(path) }
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecknoglobals.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecknoglobals.go
new file mode 100644
index 000000000..f2166416b
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecknoglobals.go
@@ -0,0 +1,100 @@
+package golinters
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "strings"
+ "sync"
+
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const gochecknoglobalsName = "gochecknoglobals"
+
+//nolint:dupl
+func NewGochecknoglobals() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: gochecknoglobalsName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ Run: func(pass *analysis.Pass) (interface{}, error) {
+ var res []goanalysis.Issue
+ for _, file := range pass.Files {
+ fileIssues := checkFileForGlobals(file, pass.Fset)
+ for i := range fileIssues {
+ res = append(res, goanalysis.NewIssue(&fileIssues[i], pass))
+ }
+ }
+ if len(res) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ },
+ }
+ return goanalysis.NewLinter(
+ gochecknoglobalsName,
+ "Checks that no globals are present in Go code",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
+
+func checkFileForGlobals(f *ast.File, fset *token.FileSet) []result.Issue {
+ var res []result.Issue
+ for _, decl := range f.Decls {
+ genDecl, ok := decl.(*ast.GenDecl)
+ if !ok {
+ continue
+ }
+ if genDecl.Tok != token.VAR {
+ continue
+ }
+
+ for _, spec := range genDecl.Specs {
+ valueSpec := spec.(*ast.ValueSpec)
+ for _, vn := range valueSpec.Names {
+ if isWhitelisted(vn) {
+ continue
+ }
+
+ res = append(res, result.Issue{
+ Pos: fset.Position(vn.Pos()),
+ Text: fmt.Sprintf("%s is a global variable", formatCode(vn.Name, nil)),
+ FromLinter: gochecknoglobalsName,
+ })
+ }
+ }
+ }
+
+ return res
+}
+
+func isWhitelisted(i *ast.Ident) bool {
+ return i.Name == "_" || i.Name == "version" || looksLikeError(i)
+}
+
+// looksLikeError returns true if the AST identifier starts
+// with 'err' or 'Err', or false otherwise.
+//
+// TODO: https://github.com/leighmcculloch/gochecknoglobals/issues/5
+func looksLikeError(i *ast.Ident) bool {
+ prefix := "err"
+ if i.IsExported() {
+ prefix = "Err"
+ }
+ return strings.HasPrefix(i.Name, prefix)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecknoinits.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecknoinits.go
new file mode 100644
index 000000000..18465b130
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecknoinits.go
@@ -0,0 +1,74 @@
+package golinters
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "sync"
+
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const gochecknoinitsName = "gochecknoinits"
+
+//nolint:dupl
+func NewGochecknoinits() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: gochecknoinitsName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ Run: func(pass *analysis.Pass) (interface{}, error) {
+ var res []goanalysis.Issue
+ for _, file := range pass.Files {
+ fileIssues := checkFileForInits(file, pass.Fset)
+ for i := range fileIssues {
+ res = append(res, goanalysis.NewIssue(&fileIssues[i], pass))
+ }
+ }
+ if len(res) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ },
+ }
+ return goanalysis.NewLinter(
+ gochecknoinitsName,
+ "Checks that no init functions are present in Go code",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
+
+func checkFileForInits(f *ast.File, fset *token.FileSet) []result.Issue {
+ var res []result.Issue
+ for _, decl := range f.Decls {
+ funcDecl, ok := decl.(*ast.FuncDecl)
+ if !ok {
+ continue
+ }
+
+ name := funcDecl.Name.Name
+ if name == "init" && funcDecl.Recv.NumFields() == 0 {
+ res = append(res, result.Issue{
+ Pos: fset.Position(funcDecl.Pos()),
+ Text: fmt.Sprintf("don't use %s function", formatCode(name, nil)),
+ FromLinter: gochecknoinitsName,
+ })
+ }
+ }
+
+ return res
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/gocognit.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gocognit.go
new file mode 100644
index 000000000..78afff86c
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gocognit.go
@@ -0,0 +1,69 @@
+// nolint:dupl
+package golinters
+
+import (
+ "fmt"
+ "sort"
+ "sync"
+
+ "github.com/uudashr/gocognit"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const gocognitName = "gocognit"
+
+func NewGocognit() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: goanalysis.TheOnlyAnalyzerName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ gocognitName,
+ "Computes and checks the cognitive complexity of functions",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var stats []gocognit.Stat
+ for _, f := range pass.Files {
+ stats = gocognit.ComplexityStats(f, pass.Fset, stats)
+ }
+ if len(stats) == 0 {
+ return nil, nil
+ }
+
+ sort.SliceStable(stats, func(i, j int) bool {
+ return stats[i].Complexity > stats[j].Complexity
+ })
+
+ res := make([]goanalysis.Issue, 0, len(stats))
+ for _, s := range stats {
+ if s.Complexity <= lintCtx.Settings().Gocognit.MinComplexity {
+ break // Break as the stats is already sorted from greatest to least
+ }
+
+ res = append(res, goanalysis.NewIssue(&result.Issue{
+ Pos: s.Pos,
+ Text: fmt.Sprintf("cognitive complexity %d of func %s is high (> %d)",
+ s.Complexity, formatCode(s.FuncName, lintCtx.Cfg), lintCtx.Settings().Gocognit.MinComplexity),
+ FromLinter: gocognitName,
+ }, pass))
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/goconst.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goconst.go
new file mode 100644
index 000000000..8e91feef8
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goconst.go
@@ -0,0 +1,81 @@
+package golinters
+
+import (
+ "fmt"
+ "sync"
+
+ goconstAPI "github.com/golangci/goconst"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const goconstName = "goconst"
+
+func NewGoconst() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: goconstName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ goconstName,
+ "Finds repeated strings that could be replaced by a constant",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ issues, err := checkConstants(pass, lintCtx)
+ if err != nil || len(issues) == 0 {
+ return nil, err
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, issues...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
+
+func checkConstants(pass *analysis.Pass, lintCtx *linter.Context) ([]goanalysis.Issue, error) {
+ cfg := goconstAPI.Config{
+ MatchWithConstants: true,
+ MinStringLength: lintCtx.Settings().Goconst.MinStringLen,
+ MinOccurrences: lintCtx.Settings().Goconst.MinOccurrencesCount,
+ }
+
+ goconstIssues, err := goconstAPI.Run(pass.Files, pass.Fset, &cfg)
+ if err != nil {
+ return nil, err
+ }
+
+ if len(goconstIssues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]goanalysis.Issue, 0, len(goconstIssues))
+ for _, i := range goconstIssues {
+ textBegin := fmt.Sprintf("string %s has %d occurrences", formatCode(i.Str, lintCtx.Cfg), i.OccurencesCount)
+ var textEnd string
+ if i.MatchingConst == "" {
+ textEnd = ", make it a constant"
+ } else {
+ textEnd = fmt.Sprintf(", but such constant %s already exists", formatCode(i.MatchingConst, lintCtx.Cfg))
+ }
+ res = append(res, goanalysis.NewIssue(&result.Issue{
+ Pos: i.Pos,
+ Text: textBegin + textEnd,
+ FromLinter: goconstName,
+ }, pass))
+ }
+
+ return res, nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/gocritic.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gocritic.go
new file mode 100644
index 000000000..fb2925209
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gocritic.go
@@ -0,0 +1,162 @@
+package golinters
+
+import (
+ "fmt"
+ "go/ast"
+ "go/types"
+ "path/filepath"
+ "runtime"
+ "sort"
+ "strings"
+ "sync"
+
+ "github.com/go-lintpack/lintpack"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const gocriticName = "gocritic"
+
+func NewGocritic() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ sizes := types.SizesFor("gc", runtime.GOARCH)
+
+ analyzer := &analysis.Analyzer{
+ Name: gocriticName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ gocriticName,
+ "The most opinionated Go source code linter",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ lintpackCtx := lintpack.NewContext(pass.Fset, sizes)
+ enabledCheckers, err := buildEnabledCheckers(lintCtx, lintpackCtx)
+ if err != nil {
+ return nil, err
+ }
+
+ lintpackCtx.SetPackageInfo(pass.TypesInfo, pass.Pkg)
+ var res []goanalysis.Issue
+ pkgIssues := runGocriticOnPackage(lintpackCtx, enabledCheckers, pass.Files)
+ for i := range pkgIssues {
+ res = append(res, goanalysis.NewIssue(&pkgIssues[i], pass))
+ }
+ if len(res) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
+
+func normalizeCheckerInfoParams(info *lintpack.CheckerInfo) lintpack.CheckerParams {
+ // lowercase info param keys here because golangci-lint's config parser lowercases all strings
+ ret := lintpack.CheckerParams{}
+ for k, v := range info.Params {
+ ret[strings.ToLower(k)] = v
+ }
+
+ return ret
+}
+
+func configureCheckerInfo(info *lintpack.CheckerInfo, allParams map[string]config.GocriticCheckSettings) error {
+ params := allParams[strings.ToLower(info.Name)]
+ if params == nil { // no config for this checker
+ return nil
+ }
+
+ infoParams := normalizeCheckerInfoParams(info)
+ for k, p := range params {
+ v, ok := infoParams[k]
+ if ok {
+ v.Value = p
+ continue
+ }
+
+ // param `k` isn't supported
+ if len(info.Params) == 0 {
+ return fmt.Errorf("checker %s config param %s doesn't exist: checker doesn't have params",
+ info.Name, k)
+ }
+
+ var supportedKeys []string
+ for sk := range info.Params {
+ supportedKeys = append(supportedKeys, sk)
+ }
+ sort.Strings(supportedKeys)
+
+ return fmt.Errorf("checker %s config param %s doesn't exist, all existing: %s",
+ info.Name, k, supportedKeys)
+ }
+
+ return nil
+}
+
+func buildEnabledCheckers(lintCtx *linter.Context, lintpackCtx *lintpack.Context) ([]*lintpack.Checker, error) {
+ s := lintCtx.Settings().Gocritic
+ allParams := s.GetLowercasedParams()
+
+ var enabledCheckers []*lintpack.Checker
+ for _, info := range lintpack.GetCheckersInfo() {
+ if !s.IsCheckEnabled(info.Name) {
+ continue
+ }
+
+ if err := configureCheckerInfo(info, allParams); err != nil {
+ return nil, err
+ }
+
+ c := lintpack.NewChecker(lintpackCtx, info)
+ enabledCheckers = append(enabledCheckers, c)
+ }
+
+ return enabledCheckers, nil
+}
+
+func runGocriticOnPackage(lintpackCtx *lintpack.Context, checkers []*lintpack.Checker,
+ files []*ast.File) []result.Issue {
+ var res []result.Issue
+ for _, f := range files {
+ filename := filepath.Base(lintpackCtx.FileSet.Position(f.Pos()).Filename)
+ lintpackCtx.SetFileInfo(filename, f)
+
+ issues := runGocriticOnFile(lintpackCtx, f, checkers)
+ res = append(res, issues...)
+ }
+ return res
+}
+
+func runGocriticOnFile(ctx *lintpack.Context, f *ast.File, checkers []*lintpack.Checker) []result.Issue {
+ var res []result.Issue
+
+ for _, c := range checkers {
+ // All checkers are expected to use *lint.Context
+ // as read-only structure, so no copying is required.
+ for _, warn := range c.Check(f) {
+ pos := ctx.FileSet.Position(warn.Node.Pos())
+ res = append(res, result.Issue{
+ Pos: pos,
+ Text: fmt.Sprintf("%s: %s", c.Info.Name, warn.Text),
+ FromLinter: gocriticName,
+ })
+ }
+ }
+
+ return res
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/gocyclo.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gocyclo.go
new file mode 100644
index 000000000..55f13fcfe
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gocyclo.go
@@ -0,0 +1,69 @@
+// nolint:dupl
+package golinters
+
+import (
+ "fmt"
+ "sort"
+ "sync"
+
+ gocycloAPI "github.com/golangci/gocyclo/pkg/gocyclo"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const gocycloName = "gocyclo"
+
+func NewGocyclo() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: gocycloName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ gocycloName,
+ "Computes and checks the cyclomatic complexity of functions",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var stats []gocycloAPI.Stat
+ for _, f := range pass.Files {
+ stats = gocycloAPI.BuildStats(f, pass.Fset, stats)
+ }
+ if len(stats) == 0 {
+ return nil, nil
+ }
+
+ sort.SliceStable(stats, func(i, j int) bool {
+ return stats[i].Complexity > stats[j].Complexity
+ })
+
+ res := make([]goanalysis.Issue, 0, len(stats))
+ for _, s := range stats {
+ if s.Complexity <= lintCtx.Settings().Gocyclo.MinComplexity {
+ break // Break as the stats is already sorted from greatest to least
+ }
+
+ res = append(res, goanalysis.NewIssue(&result.Issue{
+ Pos: s.Pos,
+ Text: fmt.Sprintf("cyclomatic complexity %d of func %s is high (> %d)",
+ s.Complexity, formatCode(s.FuncName, lintCtx.Cfg), lintCtx.Settings().Gocyclo.MinComplexity),
+ FromLinter: gocycloName,
+ }, pass))
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/godot.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/godot.go
new file mode 100644
index 000000000..7e5b233a6
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/godot.go
@@ -0,0 +1,63 @@
+package golinters
+
+import (
+ "sync"
+
+ "github.com/tetafro/godot"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const godotName = "godot"
+
+func NewGodot() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: godotName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ godotName,
+ "Check if comments end in a period",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ cfg := lintCtx.Cfg.LintersSettings.Godot
+ settings := godot.Settings{CheckAll: cfg.CheckAll}
+
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var issues []godot.Message
+ for _, file := range pass.Files {
+ issues = append(issues, godot.Run(file, pass.Fset, settings)...)
+ }
+
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]goanalysis.Issue, len(issues))
+ for k, i := range issues {
+ issue := result.Issue{
+ Pos: i.Pos,
+ Text: i.Message,
+ FromLinter: godotName,
+ }
+
+ res[k] = goanalysis.NewIssue(&issue, pass)
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/godox.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/godox.go
new file mode 100644
index 000000000..2a4dd9faf
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/godox.go
@@ -0,0 +1,63 @@
+package golinters
+
+import (
+ "go/token"
+ "strings"
+ "sync"
+
+ "github.com/matoous/godox"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const godoxName = "godox"
+
+func NewGodox() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: godoxName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ godoxName,
+ "Tool for detection of FIXME, TODO and other comment keywords",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var issues []godox.Message
+ for _, file := range pass.Files {
+ issues = append(issues, godox.Run(file, pass.Fset, lintCtx.Settings().Godox.Keywords...)...)
+ }
+
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]goanalysis.Issue, len(issues))
+ for k, i := range issues {
+ res[k] = goanalysis.NewIssue(&result.Issue{
+ Pos: token.Position{
+ Filename: i.Pos.Filename,
+ Line: i.Pos.Line,
+ },
+ Text: strings.TrimRight(i.Message, "\n"),
+ FromLinter: godoxName,
+ }, pass)
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/goerr113.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goerr113.go
new file mode 100644
index 000000000..0c10005a0
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goerr113.go
@@ -0,0 +1,19 @@
+package golinters
+
+import (
+ "github.com/Djarvur/go-err113"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewGoerr113() *goanalysis.Linter {
+ return goanalysis.NewLinter(
+ "goerr113",
+ "Golang linter to check the errors handling expressions",
+ []*analysis.Analyzer{
+ err113.NewAnalyzer(),
+ },
+ nil,
+ ).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/gofmt.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gofmt.go
new file mode 100644
index 000000000..a7bd88a73
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gofmt.go
@@ -0,0 +1,72 @@
+package golinters
+
+import (
+ "sync"
+
+ gofmtAPI "github.com/golangci/gofmt/gofmt"
+ "github.com/pkg/errors"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+)
+
+const gofmtName = "gofmt"
+
+func NewGofmt() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: gofmtName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ gofmtName,
+ "Gofmt checks whether code was gofmt-ed. By default "+
+ "this tool runs with -s option to check for code simplification",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var fileNames []string
+ for _, f := range pass.Files {
+ pos := pass.Fset.PositionFor(f.Pos(), false)
+ fileNames = append(fileNames, pos.Filename)
+ }
+
+ var issues []goanalysis.Issue
+
+ for _, f := range fileNames {
+ diff, err := gofmtAPI.Run(f, lintCtx.Settings().Gofmt.Simplify)
+ if err != nil { // TODO: skip
+ return nil, err
+ }
+ if diff == nil {
+ continue
+ }
+
+ is, err := extractIssuesFromPatch(string(diff), lintCtx.Log, lintCtx, false)
+ if err != nil {
+ return nil, errors.Wrapf(err, "can't extract issues from gofmt diff output %q", string(diff))
+ }
+
+ for i := range is {
+ issues = append(issues, goanalysis.NewIssue(&is[i], pass))
+ }
+ }
+
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, issues...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/gofmt_common.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gofmt_common.go
new file mode 100644
index 000000000..fb1e3f662
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gofmt_common.go
@@ -0,0 +1,269 @@
+package golinters
+
+import (
+ "bytes"
+ "fmt"
+ "go/token"
+ "strings"
+
+ "github.com/pkg/errors"
+ diffpkg "github.com/sourcegraph/go-diff/diff"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Change struct {
+ LineRange result.Range
+ Replacement result.Replacement
+}
+
+type diffLineType string
+
+const (
+ diffLineAdded diffLineType = "added"
+ diffLineOriginal diffLineType = "original"
+ diffLineDeleted diffLineType = "deleted"
+)
+
+type diffLine struct {
+ originalNumber int // 1-based original line number
+ typ diffLineType
+ data string // "+" or "-" stripped line
+}
+
+type hunkChangesParser struct {
+ // needed because we merge currently added lines with the last original line
+ lastOriginalLine *diffLine
+
+ // if the first line of diff is an adding we save all additions to replacementLinesToPrepend
+ replacementLinesToPrepend []string
+
+ log logutils.Log
+
+ lines []diffLine
+
+ ret []Change
+}
+
+func (p *hunkChangesParser) parseDiffLines(h *diffpkg.Hunk) {
+ lines := bytes.Split(h.Body, []byte{'\n'})
+ currentOriginalLineNumer := int(h.OrigStartLine)
+ var ret []diffLine
+
+ for i, line := range lines {
+ dl := diffLine{
+ originalNumber: currentOriginalLineNumer,
+ }
+
+ lineStr := string(line)
+
+ if strings.HasPrefix(lineStr, "-") {
+ dl.typ = diffLineDeleted
+ dl.data = strings.TrimPrefix(lineStr, "-")
+ currentOriginalLineNumer++
+ } else if strings.HasPrefix(lineStr, "+") {
+ dl.typ = diffLineAdded
+ dl.data = strings.TrimPrefix(lineStr, "+")
+ } else {
+ if i == len(lines)-1 && lineStr == "" {
+ // handle last \n: don't add an empty original line
+ break
+ }
+
+ dl.typ = diffLineOriginal
+ dl.data = strings.TrimPrefix(lineStr, " ")
+ currentOriginalLineNumer++
+ }
+
+ ret = append(ret, dl)
+ }
+
+ p.lines = ret
+}
+
+func (p *hunkChangesParser) handleOriginalLine(line diffLine, i *int) {
+ if len(p.replacementLinesToPrepend) == 0 {
+ p.lastOriginalLine = &line
+ *i++
+ return
+ }
+
+ // check following added lines for the case:
+ // + added line 1
+ // original line
+ // + added line 2
+
+ *i++
+ var followingAddedLines []string
+ for ; *i < len(p.lines) && p.lines[*i].typ == diffLineAdded; *i++ {
+ followingAddedLines = append(followingAddedLines, p.lines[*i].data)
+ }
+
+ p.ret = append(p.ret, Change{
+ LineRange: result.Range{
+ From: line.originalNumber,
+ To: line.originalNumber,
+ },
+ Replacement: result.Replacement{
+ NewLines: append(p.replacementLinesToPrepend, append([]string{line.data}, followingAddedLines...)...),
+ },
+ })
+ p.replacementLinesToPrepend = nil
+ p.lastOriginalLine = &line
+}
+
+func (p *hunkChangesParser) handleDeletedLines(deletedLines []diffLine, addedLines []string) {
+ change := Change{
+ LineRange: result.Range{
+ From: deletedLines[0].originalNumber,
+ To: deletedLines[len(deletedLines)-1].originalNumber,
+ },
+ }
+
+ if len(addedLines) != 0 {
+ //nolint:gocritic
+ change.Replacement.NewLines = append(p.replacementLinesToPrepend, addedLines...)
+ if len(p.replacementLinesToPrepend) != 0 {
+ p.replacementLinesToPrepend = nil
+ }
+
+ p.ret = append(p.ret, change)
+ return
+ }
+
+ // delete-only change with possible prepending
+ if len(p.replacementLinesToPrepend) != 0 {
+ change.Replacement.NewLines = p.replacementLinesToPrepend
+ p.replacementLinesToPrepend = nil
+ } else {
+ change.Replacement.NeedOnlyDelete = true
+ }
+
+ p.ret = append(p.ret, change)
+}
+
+func (p *hunkChangesParser) handleAddedOnlyLines(addedLines []string) {
+ if p.lastOriginalLine == nil {
+ // the first line is added; the diff looks like:
+ // 1. + ...
+ // 2. - ...
+ // or
+ // 1. + ...
+ // 2. ...
+
+ p.replacementLinesToPrepend = addedLines
+ return
+ }
+
+ // add-only change merged into the last original line with possible prepending
+ p.ret = append(p.ret, Change{
+ LineRange: result.Range{
+ From: p.lastOriginalLine.originalNumber,
+ To: p.lastOriginalLine.originalNumber,
+ },
+ Replacement: result.Replacement{
+ NewLines: append(p.replacementLinesToPrepend, append([]string{p.lastOriginalLine.data}, addedLines...)...),
+ },
+ })
+ p.replacementLinesToPrepend = nil
+}
+
+func (p *hunkChangesParser) parse(h *diffpkg.Hunk) []Change {
+ p.parseDiffLines(h)
+
+ for i := 0; i < len(p.lines); {
+ line := p.lines[i]
+ if line.typ == diffLineOriginal {
+ p.handleOriginalLine(line, &i) //nolint:scopelint
+ continue
+ }
+
+ var deletedLines []diffLine
+ for ; i < len(p.lines) && p.lines[i].typ == diffLineDeleted; i++ {
+ deletedLines = append(deletedLines, p.lines[i])
+ }
+
+ var addedLines []string
+ for ; i < len(p.lines) && p.lines[i].typ == diffLineAdded; i++ {
+ addedLines = append(addedLines, p.lines[i].data)
+ }
+
+ if len(deletedLines) != 0 {
+ p.handleDeletedLines(deletedLines, addedLines)
+ continue
+ }
+
+ // no deletions, only additions
+ p.handleAddedOnlyLines(addedLines)
+ }
+
+ if len(p.replacementLinesToPrepend) != 0 {
+ p.log.Infof("The diff contains only additions: no original or deleted lines: %#v", p.lines)
+ return nil
+ }
+
+ return p.ret
+}
+
+func extractIssuesFromPatch(patch string, log logutils.Log, lintCtx *linter.Context, isGoimports bool) ([]result.Issue, error) {
+ diffs, err := diffpkg.ParseMultiFileDiff([]byte(patch))
+ if err != nil {
+ return nil, errors.Wrap(err, "can't parse patch")
+ }
+
+ if len(diffs) == 0 {
+ return nil, fmt.Errorf("got no diffs from patch parser: %v", diffs)
+ }
+
+ issues := []result.Issue{}
+ for _, d := range diffs {
+ if len(d.Hunks) == 0 {
+ log.Warnf("Got no hunks in diff %+v", d)
+ continue
+ }
+
+ for _, hunk := range d.Hunks {
+ var text string
+ if isGoimports {
+ text = "File is not `goimports`-ed"
+ if lintCtx.Settings().Goimports.LocalPrefixes != "" {
+ text += " with -local " + lintCtx.Settings().Goimports.LocalPrefixes
+ }
+ } else {
+ text = "File is not `gofmt`-ed"
+ if lintCtx.Settings().Gofmt.Simplify {
+ text += " with `-s`"
+ }
+ }
+ p := hunkChangesParser{
+ log: log,
+ }
+ changes := p.parse(hunk)
+ for _, change := range changes {
+ change := change // fix scope
+ linterName := gofmtName
+ if isGoimports {
+ linterName = goimportsName
+ }
+ i := result.Issue{
+ FromLinter: linterName,
+ Pos: token.Position{
+ Filename: d.NewName,
+ Line: change.LineRange.From,
+ },
+ Text: text,
+ Replacement: &change.Replacement,
+ }
+ if change.LineRange.From != change.LineRange.To {
+ i.LineRange = &change.LineRange
+ }
+
+ issues = append(issues, i)
+ }
+ }
+ }
+
+ return issues, nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/goimports.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goimports.go
new file mode 100644
index 000000000..97767db8b
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goimports.go
@@ -0,0 +1,73 @@
+package golinters
+
+import (
+ "sync"
+
+ goimportsAPI "github.com/golangci/gofmt/goimports"
+ "github.com/pkg/errors"
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/imports"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+)
+
+const goimportsName = "goimports"
+
+func NewGoimports() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: goimportsName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ goimportsName,
+ "Goimports does everything that gofmt does. Additionally it checks unused imports",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ imports.LocalPrefix = lintCtx.Settings().Goimports.LocalPrefixes
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var fileNames []string
+ for _, f := range pass.Files {
+ pos := pass.Fset.PositionFor(f.Pos(), false)
+ fileNames = append(fileNames, pos.Filename)
+ }
+
+ var issues []goanalysis.Issue
+
+ for _, f := range fileNames {
+ diff, err := goimportsAPI.Run(f)
+ if err != nil { // TODO: skip
+ return nil, err
+ }
+ if diff == nil {
+ continue
+ }
+
+ is, err := extractIssuesFromPatch(string(diff), lintCtx.Log, lintCtx, true)
+ if err != nil {
+ return nil, errors.Wrapf(err, "can't extract issues from gofmt diff output %q", string(diff))
+ }
+
+ for i := range is {
+ issues = append(issues, goanalysis.NewIssue(&is[i], pass))
+ }
+ }
+
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, issues...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/golint.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/golint.go
new file mode 100644
index 000000000..3b1b1b66f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/golint.go
@@ -0,0 +1,78 @@
+package golinters
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+ "sync"
+
+ lintAPI "github.com/golangci/lint-1"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func golintProcessPkg(minConfidence float64, files []*ast.File, fset *token.FileSet,
+ typesPkg *types.Package, typesInfo *types.Info) ([]result.Issue, error) {
+ l := new(lintAPI.Linter)
+ ps, err := l.LintPkg(files, fset, typesPkg, typesInfo)
+ if err != nil {
+ return nil, fmt.Errorf("can't lint %d files: %s", len(files), err)
+ }
+
+ if len(ps) == 0 {
+ return nil, nil
+ }
+
+ issues := make([]result.Issue, 0, len(ps)) // This is worst case
+ for idx := range ps {
+ if ps[idx].Confidence >= minConfidence {
+ issues = append(issues, result.Issue{
+ Pos: ps[idx].Position,
+ Text: ps[idx].Text,
+ FromLinter: golintName,
+ })
+ // TODO: use p.Link and p.Category
+ }
+ }
+
+ return issues, nil
+}
+
+const golintName = "golint"
+
+func NewGolint() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: golintName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ golintName,
+ "Golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ res, err := golintProcessPkg(lintCtx.Settings().Golint.MinConfidence, pass.Files, pass.Fset, pass.Pkg, pass.TypesInfo)
+ if err != nil || len(res) == 0 {
+ return nil, err
+ }
+
+ mu.Lock()
+ for i := range res {
+ resIssues = append(resIssues, goanalysis.NewIssue(&res[i], pass))
+ }
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/gomnd.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gomnd.go
new file mode 100644
index 000000000..0a64f88f8
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gomnd.go
@@ -0,0 +1,27 @@
+package golinters
+
+import (
+ mnd "github.com/tommy-muehle/go-mnd"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewGoMND(cfg *config.Config) *goanalysis.Linter {
+ analyzers := []*analysis.Analyzer{
+ mnd.Analyzer,
+ }
+
+ var linterCfg map[string]map[string]interface{}
+ if cfg != nil {
+ linterCfg = cfg.LintersSettings.Gomnd.Settings
+ }
+
+ return goanalysis.NewLinter(
+ "gomnd",
+ "An analyzer to detect magic numbers.",
+ analyzers,
+ linterCfg,
+ ).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/gomodguard.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gomodguard.go
new file mode 100644
index 000000000..5b1406313
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gomodguard.go
@@ -0,0 +1,88 @@
+package golinters
+
+import (
+ "log"
+ "os"
+ "sync"
+
+ "github.com/ryancurrah/gomodguard"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const (
+ gomodguardName = "gomodguard"
+)
+
+// NewGomodguard returns a new Gomodguard linter.
+func NewGomodguard() *goanalysis.Linter {
+ var (
+ issues []goanalysis.Issue
+ mu = sync.Mutex{}
+ analyzer = &analysis.Analyzer{
+ Name: goanalysis.TheOnlyAnalyzerName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ )
+
+ return goanalysis.NewLinter(
+ gomodguardName,
+ "Allow and block list linter for direct Go module dependencies.",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var (
+ files = []string{}
+ linterCfg = lintCtx.Cfg.LintersSettings.Gomodguard
+ processorCfg = gomodguard.Configuration{}
+ )
+ processorCfg.Allowed.Modules = linterCfg.Allowed.Modules
+ processorCfg.Allowed.Domains = linterCfg.Allowed.Domains
+ for n := range linterCfg.Blocked.Modules {
+ for k, v := range linterCfg.Blocked.Modules[n] {
+ m := gomodguard.BlockedModule{k: gomodguard.Recommendations{
+ Recommendations: v.Recommendations,
+ Reason: v.Reason,
+ }}
+ processorCfg.Blocked.Modules = append(processorCfg.Blocked.Modules, m)
+ break
+ }
+ }
+
+ for _, file := range pass.Files {
+ files = append(files, pass.Fset.PositionFor(file.Pos(), false).Filename)
+ }
+
+ processor, err := gomodguard.NewProcessor(processorCfg, log.New(os.Stderr, "", 0))
+ if err != nil {
+ lintCtx.Log.Warnf("running gomodguard failed: %s: if you are not using go modules "+
+ "it is suggested to disable this linter", err)
+ return nil, nil
+ }
+
+ gomodguardErrors := processor.ProcessFiles(files)
+ if len(gomodguardErrors) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ defer mu.Unlock()
+
+ for _, err := range gomodguardErrors {
+ issues = append(issues, goanalysis.NewIssue(&result.Issue{
+ FromLinter: gomodguardName,
+ Pos: err.Position,
+ Text: err.Reason,
+ }, pass))
+ }
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return issues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/goprintffuncname.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goprintffuncname.go
new file mode 100644
index 000000000..c5516dc7f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goprintffuncname.go
@@ -0,0 +1,17 @@
+package golinters
+
+import (
+ "github.com/jirfag/go-printf-func-name/pkg/analyzer"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewGoPrintfFuncName() *goanalysis.Linter {
+ return goanalysis.NewLinter(
+ "goprintffuncname",
+ "Checks that printf-like functions are named with `f` at the end",
+ []*analysis.Analyzer{analyzer.Analyzer},
+ nil,
+ ).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/gosec.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gosec.go
new file mode 100644
index 000000000..08b3e660f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gosec.go
@@ -0,0 +1,97 @@
+package golinters
+
+import (
+ "fmt"
+ "go/token"
+ "io/ioutil"
+ "log"
+ "strconv"
+ "sync"
+
+ "github.com/securego/gosec/v2"
+ "github.com/securego/gosec/v2/rules"
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/packages"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const gosecName = "gosec"
+
+func NewGosec() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ gasConfig := gosec.NewConfig()
+ enabledRules := rules.Generate()
+ logger := log.New(ioutil.Discard, "", 0)
+
+ analyzer := &analysis.Analyzer{
+ Name: gosecName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ gosecName,
+ "Inspects source code for security problems",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ gosecAnalyzer := gosec.NewAnalyzer(gasConfig, true, logger)
+ gosecAnalyzer.LoadRules(enabledRules.Builders())
+ pkg := &packages.Package{
+ Fset: pass.Fset,
+ Syntax: pass.Files,
+ Types: pass.Pkg,
+ TypesInfo: pass.TypesInfo,
+ }
+ gosecAnalyzer.Check(pkg)
+ issues, _, _ := gosecAnalyzer.Report()
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]goanalysis.Issue, 0, len(issues))
+ for _, i := range issues {
+ text := fmt.Sprintf("%s: %s", i.RuleID, i.What) // TODO: use severity and confidence
+ var r *result.Range
+ line, err := strconv.Atoi(i.Line)
+ if err != nil {
+ r = &result.Range{}
+ if n, rerr := fmt.Sscanf(i.Line, "%d-%d", &r.From, &r.To); rerr != nil || n != 2 {
+ lintCtx.Log.Warnf("Can't convert gosec line number %q of %v to int: %s", i.Line, i, err)
+ continue
+ }
+ line = r.From
+ }
+
+ column, err := strconv.Atoi(i.Col)
+ if err != nil {
+ lintCtx.Log.Warnf("Can't convert gosec column number %q of %v to int: %s", i.Col, i, err)
+ continue
+ }
+
+ res = append(res, goanalysis.NewIssue(&result.Issue{
+ Pos: token.Position{
+ Filename: i.File,
+ Line: line,
+ Column: column,
+ },
+ Text: text,
+ LineRange: r,
+ FromLinter: gosecName,
+ }, pass))
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/gosimple.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gosimple.go
new file mode 100644
index 000000000..788fc8c63
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gosimple.go
@@ -0,0 +1,19 @@
+package golinters
+
+import (
+ "honnef.co/go/tools/simple"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewGosimple() *goanalysis.Linter {
+ analyzers := analyzersMapToSlice(simple.Analyzers)
+ setAnalyzersGoVersion(analyzers)
+
+ return goanalysis.NewLinter(
+ "gosimple",
+ "Linter for Go source code that specializes in simplifying a code",
+ analyzers,
+ nil,
+ ).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/govet.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/govet.go
new file mode 100644
index 000000000..7ea1f094e
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/govet.go
@@ -0,0 +1,165 @@
+package golinters
+
+import (
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/passes/asmdecl"
+ "golang.org/x/tools/go/analysis/passes/assign"
+ "golang.org/x/tools/go/analysis/passes/atomic"
+ "golang.org/x/tools/go/analysis/passes/atomicalign"
+ "golang.org/x/tools/go/analysis/passes/bools"
+ _ "golang.org/x/tools/go/analysis/passes/buildssa" // unused, internal analyzer
+ "golang.org/x/tools/go/analysis/passes/buildtag"
+ "golang.org/x/tools/go/analysis/passes/cgocall"
+ "golang.org/x/tools/go/analysis/passes/composite"
+ "golang.org/x/tools/go/analysis/passes/copylock"
+ _ "golang.org/x/tools/go/analysis/passes/ctrlflow" // unused, internal analyzer
+ "golang.org/x/tools/go/analysis/passes/deepequalerrors"
+ "golang.org/x/tools/go/analysis/passes/errorsas"
+ "golang.org/x/tools/go/analysis/passes/findcall"
+ "golang.org/x/tools/go/analysis/passes/httpresponse"
+ _ "golang.org/x/tools/go/analysis/passes/inspect" // unused internal analyzer
+ "golang.org/x/tools/go/analysis/passes/loopclosure"
+ "golang.org/x/tools/go/analysis/passes/lostcancel"
+ "golang.org/x/tools/go/analysis/passes/nilfunc"
+ "golang.org/x/tools/go/analysis/passes/nilness"
+ _ "golang.org/x/tools/go/analysis/passes/pkgfact" // unused, internal analyzer
+ "golang.org/x/tools/go/analysis/passes/printf"
+ "golang.org/x/tools/go/analysis/passes/shadow"
+ "golang.org/x/tools/go/analysis/passes/shift"
+ "golang.org/x/tools/go/analysis/passes/sortslice"
+ "golang.org/x/tools/go/analysis/passes/stdmethods"
+ "golang.org/x/tools/go/analysis/passes/structtag"
+ "golang.org/x/tools/go/analysis/passes/testinggoroutine"
+ "golang.org/x/tools/go/analysis/passes/tests"
+ "golang.org/x/tools/go/analysis/passes/unmarshal"
+ "golang.org/x/tools/go/analysis/passes/unreachable"
+ "golang.org/x/tools/go/analysis/passes/unsafeptr"
+ "golang.org/x/tools/go/analysis/passes/unusedresult"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+var (
+ allAnalyzers = []*analysis.Analyzer{
+ asmdecl.Analyzer,
+ assign.Analyzer,
+ atomic.Analyzer,
+ atomicalign.Analyzer,
+ bools.Analyzer,
+ buildtag.Analyzer,
+ cgocall.Analyzer,
+ composite.Analyzer,
+ copylock.Analyzer,
+ deepequalerrors.Analyzer,
+ errorsas.Analyzer,
+ findcall.Analyzer,
+ httpresponse.Analyzer,
+ loopclosure.Analyzer,
+ lostcancel.Analyzer,
+ nilfunc.Analyzer,
+ nilness.Analyzer,
+ printf.Analyzer,
+ shadow.Analyzer,
+ shift.Analyzer,
+ sortslice.Analyzer,
+ stdmethods.Analyzer,
+ structtag.Analyzer,
+ testinggoroutine.Analyzer,
+ tests.Analyzer,
+ unmarshal.Analyzer,
+ unreachable.Analyzer,
+ unsafeptr.Analyzer,
+ unusedresult.Analyzer,
+ }
+
+ defaultAnalyzers = []*analysis.Analyzer{
+ asmdecl.Analyzer,
+ assign.Analyzer,
+ atomic.Analyzer,
+ bools.Analyzer,
+ buildtag.Analyzer,
+ cgocall.Analyzer,
+ composite.Analyzer,
+ copylock.Analyzer,
+ errorsas.Analyzer,
+ httpresponse.Analyzer,
+ loopclosure.Analyzer,
+ lostcancel.Analyzer,
+ nilfunc.Analyzer,
+ printf.Analyzer,
+ shift.Analyzer,
+ stdmethods.Analyzer,
+ structtag.Analyzer,
+ tests.Analyzer,
+ unmarshal.Analyzer,
+ unreachable.Analyzer,
+ unsafeptr.Analyzer,
+ unusedresult.Analyzer,
+ }
+)
+
+func isAnalyzerEnabled(name string, cfg *config.GovetSettings, defaultAnalyzers []*analysis.Analyzer) bool {
+ if cfg.EnableAll {
+ for _, n := range cfg.Disable {
+ if n == name {
+ return false
+ }
+ }
+ return true
+ }
+ // Raw for loops should be OK on small slice lengths.
+ for _, n := range cfg.Enable {
+ if n == name {
+ return true
+ }
+ }
+ for _, n := range cfg.Disable {
+ if n == name {
+ return false
+ }
+ }
+ if cfg.DisableAll {
+ return false
+ }
+ for _, a := range defaultAnalyzers {
+ if a.Name == name {
+ return true
+ }
+ }
+ return false
+}
+
+func analyzersFromConfig(cfg *config.GovetSettings) []*analysis.Analyzer {
+ if cfg == nil {
+ return defaultAnalyzers
+ }
+
+ if cfg.CheckShadowing {
+ // Keeping for backward compatibility.
+ cfg.Enable = append(cfg.Enable, shadow.Analyzer.Name)
+ }
+
+ var enabledAnalyzers []*analysis.Analyzer
+ for _, a := range allAnalyzers {
+ if isAnalyzerEnabled(a.Name, cfg, defaultAnalyzers) {
+ enabledAnalyzers = append(enabledAnalyzers, a)
+ }
+ }
+
+ return enabledAnalyzers
+}
+
+func NewGovet(cfg *config.GovetSettings) *goanalysis.Linter {
+ var settings map[string]map[string]interface{}
+ if cfg != nil {
+ settings = cfg.Settings
+ }
+ return goanalysis.NewLinter(
+ "govet",
+ "Vet examines Go source code and reports suspicious constructs, "+
+ "such as Printf calls whose arguments do not align with the format string",
+ analyzersFromConfig(cfg),
+ settings,
+ ).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/ineffassign.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/ineffassign.go
new file mode 100644
index 000000000..93c1fb11b
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/ineffassign.go
@@ -0,0 +1,61 @@
+package golinters
+
+import (
+ "fmt"
+ "sync"
+
+ "github.com/golangci/ineffassign"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const ineffassignName = "ineffassign"
+
+func NewIneffassign() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: ineffassignName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ ineffassignName,
+ "Detects when assignments to existing variables are not used",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var fileNames []string
+ for _, f := range pass.Files {
+ pos := pass.Fset.PositionFor(f.Pos(), false)
+ fileNames = append(fileNames, pos.Filename)
+ }
+
+ issues := ineffassign.Run(fileNames)
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]goanalysis.Issue, 0, len(issues))
+ for _, i := range issues {
+ res = append(res, goanalysis.NewIssue(&result.Issue{
+ Pos: i.Pos,
+ Text: fmt.Sprintf("ineffectual assignment to %s", formatCode(i.IdentName, lintCtx.Cfg)),
+ FromLinter: ineffassignName,
+ }, pass))
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/interfacer.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/interfacer.go
new file mode 100644
index 000000000..1edbe894c
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/interfacer.go
@@ -0,0 +1,67 @@
+package golinters
+
+import (
+ "sync"
+
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/passes/buildssa"
+ "mvdan.cc/interfacer/check"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const interfacerName = "interfacer"
+
+func NewInterfacer() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: interfacerName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ Requires: []*analysis.Analyzer{buildssa.Analyzer},
+ }
+ return goanalysis.NewLinter(
+ interfacerName,
+ "Linter that suggests narrower interface types",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ ssa := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA)
+ ssaPkg := ssa.Pkg
+ c := &check.Checker{}
+ prog := goanalysis.MakeFakeLoaderProgram(pass)
+ c.Program(prog)
+ c.ProgramSSA(ssaPkg.Prog)
+
+ issues, err := c.Check()
+ if err != nil {
+ return nil, err
+ }
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]goanalysis.Issue, 0, len(issues))
+ for _, i := range issues {
+ pos := pass.Fset.Position(i.Pos())
+ res = append(res, goanalysis.NewIssue(&result.Issue{
+ Pos: pos,
+ Text: i.Message(),
+ FromLinter: interfacerName,
+ }, pass))
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/lll.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/lll.go
new file mode 100644
index 000000000..5f26e91dd
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/lll.go
@@ -0,0 +1,124 @@
+package golinters
+
+import (
+ "bufio"
+ "fmt"
+ "go/token"
+ "os"
+ "strings"
+ "sync"
+ "unicode/utf8"
+
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func getLLLIssuesForFile(filename string, maxLineLen int, tabSpaces string) ([]result.Issue, error) {
+ var res []result.Issue
+
+ f, err := os.Open(filename)
+ if err != nil {
+ return nil, fmt.Errorf("can't open file %s: %s", filename, err)
+ }
+ defer f.Close()
+
+ lineNumber := 1
+ scanner := bufio.NewScanner(f)
+ for scanner.Scan() {
+ line := scanner.Text()
+ line = strings.Replace(line, "\t", tabSpaces, -1)
+ lineLen := utf8.RuneCountInString(line)
+ if lineLen > maxLineLen {
+ res = append(res, result.Issue{
+ Pos: token.Position{
+ Filename: filename,
+ Line: lineNumber,
+ },
+ Text: fmt.Sprintf("line is %d characters", lineLen),
+ FromLinter: lllName,
+ })
+ }
+ lineNumber++
+ }
+
+ if err := scanner.Err(); err != nil {
+ if err == bufio.ErrTooLong && maxLineLen < bufio.MaxScanTokenSize {
+ // scanner.Scan() might fail if the line is longer than bufio.MaxScanTokenSize
+ // In the case where the specified maxLineLen is smaller than bufio.MaxScanTokenSize
+ // we can return this line as a long line instead of returning an error.
+ // The reason for this change is that this case might happen with autogenerated files
+ // The go-bindata tool for instance might generate a file with a very long line.
+ // In this case, as it's a auto generated file, the warning returned by lll will
+ // be ignored.
+ // But if we return a linter error here, and this error happens for an autogenerated
+ // file the error will be discarded (fine), but all the subsequent errors for lll will
+ // be discarded for other files and we'll miss legit error.
+ res = append(res, result.Issue{
+ Pos: token.Position{
+ Filename: filename,
+ Line: lineNumber,
+ Column: 1,
+ },
+ Text: fmt.Sprintf("line is more than %d characters", bufio.MaxScanTokenSize),
+ FromLinter: lllName,
+ })
+ } else {
+ return nil, fmt.Errorf("can't scan file %s: %s", filename, err)
+ }
+ }
+
+ return res, nil
+}
+
+const lllName = "lll"
+
+func NewLLL() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: lllName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ lllName,
+ "Reports long lines",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var fileNames []string
+ for _, f := range pass.Files {
+ pos := pass.Fset.PositionFor(f.Pos(), false)
+ fileNames = append(fileNames, pos.Filename)
+ }
+
+ var res []goanalysis.Issue
+ spaces := strings.Repeat(" ", lintCtx.Settings().Lll.TabWidth)
+ for _, f := range fileNames {
+ issues, err := getLLLIssuesForFile(f, lintCtx.Settings().Lll.LineLength, spaces)
+ if err != nil {
+ return nil, err
+ }
+ for i := range issues {
+ res = append(res, goanalysis.NewIssue(&issues[i], pass))
+ }
+ }
+
+ if len(res) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/maligned.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/maligned.go
new file mode 100644
index 000000000..22422b8c6
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/maligned.go
@@ -0,0 +1,58 @@
+package golinters
+
+import (
+ "fmt"
+ "sync"
+
+ malignedAPI "github.com/golangci/maligned"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func NewMaligned() *goanalysis.Linter {
+ const linterName = "maligned"
+ var mu sync.Mutex
+ var res []goanalysis.Issue
+ analyzer := &analysis.Analyzer{
+ Name: linterName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ linterName,
+ "Tool to detect Go structs that would take less memory if their fields were sorted",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ prog := goanalysis.MakeFakeLoaderProgram(pass)
+
+ malignedIssues := malignedAPI.Run(prog)
+ if len(malignedIssues) == 0 {
+ return nil, nil
+ }
+
+ issues := make([]goanalysis.Issue, 0, len(malignedIssues))
+ for _, i := range malignedIssues {
+ text := fmt.Sprintf("struct of size %d bytes could be of size %d bytes", i.OldSize, i.NewSize)
+ if lintCtx.Settings().Maligned.SuggestNewOrder {
+ text += fmt.Sprintf(":\n%s", formatCodeBlock(i.NewStructDef, lintCtx.Cfg))
+ }
+ issues = append(issues, goanalysis.NewIssue(&result.Issue{
+ Pos: i.Pos,
+ Text: text,
+ FromLinter: linterName,
+ }, pass))
+ }
+
+ mu.Lock()
+ res = append(res, issues...)
+ mu.Unlock()
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return res
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/megacheck.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/megacheck.go
new file mode 100644
index 000000000..85621f6fb
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/megacheck.go
@@ -0,0 +1,30 @@
+package golinters
+
+import (
+ "fmt"
+
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+var debugf = logutils.Debug("megacheck")
+
+func analyzersMapToSlice(m map[string]*analysis.Analyzer) []*analysis.Analyzer {
+ var ret []*analysis.Analyzer
+ for _, v := range m {
+ ret = append(ret, v)
+ }
+ return ret
+}
+
+func setAnalyzersGoVersion(analyzers []*analysis.Analyzer) {
+ const goVersion = 13 // TODO
+ for _, a := range analyzers {
+ if v := a.Flags.Lookup("go"); v != nil {
+ if err := v.Value.Set(fmt.Sprintf("1.%d", goVersion)); err != nil {
+ debugf("Failed to set go version: %s", err)
+ }
+ }
+ }
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/misspell.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/misspell.go
new file mode 100644
index 000000000..80ecf9bb6
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/misspell.go
@@ -0,0 +1,132 @@
+package golinters
+
+import (
+ "fmt"
+ "go/token"
+ "strings"
+ "sync"
+
+ "github.com/golangci/misspell"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func runMisspellOnFile(fileName string, r *misspell.Replacer, lintCtx *linter.Context) ([]result.Issue, error) {
+ var res []result.Issue
+ fileContent, err := lintCtx.FileCache.GetFileBytes(fileName)
+ if err != nil {
+ return nil, fmt.Errorf("can't get file %s contents: %s", fileName, err)
+ }
+
+ // use r.Replace, not r.ReplaceGo because r.ReplaceGo doesn't find
+ // issues inside strings: it searches only inside comments. r.Replace
+ // searches all words: it treats input as a plain text. A standalone misspell
+ // tool uses r.Replace by default.
+ _, diffs := r.Replace(string(fileContent))
+ for _, diff := range diffs {
+ text := fmt.Sprintf("`%s` is a misspelling of `%s`", diff.Original, diff.Corrected)
+ pos := token.Position{
+ Filename: fileName,
+ Line: diff.Line,
+ Column: diff.Column + 1,
+ }
+ replacement := &result.Replacement{
+ Inline: &result.InlineFix{
+ StartCol: diff.Column,
+ Length: len(diff.Original),
+ NewString: diff.Corrected,
+ },
+ }
+
+ res = append(res, result.Issue{
+ Pos: pos,
+ Text: text,
+ FromLinter: misspellName,
+ Replacement: replacement,
+ })
+ }
+
+ return res, nil
+}
+
+const misspellName = "misspell"
+
+func NewMisspell() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+ var ruleErr error
+
+ analyzer := &analysis.Analyzer{
+ Name: misspellName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ misspellName,
+ "Finds commonly misspelled English words in comments",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ r := misspell.Replacer{
+ Replacements: misspell.DictMain,
+ }
+
+ // Figure out regional variations
+ settings := lintCtx.Settings().Misspell
+ locale := settings.Locale
+ switch strings.ToUpper(locale) {
+ case "":
+ // nothing
+ case "US":
+ r.AddRuleList(misspell.DictAmerican)
+ case "UK", "GB":
+ r.AddRuleList(misspell.DictBritish)
+ case "NZ", "AU", "CA":
+ ruleErr = fmt.Errorf("unknown locale: %q", locale)
+ }
+
+ if ruleErr == nil {
+ if len(settings.IgnoreWords) != 0 {
+ r.RemoveRule(settings.IgnoreWords)
+ }
+
+ r.Compile()
+ }
+
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ if ruleErr != nil {
+ return nil, ruleErr
+ }
+
+ var fileNames []string
+ for _, f := range pass.Files {
+ pos := pass.Fset.PositionFor(f.Pos(), false)
+ fileNames = append(fileNames, pos.Filename)
+ }
+
+ var res []goanalysis.Issue
+ for _, f := range fileNames {
+ issues, err := runMisspellOnFile(f, &r, lintCtx)
+ if err != nil {
+ return nil, err
+ }
+ for i := range issues {
+ res = append(res, goanalysis.NewIssue(&issues[i], pass))
+ }
+ }
+ if len(res) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/nakedret.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/nakedret.go
new file mode 100644
index 000000000..86735a51a
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/nakedret.go
@@ -0,0 +1,123 @@
+package golinters
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "sync"
+
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type nakedretVisitor struct {
+ maxLength int
+ f *token.FileSet
+ issues []result.Issue
+}
+
+func (v *nakedretVisitor) processFuncDecl(funcDecl *ast.FuncDecl) {
+ file := v.f.File(funcDecl.Pos())
+ functionLineLength := file.Position(funcDecl.End()).Line - file.Position(funcDecl.Pos()).Line
+
+ // Scan the body for usage of the named returns
+ for _, stmt := range funcDecl.Body.List {
+ s, ok := stmt.(*ast.ReturnStmt)
+ if !ok {
+ continue
+ }
+
+ if len(s.Results) != 0 {
+ continue
+ }
+
+ file := v.f.File(s.Pos())
+ if file == nil || functionLineLength <= v.maxLength {
+ continue
+ }
+ if funcDecl.Name == nil {
+ continue
+ }
+
+ v.issues = append(v.issues, result.Issue{
+ FromLinter: nakedretName,
+ Text: fmt.Sprintf("naked return in func `%s` with %d lines of code",
+ funcDecl.Name.Name, functionLineLength),
+ Pos: v.f.Position(s.Pos()),
+ })
+ }
+}
+
+func (v *nakedretVisitor) Visit(node ast.Node) ast.Visitor {
+ funcDecl, ok := node.(*ast.FuncDecl)
+ if !ok {
+ return v
+ }
+
+ var namedReturns []*ast.Ident
+
+ // We've found a function
+ if funcDecl.Type != nil && funcDecl.Type.Results != nil {
+ for _, field := range funcDecl.Type.Results.List {
+ for _, ident := range field.Names {
+ if ident != nil {
+ namedReturns = append(namedReturns, ident)
+ }
+ }
+ }
+ }
+
+ if len(namedReturns) == 0 || funcDecl.Body == nil {
+ return v
+ }
+
+ v.processFuncDecl(funcDecl)
+ return v
+}
+
+const nakedretName = "nakedret"
+
+func NewNakedret() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: nakedretName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ nakedretName,
+ "Finds naked returns in functions greater than a specified function length",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var res []goanalysis.Issue
+ for _, file := range pass.Files {
+ v := nakedretVisitor{
+ maxLength: lintCtx.Settings().Nakedret.MaxFuncLines,
+ f: pass.Fset,
+ }
+ ast.Walk(&v, file)
+ for i := range v.issues {
+ res = append(res, goanalysis.NewIssue(&v.issues[i], pass))
+ }
+ }
+
+ if len(res) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/nestif.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/nestif.go
new file mode 100644
index 000000000..0998a8ce2
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/nestif.go
@@ -0,0 +1,65 @@
+package golinters
+
+import (
+ "sort"
+ "sync"
+
+ "github.com/nakabonne/nestif"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const nestifName = "nestif"
+
+func NewNestif() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: goanalysis.TheOnlyAnalyzerName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ nestifName,
+ "Reports deeply nested if statements",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ checker := &nestif.Checker{
+ MinComplexity: lintCtx.Settings().Nestif.MinComplexity,
+ }
+ var issues []nestif.Issue
+ for _, f := range pass.Files {
+ issues = append(issues, checker.Check(f, pass.Fset)...)
+ }
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ sort.SliceStable(issues, func(i, j int) bool {
+ return issues[i].Complexity > issues[j].Complexity
+ })
+
+ res := make([]goanalysis.Issue, 0, len(issues))
+ for _, i := range issues {
+ res = append(res, goanalysis.NewIssue(&result.Issue{
+ Pos: i.Pos,
+ Text: i.Message,
+ FromLinter: nestifName,
+ }, pass))
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/nolintlint.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/nolintlint.go
new file mode 100644
index 000000000..d98b50cf8
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/nolintlint.go
@@ -0,0 +1,92 @@
+package golinters
+
+import (
+ "fmt"
+ "go/ast"
+ "sync"
+
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/golinters/nolintlint"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const NolintlintName = "nolintlint"
+
+func NewNoLintLint() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: NolintlintName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ NolintlintName,
+ "Reports ill-formed or insufficient nolint directives",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var needs nolintlint.Needs
+ settings := lintCtx.Settings().NoLintLint
+ if settings.RequireExplanation {
+ needs |= nolintlint.NeedsExplanation
+ }
+ if !settings.AllowLeadingSpace {
+ needs |= nolintlint.NeedsMachineOnly
+ }
+ if settings.RequireSpecific {
+ needs |= nolintlint.NeedsSpecific
+ }
+ if !settings.AllowUnused {
+ needs |= nolintlint.NeedsUnused
+ }
+
+ lnt, err := nolintlint.NewLinter(needs, settings.AllowNoExplanation)
+ if err != nil {
+ return nil, err
+ }
+
+ nodes := make([]ast.Node, 0, len(pass.Files))
+ for _, n := range pass.Files {
+ nodes = append(nodes, n)
+ }
+ issues, err := lnt.Run(pass.Fset, nodes...)
+ if err != nil {
+ return nil, fmt.Errorf("linter failed to run: %s", err)
+ }
+ var res []goanalysis.Issue
+ for _, i := range issues {
+ expectNoLint := false
+ var expectedNolintLinter string
+ if ii, ok := i.(nolintlint.UnusedCandidate); ok {
+ expectedNolintLinter = ii.ExpectedLinter
+ expectNoLint = true
+ }
+ issue := &result.Issue{
+ FromLinter: NolintlintName,
+ Text: i.Details(),
+ Pos: i.Position(),
+ ExpectNoLint: expectNoLint,
+ ExpectedNoLintLinter: expectedNolintLinter,
+ }
+ res = append(res, goanalysis.NewIssue(issue, pass))
+ }
+
+ if len(res) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/nolintlint/README.md b/vendor/github.com/golangci/golangci-lint/pkg/golinters/nolintlint/README.md
new file mode 100644
index 000000000..3d440d5a5
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/nolintlint/README.md
@@ -0,0 +1,31 @@
+# nolintlint
+
+nolintlint is a Go static analysis tool to find ill-formed or insufficiently explained `// nolint` directives for golangci
+(or any other linter, using th )
+
+## Purpose
+
+To ensure that lint exceptions have explanations. Consider the case below:
+
+```Go
+import "crypto/md5" //nolint
+
+func hash(data []byte) []byte {
+ return md5.New().Sum(data) //nolint
+}
+```
+
+In the above case, nolint directives are present but the user has no idea why this is being done or which linter
+is being suppressed (in this case, gosec recommends against use of md5). `nolintlint` can require that the code provide an explanation, which might look as follows:
+
+```Go
+import "crypto/md5" //nolint:gosec // this is not used in a secure application
+
+func hash(data []byte) []byte {
+ return md5.New().Sum(data) //nolint:gosec // this result is not used in a secure application
+}
+```
+
+`nolintlint` can also identify cases where you may have written `// nolint`. Finally `nolintlint`, can also enforce that you
+use the machine-readable nolint directive format `//nolint` and that you mention what linter is being suppressed, as shown above when we write `//nolint:gosec`.
+
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/nolintlint/nolintlint.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/nolintlint/nolintlint.go
new file mode 100644
index 000000000..6da31c60f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/nolintlint/nolintlint.go
@@ -0,0 +1,239 @@
+// nolintlint provides a linter to ensure that all //nolint directives are followed by explanations
+package nolintlint
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "regexp"
+ "strings"
+ "unicode"
+)
+
+type BaseIssue struct {
+ fullDirective string
+ directiveWithOptionalLeadingSpace string
+ position token.Position
+}
+
+func (b BaseIssue) Position() token.Position {
+ return b.position
+}
+
+type ExtraLeadingSpace struct {
+ BaseIssue
+}
+
+func (i ExtraLeadingSpace) Details() string {
+ return fmt.Sprintf("directive `%s` should not have more than one leading space", i.fullDirective)
+}
+
+func (i ExtraLeadingSpace) String() string { return toString(i) }
+
+type NotMachine struct {
+ BaseIssue
+}
+
+func (i NotMachine) Details() string {
+ expected := i.fullDirective[:2] + strings.TrimLeftFunc(i.fullDirective[2:], unicode.IsSpace)
+ return fmt.Sprintf("directive `%s` should be written without leading space as `%s`",
+ i.fullDirective, expected)
+}
+
+func (i NotMachine) String() string { return toString(i) }
+
+type NotSpecific struct {
+ BaseIssue
+}
+
+func (i NotSpecific) Details() string {
+ return fmt.Sprintf("directive `%s` should mention specific linter such as `//%s:my-linter`",
+ i.fullDirective, i.directiveWithOptionalLeadingSpace)
+}
+
+func (i NotSpecific) String() string { return toString(i) }
+
+type ParseError struct {
+ BaseIssue
+}
+
+func (i ParseError) Details() string {
+ return fmt.Sprintf("directive `%s` should match `//%s[:<comma-separated-linters>] [// <explanation>]`",
+ i.fullDirective,
+ i.directiveWithOptionalLeadingSpace)
+}
+
+func (i ParseError) String() string { return toString(i) }
+
+type NoExplanation struct {
+ BaseIssue
+ fullDirectiveWithoutExplanation string
+}
+
+func (i NoExplanation) Details() string {
+ return fmt.Sprintf("directive `%s` should provide explanation such as `%s // this is why`",
+ i.fullDirective, i.fullDirectiveWithoutExplanation)
+}
+
+func (i NoExplanation) String() string { return toString(i) }
+
+type UnusedCandidate struct {
+ BaseIssue
+ ExpectedLinter string
+}
+
+func (i UnusedCandidate) Details() string {
+ details := fmt.Sprintf("directive `%s` is unused", i.fullDirective)
+ if i.ExpectedLinter != "" {
+ details += fmt.Sprintf(" for linter %s", i.ExpectedLinter)
+ }
+ return details
+}
+
+func (i UnusedCandidate) String() string { return toString(i) }
+
+func toString(i Issue) string {
+ return fmt.Sprintf("%s at %s", i.Details(), i.Position())
+}
+
+type Issue interface {
+ Details() string
+ Position() token.Position
+ String() string
+}
+
+type Needs uint
+
+const (
+ NeedsMachineOnly Needs = 1 << iota
+ NeedsSpecific
+ NeedsExplanation
+ NeedsUnused
+ NeedsAll = NeedsMachineOnly | NeedsSpecific | NeedsExplanation
+)
+
+// matches lines starting with the nolint directive
+var directiveOnlyPattern = regexp.MustCompile(`^\s*(nolint)(:\s*[\w-]+\s*(?:,\s*[\w-]+\s*)*)?\b`)
+
+// matches a complete nolint directive
+var fullDirectivePattern = regexp.MustCompile(`^//\s*nolint(:\s*[\w-]+\s*(?:,\s*[\w-]+\s*)*)?\s*(//.*)?\s*\n?$`)
+
+type Linter struct {
+ excludes []string // lists individual linters that don't require explanations
+ needs Needs // indicates which linter checks to perform
+ excludeByLinter map[string]bool
+}
+
+// NewLinter creates a linter that enforces that the provided directives fulfill the provided requirements
+func NewLinter(needs Needs, excludes []string) (*Linter, error) {
+ excludeByName := make(map[string]bool)
+ for _, e := range excludes {
+ excludeByName[e] = true
+ }
+
+ return &Linter{
+ needs: needs,
+ excludeByLinter: excludeByName,
+ }, nil
+}
+
+var leadingSpacePattern = regexp.MustCompile(`^//(\s*)`)
+var trailingBlankExplanation = regexp.MustCompile(`\s*(//\s*)?$`)
+
+func (l Linter) Run(fset *token.FileSet, nodes ...ast.Node) ([]Issue, error) {
+ var issues []Issue
+ for _, node := range nodes {
+ if file, ok := node.(*ast.File); ok {
+ for _, c := range file.Comments {
+ text := c.Text()
+ matches := directiveOnlyPattern.FindStringSubmatch(text)
+ if len(matches) == 0 {
+ continue
+ }
+ directive := matches[1]
+
+ // check for a space between the "//" and the directive
+ leadingSpaceMatches := leadingSpacePattern.FindStringSubmatch(c.List[0].Text) // c.Text() doesn't have all leading space
+ if len(leadingSpaceMatches) == 0 {
+ continue
+ }
+ leadingSpace := leadingSpaceMatches[1]
+
+ directiveWithOptionalLeadingSpace := directive
+ if len(leadingSpace) > 0 {
+ directiveWithOptionalLeadingSpace = " " + directive
+ }
+
+ base := BaseIssue{
+ fullDirective: c.List[0].Text,
+ directiveWithOptionalLeadingSpace: directiveWithOptionalLeadingSpace,
+ position: fset.Position(c.Pos()),
+ }
+
+ // check for, report and eliminate leading spaces so we can check for other issues
+ if leadingSpace != "" && leadingSpace != " " {
+ issues = append(issues, ExtraLeadingSpace{
+ BaseIssue: base,
+ })
+ }
+
+ if (l.needs&NeedsMachineOnly) != 0 && strings.HasPrefix(directiveWithOptionalLeadingSpace, " ") {
+ issues = append(issues, NotMachine{BaseIssue: base})
+ }
+
+ fullMatches := fullDirectivePattern.FindStringSubmatch(c.List[0].Text)
+ if len(fullMatches) == 0 {
+ issues = append(issues, ParseError{BaseIssue: base})
+ continue
+ }
+ lintersText, explanation := fullMatches[1], fullMatches[2]
+ var linters []string
+ if len(lintersText) > 0 {
+ lls := strings.Split(lintersText[1:], ",")
+ linters = make([]string, 0, len(lls))
+ for _, ll := range lls {
+ ll = strings.TrimSpace(ll)
+ if ll != "" {
+ linters = append(linters, ll)
+ }
+ }
+ }
+ if (l.needs & NeedsSpecific) != 0 {
+ if len(linters) == 0 {
+ issues = append(issues, NotSpecific{BaseIssue: base})
+ }
+ }
+
+ // when detecting unused directives, we send all the directives through and filter them out in the nolint processor
+ if l.needs&NeedsUnused != 0 {
+ if len(linters) == 0 {
+ issues = append(issues, UnusedCandidate{BaseIssue: base})
+ } else {
+ for _, linter := range linters {
+ issues = append(issues, UnusedCandidate{BaseIssue: base, ExpectedLinter: linter})
+ }
+ }
+ }
+
+ if (l.needs&NeedsExplanation) != 0 && (explanation == "" || strings.TrimSpace(explanation) == "//") {
+ needsExplanation := len(linters) == 0 // if no linters are mentioned, we must have explanation
+ // otherwise, check if we are excluding all of the mentioned linters
+ for _, ll := range linters {
+ if !l.excludeByLinter[ll] { // if a linter does require explanation
+ needsExplanation = true
+ break
+ }
+ }
+ if needsExplanation {
+ fullDirectiveWithoutExplanation := trailingBlankExplanation.ReplaceAllString(c.List[0].Text, "")
+ issues = append(issues, NoExplanation{
+ BaseIssue: base,
+ fullDirectiveWithoutExplanation: fullDirectiveWithoutExplanation,
+ })
+ }
+ }
+ }
+ }
+ }
+ return issues, nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/prealloc.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/prealloc.go
new file mode 100644
index 000000000..534a69253
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/prealloc.go
@@ -0,0 +1,57 @@
+package golinters
+
+import (
+ "fmt"
+ "sync"
+
+ "github.com/golangci/prealloc"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const preallocName = "prealloc"
+
+func NewPrealloc() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: preallocName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ preallocName,
+ "Finds slice declarations that could potentially be preallocated",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ s := &lintCtx.Settings().Prealloc
+
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var res []goanalysis.Issue
+ hints := prealloc.Check(pass.Files, s.Simple, s.RangeLoops, s.ForLoops)
+ for _, hint := range hints {
+ res = append(res, goanalysis.NewIssue(&result.Issue{
+ Pos: pass.Fset.Position(hint.Pos),
+ Text: fmt.Sprintf("Consider preallocating %s", formatCode(hint.DeclaredSliceName, lintCtx.Cfg)),
+ FromLinter: preallocName,
+ }, pass))
+ }
+
+ if len(res) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/rowerrcheck.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/rowerrcheck.go
new file mode 100644
index 000000000..d4c89d382
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/rowerrcheck.go
@@ -0,0 +1,23 @@
+package golinters
+
+import (
+ "github.com/jingyugao/rowserrcheck/passes/rowserr"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+)
+
+func NewRowsErrCheck() *goanalysis.Linter {
+ analyzer := rowserr.NewAnalyzer()
+ return goanalysis.NewLinter(
+ "rowserrcheck",
+ "checks whether Err of rows is checked successfully",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithLoadMode(goanalysis.LoadModeTypesInfo).
+ WithContextSetter(func(lintCtx *linter.Context) {
+ pkgs := lintCtx.Settings().RowsErrCheck.Packages
+ analyzer.Run = rowserr.NewRun(pkgs...)
+ })
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/scopelint.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/scopelint.go
new file mode 100644
index 000000000..258912e0b
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/scopelint.go
@@ -0,0 +1,178 @@
+package golinters
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "sync"
+
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const scopelintName = "scopelint"
+
+func NewScopelint() *goanalysis.Linter {
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: scopelintName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ scopelintName,
+ "Scopelint checks for unpinned variables in go programs",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var res []result.Issue
+ for _, file := range pass.Files {
+ n := Node{
+ fset: pass.Fset,
+ DangerObjects: map[*ast.Object]int{},
+ UnsafeObjects: map[*ast.Object]int{},
+ SkipFuncs: map[*ast.FuncLit]int{},
+ issues: &res,
+ }
+ ast.Walk(&n, file)
+ }
+
+ if len(res) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ for i := range res {
+ resIssues = append(resIssues, goanalysis.NewIssue(&res[i], pass))
+ }
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
+
+// The code below is copy-pasted from https://github.com/kyoh86/scopelint 92cbe2cc9276abda0e309f52cc9e309d407f174e
+
+// Node represents a Node being linted.
+type Node struct {
+ fset *token.FileSet
+ DangerObjects map[*ast.Object]int
+ UnsafeObjects map[*ast.Object]int
+ SkipFuncs map[*ast.FuncLit]int
+ issues *[]result.Issue
+}
+
+// Visit method is invoked for each node encountered by Walk.
+// If the result visitor w is not nil, Walk visits each of the children
+// of node with the visitor w, followed by a call of w.Visit(nil).
+//nolint:gocyclo,gocritic
+func (f *Node) Visit(node ast.Node) ast.Visitor {
+ switch typedNode := node.(type) {
+ case *ast.ForStmt:
+ switch init := typedNode.Init.(type) {
+ case *ast.AssignStmt:
+ for _, lh := range init.Lhs {
+ switch tlh := lh.(type) {
+ case *ast.Ident:
+ f.UnsafeObjects[tlh.Obj] = 0
+ }
+ }
+ }
+
+ case *ast.RangeStmt:
+ // Memory variables declared in range statement
+ switch k := typedNode.Key.(type) {
+ case *ast.Ident:
+ f.UnsafeObjects[k.Obj] = 0
+ }
+ switch v := typedNode.Value.(type) {
+ case *ast.Ident:
+ f.UnsafeObjects[v.Obj] = 0
+ }
+
+ case *ast.UnaryExpr:
+ if typedNode.Op == token.AND {
+ switch ident := typedNode.X.(type) {
+ case *ast.Ident:
+ if _, unsafe := f.UnsafeObjects[ident.Obj]; unsafe {
+ f.errorf(ident, "Using a reference for the variable on range scope %s", formatCode(ident.Name, nil))
+ }
+ }
+ }
+
+ case *ast.Ident:
+ if _, obj := f.DangerObjects[typedNode.Obj]; obj {
+ // It is the naked variable in scope of range statement.
+ f.errorf(node, "Using the variable on range scope %s in function literal", formatCode(typedNode.Name, nil))
+ break
+ }
+
+ case *ast.CallExpr:
+ // Ignore func literals that'll be called immediately.
+ switch funcLit := typedNode.Fun.(type) {
+ case *ast.FuncLit:
+ f.SkipFuncs[funcLit] = 0
+ }
+
+ case *ast.FuncLit:
+ if _, skip := f.SkipFuncs[typedNode]; !skip {
+ dangers := map[*ast.Object]int{}
+ for d := range f.DangerObjects {
+ dangers[d] = 0
+ }
+ for u := range f.UnsafeObjects {
+ dangers[u] = 0
+ f.UnsafeObjects[u]++
+ }
+ return &Node{
+ fset: f.fset,
+ DangerObjects: dangers,
+ UnsafeObjects: f.UnsafeObjects,
+ SkipFuncs: f.SkipFuncs,
+ issues: f.issues,
+ }
+ }
+
+ case *ast.ReturnStmt:
+ unsafe := map[*ast.Object]int{}
+ for u := range f.UnsafeObjects {
+ if f.UnsafeObjects[u] == 0 {
+ continue
+ }
+ unsafe[u] = f.UnsafeObjects[u]
+ }
+ return &Node{
+ fset: f.fset,
+ DangerObjects: f.DangerObjects,
+ UnsafeObjects: unsafe,
+ SkipFuncs: f.SkipFuncs,
+ issues: f.issues,
+ }
+ }
+ return f
+}
+
+// The variadic arguments may start with link and category types,
+// and must end with a format string and any arguments.
+// It returns the new Problem.
+//nolint:interfacer
+func (f *Node) errorf(n ast.Node, format string, args ...interface{}) {
+ pos := f.fset.Position(n.Pos())
+ f.errorAtf(pos, format, args...)
+}
+
+func (f *Node) errorAtf(pos token.Position, format string, args ...interface{}) {
+ *f.issues = append(*f.issues, result.Issue{
+ Pos: pos,
+ Text: fmt.Sprintf(format, args...),
+ FromLinter: scopelintName,
+ })
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/staticcheck.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/staticcheck.go
new file mode 100644
index 000000000..33aa921e6
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/staticcheck.go
@@ -0,0 +1,19 @@
+package golinters
+
+import (
+ "honnef.co/go/tools/staticcheck"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewStaticcheck() *goanalysis.Linter {
+ analyzers := analyzersMapToSlice(staticcheck.Analyzers)
+ setAnalyzersGoVersion(analyzers)
+
+ return goanalysis.NewLinter(
+ "staticcheck",
+ "Staticcheck is a go vet on steroids, applying a ton of static analysis checks",
+ analyzers,
+ nil,
+ ).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/structcheck.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/structcheck.go
new file mode 100644
index 000000000..7c16f8ec3
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/structcheck.go
@@ -0,0 +1,55 @@
+package golinters // nolint:dupl
+
+import (
+ "fmt"
+ "sync"
+
+ structcheckAPI "github.com/golangci/check/cmd/structcheck"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func NewStructcheck() *goanalysis.Linter {
+ const linterName = "structcheck"
+ var mu sync.Mutex
+ var res []goanalysis.Issue
+ analyzer := &analysis.Analyzer{
+ Name: linterName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ linterName,
+ "Finds unused struct fields",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ checkExported := lintCtx.Settings().Structcheck.CheckExportedFields
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ prog := goanalysis.MakeFakeLoaderProgram(pass)
+
+ structcheckIssues := structcheckAPI.Run(prog, checkExported)
+ if len(structcheckIssues) == 0 {
+ return nil, nil
+ }
+
+ issues := make([]goanalysis.Issue, 0, len(structcheckIssues))
+ for _, i := range structcheckIssues {
+ issues = append(issues, goanalysis.NewIssue(&result.Issue{
+ Pos: i.Pos,
+ Text: fmt.Sprintf("%s is unused", formatCode(i.FieldName, lintCtx.Cfg)),
+ FromLinter: linterName,
+ }, pass))
+ }
+
+ mu.Lock()
+ res = append(res, issues...)
+ mu.Unlock()
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return res
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/stylecheck.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/stylecheck.go
new file mode 100644
index 000000000..5a076951a
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/stylecheck.go
@@ -0,0 +1,19 @@
+package golinters
+
+import (
+ "honnef.co/go/tools/stylecheck"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewStylecheck() *goanalysis.Linter {
+ analyzers := analyzersMapToSlice(stylecheck.Analyzers)
+ setAnalyzersGoVersion(analyzers)
+
+ return goanalysis.NewLinter(
+ "stylecheck",
+ "Stylecheck is a replacement for golint",
+ analyzers,
+ nil,
+ ).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/testpackage.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/testpackage.go
new file mode 100644
index 000000000..1248e78fd
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/testpackage.go
@@ -0,0 +1,23 @@
+package golinters
+
+import (
+ "github.com/maratori/testpackage/pkg/testpackage"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewTestpackage(cfg *config.TestpackageSettings) *goanalysis.Linter {
+ var a = testpackage.NewAnalyzer()
+ var settings map[string]map[string]interface{}
+ if cfg != nil {
+ settings = map[string]map[string]interface{}{
+ a.Name: {
+ testpackage.SkipRegexpFlagName: cfg.SkipRegexp,
+ },
+ }
+ }
+ return goanalysis.NewLinter(a.Name, a.Doc, []*analysis.Analyzer{a}, settings).
+ WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/typecheck.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/typecheck.go
new file mode 100644
index 000000000..436530a8d
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/typecheck.go
@@ -0,0 +1,26 @@
+package golinters
+
+import (
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+)
+
+func NewTypecheck() *goanalysis.Linter {
+ const linterName = "typecheck"
+ analyzer := &analysis.Analyzer{
+ Name: linterName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ Run: func(pass *analysis.Pass) (interface{}, error) {
+ return nil, nil
+ },
+ }
+ linter := goanalysis.NewLinter(
+ linterName,
+ "Like the front-end of a Go compiler, parses and type-checks Go code",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithLoadMode(goanalysis.LoadModeTypesInfo)
+ linter.SetTypecheckMode()
+ return linter
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/unconvert.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/unconvert.go
new file mode 100644
index 000000000..456f6836c
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/unconvert.go
@@ -0,0 +1,53 @@
+package golinters
+
+import (
+ "sync"
+
+ unconvertAPI "github.com/golangci/unconvert"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func NewUnconvert() *goanalysis.Linter {
+ const linterName = "unconvert"
+ var mu sync.Mutex
+ var res []goanalysis.Issue
+ analyzer := &analysis.Analyzer{
+ Name: linterName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ linterName,
+ "Remove unnecessary type conversions",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ prog := goanalysis.MakeFakeLoaderProgram(pass)
+
+ positions := unconvertAPI.Run(prog)
+ if len(positions) == 0 {
+ return nil, nil
+ }
+
+ issues := make([]goanalysis.Issue, 0, len(positions))
+ for _, pos := range positions {
+ issues = append(issues, goanalysis.NewIssue(&result.Issue{
+ Pos: pos,
+ Text: "unnecessary conversion",
+ FromLinter: linterName,
+ }, pass))
+ }
+
+ mu.Lock()
+ res = append(res, issues...)
+ mu.Unlock()
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return res
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/unparam.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/unparam.go
new file mode 100644
index 000000000..fabb6b527
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/unparam.go
@@ -0,0 +1,77 @@
+package golinters
+
+import (
+ "sync"
+
+ "golang.org/x/tools/go/packages"
+
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/passes/buildssa"
+ "mvdan.cc/unparam/check"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func NewUnparam() *goanalysis.Linter {
+ const linterName = "unparam"
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: linterName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ Requires: []*analysis.Analyzer{buildssa.Analyzer},
+ }
+ return goanalysis.NewLinter(
+ linterName,
+ "Reports unused function parameters",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ us := &lintCtx.Settings().Unparam
+ if us.Algo != "cha" {
+ lintCtx.Log.Warnf("`linters-settings.unparam.algo` isn't supported by the newest `unparam`")
+ }
+
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ ssa := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA)
+ ssaPkg := ssa.Pkg
+
+ pkg := &packages.Package{
+ Fset: pass.Fset,
+ Syntax: pass.Files,
+ Types: pass.Pkg,
+ TypesInfo: pass.TypesInfo,
+ }
+
+ c := &check.Checker{}
+ c.CheckExportedFuncs(us.CheckExported)
+ c.Packages([]*packages.Package{pkg})
+ c.ProgramSSA(ssaPkg.Prog)
+
+ unparamIssues, err := c.Check()
+ if err != nil {
+ return nil, err
+ }
+
+ var res []goanalysis.Issue
+ for _, i := range unparamIssues {
+ res = append(res, goanalysis.NewIssue(&result.Issue{
+ Pos: pass.Fset.Position(i.Pos()),
+ Text: i.Message(),
+ FromLinter: linterName,
+ }, pass))
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/unused.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/unused.go
new file mode 100644
index 000000000..bbe1e4b69
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/unused.go
@@ -0,0 +1,65 @@
+package golinters
+
+import (
+ "go/types"
+
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/packages"
+ "honnef.co/go/tools/unused"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func NewUnused() *goanalysis.Linter {
+ u := unused.NewChecker(false)
+ analyzers := []*analysis.Analyzer{u.Analyzer()}
+ setAnalyzersGoVersion(analyzers)
+
+ const name = "unused"
+ lnt := goanalysis.NewLinter(
+ name,
+ "Checks Go code for unused constants, variables, functions and types",
+ analyzers,
+ nil,
+ ).WithIssuesReporter(func(lintCtx *linter.Context) []goanalysis.Issue {
+ typesToPkg := map[*types.Package]*packages.Package{}
+ for _, pkg := range lintCtx.OriginalPackages {
+ typesToPkg[pkg.Types] = pkg
+ }
+
+ var issues []goanalysis.Issue
+ for _, ur := range u.Result() {
+ p := u.ProblemObject(lintCtx.Packages[0].Fset, ur)
+ pkg := typesToPkg[ur.Pkg()]
+ i := &result.Issue{
+ FromLinter: name,
+ Text: p.Message,
+ Pos: p.Pos,
+ Pkg: pkg,
+ LineRange: &result.Range{
+ From: p.Pos.Line,
+ To: p.End.Line,
+ },
+ }
+ // See https://github.com/golangci/golangci-lint/issues/1048
+ // If range is invalid, this will break `--fix` mode.
+ if i.LineRange.To >= i.LineRange.From {
+ i.Replacement = &result.Replacement{
+ // Suggest deleting unused stuff.
+ NeedOnlyDelete: true,
+ }
+ }
+ issues = append(issues, goanalysis.NewIssue(i, nil))
+ }
+ return issues
+ }).WithContextSetter(func(lintCtx *linter.Context) {
+ if lintCtx.Settings().Unused.CheckExported {
+ lintCtx.Log.Infof("Using whole program analysis for unused, it can be memory-heavy")
+ u.WholeProgram = true
+ }
+ }).WithLoadMode(goanalysis.LoadModeWholeProgram)
+ lnt.UseOriginalPackages()
+ return lnt
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/util.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/util.go
new file mode 100644
index 000000000..1940f30e3
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/util.go
@@ -0,0 +1,24 @@
+package golinters
+
+import (
+ "fmt"
+ "strings"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+)
+
+func formatCode(code string, _ *config.Config) string {
+ if strings.Contains(code, "`") {
+ return code // TODO: properly escape or remove
+ }
+
+ return fmt.Sprintf("`%s`", code)
+}
+
+func formatCodeBlock(code string, _ *config.Config) string {
+ if strings.Contains(code, "`") {
+ return code // TODO: properly escape or remove
+ }
+
+ return fmt.Sprintf("```\n%s\n```", code)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/varcheck.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/varcheck.go
new file mode 100644
index 000000000..dcf2e7de8
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/varcheck.go
@@ -0,0 +1,55 @@
+package golinters // nolint:dupl
+
+import (
+ "fmt"
+ "sync"
+
+ varcheckAPI "github.com/golangci/check/cmd/varcheck"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func NewVarcheck() *goanalysis.Linter {
+ const linterName = "varcheck"
+ var mu sync.Mutex
+ var res []goanalysis.Issue
+ analyzer := &analysis.Analyzer{
+ Name: linterName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ linterName,
+ "Finds unused global variables and constants",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ checkExported := lintCtx.Settings().Varcheck.CheckExportedFields
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ prog := goanalysis.MakeFakeLoaderProgram(pass)
+
+ varcheckIssues := varcheckAPI.Run(prog, checkExported)
+ if len(varcheckIssues) == 0 {
+ return nil, nil
+ }
+
+ issues := make([]goanalysis.Issue, 0, len(varcheckIssues))
+ for _, i := range varcheckIssues {
+ issues = append(issues, goanalysis.NewIssue(&result.Issue{
+ Pos: i.Pos,
+ Text: fmt.Sprintf("%s is unused", formatCode(i.VarName, lintCtx.Cfg)),
+ FromLinter: linterName,
+ }, pass))
+ }
+
+ mu.Lock()
+ res = append(res, issues...)
+ mu.Unlock()
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return res
+ }).WithLoadMode(goanalysis.LoadModeTypesInfo)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/whitespace.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/whitespace.go
new file mode 100644
index 000000000..d475465a2
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/whitespace.go
@@ -0,0 +1,85 @@
+package golinters
+
+import (
+ "go/token"
+ "sync"
+
+ "github.com/pkg/errors"
+ "github.com/ultraware/whitespace"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func NewWhitespace() *goanalysis.Linter {
+ const linterName = "whitespace"
+ var mu sync.Mutex
+ var resIssues []goanalysis.Issue
+
+ analyzer := &analysis.Analyzer{
+ Name: linterName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ return goanalysis.NewLinter(
+ linterName,
+ "Tool for detection of leading and trailing whitespace",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ cfg := lintCtx.Cfg.LintersSettings.Whitespace
+ settings := whitespace.Settings{MultiIf: cfg.MultiIf, MultiFunc: cfg.MultiFunc}
+
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var issues []whitespace.Message
+ for _, file := range pass.Files {
+ issues = append(issues, whitespace.Run(file, pass.Fset, settings)...)
+ }
+
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]goanalysis.Issue, len(issues))
+ for k, i := range issues {
+ issue := result.Issue{
+ Pos: token.Position{
+ Filename: i.Pos.Filename,
+ Line: i.Pos.Line,
+ },
+ LineRange: &result.Range{From: i.Pos.Line, To: i.Pos.Line},
+ Text: i.Message,
+ FromLinter: linterName,
+ Replacement: &result.Replacement{},
+ }
+
+ bracketLine, err := lintCtx.LineCache.GetLine(issue.Pos.Filename, issue.Pos.Line)
+ if err != nil {
+ return nil, errors.Wrapf(err, "failed to get line %s:%d", issue.Pos.Filename, issue.Pos.Line)
+ }
+
+ switch i.Type {
+ case whitespace.MessageTypeLeading:
+ issue.LineRange.To++ // cover two lines by the issue: opening bracket "{" (issue.Pos.Line) and following empty line
+ case whitespace.MessageTypeTrailing:
+ issue.LineRange.From-- // cover two lines by the issue: closing bracket "}" (issue.Pos.Line) and preceding empty line
+ issue.Pos.Line-- // set in sync with LineRange.From to not break fixer and other code features
+ case whitespace.MessageTypeAddAfter:
+ bracketLine += "\n"
+ }
+ issue.Replacement.NewLines = []string{bracketLine}
+
+ res[k] = goanalysis.NewIssue(&issue, pass)
+ }
+
+ mu.Lock()
+ resIssues = append(resIssues, res...)
+ mu.Unlock()
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return resIssues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/golinters/wsl.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/wsl.go
new file mode 100644
index 000000000..ca659ac4e
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/wsl.go
@@ -0,0 +1,81 @@
+package golinters
+
+import (
+ "sync"
+
+ "github.com/bombsimon/wsl/v3"
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const (
+ name = "wsl"
+)
+
+// NewWSL returns a new WSL linter.
+func NewWSL() *goanalysis.Linter {
+ var (
+ issues []goanalysis.Issue
+ mu = sync.Mutex{}
+ analyzer = &analysis.Analyzer{
+ Name: goanalysis.TheOnlyAnalyzerName,
+ Doc: goanalysis.TheOnlyanalyzerDoc,
+ }
+ )
+
+ return goanalysis.NewLinter(
+ name,
+ "Whitespace Linter - Forces you to use empty lines!",
+ []*analysis.Analyzer{analyzer},
+ nil,
+ ).WithContextSetter(func(lintCtx *linter.Context) {
+ analyzer.Run = func(pass *analysis.Pass) (interface{}, error) {
+ var (
+ files = []string{}
+ linterCfg = lintCtx.Cfg.LintersSettings.WSL
+ processorCfg = wsl.Configuration{
+ StrictAppend: linterCfg.StrictAppend,
+ AllowAssignAndCallCuddle: linterCfg.AllowAssignAndCallCuddle,
+ AllowMultiLineAssignCuddle: linterCfg.AllowMultiLineAssignCuddle,
+ AllowCuddleDeclaration: linterCfg.AllowCuddleDeclaration,
+ AllowTrailingComment: linterCfg.AllowTrailingComment,
+ AllowSeparatedLeadingComment: linterCfg.AllowSeparatedLeadingComment,
+ ForceCuddleErrCheckAndAssign: linterCfg.ForceCuddleErrCheckAndAssign,
+ ForceCaseTrailingWhitespaceLimit: linterCfg.ForceCaseTrailingWhitespaceLimit,
+ AllowCuddleWithCalls: []string{"Lock", "RLock"},
+ AllowCuddleWithRHS: []string{"Unlock", "RUnlock"},
+ ErrorVariableNames: []string{"err"},
+ }
+ )
+
+ for _, file := range pass.Files {
+ files = append(files, pass.Fset.PositionFor(file.Pos(), false).Filename)
+ }
+
+ wslErrors, _ := wsl.NewProcessorWithConfig(processorCfg).
+ ProcessFiles(files)
+
+ if len(wslErrors) == 0 {
+ return nil, nil
+ }
+
+ mu.Lock()
+ defer mu.Unlock()
+
+ for _, err := range wslErrors {
+ issues = append(issues, goanalysis.NewIssue(&result.Issue{
+ FromLinter: name,
+ Pos: err.Position,
+ Text: err.Reason,
+ }, pass))
+ }
+
+ return nil, nil
+ }
+ }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
+ return issues
+ }).WithLoadMode(goanalysis.LoadModeSyntax)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/goutil/env.go b/vendor/github.com/golangci/golangci-lint/pkg/goutil/env.go
new file mode 100644
index 000000000..1c05b9805
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/goutil/env.go
@@ -0,0 +1,61 @@
+package goutil
+
+import (
+ "context"
+ "encoding/json"
+ "os"
+ "os/exec"
+ "strings"
+ "time"
+
+ "github.com/pkg/errors"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+type EnvKey string
+
+const (
+ EnvGoCache EnvKey = "GOCACHE"
+ EnvGoRoot EnvKey = "GOROOT"
+)
+
+type Env struct {
+ vars map[string]string
+ log logutils.Log
+ debugf logutils.DebugFunc
+}
+
+func NewEnv(log logutils.Log) *Env {
+ return &Env{
+ vars: map[string]string{},
+ log: log,
+ debugf: logutils.Debug("env"),
+ }
+}
+
+func (e *Env) Discover(ctx context.Context) error {
+ startedAt := time.Now()
+ args := []string{"env", "-json"}
+ args = append(args, string(EnvGoCache), string(EnvGoRoot))
+ out, err := exec.CommandContext(ctx, "go", args...).Output()
+ if err != nil {
+ return errors.Wrap(err, "failed to run 'go env'")
+ }
+
+ if err = json.Unmarshal(out, &e.vars); err != nil {
+ return errors.Wrapf(err, "failed to parse 'go %s' json", strings.Join(args, " "))
+ }
+
+ e.debugf("Read go env for %s: %#v", time.Since(startedAt), e.vars)
+ return nil
+}
+
+func (e Env) Get(k EnvKey) string {
+ envValue := os.Getenv(string(k))
+ if envValue != "" {
+ return envValue
+ }
+
+ return e.vars[string(k)]
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/lint/linter/config.go b/vendor/github.com/golangci/golangci-lint/pkg/lint/linter/config.go
new file mode 100644
index 000000000..4ec835254
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/linter/config.go
@@ -0,0 +1,89 @@
+package linter
+
+import (
+ "golang.org/x/tools/go/packages"
+)
+
+const (
+ PresetFormatting = "format"
+ PresetComplexity = "complexity"
+ PresetStyle = "style"
+ PresetBugs = "bugs"
+ PresetUnused = "unused"
+ PresetPerformance = "performance"
+)
+
+type Config struct {
+ Linter Linter
+ EnabledByDefault bool
+
+ LoadMode packages.LoadMode
+
+ InPresets []string
+ AlternativeNames []string
+
+ OriginalURL string // URL of original (not forked) repo, needed for autogenerated README
+ CanAutoFix bool
+ IsSlow bool
+ DoesChangeTypes bool
+}
+
+func (lc *Config) ConsiderSlow() *Config {
+ lc.IsSlow = true
+ return lc
+}
+
+func (lc *Config) IsSlowLinter() bool {
+ return lc.IsSlow || (lc.LoadMode&packages.NeedTypesInfo != 0 && lc.LoadMode&packages.NeedDeps != 0)
+}
+
+func (lc *Config) WithLoadFiles() *Config {
+ lc.LoadMode |= packages.NeedName | packages.NeedFiles | packages.NeedCompiledGoFiles
+ return lc
+}
+
+func (lc *Config) WithLoadForGoAnalysis() *Config {
+ lc = lc.WithLoadFiles()
+ lc.LoadMode |= packages.NeedImports | packages.NeedDeps | packages.NeedExportsFile | packages.NeedTypesSizes
+ return lc
+}
+
+func (lc *Config) WithPresets(presets ...string) *Config {
+ lc.InPresets = presets
+ return lc
+}
+
+func (lc *Config) WithURL(url string) *Config {
+ lc.OriginalURL = url
+ return lc
+}
+
+func (lc *Config) WithAlternativeNames(names ...string) *Config {
+ lc.AlternativeNames = names
+ return lc
+}
+
+func (lc *Config) WithAutoFix() *Config {
+ lc.CanAutoFix = true
+ return lc
+}
+
+func (lc *Config) WithChangeTypes() *Config {
+ lc.DoesChangeTypes = true
+ return lc
+}
+
+func (lc *Config) AllNames() []string {
+ return append([]string{lc.Name()}, lc.AlternativeNames...)
+}
+
+func (lc *Config) Name() string {
+ return lc.Linter.Name()
+}
+
+func NewConfig(linter Linter) *Config {
+ lc := &Config{
+ Linter: linter,
+ }
+ return lc.WithLoadFiles()
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/lint/linter/context.go b/vendor/github.com/golangci/golangci-lint/pkg/lint/linter/context.go
new file mode 100644
index 000000000..a9f9d7d7f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/linter/context.go
@@ -0,0 +1,49 @@
+package linter
+
+import (
+ "go/ast"
+
+ "golang.org/x/tools/go/packages"
+
+ "github.com/golangci/golangci-lint/internal/pkgcache"
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis/load"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+type Context struct {
+ // Packages are deduplicated (test and normal packages) packages
+ Packages []*packages.Package
+
+ // OriginalPackages aren't deduplicated: they contain both normal and test
+ // version for each of packages
+ OriginalPackages []*packages.Package
+
+ Cfg *config.Config
+ FileCache *fsutils.FileCache
+ LineCache *fsutils.LineCache
+ Log logutils.Log
+
+ PkgCache *pkgcache.Cache
+ LoadGuard *load.Guard
+}
+
+func (c *Context) Settings() *config.LintersSettings {
+ return &c.Cfg.LintersSettings
+}
+
+func (c *Context) ClearTypesInPackages() {
+ for _, p := range c.Packages {
+ clearTypes(p)
+ }
+ for _, p := range c.OriginalPackages {
+ clearTypes(p)
+ }
+}
+
+func clearTypes(p *packages.Package) {
+ p.Types = nil
+ p.TypesInfo = nil
+ p.Syntax = []*ast.File{}
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/lint/linter/linter.go b/vendor/github.com/golangci/golangci-lint/pkg/lint/linter/linter.go
new file mode 100644
index 000000000..cfe9ec020
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/linter/linter.go
@@ -0,0 +1,13 @@
+package linter
+
+import (
+ "context"
+
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Linter interface {
+ Run(ctx context.Context, lintCtx *Context) ([]result.Issue, error)
+ Name() string
+ Desc() string
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/enabled_set.go b/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/enabled_set.go
new file mode 100644
index 000000000..eced95f65
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/enabled_set.go
@@ -0,0 +1,187 @@
+package lintersdb
+
+import (
+ "os"
+ "sort"
+ "strings"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+type EnabledSet struct {
+ m *Manager
+ v *Validator
+ log logutils.Log
+ cfg *config.Config
+ debugf logutils.DebugFunc
+}
+
+func NewEnabledSet(m *Manager, v *Validator, log logutils.Log, cfg *config.Config) *EnabledSet {
+ return &EnabledSet{
+ m: m,
+ v: v,
+ log: log,
+ cfg: cfg,
+ debugf: logutils.Debug("enabled_linters"),
+ }
+}
+
+func (es EnabledSet) build(lcfg *config.Linters, enabledByDefaultLinters []*linter.Config) map[string]*linter.Config {
+ es.debugf("Linters config: %#v", lcfg)
+ resultLintersSet := map[string]*linter.Config{}
+ switch {
+ case len(lcfg.Presets) != 0:
+ break // imply --disable-all
+ case lcfg.EnableAll:
+ resultLintersSet = linterConfigsToMap(es.m.GetAllSupportedLinterConfigs())
+ case lcfg.DisableAll:
+ break
+ default:
+ resultLintersSet = linterConfigsToMap(enabledByDefaultLinters)
+ }
+
+ // --presets can only add linters to default set
+ for _, p := range lcfg.Presets {
+ for _, lc := range es.m.GetAllLinterConfigsForPreset(p) {
+ lc := lc
+ resultLintersSet[lc.Name()] = lc
+ }
+ }
+
+ // --fast removes slow linters from current set.
+ // It should be after --presets to be able to run only fast linters in preset.
+ // It should be before --enable and --disable to be able to enable or disable specific linter.
+ if lcfg.Fast {
+ for name, lc := range resultLintersSet {
+ if lc.IsSlowLinter() {
+ delete(resultLintersSet, name)
+ }
+ }
+ }
+
+ for _, name := range lcfg.Enable {
+ for _, lc := range es.m.GetLinterConfigs(name) {
+ // it's important to use lc.Name() nor name because name can be alias
+ resultLintersSet[lc.Name()] = lc
+ }
+ }
+
+ for _, name := range lcfg.Disable {
+ for _, lc := range es.m.GetLinterConfigs(name) {
+ // it's important to use lc.Name() nor name because name can be alias
+ delete(resultLintersSet, lc.Name())
+ }
+ }
+
+ return resultLintersSet
+}
+
+func (es EnabledSet) GetEnabledLintersMap() (map[string]*linter.Config, error) {
+ if err := es.v.validateEnabledDisabledLintersConfig(&es.cfg.Linters); err != nil {
+ return nil, err
+ }
+
+ enabledLinters := es.build(&es.cfg.Linters, es.m.GetAllEnabledByDefaultLinters())
+ if os.Getenv("GL_TEST_RUN") == "1" {
+ es.verbosePrintLintersStatus(enabledLinters)
+ }
+ return enabledLinters, nil
+}
+
+// GetOptimizedLinters returns enabled linters after optimization (merging) of multiple linters
+// into a fewer number of linters. E.g. some go/analysis linters can be optimized into
+// one metalinter for data reuse and speed up.
+func (es EnabledSet) GetOptimizedLinters() ([]*linter.Config, error) {
+ if err := es.v.validateEnabledDisabledLintersConfig(&es.cfg.Linters); err != nil {
+ return nil, err
+ }
+
+ resultLintersSet := es.build(&es.cfg.Linters, es.m.GetAllEnabledByDefaultLinters())
+ es.verbosePrintLintersStatus(resultLintersSet)
+ es.combineGoAnalysisLinters(resultLintersSet)
+
+ var resultLinters []*linter.Config
+ for _, lc := range resultLintersSet {
+ resultLinters = append(resultLinters, lc)
+ }
+
+ // Make order of execution of linters (go/analysis metalinter and unused) stable.
+ sort.Slice(resultLinters, func(i, j int) bool {
+ a, b := resultLinters[i], resultLinters[j]
+ if a.DoesChangeTypes != b.DoesChangeTypes {
+ return b.DoesChangeTypes // move type-changing linters to the end to optimize speed
+ }
+ return strings.Compare(a.Name(), b.Name()) < 0
+ })
+
+ return resultLinters, nil
+}
+
+func (es EnabledSet) combineGoAnalysisLinters(linters map[string]*linter.Config) {
+ var goanalysisLinters []*goanalysis.Linter
+ goanalysisPresets := map[string]bool{}
+ for _, linter := range linters {
+ lnt, ok := linter.Linter.(*goanalysis.Linter)
+ if !ok {
+ continue
+ }
+ if lnt.LoadMode() == goanalysis.LoadModeWholeProgram {
+ // It's ineffective by CPU and memory to run whole-program and incremental analyzers at once.
+ continue
+ }
+ goanalysisLinters = append(goanalysisLinters, lnt)
+ for _, p := range linter.InPresets {
+ goanalysisPresets[p] = true
+ }
+ }
+
+ if len(goanalysisLinters) <= 1 {
+ es.debugf("Didn't combine go/analysis linters: got only %d linters", len(goanalysisLinters))
+ return
+ }
+
+ for _, lnt := range goanalysisLinters {
+ delete(linters, lnt.Name())
+ }
+
+ // Make order of execution of go/analysis analyzers stable.
+ sort.Slice(goanalysisLinters, func(i, j int) bool {
+ return strings.Compare(goanalysisLinters[i].Name(), goanalysisLinters[j].Name()) <= 0
+ })
+ ml := goanalysis.NewMetaLinter(goanalysisLinters)
+
+ var presets []string
+ for p := range goanalysisPresets {
+ presets = append(presets, p)
+ }
+
+ mlConfig := &linter.Config{
+ Linter: ml,
+ EnabledByDefault: false,
+ InPresets: presets,
+ AlternativeNames: nil,
+ OriginalURL: "",
+ }
+
+ mlConfig = mlConfig.WithLoadForGoAnalysis()
+
+ linters[ml.Name()] = mlConfig
+ es.debugf("Combined %d go/analysis linters into one metalinter", len(goanalysisLinters))
+}
+
+func (es EnabledSet) verbosePrintLintersStatus(lcs map[string]*linter.Config) {
+ var linterNames []string
+ for _, lc := range lcs {
+ linterNames = append(linterNames, lc.Name())
+ }
+ sort.StringSlice(linterNames).Sort()
+ es.log.Infof("Active %d linters: %s", len(linterNames), linterNames)
+
+ if len(es.cfg.Linters.Presets) != 0 {
+ sort.StringSlice(es.cfg.Linters.Presets).Sort()
+ es.log.Infof("Active presets: %s", es.cfg.Linters.Presets)
+ }
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go b/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go
new file mode 100644
index 000000000..1ec78de28
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go
@@ -0,0 +1,374 @@
+package lintersdb
+
+import (
+ "fmt"
+ "os"
+ "plugin"
+
+ "golang.org/x/tools/go/analysis"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/golinters"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/report"
+)
+
+type Manager struct {
+ nameToLCs map[string][]*linter.Config
+ cfg *config.Config
+ log logutils.Log
+}
+
+func NewManager(cfg *config.Config, log logutils.Log) *Manager {
+ m := &Manager{cfg: cfg, log: log}
+ nameToLCs := make(map[string][]*linter.Config)
+ for _, lc := range m.GetAllSupportedLinterConfigs() {
+ for _, name := range lc.AllNames() {
+ nameToLCs[name] = append(nameToLCs[name], lc)
+ }
+ }
+
+ m.nameToLCs = nameToLCs
+ return m
+}
+
+func (m *Manager) WithCustomLinters() *Manager {
+ if m.log == nil {
+ m.log = report.NewLogWrapper(logutils.NewStderrLog(""), &report.Data{})
+ }
+ if m.cfg != nil {
+ for name, settings := range m.cfg.LintersSettings.Custom {
+ lc, err := m.loadCustomLinterConfig(name, settings)
+
+ if err != nil {
+ m.log.Errorf("Unable to load custom analyzer %s:%s, %v",
+ name,
+ settings.Path,
+ err)
+ } else {
+ m.nameToLCs[name] = append(m.nameToLCs[name], lc)
+ }
+ }
+ }
+ return m
+}
+
+func (Manager) AllPresets() []string {
+ return []string{linter.PresetBugs, linter.PresetComplexity, linter.PresetFormatting,
+ linter.PresetPerformance, linter.PresetStyle, linter.PresetUnused}
+}
+
+func (m Manager) allPresetsSet() map[string]bool {
+ ret := map[string]bool{}
+ for _, p := range m.AllPresets() {
+ ret[p] = true
+ }
+ return ret
+}
+
+func (m Manager) GetLinterConfigs(name string) []*linter.Config {
+ return m.nameToLCs[name]
+}
+
+func enableLinterConfigs(lcs []*linter.Config, isEnabled func(lc *linter.Config) bool) []*linter.Config {
+ var ret []*linter.Config
+ for _, lc := range lcs {
+ lc := lc
+ lc.EnabledByDefault = isEnabled(lc)
+ ret = append(ret, lc)
+ }
+
+ return ret
+}
+
+//nolint:funlen
+func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
+ var govetCfg *config.GovetSettings
+ var testpackageCfg *config.TestpackageSettings
+ if m.cfg != nil {
+ govetCfg = &m.cfg.LintersSettings.Govet
+ testpackageCfg = &m.cfg.LintersSettings.Testpackage
+ }
+ const megacheckName = "megacheck"
+ lcs := []*linter.Config{
+ linter.NewConfig(golinters.NewGovet(govetCfg)).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetBugs).
+ WithAlternativeNames("vet", "vetshadow").
+ WithURL("https://golang.org/cmd/vet/"),
+ linter.NewConfig(golinters.NewBodyclose()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetPerformance, linter.PresetBugs).
+ WithURL("https://github.com/timakin/bodyclose"),
+ linter.NewConfig(golinters.NewErrcheck()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetBugs).
+ WithURL("https://github.com/kisielk/errcheck"),
+ linter.NewConfig(golinters.NewGolint()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/golang/lint"),
+ linter.NewConfig(golinters.NewRowsErrCheck()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetPerformance, linter.PresetBugs).
+ WithURL("https://github.com/jingyugao/rowserrcheck"),
+
+ linter.NewConfig(golinters.NewStaticcheck()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetBugs).
+ WithAlternativeNames(megacheckName).
+ WithURL("https://staticcheck.io/"),
+ linter.NewConfig(golinters.NewUnused()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetUnused).
+ WithAlternativeNames(megacheckName).
+ ConsiderSlow().
+ WithChangeTypes().
+ WithURL("https://github.com/dominikh/go-tools/tree/master/unused"),
+ linter.NewConfig(golinters.NewGosimple()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetStyle).
+ WithAlternativeNames(megacheckName).
+ WithURL("https://github.com/dominikh/go-tools/tree/master/simple"),
+ linter.NewConfig(golinters.NewStylecheck()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/dominikh/go-tools/tree/master/stylecheck"),
+
+ linter.NewConfig(golinters.NewGosec()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetBugs).
+ WithURL("https://github.com/securego/gosec").
+ WithAlternativeNames("gas"),
+ linter.NewConfig(golinters.NewStructcheck()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetUnused).
+ WithURL("https://github.com/opennota/check"),
+ linter.NewConfig(golinters.NewVarcheck()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetUnused).
+ WithURL("https://github.com/opennota/check"),
+ linter.NewConfig(golinters.NewInterfacer()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/mvdan/interfacer"),
+ linter.NewConfig(golinters.NewUnconvert()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/mdempsky/unconvert"),
+ linter.NewConfig(golinters.NewIneffassign()).
+ WithPresets(linter.PresetUnused).
+ WithURL("https://github.com/gordonklaus/ineffassign"),
+ linter.NewConfig(golinters.NewDupl()).
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/mibk/dupl"),
+ linter.NewConfig(golinters.NewGoconst()).
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/jgautheron/goconst"),
+ linter.NewConfig(golinters.NewDeadcode()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetUnused).
+ WithURL("https://github.com/remyoudompheng/go-misc/tree/master/deadcode"),
+ linter.NewConfig(golinters.NewGocyclo()).
+ WithPresets(linter.PresetComplexity).
+ WithURL("https://github.com/alecthomas/gocyclo"),
+ linter.NewConfig(golinters.NewGocognit()).
+ WithPresets(linter.PresetComplexity).
+ WithURL("https://github.com/uudashr/gocognit"),
+ linter.NewConfig(golinters.NewTypecheck()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetBugs).
+ WithURL(""),
+ linter.NewConfig(golinters.NewAsciicheck()).
+ WithPresets(linter.PresetBugs, linter.PresetStyle).
+ WithURL("https://github.com/tdakkota/asciicheck"),
+
+ linter.NewConfig(golinters.NewGofmt()).
+ WithPresets(linter.PresetFormatting).
+ WithAutoFix().
+ WithURL("https://golang.org/cmd/gofmt/"),
+ linter.NewConfig(golinters.NewGoimports()).
+ WithPresets(linter.PresetFormatting).
+ WithAutoFix().
+ WithURL("https://godoc.org/golang.org/x/tools/cmd/goimports"),
+ linter.NewConfig(golinters.NewMaligned()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetPerformance).
+ WithURL("https://github.com/mdempsky/maligned"),
+ linter.NewConfig(golinters.NewDepguard()).
+ WithLoadForGoAnalysis().
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/OpenPeeDeeP/depguard"),
+ linter.NewConfig(golinters.NewMisspell()).
+ WithPresets(linter.PresetStyle).
+ WithAutoFix().
+ WithURL("https://github.com/client9/misspell"),
+ linter.NewConfig(golinters.NewLLL()).
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/walle/lll"),
+ linter.NewConfig(golinters.NewUnparam()).
+ WithPresets(linter.PresetUnused).
+ WithLoadForGoAnalysis().
+ WithURL("https://github.com/mvdan/unparam"),
+ linter.NewConfig(golinters.NewDogsled()).
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/alexkohler/dogsled"),
+ linter.NewConfig(golinters.NewNakedret()).
+ WithPresets(linter.PresetComplexity).
+ WithURL("https://github.com/alexkohler/nakedret"),
+ linter.NewConfig(golinters.NewPrealloc()).
+ WithPresets(linter.PresetPerformance).
+ WithURL("https://github.com/alexkohler/prealloc"),
+ linter.NewConfig(golinters.NewScopelint()).
+ WithPresets(linter.PresetBugs).
+ WithURL("https://github.com/kyoh86/scopelint"),
+ linter.NewConfig(golinters.NewGocritic()).
+ WithPresets(linter.PresetStyle).
+ WithLoadForGoAnalysis().
+ WithURL("https://github.com/go-critic/go-critic"),
+ linter.NewConfig(golinters.NewGochecknoinits()).
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/leighmcculloch/gochecknoinits"),
+ linter.NewConfig(golinters.NewGochecknoglobals()).
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/leighmcculloch/gochecknoglobals"),
+ linter.NewConfig(golinters.NewGodox()).
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/matoous/godox"),
+ linter.NewConfig(golinters.NewFunlen()).
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/ultraware/funlen"),
+ linter.NewConfig(golinters.NewWhitespace()).
+ WithPresets(linter.PresetStyle).
+ WithAutoFix().
+ WithURL("https://github.com/ultraware/whitespace"),
+ linter.NewConfig(golinters.NewWSL()).
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/bombsimon/wsl"),
+ linter.NewConfig(golinters.NewGoPrintfFuncName()).
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/jirfag/go-printf-func-name"),
+ linter.NewConfig(golinters.NewGoMND(m.cfg)).
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/tommy-muehle/go-mnd"),
+ linter.NewConfig(golinters.NewGoerr113()).
+ WithPresets(linter.PresetStyle).
+ WithLoadForGoAnalysis().
+ WithURL("https://github.com/Djarvur/go-err113"),
+ linter.NewConfig(golinters.NewGomodguard()).
+ WithPresets(linter.PresetStyle).
+ WithLoadForGoAnalysis().
+ WithURL("https://github.com/ryancurrah/gomodguard"),
+ linter.NewConfig(golinters.NewGodot()).
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/tetafro/godot"),
+ linter.NewConfig(golinters.NewTestpackage(testpackageCfg)).
+ WithPresets(linter.PresetStyle).
+ WithLoadForGoAnalysis().
+ WithURL("https://github.com/maratori/testpackage"),
+ linter.NewConfig(golinters.NewNestif()).
+ WithPresets(linter.PresetComplexity).
+ WithURL("https://github.com/nakabonne/nestif"),
+ // nolintlint must be last because it looks at the results of all the previous linters for unused nolint directives
+ linter.NewConfig(golinters.NewNoLintLint()).
+ WithPresets(linter.PresetStyle).
+ WithURL("https://github.com/golangci-lint/pkg/golinters/nolintlint"),
+ }
+
+ isLocalRun := os.Getenv("GOLANGCI_COM_RUN") == ""
+ enabledByDefault := map[string]bool{
+ golinters.NewGovet(nil).Name(): true,
+ golinters.NewErrcheck().Name(): true,
+ golinters.NewStaticcheck().Name(): true,
+ golinters.NewUnused().Name(): true,
+ golinters.NewGosimple().Name(): true,
+ golinters.NewStructcheck().Name(): true,
+ golinters.NewVarcheck().Name(): true,
+ golinters.NewIneffassign().Name(): true,
+ golinters.NewDeadcode().Name(): true,
+
+ // don't typecheck for golangci.com: too many troubles
+ golinters.NewTypecheck().Name(): isLocalRun,
+ }
+ return enableLinterConfigs(lcs, func(lc *linter.Config) bool {
+ return enabledByDefault[lc.Name()]
+ })
+}
+
+func (m Manager) GetAllEnabledByDefaultLinters() []*linter.Config {
+ var ret []*linter.Config
+ for _, lc := range m.GetAllSupportedLinterConfigs() {
+ if lc.EnabledByDefault {
+ ret = append(ret, lc)
+ }
+ }
+
+ return ret
+}
+
+func linterConfigsToMap(lcs []*linter.Config) map[string]*linter.Config {
+ ret := map[string]*linter.Config{}
+ for _, lc := range lcs {
+ lc := lc // local copy
+ ret[lc.Name()] = lc
+ }
+
+ return ret
+}
+
+func (m Manager) GetAllLinterConfigsForPreset(p string) []*linter.Config {
+ var ret []*linter.Config
+ for _, lc := range m.GetAllSupportedLinterConfigs() {
+ for _, ip := range lc.InPresets {
+ if p == ip {
+ ret = append(ret, lc)
+ break
+ }
+ }
+ }
+
+ return ret
+}
+
+func (m Manager) loadCustomLinterConfig(name string, settings config.CustomLinterSettings) (*linter.Config, error) {
+ analyzer, err := m.getAnalyzerPlugin(settings.Path)
+ if err != nil {
+ return nil, err
+ }
+ m.log.Infof("Loaded %s: %s", settings.Path, name)
+ customLinter := goanalysis.NewLinter(
+ name,
+ settings.Description,
+ analyzer.GetAnalyzers(),
+ nil).WithLoadMode(goanalysis.LoadModeTypesInfo)
+ linterConfig := linter.NewConfig(customLinter)
+ linterConfig.EnabledByDefault = true
+ linterConfig.IsSlow = false
+ linterConfig.WithURL(settings.OriginalURL)
+ return linterConfig, nil
+}
+
+type AnalyzerPlugin interface {
+ GetAnalyzers() []*analysis.Analyzer
+}
+
+func (m Manager) getAnalyzerPlugin(path string) (AnalyzerPlugin, error) {
+ plug, err := plugin.Open(path)
+ if err != nil {
+ return nil, err
+ }
+
+ symbol, err := plug.Lookup("AnalyzerPlugin")
+ if err != nil {
+ return nil, err
+ }
+
+ analyzerPlugin, ok := symbol.(AnalyzerPlugin)
+ if !ok {
+ return nil, fmt.Errorf("plugin %s does not abide by 'AnalyzerPlugin' interface", path)
+ }
+
+ return analyzerPlugin, nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/validator.go b/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/validator.go
new file mode 100644
index 000000000..d7e3699c8
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/validator.go
@@ -0,0 +1,99 @@
+package lintersdb
+
+import (
+ "fmt"
+ "strings"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+)
+
+type Validator struct {
+ m *Manager
+}
+
+func NewValidator(m *Manager) *Validator {
+ return &Validator{
+ m: m,
+ }
+}
+
+func (v Validator) validateLintersNames(cfg *config.Linters) error {
+ allNames := append([]string{}, cfg.Enable...)
+ allNames = append(allNames, cfg.Disable...)
+ for _, name := range allNames {
+ if v.m.GetLinterConfigs(name) == nil {
+ return fmt.Errorf("no such linter %q", name)
+ }
+ }
+
+ return nil
+}
+
+func (v Validator) validatePresets(cfg *config.Linters) error {
+ allPresets := v.m.allPresetsSet()
+ for _, p := range cfg.Presets {
+ if !allPresets[p] {
+ return fmt.Errorf("no such preset %q: only next presets exist: (%s)",
+ p, strings.Join(v.m.AllPresets(), "|"))
+ }
+ }
+
+ if len(cfg.Presets) != 0 && cfg.EnableAll {
+ return fmt.Errorf("--presets is incompatible with --enable-all")
+ }
+
+ return nil
+}
+
+func (v Validator) validateAllDisableEnableOptions(cfg *config.Linters) error {
+ if cfg.EnableAll && cfg.DisableAll {
+ return fmt.Errorf("--enable-all and --disable-all options must not be combined")
+ }
+
+ if cfg.DisableAll {
+ if len(cfg.Enable) == 0 && len(cfg.Presets) == 0 {
+ return fmt.Errorf("all linters were disabled, but no one linter was enabled: must enable at least one")
+ }
+
+ if len(cfg.Disable) != 0 {
+ return fmt.Errorf("can't combine options --disable-all and --disable %s", cfg.Disable[0])
+ }
+ }
+
+ if cfg.EnableAll && len(cfg.Enable) != 0 && !cfg.Fast {
+ return fmt.Errorf("can't combine options --enable-all and --enable %s", cfg.Enable[0])
+ }
+
+ return nil
+}
+
+func (v Validator) validateDisabledAndEnabledAtOneMoment(cfg *config.Linters) error {
+ enabledLintersSet := map[string]bool{}
+ for _, name := range cfg.Enable {
+ enabledLintersSet[name] = true
+ }
+
+ for _, name := range cfg.Disable {
+ if enabledLintersSet[name] {
+ return fmt.Errorf("linter %q can't be disabled and enabled at one moment", name)
+ }
+ }
+
+ return nil
+}
+
+func (v Validator) validateEnabledDisabledLintersConfig(cfg *config.Linters) error {
+ validators := []func(cfg *config.Linters) error{
+ v.validateLintersNames,
+ v.validatePresets,
+ v.validateAllDisableEnableOptions,
+ v.validateDisabledAndEnabledAtOneMoment,
+ }
+ for _, v := range validators {
+ if err := v(cfg); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/lint/load.go b/vendor/github.com/golangci/golangci-lint/pkg/lint/load.go
new file mode 100644
index 000000000..e2928a57a
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/load.go
@@ -0,0 +1,308 @@
+package lint
+
+import (
+ "context"
+ "fmt"
+ "go/build"
+ "go/token"
+ "os"
+ "path/filepath"
+ "regexp"
+ "strings"
+ "time"
+
+ "github.com/pkg/errors"
+ "golang.org/x/tools/go/packages"
+
+ "github.com/golangci/golangci-lint/internal/pkgcache"
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/exitcodes"
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/golinters/goanalysis/load"
+ "github.com/golangci/golangci-lint/pkg/goutil"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+type ContextLoader struct {
+ cfg *config.Config
+ log logutils.Log
+ debugf logutils.DebugFunc
+ goenv *goutil.Env
+ pkgTestIDRe *regexp.Regexp
+ lineCache *fsutils.LineCache
+ fileCache *fsutils.FileCache
+ pkgCache *pkgcache.Cache
+ loadGuard *load.Guard
+}
+
+func NewContextLoader(cfg *config.Config, log logutils.Log, goenv *goutil.Env,
+ lineCache *fsutils.LineCache, fileCache *fsutils.FileCache, pkgCache *pkgcache.Cache, loadGuard *load.Guard) *ContextLoader {
+ return &ContextLoader{
+ cfg: cfg,
+ log: log,
+ debugf: logutils.Debug("loader"),
+ goenv: goenv,
+ pkgTestIDRe: regexp.MustCompile(`^(.*) \[(.*)\.test\]`),
+ lineCache: lineCache,
+ fileCache: fileCache,
+ pkgCache: pkgCache,
+ loadGuard: loadGuard,
+ }
+}
+
+func (cl *ContextLoader) prepareBuildContext() {
+ // Set GOROOT to have working cross-compilation: cross-compiled binaries
+ // have invalid GOROOT. XXX: can't use runtime.GOROOT().
+ goroot := cl.goenv.Get(goutil.EnvGoRoot)
+ if goroot == "" {
+ return
+ }
+
+ os.Setenv("GOROOT", goroot)
+ build.Default.GOROOT = goroot
+ build.Default.BuildTags = cl.cfg.Run.BuildTags
+}
+
+func (cl *ContextLoader) findLoadMode(linters []*linter.Config) packages.LoadMode {
+ loadMode := packages.LoadMode(0)
+ for _, lc := range linters {
+ loadMode |= lc.LoadMode
+ }
+
+ return loadMode
+}
+
+func (cl *ContextLoader) buildArgs() []string {
+ args := cl.cfg.Run.Args
+ if len(args) == 0 {
+ return []string{"./..."}
+ }
+
+ var retArgs []string
+ for _, arg := range args {
+ if strings.HasPrefix(arg, ".") || filepath.IsAbs(arg) {
+ retArgs = append(retArgs, arg)
+ } else {
+ // go/packages doesn't work well if we don't have prefix ./ for local packages
+ retArgs = append(retArgs, fmt.Sprintf(".%c%s", filepath.Separator, arg))
+ }
+ }
+
+ return retArgs
+}
+
+func (cl *ContextLoader) makeBuildFlags() ([]string, error) {
+ var buildFlags []string
+
+ if len(cl.cfg.Run.BuildTags) != 0 {
+ // go help build
+ buildFlags = append(buildFlags, "-tags", strings.Join(cl.cfg.Run.BuildTags, " "))
+ cl.log.Infof("Using build tags: %v", cl.cfg.Run.BuildTags)
+ }
+
+ mod := cl.cfg.Run.ModulesDownloadMode
+ if mod != "" {
+ // go help modules
+ allowedMods := []string{"release", "readonly", "vendor"}
+ var ok bool
+ for _, am := range allowedMods {
+ if am == mod {
+ ok = true
+ break
+ }
+ }
+ if !ok {
+ return nil, fmt.Errorf("invalid modules download path %s, only (%s) allowed", mod, strings.Join(allowedMods, "|"))
+ }
+
+ buildFlags = append(buildFlags, fmt.Sprintf("-mod=%s", cl.cfg.Run.ModulesDownloadMode))
+ }
+
+ return buildFlags, nil
+}
+
+func stringifyLoadMode(mode packages.LoadMode) string {
+ m := map[packages.LoadMode]string{
+ packages.NeedCompiledGoFiles: "compiled_files",
+ packages.NeedDeps: "deps",
+ packages.NeedExportsFile: "exports_file",
+ packages.NeedFiles: "files",
+ packages.NeedImports: "imports",
+ packages.NeedName: "name",
+ packages.NeedSyntax: "syntax",
+ packages.NeedTypes: "types",
+ packages.NeedTypesInfo: "types_info",
+ packages.NeedTypesSizes: "types_sizes",
+ }
+
+ var flags []string
+ for flag, flagStr := range m {
+ if mode&flag != 0 {
+ flags = append(flags, flagStr)
+ }
+ }
+
+ return fmt.Sprintf("%d (%s)", mode, strings.Join(flags, "|"))
+}
+
+func (cl *ContextLoader) debugPrintLoadedPackages(pkgs []*packages.Package) {
+ cl.debugf("loaded %d pkgs", len(pkgs))
+ for i, pkg := range pkgs {
+ var syntaxFiles []string
+ for _, sf := range pkg.Syntax {
+ syntaxFiles = append(syntaxFiles, pkg.Fset.Position(sf.Pos()).Filename)
+ }
+ cl.debugf("Loaded pkg #%d: ID=%s GoFiles=%s CompiledGoFiles=%s Syntax=%s",
+ i, pkg.ID, pkg.GoFiles, pkg.CompiledGoFiles, syntaxFiles)
+ }
+}
+
+func (cl *ContextLoader) parseLoadedPackagesErrors(pkgs []*packages.Package) error {
+ for _, pkg := range pkgs {
+ for _, err := range pkg.Errors {
+ if strings.Contains(err.Msg, "no Go files") {
+ return errors.Wrapf(exitcodes.ErrNoGoFiles, "package %s", pkg.PkgPath)
+ }
+ if strings.Contains(err.Msg, "cannot find package") {
+ // when analyzing not existing directory
+ return errors.Wrap(exitcodes.ErrFailure, err.Msg)
+ }
+ }
+ }
+
+ return nil
+}
+
+func (cl *ContextLoader) loadPackages(ctx context.Context, loadMode packages.LoadMode) ([]*packages.Package, error) {
+ defer func(startedAt time.Time) {
+ cl.log.Infof("Go packages loading at mode %s took %s", stringifyLoadMode(loadMode), time.Since(startedAt))
+ }(time.Now())
+
+ cl.prepareBuildContext()
+
+ buildFlags, err := cl.makeBuildFlags()
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to make build flags for go list")
+ }
+
+ conf := &packages.Config{
+ Mode: loadMode,
+ Tests: cl.cfg.Run.AnalyzeTests,
+ Context: ctx,
+ BuildFlags: buildFlags,
+ Logf: cl.debugf,
+ //TODO: use fset, parsefile, overlay
+ }
+
+ args := cl.buildArgs()
+ cl.debugf("Built loader args are %s", args)
+ pkgs, err := packages.Load(conf, args...)
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to load program with go/packages")
+ }
+
+ if loadMode&packages.NeedSyntax == 0 {
+ // Needed e.g. for go/analysis loading.
+ fset := token.NewFileSet()
+ packages.Visit(pkgs, nil, func(pkg *packages.Package) {
+ pkg.Fset = fset
+ cl.loadGuard.AddMutexForPkg(pkg)
+ })
+ }
+
+ cl.debugPrintLoadedPackages(pkgs)
+
+ if err := cl.parseLoadedPackagesErrors(pkgs); err != nil {
+ return nil, err
+ }
+
+ return cl.filterTestMainPackages(pkgs), nil
+}
+
+func (cl *ContextLoader) tryParseTestPackage(pkg *packages.Package) (name string, isTest bool) {
+ matches := cl.pkgTestIDRe.FindStringSubmatch(pkg.ID)
+ if matches == nil {
+ return "", false
+ }
+
+ return matches[1], true
+}
+
+func (cl *ContextLoader) filterTestMainPackages(pkgs []*packages.Package) []*packages.Package {
+ var retPkgs []*packages.Package
+ for _, pkg := range pkgs {
+ if pkg.Name == "main" && strings.HasSuffix(pkg.PkgPath, ".test") {
+ // it's an implicit testmain package
+ cl.debugf("skip pkg ID=%s", pkg.ID)
+ continue
+ }
+
+ retPkgs = append(retPkgs, pkg)
+ }
+
+ return retPkgs
+}
+
+func (cl *ContextLoader) filterDuplicatePackages(pkgs []*packages.Package) []*packages.Package {
+ packagesWithTests := map[string]bool{}
+ for _, pkg := range pkgs {
+ name, isTest := cl.tryParseTestPackage(pkg)
+ if !isTest {
+ continue
+ }
+ packagesWithTests[name] = true
+ }
+
+ cl.debugf("package with tests: %#v", packagesWithTests)
+
+ var retPkgs []*packages.Package
+ for _, pkg := range pkgs {
+ _, isTest := cl.tryParseTestPackage(pkg)
+ if !isTest && packagesWithTests[pkg.PkgPath] {
+ // If tests loading is enabled,
+ // for package with files a.go and a_test.go go/packages loads two packages:
+ // 1. ID=".../a" GoFiles=[a.go]
+ // 2. ID=".../a [.../a.test]" GoFiles=[a.go a_test.go]
+ // We need only the second package, otherwise we can get warnings about unused variables/fields/functions
+ // in a.go if they are used only in a_test.go.
+ cl.debugf("skip pkg ID=%s because we load it with test package", pkg.ID)
+ continue
+ }
+
+ retPkgs = append(retPkgs, pkg)
+ }
+
+ return retPkgs
+}
+
+func (cl *ContextLoader) Load(ctx context.Context, linters []*linter.Config) (*linter.Context, error) {
+ loadMode := cl.findLoadMode(linters)
+ pkgs, err := cl.loadPackages(ctx, loadMode)
+ if err != nil {
+ return nil, err
+ }
+
+ deduplicatedPkgs := cl.filterDuplicatePackages(pkgs)
+
+ if len(deduplicatedPkgs) == 0 {
+ return nil, exitcodes.ErrNoGoFiles
+ }
+
+ ret := &linter.Context{
+ Packages: deduplicatedPkgs,
+
+ // At least `unused` linters works properly only on original (not deduplicated) packages,
+ // see https://github.com/golangci/golangci-lint/pull/585.
+ OriginalPackages: pkgs,
+
+ Cfg: cl.cfg,
+ Log: cl.log,
+ FileCache: cl.fileCache,
+ LineCache: cl.lineCache,
+ PkgCache: cl.pkgCache,
+ LoadGuard: cl.loadGuard,
+ }
+
+ return ret, nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/lint/runner.go b/vendor/github.com/golangci/golangci-lint/pkg/lint/runner.go
new file mode 100644
index 000000000..05dc51ba9
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/runner.go
@@ -0,0 +1,256 @@
+package lint
+
+import (
+ "context"
+ "fmt"
+ "os"
+ "runtime/debug"
+ "strings"
+
+ "github.com/pkg/errors"
+
+ "github.com/golangci/golangci-lint/internal/errorutil"
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/goutil"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/lint/lintersdb"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/packages"
+ "github.com/golangci/golangci-lint/pkg/result"
+ "github.com/golangci/golangci-lint/pkg/result/processors"
+ "github.com/golangci/golangci-lint/pkg/timeutils"
+
+ gopackages "golang.org/x/tools/go/packages"
+)
+
+type Runner struct {
+ Processors []processors.Processor
+ Log logutils.Log
+}
+
+func NewRunner(cfg *config.Config, log logutils.Log, goenv *goutil.Env, es *lintersdb.EnabledSet,
+ lineCache *fsutils.LineCache, dbManager *lintersdb.Manager, pkgs []*gopackages.Package) (*Runner, error) {
+ icfg := cfg.Issues
+ excludePatterns := icfg.ExcludePatterns
+ if icfg.UseDefaultExcludes {
+ excludePatterns = append(excludePatterns, config.GetExcludePatternsStrings(icfg.IncludeDefaultExcludes)...)
+ }
+
+ var excludeTotalPattern string
+ if len(excludePatterns) != 0 {
+ excludeTotalPattern = fmt.Sprintf("(%s)", strings.Join(excludePatterns, "|"))
+ }
+
+ var excludeProcessor processors.Processor
+ if cfg.Issues.ExcludeCaseSensitive {
+ excludeProcessor = processors.NewExcludeCaseSensitive(excludeTotalPattern)
+ } else {
+ excludeProcessor = processors.NewExclude(excludeTotalPattern)
+ }
+
+ skipFilesProcessor, err := processors.NewSkipFiles(cfg.Run.SkipFiles)
+ if err != nil {
+ return nil, err
+ }
+
+ skipDirs := cfg.Run.SkipDirs
+ if cfg.Run.UseDefaultSkipDirs {
+ skipDirs = append(skipDirs, packages.StdExcludeDirRegexps...)
+ }
+ skipDirsProcessor, err := processors.NewSkipDirs(skipDirs, log.Child("skip dirs"), cfg.Run.Args)
+ if err != nil {
+ return nil, err
+ }
+
+ var excludeRules []processors.ExcludeRule
+ for _, r := range icfg.ExcludeRules {
+ excludeRules = append(excludeRules, processors.ExcludeRule{
+ Text: r.Text,
+ Source: r.Source,
+ Path: r.Path,
+ Linters: r.Linters,
+ })
+ }
+ var excludeRulesProcessor processors.Processor
+ if cfg.Issues.ExcludeCaseSensitive {
+ excludeRulesProcessor = processors.NewExcludeRulesCaseSensitive(excludeRules, lineCache, log.Child("exclude_rules"))
+ } else {
+ excludeRulesProcessor = processors.NewExcludeRules(excludeRules, lineCache, log.Child("exclude_rules"))
+ }
+
+ enabledLinters, err := es.GetEnabledLintersMap()
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to get enabled linters")
+ }
+
+ return &Runner{
+ Processors: []processors.Processor{
+ processors.NewCgo(goenv),
+
+ // Must go after Cgo.
+ processors.NewFilenameUnadjuster(pkgs, log.Child("filename_unadjuster")),
+
+ // Must be before diff, nolint and exclude autogenerated processor at least.
+ processors.NewPathPrettifier(),
+ skipFilesProcessor,
+ skipDirsProcessor, // must be after path prettifier
+
+ processors.NewAutogeneratedExclude(),
+
+ // Must be before exclude because users see already marked output and configure excluding by it.
+ processors.NewIdentifierMarker(),
+
+ excludeProcessor,
+ excludeRulesProcessor,
+ processors.NewNolint(log.Child("nolint"), dbManager, enabledLinters),
+
+ processors.NewUniqByLine(cfg),
+ processors.NewDiff(icfg.Diff, icfg.DiffFromRevision, icfg.DiffPatchFilePath),
+ processors.NewMaxPerFileFromLinter(cfg),
+ processors.NewMaxSameIssues(icfg.MaxSameIssues, log.Child("max_same_issues"), cfg),
+ processors.NewMaxFromLinter(icfg.MaxIssuesPerLinter, log.Child("max_from_linter"), cfg),
+ processors.NewSourceCode(lineCache, log.Child("source_code")),
+ processors.NewPathShortener(),
+ },
+ Log: log,
+ }, nil
+}
+
+func (r *Runner) runLinterSafe(ctx context.Context, lintCtx *linter.Context,
+ lc *linter.Config) (ret []result.Issue, err error) {
+ defer func() {
+ if panicData := recover(); panicData != nil {
+ if pe, ok := panicData.(*errorutil.PanicError); ok {
+ // Don't print stacktrace from goroutines twice
+ lintCtx.Log.Warnf("Panic: %s: %s", pe, pe.Stack())
+ } else {
+ err = fmt.Errorf("panic occurred: %s", panicData)
+ r.Log.Warnf("Panic stack trace: %s", debug.Stack())
+ }
+ }
+ }()
+
+ issues, err := lc.Linter.Run(ctx, lintCtx)
+
+ if lc.DoesChangeTypes {
+ // Packages in lintCtx might be dirty due to the last analysis,
+ // which affects to the next analysis.
+ // To avoid this issue, we clear type information from the packages.
+ // See https://github.com/golangci/golangci-lint/pull/944.
+ // Currently DoesChangeTypes is true only for `unused`.
+ lintCtx.ClearTypesInPackages()
+ }
+
+ if err != nil {
+ return nil, err
+ }
+
+ for i := range issues {
+ if issues[i].FromLinter == "" {
+ issues[i].FromLinter = lc.Name()
+ }
+ }
+
+ return issues, nil
+}
+
+type processorStat struct {
+ inCount int
+ outCount int
+}
+
+func (r Runner) processLintResults(inIssues []result.Issue) []result.Issue {
+ sw := timeutils.NewStopwatch("processing", r.Log)
+
+ var issuesBefore, issuesAfter int
+ statPerProcessor := map[string]processorStat{}
+
+ var outIssues []result.Issue
+ if len(inIssues) != 0 {
+ issuesBefore += len(inIssues)
+ outIssues = r.processIssues(inIssues, sw, statPerProcessor)
+ issuesAfter += len(outIssues)
+ }
+
+ // finalize processors: logging, clearing, no heavy work here
+
+ for _, p := range r.Processors {
+ p := p
+ sw.TrackStage(p.Name(), func() {
+ p.Finish()
+ })
+ }
+
+ if issuesBefore != issuesAfter {
+ r.Log.Infof("Issues before processing: %d, after processing: %d", issuesBefore, issuesAfter)
+ }
+ r.printPerProcessorStat(statPerProcessor)
+ sw.PrintStages()
+
+ return outIssues
+}
+
+func (r Runner) printPerProcessorStat(stat map[string]processorStat) {
+ parts := make([]string, 0, len(stat))
+ for name, ps := range stat {
+ if ps.inCount != 0 {
+ parts = append(parts, fmt.Sprintf("%s: %d/%d", name, ps.outCount, ps.inCount))
+ }
+ }
+ if len(parts) != 0 {
+ r.Log.Infof("Processors filtering stat (out/in): %s", strings.Join(parts, ", "))
+ }
+}
+
+func (r Runner) Run(ctx context.Context, linters []*linter.Config, lintCtx *linter.Context) ([]result.Issue, error) {
+ sw := timeutils.NewStopwatch("linters", r.Log)
+ defer sw.Print()
+
+ var issues []result.Issue
+ var runErr error
+ for _, lc := range linters {
+ lc := lc
+ sw.TrackStage(lc.Name(), func() {
+ linterIssues, err := r.runLinterSafe(ctx, lintCtx, lc)
+ if err != nil {
+ r.Log.Warnf("Can't run linter %s: %s", lc.Linter.Name(), err)
+ if os.Getenv("GOLANGCI_COM_RUN") == "" {
+ // Don't stop all linters on one linter failure for golangci.com.
+ runErr = err
+ }
+ return
+ }
+ issues = append(issues, linterIssues...)
+ })
+ }
+
+ return r.processLintResults(issues), runErr
+}
+
+func (r *Runner) processIssues(issues []result.Issue, sw *timeutils.Stopwatch, statPerProcessor map[string]processorStat) []result.Issue {
+ for _, p := range r.Processors {
+ var newIssues []result.Issue
+ var err error
+ p := p
+ sw.TrackStage(p.Name(), func() {
+ newIssues, err = p.Process(issues)
+ })
+
+ if err != nil {
+ r.Log.Warnf("Can't process result by %s processor: %s", p.Name(), err)
+ } else {
+ stat := statPerProcessor[p.Name()]
+ stat.inCount += len(issues)
+ stat.outCount += len(newIssues)
+ statPerProcessor[p.Name()] = stat
+ issues = newIssues
+ }
+
+ if issues == nil {
+ issues = []result.Issue{}
+ }
+ }
+
+ return issues
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/logutils/log.go b/vendor/github.com/golangci/golangci-lint/pkg/logutils/log.go
new file mode 100644
index 000000000..b955417a8
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/logutils/log.go
@@ -0,0 +1,31 @@
+package logutils
+
+type Log interface {
+ Fatalf(format string, args ...interface{})
+ Panicf(format string, args ...interface{})
+ Errorf(format string, args ...interface{})
+ Warnf(format string, args ...interface{})
+ Infof(format string, args ...interface{})
+
+ Child(name string) Log
+ SetLevel(level LogLevel)
+}
+
+type LogLevel int
+
+const (
+ // Debug messages, write to debug logs only by logutils.Debug.
+ LogLevelDebug LogLevel = 0
+
+ // Information messages, don't write too much messages,
+ // only useful ones: they are shown when running with -v.
+ LogLevelInfo LogLevel = 1
+
+ // Hidden errors: non critical errors: work can be continued, no need to fail whole program;
+ // tests will crash if any warning occurred.
+ LogLevelWarn LogLevel = 2
+
+ // Only not hidden from user errors: whole program failing, usually
+ // error logging happens in 1-2 places: in the "main" function.
+ LogLevelError LogLevel = 3
+)
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/logutils/logutils.go b/vendor/github.com/golangci/golangci-lint/pkg/logutils/logutils.go
new file mode 100644
index 000000000..93c9873d9
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/logutils/logutils.go
@@ -0,0 +1,49 @@
+package logutils
+
+import (
+ "os"
+ "strings"
+)
+
+func getEnabledDebugs() map[string]bool {
+ ret := map[string]bool{}
+ debugVar := os.Getenv("GL_DEBUG")
+ if debugVar == "" {
+ return ret
+ }
+
+ for _, tag := range strings.Split(debugVar, ",") {
+ ret[tag] = true
+ }
+
+ return ret
+}
+
+var enabledDebugs = getEnabledDebugs()
+
+type DebugFunc func(format string, args ...interface{})
+
+func nopDebugf(format string, args ...interface{}) {}
+
+func Debug(tag string) DebugFunc {
+ if !enabledDebugs[tag] {
+ return nopDebugf
+ }
+
+ logger := NewStderrLog(tag)
+ logger.SetLevel(LogLevelDebug)
+
+ return func(format string, args ...interface{}) {
+ logger.Debugf(format, args...)
+ }
+}
+
+func HaveDebugTag(tag string) bool {
+ return enabledDebugs[tag]
+}
+
+func SetupVerboseLog(log Log, isVerbose bool) {
+ if isVerbose {
+ log.SetLevel(LogLevelInfo)
+ }
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/logutils/mock.go b/vendor/github.com/golangci/golangci-lint/pkg/logutils/mock.go
new file mode 100644
index 000000000..e897ce1ed
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/logutils/mock.go
@@ -0,0 +1,47 @@
+package logutils
+
+import (
+ "github.com/stretchr/testify/mock"
+)
+
+type MockLog struct {
+ mock.Mock
+}
+
+func NewMockLog() *MockLog {
+ return &MockLog{}
+}
+
+func (m *MockLog) Fatalf(format string, args ...interface{}) {
+ mArgs := []interface{}{format}
+ m.Called(append(mArgs, args...)...)
+}
+
+func (m *MockLog) Panicf(format string, args ...interface{}) {
+ mArgs := []interface{}{format}
+ m.Called(append(mArgs, args...)...)
+}
+
+func (m *MockLog) Errorf(format string, args ...interface{}) {
+ mArgs := []interface{}{format}
+ m.Called(append(mArgs, args...)...)
+}
+
+func (m *MockLog) Warnf(format string, args ...interface{}) {
+ mArgs := []interface{}{format}
+ m.Called(append(mArgs, args...)...)
+}
+
+func (m *MockLog) Infof(format string, args ...interface{}) {
+ mArgs := []interface{}{format}
+ m.Called(append(mArgs, args...)...)
+}
+
+func (m *MockLog) Child(name string) Log {
+ m.Called(name)
+ return m
+}
+
+func (m *MockLog) SetLevel(level LogLevel) {
+ m.Called(level)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/logutils/out.go b/vendor/github.com/golangci/golangci-lint/pkg/logutils/out.go
new file mode 100644
index 000000000..67c70dc8f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/logutils/out.go
@@ -0,0 +1,9 @@
+package logutils
+
+import (
+ "github.com/fatih/color"
+ colorable "github.com/mattn/go-colorable"
+)
+
+var StdOut = color.Output // https://github.com/golangci/golangci-lint/issues/14
+var StdErr = colorable.NewColorableStderr()
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/logutils/stderr_log.go b/vendor/github.com/golangci/golangci-lint/pkg/logutils/stderr_log.go
new file mode 100644
index 000000000..b4697ee4c
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/logutils/stderr_log.go
@@ -0,0 +1,121 @@
+package logutils
+
+import (
+ "fmt"
+ "os"
+ "time"
+
+ "github.com/sirupsen/logrus" //nolint:depguard
+
+ "github.com/golangci/golangci-lint/pkg/exitcodes"
+)
+
+type StderrLog struct {
+ name string
+ logger *logrus.Logger
+ level LogLevel
+}
+
+var _ Log = NewStderrLog("")
+
+func NewStderrLog(name string) *StderrLog {
+ sl := &StderrLog{
+ name: name,
+ logger: logrus.New(),
+ level: LogLevelWarn,
+ }
+
+ switch os.Getenv("LOG_LEVEL") {
+ case "error", "err":
+ sl.logger.SetLevel(logrus.ErrorLevel)
+ case "warning", "warn":
+ sl.logger.SetLevel(logrus.WarnLevel)
+ case "info":
+ sl.logger.SetLevel(logrus.InfoLevel)
+ default:
+ sl.logger.SetLevel(logrus.DebugLevel)
+ }
+
+ sl.logger.Out = StdErr
+ formatter := &logrus.TextFormatter{
+ DisableTimestamp: true, // `INFO[0007] msg` -> `INFO msg`
+ }
+ if os.Getenv("LOG_TIMESTAMP") == "1" {
+ formatter.DisableTimestamp = false
+ formatter.FullTimestamp = true
+ formatter.TimestampFormat = time.StampMilli
+ }
+ sl.logger.Formatter = formatter
+
+ return sl
+}
+
+func (sl StderrLog) prefix() string {
+ prefix := ""
+ if sl.name != "" {
+ prefix = fmt.Sprintf("[%s] ", sl.name)
+ }
+
+ return prefix
+}
+
+func (sl StderrLog) Fatalf(format string, args ...interface{}) {
+ sl.logger.Errorf("%s%s", sl.prefix(), fmt.Sprintf(format, args...))
+ os.Exit(exitcodes.Failure)
+}
+
+func (sl StderrLog) Panicf(format string, args ...interface{}) {
+ v := fmt.Sprintf("%s%s", sl.prefix(), fmt.Sprintf(format, args...))
+ panic(v)
+}
+
+func (sl StderrLog) Errorf(format string, args ...interface{}) {
+ if sl.level > LogLevelError {
+ return
+ }
+
+ sl.logger.Errorf("%s%s", sl.prefix(), fmt.Sprintf(format, args...))
+ // don't call exitIfTest() because the idea is to
+ // crash on hidden errors (warnings); but Errorf MUST NOT be
+ // called on hidden errors, see log levels comments.
+}
+
+func (sl StderrLog) Warnf(format string, args ...interface{}) {
+ if sl.level > LogLevelWarn {
+ return
+ }
+
+ sl.logger.Warnf("%s%s", sl.prefix(), fmt.Sprintf(format, args...))
+}
+
+func (sl StderrLog) Infof(format string, args ...interface{}) {
+ if sl.level > LogLevelInfo {
+ return
+ }
+
+ sl.logger.Infof("%s%s", sl.prefix(), fmt.Sprintf(format, args...))
+}
+
+func (sl StderrLog) Debugf(format string, args ...interface{}) {
+ if sl.level > LogLevelDebug {
+ return
+ }
+
+ sl.logger.Debugf("%s%s", sl.prefix(), fmt.Sprintf(format, args...))
+}
+
+func (sl StderrLog) Child(name string) Log {
+ prefix := ""
+ if sl.name != "" {
+ prefix = sl.name + "/"
+ }
+
+ child := sl
+ child.name = prefix + name
+
+ return &child
+}
+
+func (sl *StderrLog) SetLevel(level LogLevel) {
+ sl.level = level
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/packages/errors.go b/vendor/github.com/golangci/golangci-lint/pkg/packages/errors.go
new file mode 100644
index 000000000..c620573b9
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/packages/errors.go
@@ -0,0 +1,39 @@
+package packages
+
+import (
+ "fmt"
+ "go/token"
+ "strconv"
+ "strings"
+
+ "github.com/pkg/errors"
+)
+
+//nolint:gomnd
+func ParseErrorPosition(pos string) (*token.Position, error) {
+ // file:line(<optional>:colon)
+ parts := strings.Split(pos, ":")
+ if len(parts) == 1 {
+ return nil, errors.New("no colons")
+ }
+
+ file := parts[0]
+ line, err := strconv.Atoi(parts[1])
+ if err != nil {
+ return nil, fmt.Errorf("can't parse line number %q: %s", parts[1], err)
+ }
+
+ var column int
+ if len(parts) == 3 { // no column
+ column, err = strconv.Atoi(parts[2])
+ if err != nil {
+ return nil, errors.Wrapf(err, "failed to parse column from %q", parts[2])
+ }
+ }
+
+ return &token.Position{
+ Filename: file,
+ Line: line,
+ Column: column,
+ }, nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/packages/skip.go b/vendor/github.com/golangci/golangci-lint/pkg/packages/skip.go
new file mode 100644
index 000000000..cdd327f5d
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/packages/skip.go
@@ -0,0 +1,25 @@
+package packages
+
+import (
+ "fmt"
+ "path/filepath"
+ "regexp"
+)
+
+func pathElemReImpl(e string, sep rune) string {
+ escapedSep := regexp.QuoteMeta(string(sep)) // needed for windows sep '\\'
+ return fmt.Sprintf(`(^|%s)%s($|%s)`, escapedSep, e, escapedSep)
+}
+
+func pathElemRe(e string) string {
+ return pathElemReImpl(e, filepath.Separator)
+}
+
+var StdExcludeDirRegexps = []string{
+ pathElemRe("vendor"),
+ pathElemRe("third_party"),
+ pathElemRe("testdata"),
+ pathElemRe("examples"),
+ pathElemRe("Godeps"),
+ pathElemRe("builtin"),
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/packages/util.go b/vendor/github.com/golangci/golangci-lint/pkg/packages/util.go
new file mode 100644
index 000000000..3c8642afa
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/packages/util.go
@@ -0,0 +1,71 @@
+package packages
+
+import (
+ "fmt"
+
+ "golang.org/x/tools/go/packages"
+)
+
+func ExtractErrors(pkg *packages.Package) []packages.Error {
+ errors := extractErrorsImpl(pkg, map[*packages.Package]bool{})
+ if len(errors) == 0 {
+ return errors
+ }
+
+ seenErrors := map[string]bool{}
+ var uniqErrors []packages.Error
+ for _, err := range errors {
+ if seenErrors[err.Msg] {
+ continue
+ }
+ seenErrors[err.Msg] = true
+ uniqErrors = append(uniqErrors, err)
+ }
+
+ if len(pkg.GoFiles) != 0 {
+ // errors were extracted from deps and have at leat one file in package
+ for i := range uniqErrors {
+ _, parseErr := ParseErrorPosition(uniqErrors[i].Pos)
+ if parseErr != nil {
+ // change pos to local file to properly process it by processors (properly read line etc)
+ uniqErrors[i].Msg = fmt.Sprintf("%s: %s", uniqErrors[i].Pos, uniqErrors[i].Msg)
+ uniqErrors[i].Pos = fmt.Sprintf("%s:1", pkg.GoFiles[0])
+ }
+ }
+
+ // some errors like "code in directory expects import" don't have Pos, set it here
+ for i := range uniqErrors {
+ err := &uniqErrors[i]
+ if err.Pos == "" {
+ err.Pos = fmt.Sprintf("%s:1", pkg.GoFiles[0])
+ }
+ }
+ }
+
+ return uniqErrors
+}
+
+func extractErrorsImpl(pkg *packages.Package, seenPackages map[*packages.Package]bool) []packages.Error {
+ if seenPackages[pkg] {
+ return nil
+ }
+ seenPackages[pkg] = true
+
+ if !pkg.IllTyped { // otherwise it may take hours to traverse all deps many times
+ return nil
+ }
+
+ if len(pkg.Errors) != 0 {
+ return pkg.Errors
+ }
+
+ var errors []packages.Error
+ for _, iPkg := range pkg.Imports {
+ iPkgErrors := extractErrorsImpl(iPkg, seenPackages)
+ if iPkgErrors != nil {
+ errors = append(errors, iPkgErrors...)
+ }
+ }
+
+ return errors
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/printers/checkstyle.go b/vendor/github.com/golangci/golangci-lint/pkg/printers/checkstyle.go
new file mode 100644
index 000000000..f36bc108a
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/checkstyle.go
@@ -0,0 +1,80 @@
+package printers
+
+import (
+ "context"
+ "encoding/xml"
+ "fmt"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type checkstyleOutput struct {
+ XMLName xml.Name `xml:"checkstyle"`
+ Version string `xml:"version,attr"`
+ Files []*checkstyleFile `xml:"file"`
+}
+
+type checkstyleFile struct {
+ Name string `xml:"name,attr"`
+ Errors []*checkstyleError `xml:"error"`
+}
+
+type checkstyleError struct {
+ Column int `xml:"column,attr"`
+ Line int `xml:"line,attr"`
+ Message string `xml:"message,attr"`
+ Severity string `xml:"severity,attr"`
+ Source string `xml:"source,attr"`
+}
+
+const defaultSeverity = "error"
+
+type Checkstyle struct{}
+
+func NewCheckstyle() *Checkstyle {
+ return &Checkstyle{}
+}
+
+func (Checkstyle) Print(ctx context.Context, issues []result.Issue) error {
+ out := checkstyleOutput{
+ Version: "5.0",
+ }
+
+ files := map[string]*checkstyleFile{}
+
+ for i := range issues {
+ issue := &issues[i]
+ file, ok := files[issue.FilePath()]
+ if !ok {
+ file = &checkstyleFile{
+ Name: issue.FilePath(),
+ }
+
+ files[issue.FilePath()] = file
+ }
+
+ newError := &checkstyleError{
+ Column: issue.Column(),
+ Line: issue.Line(),
+ Message: issue.Text,
+ Source: issue.FromLinter,
+ Severity: defaultSeverity,
+ }
+
+ file.Errors = append(file.Errors, newError)
+ }
+
+ out.Files = make([]*checkstyleFile, 0, len(files))
+ for _, file := range files {
+ out.Files = append(out.Files, file)
+ }
+
+ data, err := xml.Marshal(&out)
+ if err != nil {
+ return err
+ }
+
+ fmt.Fprintf(logutils.StdOut, "%s%s\n", xml.Header, data)
+ return nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/printers/codeclimate.go b/vendor/github.com/golangci/golangci-lint/pkg/printers/codeclimate.go
new file mode 100644
index 000000000..5d45c4eb3
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/codeclimate.go
@@ -0,0 +1,62 @@
+package printers
+
+import (
+ "context"
+ "crypto/md5" //nolint:gosec
+ "encoding/json"
+ "fmt"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+// CodeClimateIssue is a subset of the Code Climate spec - https://github.com/codeclimate/spec/blob/master/SPEC.md#data-types
+// It is just enough to support GitLab CI Code Quality - https://docs.gitlab.com/ee/user/project/merge_requests/code_quality.html
+type CodeClimateIssue struct {
+ Description string `json:"description"`
+ Fingerprint string `json:"fingerprint"`
+ Location struct {
+ Path string `json:"path"`
+ Lines struct {
+ Begin int `json:"begin"`
+ } `json:"lines"`
+ } `json:"location"`
+}
+
+type CodeClimate struct {
+}
+
+func NewCodeClimate() *CodeClimate {
+ return &CodeClimate{}
+}
+
+func (p CodeClimate) Print(ctx context.Context, issues []result.Issue) error {
+ allIssues := []CodeClimateIssue{}
+ for ind := range issues {
+ i := &issues[ind]
+ var issue CodeClimateIssue
+ issue.Description = i.FromLinter + ": " + i.Text
+ issue.Location.Path = i.Pos.Filename
+ issue.Location.Lines.Begin = i.Pos.Line
+
+ // Need a checksum of the issue, so we use MD5 of the filename, text, and first line of source if there is any
+ var firstLine string
+ if len(i.SourceLines) > 0 {
+ firstLine = i.SourceLines[0]
+ }
+
+ hash := md5.New() //nolint:gosec
+ _, _ = hash.Write([]byte(i.Pos.Filename + i.Text + firstLine))
+ issue.Fingerprint = fmt.Sprintf("%X", hash.Sum(nil))
+
+ allIssues = append(allIssues, issue)
+ }
+
+ outputJSON, err := json.Marshal(allIssues)
+ if err != nil {
+ return err
+ }
+
+ fmt.Fprint(logutils.StdOut, string(outputJSON))
+ return nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/printers/github.go b/vendor/github.com/golangci/golangci-lint/pkg/printers/github.go
new file mode 100644
index 000000000..fa11a2839
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/github.go
@@ -0,0 +1,39 @@
+package printers
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type github struct {
+}
+
+// Github output format outputs issues according to Github actions format:
+// https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message
+func NewGithub() Printer {
+ return &github{}
+}
+
+// print each line as: ::error file=app.js,line=10,col=15::Something went wrong
+func formatIssueAsGithub(issue *result.Issue) string {
+ ret := fmt.Sprintf("::error file=%s,line=%d", issue.FilePath(), issue.Line())
+ if issue.Pos.Column != 0 {
+ ret += fmt.Sprintf(",col=%d", issue.Pos.Column)
+ }
+
+ ret += fmt.Sprintf("::%s (%s)", issue.Text, issue.FromLinter)
+ return ret
+}
+
+func (g *github) Print(_ context.Context, issues []result.Issue) error {
+ for ind := range issues {
+ _, err := fmt.Fprintln(logutils.StdOut, formatIssueAsGithub(&issues[ind]))
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/printers/json.go b/vendor/github.com/golangci/golangci-lint/pkg/printers/json.go
new file mode 100644
index 000000000..6ffa996fb
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/json.go
@@ -0,0 +1,41 @@
+package printers
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/report"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type JSON struct {
+ rd *report.Data
+}
+
+func NewJSON(rd *report.Data) *JSON {
+ return &JSON{
+ rd: rd,
+ }
+}
+
+type JSONResult struct {
+ Issues []result.Issue
+ Report *report.Data
+}
+
+func (p JSON) Print(ctx context.Context, issues []result.Issue) error {
+ res := JSONResult{
+ Issues: issues,
+ Report: p.rd,
+ }
+
+ outputJSON, err := json.Marshal(res)
+ if err != nil {
+ return err
+ }
+
+ fmt.Fprint(logutils.StdOut, string(outputJSON))
+ return nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/printers/junitxml.go b/vendor/github.com/golangci/golangci-lint/pkg/printers/junitxml.go
new file mode 100644
index 000000000..9277cd66f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/junitxml.go
@@ -0,0 +1,79 @@
+package printers
+
+import (
+ "context"
+ "encoding/xml"
+ "strings"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type testSuitesXML struct {
+ XMLName xml.Name `xml:"testsuites"`
+ TestSuites []testSuiteXML
+}
+
+type testSuiteXML struct {
+ XMLName xml.Name `xml:"testsuite"`
+ Suite string `xml:"name,attr"`
+ Tests int `xml:"tests,attr"`
+ Errors int `xml:"errors,attr"`
+ Failures int `xml:"failures,attr"`
+ TestCases []testCaseXML `xml:"testcase"`
+}
+
+type testCaseXML struct {
+ Name string `xml:"name,attr"`
+ ClassName string `xml:"classname,attr"`
+ Failure failureXML `xml:"failure"`
+}
+
+type failureXML struct {
+ Message string `xml:"message,attr"`
+ Content string `xml:",cdata"`
+}
+
+type JunitXML struct {
+}
+
+func NewJunitXML() *JunitXML {
+ return &JunitXML{}
+}
+
+func (JunitXML) Print(ctx context.Context, issues []result.Issue) error {
+ suites := make(map[string]testSuiteXML) // use a map to group by file
+
+ for ind := range issues {
+ i := &issues[ind]
+ suiteName := i.FilePath()
+ testSuite := suites[suiteName]
+ testSuite.Suite = i.FilePath()
+ testSuite.Tests++
+ testSuite.Failures++
+
+ tc := testCaseXML{
+ Name: i.FromLinter,
+ ClassName: i.Pos.String(),
+ Failure: failureXML{
+ Message: i.Text,
+ Content: strings.Join(i.SourceLines, "\n"),
+ },
+ }
+
+ testSuite.TestCases = append(testSuite.TestCases, tc)
+ suites[suiteName] = testSuite
+ }
+
+ var res testSuitesXML
+ for _, val := range suites {
+ res.TestSuites = append(res.TestSuites, val)
+ }
+
+ enc := xml.NewEncoder(logutils.StdOut)
+ enc.Indent("", " ")
+ if err := enc.Encode(res); err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/printers/printer.go b/vendor/github.com/golangci/golangci-lint/pkg/printers/printer.go
new file mode 100644
index 000000000..bfafb88e2
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/printer.go
@@ -0,0 +1,11 @@
+package printers
+
+import (
+ "context"
+
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Printer interface {
+ Print(ctx context.Context, issues []result.Issue) error
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/printers/tab.go b/vendor/github.com/golangci/golangci-lint/pkg/printers/tab.go
new file mode 100644
index 000000000..d3cdce673
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/tab.go
@@ -0,0 +1,58 @@
+package printers
+
+import (
+ "context"
+ "fmt"
+ "io"
+ "text/tabwriter"
+
+ "github.com/fatih/color"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Tab struct {
+ printLinterName bool
+ log logutils.Log
+}
+
+func NewTab(printLinterName bool, log logutils.Log) *Tab {
+ return &Tab{
+ printLinterName: printLinterName,
+ log: log,
+ }
+}
+
+func (p Tab) SprintfColored(ca color.Attribute, format string, args ...interface{}) string {
+ c := color.New(ca)
+ return c.Sprintf(format, args...)
+}
+
+func (p *Tab) Print(ctx context.Context, issues []result.Issue) error {
+ w := tabwriter.NewWriter(logutils.StdOut, 0, 0, 2, ' ', 0)
+
+ for i := range issues {
+ p.printIssue(&issues[i], w)
+ }
+
+ if err := w.Flush(); err != nil {
+ p.log.Warnf("Can't flush tab writer: %s", err)
+ }
+
+ return nil
+}
+
+func (p Tab) printIssue(i *result.Issue, w io.Writer) {
+ text := p.SprintfColored(color.FgRed, "%s", i.Text)
+ if p.printLinterName {
+ text = fmt.Sprintf("%s\t%s", i.FromLinter, text)
+ }
+
+ pos := p.SprintfColored(color.Bold, "%s:%d", i.FilePath(), i.Line())
+ if i.Pos.Column != 0 {
+ pos += fmt.Sprintf(":%d", i.Pos.Column)
+ }
+
+ fmt.Fprintf(w, "%s\t%s\n", pos, text)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/printers/text.go b/vendor/github.com/golangci/golangci-lint/pkg/printers/text.go
new file mode 100644
index 000000000..283499205
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/text.go
@@ -0,0 +1,90 @@
+package printers
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/fatih/color"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Text struct {
+ printIssuedLine bool
+ useColors bool
+ printLinterName bool
+
+ log logutils.Log
+}
+
+func NewText(printIssuedLine, useColors, printLinterName bool, log logutils.Log) *Text {
+ return &Text{
+ printIssuedLine: printIssuedLine,
+ useColors: useColors,
+ printLinterName: printLinterName,
+ log: log,
+ }
+}
+
+func (p Text) SprintfColored(ca color.Attribute, format string, args ...interface{}) string {
+ if !p.useColors {
+ return fmt.Sprintf(format, args...)
+ }
+
+ c := color.New(ca)
+ return c.Sprintf(format, args...)
+}
+
+func (p *Text) Print(ctx context.Context, issues []result.Issue) error {
+ for i := range issues {
+ p.printIssue(&issues[i])
+
+ if !p.printIssuedLine {
+ continue
+ }
+
+ p.printSourceCode(&issues[i])
+ p.printUnderLinePointer(&issues[i])
+ }
+
+ return nil
+}
+
+func (p Text) printIssue(i *result.Issue) {
+ text := p.SprintfColored(color.FgRed, "%s", i.Text)
+ if p.printLinterName {
+ text += fmt.Sprintf(" (%s)", i.FromLinter)
+ }
+ pos := p.SprintfColored(color.Bold, "%s:%d", i.FilePath(), i.Line())
+ if i.Pos.Column != 0 {
+ pos += fmt.Sprintf(":%d", i.Pos.Column)
+ }
+ fmt.Fprintf(logutils.StdOut, "%s: %s\n", pos, text)
+}
+
+func (p Text) printSourceCode(i *result.Issue) {
+ for _, line := range i.SourceLines {
+ fmt.Fprintln(logutils.StdOut, line)
+ }
+}
+
+func (p Text) printUnderLinePointer(i *result.Issue) {
+ // if column == 0 it means column is unknown (e.g. for gosec)
+ if len(i.SourceLines) != 1 || i.Pos.Column == 0 {
+ return
+ }
+
+ col0 := i.Pos.Column - 1
+ line := i.SourceLines[0]
+ prefixRunes := make([]rune, 0, len(line))
+ for j := 0; j < len(line) && j < col0; j++ {
+ if line[j] == '\t' {
+ prefixRunes = append(prefixRunes, '\t')
+ } else {
+ prefixRunes = append(prefixRunes, ' ')
+ }
+ }
+
+ fmt.Fprintf(logutils.StdOut, "%s%s\n", string(prefixRunes), p.SprintfColored(color.FgYellow, "^"))
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/report/data.go b/vendor/github.com/golangci/golangci-lint/pkg/report/data.go
new file mode 100644
index 000000000..f083fa9f5
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/report/data.go
@@ -0,0 +1,26 @@
+package report
+
+type Warning struct {
+ Tag string `json:",omitempty"`
+ Text string
+}
+
+type LinterData struct {
+ Name string
+ Enabled bool `json:",omitempty"`
+ EnabledByDefault bool `json:",omitempty"`
+}
+
+type Data struct {
+ Warnings []Warning `json:",omitempty"`
+ Linters []LinterData `json:",omitempty"`
+ Error string `json:",omitempty"`
+}
+
+func (d *Data) AddLinter(name string, enabled, enabledByDefault bool) {
+ d.Linters = append(d.Linters, LinterData{
+ Name: name,
+ Enabled: enabled,
+ EnabledByDefault: enabledByDefault,
+ })
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/report/log.go b/vendor/github.com/golangci/golangci-lint/pkg/report/log.go
new file mode 100644
index 000000000..45ab6cae8
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/report/log.go
@@ -0,0 +1,64 @@
+package report
+
+import (
+ "fmt"
+ "strings"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+type LogWrapper struct {
+ rd *Data
+ tags []string
+ origLog logutils.Log
+}
+
+func NewLogWrapper(log logutils.Log, reportData *Data) *LogWrapper {
+ return &LogWrapper{
+ rd: reportData,
+ origLog: log,
+ }
+}
+
+func (lw LogWrapper) Fatalf(format string, args ...interface{}) {
+ lw.origLog.Fatalf(format, args...)
+}
+
+func (lw LogWrapper) Panicf(format string, args ...interface{}) {
+ lw.origLog.Panicf(format, args...)
+}
+
+func (lw LogWrapper) Errorf(format string, args ...interface{}) {
+ lw.origLog.Errorf(format, args...)
+ lw.rd.Error = fmt.Sprintf(format, args...)
+}
+
+func (lw LogWrapper) Warnf(format string, args ...interface{}) {
+ lw.origLog.Warnf(format, args...)
+ w := Warning{
+ Tag: strings.Join(lw.tags, "/"),
+ Text: fmt.Sprintf(format, args...),
+ }
+
+ lw.rd.Warnings = append(lw.rd.Warnings, w)
+}
+
+func (lw LogWrapper) Infof(format string, args ...interface{}) {
+ lw.origLog.Infof(format, args...)
+}
+
+func (lw LogWrapper) Child(name string) logutils.Log {
+ c := lw
+ c.origLog = lw.origLog.Child(name)
+ c.tags = append([]string{}, lw.tags...)
+ c.tags = append(c.tags, name)
+ return c
+}
+
+func (lw LogWrapper) SetLevel(level logutils.LogLevel) {
+ lw.origLog.SetLevel(level)
+}
+
+func (lw LogWrapper) GoString() string {
+ return fmt.Sprintf("lw: %+v, orig log: %#v", lw, lw.origLog)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/issue.go b/vendor/github.com/golangci/golangci-lint/pkg/result/issue.go
new file mode 100644
index 000000000..16d9a8a8c
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/issue.go
@@ -0,0 +1,78 @@
+package result
+
+import (
+ "go/token"
+
+ "golang.org/x/tools/go/packages"
+)
+
+type Range struct {
+ From, To int
+}
+
+type Replacement struct {
+ NeedOnlyDelete bool // need to delete all lines of the issue without replacement with new lines
+ NewLines []string // is NeedDelete is false it's the replacement lines
+ Inline *InlineFix
+}
+
+type InlineFix struct {
+ StartCol int // zero-based
+ Length int // length of chunk to be replaced
+ NewString string
+}
+
+type Issue struct {
+ FromLinter string
+ Text string
+
+ // Source lines of a code with the issue to show
+ SourceLines []string
+
+ // If we know how to fix the issue we can provide replacement lines
+ Replacement *Replacement
+
+ // Pkg is needed for proper caching of linting results
+ Pkg *packages.Package `json:"-"`
+
+ LineRange *Range `json:",omitempty"`
+
+ Pos token.Position
+
+ // HunkPos is used only when golangci-lint is run over a diff
+ HunkPos int `json:",omitempty"`
+
+ // If we are expecting a nolint (because this is from nolintlint), record the expected linter
+ ExpectNoLint bool
+ ExpectedNoLintLinter string
+}
+
+func (i *Issue) FilePath() string {
+ return i.Pos.Filename
+}
+
+func (i *Issue) Line() int {
+ return i.Pos.Line
+}
+
+func (i *Issue) Column() int {
+ return i.Pos.Column
+}
+
+func (i *Issue) GetLineRange() Range {
+ if i.LineRange == nil {
+ return Range{
+ From: i.Line(),
+ To: i.Line(),
+ }
+ }
+
+ if i.LineRange.From == 0 {
+ return Range{
+ From: i.Line(),
+ To: i.Line(),
+ }
+ }
+
+ return *i.LineRange
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/autogenerated_exclude.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/autogenerated_exclude.go
new file mode 100644
index 000000000..249ba9d44
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/autogenerated_exclude.go
@@ -0,0 +1,152 @@
+package processors
+
+import (
+ "bufio"
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "github.com/pkg/errors"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+var autogenDebugf = logutils.Debug("autogen_exclude")
+
+type ageFileSummary struct {
+ isGenerated bool
+}
+
+type ageFileSummaryCache map[string]*ageFileSummary
+
+type AutogeneratedExclude struct {
+ fileSummaryCache ageFileSummaryCache
+}
+
+func NewAutogeneratedExclude() *AutogeneratedExclude {
+ return &AutogeneratedExclude{
+ fileSummaryCache: ageFileSummaryCache{},
+ }
+}
+
+var _ Processor = &AutogeneratedExclude{}
+
+func (p AutogeneratedExclude) Name() string {
+ return "autogenerated_exclude"
+}
+
+func (p *AutogeneratedExclude) Process(issues []result.Issue) ([]result.Issue, error) {
+ return filterIssuesErr(issues, p.shouldPassIssue)
+}
+
+func isSpecialAutogeneratedFile(filePath string) bool {
+ fileName := filepath.Base(filePath)
+ // fake files to which //line points to for goyacc generated files
+ return fileName == "yacctab" || fileName == "yaccpar" || fileName == "NONE"
+}
+
+func (p *AutogeneratedExclude) shouldPassIssue(i *result.Issue) (bool, error) {
+ if i.FromLinter == "typecheck" {
+ // don't hide typechecking errors in generated files: users expect to see why the project isn't compiling
+ return true, nil
+ }
+
+ if isSpecialAutogeneratedFile(i.FilePath()) {
+ return false, nil
+ }
+
+ fs, err := p.getOrCreateFileSummary(i)
+ if err != nil {
+ return false, err
+ }
+
+ // don't report issues for autogenerated files
+ return !fs.isGenerated, nil
+}
+
+// isGenerated reports whether the source file is generated code.
+// Using a bit laxer rules than https://golang.org/s/generatedcode to
+// match more generated code. See #48 and #72.
+func isGeneratedFileByComment(doc string) bool {
+ const (
+ genCodeGenerated = "code generated"
+ genDoNotEdit = "do not edit"
+ genAutoFile = "autogenerated file" // easyjson
+ )
+
+ markers := []string{genCodeGenerated, genDoNotEdit, genAutoFile}
+ doc = strings.ToLower(doc)
+ for _, marker := range markers {
+ if strings.Contains(doc, marker) {
+ autogenDebugf("doc contains marker %q: file is generated", marker)
+ return true
+ }
+ }
+
+ autogenDebugf("doc of len %d doesn't contain any of markers: %s", len(doc), markers)
+ return false
+}
+
+func (p *AutogeneratedExclude) getOrCreateFileSummary(i *result.Issue) (*ageFileSummary, error) {
+ fs := p.fileSummaryCache[i.FilePath()]
+ if fs != nil {
+ return fs, nil
+ }
+
+ fs = &ageFileSummary{}
+ p.fileSummaryCache[i.FilePath()] = fs
+
+ if i.FilePath() == "" {
+ return nil, fmt.Errorf("no file path for issue")
+ }
+
+ doc, err := getDoc(i.FilePath())
+ if err != nil {
+ return nil, errors.Wrapf(err, "failed to get doc of file %s", i.FilePath())
+ }
+
+ fs.isGenerated = isGeneratedFileByComment(doc)
+ autogenDebugf("file %q is generated: %t", i.FilePath(), fs.isGenerated)
+ return fs, nil
+}
+
+func getDoc(filePath string) (string, error) {
+ file, err := os.Open(filePath)
+ if err != nil {
+ return "", errors.Wrap(err, "failed to open file")
+ }
+ defer file.Close()
+
+ scanner := bufio.NewScanner(file)
+
+ // Issue 954: Some lines can be very long, e.g. auto-generated
+ // embedded resources. Reported on file of 86.2KB.
+ const (
+ maxSize = 10 * 1024 * 1024 // 10MB should be enough
+ initialSize = 4096 // same as startBufSize in bufio
+ )
+ scanner.Buffer(make([]byte, initialSize), maxSize)
+
+ var docLines []string
+ for scanner.Scan() {
+ line := strings.TrimSpace(scanner.Text())
+ if strings.HasPrefix(line, "//") {
+ text := strings.TrimSpace(strings.TrimPrefix(line, "//"))
+ docLines = append(docLines, text)
+ } else if line == "" || strings.HasPrefix(line, "package") {
+ // go to next line
+ } else {
+ break
+ }
+ }
+
+ if err := scanner.Err(); err != nil {
+ return "", errors.Wrap(err, "failed to scan file")
+ }
+
+ return strings.Join(docLines, "\n"), nil
+}
+
+func (p AutogeneratedExclude) Finish() {}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/cgo.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/cgo.go
new file mode 100644
index 000000000..c8793871a
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/cgo.go
@@ -0,0 +1,58 @@
+package processors
+
+import (
+ "path/filepath"
+ "strings"
+
+ "github.com/pkg/errors"
+
+ "github.com/golangci/golangci-lint/pkg/goutil"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Cgo struct {
+ goCacheDir string
+}
+
+var _ Processor = Cgo{}
+
+func NewCgo(goenv *goutil.Env) *Cgo {
+ return &Cgo{
+ goCacheDir: goenv.Get(goutil.EnvGoCache),
+ }
+}
+
+func (p Cgo) Name() string {
+ return "cgo"
+}
+
+func (p Cgo) Process(issues []result.Issue) ([]result.Issue, error) {
+ return filterIssuesErr(issues, func(i *result.Issue) (bool, error) {
+ // some linters (.e.g gosec, deadcode) return incorrect filepaths for cgo issues,
+ // also cgo files have strange issues looking like false positives.
+
+ // cache dir contains all preprocessed files including cgo files
+
+ issueFilePath := i.FilePath()
+ if !filepath.IsAbs(i.FilePath()) {
+ absPath, err := filepath.Abs(i.FilePath())
+ if err != nil {
+ return false, errors.Wrapf(err, "failed to build abs path for %q", i.FilePath())
+ }
+ issueFilePath = absPath
+ }
+
+ if p.goCacheDir != "" && strings.HasPrefix(issueFilePath, p.goCacheDir) {
+ return false, nil
+ }
+
+ if filepath.Base(i.FilePath()) == "_cgo_gotypes.go" {
+ // skip cgo warning for go1.10
+ return false, nil
+ }
+
+ return true, nil
+ })
+}
+
+func (Cgo) Finish() {}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/diff.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/diff.go
new file mode 100644
index 000000000..fc4aba4b9
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/diff.go
@@ -0,0 +1,74 @@
+package processors
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "strings"
+
+ "github.com/golangci/revgrep"
+
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Diff struct {
+ onlyNew bool
+ fromRev string
+ patchFilePath string
+ patch string
+}
+
+var _ Processor = Diff{}
+
+func NewDiff(onlyNew bool, fromRev, patchFilePath string) *Diff {
+ return &Diff{
+ onlyNew: onlyNew,
+ fromRev: fromRev,
+ patchFilePath: patchFilePath,
+ patch: os.Getenv("GOLANGCI_DIFF_PROCESSOR_PATCH"),
+ }
+}
+
+func (p Diff) Name() string {
+ return "diff"
+}
+
+func (p Diff) Process(issues []result.Issue) ([]result.Issue, error) {
+ if !p.onlyNew && p.fromRev == "" && p.patchFilePath == "" && p.patch == "" { // no need to work
+ return issues, nil
+ }
+
+ var patchReader io.Reader
+ if p.patchFilePath != "" {
+ patch, err := ioutil.ReadFile(p.patchFilePath)
+ if err != nil {
+ return nil, fmt.Errorf("can't read from patch file %s: %s", p.patchFilePath, err)
+ }
+ patchReader = bytes.NewReader(patch)
+ } else if p.patch != "" {
+ patchReader = strings.NewReader(p.patch)
+ }
+
+ c := revgrep.Checker{
+ Patch: patchReader,
+ RevisionFrom: p.fromRev,
+ }
+ if err := c.Prepare(); err != nil {
+ return nil, fmt.Errorf("can't prepare diff by revgrep: %s", err)
+ }
+
+ return transformIssues(issues, func(i *result.Issue) *result.Issue {
+ hunkPos, isNew := c.IsNewIssue(i)
+ if !isNew {
+ return nil
+ }
+
+ newI := *i
+ newI.HunkPos = hunkPos
+ return &newI
+ }), nil
+}
+
+func (Diff) Finish() {}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/exclude.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/exclude.go
new file mode 100644
index 000000000..92959a328
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/exclude.go
@@ -0,0 +1,59 @@
+package processors
+
+import (
+ "regexp"
+
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Exclude struct {
+ pattern *regexp.Regexp
+}
+
+var _ Processor = Exclude{}
+
+func NewExclude(pattern string) *Exclude {
+ var patternRe *regexp.Regexp
+ if pattern != "" {
+ patternRe = regexp.MustCompile("(?i)" + pattern)
+ }
+ return &Exclude{
+ pattern: patternRe,
+ }
+}
+
+func (p Exclude) Name() string {
+ return "exclude"
+}
+
+func (p Exclude) Process(issues []result.Issue) ([]result.Issue, error) {
+ if p.pattern == nil {
+ return issues, nil
+ }
+
+ return filterIssues(issues, func(i *result.Issue) bool {
+ return !p.pattern.MatchString(i.Text)
+ }), nil
+}
+
+func (p Exclude) Finish() {}
+
+type ExcludeCaseSensitive struct {
+ *Exclude
+}
+
+var _ Processor = ExcludeCaseSensitive{}
+
+func NewExcludeCaseSensitive(pattern string) *ExcludeCaseSensitive {
+ var patternRe *regexp.Regexp
+ if pattern != "" {
+ patternRe = regexp.MustCompile(pattern)
+ }
+ return &ExcludeCaseSensitive{
+ &Exclude{pattern: patternRe},
+ }
+}
+
+func (p ExcludeCaseSensitive) Name() string {
+ return "exclude-case-sensitive"
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/exclude_rules.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/exclude_rules.go
new file mode 100644
index 000000000..b926af5b1
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/exclude_rules.go
@@ -0,0 +1,143 @@
+package processors
+
+import (
+ "regexp"
+
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type excludeRule struct {
+ text *regexp.Regexp
+ source *regexp.Regexp
+ path *regexp.Regexp
+ linters []string
+}
+
+func (r *excludeRule) isEmpty() bool {
+ return r.text == nil && r.path == nil && len(r.linters) == 0
+}
+
+type ExcludeRule struct {
+ Text string
+ Source string
+ Path string
+ Linters []string
+}
+
+type ExcludeRules struct {
+ rules []excludeRule
+ lineCache *fsutils.LineCache
+ log logutils.Log
+}
+
+func NewExcludeRules(rules []ExcludeRule, lineCache *fsutils.LineCache, log logutils.Log) *ExcludeRules {
+ r := &ExcludeRules{
+ lineCache: lineCache,
+ log: log,
+ }
+ r.rules = createRules(rules, "(?i)")
+
+ return r
+}
+
+func createRules(rules []ExcludeRule, prefix string) []excludeRule {
+ parsedRules := make([]excludeRule, 0, len(rules))
+ for _, rule := range rules {
+ parsedRule := excludeRule{
+ linters: rule.Linters,
+ }
+ if rule.Text != "" {
+ parsedRule.text = regexp.MustCompile(prefix + rule.Text)
+ }
+ if rule.Source != "" {
+ parsedRule.source = regexp.MustCompile(prefix + rule.Source)
+ }
+ if rule.Path != "" {
+ parsedRule.path = regexp.MustCompile(rule.Path)
+ }
+ parsedRules = append(parsedRules, parsedRule)
+ }
+ return parsedRules
+}
+
+func (p ExcludeRules) Process(issues []result.Issue) ([]result.Issue, error) {
+ if len(p.rules) == 0 {
+ return issues, nil
+ }
+ return filterIssues(issues, func(i *result.Issue) bool {
+ for _, rule := range p.rules {
+ rule := rule
+ if p.match(i, &rule) {
+ return false
+ }
+ }
+ return true
+ }), nil
+}
+
+func (p ExcludeRules) matchLinter(i *result.Issue, r *excludeRule) bool {
+ for _, linter := range r.linters {
+ if linter == i.FromLinter {
+ return true
+ }
+ }
+
+ return false
+}
+
+func (p ExcludeRules) matchSource(i *result.Issue, r *excludeRule) bool { //nolint:interfacer
+ sourceLine, err := p.lineCache.GetLine(i.FilePath(), i.Line())
+ if err != nil {
+ p.log.Warnf("Failed to get line %s:%d from line cache: %s", i.FilePath(), i.Line(), err)
+ return false // can't properly match
+ }
+
+ return r.source.MatchString(sourceLine)
+}
+
+func (p ExcludeRules) match(i *result.Issue, r *excludeRule) bool {
+ if r.isEmpty() {
+ return false
+ }
+ if r.text != nil && !r.text.MatchString(i.Text) {
+ return false
+ }
+ if r.path != nil && !r.path.MatchString(i.FilePath()) {
+ return false
+ }
+ if len(r.linters) != 0 && !p.matchLinter(i, r) {
+ return false
+ }
+
+ // the most heavyweight checking last
+ if r.source != nil && !p.matchSource(i, r) {
+ return false
+ }
+
+ return true
+}
+
+func (ExcludeRules) Name() string { return "exclude-rules" }
+func (ExcludeRules) Finish() {}
+
+var _ Processor = ExcludeRules{}
+
+type ExcludeRulesCaseSensitive struct {
+ *ExcludeRules
+}
+
+func NewExcludeRulesCaseSensitive(rules []ExcludeRule, lineCache *fsutils.LineCache, log logutils.Log) *ExcludeRulesCaseSensitive {
+ r := &ExcludeRules{
+ lineCache: lineCache,
+ log: log,
+ }
+ r.rules = createRules(rules, "")
+
+ return &ExcludeRulesCaseSensitive{r}
+}
+
+func (ExcludeRulesCaseSensitive) Name() string { return "exclude-rules-case-sensitive" }
+
+var _ Processor = ExcludeCaseSensitive{}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/filename_unadjuster.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/filename_unadjuster.go
new file mode 100644
index 000000000..5e692ceba
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/filename_unadjuster.go
@@ -0,0 +1,123 @@
+package processors
+
+import (
+ "go/parser"
+ "go/token"
+ "path/filepath"
+ "strings"
+ "sync"
+ "time"
+
+ "golang.org/x/tools/go/packages"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type posMapper func(pos token.Position) token.Position
+
+// FilenameUnadjuster is needed because a lot of linters use fset.Position(f.Pos())
+// to get filename. And they return adjusted filename (e.g. *.qtpl) for an issue. We need
+// restore real .go filename to properly output it, parse it, etc.
+type FilenameUnadjuster struct {
+ m map[string]posMapper // map from adjusted filename to position mapper: adjusted -> unadjusted position
+ log logutils.Log
+ loggedUnadjustments map[string]bool
+}
+
+var _ Processor = &FilenameUnadjuster{}
+
+func processUnadjusterPkg(m map[string]posMapper, pkg *packages.Package, log logutils.Log) {
+ fset := token.NewFileSet() // it's more memory efficient to not store all in one fset
+
+ for _, filename := range pkg.CompiledGoFiles {
+ // It's important to call func here to run GC
+ processUnadjusterFile(filename, m, log, fset)
+ }
+}
+
+func processUnadjusterFile(filename string, m map[string]posMapper, log logutils.Log, fset *token.FileSet) {
+ syntax, err := parser.ParseFile(fset, filename, nil, parser.ParseComments)
+ if err != nil {
+ // Error will be reported by typecheck
+ return
+ }
+
+ adjustedFilename := fset.PositionFor(syntax.Pos(), true).Filename
+ if adjustedFilename == "" {
+ return
+ }
+
+ unadjustedFilename := fset.PositionFor(syntax.Pos(), false).Filename
+ if unadjustedFilename == "" || unadjustedFilename == adjustedFilename {
+ return
+ }
+
+ if !strings.HasSuffix(unadjustedFilename, ".go") {
+ return // file.go -> /caches/cgo-xxx
+ }
+
+ m[adjustedFilename] = func(adjustedPos token.Position) token.Position {
+ tokenFile := fset.File(syntax.Pos())
+ if tokenFile == nil {
+ log.Warnf("Failed to get token file for %s", adjustedFilename)
+ return adjustedPos
+ }
+ return fset.PositionFor(tokenFile.Pos(adjustedPos.Offset), false)
+ }
+}
+
+func NewFilenameUnadjuster(pkgs []*packages.Package, log logutils.Log) *FilenameUnadjuster {
+ m := map[string]posMapper{}
+ startedAt := time.Now()
+ var wg sync.WaitGroup
+ wg.Add(len(pkgs))
+ for _, pkg := range pkgs {
+ go func(pkg *packages.Package) {
+ // It's important to call func here to run GC
+ processUnadjusterPkg(m, pkg, log)
+ wg.Done()
+ }(pkg)
+ }
+ wg.Wait()
+ log.Infof("Pre-built %d adjustments in %s", len(m), time.Since(startedAt))
+
+ return &FilenameUnadjuster{
+ m: m,
+ log: log,
+ loggedUnadjustments: map[string]bool{},
+ }
+}
+
+func (p FilenameUnadjuster) Name() string {
+ return "filename_unadjuster"
+}
+
+func (p *FilenameUnadjuster) Process(issues []result.Issue) ([]result.Issue, error) {
+ return transformIssues(issues, func(i *result.Issue) *result.Issue {
+ issueFilePath := i.FilePath()
+ if !filepath.IsAbs(i.FilePath()) {
+ absPath, err := filepath.Abs(i.FilePath())
+ if err != nil {
+ p.log.Warnf("failed to build abs path for %q: %s", i.FilePath(), err)
+ return i
+ }
+ issueFilePath = absPath
+ }
+
+ mapper := p.m[issueFilePath]
+ if mapper == nil {
+ return i
+ }
+
+ newI := *i
+ newI.Pos = mapper(i.Pos)
+ if !p.loggedUnadjustments[i.Pos.Filename] {
+ p.log.Infof("Unadjusted from %v to %v", i.Pos, newI.Pos)
+ p.loggedUnadjustments[i.Pos.Filename] = true
+ }
+ return &newI
+ }), nil
+}
+
+func (FilenameUnadjuster) Finish() {}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/fixer.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/fixer.go
new file mode 100644
index 000000000..75fdc93f1
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/fixer.go
@@ -0,0 +1,248 @@
+package processors
+
+import (
+ "bytes"
+ "fmt"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+
+ "github.com/pkg/errors"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+ "github.com/golangci/golangci-lint/pkg/timeutils"
+)
+
+type Fixer struct {
+ cfg *config.Config
+ log logutils.Log
+ fileCache *fsutils.FileCache
+ sw *timeutils.Stopwatch
+}
+
+func NewFixer(cfg *config.Config, log logutils.Log, fileCache *fsutils.FileCache) *Fixer {
+ return &Fixer{
+ cfg: cfg,
+ log: log,
+ fileCache: fileCache,
+ sw: timeutils.NewStopwatch("fixer", log),
+ }
+}
+
+func (f Fixer) printStat() {
+ f.sw.PrintStages()
+}
+
+func (f Fixer) Process(issues []result.Issue) []result.Issue {
+ if !f.cfg.Issues.NeedFix {
+ return issues
+ }
+
+ outIssues := make([]result.Issue, 0, len(issues))
+ issuesToFixPerFile := map[string][]result.Issue{}
+ for i := range issues {
+ issue := &issues[i]
+ if issue.Replacement == nil {
+ outIssues = append(outIssues, *issue)
+ continue
+ }
+
+ issuesToFixPerFile[issue.FilePath()] = append(issuesToFixPerFile[issue.FilePath()], *issue)
+ }
+
+ for file, issuesToFix := range issuesToFixPerFile {
+ var err error
+ f.sw.TrackStage("all", func() {
+ err = f.fixIssuesInFile(file, issuesToFix) //nolint:scopelint
+ })
+ if err != nil {
+ f.log.Errorf("Failed to fix issues in file %s: %s", file, err)
+
+ // show issues only if can't fix them
+ outIssues = append(outIssues, issuesToFix...)
+ }
+ }
+
+ f.printStat()
+ return outIssues
+}
+
+func (f Fixer) fixIssuesInFile(filePath string, issues []result.Issue) error {
+ // TODO: don't read the whole file into memory: read line by line;
+ // can't just use bufio.scanner: it has a line length limit
+ origFileData, err := f.fileCache.GetFileBytes(filePath)
+ if err != nil {
+ return errors.Wrapf(err, "failed to get file bytes for %s", filePath)
+ }
+ origFileLines := bytes.Split(origFileData, []byte("\n"))
+
+ tmpFileName := filepath.Join(filepath.Dir(filePath), fmt.Sprintf(".%s.golangci_fix", filepath.Base(filePath)))
+ tmpOutFile, err := os.Create(tmpFileName)
+ if err != nil {
+ return errors.Wrapf(err, "failed to make file %s", tmpFileName)
+ }
+
+ // merge multiple issues per line into one issue
+ issuesPerLine := map[int][]result.Issue{}
+ for i := range issues {
+ issue := &issues[i]
+ issuesPerLine[issue.Line()] = append(issuesPerLine[issue.Line()], *issue)
+ }
+
+ issues = issues[:0] // reuse the same memory
+ for line, lineIssues := range issuesPerLine {
+ if mergedIssue := f.mergeLineIssues(line, lineIssues, origFileLines); mergedIssue != nil {
+ issues = append(issues, *mergedIssue)
+ }
+ }
+
+ issues = f.findNotIntersectingIssues(issues)
+
+ if err = f.writeFixedFile(origFileLines, issues, tmpOutFile); err != nil {
+ tmpOutFile.Close()
+ os.Remove(tmpOutFile.Name())
+ return err
+ }
+
+ tmpOutFile.Close()
+ if err = os.Rename(tmpOutFile.Name(), filePath); err != nil {
+ os.Remove(tmpOutFile.Name())
+ return errors.Wrapf(err, "failed to rename %s -> %s", tmpOutFile.Name(), filePath)
+ }
+
+ return nil
+}
+
+func (f Fixer) mergeLineIssues(lineNum int, lineIssues []result.Issue, origFileLines [][]byte) *result.Issue {
+ origLine := origFileLines[lineNum-1] // lineNum is 1-based
+
+ if len(lineIssues) == 1 && lineIssues[0].Replacement.Inline == nil {
+ return &lineIssues[0]
+ }
+
+ // check issues first
+ for ind := range lineIssues {
+ i := &lineIssues[ind]
+ if i.LineRange != nil {
+ f.log.Infof("Line %d has multiple issues but at least one of them is ranged: %#v", lineNum, lineIssues)
+ return &lineIssues[0]
+ }
+
+ r := i.Replacement
+ if r.Inline == nil || len(r.NewLines) != 0 || r.NeedOnlyDelete {
+ f.log.Infof("Line %d has multiple issues but at least one of them isn't inline: %#v", lineNum, lineIssues)
+ return &lineIssues[0]
+ }
+
+ if r.Inline.StartCol < 0 || r.Inline.Length <= 0 || r.Inline.StartCol+r.Inline.Length > len(origLine) {
+ f.log.Warnf("Line %d (%q) has invalid inline fix: %#v, %#v", lineNum, origLine, i, r.Inline)
+ return nil
+ }
+ }
+
+ return f.applyInlineFixes(lineIssues, origLine, lineNum)
+}
+
+func (f Fixer) applyInlineFixes(lineIssues []result.Issue, origLine []byte, lineNum int) *result.Issue {
+ sort.Slice(lineIssues, func(i, j int) bool {
+ return lineIssues[i].Replacement.Inline.StartCol < lineIssues[j].Replacement.Inline.StartCol
+ })
+
+ var newLineBuf bytes.Buffer
+ newLineBuf.Grow(len(origLine))
+
+ //nolint:misspell
+ // example: origLine="it's becouse of them", StartCol=5, Length=7, NewString="because"
+
+ curOrigLinePos := 0
+ for i := range lineIssues {
+ fix := lineIssues[i].Replacement.Inline
+ if fix.StartCol < curOrigLinePos {
+ f.log.Warnf("Line %d has multiple intersecting issues: %#v", lineNum, lineIssues)
+ return nil
+ }
+
+ if curOrigLinePos != fix.StartCol {
+ newLineBuf.Write(origLine[curOrigLinePos:fix.StartCol])
+ }
+ newLineBuf.WriteString(fix.NewString)
+ curOrigLinePos = fix.StartCol + fix.Length
+ }
+ if curOrigLinePos != len(origLine) {
+ newLineBuf.Write(origLine[curOrigLinePos:])
+ }
+
+ mergedIssue := lineIssues[0] // use text from the first issue (it's not really used)
+ mergedIssue.Replacement = &result.Replacement{
+ NewLines: []string{newLineBuf.String()},
+ }
+ return &mergedIssue
+}
+
+func (f Fixer) findNotIntersectingIssues(issues []result.Issue) []result.Issue {
+ sort.SliceStable(issues, func(i, j int) bool {
+ a, b := issues[i], issues[j]
+ return a.Line() < b.Line()
+ })
+
+ var ret []result.Issue
+ var currentEnd int
+ for i := range issues {
+ issue := &issues[i]
+ rng := issue.GetLineRange()
+ if rng.From <= currentEnd {
+ f.log.Infof("Skip issue %#v: intersects with end %d", issue, currentEnd)
+ continue // skip intersecting issue
+ }
+ f.log.Infof("Fix issue %#v with range %v", issue, issue.GetLineRange())
+ ret = append(ret, *issue)
+ currentEnd = rng.To
+ }
+
+ return ret
+}
+
+func (f Fixer) writeFixedFile(origFileLines [][]byte, issues []result.Issue, tmpOutFile *os.File) error {
+ // issues aren't intersecting
+
+ nextIssueIndex := 0
+ for i := 0; i < len(origFileLines); i++ {
+ var outLine string
+ var nextIssue *result.Issue
+ if nextIssueIndex != len(issues) {
+ nextIssue = &issues[nextIssueIndex]
+ }
+
+ origFileLineNumber := i + 1
+ if nextIssue == nil || origFileLineNumber != nextIssue.GetLineRange().From {
+ outLine = string(origFileLines[i])
+ } else {
+ nextIssueIndex++
+ rng := nextIssue.GetLineRange()
+ if rng.From > rng.To {
+ // Maybe better decision is to skip such issues, re-evaluate if regressed.
+ f.log.Warnf("[fixer]: issue line range is probably invalid, fix can be incorrect (from=%d, to=%d, linter=%s)",
+ rng.From, rng.To, nextIssue.FromLinter,
+ )
+ }
+ i += rng.To - rng.From
+ if nextIssue.Replacement.NeedOnlyDelete {
+ continue
+ }
+ outLine = strings.Join(nextIssue.Replacement.NewLines, "\n")
+ }
+
+ if i < len(origFileLines)-1 {
+ outLine += "\n"
+ }
+ if _, err := tmpOutFile.WriteString(outLine); err != nil {
+ return errors.Wrap(err, "failed to write output line")
+ }
+ }
+
+ return nil
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/identifier_marker.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/identifier_marker.go
new file mode 100644
index 000000000..5cc4e56ba
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/identifier_marker.go
@@ -0,0 +1,125 @@
+package processors
+
+import (
+ "regexp"
+
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type replacePattern struct {
+ re string
+ repl string
+}
+
+type replaceRegexp struct {
+ re *regexp.Regexp
+ repl string
+}
+
+var replacePatterns = []replacePattern{
+ // unparam
+ {`^(\S+) - (\S+) is unused$`, "`${1}` - `${2}` is unused"},
+ {`^(\S+) - (\S+) always receives (\S+) \((.*)\)$`, "`${1}` - `${2}` always receives `${3}` (`${4}`)"},
+ {`^(\S+) - (\S+) always receives (.*)$`, "`${1}` - `${2}` always receives `${3}`"},
+ {`^(\S+) - result (\S+) is always (\S+)`, "`${1}` - result `${2}` is always `${3}`"},
+
+ // interfacer
+ {`^(\S+) can be (\S+)$`, "`${1}` can be `${2}`"},
+
+ // govet
+ {`^printf: (\S+) arg list ends with redundant newline$`, "printf: `${1}` arg list ends with redundant newline"},
+ {`^composites: (\S+) composite literal uses unkeyed fields$`, "composites: `${1}` composite literal uses unkeyed fields"},
+
+ // gosec
+ {`^(\S+): Blacklisted import (\S+): weak cryptographic primitive$`,
+ "${1}: Blacklisted import `${2}`: weak cryptographic primitive"},
+ {`^TLS InsecureSkipVerify set true.$`, "TLS `InsecureSkipVerify` set true."},
+
+ // gosimple
+ {`should replace loop with (.*)$`, "should replace loop with `${1}`"},
+ {`should use a simple channel send/receive instead of select with a single case`,
+ "should use a simple channel send/receive instead of `select` with a single case"},
+ {`should omit comparison to bool constant, can be simplified to (.+)$`,
+ "should omit comparison to bool constant, can be simplified to `${1}`"},
+ {`should write (.+) instead of (.+)$`, "should write `${1}` instead of `${2}`"},
+ {`redundant return statement$`, "redundant `return` statement"},
+ {`should replace this if statement with an unconditional strings.TrimPrefix`,
+ "should replace this `if` statement with an unconditional `strings.TrimPrefix`"},
+
+ // staticcheck
+ {`this value of (\S+) is never used$`, "this value of `${1}` is never used"},
+ {`should use time.Since instead of time.Now\(\).Sub$`,
+ "should use `time.Since` instead of `time.Now().Sub`"},
+ {`should check returned error before deferring response.Close\(\)$`,
+ "should check returned error before deferring `response.Close()`"},
+ {`no value of type uint is less than 0$`, "no value of type `uint` is less than `0`"},
+
+ // unused
+ {`(func|const|field|type|var) (\S+) is unused$`, "${1} `${2}` is unused"},
+
+ // typecheck
+ {`^unknown field (\S+) in struct literal$`, "unknown field `${1}` in struct literal"},
+ {`^invalid operation: (\S+) \(variable of type (\S+)\) has no field or method (\S+)$`,
+ "invalid operation: `${1}` (variable of type `${2}`) has no field or method `${3}`"},
+ {`^undeclared name: (\S+)$`, "undeclared name: `${1}`"},
+ {`^cannot use addr \(variable of type (\S+)\) as (\S+) value in argument to (\S+)$`,
+ "cannot use addr (variable of type `${1}`) as `${2}` value in argument to `${3}`"},
+ {`^other declaration of (\S+)$`, "other declaration of `${1}`"},
+ {`^(\S+) redeclared in this block$`, "`${1}` redeclared in this block"},
+
+ // golint
+ {`^exported (type|method|function|var|const) (\S+) should have comment or be unexported$`,
+ "exported ${1} `${2}` should have comment or be unexported"},
+ {`^comment on exported (type|method|function|var|const) (\S+) should be of the form "(\S+) ..."$`,
+ "comment on exported ${1} `${2}` should be of the form `${3} ...`"},
+ {`^should replace (.+) with (.+)$`, "should replace `${1}` with `${2}`"},
+ {`^if block ends with a return statement, so drop this else and outdent its block$`,
+ "`if` block ends with a `return` statement, so drop this `else` and outdent its block"},
+ {`^(struct field|var|range var|const|type|(?:func|method|interface method) (?:parameter|result)) (\S+) should be (\S+)$`,
+ "${1} `${2}` should be `${3}`"},
+ {`^don't use underscores in Go names; var (\S+) should be (\S+)$`,
+ "don't use underscores in Go names; var `${1}` should be `${2}`"},
+}
+
+type IdentifierMarker struct {
+ replaceRegexps []replaceRegexp
+}
+
+func NewIdentifierMarker() *IdentifierMarker {
+ var replaceRegexps []replaceRegexp
+ for _, p := range replacePatterns {
+ r := replaceRegexp{
+ re: regexp.MustCompile(p.re),
+ repl: p.repl,
+ }
+ replaceRegexps = append(replaceRegexps, r)
+ }
+
+ return &IdentifierMarker{
+ replaceRegexps: replaceRegexps,
+ }
+}
+
+func (im IdentifierMarker) Process(issues []result.Issue) ([]result.Issue, error) {
+ return transformIssues(issues, func(i *result.Issue) *result.Issue {
+ iCopy := *i
+ iCopy.Text = im.markIdentifiers(iCopy.Text)
+ return &iCopy
+ }), nil
+}
+
+func (im IdentifierMarker) markIdentifiers(s string) string {
+ for _, rr := range im.replaceRegexps {
+ rs := rr.re.ReplaceAllString(s, rr.repl)
+ if rs != s {
+ return rs
+ }
+ }
+
+ return s
+}
+
+func (im IdentifierMarker) Name() string {
+ return "identifier_marker"
+}
+func (im IdentifierMarker) Finish() {}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/max_from_linter.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/max_from_linter.go
new file mode 100644
index 000000000..c58666c56
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/max_from_linter.go
@@ -0,0 +1,54 @@
+package processors
+
+import (
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type MaxFromLinter struct {
+ lc linterToCountMap
+ limit int
+ log logutils.Log
+ cfg *config.Config
+}
+
+var _ Processor = &MaxFromLinter{}
+
+func NewMaxFromLinter(limit int, log logutils.Log, cfg *config.Config) *MaxFromLinter {
+ return &MaxFromLinter{
+ lc: linterToCountMap{},
+ limit: limit,
+ log: log,
+ cfg: cfg,
+ }
+}
+
+func (p MaxFromLinter) Name() string {
+ return "max_from_linter"
+}
+
+func (p *MaxFromLinter) Process(issues []result.Issue) ([]result.Issue, error) {
+ if p.limit <= 0 { // no limit
+ return issues, nil
+ }
+
+ return filterIssues(issues, func(i *result.Issue) bool {
+ if i.Replacement != nil && p.cfg.Issues.NeedFix {
+ // we need to fix all issues at once => we need to return all of them
+ return true
+ }
+
+ p.lc[i.FromLinter]++ // always inc for stat
+ return p.lc[i.FromLinter] <= p.limit
+ }), nil
+}
+
+func (p MaxFromLinter) Finish() {
+ walkStringToIntMapSortedByValue(p.lc, func(linter string, count int) {
+ if count > p.limit {
+ p.log.Infof("%d/%d issues from linter %s were hidden, use --max-issues-per-linter",
+ count-p.limit, count, linter)
+ }
+ })
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/max_per_file_from_linter.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/max_per_file_from_linter.go
new file mode 100644
index 000000000..e83c569ef
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/max_per_file_from_linter.go
@@ -0,0 +1,60 @@
+package processors
+
+import (
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type linterToCountMap map[string]int
+type fileToLinterToCountMap map[string]linterToCountMap
+
+type MaxPerFileFromLinter struct {
+ flc fileToLinterToCountMap
+ maxPerFileFromLinterConfig map[string]int
+}
+
+var _ Processor = &MaxPerFileFromLinter{}
+
+func NewMaxPerFileFromLinter(cfg *config.Config) *MaxPerFileFromLinter {
+ maxPerFileFromLinterConfig := map[string]int{
+ "typecheck": 3,
+ }
+ if !cfg.Issues.NeedFix {
+ // if we don't fix we do this limiting to not annoy user;
+ // otherwise we need to fix all issues in the file at once
+ maxPerFileFromLinterConfig["gofmt"] = 1
+ maxPerFileFromLinterConfig["goimports"] = 1
+ }
+
+ return &MaxPerFileFromLinter{
+ flc: fileToLinterToCountMap{},
+ maxPerFileFromLinterConfig: maxPerFileFromLinterConfig,
+ }
+}
+
+func (p MaxPerFileFromLinter) Name() string {
+ return "max_per_file_from_linter"
+}
+
+func (p *MaxPerFileFromLinter) Process(issues []result.Issue) ([]result.Issue, error) {
+ return filterIssues(issues, func(i *result.Issue) bool {
+ limit := p.maxPerFileFromLinterConfig[i.FromLinter]
+ if limit == 0 {
+ return true
+ }
+
+ lm := p.flc[i.FilePath()]
+ if lm == nil {
+ p.flc[i.FilePath()] = linterToCountMap{}
+ }
+ count := p.flc[i.FilePath()][i.FromLinter]
+ if count >= limit {
+ return false
+ }
+
+ p.flc[i.FilePath()][i.FromLinter]++
+ return true
+ }), nil
+}
+
+func (p MaxPerFileFromLinter) Finish() {}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/max_same_issues.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/max_same_issues.go
new file mode 100644
index 000000000..84fdf0c05
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/max_same_issues.go
@@ -0,0 +1,81 @@
+package processors
+
+import (
+ "sort"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type textToCountMap map[string]int
+
+type MaxSameIssues struct {
+ tc textToCountMap
+ limit int
+ log logutils.Log
+ cfg *config.Config
+}
+
+var _ Processor = &MaxSameIssues{}
+
+func NewMaxSameIssues(limit int, log logutils.Log, cfg *config.Config) *MaxSameIssues {
+ return &MaxSameIssues{
+ tc: textToCountMap{},
+ limit: limit,
+ log: log,
+ cfg: cfg,
+ }
+}
+
+func (MaxSameIssues) Name() string {
+ return "max_same_issues"
+}
+
+func (p *MaxSameIssues) Process(issues []result.Issue) ([]result.Issue, error) {
+ if p.limit <= 0 { // no limit
+ return issues, nil
+ }
+
+ return filterIssues(issues, func(i *result.Issue) bool {
+ if i.Replacement != nil && p.cfg.Issues.NeedFix {
+ // we need to fix all issues at once => we need to return all of them
+ return true
+ }
+
+ p.tc[i.Text]++ // always inc for stat
+ return p.tc[i.Text] <= p.limit
+ }), nil
+}
+
+func (p MaxSameIssues) Finish() {
+ walkStringToIntMapSortedByValue(p.tc, func(text string, count int) {
+ if count > p.limit {
+ p.log.Infof("%d/%d issues with text %q were hidden, use --max-same-issues",
+ count-p.limit, count, text)
+ }
+ })
+}
+
+type kv struct {
+ Key string
+ Value int
+}
+
+func walkStringToIntMapSortedByValue(m map[string]int, walk func(k string, v int)) {
+ var ss []kv
+ for k, v := range m {
+ ss = append(ss, kv{
+ Key: k,
+ Value: v,
+ })
+ }
+
+ sort.Slice(ss, func(i, j int) bool {
+ return ss[i].Value > ss[j].Value
+ })
+
+ for _, kv := range ss {
+ walk(kv.Key, kv.Value)
+ }
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/nolint.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/nolint.go
new file mode 100644
index 000000000..cda101784
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/nolint.go
@@ -0,0 +1,304 @@
+package processors
+
+import (
+ "fmt"
+ "go/ast"
+ "go/parser"
+ "go/token"
+ "sort"
+ "strings"
+
+ "github.com/golangci/golangci-lint/pkg/golinters"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/lint/lintersdb"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+var nolintDebugf = logutils.Debug("nolint")
+
+type ignoredRange struct {
+ linters []string
+ matchedIssueFromLinter map[string]bool
+ result.Range
+ col int
+}
+
+func (i *ignoredRange) doesMatch(issue *result.Issue) bool {
+ if issue.Line() < i.From || issue.Line() > i.To {
+ return false
+ }
+
+ // handle possible unused nolint directives
+ // nolintlint generates potential issues for every nolint directive and they are filtered out here
+ if issue.ExpectNoLint {
+ if issue.ExpectedNoLintLinter != "" {
+ return i.matchedIssueFromLinter[issue.ExpectedNoLintLinter]
+ }
+ return len(i.matchedIssueFromLinter) > 0
+ }
+
+ if len(i.linters) == 0 {
+ return true
+ }
+
+ for _, linterName := range i.linters {
+ if linterName == issue.FromLinter {
+ return true
+ }
+ }
+
+ return false
+}
+
+type fileData struct {
+ ignoredRanges []ignoredRange
+}
+
+type filesCache map[string]*fileData
+
+type Nolint struct {
+ cache filesCache
+ dbManager *lintersdb.Manager
+ enabledLinters map[string]*linter.Config
+ log logutils.Log
+
+ unknownLintersSet map[string]bool
+}
+
+func NewNolint(log logutils.Log, dbManager *lintersdb.Manager, enabledLinters map[string]*linter.Config) *Nolint {
+ return &Nolint{
+ cache: filesCache{},
+ dbManager: dbManager,
+ enabledLinters: enabledLinters,
+ log: log,
+ unknownLintersSet: map[string]bool{},
+ }
+}
+
+var _ Processor = &Nolint{}
+
+func (p Nolint) Name() string {
+ return "nolint"
+}
+
+func (p *Nolint) Process(issues []result.Issue) ([]result.Issue, error) {
+ // put nolintlint issues last because we process other issues first to determine which nolint directives are unused
+ sort.Stable(sortWithNolintlintLast(issues))
+ return filterIssuesErr(issues, p.shouldPassIssue)
+}
+
+func (p *Nolint) getOrCreateFileData(i *result.Issue) (*fileData, error) {
+ fd := p.cache[i.FilePath()]
+ if fd != nil {
+ return fd, nil
+ }
+
+ fd = &fileData{}
+ p.cache[i.FilePath()] = fd
+
+ if i.FilePath() == "" {
+ return nil, fmt.Errorf("no file path for issue")
+ }
+
+ // TODO: migrate this parsing to go/analysis facts
+ // or cache them somehow per file.
+
+ // Don't use cached AST because they consume a lot of memory on large projects.
+ fset := token.NewFileSet()
+ f, err := parser.ParseFile(fset, i.FilePath(), nil, parser.ParseComments)
+ if err != nil {
+ // Don't report error because it's already must be reporter by typecheck or go/analysis.
+ return fd, nil
+ }
+
+ fd.ignoredRanges = p.buildIgnoredRangesForFile(f, fset, i.FilePath())
+ nolintDebugf("file %s: built nolint ranges are %+v", i.FilePath(), fd.ignoredRanges)
+ return fd, nil
+}
+
+func (p *Nolint) buildIgnoredRangesForFile(f *ast.File, fset *token.FileSet, filePath string) []ignoredRange {
+ inlineRanges := p.extractFileCommentsInlineRanges(fset, f.Comments...)
+ nolintDebugf("file %s: inline nolint ranges are %+v", filePath, inlineRanges)
+
+ if len(inlineRanges) == 0 {
+ return nil
+ }
+
+ e := rangeExpander{
+ fset: fset,
+ inlineRanges: inlineRanges,
+ }
+
+ ast.Walk(&e, f)
+
+ // TODO: merge all ranges: there are repeated ranges
+ allRanges := append([]ignoredRange{}, inlineRanges...)
+ allRanges = append(allRanges, e.expandedRanges...)
+
+ return allRanges
+}
+
+func (p *Nolint) shouldPassIssue(i *result.Issue) (bool, error) {
+ nolintDebugf("got issue: %v", *i)
+ if i.FromLinter == golinters.NolintlintName {
+ // always pass nolintlint issues except ones trying find unused nolint directives
+ if !i.ExpectNoLint {
+ return true, nil
+ }
+ if i.ExpectedNoLintLinter != "" {
+ // don't expect disabled linters to cover their nolint statements
+ nolintDebugf("enabled linters: %v", p.enabledLinters)
+ if p.enabledLinters[i.ExpectedNoLintLinter] == nil {
+ return false, nil
+ }
+ nolintDebugf("checking that lint issue was used for %s: %v", i.ExpectedNoLintLinter, i)
+ }
+ }
+
+ fd, err := p.getOrCreateFileData(i)
+ if err != nil {
+ return false, err
+ }
+
+ for _, ir := range fd.ignoredRanges {
+ if ir.doesMatch(i) {
+ ir.matchedIssueFromLinter[i.FromLinter] = true
+ return false, nil
+ }
+ }
+
+ return true, nil
+}
+
+type rangeExpander struct {
+ fset *token.FileSet
+ inlineRanges []ignoredRange
+ expandedRanges []ignoredRange
+}
+
+func (e *rangeExpander) Visit(node ast.Node) ast.Visitor {
+ if node == nil {
+ return e
+ }
+
+ nodeStartPos := e.fset.Position(node.Pos())
+ nodeStartLine := nodeStartPos.Line
+ nodeEndLine := e.fset.Position(node.End()).Line
+
+ var foundRange *ignoredRange
+ for _, r := range e.inlineRanges {
+ if r.To == nodeStartLine-1 && nodeStartPos.Column == r.col {
+ r := r
+ foundRange = &r
+ break
+ }
+ }
+ if foundRange == nil {
+ return e
+ }
+
+ expandedRange := *foundRange
+ if expandedRange.To < nodeEndLine {
+ expandedRange.To = nodeEndLine
+ }
+ nolintDebugf("found range is %v for node %#v [%d;%d], expanded range is %v",
+ *foundRange, node, nodeStartLine, nodeEndLine, expandedRange)
+ e.expandedRanges = append(e.expandedRanges, expandedRange)
+
+ return e
+}
+
+func (p *Nolint) extractFileCommentsInlineRanges(fset *token.FileSet, comments ...*ast.CommentGroup) []ignoredRange {
+ var ret []ignoredRange
+ for _, g := range comments {
+ for _, c := range g.List {
+ ir := p.extractInlineRangeFromComment(c.Text, g, fset)
+ if ir != nil {
+ ret = append(ret, *ir)
+ }
+ }
+ }
+
+ return ret
+}
+
+func (p *Nolint) extractInlineRangeFromComment(text string, g ast.Node, fset *token.FileSet) *ignoredRange {
+ text = strings.TrimLeft(text, "/ ")
+ if !strings.HasPrefix(text, "nolint") {
+ return nil
+ }
+
+ buildRange := func(linters []string) *ignoredRange {
+ pos := fset.Position(g.Pos())
+ return &ignoredRange{
+ Range: result.Range{
+ From: pos.Line,
+ To: fset.Position(g.End()).Line,
+ },
+ col: pos.Column,
+ linters: linters,
+ matchedIssueFromLinter: make(map[string]bool),
+ }
+ }
+
+ if !strings.HasPrefix(text, "nolint:") {
+ return buildRange(nil) // ignore all linters
+ }
+
+ // ignore specific linters
+ var linters []string
+ text = strings.Split(text, "//")[0] // allow another comment after this comment
+ linterItems := strings.Split(strings.TrimPrefix(text, "nolint:"), ",")
+ var gotUnknownLinters bool
+ for _, linter := range linterItems {
+ linterName := strings.ToLower(strings.TrimSpace(linter))
+
+ lcs := p.dbManager.GetLinterConfigs(linterName)
+ if lcs == nil {
+ p.unknownLintersSet[linterName] = true
+ gotUnknownLinters = true
+ continue
+ }
+
+ for _, lc := range lcs {
+ linters = append(linters, lc.Name()) // normalize name to work with aliases
+ }
+ }
+
+ if gotUnknownLinters {
+ return buildRange(nil) // ignore all linters to not annoy user
+ }
+
+ nolintDebugf("%d: linters are %s", fset.Position(g.Pos()).Line, linters)
+ return buildRange(linters)
+}
+
+func (p Nolint) Finish() {
+ if len(p.unknownLintersSet) == 0 {
+ return
+ }
+
+ unknownLinters := []string{}
+ for name := range p.unknownLintersSet {
+ unknownLinters = append(unknownLinters, name)
+ }
+ sort.Strings(unknownLinters)
+
+ p.log.Warnf("Found unknown linters in //nolint directives: %s", strings.Join(unknownLinters, ", "))
+}
+
+// put nolintlint last
+type sortWithNolintlintLast []result.Issue
+
+func (issues sortWithNolintlintLast) Len() int {
+ return len(issues)
+}
+
+func (issues sortWithNolintlintLast) Less(i, j int) bool {
+ return issues[i].FromLinter != golinters.NolintlintName && issues[j].FromLinter == golinters.NolintlintName
+}
+
+func (issues sortWithNolintlintLast) Swap(i, j int) {
+ issues[j], issues[i] = issues[i], issues[j]
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/path_prettifier.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/path_prettifier.go
new file mode 100644
index 000000000..3a140999c
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/path_prettifier.go
@@ -0,0 +1,48 @@
+package processors
+
+import (
+ "fmt"
+ "path/filepath"
+
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type PathPrettifier struct {
+ root string
+}
+
+var _ Processor = PathPrettifier{}
+
+func NewPathPrettifier() *PathPrettifier {
+ root, err := fsutils.Getwd()
+ if err != nil {
+ panic(fmt.Sprintf("Can't get working dir: %s", err))
+ }
+ return &PathPrettifier{
+ root: root,
+ }
+}
+
+func (p PathPrettifier) Name() string {
+ return "path_prettifier"
+}
+
+func (p PathPrettifier) Process(issues []result.Issue) ([]result.Issue, error) {
+ return transformIssues(issues, func(i *result.Issue) *result.Issue {
+ if !filepath.IsAbs(i.FilePath()) {
+ return i
+ }
+
+ rel, err := fsutils.ShortestRelPath(i.FilePath(), "")
+ if err != nil {
+ return i
+ }
+
+ newI := i
+ newI.Pos.Filename = rel
+ return newI
+ }), nil
+}
+
+func (p PathPrettifier) Finish() {}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/path_shortener.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/path_shortener.go
new file mode 100644
index 000000000..484f7f1f1
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/path_shortener.go
@@ -0,0 +1,40 @@
+package processors
+
+import (
+ "fmt"
+ "strings"
+
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type PathShortener struct {
+ wd string
+}
+
+var _ Processor = PathShortener{}
+
+func NewPathShortener() *PathShortener {
+ wd, err := fsutils.Getwd()
+ if err != nil {
+ panic(fmt.Sprintf("Can't get working dir: %s", err))
+ }
+ return &PathShortener{
+ wd: wd,
+ }
+}
+
+func (p PathShortener) Name() string {
+ return "path_shortener"
+}
+
+func (p PathShortener) Process(issues []result.Issue) ([]result.Issue, error) {
+ return transformIssues(issues, func(i *result.Issue) *result.Issue {
+ newI := i
+ newI.Text = strings.Replace(newI.Text, p.wd+"/", "", -1)
+ newI.Text = strings.Replace(newI.Text, p.wd, "", -1)
+ return newI
+ }), nil
+}
+
+func (p PathShortener) Finish() {}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/processor.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/processor.go
new file mode 100644
index 000000000..1a7a40434
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/processor.go
@@ -0,0 +1,11 @@
+package processors
+
+import (
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Processor interface {
+ Process(issues []result.Issue) ([]result.Issue, error)
+ Name() string
+ Finish()
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/skip_dirs.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/skip_dirs.go
new file mode 100644
index 000000000..6488c109e
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/skip_dirs.go
@@ -0,0 +1,143 @@
+package processors
+
+import (
+ "path/filepath"
+ "regexp"
+ "strings"
+
+ "github.com/pkg/errors"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type skipStat struct {
+ pattern string
+ count int
+}
+
+type SkipDirs struct {
+ patterns []*regexp.Regexp
+ log logutils.Log
+ skippedDirs map[string]*skipStat
+ absArgsDirs []string
+ skippedDirsCache map[string]bool
+}
+
+var _ Processor = SkipFiles{}
+
+const goFileSuffix = ".go"
+
+func NewSkipDirs(patterns []string, log logutils.Log, runArgs []string) (*SkipDirs, error) {
+ var patternsRe []*regexp.Regexp
+ for _, p := range patterns {
+ p = normalizePathInRegex(p)
+ patternRe, err := regexp.Compile(p)
+ if err != nil {
+ return nil, errors.Wrapf(err, "can't compile regexp %q", p)
+ }
+ patternsRe = append(patternsRe, patternRe)
+ }
+
+ if len(runArgs) == 0 {
+ runArgs = append(runArgs, "./...")
+ }
+ var absArgsDirs []string
+ for _, arg := range runArgs {
+ base := filepath.Base(arg)
+ if base == "..." || strings.HasSuffix(base, goFileSuffix) {
+ arg = filepath.Dir(arg)
+ }
+
+ absArg, err := filepath.Abs(arg)
+ if err != nil {
+ return nil, errors.Wrapf(err, "failed to abs-ify arg %q", arg)
+ }
+ absArgsDirs = append(absArgsDirs, absArg)
+ }
+
+ return &SkipDirs{
+ patterns: patternsRe,
+ log: log,
+ skippedDirs: map[string]*skipStat{},
+ absArgsDirs: absArgsDirs,
+ skippedDirsCache: map[string]bool{},
+ }, nil
+}
+
+func (p *SkipDirs) Name() string {
+ return "skip_dirs"
+}
+
+func (p *SkipDirs) Process(issues []result.Issue) ([]result.Issue, error) {
+ if len(p.patterns) == 0 {
+ return issues, nil
+ }
+
+ return filterIssues(issues, p.shouldPassIssue), nil
+}
+
+func (p *SkipDirs) shouldPassIssue(i *result.Issue) bool {
+ if filepath.IsAbs(i.FilePath()) {
+ if !isSpecialAutogeneratedFile(i.FilePath()) {
+ p.log.Warnf("Got abs path %s in skip dirs processor, it should be relative", i.FilePath())
+ }
+ return true
+ }
+
+ issueRelDir := filepath.Dir(i.FilePath())
+
+ if toPass, ok := p.skippedDirsCache[issueRelDir]; ok {
+ if !toPass {
+ p.skippedDirs[issueRelDir].count++
+ }
+ return toPass
+ }
+
+ issueAbsDir, err := filepath.Abs(issueRelDir)
+ if err != nil {
+ p.log.Warnf("Can't abs-ify path %q: %s", issueRelDir, err)
+ return true
+ }
+
+ toPass := p.shouldPassIssueDirs(issueRelDir, issueAbsDir)
+ p.skippedDirsCache[issueRelDir] = toPass
+ return toPass
+}
+
+func (p *SkipDirs) shouldPassIssueDirs(issueRelDir, issueAbsDir string) bool {
+ for _, absArgDir := range p.absArgsDirs {
+ if absArgDir == issueAbsDir {
+ // we must not skip issues if they are from explicitly set dirs
+ // even if they match skip patterns
+ return true
+ }
+ }
+
+ // We use issueRelDir for matching: it's the relative to the current
+ // work dir path of directory of source file with the issue. It can lead
+ // to unexpected behavior if we're analyzing files out of current work dir.
+ // The alternative solution is to find relative to args path, but it has
+ // disadvantages (https://github.com/golangci/golangci-lint/pull/313).
+
+ for _, pattern := range p.patterns {
+ if pattern.MatchString(issueRelDir) {
+ ps := pattern.String()
+ if p.skippedDirs[issueRelDir] == nil {
+ p.skippedDirs[issueRelDir] = &skipStat{
+ pattern: ps,
+ }
+ }
+ p.skippedDirs[issueRelDir].count++
+ return false
+ }
+ }
+
+ return true
+}
+
+func (p *SkipDirs) Finish() {
+ for dir, stat := range p.skippedDirs {
+ p.log.Infof("Skipped %d issues from dir %s by pattern %s", stat.count, dir, stat.pattern)
+ }
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/skip_files.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/skip_files.go
new file mode 100644
index 000000000..522b07e4f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/skip_files.go
@@ -0,0 +1,52 @@
+package processors
+
+import (
+ "fmt"
+ "regexp"
+
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type SkipFiles struct {
+ patterns []*regexp.Regexp
+}
+
+var _ Processor = SkipFiles{}
+
+func NewSkipFiles(patterns []string) (*SkipFiles, error) {
+ var patternsRe []*regexp.Regexp
+ for _, p := range patterns {
+ p = normalizePathInRegex(p)
+ patternRe, err := regexp.Compile(p)
+ if err != nil {
+ return nil, fmt.Errorf("can't compile regexp %q: %s", p, err)
+ }
+ patternsRe = append(patternsRe, patternRe)
+ }
+
+ return &SkipFiles{
+ patterns: patternsRe,
+ }, nil
+}
+
+func (p SkipFiles) Name() string {
+ return "skip_files"
+}
+
+func (p SkipFiles) Process(issues []result.Issue) ([]result.Issue, error) {
+ if len(p.patterns) == 0 {
+ return issues, nil
+ }
+
+ return filterIssues(issues, func(i *result.Issue) bool {
+ for _, p := range p.patterns {
+ if p.MatchString(i.FilePath()) {
+ return false
+ }
+ }
+
+ return true
+ }), nil
+}
+
+func (p SkipFiles) Finish() {}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/source_code.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/source_code.go
new file mode 100644
index 000000000..cfd73cb98
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/source_code.go
@@ -0,0 +1,47 @@
+package processors
+
+import (
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type SourceCode struct {
+ lineCache *fsutils.LineCache
+ log logutils.Log
+}
+
+var _ Processor = SourceCode{}
+
+func NewSourceCode(lc *fsutils.LineCache, log logutils.Log) *SourceCode {
+ return &SourceCode{
+ lineCache: lc,
+ log: log,
+ }
+}
+
+func (p SourceCode) Name() string {
+ return "source_code"
+}
+
+func (p SourceCode) Process(issues []result.Issue) ([]result.Issue, error) {
+ return transformIssues(issues, func(i *result.Issue) *result.Issue {
+ newI := *i
+
+ lineRange := i.GetLineRange()
+ for lineNumber := lineRange.From; lineNumber <= lineRange.To; lineNumber++ {
+ line, err := p.lineCache.GetLine(i.FilePath(), lineNumber)
+ if err != nil {
+ p.log.Warnf("Failed to get line %d for file %s: %s",
+ lineNumber, i.FilePath(), err)
+ return i
+ }
+
+ newI.SourceLines = append(newI.SourceLines, line)
+ }
+
+ return &newI
+ }), nil
+}
+
+func (p SourceCode) Finish() {}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/uniq_by_line.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/uniq_by_line.go
new file mode 100644
index 000000000..17167dde5
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/uniq_by_line.go
@@ -0,0 +1,58 @@
+package processors
+
+import (
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type lineToCount map[int]int
+type fileToLineToCount map[string]lineToCount
+
+type UniqByLine struct {
+ flc fileToLineToCount
+ cfg *config.Config
+}
+
+func NewUniqByLine(cfg *config.Config) *UniqByLine {
+ return &UniqByLine{
+ flc: fileToLineToCount{},
+ cfg: cfg,
+ }
+}
+
+var _ Processor = &UniqByLine{}
+
+func (p UniqByLine) Name() string {
+ return "uniq_by_line"
+}
+
+func (p *UniqByLine) Process(issues []result.Issue) ([]result.Issue, error) {
+ if !p.cfg.Output.UniqByLine {
+ return issues, nil
+ }
+
+ return filterIssues(issues, func(i *result.Issue) bool {
+ if i.Replacement != nil && p.cfg.Issues.NeedFix {
+ // if issue will be auto-fixed we shouldn't collapse issues:
+ // e.g. one line can contain 2 misspellings, they will be in 2 issues and misspell should fix both of them.
+ return true
+ }
+
+ lc := p.flc[i.FilePath()]
+ if lc == nil {
+ lc = lineToCount{}
+ p.flc[i.FilePath()] = lc
+ }
+
+ const limit = 1
+ count := lc[i.Line()]
+ if count == limit {
+ return false
+ }
+
+ lc[i.Line()]++
+ return true
+ }), nil
+}
+
+func (p UniqByLine) Finish() {}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/result/processors/utils.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/utils.go
new file mode 100644
index 000000000..7108fd3b3
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/utils.go
@@ -0,0 +1,62 @@
+package processors
+
+import (
+ "path/filepath"
+ "regexp"
+ "strings"
+
+ "github.com/pkg/errors"
+
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func filterIssues(issues []result.Issue, filter func(i *result.Issue) bool) []result.Issue {
+ retIssues := make([]result.Issue, 0, len(issues))
+ for i := range issues {
+ if filter(&issues[i]) {
+ retIssues = append(retIssues, issues[i])
+ }
+ }
+
+ return retIssues
+}
+
+func filterIssuesErr(issues []result.Issue, filter func(i *result.Issue) (bool, error)) ([]result.Issue, error) {
+ retIssues := make([]result.Issue, 0, len(issues))
+ for i := range issues {
+ ok, err := filter(&issues[i])
+ if err != nil {
+ return nil, errors.Wrapf(err, "can't filter issue %#v", issues[i])
+ }
+
+ if ok {
+ retIssues = append(retIssues, issues[i])
+ }
+ }
+
+ return retIssues, nil
+}
+
+func transformIssues(issues []result.Issue, transform func(i *result.Issue) *result.Issue) []result.Issue {
+ retIssues := make([]result.Issue, 0, len(issues))
+ for i := range issues {
+ newI := transform(&issues[i])
+ if newI != nil {
+ retIssues = append(retIssues, *newI)
+ }
+ }
+
+ return retIssues
+}
+
+var separatorToReplace = regexp.QuoteMeta(string(filepath.Separator))
+
+func normalizePathInRegex(path string) string {
+ if filepath.Separator == '/' {
+ return path
+ }
+
+ // This replacing should be safe because "/" are disallowed in Windows
+ // https://docs.microsoft.com/ru-ru/windows/win32/fileio/naming-a-file
+ return strings.ReplaceAll(path, "/", separatorToReplace)
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go b/vendor/github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go
new file mode 100644
index 000000000..9628bd80f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go
@@ -0,0 +1,116 @@
+package timeutils
+
+import (
+ "fmt"
+ "sort"
+ "strings"
+ "sync"
+ "time"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+const noStagesText = "no stages"
+
+type Stopwatch struct {
+ name string
+ startedAt time.Time
+ stages map[string]time.Duration
+ log logutils.Log
+
+ sync.Mutex
+}
+
+func NewStopwatch(name string, log logutils.Log) *Stopwatch {
+ return &Stopwatch{
+ name: name,
+ startedAt: time.Now(),
+ stages: map[string]time.Duration{},
+ log: log,
+ }
+}
+
+type stageDuration struct {
+ name string
+ d time.Duration
+}
+
+func (s *Stopwatch) stageDurationsSorted() []stageDuration {
+ stageDurations := []stageDuration{}
+ for n, d := range s.stages {
+ stageDurations = append(stageDurations, stageDuration{
+ name: n,
+ d: d,
+ })
+ }
+ sort.Slice(stageDurations, func(i, j int) bool {
+ return stageDurations[i].d > stageDurations[j].d
+ })
+ return stageDurations
+}
+
+func (s *Stopwatch) sprintStages() string {
+ if len(s.stages) == 0 {
+ return noStagesText
+ }
+
+ stageDurations := s.stageDurationsSorted()
+
+ stagesStrings := []string{}
+ for _, s := range stageDurations {
+ stagesStrings = append(stagesStrings, fmt.Sprintf("%s: %s", s.name, s.d))
+ }
+
+ return fmt.Sprintf("stages: %s", strings.Join(stagesStrings, ", "))
+}
+
+func (s *Stopwatch) sprintTopStages(n int) string {
+ if len(s.stages) == 0 {
+ return noStagesText
+ }
+
+ stageDurations := s.stageDurationsSorted()
+
+ stagesStrings := []string{}
+ for i := 0; i < len(stageDurations) && i < n; i++ {
+ s := stageDurations[i]
+ stagesStrings = append(stagesStrings, fmt.Sprintf("%s: %s", s.name, s.d))
+ }
+
+ return fmt.Sprintf("top %d stages: %s", n, strings.Join(stagesStrings, ", "))
+}
+
+func (s *Stopwatch) Print() {
+ p := fmt.Sprintf("%s took %s", s.name, time.Since(s.startedAt))
+ if len(s.stages) == 0 {
+ s.log.Infof("%s", p)
+ return
+ }
+
+ s.log.Infof("%s with %s", p, s.sprintStages())
+}
+
+func (s *Stopwatch) PrintStages() {
+ var stagesDuration time.Duration
+ for _, s := range s.stages {
+ stagesDuration += s
+ }
+ s.log.Infof("%s took %s with %s", s.name, stagesDuration, s.sprintStages())
+}
+
+func (s *Stopwatch) PrintTopStages(n int) {
+ var stagesDuration time.Duration
+ for _, s := range s.stages {
+ stagesDuration += s
+ }
+ s.log.Infof("%s took %s with %s", s.name, stagesDuration, s.sprintTopStages(n))
+}
+
+func (s *Stopwatch) TrackStage(name string, f func()) {
+ startedAt := time.Now()
+ f()
+
+ s.Lock()
+ s.stages[name] += time.Since(startedAt)
+ s.Unlock()
+}
diff --git a/vendor/github.com/golangci/ineffassign/.gitignore b/vendor/github.com/golangci/ineffassign/.gitignore
new file mode 100644
index 000000000..c4feb4ff0
--- /dev/null
+++ b/vendor/github.com/golangci/ineffassign/.gitignore
@@ -0,0 +1,30 @@
+ineffassign
+
+# Created by https://www.gitignore.io/api/go
+
+### Go ###
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
+*.prof
+
diff --git a/vendor/github.com/golangci/ineffassign/LICENSE b/vendor/github.com/golangci/ineffassign/LICENSE
new file mode 100644
index 000000000..9e3d9bcc0
--- /dev/null
+++ b/vendor/github.com/golangci/ineffassign/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2016 Gordon Klaus and contributors
+
+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.
diff --git a/vendor/github.com/golangci/ineffassign/README.md b/vendor/github.com/golangci/ineffassign/README.md
new file mode 100644
index 000000000..6dcb9f0cc
--- /dev/null
+++ b/vendor/github.com/golangci/ineffassign/README.md
@@ -0,0 +1,4 @@
+# ineffassign
+Detect ineffectual assignments in Go code.
+
+This tool misses some cases because does not consider any type information in its analysis. (For example, assignments to struct fields are never marked as ineffectual.) It should, however, never give any false positives.
diff --git a/vendor/github.com/golangci/ineffassign/bugs b/vendor/github.com/golangci/ineffassign/bugs
new file mode 100644
index 000000000..468177e0a
--- /dev/null
+++ b/vendor/github.com/golangci/ineffassign/bugs
@@ -0,0 +1,7 @@
+cmd/compile/internal/big/floatconv.go:367:2 m
+cmd/cover/cover_test.go:62:2 err
+cmd/pprof/internal/profile/profile.go:131:10 err
+math/big/ftoa.go:285:2 m
+net/file_unix.go:66:7 err
+golang.org/x/mobile/app/android.go:175:2 queue
+golang.org/x/net/icmp/listen_posix.go:83:6 err
diff --git a/vendor/github.com/golangci/ineffassign/ineffassign.go b/vendor/github.com/golangci/ineffassign/ineffassign.go
new file mode 100644
index 000000000..5cda3982d
--- /dev/null
+++ b/vendor/github.com/golangci/ineffassign/ineffassign.go
@@ -0,0 +1,620 @@
+package ineffassign
+
+import (
+ "flag"
+ "fmt"
+ "go/ast"
+ "go/parser"
+ "go/token"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+)
+
+const invalidArgumentExitCode = 3
+
+var dontRecurseFlag = flag.Bool("ineffassign.n", false, "don't recursively check paths")
+
+type Issue struct {
+ Pos token.Position
+ IdentName string
+}
+
+func Run(files []string) []Issue {
+ var issues []Issue
+ for _, path := range files {
+ fset, _, ineff := checkPath(path)
+ for _, id := range ineff {
+ issues = append(issues, Issue{
+ Pos: fset.Position(id.Pos()),
+ IdentName: id.Name,
+ })
+ }
+ }
+
+ return issues
+}
+
+func walkPath(root string) bool {
+ lintFailed := false
+ filepath.Walk(root, func(path string, fi os.FileInfo, err error) error {
+ if err != nil {
+ fmt.Printf("Error during filesystem walk: %v\n", err)
+ return nil
+ }
+ if fi.IsDir() {
+ if path != root && (*dontRecurseFlag ||
+ filepath.Base(path) == "testdata" ||
+ filepath.Base(path) == "vendor") {
+ return filepath.SkipDir
+ }
+ return nil
+ }
+ if !strings.HasSuffix(path, ".go") {
+ return nil
+ }
+ fset, _, ineff := checkPath(path)
+ for _, id := range ineff {
+ fmt.Printf("%s: ineffectual assignment to %s\n", fset.Position(id.Pos()), id.Name)
+ lintFailed = true
+ }
+ return nil
+ })
+ return lintFailed
+}
+
+func checkPath(path string) (*token.FileSet, []*ast.CommentGroup, []*ast.Ident) {
+ fset := token.NewFileSet()
+ f, err := parser.ParseFile(fset, path, nil, parser.ParseComments)
+ if err != nil {
+ return nil, nil, nil
+ }
+
+ bld := &builder{vars: map[*ast.Object]*variable{}}
+ bld.walk(f)
+
+ chk := &checker{vars: bld.vars, seen: map[*block]bool{}}
+ for _, b := range bld.roots {
+ chk.check(b)
+ }
+ sort.Sort(chk.ineff)
+
+ return fset, f.Comments, chk.ineff
+}
+
+type builder struct {
+ roots []*block
+ block *block
+ vars map[*ast.Object]*variable
+ results []*ast.FieldList
+ breaks branchStack
+ continues branchStack
+ gotos branchStack
+ labelStmt *ast.LabeledStmt
+}
+
+type block struct {
+ children []*block
+ ops map[*ast.Object][]operation
+}
+
+func (b *block) addChild(c *block) {
+ b.children = append(b.children, c)
+}
+
+type operation struct {
+ id *ast.Ident
+ assign bool
+}
+
+type variable struct {
+ fundept int
+ escapes bool
+}
+
+func (bld *builder) walk(n ast.Node) {
+ if n != nil {
+ ast.Walk(bld, n)
+ }
+}
+
+func (bld *builder) Visit(n ast.Node) ast.Visitor {
+ switch n := n.(type) {
+ case *ast.FuncDecl:
+ if n.Body != nil {
+ bld.fun(n.Type, n.Body)
+ }
+ case *ast.FuncLit:
+ bld.fun(n.Type, n.Body)
+ case *ast.IfStmt:
+ bld.walk(n.Init)
+ bld.walk(n.Cond)
+ b0 := bld.block
+ bld.newBlock(b0)
+ bld.walk(n.Body)
+ b1 := bld.block
+ if n.Else != nil {
+ bld.newBlock(b0)
+ bld.walk(n.Else)
+ b0 = bld.block
+ }
+ bld.newBlock(b0, b1)
+ case *ast.ForStmt:
+ lbl := bld.stmtLabel(n)
+ brek := bld.breaks.push(lbl)
+ continu := bld.continues.push(lbl)
+ bld.walk(n.Init)
+ start := bld.newBlock(bld.block)
+ bld.walk(n.Cond)
+ cond := bld.block
+ bld.newBlock(cond)
+ bld.walk(n.Body)
+ continu.setDestination(bld.newBlock(bld.block))
+ bld.walk(n.Post)
+ bld.block.addChild(start)
+ brek.setDestination(bld.newBlock(cond))
+ bld.breaks.pop()
+ bld.continues.pop()
+ case *ast.RangeStmt:
+ lbl := bld.stmtLabel(n)
+ brek := bld.breaks.push(lbl)
+ continu := bld.continues.push(lbl)
+ bld.walk(n.X)
+ pre := bld.newBlock(bld.block)
+ start := bld.newBlock(pre)
+ if n.Key != nil {
+ lhs := []ast.Expr{n.Key}
+ if n.Value != nil {
+ lhs = append(lhs, n.Value)
+ }
+ bld.walk(&ast.AssignStmt{Lhs: lhs, Tok: n.Tok, TokPos: n.TokPos, Rhs: []ast.Expr{&ast.Ident{NamePos: n.X.End()}}})
+ }
+ bld.walk(n.Body)
+ bld.block.addChild(start)
+ continu.setDestination(pre)
+ brek.setDestination(bld.newBlock(pre, bld.block))
+ bld.breaks.pop()
+ bld.continues.pop()
+ case *ast.SwitchStmt:
+ bld.walk(n.Init)
+ bld.walk(n.Tag)
+ bld.swtch(n, n.Body.List)
+ case *ast.TypeSwitchStmt:
+ bld.walk(n.Init)
+ bld.walk(n.Assign)
+ bld.swtch(n, n.Body.List)
+ case *ast.SelectStmt:
+ brek := bld.breaks.push(bld.stmtLabel(n))
+ for _, c := range n.Body.List {
+ c := c.(*ast.CommClause).Comm
+ if s, ok := c.(*ast.AssignStmt); ok {
+ bld.walk(s.Rhs[0])
+ } else {
+ bld.walk(c)
+ }
+ }
+ b0 := bld.block
+ exits := make([]*block, len(n.Body.List))
+ dfault := false
+ for i, c := range n.Body.List {
+ c := c.(*ast.CommClause)
+ bld.newBlock(b0)
+ bld.walk(c)
+ exits[i] = bld.block
+ dfault = dfault || c.Comm == nil
+ }
+ if !dfault {
+ exits = append(exits, b0)
+ }
+ brek.setDestination(bld.newBlock(exits...))
+ bld.breaks.pop()
+ case *ast.LabeledStmt:
+ bld.gotos.get(n.Label).setDestination(bld.newBlock(bld.block))
+ bld.labelStmt = n
+ bld.walk(n.Stmt)
+ case *ast.BranchStmt:
+ switch n.Tok {
+ case token.BREAK:
+ bld.breaks.get(n.Label).addSource(bld.block)
+ bld.newBlock()
+ case token.CONTINUE:
+ bld.continues.get(n.Label).addSource(bld.block)
+ bld.newBlock()
+ case token.GOTO:
+ bld.gotos.get(n.Label).addSource(bld.block)
+ bld.newBlock()
+ }
+
+ case *ast.AssignStmt:
+ if n.Tok == token.QUO_ASSIGN || n.Tok == token.REM_ASSIGN {
+ bld.maybePanic()
+ }
+
+ for _, x := range n.Rhs {
+ bld.walk(x)
+ }
+ for i, x := range n.Lhs {
+ if id, ok := ident(x); ok {
+ if n.Tok >= token.ADD_ASSIGN && n.Tok <= token.AND_NOT_ASSIGN {
+ bld.use(id)
+ }
+ // Don't treat explicit initialization to zero as assignment; it is often used as shorthand for a bare declaration.
+ if n.Tok == token.DEFINE && i < len(n.Rhs) && isZeroInitializer(n.Rhs[i]) {
+ bld.use(id)
+ } else {
+ bld.assign(id)
+ }
+ } else {
+ bld.walk(x)
+ }
+ }
+ case *ast.GenDecl:
+ if n.Tok == token.VAR {
+ for _, s := range n.Specs {
+ s := s.(*ast.ValueSpec)
+ for _, x := range s.Values {
+ bld.walk(x)
+ }
+ for _, id := range s.Names {
+ if len(s.Values) > 0 {
+ bld.assign(id)
+ } else {
+ bld.use(id)
+ }
+ }
+ }
+ }
+ case *ast.IncDecStmt:
+ if id, ok := ident(n.X); ok {
+ bld.use(id)
+ bld.assign(id)
+ } else {
+ bld.walk(n.X)
+ }
+ case *ast.Ident:
+ bld.use(n)
+ case *ast.ReturnStmt:
+ for _, x := range n.Results {
+ bld.walk(x)
+ }
+ if res := bld.results[len(bld.results)-1]; res != nil {
+ for _, f := range res.List {
+ for _, id := range f.Names {
+ if n.Results != nil {
+ bld.assign(id)
+ }
+ bld.use(id)
+ }
+ }
+ }
+ bld.newBlock()
+ case *ast.SendStmt:
+ bld.maybePanic()
+ return bld
+
+ case *ast.BinaryExpr:
+ if n.Op == token.EQL || n.Op == token.QUO || n.Op == token.REM {
+ bld.maybePanic()
+ }
+ return bld
+ case *ast.CallExpr:
+ bld.maybePanic()
+ return bld
+ case *ast.IndexExpr:
+ bld.maybePanic()
+ return bld
+ case *ast.UnaryExpr:
+ id, ok := ident(n.X)
+ if ix, isIx := n.X.(*ast.IndexExpr); isIx {
+ // We don't care about indexing into slices, but without type information we can do no better.
+ id, ok = ident(ix.X)
+ }
+ if ok && n.Op == token.AND {
+ if v, ok := bld.vars[id.Obj]; ok {
+ v.escapes = true
+ }
+ }
+ return bld
+ case *ast.SelectorExpr:
+ bld.maybePanic()
+ // A method call (possibly delayed via a method value) might implicitly take
+ // the address of its receiver, causing it to escape.
+ // We can't do any better here without knowing the variable's type.
+ if id, ok := ident(n.X); ok {
+ if v, ok := bld.vars[id.Obj]; ok {
+ v.escapes = true
+ }
+ }
+ return bld
+ case *ast.SliceExpr:
+ bld.maybePanic()
+ // We don't care about slicing into slices, but without type information we can do no better.
+ if id, ok := ident(n.X); ok {
+ if v, ok := bld.vars[id.Obj]; ok {
+ v.escapes = true
+ }
+ }
+ return bld
+ case *ast.StarExpr:
+ bld.maybePanic()
+ return bld
+ case *ast.TypeAssertExpr:
+ bld.maybePanic()
+ return bld
+
+ default:
+ return bld
+ }
+ return nil
+}
+
+func isZeroInitializer(x ast.Expr) bool {
+ // Assume that a call expression of a single argument is a conversion expression. We can't do better without type information.
+ if c, ok := x.(*ast.CallExpr); ok {
+ switch c.Fun.(type) {
+ case *ast.Ident, *ast.SelectorExpr:
+ default:
+ return false
+ }
+ if len(c.Args) != 1 {
+ return false
+ }
+ x = c.Args[0]
+ }
+
+ switch x := x.(type) {
+ case *ast.BasicLit:
+ switch x.Value {
+ case "0", "0.0", "0.", ".0", `""`:
+ return true
+ }
+ case *ast.Ident:
+ return x.Name == "false" && x.Obj == nil
+ }
+
+ return false
+}
+
+func (bld *builder) fun(typ *ast.FuncType, body *ast.BlockStmt) {
+ for _, v := range bld.vars {
+ v.fundept++
+ }
+ bld.results = append(bld.results, typ.Results)
+
+ b := bld.block
+ bld.newBlock()
+ bld.roots = append(bld.roots, bld.block)
+ bld.walk(typ)
+ bld.walk(body)
+ bld.block = b
+
+ bld.results = bld.results[:len(bld.results)-1]
+ for _, v := range bld.vars {
+ v.fundept--
+ }
+}
+
+func (bld *builder) swtch(stmt ast.Stmt, cases []ast.Stmt) {
+ brek := bld.breaks.push(bld.stmtLabel(stmt))
+ b0 := bld.block
+ list := b0
+ exits := make([]*block, 0, len(cases)+1)
+ var dfault, fallthru *block
+ for _, c := range cases {
+ c := c.(*ast.CaseClause)
+
+ if c.List != nil {
+ list = bld.newBlock(list)
+ for _, x := range c.List {
+ bld.walk(x)
+ }
+ }
+
+ parents := []*block{}
+ if c.List != nil {
+ parents = append(parents, list)
+ }
+ if fallthru != nil {
+ parents = append(parents, fallthru)
+ fallthru = nil
+ }
+ bld.newBlock(parents...)
+ if c.List == nil {
+ dfault = bld.block
+ }
+ for _, s := range c.Body {
+ bld.walk(s)
+ if s, ok := s.(*ast.BranchStmt); ok && s.Tok == token.FALLTHROUGH {
+ fallthru = bld.block
+ }
+ }
+
+ if fallthru == nil {
+ exits = append(exits, bld.block)
+ }
+ }
+ if dfault != nil {
+ list.addChild(dfault)
+ } else {
+ exits = append(exits, b0)
+ }
+ brek.setDestination(bld.newBlock(exits...))
+ bld.breaks.pop()
+}
+
+// An operation that might panic marks named function results as used.
+func (bld *builder) maybePanic() {
+ if len(bld.results) == 0 {
+ return
+ }
+ res := bld.results[len(bld.results)-1]
+ if res == nil {
+ return
+ }
+ for _, f := range res.List {
+ for _, id := range f.Names {
+ bld.use(id)
+ }
+ }
+}
+
+func (bld *builder) newBlock(parents ...*block) *block {
+ bld.block = &block{ops: map[*ast.Object][]operation{}}
+ for _, b := range parents {
+ b.addChild(bld.block)
+ }
+ return bld.block
+}
+
+func (bld *builder) stmtLabel(s ast.Stmt) *ast.Object {
+ if ls := bld.labelStmt; ls != nil && ls.Stmt == s {
+ return ls.Label.Obj
+ }
+ return nil
+}
+
+func (bld *builder) assign(id *ast.Ident) {
+ bld.newOp(id, true)
+}
+
+func (bld *builder) use(id *ast.Ident) {
+ bld.newOp(id, false)
+}
+
+func (bld *builder) newOp(id *ast.Ident, assign bool) {
+ if id.Name == "_" || id.Obj == nil {
+ return
+ }
+
+ v, ok := bld.vars[id.Obj]
+ if !ok {
+ v = &variable{}
+ bld.vars[id.Obj] = v
+ }
+ v.escapes = v.escapes || v.fundept > 0 || bld.block == nil
+
+ if b := bld.block; b != nil {
+ b.ops[id.Obj] = append(b.ops[id.Obj], operation{id, assign})
+ }
+}
+
+type branchStack []*branch
+
+type branch struct {
+ label *ast.Object
+ srcs []*block
+ dst *block
+}
+
+func (s *branchStack) push(lbl *ast.Object) *branch {
+ br := &branch{label: lbl}
+ *s = append(*s, br)
+ return br
+}
+
+func (s *branchStack) get(lbl *ast.Ident) *branch {
+ for i := len(*s) - 1; i >= 0; i-- {
+ if br := (*s)[i]; lbl == nil || br.label == lbl.Obj {
+ return br
+ }
+ }
+
+ // Guard against invalid code (break/continue outside of loop).
+ if lbl == nil {
+ return &branch{}
+ }
+
+ return s.push(lbl.Obj)
+}
+
+func (br *branch) addSource(src *block) {
+ br.srcs = append(br.srcs, src)
+ if br.dst != nil {
+ src.addChild(br.dst)
+ }
+}
+
+func (br *branch) setDestination(dst *block) {
+ br.dst = dst
+ for _, src := range br.srcs {
+ src.addChild(dst)
+ }
+}
+
+func (s *branchStack) pop() {
+ *s = (*s)[:len(*s)-1]
+}
+
+func ident(x ast.Expr) (*ast.Ident, bool) {
+ if p, ok := x.(*ast.ParenExpr); ok {
+ return ident(p.X)
+ }
+ id, ok := x.(*ast.Ident)
+ return id, ok
+}
+
+type checker struct {
+ vars map[*ast.Object]*variable
+ seen map[*block]bool
+ ineff idents
+}
+
+func (chk *checker) check(b *block) {
+ if chk.seen[b] {
+ return
+ }
+ chk.seen[b] = true
+
+ for obj, ops := range b.ops {
+ if chk.vars[obj].escapes {
+ continue
+ }
+ ops:
+ for i, op := range ops {
+ if !op.assign {
+ continue
+ }
+ if i+1 < len(ops) {
+ if ops[i+1].assign {
+ chk.ineff = append(chk.ineff, op.id)
+ }
+ continue
+ }
+ seen := map[*block]bool{}
+ for _, b := range b.children {
+ if used(obj, b, seen) {
+ continue ops
+ }
+ }
+ chk.ineff = append(chk.ineff, op.id)
+ }
+ }
+
+ for _, b := range b.children {
+ chk.check(b)
+ }
+}
+
+func used(obj *ast.Object, b *block, seen map[*block]bool) bool {
+ if seen[b] {
+ return false
+ }
+ seen[b] = true
+
+ if ops := b.ops[obj]; len(ops) > 0 {
+ return !ops[0].assign
+ }
+ for _, b := range b.children {
+ if used(obj, b, seen) {
+ return true
+ }
+ }
+ return false
+}
+
+type idents []*ast.Ident
+
+func (ids idents) Len() int { return len(ids) }
+func (ids idents) Less(i, j int) bool { return ids[i].Pos() < ids[j].Pos() }
+func (ids idents) Swap(i, j int) { ids[i], ids[j] = ids[j], ids[i] }
diff --git a/vendor/github.com/golangci/ineffassign/list b/vendor/github.com/golangci/ineffassign/list
new file mode 100644
index 000000000..7e6b1e75a
--- /dev/null
+++ b/vendor/github.com/golangci/ineffassign/list
@@ -0,0 +1,25 @@
+/Users/gordon/go/src/code.google.com/p/freetype-go/freetype/truetype/truetype.go:493:5: offset assigned and not used
+/Users/gordon/go/src/code.google.com/p/freetype-go/freetype/truetype/truetype.go:289:11: offset assigned and not used
+/Users/gordon/go/src/code.google.com/p/freetype-go/freetype/truetype/truetype_test.go:224:2: prefix assigned and not used
+/Users/gordon/go/src/code.google.com/p/freetype-go/freetype/truetype/truetype_test.go:239:3: s assigned and not used
+/Users/gordon/go/src/github.com/gordonklaus/flux/go/types/resolver.go:372:2: seenPkgs assigned and not used
+/Users/gordon/go/src/github.com/gopherjs/gopherjs/compiler/package.go:195:7: recvType assigned and not used
+/Users/gordon/go/src/golang.org/x/crypto/ocsp/ocsp.go:340:2: rest assigned and not used
+/Users/gordon/go/src/golang.org/x/crypto/openpgp/packet/opaque_test.go:35:6: err assigned and not used
+/Users/gordon/go/src/golang.org/x/crypto/otr/otr.go:641:6: in assigned and not used
+/Users/gordon/go/src/golang.org/x/crypto/otr/otr_test.go:198:17: err assigned and not used
+/Users/gordon/go/src/golang.org/x/crypto/ssh/benchmark_test.go:94:17: err assigned and not used
+/Users/gordon/go/src/golang.org/x/mobile/app/android.go:175:2: queue assigned and not used
+/Users/gordon/go/src/golang.org/x/mobile/cmd/gomobile/bind.go:411:2: w assigned and not used
+/Users/gordon/go/src/golang.org/x/mobile/cmd/gomobile/build.go:231:8: err assigned and not used
+/Users/gordon/go/src/golang.org/x/net/icmp/listen_posix.go:83:6: err assigned and not used
+/Users/gordon/go/src/golang.org/x/net/ipv4/control_unix.go:99:5: b assigned and not used
+/Users/gordon/go/src/golang.org/x/net/ipv4/control_unix.go:148:4: b assigned and not used
+/Users/gordon/go/src/golang.org/x/net/ipv6/control_unix.go:90:4: b assigned and not used
+/Users/gordon/go/src/golang.org/x/net/ipv6/control_unix.go:162:4: b assigned and not used
+/Users/gordon/go/src/golang.org/x/net/websocket/hybi.go:298:3: n assigned and not used
+/Users/gordon/go/src/golang.org/x/tools/cmd/callgraph/main.go:164:2: args assigned and not used
+/Users/gordon/go/src/golang.org/x/tools/cmd/cover/cover_test.go:52:2: err assigned and not used
+/Users/gordon/go/src/golang.org/x/tools/go/gcimporter/exportdata.go:74:13: size assigned and not used
+/Users/gordon/go/src/golang.org/x/tools/oracle/oracle.go:268:2: iprog assigned and not used
+/Users/gordon/go/src/golang.org/x/tools/oracle/oracle_test.go:299:2: iprog assigned and not used
diff --git a/vendor/github.com/golangci/ineffassign/liststd b/vendor/github.com/golangci/ineffassign/liststd
new file mode 100644
index 000000000..591d026e4
--- /dev/null
+++ b/vendor/github.com/golangci/ineffassign/liststd
@@ -0,0 +1,131 @@
+/usr/local/go/src/bufio/scan.go:388:6: ineffectual assignment to width
+/usr/local/go/src/bufio/scan.go:396:6: ineffectual assignment to width
+/usr/local/go/src/bytes/buffer_test.go:141:6: ineffectual assignment to err
+/usr/local/go/src/bytes/buffer_test.go:164:3: ineffectual assignment to c
+/usr/local/go/src/cmd/cgo/out.go:799:3: ineffectual assignment to gccResult
+/usr/local/go/src/cmd/compile/internal/big/ratconv.go:170:4: ineffectual assignment to err
+/usr/local/go/src/cmd/compile/internal/gc/bimport.go:330:2: ineffectual assignment to file
+/usr/local/go/src/cmd/compile/internal/gc/cgen.go:3332:3: ineffectual assignment to max
+/usr/local/go/src/cmd/compile/internal/gc/export.go:379:2: ineffectual assignment to size
+/usr/local/go/src/cmd/compile/internal/gc/global_test.go:51:2: ineffectual assignment to out
+/usr/local/go/src/cmd/compile/internal/gc/lex.go:281:4: ineffectual assignment to c1
+/usr/local/go/src/cmd/compile/internal/gc/reg.go:1373:2: ineffectual assignment to firstf
+/usr/local/go/src/cmd/compile/internal/gc/reg.go:1381:3: ineffectual assignment to firstf
+/usr/local/go/src/cmd/compile/internal/s390x/peep.go:1048:3: ineffectual assignment to size
+/usr/local/go/src/cmd/compile/internal/s390x/peep.go:1139:3: ineffectual assignment to size
+/usr/local/go/src/cmd/compile/internal/ssa/loopbce.go:44:3: ineffectual assignment to entry
+/usr/local/go/src/cmd/cover/html.go:64:8: ineffectual assignment to err
+/usr/local/go/src/cmd/cover/html.go:66:8: ineffectual assignment to err
+/usr/local/go/src/cmd/go/build.go:3355:3: ineffectual assignment to cgoLDFLAGS
+/usr/local/go/src/cmd/internal/goobj/read.go:532:3: ineffectual assignment to data
+/usr/local/go/src/cmd/internal/obj/arm64/obj7.go:600:2: ineffectual assignment to aoffset
+/usr/local/go/src/cmd/internal/obj/mips/asm0.go:1049:3: ineffectual assignment to v
+/usr/local/go/src/cmd/internal/obj/mips/asm0.go:1101:3: ineffectual assignment to v
+/usr/local/go/src/cmd/internal/obj/s390x/objz.go:609:3: ineffectual assignment to pLast
+/usr/local/go/src/cmd/internal/pprof/profile/encode.go:279:12: ineffectual assignment to err
+/usr/local/go/src/cmd/link/internal/ld/dwarf.go:1426:2: ineffectual assignment to unitstart
+/usr/local/go/src/cmd/link/internal/ld/dwarf.go:1427:2: ineffectual assignment to headerstart
+/usr/local/go/src/cmd/link/internal/ld/dwarf.go:1428:2: ineffectual assignment to headerend
+/usr/local/go/src/cmd/link/internal/ld/elf.go:2272:3: ineffectual assignment to resoff
+/usr/local/go/src/cmd/vet/print.go:227:9: ineffectual assignment to w
+/usr/local/go/src/cmd/yacc/yacc.go:770:2: ineffectual assignment to val
+/usr/local/go/src/cmd/yacc/yacc.go:3127:2: ineffectual assignment to i
+/usr/local/go/src/compress/bzip2/huffman.go:114:4: ineffectual assignment to length
+/usr/local/go/src/compress/flate/reader_test.go:53:3: ineffectual assignment to buf0
+/usr/local/go/src/compress/flate/writer_test.go:29:3: ineffectual assignment to buf0
+/usr/local/go/src/compress/gzip/gzip_test.go:211:5: ineffectual assignment to err
+/usr/local/go/src/compress/lzw/reader_test.go:148:4: ineffectual assignment to buf0
+/usr/local/go/src/compress/lzw/writer_test.go:146:3: ineffectual assignment to buf0
+/usr/local/go/src/container/list/list_test.go:286:2: ineffectual assignment to e1
+/usr/local/go/src/container/list/list_test.go:286:6: ineffectual assignment to e2
+/usr/local/go/src/container/list/list_test.go:286:10: ineffectual assignment to e3
+/usr/local/go/src/container/list/list_test.go:286:14: ineffectual assignment to e4
+/usr/local/go/src/crypto/elliptic/p224.go:722:10: ineffectual assignment to bytes
+/usr/local/go/src/crypto/tls/handshake_messages.go:289:3: ineffectual assignment to z
+/usr/local/go/src/crypto/x509/verify.go:110:5: ineffectual assignment to certName
+/usr/local/go/src/database/sql/sql_test.go:1705:4: ineffectual assignment to numOpen
+/usr/local/go/src/database/sql/sql_test.go:1839:5: ineffectual assignment to err
+/usr/local/go/src/debug/dwarf/type.go:540:5: ineffectual assignment to haveBitOffset
+/usr/local/go/src/debug/elf/file.go:1014:3: ineffectual assignment to suffix
+/usr/local/go/src/debug/gosym/pclntab_test.go:256:2: ineffectual assignment to off
+/usr/local/go/src/debug/pe/file_test.go:309:2: ineffectual assignment to err
+/usr/local/go/src/encoding/base32/base32_test.go:120:4: ineffectual assignment to count
+/usr/local/go/src/encoding/base64/base64_test.go:174:4: ineffectual assignment to count
+/usr/local/go/src/encoding/gob/decgen.go:187:6: ineffectual assignment to err
+/usr/local/go/src/encoding/gob/encgen.go:166:6: ineffectual assignment to err
+/usr/local/go/src/encoding/json/encode.go:1071:2: ineffectual assignment to count
+/usr/local/go/src/encoding/json/encode.go:1169:6: ineffectual assignment to advance
+/usr/local/go/src/encoding/xml/xml.go:1030:6: ineffectual assignment to ok
+/usr/local/go/src/fmt/print.go:936:2: ineffectual assignment to afterIndex
+/usr/local/go/src/fmt/print.go:1051:15: ineffectual assignment to afterIndex
+/usr/local/go/src/go/ast/filter.go:84:3: ineffectual assignment to keepField
+/usr/local/go/src/go/internal/gcimporter/bimport.go:215:2: ineffectual assignment to file
+/usr/local/go/src/go/printer/nodes.go:439:4: ineffectual assignment to extraTabs
+/usr/local/go/src/go/printer/printer_test.go:155:8: ineffectual assignment to err
+/usr/local/go/src/go/types/conversions.go:49:2: ineffectual assignment to final
+/usr/local/go/src/html/template/css.go:160:2: ineffectual assignment to r
+/usr/local/go/src/html/template/css.go:160:5: ineffectual assignment to w
+/usr/local/go/src/html/template/html.go:141:2: ineffectual assignment to r
+/usr/local/go/src/html/template/html.go:141:5: ineffectual assignment to w
+/usr/local/go/src/html/template/js.go:249:2: ineffectual assignment to r
+/usr/local/go/src/html/template/js.go:249:5: ineffectual assignment to w
+/usr/local/go/src/image/decode_test.go:125:9: ineffectual assignment to err
+/usr/local/go/src/image/png/reader.go:689:2: ineffectual assignment to n
+/usr/local/go/src/image/png/writer.go:269:3: ineffectual assignment to best
+/usr/local/go/src/io/io_test.go:245:2: ineffectual assignment to n
+/usr/local/go/src/io/ioutil/ioutil.go:149:2: ineffectual assignment to readSize
+/usr/local/go/src/io/ioutil/ioutil_test.go:24:2: ineffectual assignment to contents
+/usr/local/go/src/log/syslog/syslog_test.go:236:5: ineffectual assignment to err
+/usr/local/go/src/log/syslog/syslog_test.go:240:5: ineffectual assignment to err
+/usr/local/go/src/math/big/ratconv.go:176:4: ineffectual assignment to err
+/usr/local/go/src/mime/multipart/multipart_test.go:408:2: ineffectual assignment to p
+/usr/local/go/src/net/dial_test.go:381:6: ineffectual assignment to err
+/usr/local/go/src/net/dnsname_test.go:36:6: ineffectual assignment to char63
+/usr/local/go/src/net/dnsname_test.go:37:6: ineffectual assignment to char64
+/usr/local/go/src/net/fd_plan9.go:64:4: ineffectual assignment to err
+/usr/local/go/src/net/fd_windows.go:166:3: ineffectual assignment to err
+/usr/local/go/src/net/http/fs.go:413:5: ineffectual assignment to name
+/usr/local/go/src/net/http/h2_bundle.go:6249:4: ineffectual assignment to n
+/usr/local/go/src/net/http/request_test.go:155:13: ineffectual assignment to err
+/usr/local/go/src/net/http/serve_test.go:4053:13: ineffectual assignment to err
+/usr/local/go/src/net/http/transport_test.go:729:8: ineffectual assignment to err
+/usr/local/go/src/net/http/transport_test.go:2345:3: ineffectual assignment to slurp
+/usr/local/go/src/net/parse.go:27:2: ineffectual assignment to i
+/usr/local/go/src/net/rpc/server.go:270:3: ineffectual assignment to str
+/usr/local/go/src/net/udpsock_plan9.go:80:16: ineffectual assignment to i
+/usr/local/go/src/os/env_test.go:109:2: ineffectual assignment to value
+/usr/local/go/src/os/os_test.go:1080:5: ineffectual assignment to err
+/usr/local/go/src/os/path_test.go:122:2: ineffectual assignment to testit
+/usr/local/go/src/reflect/type.go:2379:3: ineffectual assignment to name
+/usr/local/go/src/regexp/exec.go:123:2: ineffectual assignment to r
+/usr/local/go/src/regexp/exec.go:124:2: ineffectual assignment to width
+/usr/local/go/src/regexp/exec.go:321:2: ineffectual assignment to r
+/usr/local/go/src/regexp/exec.go:322:2: ineffectual assignment to width
+/usr/local/go/src/regexp/onepass.go:338:15: ineffectual assignment to matchArg
+/usr/local/go/src/regexp/syntax/parse.go:577:2: ineffectual assignment to start
+/usr/local/go/src/runtime/lfstack_test.go:48:2: ineffectual assignment to nodes
+/usr/local/go/src/runtime/mbitmap.go:1458:3: ineffectual assignment to i
+/usr/local/go/src/runtime/mfinal_test.go:60:4: ineffectual assignment to v
+/usr/local/go/src/runtime/mfinal_test.go:98:3: ineffectual assignment to v
+/usr/local/go/src/runtime/mgcmark.go:414:2: ineffectual assignment to stolen
+/usr/local/go/src/runtime/mgcsweep.go:188:2: ineffectual assignment to nfree
+/usr/local/go/src/runtime/os_plan9.go:307:2: ineffectual assignment to n
+/usr/local/go/src/runtime/pprof/pprof.go:465:5: ineffectual assignment to ok
+/usr/local/go/src/runtime/pprof/pprof.go:608:5: ineffectual assignment to ok
+/usr/local/go/src/runtime/pprof/pprof.go:751:5: ineffectual assignment to ok
+/usr/local/go/src/runtime/proc.go:4227:3: ineffectual assignment to xname
+/usr/local/go/src/runtime/runtime1.go:360:3: ineffectual assignment to field
+/usr/local/go/src/runtime/runtime_mmap_test.go:25:2: ineffectual assignment to p
+/usr/local/go/src/runtime/softfloat64.go:228:3: ineffectual assignment to f
+/usr/local/go/src/runtime/softfloat64.go:228:6: ineffectual assignment to g
+/usr/local/go/src/runtime/stack_test.go:106:4: ineffectual assignment to s
+/usr/local/go/src/strconv/quote.go:23:6: ineffectual assignment to width
+/usr/local/go/src/sync/atomic/atomic_test.go:1122:2: ineffectual assignment to new
+/usr/local/go/src/sync/atomic/atomic_test.go:1150:2: ineffectual assignment to new
+/usr/local/go/src/syscall/dir_plan9.go:88:2: ineffectual assignment to b
+/usr/local/go/src/syscall/dir_plan9.go:131:13: ineffectual assignment to b
+/usr/local/go/src/syscall/exec_plan9.go:281:2: ineffectual assignment to r1
+/usr/local/go/src/syscall/mksyscall_windows.go:310:2: ineffectual assignment to s
+/usr/local/go/src/syscall/syscall_bsd_test.go:23:2: ineffectual assignment to n
+/usr/local/go/src/syscall/syscall_unix_test.go:187:17: ineffectual assignment to err
+/usr/local/go/src/text/template/multi_test.go:249:9: ineffectual assignment to err
diff --git a/vendor/github.com/golangci/lint-1/.travis.yml b/vendor/github.com/golangci/lint-1/.travis.yml
new file mode 100644
index 000000000..bc2f4b311
--- /dev/null
+++ b/vendor/github.com/golangci/lint-1/.travis.yml
@@ -0,0 +1,19 @@
+sudo: false
+language: go
+go:
+ - 1.10.x
+ - 1.11.x
+ - master
+
+go_import_path: github.com/golangci/lint-1
+
+install:
+ - go get -t -v ./...
+
+script:
+ - go test -v -race ./...
+
+matrix:
+ allow_failures:
+ - go: master
+ fast_finish: true
diff --git a/vendor/github.com/golangci/lint-1/CONTRIBUTING.md b/vendor/github.com/golangci/lint-1/CONTRIBUTING.md
new file mode 100644
index 000000000..2e39a1c67
--- /dev/null
+++ b/vendor/github.com/golangci/lint-1/CONTRIBUTING.md
@@ -0,0 +1,15 @@
+# Contributing to Golint
+
+## Before filing an issue:
+
+### Are you having trouble building golint?
+
+Check you have the latest version of its dependencies. Run
+```
+go get -u github.com/golangci/lint-1/golint
+```
+If you still have problems, consider searching for existing issues before filing a new issue.
+
+## Before sending a pull request:
+
+Have you understood the purpose of golint? Make sure to carefully read `README`.
diff --git a/vendor/github.com/golangci/lint-1/LICENSE b/vendor/github.com/golangci/lint-1/LICENSE
new file mode 100644
index 000000000..65d761bc9
--- /dev/null
+++ b/vendor/github.com/golangci/lint-1/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2013 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/golangci/lint-1/README.md b/vendor/github.com/golangci/lint-1/README.md
new file mode 100644
index 000000000..2de6ee835
--- /dev/null
+++ b/vendor/github.com/golangci/lint-1/README.md
@@ -0,0 +1,88 @@
+Golint is a linter for Go source code.
+
+[![Build Status](https://travis-ci.org/golang/lint.svg?branch=master)](https://travis-ci.org/golang/lint)
+
+## Installation
+
+Golint requires a
+[supported release of Go](https://golang.org/doc/devel/release.html#policy).
+
+ go get -u github.com/golangci/lint-1/golint
+
+To find out where `golint` was installed you can run `go list -f {{.Target}} github.com/golangci/lint-1/golint`. For `golint` to be used globally add that directory to the `$PATH` environment setting.
+
+## Usage
+
+Invoke `golint` with one or more filenames, directories, or packages named
+by its import path. Golint uses the same
+[import path syntax](https://golang.org/cmd/go/#hdr-Import_path_syntax) as
+the `go` command and therefore
+also supports relative import paths like `./...`. Additionally the `...`
+wildcard can be used as suffix on relative and absolute file paths to recurse
+into them.
+
+The output of this tool is a list of suggestions in Vim quickfix format,
+which is accepted by lots of different editors.
+
+## Purpose
+
+Golint differs from gofmt. Gofmt reformats Go source code, whereas
+golint prints out style mistakes.
+
+Golint differs from govet. Govet is concerned with correctness, whereas
+golint is concerned with coding style. Golint is in use at Google, and it
+seeks to match the accepted style of the open source Go project.
+
+The suggestions made by golint are exactly that: suggestions.
+Golint is not perfect, and has both false positives and false negatives.
+Do not treat its output as a gold standard. We will not be adding pragmas
+or other knobs to suppress specific warnings, so do not expect or require
+code to be completely "lint-free".
+In short, this tool is not, and will never be, trustworthy enough for its
+suggestions to be enforced automatically, for example as part of a build process.
+Golint makes suggestions for many of the mechanically checkable items listed in
+[Effective Go](https://golang.org/doc/effective_go.html) and the
+[CodeReviewComments wiki page](https://golang.org/wiki/CodeReviewComments).
+
+## Scope
+
+Golint is meant to carry out the stylistic conventions put forth in
+[Effective Go](https://golang.org/doc/effective_go.html) and
+[CodeReviewComments](https://golang.org/wiki/CodeReviewComments).
+Changes that are not aligned with those documents will not be considered.
+
+## Contributions
+
+Contributions to this project are welcome provided they are [in scope](#scope),
+though please send mail before starting work on anything major.
+Contributors retain their copyright, so we need you to fill out
+[a short form](https://developers.google.com/open-source/cla/individual)
+before we can accept your contribution.
+
+## Vim
+
+Add this to your ~/.vimrc:
+
+ set rtp+=$GOPATH/src/github.com/golangci/lint-1/misc/vim
+
+If you have multiple entries in your GOPATH, replace `$GOPATH` with the right value.
+
+Running `:Lint` will run golint on the current file and populate the quickfix list.
+
+Optionally, add this to your `~/.vimrc` to automatically run `golint` on `:w`
+
+ autocmd BufWritePost,FileWritePost *.go execute 'Lint' | cwindow
+
+
+## Emacs
+
+Add this to your `.emacs` file:
+
+ (add-to-list 'load-path (concat (getenv "GOPATH") "/src/github.com/golang/lint/misc/emacs"))
+ (require 'golint)
+
+If you have multiple entries in your GOPATH, replace `$GOPATH` with the right value.
+
+Running M-x golint will run golint on the current file.
+
+For more usage, see [Compilation-Mode](http://www.gnu.org/software/emacs/manual/html_node/emacs/Compilation-Mode.html).
diff --git a/vendor/github.com/golangci/lint-1/go.mod b/vendor/github.com/golangci/lint-1/go.mod
new file mode 100644
index 000000000..fafbd340b
--- /dev/null
+++ b/vendor/github.com/golangci/lint-1/go.mod
@@ -0,0 +1,3 @@
+module github.com/golangci/lint-1
+
+require golang.org/x/tools v0.0.0-20190311212946-11955173bddd
diff --git a/vendor/github.com/golangci/lint-1/go.sum b/vendor/github.com/golangci/lint-1/go.sum
new file mode 100644
index 000000000..7d0e2e618
--- /dev/null
+++ b/vendor/github.com/golangci/lint-1/go.sum
@@ -0,0 +1,6 @@
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
diff --git a/vendor/github.com/golangci/lint-1/lint.go b/vendor/github.com/golangci/lint-1/lint.go
new file mode 100644
index 000000000..886c85bf0
--- /dev/null
+++ b/vendor/github.com/golangci/lint-1/lint.go
@@ -0,0 +1,1655 @@
+// Copyright (c) 2013 The Go Authors. All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd.
+
+// Package lint contains a linter for Go source code.
+package lint // import "github.com/golangci/lint-1"
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/parser"
+ "go/printer"
+ "go/token"
+ "go/types"
+ "io/ioutil"
+ "regexp"
+ "sort"
+ "strconv"
+ "strings"
+ "unicode"
+ "unicode/utf8"
+
+ "golang.org/x/tools/go/ast/astutil"
+ "golang.org/x/tools/go/gcexportdata"
+)
+
+const styleGuideBase = "https://golang.org/wiki/CodeReviewComments"
+
+// A Linter lints Go source code.
+type Linter struct {
+}
+
+// Problem represents a problem in some source code.
+type Problem struct {
+ Position token.Position // position in source file
+ Text string // the prose that describes the problem
+ Link string // (optional) the link to the style guide for the problem
+ Confidence float64 // a value in (0,1] estimating the confidence in this problem's correctness
+ LineText string // the source line
+ Category string // a short name for the general category of the problem
+
+ // If the problem has a suggested fix (the minority case),
+ // ReplacementLine is a full replacement for the relevant line of the source file.
+ ReplacementLine string
+}
+
+func (p *Problem) String() string {
+ if p.Link != "" {
+ return p.Text + "\n\n" + p.Link
+ }
+ return p.Text
+}
+
+type byPosition []Problem
+
+func (p byPosition) Len() int { return len(p) }
+func (p byPosition) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
+
+func (p byPosition) Less(i, j int) bool {
+ pi, pj := p[i].Position, p[j].Position
+
+ if pi.Filename != pj.Filename {
+ return pi.Filename < pj.Filename
+ }
+ if pi.Line != pj.Line {
+ return pi.Line < pj.Line
+ }
+ if pi.Column != pj.Column {
+ return pi.Column < pj.Column
+ }
+
+ return p[i].Text < p[j].Text
+}
+
+// Lint lints src.
+func (l *Linter) Lint(filename string, src []byte) ([]Problem, error) {
+ return l.LintFiles(map[string][]byte{filename: src})
+}
+
+// LintFiles lints a set of files of a single package.
+// The argument is a map of filename to source.
+func (l *Linter) LintFiles(files map[string][]byte) ([]Problem, error) {
+ pkg := &pkg{
+ fset: token.NewFileSet(),
+ files: make(map[string]*file),
+ }
+ var pkgName string
+ for filename, src := range files {
+ if isGenerated(src) {
+ continue // See issue #239
+ }
+ f, err := parser.ParseFile(pkg.fset, filename, src, parser.ParseComments)
+ if err != nil {
+ return nil, err
+ }
+ if pkgName == "" {
+ pkgName = f.Name.Name
+ } else if f.Name.Name != pkgName {
+ return nil, fmt.Errorf("%s is in package %s, not %s", filename, f.Name.Name, pkgName)
+ }
+ pkg.files[filename] = &file{
+ pkg: pkg,
+ f: f,
+ fset: pkg.fset,
+ src: src,
+ filename: filename,
+ }
+ }
+ if len(pkg.files) == 0 {
+ return nil, nil
+ }
+ return pkg.lint(), nil
+}
+
+// LintFiles lints a set of files of a single package.
+// The argument is a map of filename to source.
+func (l *Linter) LintPkg(files []*ast.File, fset *token.FileSet, typesPkg *types.Package, typesInfo *types.Info) ([]Problem, error) {
+ pkg := &pkg{
+ fset: fset,
+ files: make(map[string]*file),
+ typesPkg: typesPkg,
+ typesInfo: typesInfo,
+ }
+ var pkgName string
+ for _, f := range files {
+ // use PositionFor, not Position because of //line directives:
+ // this filename will be used for source lines extraction.
+ filename := fset.PositionFor(f.Pos(), false).Filename
+ if filename == "" {
+ return nil, fmt.Errorf("no file name for file %+v", f)
+ }
+
+ if pkgName == "" {
+ pkgName = f.Name.Name
+ } else if f.Name.Name != pkgName {
+ return nil, fmt.Errorf("%s is in package %s, not %s", filename, f.Name.Name, pkgName)
+ }
+
+ // TODO: reuse golangci-lint lines cache
+ src, err := ioutil.ReadFile(filename)
+ if err != nil {
+ return nil, fmt.Errorf("can't read file %s: %s", filename, err)
+ }
+
+ pkg.files[filename] = &file{
+ pkg: pkg,
+ f: f,
+ fset: pkg.fset,
+ src: src,
+ filename: filename,
+ }
+ }
+ if len(pkg.files) == 0 {
+ return nil, nil
+ }
+ return pkg.lint(), nil
+}
+
+var (
+ genHdr = []byte("// Code generated ")
+ genFtr = []byte(" DO NOT EDIT.")
+)
+
+// isGenerated reports whether the source file is generated code
+// according the rules from https://golang.org/s/generatedcode.
+func isGenerated(src []byte) bool {
+ sc := bufio.NewScanner(bytes.NewReader(src))
+ for sc.Scan() {
+ b := sc.Bytes()
+ if bytes.HasPrefix(b, genHdr) && bytes.HasSuffix(b, genFtr) && len(b) >= len(genHdr)+len(genFtr) {
+ return true
+ }
+ }
+ return false
+}
+
+// pkg represents a package being linted.
+type pkg struct {
+ fset *token.FileSet
+ files map[string]*file
+
+ typesPkg *types.Package
+ typesInfo *types.Info
+
+ // sortable is the set of types in the package that implement sort.Interface.
+ sortable map[string]bool
+ // main is whether this is a "main" package.
+ main bool
+
+ problems []Problem
+}
+
+func (p *pkg) lint() []Problem {
+ p.scanSortable()
+ p.main = p.isMain()
+
+ for _, f := range p.files {
+ f.lint()
+ }
+
+ sort.Sort(byPosition(p.problems))
+
+ return p.problems
+}
+
+// file represents a file being linted.
+type file struct {
+ pkg *pkg
+ f *ast.File
+ fset *token.FileSet
+ src []byte
+ filename string
+}
+
+func (f *file) isTest() bool { return strings.HasSuffix(f.filename, "_test.go") }
+
+func (f *file) lint() {
+ f.lintPackageComment()
+ f.lintImports()
+ f.lintBlankImports()
+ f.lintExported()
+ f.lintNames()
+ f.lintElses()
+ f.lintRanges()
+ f.lintErrorf()
+ f.lintErrors()
+ f.lintErrorStrings()
+ f.lintReceiverNames()
+ f.lintIncDec()
+ f.lintErrorReturn()
+ f.lintUnexportedReturn()
+ f.lintTimeNames()
+ f.lintContextKeyTypes()
+ f.lintContextArgs()
+}
+
+type link string
+type category string
+
+// The variadic arguments may start with link and category types,
+// and must end with a format string and any arguments.
+// It returns the new Problem.
+func (f *file) errorf(n ast.Node, confidence float64, args ...interface{}) *Problem {
+ pos := f.fset.Position(n.Pos())
+ if pos.Filename == "" {
+ pos.Filename = f.filename
+ }
+ return f.pkg.errorfAt(pos, confidence, args...)
+}
+
+func (p *pkg) errorfAt(pos token.Position, confidence float64, args ...interface{}) *Problem {
+ problem := Problem{
+ Position: pos,
+ Confidence: confidence,
+ }
+ if pos.Filename != "" {
+ // The file might not exist in our mapping if a //line directive was encountered.
+ if f, ok := p.files[pos.Filename]; ok {
+ problem.LineText = srcLine(f.src, pos)
+ }
+ }
+
+argLoop:
+ for len(args) > 1 { // always leave at least the format string in args
+ switch v := args[0].(type) {
+ case link:
+ problem.Link = string(v)
+ case category:
+ problem.Category = string(v)
+ default:
+ break argLoop
+ }
+ args = args[1:]
+ }
+
+ problem.Text = fmt.Sprintf(args[0].(string), args[1:]...)
+
+ p.problems = append(p.problems, problem)
+ return &p.problems[len(p.problems)-1]
+}
+
+var newImporter = func(fset *token.FileSet) types.ImporterFrom {
+ return gcexportdata.NewImporter(fset, make(map[string]*types.Package))
+}
+
+func (p *pkg) typeCheck() error {
+ config := &types.Config{
+ // By setting a no-op error reporter, the type checker does as much work as possible.
+ Error: func(error) {},
+ Importer: newImporter(p.fset),
+ }
+ info := &types.Info{
+ Types: make(map[ast.Expr]types.TypeAndValue),
+ Defs: make(map[*ast.Ident]types.Object),
+ Uses: make(map[*ast.Ident]types.Object),
+ Scopes: make(map[ast.Node]*types.Scope),
+ }
+ var anyFile *file
+ var astFiles []*ast.File
+ for _, f := range p.files {
+ anyFile = f
+ astFiles = append(astFiles, f.f)
+ }
+ pkg, err := config.Check(anyFile.f.Name.Name, p.fset, astFiles, info)
+ // Remember the typechecking info, even if config.Check failed,
+ // since we will get partial information.
+ p.typesPkg = pkg
+ p.typesInfo = info
+ return err
+}
+
+func (p *pkg) typeOf(expr ast.Expr) types.Type {
+ if p.typesInfo == nil {
+ return nil
+ }
+ return p.typesInfo.TypeOf(expr)
+}
+
+func (p *pkg) isNamedType(typ types.Type, importPath, name string) bool {
+ n, ok := typ.(*types.Named)
+ if !ok {
+ return false
+ }
+ tn := n.Obj()
+ return tn != nil && tn.Pkg() != nil && tn.Pkg().Path() == importPath && tn.Name() == name
+}
+
+// scopeOf returns the tightest scope encompassing id.
+func (p *pkg) scopeOf(id *ast.Ident) *types.Scope {
+ var scope *types.Scope
+ if obj := p.typesInfo.ObjectOf(id); obj != nil {
+ scope = obj.Parent()
+ }
+ if scope == p.typesPkg.Scope() {
+ // We were given a top-level identifier.
+ // Use the file-level scope instead of the package-level scope.
+ pos := id.Pos()
+ for _, f := range p.files {
+ if f.f.Pos() <= pos && pos < f.f.End() {
+ scope = p.typesInfo.Scopes[f.f]
+ break
+ }
+ }
+ }
+ return scope
+}
+
+func (p *pkg) scanSortable() {
+ p.sortable = make(map[string]bool)
+
+ // bitfield for which methods exist on each type.
+ const (
+ Len = 1 << iota
+ Less
+ Swap
+ )
+ nmap := map[string]int{"Len": Len, "Less": Less, "Swap": Swap}
+ has := make(map[string]int)
+ for _, f := range p.files {
+ f.walk(func(n ast.Node) bool {
+ fn, ok := n.(*ast.FuncDecl)
+ if !ok || fn.Recv == nil || len(fn.Recv.List) == 0 {
+ return true
+ }
+ // TODO(dsymonds): We could check the signature to be more precise.
+ recv := receiverType(fn)
+ if i, ok := nmap[fn.Name.Name]; ok {
+ has[recv] |= i
+ }
+ return false
+ })
+ }
+ for typ, ms := range has {
+ if ms == Len|Less|Swap {
+ p.sortable[typ] = true
+ }
+ }
+}
+
+func (p *pkg) isMain() bool {
+ for _, f := range p.files {
+ if f.isMain() {
+ return true
+ }
+ }
+ return false
+}
+
+func (f *file) isMain() bool {
+ if f.f.Name.Name == "main" {
+ return true
+ }
+ return false
+}
+
+// lintPackageComment checks package comments. It complains if
+// there is no package comment, or if it is not of the right form.
+// This has a notable false positive in that a package comment
+// could rightfully appear in a different file of the same package,
+// but that's not easy to fix since this linter is file-oriented.
+func (f *file) lintPackageComment() {
+ if f.isTest() {
+ return
+ }
+
+ const ref = styleGuideBase + "#package-comments"
+ prefix := "Package " + f.f.Name.Name + " "
+
+ // Look for a detached package comment.
+ // First, scan for the last comment that occurs before the "package" keyword.
+ var lastCG *ast.CommentGroup
+ for _, cg := range f.f.Comments {
+ if cg.Pos() > f.f.Package {
+ // Gone past "package" keyword.
+ break
+ }
+ lastCG = cg
+ }
+ if lastCG != nil && strings.HasPrefix(lastCG.Text(), prefix) {
+ endPos := f.fset.Position(lastCG.End())
+ pkgPos := f.fset.Position(f.f.Package)
+ if endPos.Line+1 < pkgPos.Line {
+ // There isn't a great place to anchor this error;
+ // the start of the blank lines between the doc and the package statement
+ // is at least pointing at the location of the problem.
+ pos := token.Position{
+ Filename: endPos.Filename,
+ // Offset not set; it is non-trivial, and doesn't appear to be needed.
+ Line: endPos.Line + 1,
+ Column: 1,
+ }
+ f.pkg.errorfAt(pos, 0.9, link(ref), category("comments"), "package comment is detached; there should be no blank lines between it and the package statement")
+ return
+ }
+ }
+
+ if f.f.Doc == nil {
+ f.errorf(f.f, 0.2, link(ref), category("comments"), "should have a package comment, unless it's in another file for this package")
+ return
+ }
+ s := f.f.Doc.Text()
+ if ts := strings.TrimLeft(s, " \t"); ts != s {
+ f.errorf(f.f.Doc, 1, link(ref), category("comments"), "package comment should not have leading space")
+ s = ts
+ }
+ // Only non-main packages need to keep to this form.
+ if !f.pkg.main && !strings.HasPrefix(s, prefix) {
+ f.errorf(f.f.Doc, 1, link(ref), category("comments"), `package comment should be of the form "%s..."`, prefix)
+ }
+}
+
+func (f *file) isCgo() bool {
+ if f.src == nil {
+ return false
+ }
+ newLinePos := bytes.Index(f.src, []byte("\n"))
+ if newLinePos < 0 {
+ return false
+ }
+ firstLine := string(f.src[:newLinePos])
+
+ // files using cgo have implicitly added comment "Created by cgo - DO NOT EDIT" for go <= 1.10
+ // and "Code generated by cmd/cgo" for go >= 1.11
+ return strings.Contains(firstLine, "Created by cgo") || strings.Contains(firstLine, "Code generated by cmd/cgo")
+}
+
+// lintBlankImports complains if a non-main package has blank imports that are
+// not documented.
+func (f *file) lintBlankImports() {
+ // In package main and in tests, we don't complain about blank imports.
+ if f.pkg.main || f.isTest() || f.isCgo() {
+ return
+ }
+
+ // The first element of each contiguous group of blank imports should have
+ // an explanatory comment of some kind.
+ for i, imp := range f.f.Imports {
+ pos := f.fset.Position(imp.Pos())
+
+ if !isBlank(imp.Name) {
+ continue // Ignore non-blank imports.
+ }
+ if i > 0 {
+ prev := f.f.Imports[i-1]
+ prevPos := f.fset.Position(prev.Pos())
+ if isBlank(prev.Name) && prevPos.Line+1 == pos.Line {
+ continue // A subsequent blank in a group.
+ }
+ }
+
+ // This is the first blank import of a group.
+ if imp.Doc == nil && imp.Comment == nil {
+ ref := ""
+ f.errorf(imp, 1, link(ref), category("imports"), "a blank import should be only in a main or test package, or have a comment justifying it")
+ }
+ }
+}
+
+// lintImports examines import blocks.
+func (f *file) lintImports() {
+ for i, is := range f.f.Imports {
+ _ = i
+ if is.Name != nil && is.Name.Name == "." && !f.isTest() {
+ f.errorf(is, 1, link(styleGuideBase+"#import-dot"), category("imports"), "should not use dot imports")
+ }
+
+ }
+}
+
+const docCommentsLink = styleGuideBase + "#doc-comments"
+
+// lintExported examines the exported names.
+// It complains if any required doc comments are missing,
+// or if they are not of the right form. The exact rules are in
+// lintFuncDoc, lintTypeDoc and lintValueSpecDoc; this function
+// also tracks the GenDecl structure being traversed to permit
+// doc comments for constants to be on top of the const block.
+// It also complains if the names stutter when combined with
+// the package name.
+func (f *file) lintExported() {
+ if f.isTest() {
+ return
+ }
+
+ var lastGen *ast.GenDecl // last GenDecl entered.
+
+ // Set of GenDecls that have already had missing comments flagged.
+ genDeclMissingComments := make(map[*ast.GenDecl]bool)
+
+ f.walk(func(node ast.Node) bool {
+ switch v := node.(type) {
+ case *ast.GenDecl:
+ if v.Tok == token.IMPORT {
+ return false
+ }
+ // token.CONST, token.TYPE or token.VAR
+ lastGen = v
+ return true
+ case *ast.FuncDecl:
+ f.lintFuncDoc(v)
+ if v.Recv == nil {
+ // Only check for stutter on functions, not methods.
+ // Method names are not used package-qualified.
+ f.checkStutter(v.Name, "func")
+ }
+ // Don't proceed inside funcs.
+ return false
+ case *ast.TypeSpec:
+ // inside a GenDecl, which usually has the doc
+ doc := v.Doc
+ if doc == nil {
+ doc = lastGen.Doc
+ }
+ f.lintTypeDoc(v, doc)
+ f.checkStutter(v.Name, "type")
+ // Don't proceed inside types.
+ return false
+ case *ast.ValueSpec:
+ f.lintValueSpecDoc(v, lastGen, genDeclMissingComments)
+ return false
+ }
+ return true
+ })
+}
+
+var (
+ allCapsRE = regexp.MustCompile(`^[A-Z0-9_]+$`)
+ anyCapsRE = regexp.MustCompile(`[A-Z]`)
+)
+
+// knownNameExceptions is a set of names that are known to be exempt from naming checks.
+// This is usually because they are constrained by having to match names in the
+// standard library.
+var knownNameExceptions = map[string]bool{
+ "LastInsertId": true, // must match database/sql
+ "kWh": true,
+}
+
+func isInTopLevel(f *ast.File, ident *ast.Ident) bool {
+ path, _ := astutil.PathEnclosingInterval(f, ident.Pos(), ident.End())
+ for _, f := range path {
+ switch f.(type) {
+ case *ast.File, *ast.GenDecl, *ast.ValueSpec, *ast.Ident:
+ continue
+ }
+ return false
+ }
+ return true
+}
+
+// lintNames examines all names in the file.
+// It complains if any use underscores or incorrect known initialisms.
+func (f *file) lintNames() {
+ // Package names need slightly different handling than other names.
+ if strings.Contains(f.f.Name.Name, "_") && !strings.HasSuffix(f.f.Name.Name, "_test") {
+ f.errorf(f.f, 1, link("http://golang.org/doc/effective_go.html#package-names"), category("naming"), "don't use an underscore in package name")
+ }
+ if anyCapsRE.MatchString(f.f.Name.Name) {
+ f.errorf(f.f, 1, link("http://golang.org/doc/effective_go.html#package-names"), category("mixed-caps"), "don't use MixedCaps in package name; %s should be %s", f.f.Name.Name, strings.ToLower(f.f.Name.Name))
+ }
+
+ check := func(id *ast.Ident, thing string) {
+ if id.Name == "_" {
+ return
+ }
+ if knownNameExceptions[id.Name] {
+ return
+ }
+
+ // Handle two common styles from other languages that don't belong in Go.
+ if len(id.Name) >= 5 && allCapsRE.MatchString(id.Name) && strings.Contains(id.Name, "_") {
+ capCount := 0
+ for _, c := range id.Name {
+ if 'A' <= c && c <= 'Z' {
+ capCount++
+ }
+ }
+ if capCount >= 2 {
+ f.errorf(id, 0.8, link(styleGuideBase+"#mixed-caps"), category("naming"), "don't use ALL_CAPS in Go names; use CamelCase")
+ return
+ }
+ }
+ if thing == "const" || (thing == "var" && isInTopLevel(f.f, id)) {
+ if len(id.Name) > 2 && id.Name[0] == 'k' && id.Name[1] >= 'A' && id.Name[1] <= 'Z' {
+ should := string(id.Name[1]+'a'-'A') + id.Name[2:]
+ f.errorf(id, 0.8, link(styleGuideBase+"#mixed-caps"), category("naming"), "don't use leading k in Go names; %s %s should be %s", thing, id.Name, should)
+ }
+ }
+
+ should := lintName(id.Name)
+ if id.Name == should {
+ return
+ }
+
+ if len(id.Name) > 2 && strings.Contains(id.Name[1:], "_") {
+ f.errorf(id, 0.9, link("http://golang.org/doc/effective_go.html#mixed-caps"), category("naming"), "don't use underscores in Go names; %s %s should be %s", thing, id.Name, should)
+ return
+ }
+ f.errorf(id, 0.8, link(styleGuideBase+"#initialisms"), category("naming"), "%s %s should be %s", thing, id.Name, should)
+ }
+ checkList := func(fl *ast.FieldList, thing string) {
+ if fl == nil {
+ return
+ }
+ for _, f := range fl.List {
+ for _, id := range f.Names {
+ check(id, thing)
+ }
+ }
+ }
+ f.walk(func(node ast.Node) bool {
+ switch v := node.(type) {
+ case *ast.AssignStmt:
+ if v.Tok == token.ASSIGN {
+ return true
+ }
+ for _, exp := range v.Lhs {
+ if id, ok := exp.(*ast.Ident); ok {
+ check(id, "var")
+ }
+ }
+ case *ast.FuncDecl:
+ if f.isTest() && (strings.HasPrefix(v.Name.Name, "Example") || strings.HasPrefix(v.Name.Name, "Test") || strings.HasPrefix(v.Name.Name, "Benchmark")) {
+ return true
+ }
+
+ thing := "func"
+ if v.Recv != nil {
+ thing = "method"
+ }
+
+ // Exclude naming warnings for functions that are exported to C but
+ // not exported in the Go API.
+ // See https://github.com/golang/lint/issues/144.
+ if ast.IsExported(v.Name.Name) || !isCgoExported(v) {
+ check(v.Name, thing)
+ }
+
+ checkList(v.Type.Params, thing+" parameter")
+ checkList(v.Type.Results, thing+" result")
+ case *ast.GenDecl:
+ if v.Tok == token.IMPORT {
+ return true
+ }
+ var thing string
+ switch v.Tok {
+ case token.CONST:
+ thing = "const"
+ case token.TYPE:
+ thing = "type"
+ case token.VAR:
+ thing = "var"
+ }
+ for _, spec := range v.Specs {
+ switch s := spec.(type) {
+ case *ast.TypeSpec:
+ check(s.Name, thing)
+ case *ast.ValueSpec:
+ for _, id := range s.Names {
+ check(id, thing)
+ }
+ }
+ }
+ case *ast.InterfaceType:
+ // Do not check interface method names.
+ // They are often constrainted by the method names of concrete types.
+ for _, x := range v.Methods.List {
+ ft, ok := x.Type.(*ast.FuncType)
+ if !ok { // might be an embedded interface name
+ continue
+ }
+ checkList(ft.Params, "interface method parameter")
+ checkList(ft.Results, "interface method result")
+ }
+ case *ast.RangeStmt:
+ if v.Tok == token.ASSIGN {
+ return true
+ }
+ if id, ok := v.Key.(*ast.Ident); ok {
+ check(id, "range var")
+ }
+ if id, ok := v.Value.(*ast.Ident); ok {
+ check(id, "range var")
+ }
+ case *ast.StructType:
+ for _, f := range v.Fields.List {
+ for _, id := range f.Names {
+ check(id, "struct field")
+ }
+ }
+ }
+ return true
+ })
+}
+
+// lintName returns a different name if it should be different.
+func lintName(name string) (should string) {
+ // Fast path for simple cases: "_" and all lowercase.
+ if name == "_" {
+ return name
+ }
+ allLower := true
+ for _, r := range name {
+ if !unicode.IsLower(r) {
+ allLower = false
+ break
+ }
+ }
+ if allLower {
+ return name
+ }
+
+ // Split camelCase at any lower->upper transition, and split on underscores.
+ // Check each word for common initialisms.
+ runes := []rune(name)
+ w, i := 0, 0 // index of start of word, scan
+ for i+1 <= len(runes) {
+ eow := false // whether we hit the end of a word
+ if i+1 == len(runes) {
+ eow = true
+ } else if runes[i+1] == '_' {
+ // underscore; shift the remainder forward over any run of underscores
+ eow = true
+ n := 1
+ for i+n+1 < len(runes) && runes[i+n+1] == '_' {
+ n++
+ }
+
+ // Leave at most one underscore if the underscore is between two digits
+ if i+n+1 < len(runes) && unicode.IsDigit(runes[i]) && unicode.IsDigit(runes[i+n+1]) {
+ n--
+ }
+
+ copy(runes[i+1:], runes[i+n+1:])
+ runes = runes[:len(runes)-n]
+ } else if unicode.IsLower(runes[i]) && !unicode.IsLower(runes[i+1]) {
+ // lower->non-lower
+ eow = true
+ }
+ i++
+ if !eow {
+ continue
+ }
+
+ // [w,i) is a word.
+ word := string(runes[w:i])
+ if u := strings.ToUpper(word); commonInitialisms[u] {
+ // Keep consistent case, which is lowercase only at the start.
+ if w == 0 && unicode.IsLower(runes[w]) {
+ u = strings.ToLower(u)
+ }
+ // All the common initialisms are ASCII,
+ // so we can replace the bytes exactly.
+ copy(runes[w:], []rune(u))
+ } else if w > 0 && strings.ToLower(word) == word {
+ // already all lowercase, and not the first word, so uppercase the first character.
+ runes[w] = unicode.ToUpper(runes[w])
+ }
+ w = i
+ }
+ return string(runes)
+}
+
+// commonInitialisms is a set of common initialisms.
+// Only add entries that are highly unlikely to be non-initialisms.
+// For instance, "ID" is fine (Freudian code is rare), but "AND" is not.
+var commonInitialisms = map[string]bool{
+ "ACL": true,
+ "API": true,
+ "ASCII": true,
+ "CPU": true,
+ "CSS": true,
+ "DNS": true,
+ "EOF": true,
+ "GUID": true,
+ "HTML": true,
+ "HTTP": true,
+ "HTTPS": true,
+ "ID": true,
+ "IP": true,
+ "JSON": true,
+ "LHS": true,
+ "QPS": true,
+ "RAM": true,
+ "RHS": true,
+ "RPC": true,
+ "SLA": true,
+ "SMTP": true,
+ "SQL": true,
+ "SSH": true,
+ "TCP": true,
+ "TLS": true,
+ "TTL": true,
+ "UDP": true,
+ "UI": true,
+ "UID": true,
+ "UUID": true,
+ "URI": true,
+ "URL": true,
+ "UTF8": true,
+ "VM": true,
+ "XML": true,
+ "XMPP": true,
+ "XSRF": true,
+ "XSS": true,
+}
+
+// lintTypeDoc examines the doc comment on a type.
+// It complains if they are missing from an exported type,
+// or if they are not of the standard form.
+func (f *file) lintTypeDoc(t *ast.TypeSpec, doc *ast.CommentGroup) {
+ if !ast.IsExported(t.Name.Name) {
+ return
+ }
+ if doc == nil {
+ f.errorf(t, 1, link(docCommentsLink), category("comments"), "exported type %v should have comment or be unexported", t.Name)
+ return
+ }
+
+ s := doc.Text()
+ articles := [...]string{"A", "An", "The"}
+ for _, a := range articles {
+ if strings.HasPrefix(s, a+" ") {
+ s = s[len(a)+1:]
+ break
+ }
+ }
+ if !strings.HasPrefix(s, t.Name.Name+" ") {
+ f.errorf(doc, 1, link(docCommentsLink), category("comments"), `comment on exported type %v should be of the form "%v ..." (with optional leading article)`, t.Name, t.Name)
+ }
+}
+
+var commonMethods = map[string]bool{
+ "Error": true,
+ "Read": true,
+ "ServeHTTP": true,
+ "String": true,
+ "Write": true,
+}
+
+// lintFuncDoc examines doc comments on functions and methods.
+// It complains if they are missing, or not of the right form.
+// It has specific exclusions for well-known methods (see commonMethods above).
+func (f *file) lintFuncDoc(fn *ast.FuncDecl) {
+ if !ast.IsExported(fn.Name.Name) {
+ // func is unexported
+ return
+ }
+ kind := "function"
+ name := fn.Name.Name
+ if fn.Recv != nil && len(fn.Recv.List) > 0 {
+ // method
+ kind = "method"
+ recv := receiverType(fn)
+ if !ast.IsExported(recv) {
+ // receiver is unexported
+ return
+ }
+ if commonMethods[name] {
+ return
+ }
+ switch name {
+ case "Len", "Less", "Swap":
+ if f.pkg.sortable[recv] {
+ return
+ }
+ }
+ name = recv + "." + name
+ }
+ if fn.Doc == nil {
+ f.errorf(fn, 1, link(docCommentsLink), category("comments"), "exported %s %s should have comment or be unexported", kind, name)
+ return
+ }
+ s := fn.Doc.Text()
+ prefix := fn.Name.Name + " "
+ if !strings.HasPrefix(s, prefix) {
+ f.errorf(fn.Doc, 1, link(docCommentsLink), category("comments"), `comment on exported %s %s should be of the form "%s..."`, kind, name, prefix)
+ }
+}
+
+// lintValueSpecDoc examines package-global variables and constants.
+// It complains if they are not individually declared,
+// or if they are not suitably documented in the right form (unless they are in a block that is commented).
+func (f *file) lintValueSpecDoc(vs *ast.ValueSpec, gd *ast.GenDecl, genDeclMissingComments map[*ast.GenDecl]bool) {
+ kind := "var"
+ if gd.Tok == token.CONST {
+ kind = "const"
+ }
+
+ if len(vs.Names) > 1 {
+ // Check that none are exported except for the first.
+ for _, n := range vs.Names[1:] {
+ if ast.IsExported(n.Name) {
+ f.errorf(vs, 1, category("comments"), "exported %s %s should have its own declaration", kind, n.Name)
+ return
+ }
+ }
+ }
+
+ // Only one name.
+ name := vs.Names[0].Name
+ if !ast.IsExported(name) {
+ return
+ }
+
+ if vs.Doc == nil && gd.Doc == nil {
+ if genDeclMissingComments[gd] {
+ return
+ }
+ block := ""
+ if kind == "const" && gd.Lparen.IsValid() {
+ block = " (or a comment on this block)"
+ }
+ f.errorf(vs, 1, link(docCommentsLink), category("comments"), "exported %s %s should have comment%s or be unexported", kind, name, block)
+ genDeclMissingComments[gd] = true
+ return
+ }
+ // If this GenDecl has parens and a comment, we don't check its comment form.
+ if gd.Lparen.IsValid() && gd.Doc != nil {
+ return
+ }
+ // The relevant text to check will be on either vs.Doc or gd.Doc.
+ // Use vs.Doc preferentially.
+ doc := vs.Doc
+ if doc == nil {
+ doc = gd.Doc
+ }
+ prefix := name + " "
+ if !strings.HasPrefix(doc.Text(), prefix) {
+ f.errorf(doc, 1, link(docCommentsLink), category("comments"), `comment on exported %s %s should be of the form "%s..."`, kind, name, prefix)
+ }
+}
+
+func (f *file) checkStutter(id *ast.Ident, thing string) {
+ pkg, name := f.f.Name.Name, id.Name
+ if !ast.IsExported(name) {
+ // unexported name
+ return
+ }
+ // A name stutters if the package name is a strict prefix
+ // and the next character of the name starts a new word.
+ if len(name) <= len(pkg) {
+ // name is too short to stutter.
+ // This permits the name to be the same as the package name.
+ return
+ }
+ if !strings.EqualFold(pkg, name[:len(pkg)]) {
+ return
+ }
+ // We can assume the name is well-formed UTF-8.
+ // If the next rune after the package name is uppercase or an underscore
+ // the it's starting a new word and thus this name stutters.
+ rem := name[len(pkg):]
+ if next, _ := utf8.DecodeRuneInString(rem); next == '_' || unicode.IsUpper(next) {
+ f.errorf(id, 0.8, link(styleGuideBase+"#package-names"), category("naming"), "%s name will be used as %s.%s by other packages, and that stutters; consider calling this %s", thing, pkg, name, rem)
+ }
+}
+
+// zeroLiteral is a set of ast.BasicLit values that are zero values.
+// It is not exhaustive.
+var zeroLiteral = map[string]bool{
+ "false": true, // bool
+ // runes
+ `'\x00'`: true,
+ `'\000'`: true,
+ // strings
+ `""`: true,
+ "``": true,
+ // numerics
+ "0": true,
+ "0.": true,
+ "0.0": true,
+ "0i": true,
+}
+
+// lintElses examines else blocks. It complains about any else block whose if block ends in a return.
+func (f *file) lintElses() {
+ // We don't want to flag if { } else if { } else { } constructions.
+ // They will appear as an IfStmt whose Else field is also an IfStmt.
+ // Record such a node so we ignore it when we visit it.
+ ignore := make(map[*ast.IfStmt]bool)
+
+ f.walk(func(node ast.Node) bool {
+ ifStmt, ok := node.(*ast.IfStmt)
+ if !ok || ifStmt.Else == nil {
+ return true
+ }
+ if elseif, ok := ifStmt.Else.(*ast.IfStmt); ok {
+ ignore[elseif] = true
+ return true
+ }
+ if ignore[ifStmt] {
+ return true
+ }
+ if _, ok := ifStmt.Else.(*ast.BlockStmt); !ok {
+ // only care about elses without conditions
+ return true
+ }
+ if len(ifStmt.Body.List) == 0 {
+ return true
+ }
+ shortDecl := false // does the if statement have a ":=" initialization statement?
+ if ifStmt.Init != nil {
+ if as, ok := ifStmt.Init.(*ast.AssignStmt); ok && as.Tok == token.DEFINE {
+ shortDecl = true
+ }
+ }
+ lastStmt := ifStmt.Body.List[len(ifStmt.Body.List)-1]
+ if _, ok := lastStmt.(*ast.ReturnStmt); ok {
+ extra := ""
+ if shortDecl {
+ extra = " (move short variable declaration to its own line if necessary)"
+ }
+ f.errorf(ifStmt.Else, 1, link(styleGuideBase+"#indent-error-flow"), category("indent"), "if block ends with a return statement, so drop this else and outdent its block"+extra)
+ }
+ return true
+ })
+}
+
+// lintRanges examines range clauses. It complains about redundant constructions.
+func (f *file) lintRanges() {
+ f.walk(func(node ast.Node) bool {
+ rs, ok := node.(*ast.RangeStmt)
+ if !ok {
+ return true
+ }
+
+ if isIdent(rs.Key, "_") && (rs.Value == nil || isIdent(rs.Value, "_")) {
+ p := f.errorf(rs.Key, 1, category("range-loop"), "should omit values from range; this loop is equivalent to `for range ...`")
+
+ newRS := *rs // shallow copy
+ newRS.Value = nil
+ newRS.Key = nil
+ p.ReplacementLine = f.firstLineOf(&newRS, rs)
+
+ return true
+ }
+
+ if isIdent(rs.Value, "_") {
+ p := f.errorf(rs.Value, 1, category("range-loop"), "should omit 2nd value from range; this loop is equivalent to `for %s %s range ...`", f.render(rs.Key), rs.Tok)
+
+ newRS := *rs // shallow copy
+ newRS.Value = nil
+ p.ReplacementLine = f.firstLineOf(&newRS, rs)
+ }
+
+ return true
+ })
+}
+
+// lintErrorf examines errors.New and testing.Error calls. It complains if its only argument is an fmt.Sprintf invocation.
+func (f *file) lintErrorf() {
+ f.walk(func(node ast.Node) bool {
+ ce, ok := node.(*ast.CallExpr)
+ if !ok || len(ce.Args) != 1 {
+ return true
+ }
+ isErrorsNew := isPkgDot(ce.Fun, "errors", "New")
+ var isTestingError bool
+ se, ok := ce.Fun.(*ast.SelectorExpr)
+ if ok && se.Sel.Name == "Error" {
+ if typ := f.pkg.typeOf(se.X); typ != nil {
+ isTestingError = typ.String() == "*testing.T"
+ }
+ }
+ if !isErrorsNew && !isTestingError {
+ return true
+ }
+ if !f.imports("errors") {
+ return true
+ }
+ arg := ce.Args[0]
+ ce, ok = arg.(*ast.CallExpr)
+ if !ok || !isPkgDot(ce.Fun, "fmt", "Sprintf") {
+ return true
+ }
+ errorfPrefix := "fmt"
+ if isTestingError {
+ errorfPrefix = f.render(se.X)
+ }
+ p := f.errorf(node, 1, category("errors"), "should replace %s(fmt.Sprintf(...)) with %s.Errorf(...)", f.render(se), errorfPrefix)
+
+ m := f.srcLineWithMatch(ce, `^(.*)`+f.render(se)+`\(fmt\.Sprintf\((.*)\)\)(.*)$`)
+ if m != nil {
+ p.ReplacementLine = m[1] + errorfPrefix + ".Errorf(" + m[2] + ")" + m[3]
+ }
+
+ return true
+ })
+}
+
+// lintErrors examines global error vars. It complains if they aren't named in the standard way.
+func (f *file) lintErrors() {
+ for _, decl := range f.f.Decls {
+ gd, ok := decl.(*ast.GenDecl)
+ if !ok || gd.Tok != token.VAR {
+ continue
+ }
+ for _, spec := range gd.Specs {
+ spec := spec.(*ast.ValueSpec)
+ if len(spec.Names) != 1 || len(spec.Values) != 1 {
+ continue
+ }
+ ce, ok := spec.Values[0].(*ast.CallExpr)
+ if !ok {
+ continue
+ }
+ if !isPkgDot(ce.Fun, "errors", "New") && !isPkgDot(ce.Fun, "fmt", "Errorf") {
+ continue
+ }
+
+ id := spec.Names[0]
+ prefix := "err"
+ if id.IsExported() {
+ prefix = "Err"
+ }
+ if !strings.HasPrefix(id.Name, prefix) {
+ f.errorf(id, 0.9, category("naming"), "error var %s should have name of the form %sFoo", id.Name, prefix)
+ }
+ }
+ }
+}
+
+func lintErrorString(s string) (isClean bool, conf float64) {
+ const basicConfidence = 0.8
+ const capConfidence = basicConfidence - 0.2
+ first, firstN := utf8.DecodeRuneInString(s)
+ last, _ := utf8.DecodeLastRuneInString(s)
+ if last == '.' || last == ':' || last == '!' || last == '\n' {
+ return false, basicConfidence
+ }
+ if unicode.IsUpper(first) {
+ // People use proper nouns and exported Go identifiers in error strings,
+ // so decrease the confidence of warnings for capitalization.
+ if len(s) <= firstN {
+ return false, capConfidence
+ }
+ // Flag strings starting with something that doesn't look like an initialism.
+ if second, _ := utf8.DecodeRuneInString(s[firstN:]); !unicode.IsUpper(second) {
+ return false, capConfidence
+ }
+ }
+ return true, 0
+}
+
+// lintErrorStrings examines error strings.
+// It complains if they are capitalized or end in punctuation or a newline.
+func (f *file) lintErrorStrings() {
+ f.walk(func(node ast.Node) bool {
+ ce, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ if !isPkgDot(ce.Fun, "errors", "New") && !isPkgDot(ce.Fun, "fmt", "Errorf") {
+ return true
+ }
+ if len(ce.Args) < 1 {
+ return true
+ }
+ str, ok := ce.Args[0].(*ast.BasicLit)
+ if !ok || str.Kind != token.STRING {
+ return true
+ }
+ s, _ := strconv.Unquote(str.Value) // can assume well-formed Go
+ if s == "" {
+ return true
+ }
+ clean, conf := lintErrorString(s)
+ if clean {
+ return true
+ }
+
+ f.errorf(str, conf, link(styleGuideBase+"#error-strings"), category("errors"),
+ "error strings should not be capitalized or end with punctuation or a newline")
+ return true
+ })
+}
+
+// lintReceiverNames examines receiver names. It complains about inconsistent
+// names used for the same type and names such as "this".
+func (f *file) lintReceiverNames() {
+ typeReceiver := map[string]string{}
+ f.walk(func(n ast.Node) bool {
+ fn, ok := n.(*ast.FuncDecl)
+ if !ok || fn.Recv == nil || len(fn.Recv.List) == 0 {
+ return true
+ }
+ names := fn.Recv.List[0].Names
+ if len(names) < 1 {
+ return true
+ }
+ name := names[0].Name
+ const ref = styleGuideBase + "#receiver-names"
+ if name == "_" {
+ f.errorf(n, 1, link(ref), category("naming"), `receiver name should not be an underscore, omit the name if it is unused`)
+ return true
+ }
+ if name == "this" || name == "self" {
+ f.errorf(n, 1, link(ref), category("naming"), `receiver name should be a reflection of its identity; don't use generic names such as "this" or "self"`)
+ return true
+ }
+ recv := receiverType(fn)
+ if prev, ok := typeReceiver[recv]; ok && prev != name {
+ f.errorf(n, 1, link(ref), category("naming"), "receiver name %s should be consistent with previous receiver name %s for %s", name, prev, recv)
+ return true
+ }
+ typeReceiver[recv] = name
+ return true
+ })
+}
+
+// lintIncDec examines statements that increment or decrement a variable.
+// It complains if they don't use x++ or x--.
+func (f *file) lintIncDec() {
+ f.walk(func(n ast.Node) bool {
+ as, ok := n.(*ast.AssignStmt)
+ if !ok {
+ return true
+ }
+ if len(as.Lhs) != 1 {
+ return true
+ }
+ if !isOne(as.Rhs[0]) {
+ return true
+ }
+ var suffix string
+ switch as.Tok {
+ case token.ADD_ASSIGN:
+ suffix = "++"
+ case token.SUB_ASSIGN:
+ suffix = "--"
+ default:
+ return true
+ }
+ f.errorf(as, 0.8, category("unary-op"), "should replace %s with %s%s", f.render(as), f.render(as.Lhs[0]), suffix)
+ return true
+ })
+}
+
+// lintErrorReturn examines function declarations that return an error.
+// It complains if the error isn't the last parameter.
+func (f *file) lintErrorReturn() {
+ f.walk(func(n ast.Node) bool {
+ fn, ok := n.(*ast.FuncDecl)
+ if !ok || fn.Type.Results == nil {
+ return true
+ }
+ ret := fn.Type.Results.List
+ if len(ret) <= 1 {
+ return true
+ }
+ if isIdent(ret[len(ret)-1].Type, "error") {
+ return true
+ }
+ // An error return parameter should be the last parameter.
+ // Flag any error parameters found before the last.
+ for _, r := range ret[:len(ret)-1] {
+ if isIdent(r.Type, "error") {
+ f.errorf(fn, 0.9, category("arg-order"), "error should be the last type when returning multiple items")
+ break // only flag one
+ }
+ }
+ return true
+ })
+}
+
+// lintUnexportedReturn examines exported function declarations.
+// It complains if any return an unexported type.
+func (f *file) lintUnexportedReturn() {
+ f.walk(func(n ast.Node) bool {
+ fn, ok := n.(*ast.FuncDecl)
+ if !ok {
+ return true
+ }
+ if fn.Type.Results == nil {
+ return false
+ }
+ if !fn.Name.IsExported() {
+ return false
+ }
+ thing := "func"
+ if fn.Recv != nil && len(fn.Recv.List) > 0 {
+ thing = "method"
+ if !ast.IsExported(receiverType(fn)) {
+ // Don't report exported methods of unexported types,
+ // such as private implementations of sort.Interface.
+ return false
+ }
+ }
+ for _, ret := range fn.Type.Results.List {
+ typ := f.pkg.typeOf(ret.Type)
+ if exportedType(typ) {
+ continue
+ }
+ f.errorf(ret.Type, 0.8, category("unexported-type-in-api"),
+ "exported %s %s returns unexported type %s, which can be annoying to use",
+ thing, fn.Name.Name, typ)
+ break // only flag one
+ }
+ return false
+ })
+}
+
+// exportedType reports whether typ is an exported type.
+// It is imprecise, and will err on the side of returning true,
+// such as for composite types.
+func exportedType(typ types.Type) bool {
+ switch T := typ.(type) {
+ case *types.Named:
+ // Builtin types have no package.
+ return T.Obj().Pkg() == nil || T.Obj().Exported()
+ case *types.Map:
+ return exportedType(T.Key()) && exportedType(T.Elem())
+ case interface {
+ Elem() types.Type
+ }: // array, slice, pointer, chan
+ return exportedType(T.Elem())
+ }
+ // Be conservative about other types, such as struct, interface, etc.
+ return true
+}
+
+// timeSuffixes is a list of name suffixes that imply a time unit.
+// This is not an exhaustive list.
+var timeSuffixes = []string{
+ "Sec", "Secs", "Seconds",
+ "Msec", "Msecs",
+ "Milli", "Millis", "Milliseconds",
+ "Usec", "Usecs", "Microseconds",
+ "MS", "Ms",
+}
+
+func (f *file) lintTimeNames() {
+ f.walk(func(node ast.Node) bool {
+ v, ok := node.(*ast.ValueSpec)
+ if !ok {
+ return true
+ }
+ for _, name := range v.Names {
+ origTyp := f.pkg.typeOf(name)
+ // Look for time.Duration or *time.Duration;
+ // the latter is common when using flag.Duration.
+ typ := origTyp
+ if pt, ok := typ.(*types.Pointer); ok {
+ typ = pt.Elem()
+ }
+ if !f.pkg.isNamedType(typ, "time", "Duration") {
+ continue
+ }
+ suffix := ""
+ for _, suf := range timeSuffixes {
+ if strings.HasSuffix(name.Name, suf) {
+ suffix = suf
+ break
+ }
+ }
+ if suffix == "" {
+ continue
+ }
+ f.errorf(v, 0.9, category("time"), "var %s is of type %v; don't use unit-specific suffix %q", name.Name, origTyp, suffix)
+ }
+ return true
+ })
+}
+
+// lintContextKeyTypes checks for call expressions to context.WithValue with
+// basic types used for the key argument.
+// See: https://golang.org/issue/17293
+func (f *file) lintContextKeyTypes() {
+ f.walk(func(node ast.Node) bool {
+ switch node := node.(type) {
+ case *ast.CallExpr:
+ f.checkContextKeyType(node)
+ }
+
+ return true
+ })
+}
+
+// checkContextKeyType reports an error if the call expression calls
+// context.WithValue with a key argument of basic type.
+func (f *file) checkContextKeyType(x *ast.CallExpr) {
+ sel, ok := x.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return
+ }
+ pkg, ok := sel.X.(*ast.Ident)
+ if !ok || pkg.Name != "context" {
+ return
+ }
+ if sel.Sel.Name != "WithValue" {
+ return
+ }
+
+ // key is second argument to context.WithValue
+ if len(x.Args) != 3 {
+ return
+ }
+ key := f.pkg.typesInfo.Types[x.Args[1]]
+
+ if ktyp, ok := key.Type.(*types.Basic); ok && ktyp.Kind() != types.Invalid {
+ f.errorf(x, 1.0, category("context"), fmt.Sprintf("should not use basic type %s as key in context.WithValue", key.Type))
+ }
+}
+
+// lintContextArgs examines function declarations that contain an
+// argument with a type of context.Context
+// It complains if that argument isn't the first parameter.
+func (f *file) lintContextArgs() {
+ f.walk(func(n ast.Node) bool {
+ fn, ok := n.(*ast.FuncDecl)
+ if !ok || len(fn.Type.Params.List) <= 1 {
+ return true
+ }
+ // A context.Context should be the first parameter of a function.
+ // Flag any that show up after the first.
+ for _, arg := range fn.Type.Params.List[1:] {
+ if isPkgDot(arg.Type, "context", "Context") {
+ f.errorf(fn, 0.9, link("https://golang.org/pkg/context/"), category("arg-order"), "context.Context should be the first parameter of a function")
+ break // only flag one
+ }
+ }
+ return true
+ })
+}
+
+// containsComments returns whether the interval [start, end) contains any
+// comments without "// MATCH " prefix.
+func (f *file) containsComments(start, end token.Pos) bool {
+ for _, cgroup := range f.f.Comments {
+ comments := cgroup.List
+ if comments[0].Slash >= end {
+ // All comments starting with this group are after end pos.
+ return false
+ }
+ if comments[len(comments)-1].Slash < start {
+ // Comments group ends before start pos.
+ continue
+ }
+ for _, c := range comments {
+ if start <= c.Slash && c.Slash < end && !strings.HasPrefix(c.Text, "// MATCH ") {
+ return true
+ }
+ }
+ }
+ return false
+}
+
+// receiverType returns the named type of the method receiver, sans "*",
+// or "invalid-type" if fn.Recv is ill formed.
+func receiverType(fn *ast.FuncDecl) string {
+ switch e := fn.Recv.List[0].Type.(type) {
+ case *ast.Ident:
+ return e.Name
+ case *ast.StarExpr:
+ if id, ok := e.X.(*ast.Ident); ok {
+ return id.Name
+ }
+ }
+ // The parser accepts much more than just the legal forms.
+ return "invalid-type"
+}
+
+func (f *file) walk(fn func(ast.Node) bool) {
+ ast.Walk(walker(fn), f.f)
+}
+
+func (f *file) render(x interface{}) string {
+ var buf bytes.Buffer
+ if err := printer.Fprint(&buf, f.fset, x); err != nil {
+ panic(err)
+ }
+ return buf.String()
+}
+
+func (f *file) debugRender(x interface{}) string {
+ var buf bytes.Buffer
+ if err := ast.Fprint(&buf, f.fset, x, nil); err != nil {
+ panic(err)
+ }
+ return buf.String()
+}
+
+// walker adapts a function to satisfy the ast.Visitor interface.
+// The function return whether the walk should proceed into the node's children.
+type walker func(ast.Node) bool
+
+func (w walker) Visit(node ast.Node) ast.Visitor {
+ if w(node) {
+ return w
+ }
+ return nil
+}
+
+func isIdent(expr ast.Expr, ident string) bool {
+ id, ok := expr.(*ast.Ident)
+ return ok && id.Name == ident
+}
+
+// isBlank returns whether id is the blank identifier "_".
+// If id == nil, the answer is false.
+func isBlank(id *ast.Ident) bool { return id != nil && id.Name == "_" }
+
+func isPkgDot(expr ast.Expr, pkg, name string) bool {
+ sel, ok := expr.(*ast.SelectorExpr)
+ return ok && isIdent(sel.X, pkg) && isIdent(sel.Sel, name)
+}
+
+func isOne(expr ast.Expr) bool {
+ lit, ok := expr.(*ast.BasicLit)
+ return ok && lit.Kind == token.INT && lit.Value == "1"
+}
+
+func isCgoExported(f *ast.FuncDecl) bool {
+ if f.Recv != nil || f.Doc == nil {
+ return false
+ }
+
+ cgoExport := regexp.MustCompile(fmt.Sprintf("(?m)^//export %s$", regexp.QuoteMeta(f.Name.Name)))
+ for _, c := range f.Doc.List {
+ if cgoExport.MatchString(c.Text) {
+ return true
+ }
+ }
+ return false
+}
+
+var basicTypeKinds = map[types.BasicKind]string{
+ types.UntypedBool: "bool",
+ types.UntypedInt: "int",
+ types.UntypedRune: "rune",
+ types.UntypedFloat: "float64",
+ types.UntypedComplex: "complex128",
+ types.UntypedString: "string",
+}
+
+// isUntypedConst reports whether expr is an untyped constant,
+// and indicates what its default type is.
+// scope may be nil.
+func (f *file) isUntypedConst(expr ast.Expr) (defType string, ok bool) {
+ // Re-evaluate expr outside of its context to see if it's untyped.
+ // (An expr evaluated within, for example, an assignment context will get the type of the LHS.)
+ exprStr := f.render(expr)
+ tv, err := types.Eval(f.fset, f.pkg.typesPkg, expr.Pos(), exprStr)
+ if err != nil {
+ return "", false
+ }
+ if b, ok := tv.Type.(*types.Basic); ok {
+ if dt, ok := basicTypeKinds[b.Kind()]; ok {
+ return dt, true
+ }
+ }
+
+ return "", false
+}
+
+// firstLineOf renders the given node and returns its first line.
+// It will also match the indentation of another node.
+func (f *file) firstLineOf(node, match ast.Node) string {
+ line := f.render(node)
+ if i := strings.Index(line, "\n"); i >= 0 {
+ line = line[:i]
+ }
+ return f.indentOf(match) + line
+}
+
+func (f *file) indentOf(node ast.Node) string {
+ line := srcLine(f.src, f.fset.Position(node.Pos()))
+ for i, r := range line {
+ switch r {
+ case ' ', '\t':
+ default:
+ return line[:i]
+ }
+ }
+ return line // unusual or empty line
+}
+
+func (f *file) srcLineWithMatch(node ast.Node, pattern string) (m []string) {
+ line := srcLine(f.src, f.fset.Position(node.Pos()))
+ line = strings.TrimSuffix(line, "\n")
+ rx := regexp.MustCompile(pattern)
+ return rx.FindStringSubmatch(line)
+}
+
+// imports returns true if the current file imports the specified package path.
+func (f *file) imports(importPath string) bool {
+ all := astutil.Imports(f.fset, f.f)
+ for _, p := range all {
+ for _, i := range p {
+ uq, err := strconv.Unquote(i.Path.Value)
+ if err == nil && importPath == uq {
+ return true
+ }
+ }
+ }
+ return false
+}
+
+// srcLine returns the complete line at p, including the terminating newline.
+func srcLine(src []byte, p token.Position) string {
+ // Run to end of line in both directions if not at line start/end.
+ lo, hi := p.Offset, p.Offset+1
+ for lo > 0 && src[lo-1] != '\n' {
+ lo--
+ }
+ for hi < len(src) && src[hi-1] != '\n' {
+ hi++
+ }
+ return string(src[lo:hi])
+}
diff --git a/vendor/github.com/golangci/maligned/LICENSE b/vendor/github.com/golangci/maligned/LICENSE
new file mode 100644
index 000000000..744875676
--- /dev/null
+++ b/vendor/github.com/golangci/maligned/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2012 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/golangci/maligned/README b/vendor/github.com/golangci/maligned/README
new file mode 100644
index 000000000..4e57f6eab
--- /dev/null
+++ b/vendor/github.com/golangci/maligned/README
@@ -0,0 +1,7 @@
+Install:
+
+ go get github.com/mdempsky/maligned
+
+Usage:
+
+ maligned cmd/compile/internal/gc cmd/link/internal/ld
diff --git a/vendor/github.com/golangci/maligned/maligned.go b/vendor/github.com/golangci/maligned/maligned.go
new file mode 100644
index 000000000..c2492b2ff
--- /dev/null
+++ b/vendor/github.com/golangci/maligned/maligned.go
@@ -0,0 +1,253 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package maligned
+
+import (
+ "fmt"
+ "go/ast"
+ "go/build"
+ "go/token"
+ "go/types"
+ "sort"
+ "strings"
+
+ "golang.org/x/tools/go/loader"
+)
+
+var fset = token.NewFileSet()
+
+type Issue struct {
+ OldSize, NewSize int
+ NewStructDef string
+ Pos token.Position
+}
+
+func Run(prog *loader.Program) []Issue {
+ flagVerbose := true
+ fset = prog.Fset
+
+ var issues []Issue
+
+ for _, pkg := range prog.InitialPackages() {
+ for _, file := range pkg.Files {
+ ast.Inspect(file, func(node ast.Node) bool {
+ if s, ok := node.(*ast.StructType); ok {
+ i := malign(node.Pos(), pkg.Types[s].Type.(*types.Struct), flagVerbose)
+ if i != nil {
+ issues = append(issues, *i)
+ }
+ }
+ return true
+ })
+ }
+ }
+
+ return issues
+}
+
+func malign(pos token.Pos, str *types.Struct, verbose bool) *Issue {
+ wordSize := int64(8)
+ maxAlign := int64(8)
+ switch build.Default.GOARCH {
+ case "386", "arm":
+ wordSize, maxAlign = 4, 4
+ case "amd64p32":
+ wordSize = 4
+ }
+
+ s := gcSizes{wordSize, maxAlign}
+ sz := s.Sizeof(str)
+ opt, fields := optimalSize(str, &s, verbose)
+ if sz == opt {
+ return nil
+ }
+
+ newStructDefParts := []string{"struct{"}
+
+ var w int
+ for _, f := range fields {
+ if n := len(f.Name()); n > w {
+ w = n
+ }
+ }
+ spaces := strings.Repeat(" ", w)
+ for _, f := range fields {
+ line := fmt.Sprintf("\t%s%s\t%s,", f.Name(), spaces[len(f.Name()):], f.Type().String())
+ newStructDefParts = append(newStructDefParts, line)
+ }
+ newStructDefParts = append(newStructDefParts, "}")
+
+ return &Issue{
+ OldSize: int(sz),
+ NewSize: int(opt),
+ NewStructDef: strings.Join(newStructDefParts, "\n"),
+ Pos: fset.Position(pos),
+ }
+}
+
+func optimalSize(str *types.Struct, sizes *gcSizes, stable bool) (int64, []*types.Var) {
+ nf := str.NumFields()
+ fields := make([]*types.Var, nf)
+ alignofs := make([]int64, nf)
+ sizeofs := make([]int64, nf)
+ for i := 0; i < nf; i++ {
+ fields[i] = str.Field(i)
+ ft := fields[i].Type()
+ alignofs[i] = sizes.Alignof(ft)
+ sizeofs[i] = sizes.Sizeof(ft)
+ }
+ if stable { // Stable keeps as much of the order as possible, but slower
+ sort.Stable(&byAlignAndSize{fields, alignofs, sizeofs})
+ } else {
+ sort.Sort(&byAlignAndSize{fields, alignofs, sizeofs})
+ }
+ return sizes.Sizeof(types.NewStruct(fields, nil)), fields
+}
+
+type byAlignAndSize struct {
+ fields []*types.Var
+ alignofs []int64
+ sizeofs []int64
+}
+
+func (s *byAlignAndSize) Len() int { return len(s.fields) }
+func (s *byAlignAndSize) Swap(i, j int) {
+ s.fields[i], s.fields[j] = s.fields[j], s.fields[i]
+ s.alignofs[i], s.alignofs[j] = s.alignofs[j], s.alignofs[i]
+ s.sizeofs[i], s.sizeofs[j] = s.sizeofs[j], s.sizeofs[i]
+}
+
+func (s *byAlignAndSize) Less(i, j int) bool {
+ // Place zero sized objects before non-zero sized objects.
+ if s.sizeofs[i] == 0 && s.sizeofs[j] != 0 {
+ return true
+ }
+ if s.sizeofs[j] == 0 && s.sizeofs[i] != 0 {
+ return false
+ }
+
+ // Next, place more tightly aligned objects before less tightly aligned objects.
+ if s.alignofs[i] != s.alignofs[j] {
+ return s.alignofs[i] > s.alignofs[j]
+ }
+
+ // Lastly, order by size.
+ if s.sizeofs[i] != s.sizeofs[j] {
+ return s.sizeofs[i] > s.sizeofs[j]
+ }
+
+ return false
+}
+
+// Code below based on go/types.StdSizes.
+
+type gcSizes struct {
+ WordSize int64
+ MaxAlign int64
+}
+
+func (s *gcSizes) Alignof(T types.Type) int64 {
+ // NOTE: On amd64, complex64 is 8 byte aligned,
+ // even though float32 is only 4 byte aligned.
+
+ // For arrays and structs, alignment is defined in terms
+ // of alignment of the elements and fields, respectively.
+ switch t := T.Underlying().(type) {
+ case *types.Array:
+ // spec: "For a variable x of array type: unsafe.Alignof(x)
+ // is the same as unsafe.Alignof(x[0]), but at least 1."
+ return s.Alignof(t.Elem())
+ case *types.Struct:
+ // spec: "For a variable x of struct type: unsafe.Alignof(x)
+ // is the largest of the values unsafe.Alignof(x.f) for each
+ // field f of x, but at least 1."
+ max := int64(1)
+ for i, nf := 0, t.NumFields(); i < nf; i++ {
+ if a := s.Alignof(t.Field(i).Type()); a > max {
+ max = a
+ }
+ }
+ return max
+ }
+ a := s.Sizeof(T) // may be 0
+ // spec: "For a variable x of any type: unsafe.Alignof(x) is at least 1."
+ if a < 1 {
+ return 1
+ }
+ if a > s.MaxAlign {
+ return s.MaxAlign
+ }
+ return a
+}
+
+var basicSizes = [...]byte{
+ types.Bool: 1,
+ types.Int8: 1,
+ types.Int16: 2,
+ types.Int32: 4,
+ types.Int64: 8,
+ types.Uint8: 1,
+ types.Uint16: 2,
+ types.Uint32: 4,
+ types.Uint64: 8,
+ types.Float32: 4,
+ types.Float64: 8,
+ types.Complex64: 8,
+ types.Complex128: 16,
+}
+
+func (s *gcSizes) Sizeof(T types.Type) int64 {
+ switch t := T.Underlying().(type) {
+ case *types.Basic:
+ k := t.Kind()
+ if int(k) < len(basicSizes) {
+ if s := basicSizes[k]; s > 0 {
+ return int64(s)
+ }
+ }
+ if k == types.String {
+ return s.WordSize * 2
+ }
+ case *types.Array:
+ n := t.Len()
+ if n == 0 {
+ return 0
+ }
+ a := s.Alignof(t.Elem())
+ z := s.Sizeof(t.Elem())
+ return align(z, a)*(n-1) + z
+ case *types.Slice:
+ return s.WordSize * 3
+ case *types.Struct:
+ nf := t.NumFields()
+ if nf == 0 {
+ return 0
+ }
+
+ var o int64
+ max := int64(1)
+ for i := 0; i < nf; i++ {
+ ft := t.Field(i).Type()
+ a, sz := s.Alignof(ft), s.Sizeof(ft)
+ if a > max {
+ max = a
+ }
+ if i == nf-1 && sz == 0 && o != 0 {
+ sz = 1
+ }
+ o = align(o, a) + sz
+ }
+ return align(o, max)
+ case *types.Interface:
+ return s.WordSize * 2
+ }
+ return s.WordSize // catch-all
+}
+
+// align returns the smallest y >= x such that y % a == 0.
+func align(x, a int64) int64 {
+ y := x + a - 1
+ return y - y%a
+}
diff --git a/vendor/github.com/golangci/misspell/.gitignore b/vendor/github.com/golangci/misspell/.gitignore
new file mode 100644
index 000000000..b1b707e32
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/.gitignore
@@ -0,0 +1,34 @@
+dist/
+bin/
+vendor/
+
+# editor turds
+*~
+*.gz
+*.bz2
+*.csv
+
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
+*.prof
diff --git a/vendor/github.com/golangci/misspell/.travis.yml b/vendor/github.com/golangci/misspell/.travis.yml
new file mode 100644
index 000000000..e63e6c2bd
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/.travis.yml
@@ -0,0 +1,20 @@
+sudo: required
+dist: trusty
+group: edge
+language: go
+go:
+ - "1.10"
+git:
+ depth: 1
+
+script:
+ - ./scripts/travis.sh
+
+# calls goreleaser when a new tag is pushed
+deploy:
+- provider: script
+ skip_cleanup: true
+ script: curl -sL http://git.io/goreleaser | bash
+ on:
+ tags: true
+ condition: $TRAVIS_OS_NAME = linux
diff --git a/vendor/github.com/golangci/misspell/Dockerfile b/vendor/github.com/golangci/misspell/Dockerfile
new file mode 100644
index 000000000..b8ea37b4c
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/Dockerfile
@@ -0,0 +1,37 @@
+FROM golang:1.10.0-alpine
+
+# cache buster
+RUN echo 4
+
+# git is needed for "go get" below
+RUN apk add --no-cache git make
+
+# these are my standard testing / linting tools
+RUN /bin/true \
+ && go get -u github.com/golang/dep/cmd/dep \
+ && go get -u github.com/alecthomas/gometalinter \
+ && gometalinter --install \
+ && rm -rf /go/src /go/pkg
+#
+# * SCOWL word list
+#
+# Downloads
+# http://wordlist.aspell.net/dicts/
+# --> http://app.aspell.net/create
+#
+
+# use en_US large size
+# use regular size for others
+ENV SOURCE_US_BIG http://app.aspell.net/create?max_size=70&spelling=US&max_variant=2&diacritic=both&special=hacker&special=roman-numerals&download=wordlist&encoding=utf-8&format=inline
+
+# should be able tell difference between English variations using this
+ENV SOURCE_US http://app.aspell.net/create?max_size=60&spelling=US&max_variant=1&diacritic=both&download=wordlist&encoding=utf-8&format=inline
+ENV SOURCE_GB_ISE http://app.aspell.net/create?max_size=60&spelling=GBs&max_variant=2&diacritic=both&download=wordlist&encoding=utf-8&format=inline
+ENV SOURCE_GB_IZE http://app.aspell.net/create?max_size=60&spelling=GBz&max_variant=2&diacritic=both&download=wordlist&encoding=utf-8&format=inline
+ENV SOURCE_CA http://app.aspell.net/create?max_size=60&spelling=CA&max_variant=2&diacritic=both&download=wordlist&encoding=utf-8&format=inline
+
+RUN /bin/true \
+ && mkdir /scowl-wl \
+ && wget -O /scowl-wl/words-US-60.txt ${SOURCE_US} \
+ && wget -O /scowl-wl/words-GB-ise-60.txt ${SOURCE_GB_ISE}
+
diff --git a/vendor/github.com/golangci/misspell/Gopkg.lock b/vendor/github.com/golangci/misspell/Gopkg.lock
new file mode 100644
index 000000000..90ed45115
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/Gopkg.lock
@@ -0,0 +1,24 @@
+# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
+
+
+[[projects]]
+ name = "github.com/gobwas/glob"
+ packages = [
+ ".",
+ "compiler",
+ "match",
+ "syntax",
+ "syntax/ast",
+ "syntax/lexer",
+ "util/runes",
+ "util/strings"
+ ]
+ revision = "5ccd90ef52e1e632236f7326478d4faa74f99438"
+ version = "v0.2.3"
+
+[solve-meta]
+ analyzer-name = "dep"
+ analyzer-version = 1
+ inputs-digest = "087ea4c49358ea8258ad9edfe514cd5ce9975c889c258e5ec7b5d2b720aae113"
+ solver-name = "gps-cdcl"
+ solver-version = 1
diff --git a/vendor/github.com/golangci/misspell/Gopkg.toml b/vendor/github.com/golangci/misspell/Gopkg.toml
new file mode 100644
index 000000000..e9b8e6a45
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/Gopkg.toml
@@ -0,0 +1,34 @@
+# Gopkg.toml example
+#
+# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
+# for detailed Gopkg.toml documentation.
+#
+# required = ["github.com/user/thing/cmd/thing"]
+# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
+#
+# [[constraint]]
+# name = "github.com/user/project"
+# version = "1.0.0"
+#
+# [[constraint]]
+# name = "github.com/user/project2"
+# branch = "dev"
+# source = "github.com/myfork/project2"
+#
+# [[override]]
+# name = "github.com/x/y"
+# version = "2.4.0"
+#
+# [prune]
+# non-go = false
+# go-tests = true
+# unused-packages = true
+
+
+[[constraint]]
+ name = "github.com/gobwas/glob"
+ version = "0.2.3"
+
+[prune]
+ go-tests = true
+ unused-packages = true
diff --git a/vendor/github.com/golangci/misspell/LICENSE b/vendor/github.com/golangci/misspell/LICENSE
new file mode 100644
index 000000000..423e1f9e0
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-2017 Nick Galbreath
+
+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.
+
diff --git a/vendor/github.com/golangci/misspell/Makefile b/vendor/github.com/golangci/misspell/Makefile
new file mode 100644
index 000000000..862ab77b0
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/Makefile
@@ -0,0 +1,74 @@
+CONTAINER=nickg/misspell
+
+install: ## install misspell into GOPATH/bin
+ go install ./cmd/misspell
+
+build: hooks ## build and lint misspell
+ ./scripts/build.sh
+
+test: ## run all tests
+ go test .
+
+# real publishing is done only by travis
+publish: ## test goreleaser
+ ./scripts/goreleaser-dryrun.sh
+
+# the grep in line 2 is to remove misspellings in the spelling dictionary
+# that trigger false positives!!
+falsepositives: /scowl-wl
+ cat /scowl-wl/words-US-60.txt | \
+ grep -i -v -E "payed|Tyre|Euclidian|nonoccurence|dependancy|reenforced|accidently|surprize|dependance|idealogy|binominal|causalities|conquerer|withing|casette|analyse|analogue|dialogue|paralyse|catalogue|archaeolog|clarinettist|catalyses|cancell|chisell|ageing|cataloguing" | \
+ misspell -debug -error
+ cat /scowl-wl/words-GB-ise-60.txt | \
+ grep -v -E "payed|nonoccurence|withing" | \
+ misspell -locale=UK -debug -error
+# cat /scowl-wl/words-GB-ize-60.txt | \
+# grep -v -E "withing" | \
+# misspell -debug -error
+# cat /scowl-wl/words-CA-60.txt | \
+# grep -v -E "withing" | \
+# misspell -debug -error
+
+bench: ## run benchmarks
+ go test -bench '.*'
+
+clean: ## clean up time
+ rm -rf dist/ bin/
+ go clean ./...
+ git gc --aggressive
+
+ci: ## run test like travis-ci does, requires docker
+ docker run --rm \
+ -v $(PWD):/go/src/github.com/client9/misspell \
+ -w /go/src/github.com/client9/misspell \
+ ${CONTAINER} \
+ make build falsepositives
+
+docker-build: ## build a docker test image
+ docker build -t ${CONTAINER} .
+
+docker-pull: ## pull latest test image
+ docker pull ${CONTAINER}
+
+docker-console: ## log into the test image
+ docker run --rm -it \
+ -v $(PWD):/go/src/github.com/client9/misspell \
+ -w /go/src/github.com/client9/misspell \
+ ${CONTAINER} sh
+
+.git/hooks/pre-commit: scripts/pre-commit.sh
+ cp -f scripts/pre-commit.sh .git/hooks/pre-commit
+.git/hooks/commit-msg: scripts/commit-msg.sh
+ cp -f scripts/commit-msg.sh .git/hooks/commit-msg
+hooks: .git/hooks/pre-commit .git/hooks/commit-msg ## install git precommit hooks
+
+.PHONY: help ci console docker-build bench
+
+# https://www.client9.com/self-documenting-makefiles/
+help:
+ @awk -F ':|##' '/^[^\t].+?:.*?##/ {\
+ printf "\033[36m%-30s\033[0m %s\n", $$1, $$NF \
+ }' $(MAKEFILE_LIST)
+.DEFAULT_GOAL=help
+.PHONY=help
+
diff --git a/vendor/github.com/golangci/misspell/README.md b/vendor/github.com/golangci/misspell/README.md
new file mode 100644
index 000000000..5b68af04d
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/README.md
@@ -0,0 +1,424 @@
+[![Build Status](https://travis-ci.org/client9/misspell.svg?branch=master)](https://travis-ci.org/client9/misspell) [![Go Report Card](https://goreportcard.com/badge/github.com/client9/misspell)](https://goreportcard.com/report/github.com/client9/misspell) [![GoDoc](https://godoc.org/github.com/client9/misspell?status.svg)](https://godoc.org/github.com/client9/misspell) [![Coverage](http://gocover.io/_badge/github.com/client9/misspell)](http://gocover.io/github.com/client9/misspell) [![license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://raw.githubusercontent.com/client9/misspell/master/LICENSE)
+
+Correct commonly misspelled English words... quickly.
+
+### Install
+
+
+If you just want a binary and to start using `misspell`:
+
+```
+curl -L -o ./install-misspell.sh https://git.io/misspell
+sh ./install-misspell.sh
+```
+
+
+Both will install as `./bin/misspell`. You can adjust the download location using the `-b` flag. File a ticket if you want another platform supported.
+
+
+If you use [Go](https://golang.org/), the best way to run `misspell` is by using [gometalinter](#gometalinter). Otherwise, install `misspell` the old-fashioned way:
+
+```
+go get -u github.com/client9/misspell/cmd/misspell
+```
+
+and misspell will be in your `GOPATH`
+
+
+Also if you like to live dangerously, one could do
+
+```bash
+curl -L https://git.io/misspell | bash
+```
+
+### Usage
+
+
+```bash
+$ misspell all.html your.txt important.md files.go
+your.txt:42:10 found "langauge" a misspelling of "language"
+
+# ^ file, line, column
+```
+
+```
+$ misspell -help
+Usage of misspell:
+ -debug
+ Debug matching, very slow
+ -error
+ Exit with 2 if misspelling found
+ -f string
+ 'csv', 'sqlite3' or custom Golang template for output
+ -i string
+ ignore the following corrections, comma separated
+ -j int
+ Number of workers, 0 = number of CPUs
+ -legal
+ Show legal information and exit
+ -locale string
+ Correct spellings using locale perferances for US or UK. Default is to use a neutral variety of English. Setting locale to US will correct the British spelling of 'colour' to 'color'
+ -o string
+ output file or [stderr|stdout|] (default "stdout")
+ -q Do not emit misspelling output
+ -source string
+ Source mode: auto=guess, go=golang source, text=plain or markdown-like text (default "auto")
+ -w Overwrite file with corrections (default is just to display)
+```
+
+## FAQ
+
+* [Automatic Corrections](#correct)
+* [Converting UK spellings to US](#locale)
+* [Using pipes and stdin](#stdin)
+* [Golang special support](#golang)
+* [gometalinter support](#gometalinter)
+* [CSV Output](#csv)
+* [Using SQLite3](#sqlite)
+* [Changing output format](#output)
+* [Checking a folder recursively](#recursive)
+* [Performance](#performance)
+* [Known Issues](#issues)
+* [Debugging](#debug)
+* [False Negatives and missing words](#missing)
+* [Origin of Word Lists](#words)
+* [Software License](#license)
+* [Problem statement](#problem)
+* [Other spelling correctors](#others)
+* [Other ideas](#otherideas)
+
+<a name="correct"></a>
+### How can I make the corrections automatically?
+
+Just add the `-w` flag!
+
+```
+$ misspell -w all.html your.txt important.md files.go
+your.txt:9:21:corrected "langauge" to "language"
+
+# ^ File is rewritten only if a misspelling is found
+```
+
+<a name="locale"></a>
+### How do I convert British spellings to American (or vice-versa)?
+
+Add the `-locale US` flag!
+
+```bash
+$ misspell -locale US important.txt
+important.txt:10:20 found "colour" a misspelling of "color"
+```
+
+Add the `-locale UK` flag!
+
+```bash
+$ echo "My favorite color is blue" | misspell -locale UK
+stdin:1:3:found "favorite color" a misspelling of "favourite colour"
+```
+
+Help is appreciated as I'm neither British nor an
+expert in the English language.
+
+<a name="recursive"></a>
+### How do you check an entire folder recursively?
+
+Just list a directory you'd like to check
+
+```bash
+misspell .
+misspell aDirectory anotherDirectory aFile
+```
+
+You can also run misspell recursively using the following shell tricks:
+
+```bash
+misspell directory/**/*
+```
+
+or
+
+```bash
+find . -type f | xargs misspell
+```
+
+You can select a type of file as well. The following examples selects all `.txt` files that are *not* in the `vendor` directory:
+
+```bash
+find . -type f -name '*.txt' | grep -v vendor/ | xargs misspell -error
+```
+
+<a name="stdin"></a>
+### Can I use pipes or `stdin` for input?
+
+Yes!
+
+Print messages to `stderr` only:
+
+```bash
+$ echo "zeebra" | misspell
+stdin:1:0:found "zeebra" a misspelling of "zebra"
+```
+
+Print messages to `stderr`, and corrected text to `stdout`:
+
+```bash
+$ echo "zeebra" | misspell -w
+stdin:1:0:corrected "zeebra" to "zebra"
+zebra
+```
+
+Only print the corrected text to `stdout`:
+
+```bash
+$ echo "zeebra" | misspell -w -q
+zebra
+```
+
+<a name="golang"></a>
+### Are there special rules for golang source files?
+
+Yes! If the file ends in `.go`, then misspell will only check spelling in
+comments.
+
+If you want to force a file to be checked as a golang source, use `-source=go`
+on the command line. Conversely, you can check a golang source as if it were
+pure text by using `-source=text`. You might want to do this since many
+variable names have misspellings in them!
+
+### Can I check only-comments in other other programming languages?
+
+I'm told the using `-source=go` works well for ruby, javascript, java, c and
+c++.
+
+It doesn't work well for python and bash.
+
+<a name="gometalinter"></a>
+### Does this work with gometalinter?
+
+[gometalinter](https://github.com/alecthomas/gometalinter) runs
+multiple golang linters. Starting on [2016-06-12](https://github.com/alecthomas/gometalinter/pull/134)
+gometalinter supports `misspell` natively but it is disabled by default.
+
+```bash
+# update your copy of gometalinter
+go get -u github.com/alecthomas/gometalinter
+
+# install updates and misspell
+gometalinter --install --update
+```
+
+To use, just enable `misspell`
+
+```
+gometalinter --enable misspell ./...
+```
+
+Note that gometalinter only checks golang files, and uses the default options
+of `misspell`
+
+You may wish to run this on your plaintext (.txt) and/or markdown files too.
+
+
+<a name="csv"></a>
+### How Can I Get CSV Output?
+
+Using `-f csv`, the output is standard comma-seprated values with headers in the first row.
+
+```
+misspell -f csv *
+file,line,column,typo,corrected
+"README.md",9,22,langauge,language
+"README.md",47,25,langauge,language
+```
+
+<a name="sqlite"></a>
+### How can I export to SQLite3?
+
+Using `-f sqlite`, the output is a [sqlite3](https://www.sqlite.org/index.html) dump-file.
+
+```bash
+$ misspell -f sqlite * > /tmp/misspell.sql
+$ cat /tmp/misspell.sql
+
+PRAGMA foreign_keys=OFF;
+BEGIN TRANSACTION;
+CREATE TABLE misspell(
+ "file" TEXT,
+ "line" INTEGER,i
+ "column" INTEGER,i
+ "typo" TEXT,
+ "corrected" TEXT
+);
+INSERT INTO misspell VALUES("install.txt",202,31,"immediatly","immediately");
+# etc...
+COMMIT;
+```
+
+```bash
+$ sqlite3 -init /tmp/misspell.sql :memory: 'select count(*) from misspell'
+1
+```
+
+With some tricks you can directly pipe output to sqlite3 by using `-init /dev/stdin`:
+
+```
+misspell -f sqlite * | sqlite3 -init /dev/stdin -column -cmd '.width 60 15' ':memory' \
+ 'select substr(file,35),typo,count(*) as count from misspell group by file, typo order by count desc;'
+```
+
+<a name="ignore"></a>
+### How can I ignore rules?
+
+Using the `-i "comma,separated,rules"` flag you can specify corrections to ignore.
+
+For example, if you were to run `misspell -w -error -source=text` against document that contains the string `Guy Finkelshteyn Braswell`, misspell would change the text to `Guy Finkelstheyn Bras well`. You can then
+determine the rules to ignore by reverting the change and running the with the `-debug` flag. You can then see
+that the corrections were `htey -> they` and `aswell -> as well`. To ignore these two rules, you add `-i "htey,aswell"` to
+your command. With debug mode on, you can see it print the corrections, but it will no longer make them.
+
+<a name="output"></a>
+### How can I change the output format?
+
+Using the `-f template` flag you can pass in a
+[golang text template](https://golang.org/pkg/text/template/) to format the output.
+
+One can use `printf "%q" VALUE` to safely quote a value.
+
+The default template is compatible with [gometalinter](https://github.com/alecthomas/gometalinter)
+```
+{{ .Filename }}:{{ .Line }}:{{ .Column }}:corrected {{ printf "%q" .Original }} to "{{ printf "%q" .Corrected }}"
+```
+
+To just print probable misspellings:
+
+```
+-f '{{ .Original }}'
+```
+
+<a name="problem"></a>
+### What problem does this solve?
+
+This corrects commonly misspelled English words in computer source
+code, and other text-based formats (`.txt`, `.md`, etc).
+
+It is designed to run quickly so it can be
+used as a [pre-commit hook](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)
+with minimal burden on the developer.
+
+It does not work with binary formats (e.g. Word, etc).
+
+It is not a complete spell-checking program nor a grammar checker.
+
+<a name="others"></a>
+### What are other misspelling correctors and what's wrong with them?
+
+Some other misspelling correctors:
+
+* https://github.com/vlajos/misspell_fixer
+* https://github.com/lyda/misspell-check
+* https://github.com/lucasdemarchi/codespell
+
+They all work but had problems that prevented me from using them at scale:
+
+* slow, all of the above check one misspelling at a time (i.e. linear) using regexps
+* not MIT/Apache2 licensed (or equivalent)
+* have dependencies that don't work for me (python3, bash, linux sed, etc)
+* don't understand American vs. British English and sometimes makes unwelcome "corrections"
+
+That said, they might be perfect for you and many have more features
+than this project!
+
+<a name="performance"></a>
+### How fast is it?
+
+Misspell is easily 100x to 1000x faster than other spelling correctors. You
+should be able to check and correct 1000 files in under 250ms.
+
+This uses the mighty power of golang's
+[strings.Replacer](https://golang.org/pkg/strings/#Replacer) which is
+a implementation or variation of the
+[Aho–Corasick algorithm](https://en.wikipedia.org/wiki/Aho–Corasick_algorithm).
+This makes multiple substring matches *simultaneously*.
+
+In addition this uses multiple CPU cores to work on multiple files.
+
+<a name="issues"></a>
+### What problems does it have?
+
+Unlike the other projects, this doesn't know what a "word" is. There may be
+more false positives and false negatives due to this. On the other hand, it
+sometimes catches things others don't.
+
+Either way, please file bugs and we'll fix them!
+
+Since it operates in parallel to make corrections, it can be non-obvious to
+determine exactly what word was corrected.
+
+<a name="debug"></a>
+### It's making mistakes. How can I debug?
+
+Run using `-debug` flag on the file you want. It should then print what word
+it is trying to correct. Then [file a
+bug](https://github.com/client9/misspell/issues) describing the problem.
+Thanks!
+
+<a name="missing"></a>
+### Why is it making mistakes or missing items in golang files?
+
+The matching function is *case-sensitive*, so variable names that are multiple
+worlds either in all-upper or all-lower case sometimes can cause false
+positives. For instance a variable named `bodyreader` could trigger a false
+positive since `yrea` is in the middle that could be corrected to `year`.
+Other problems happen if the variable name uses a English contraction that
+should use an apostrophe. The best way of fixing this is to use the
+[Effective Go naming
+conventions](https://golang.org/doc/effective_go.html#mixed-caps) and use
+[camelCase](https://en.wikipedia.org/wiki/CamelCase) for variable names. You
+can check your code using [golint](https://github.com/golang/lint)
+
+<a name="license"></a>
+### What license is this?
+
+The main code is [MIT](https://github.com/client9/misspell/blob/master/LICENSE).
+
+Misspell also makes uses of the Golang standard library and contains a modified version of Golang's [strings.Replacer](https://golang.org/pkg/strings/#Replacer)
+which are covered under a [BSD License](https://github.com/golang/go/blob/master/LICENSE). Type `misspell -legal` for more details or see [legal.go](https://github.com/client9/misspell/blob/master/legal.go)
+
+<a name="words"></a>
+### Where do the word lists come from?
+
+It started with a word list from
+[Wikipedia](https://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines).
+Unfortunately, this list had to be highly edited as many of the words are
+obsolete or based from mistakes on mechanical typewriters (I'm guessing).
+
+Additional words were added based on actually mistakes seen in
+the wild (meaning self-generated).
+
+Variations of UK and US spellings are based on many sources including:
+
+* http://www.tysto.com/uk-us-spelling-list.html (with heavy editing, many are incorrect)
+* http://www.oxforddictionaries.com/us/words/american-and-british-spelling-american (excellent site but incomplete)
+* Diffing US and UK [scowl dictionaries](http://wordlist.aspell.net)
+
+American English is more accepting of spelling variations than is British
+English, so "what is American or not" is subject to opinion. Corrections and help welcome.
+
+<a name="otherideas"></a>
+### What are some other enhancements that could be done?
+
+Here's some ideas for enhancements:
+
+*Capitalization of proper nouns* could be done (e.g. weekday and month names, country names, language names)
+
+*Opinionated US spellings* US English has a number of words with alternate
+spellings. Think [adviser vs.
+advisor](http://grammarist.com/spelling/adviser-advisor/). While "advisor" is not wrong, the opinionated US
+locale would correct "advisor" to "adviser".
+
+*Versioning* Some type of versioning is needed so reporting mistakes and errors is easier.
+
+*Feedback* Mistakes would be sent to some server for agregation and feedback review.
+
+*Contractions and Apostrophes* This would optionally correct "isnt" to
+"isn't", etc.
diff --git a/vendor/github.com/golangci/misspell/RELEASE-HOWTO.md b/vendor/github.com/golangci/misspell/RELEASE-HOWTO.md
new file mode 100644
index 000000000..55b52d962
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/RELEASE-HOWTO.md
@@ -0,0 +1,38 @@
+# Release HOWTO
+
+since I forget.
+
+
+1. Review existing tags and pick new release number
+
+ ```sh
+ git tag
+ ```
+
+2. Tag locally
+
+ ```sh
+ git tag -a v0.1.0 -m "First release"
+ ```
+
+ If things get screwed up, delete the tag with
+
+ ```sh
+ git tag -d v0.1.0
+ ```
+
+3. Test goreleaser
+
+ TODO: how to install goreleaser
+
+ ```sh
+ ./scripts/goreleaser-dryrun.sh
+ ```
+
+4. Push
+
+ ```bash
+ git push origin v0.1.0
+ ```
+
+5. Verify release and edit notes. See https://github.com/client9/misspell/releases
diff --git a/vendor/github.com/golangci/misspell/ascii.go b/vendor/github.com/golangci/misspell/ascii.go
new file mode 100644
index 000000000..1430718d6
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/ascii.go
@@ -0,0 +1,62 @@
+package misspell
+
+// ByteToUpper converts an ascii byte to upper cases
+// Uses a branchless algorithm
+func ByteToUpper(x byte) byte {
+ b := byte(0x80) | x
+ c := b - byte(0x61)
+ d := ^(b - byte(0x7b))
+ e := (c & d) & (^x & 0x7f)
+ return x - (e >> 2)
+}
+
+// ByteToLower converts an ascii byte to lower case
+// uses a branchless algorithm
+func ByteToLower(eax byte) byte {
+ ebx := eax&byte(0x7f) + byte(0x25)
+ ebx = ebx&byte(0x7f) + byte(0x1a)
+ ebx = ((ebx & ^eax) >> 2) & byte(0x20)
+ return eax + ebx
+}
+
+// ByteEqualFold does ascii compare, case insensitive
+func ByteEqualFold(a, b byte) bool {
+ return a == b || ByteToLower(a) == ByteToLower(b)
+}
+
+// StringEqualFold ASCII case-insensitive comparison
+// golang toUpper/toLower for both bytes and strings
+// appears to be Unicode based which is super slow
+// based from https://codereview.appspot.com/5180044/patch/14007/21002
+func StringEqualFold(s1, s2 string) bool {
+ if len(s1) != len(s2) {
+ return false
+ }
+ for i := 0; i < len(s1); i++ {
+ c1 := s1[i]
+ c2 := s2[i]
+ // c1 & c2
+ if c1 != c2 {
+ c1 |= 'a' - 'A'
+ c2 |= 'a' - 'A'
+ if c1 != c2 || c1 < 'a' || c1 > 'z' {
+ return false
+ }
+ }
+ }
+ return true
+}
+
+// StringHasPrefixFold is similar to strings.HasPrefix but comparison
+// is done ignoring ASCII case.
+// /
+func StringHasPrefixFold(s1, s2 string) bool {
+ // prefix is bigger than input --> false
+ if len(s1) < len(s2) {
+ return false
+ }
+ if len(s1) == len(s2) {
+ return StringEqualFold(s1, s2)
+ }
+ return StringEqualFold(s1[:len(s2)], s2)
+}
diff --git a/vendor/github.com/golangci/misspell/case.go b/vendor/github.com/golangci/misspell/case.go
new file mode 100644
index 000000000..2ea3850df
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/case.go
@@ -0,0 +1,59 @@
+package misspell
+
+import (
+ "strings"
+)
+
+// WordCase is an enum of various word casing styles
+type WordCase int
+
+// Various WordCase types.. likely to be not correct
+const (
+ CaseUnknown WordCase = iota
+ CaseLower
+ CaseUpper
+ CaseTitle
+)
+
+// CaseStyle returns what case style a word is in
+func CaseStyle(word string) WordCase {
+ upperCount := 0
+ lowerCount := 0
+
+ // this iterates over RUNES not BYTES
+ for i := 0; i < len(word); i++ {
+ ch := word[i]
+ switch {
+ case ch >= 'a' && ch <= 'z':
+ lowerCount++
+ case ch >= 'A' && ch <= 'Z':
+ upperCount++
+ }
+ }
+
+ switch {
+ case upperCount != 0 && lowerCount == 0:
+ return CaseUpper
+ case upperCount == 0 && lowerCount != 0:
+ return CaseLower
+ case upperCount == 1 && lowerCount > 0 && word[0] >= 'A' && word[0] <= 'Z':
+ return CaseTitle
+ }
+ return CaseUnknown
+}
+
+// CaseVariations returns
+// If AllUpper or First-Letter-Only is upcased: add the all upper case version
+// If AllLower, add the original, the title and upcase forms
+// If Mixed, return the original, and the all upcase form
+//
+func CaseVariations(word string, style WordCase) []string {
+ switch style {
+ case CaseLower:
+ return []string{word, strings.ToUpper(word[0:1]) + word[1:], strings.ToUpper(word)}
+ case CaseUpper:
+ return []string{strings.ToUpper(word)}
+ default:
+ return []string{word, strings.ToUpper(word)}
+ }
+}
diff --git a/vendor/github.com/golangci/misspell/goreleaser.yml b/vendor/github.com/golangci/misspell/goreleaser.yml
new file mode 100644
index 000000000..560cb3810
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/goreleaser.yml
@@ -0,0 +1,38 @@
+# goreleaser.yml
+# https://github.com/goreleaser/goreleaser
+
+project_name: misspell
+
+builds:
+ -
+ main: cmd/misspell/main.go
+ binary: misspell
+ ldflags: -s -w -X main.version={{.Version}}
+ goos:
+ - darwin
+ - linux
+ - windows
+ goarch:
+ - amd64
+ env:
+ - CGO_ENABLED=0
+ ignore:
+ - goos: darwin
+ goarch: 386
+ - goos: windows
+ goarch: 386
+
+archive:
+ name_template: "{{ .Binary }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
+ replacements:
+ amd64: 64bit
+ 386: 32bit
+ darwin: mac
+ files:
+ - none*
+
+checksum:
+ name_template: "{{ .ProjectName }}_{{ .Version }}_checksums.txt"
+
+snapshot:
+ name_template: "SNAPSHOT-{{.Commit}}"
diff --git a/vendor/github.com/golangci/misspell/install-misspell.sh b/vendor/github.com/golangci/misspell/install-misspell.sh
new file mode 100644
index 000000000..e24a84a20
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/install-misspell.sh
@@ -0,0 +1,362 @@
+#!/bin/sh
+set -e
+# Code generated by godownloader. DO NOT EDIT.
+#
+
+usage() {
+ this=$1
+ cat <<EOF
+$this: download go binaries for client9/misspell
+
+Usage: $this [-b] bindir [tag]
+ -b sets bindir or installation directory, Defaults to ./bin
+ [tag] is a tag from
+ https://github.com/client9/misspell/releases
+ If tag is missing, then an attempt to find the latest will be found.
+
+ Consider setting GITHUB_TOKEN to avoid triggering GitHub rate limits.
+ See the following for more details:
+ https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/
+
+ Generated by godownloader
+ https://github.com/goreleaser/godownloader
+
+EOF
+ exit 2
+}
+
+parse_args() {
+ #BINDIR is ./bin unless set be ENV
+ # over-ridden by flag below
+
+ BINDIR=${BINDIR:-./bin}
+ while getopts "b:h?" arg; do
+ case "$arg" in
+ b) BINDIR="$OPTARG" ;;
+ h | \?) usage "$0" ;;
+ esac
+ done
+ shift $((OPTIND - 1))
+ TAG=$1
+}
+# this function wraps all the destructive operations
+# if a curl|bash cuts off the end of the script due to
+# network, either nothing will happen or will syntax error
+# out preventing half-done work
+execute() {
+ TMPDIR=$(mktmpdir)
+ log_debug "downloading tarball ${TARBALL_URL}"
+ http_download "${TMPDIR}/${TARBALL}" "${TARBALL_URL}"
+ log_debug "downloading checksum ${CHECKSUM_URL}"
+ http_download "${TMPDIR}/${CHECKSUM}" "${CHECKSUM_URL}"
+ hash_sha256_verify "${TMPDIR}/${TARBALL}" "${TMPDIR}/${CHECKSUM}"
+
+ (cd "${TMPDIR}" && untar "${TARBALL}")
+ install -d "${BINDIR}"
+ install "${TMPDIR}/${BINARY}" "${BINDIR}/"
+ log_info "installed as ${BINDIR}/${BINARY}"
+}
+is_supported_platform() {
+ platform=$1
+ found=1
+ case "$platform" in
+ darwin/amd64) found=0 ;;
+ linux/amd64) found=0 ;;
+ windows/amd64) found=0 ;;
+ esac
+ case "$platform" in
+ darwin/386) found=1 ;;
+ windows/386) found=1 ;;
+ esac
+ return $found
+}
+check_platform() {
+ if is_supported_platform "$PLATFORM"; then
+ # optional logging goes here
+ true
+ else
+ log_crit "platform $PLATFORM is not supported. Make sure this script is up-to-date and file request at https://github.com/${PREFIX}/issues/new"
+ exit 1
+ fi
+}
+tag_to_version() {
+ if [ -z "${TAG}" ]; then
+ log_info "checking GitHub for latest tag"
+ TAG=$(github_last_release "$OWNER/$REPO")
+ fi
+ # if version starts with 'v', remove it
+ VERSION=${TAG#v}
+}
+adjust_format() {
+ # change format (tar.gz or zip) based on ARCH
+ true
+}
+adjust_os() {
+ # adjust archive name based on OS
+ case ${OS} in
+ 386) OS=32bit ;;
+ amd64) OS=64bit ;;
+ darwin) OS=mac ;;
+ esac
+ true
+}
+adjust_arch() {
+ # adjust archive name based on ARCH
+ case ${ARCH} in
+ 386) ARCH=32bit ;;
+ amd64) ARCH=64bit ;;
+ darwin) ARCH=mac ;;
+ esac
+ true
+}
+
+cat /dev/null <<EOF
+------------------------------------------------------------------------
+https://github.com/client9/shlib - portable posix shell functions
+Public domain - http://unlicense.org
+https://github.com/client9/shlib/blob/master/LICENSE.md
+but credit (and pull requests) appreciated.
+------------------------------------------------------------------------
+EOF
+is_command() {
+ command -v "$1" >/dev/null
+}
+echoerr() {
+ echo "$@" 1>&2
+}
+log_prefix() {
+ echo "$0"
+}
+_logp=6
+log_set_priority() {
+ _logp="$1"
+}
+log_priority() {
+ if test -z "$1"; then
+ echo "$_logp"
+ return
+ fi
+ [ "$1" -ge "$_logp" ]
+}
+log_debug() {
+ log_priority 7 && echoerr "$(log_prefix)" "DEBUG" "$@"
+}
+log_info() {
+ log_priority 6 && echoerr "$(log_prefix)" "INFO" "$@"
+}
+log_err() {
+ log_priority 3 && echoerr "$(log_prefix)" "ERR" "$@"
+}
+log_crit() {
+ log_priority 2 && echoerr "$(log_prefix)" "CRIT" "$@"
+}
+uname_os() {
+ os=$(uname -s | tr '[:upper:]' '[:lower:]')
+ case "$os" in
+ msys_nt) os="windows" ;;
+ esac
+ echo "$os"
+}
+uname_arch() {
+ arch=$(uname -m)
+ case $arch in
+ x86_64) arch="amd64" ;;
+ x86) arch="386" ;;
+ i686) arch="386" ;;
+ i386) arch="386" ;;
+ aarch64) arch="arm64" ;;
+ armv5*) arch="arm5" ;;
+ armv6*) arch="arm6" ;;
+ armv7*) arch="arm7" ;;
+ esac
+ echo ${arch}
+}
+uname_os_check() {
+ os=$(uname_os)
+ case "$os" in
+ darwin) return 0 ;;
+ dragonfly) return 0 ;;
+ freebsd) return 0 ;;
+ linux) return 0 ;;
+ android) return 0 ;;
+ nacl) return 0 ;;
+ netbsd) return 0 ;;
+ openbsd) return 0 ;;
+ plan9) return 0 ;;
+ solaris) return 0 ;;
+ windows) return 0 ;;
+ esac
+ log_crit "uname_os_check '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib"
+ return 1
+}
+uname_arch_check() {
+ arch=$(uname_arch)
+ case "$arch" in
+ 386) return 0 ;;
+ amd64) return 0 ;;
+ arm64) return 0 ;;
+ armv5) return 0 ;;
+ armv6) return 0 ;;
+ armv7) return 0 ;;
+ ppc64) return 0 ;;
+ ppc64le) return 0 ;;
+ mips) return 0 ;;
+ mipsle) return 0 ;;
+ mips64) return 0 ;;
+ mips64le) return 0 ;;
+ s390x) return 0 ;;
+ amd64p32) return 0 ;;
+ esac
+ log_crit "uname_arch_check '$(uname -m)' got converted to '$arch' which is not a GOARCH value. Please file bug report at https://github.com/client9/shlib"
+ return 1
+}
+untar() {
+ tarball=$1
+ case "${tarball}" in
+ *.tar.gz | *.tgz) tar -xzf "${tarball}" ;;
+ *.tar) tar -xf "${tarball}" ;;
+ *.zip) unzip "${tarball}" ;;
+ *)
+ log_err "untar unknown archive format for ${tarball}"
+ return 1
+ ;;
+ esac
+}
+mktmpdir() {
+ test -z "$TMPDIR" && TMPDIR="$(mktemp -d)"
+ mkdir -p "${TMPDIR}"
+ echo "${TMPDIR}"
+}
+http_download() {
+ local_file=$1
+ source_url=$2
+ header=$3
+ headerflag=''
+ destflag=''
+ if is_command curl; then
+ cmd='curl --fail -sSL'
+ destflag='-o'
+ headerflag='-H'
+ elif is_command wget; then
+ cmd='wget -q'
+ destflag='-O'
+ headerflag='--header'
+ else
+ log_crit "http_download unable to find wget or curl"
+ return 1
+ fi
+ if [ -z "$header" ]; then
+ $cmd $destflag "$local_file" "$source_url"
+ else
+ $cmd $headerflag "$header" $destflag "$local_file" "$source_url"
+ fi
+}
+github_api() {
+ local_file=$1
+ source_url=$2
+ header=""
+ case "$source_url" in
+ https://api.github.com*)
+ test -z "$GITHUB_TOKEN" || header="Authorization: token $GITHUB_TOKEN"
+ ;;
+ esac
+ http_download "$local_file" "$source_url" "$header"
+}
+github_last_release() {
+ owner_repo=$1
+ version=$2
+ test -z "$version" && version="latest"
+ giturl="https://github.com/${owner_repo}/releases/${version}"
+ json=$(http_download "-" "$giturl" "Accept:application/json")
+ version=$(echo "$json" | tr -s '\n' ' ' | sed 's/.*"tag_name":"//' | sed 's/".*//')
+ test -z "$version" && return 1
+ echo "$version"
+}
+hash_sha256() {
+ TARGET=${1:-/dev/stdin}
+ if is_command gsha256sum; then
+ hash=$(gsha256sum "$TARGET") || return 1
+ echo "$hash" | cut -d ' ' -f 1
+ elif is_command sha256sum; then
+ hash=$(sha256sum "$TARGET") || return 1
+ echo "$hash" | cut -d ' ' -f 1
+ elif is_command shasum; then
+ hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1
+ echo "$hash" | cut -d ' ' -f 1
+ elif is_command openssl; then
+ hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1
+ echo "$hash" | cut -d ' ' -f a
+ else
+ log_crit "hash_sha256 unable to find command to compute sha-256 hash"
+ return 1
+ fi
+}
+hash_sha256_verify() {
+ TARGET=$1
+ checksums=$2
+ if [ -z "$checksums" ]; then
+ log_err "hash_sha256_verify checksum file not specified in arg2"
+ return 1
+ fi
+ BASENAME=${TARGET##*/}
+ want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1)
+ if [ -z "$want" ]; then
+ log_err "hash_sha256_verify unable to find checksum for '${TARGET}' in '${checksums}'"
+ return 1
+ fi
+ got=$(hash_sha256 "$TARGET")
+ if [ "$want" != "$got" ]; then
+ log_err "hash_sha256_verify checksum for '$TARGET' did not verify ${want} vs $got"
+ return 1
+ fi
+}
+cat /dev/null <<EOF
+------------------------------------------------------------------------
+End of functions from https://github.com/client9/shlib
+------------------------------------------------------------------------
+EOF
+
+OWNER=client9
+REPO="misspell"
+BINARY=misspell
+FORMAT=tar.gz
+OS=$(uname_os)
+ARCH=$(uname_arch)
+PREFIX="$OWNER/$REPO"
+
+# use in logging routines
+log_prefix() {
+ echo "$PREFIX"
+}
+PLATFORM="${OS}/${ARCH}"
+GITHUB_DOWNLOAD=https://github.com/${OWNER}/${REPO}/releases/download
+
+uname_os_check "$OS"
+uname_arch_check "$ARCH"
+
+parse_args "$@"
+
+check_platform
+
+tag_to_version
+
+adjust_format
+
+adjust_os
+
+adjust_arch
+
+log_info "found version: ${VERSION} for ${TAG}/${OS}/${ARCH}"
+
+NAME=${BINARY}_${VERSION}_${OS}_${ARCH}
+TARBALL=${NAME}.${FORMAT}
+TARBALL_URL=${GITHUB_DOWNLOAD}/${TAG}/${TARBALL}
+CHECKSUM=${BINARY}_${VERSION}_checksums.txt
+CHECKSUM_URL=${GITHUB_DOWNLOAD}/${TAG}/${CHECKSUM}
+
+# Adjust binary name if windows
+if [ "$OS" = "windows" ]; then
+ BINARY="${BINARY}.exe"
+fi
+
+execute
diff --git a/vendor/github.com/golangci/misspell/legal.go b/vendor/github.com/golangci/misspell/legal.go
new file mode 100644
index 000000000..20076974b
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/legal.go
@@ -0,0 +1,48 @@
+// Package misspell corrects commonly misspelled English words in source files.
+package misspell
+
+// Legal provides licensing info.
+const Legal = `
+Execept where noted below, the source code for misspell is
+copyright Nick Galbreath and distribution is allowed under a
+MIT license. See the following for details:
+
+* https://github.com/client9/misspell/blob/master/LICENSE
+* https://tldrlegal.com/license/mit-license
+
+Misspell makes uses of the Golang standard library and
+contains a modified version of Golang's strings.Replacer
+which are covered under a BSD License.
+
+* https://golang.org/pkg/strings/#Replacer
+* https://golang.org/src/strings/replace.go
+* https://github.com/golang/go/blob/master/LICENSE
+
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+`
diff --git a/vendor/github.com/golangci/misspell/mime.go b/vendor/github.com/golangci/misspell/mime.go
new file mode 100644
index 000000000..9db4902b3
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/mime.go
@@ -0,0 +1,210 @@
+package misspell
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "net/http"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// The number of possible binary formats is very large
+// items that might be checked into a repo or be an
+// artifact of a build. Additions welcome.
+//
+// Golang's internal table is very small and can't be
+// relied on. Even then things like ".js" have a mime
+// type of "application/javascipt" which isn't very helpful.
+// "[x]" means we have sniff test and suffix test should be eliminated
+var binary = map[string]bool{
+ ".a": true, // [ ] archive
+ ".bin": true, // [ ] binary
+ ".bz2": true, // [ ] compression
+ ".class": true, // [x] Java class file
+ ".dll": true, // [ ] shared library
+ ".exe": true, // [ ] binary
+ ".gif": true, // [ ] image
+ ".gpg": true, // [x] text, but really all base64
+ ".gz": true, // [ ] compression
+ ".ico": true, // [ ] image
+ ".jar": true, // [x] archive
+ ".jpeg": true, // [ ] image
+ ".jpg": true, // [ ] image
+ ".mp3": true, // [ ] audio
+ ".mp4": true, // [ ] video
+ ".mpeg": true, // [ ] video
+ ".o": true, // [ ] object file
+ ".pdf": true, // [x] pdf
+ ".png": true, // [x] image
+ ".pyc": true, // [ ] Python bytecode
+ ".pyo": true, // [ ] Python bytecode
+ ".so": true, // [x] shared library
+ ".swp": true, // [ ] vim swap file
+ ".tar": true, // [ ] archive
+ ".tiff": true, // [ ] image
+ ".woff": true, // [ ] font
+ ".woff2": true, // [ ] font
+ ".xz": true, // [ ] compression
+ ".z": true, // [ ] compression
+ ".zip": true, // [x] archive
+}
+
+// isBinaryFilename returns true if the file is likely to be binary
+//
+// Better heuristics could be done here, in particular a binary
+// file is unlikely to be UTF-8 encoded. However this is cheap
+// and will solve the immediate need of making sure common
+// binary formats are not corrupted by mistake.
+func isBinaryFilename(s string) bool {
+ return binary[strings.ToLower(filepath.Ext(s))]
+}
+
+var scm = map[string]bool{
+ ".bzr": true,
+ ".git": true,
+ ".hg": true,
+ ".svn": true,
+ "CVS": true,
+}
+
+// isSCMPath returns true if the path is likely part of a (private) SCM
+// directory. E.g. ./git/something = true
+func isSCMPath(s string) bool {
+ // hack for .git/COMMIT_EDITMSG and .git/TAG_EDITMSG
+ // normally we don't look at anything in .git
+ // but COMMIT_EDITMSG and TAG_EDITMSG are used as
+ // temp files for git commits. Allowing misspell to inspect
+ // these files allows for commit-msg hooks
+ // https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
+ if strings.Contains(filepath.Base(s), "EDITMSG") {
+ return false
+ }
+ parts := strings.Split(filepath.Clean(s), string(filepath.Separator))
+ for _, dir := range parts {
+ if scm[dir] {
+ return true
+ }
+ }
+ return false
+}
+
+var magicHeaders = [][]byte{
+ // Issue #68
+ // PGP messages and signatures are "text" but really just
+ // blobs of base64-text and should not be misspell-checked
+ []byte("-----BEGIN PGP MESSAGE-----"),
+ []byte("-----BEGIN PGP SIGNATURE-----"),
+
+ // ELF
+ {0x7f, 0x45, 0x4c, 0x46},
+
+ // Postscript
+ {0x25, 0x21, 0x50, 0x53},
+
+ // PDF
+ {0x25, 0x50, 0x44, 0x46},
+
+ // Java class file
+ // https://en.wikipedia.org/wiki/Java_class_file
+ {0xCA, 0xFE, 0xBA, 0xBE},
+
+ // PNG
+ // https://en.wikipedia.org/wiki/Portable_Network_Graphics
+ {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a},
+
+ // ZIP, JAR, ODF, OOXML
+ {0x50, 0x4B, 0x03, 0x04},
+ {0x50, 0x4B, 0x05, 0x06},
+ {0x50, 0x4B, 0x07, 0x08},
+}
+
+func isTextFile(raw []byte) bool {
+ for _, magic := range magicHeaders {
+ if bytes.HasPrefix(raw, magic) {
+ return false
+ }
+ }
+
+ // allow any text/ type with utf-8 encoding
+ // DetectContentType sometimes returns charset=utf-16 for XML stuff
+ // in which case ignore.
+ mime := http.DetectContentType(raw)
+ return strings.HasPrefix(mime, "text/") && strings.HasSuffix(mime, "charset=utf-8")
+}
+
+// ReadTextFile returns the contents of a file, first testing if it is a text file
+// returns ("", nil) if not a text file
+// returns ("", error) if error
+// returns (string, nil) if text
+//
+// unfortunately, in worse case, this does
+// 1 stat
+// 1 open,read,close of 512 bytes
+// 1 more stat,open, read everything, close (via ioutil.ReadAll)
+// This could be kinder to the filesystem.
+//
+// This uses some heuristics of the file's extension (e.g. .zip, .txt) and
+// uses a sniffer to determine if the file is text or not.
+// Using file extensions isn't great, but probably
+// good enough for real-world use.
+// Golang's built in sniffer is problematic for differnet reasons. It's
+// optimized for HTML, and is very limited in detection. It would be good
+// to explicitly add some tests for ELF/DWARF formats to make sure we never
+// corrupt binary files.
+func ReadTextFile(filename string) (string, error) {
+ if isBinaryFilename(filename) {
+ return "", nil
+ }
+
+ if isSCMPath(filename) {
+ return "", nil
+ }
+
+ fstat, err := os.Stat(filename)
+
+ if err != nil {
+ return "", fmt.Errorf("Unable to stat %q: %s", filename, err)
+ }
+
+ // directory: nothing to do.
+ if fstat.IsDir() {
+ return "", nil
+ }
+
+ // avoid reading in multi-gig files
+ // if input is large, read the first 512 bytes to sniff type
+ // if not-text, then exit
+ isText := false
+ if fstat.Size() > 50000 {
+ fin, err := os.Open(filename)
+ if err != nil {
+ return "", fmt.Errorf("Unable to open large file %q: %s", filename, err)
+ }
+ defer fin.Close()
+ buf := make([]byte, 512)
+ _, err = io.ReadFull(fin, buf)
+ if err != nil {
+ return "", fmt.Errorf("Unable to read 512 bytes from %q: %s", filename, err)
+ }
+ if !isTextFile(buf) {
+ return "", nil
+ }
+
+ // set so we don't double check this file
+ isText = true
+ }
+
+ // read in whole file
+ raw, err := ioutil.ReadFile(filename)
+ if err != nil {
+ return "", fmt.Errorf("Unable to read all %q: %s", filename, err)
+ }
+
+ if !isText && !isTextFile(raw) {
+ return "", nil
+ }
+ return string(raw), nil
+}
diff --git a/vendor/github.com/golangci/misspell/notwords.go b/vendor/github.com/golangci/misspell/notwords.go
new file mode 100644
index 000000000..06d0d5a5a
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/notwords.go
@@ -0,0 +1,85 @@
+package misspell
+
+import (
+ "bytes"
+ "regexp"
+ "strings"
+)
+
+var (
+ reEmail = regexp.MustCompile(`[a-zA-Z0-9_.%+-]+@[a-zA-Z0-9-.]+\.[a-zA-Z]{2,6}[^a-zA-Z]`)
+ reHost = regexp.MustCompile(`[a-zA-Z0-9-.]+\.[a-zA-Z]+`)
+ reBackslash = regexp.MustCompile(`\\[a-z]`)
+)
+
+// RemovePath attempts to strip away embedded file system paths, e.g.
+// /foo/bar or /static/myimg.png
+//
+// TODO: windows style
+//
+func RemovePath(s string) string {
+ out := bytes.Buffer{}
+ var idx int
+ for len(s) > 0 {
+ if idx = strings.IndexByte(s, '/'); idx == -1 {
+ out.WriteString(s)
+ break
+ }
+
+ if idx > 0 {
+ idx--
+ }
+
+ var chclass string
+ switch s[idx] {
+ case '/', ' ', '\n', '\t', '\r':
+ chclass = " \n\r\t"
+ case '[':
+ chclass = "]\n"
+ case '(':
+ chclass = ")\n"
+ default:
+ out.WriteString(s[:idx+2])
+ s = s[idx+2:]
+ continue
+ }
+
+ endx := strings.IndexAny(s[idx+1:], chclass)
+ if endx != -1 {
+ out.WriteString(s[:idx+1])
+ out.Write(bytes.Repeat([]byte{' '}, endx))
+ s = s[idx+endx+1:]
+ } else {
+ out.WriteString(s)
+ break
+ }
+ }
+ return out.String()
+}
+
+// replaceWithBlanks returns a string with the same number of spaces as the input
+func replaceWithBlanks(s string) string {
+ return strings.Repeat(" ", len(s))
+}
+
+// RemoveEmail remove email-like strings, e.g. "nickg+junk@xfoobar.com", "nickg@xyz.abc123.biz"
+func RemoveEmail(s string) string {
+ return reEmail.ReplaceAllStringFunc(s, replaceWithBlanks)
+}
+
+// RemoveHost removes host-like strings "foobar.com" "abc123.fo1231.biz"
+func RemoveHost(s string) string {
+ return reHost.ReplaceAllStringFunc(s, replaceWithBlanks)
+}
+
+// RemoveBackslashEscapes removes characters that are preceeded by a backslash
+// commonly found in printf format stringd "\nto"
+func removeBackslashEscapes(s string) string {
+ return reBackslash.ReplaceAllStringFunc(s, replaceWithBlanks)
+}
+
+// RemoveNotWords blanks out all the not words
+func RemoveNotWords(s string) string {
+ // do most selective/specific first
+ return removeBackslashEscapes(RemoveHost(RemoveEmail(RemovePath(StripURL(s)))))
+}
diff --git a/vendor/github.com/golangci/misspell/replace.go b/vendor/github.com/golangci/misspell/replace.go
new file mode 100644
index 000000000..a99bbcc58
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/replace.go
@@ -0,0 +1,246 @@
+package misspell
+
+import (
+ "bufio"
+ "bytes"
+ "io"
+ "regexp"
+ "strings"
+ "text/scanner"
+)
+
+func max(x, y int) int {
+ if x > y {
+ return x
+ }
+ return y
+}
+
+func inArray(haystack []string, needle string) bool {
+ for _, word := range haystack {
+ if needle == word {
+ return true
+ }
+ }
+ return false
+}
+
+var wordRegexp = regexp.MustCompile(`[a-zA-Z0-9']+`)
+
+// Diff is datastructure showing what changed in a single line
+type Diff struct {
+ Filename string
+ FullLine string
+ Line int
+ Column int
+ Original string
+ Corrected string
+}
+
+// Replacer is the main struct for spelling correction
+type Replacer struct {
+ Replacements []string
+ Debug bool
+ engine *StringReplacer
+ corrected map[string]string
+}
+
+// New creates a new default Replacer using the main rule list
+func New() *Replacer {
+ r := Replacer{
+ Replacements: DictMain,
+ }
+ r.Compile()
+ return &r
+}
+
+// RemoveRule deletes existings rules.
+// TODO: make inplace to save memory
+func (r *Replacer) RemoveRule(ignore []string) {
+ newwords := make([]string, 0, len(r.Replacements))
+ for i := 0; i < len(r.Replacements); i += 2 {
+ if inArray(ignore, r.Replacements[i]) {
+ continue
+ }
+ newwords = append(newwords, r.Replacements[i:i+2]...)
+ }
+ r.engine = nil
+ r.Replacements = newwords
+}
+
+// AddRuleList appends new rules.
+// Input is in the same form as Strings.Replacer: [ old1, new1, old2, new2, ....]
+// Note: does not check for duplictes
+func (r *Replacer) AddRuleList(additions []string) {
+ r.engine = nil
+ r.Replacements = append(r.Replacements, additions...)
+}
+
+// Compile compiles the rules. Required before using the Replace functions
+func (r *Replacer) Compile() {
+
+ r.corrected = make(map[string]string, len(r.Replacements)/2)
+ for i := 0; i < len(r.Replacements); i += 2 {
+ r.corrected[r.Replacements[i]] = r.Replacements[i+1]
+ }
+ r.engine = NewStringReplacer(r.Replacements...)
+}
+
+/*
+line1 and line2 are different
+extract words from each line1
+
+replace word -> newword
+if word == new-word
+ continue
+if new-word in list of replacements
+ continue
+new word not original, and not in list of replacements
+ some substring got mixed up. UNdo
+*/
+func (r *Replacer) recheckLine(s string, lineNum int, buf io.Writer, next func(Diff)) {
+ first := 0
+ redacted := RemoveNotWords(s)
+
+ idx := wordRegexp.FindAllStringIndex(redacted, -1)
+ for _, ab := range idx {
+ word := s[ab[0]:ab[1]]
+ newword := r.engine.Replace(word)
+ if newword == word {
+ // no replacement done
+ continue
+ }
+
+ // ignore camelCase words
+ // https://github.com/client9/misspell/issues/113
+ if CaseStyle(word) == CaseUnknown {
+ continue
+ }
+
+ if StringEqualFold(r.corrected[strings.ToLower(word)], newword) {
+ // word got corrected into something we know
+ io.WriteString(buf, s[first:ab[0]])
+ io.WriteString(buf, newword)
+ first = ab[1]
+ next(Diff{
+ FullLine: s,
+ Line: lineNum,
+ Original: word,
+ Corrected: newword,
+ Column: ab[0],
+ })
+ continue
+ }
+ // Word got corrected into something unknown. Ignore it
+ }
+ io.WriteString(buf, s[first:])
+}
+
+// ReplaceGo is a specialized routine for correcting Golang source
+// files. Currently only checks comments, not identifiers for
+// spelling.
+func (r *Replacer) ReplaceGo(input string) (string, []Diff) {
+ var s scanner.Scanner
+ s.Init(strings.NewReader(input))
+ s.Mode = scanner.ScanIdents | scanner.ScanFloats | scanner.ScanChars | scanner.ScanStrings | scanner.ScanRawStrings | scanner.ScanComments
+ lastPos := 0
+ output := ""
+Loop:
+ for {
+ switch s.Scan() {
+ case scanner.Comment:
+ origComment := s.TokenText()
+ newComment := r.engine.Replace(origComment)
+
+ if origComment != newComment {
+ // s.Pos().Offset is the end of the current token
+ // subtract len(origComment) to get the start of the token
+ offset := s.Pos().Offset
+ output = output + input[lastPos:offset-len(origComment)] + newComment
+ lastPos = offset
+ }
+ case scanner.EOF:
+ break Loop
+ }
+ }
+
+ if lastPos == 0 {
+ // no changes, no copies
+ return input, nil
+ }
+ if lastPos < len(input) {
+ output = output + input[lastPos:]
+ }
+ diffs := make([]Diff, 0, 8)
+ buf := bytes.NewBuffer(make([]byte, 0, max(len(input), len(output))+100))
+ // faster that making a bytes.Buffer and bufio.ReadString
+ outlines := strings.SplitAfter(output, "\n")
+ inlines := strings.SplitAfter(input, "\n")
+ for i := 0; i < len(inlines); i++ {
+ if inlines[i] == outlines[i] {
+ buf.WriteString(outlines[i])
+ continue
+ }
+ r.recheckLine(inlines[i], i+1, buf, func(d Diff) {
+ diffs = append(diffs, d)
+ })
+ }
+
+ return buf.String(), diffs
+
+}
+
+// Replace is corrects misspellings in input, returning corrected version
+// along with a list of diffs.
+func (r *Replacer) Replace(input string) (string, []Diff) {
+ output := r.engine.Replace(input)
+ if input == output {
+ return input, nil
+ }
+ diffs := make([]Diff, 0, 8)
+ buf := bytes.NewBuffer(make([]byte, 0, max(len(input), len(output))+100))
+ // faster that making a bytes.Buffer and bufio.ReadString
+ outlines := strings.SplitAfter(output, "\n")
+ inlines := strings.SplitAfter(input, "\n")
+ for i := 0; i < len(inlines); i++ {
+ if inlines[i] == outlines[i] {
+ buf.WriteString(outlines[i])
+ continue
+ }
+ r.recheckLine(inlines[i], i+1, buf, func(d Diff) {
+ diffs = append(diffs, d)
+ })
+ }
+
+ return buf.String(), diffs
+}
+
+// ReplaceReader applies spelling corrections to a reader stream. Diffs are
+// emitted through a callback.
+func (r *Replacer) ReplaceReader(raw io.Reader, w io.Writer, next func(Diff)) error {
+ var (
+ err error
+ line string
+ lineNum int
+ )
+ reader := bufio.NewReader(raw)
+ for err == nil {
+ lineNum++
+ line, err = reader.ReadString('\n')
+
+ // if it's EOF, then line has the last line
+ // don't like the check of err here and
+ // in for loop
+ if err != nil && err != io.EOF {
+ return err
+ }
+ // easily 5x faster than regexp+map
+ if line == r.engine.Replace(line) {
+ io.WriteString(w, line)
+ continue
+ }
+ // but it can be inaccurate, so we need to double check
+ r.recheckLine(line, lineNum, w, next)
+ }
+ return nil
+}
diff --git a/vendor/github.com/golangci/misspell/stringreplacer.go b/vendor/github.com/golangci/misspell/stringreplacer.go
new file mode 100644
index 000000000..3151eceb7
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/stringreplacer.go
@@ -0,0 +1,336 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package misspell
+
+import (
+ "io"
+ // "log"
+ "strings"
+)
+
+// StringReplacer replaces a list of strings with replacements.
+// It is safe for concurrent use by multiple goroutines.
+type StringReplacer struct {
+ r replacer
+}
+
+// replacer is the interface that a replacement algorithm needs to implement.
+type replacer interface {
+ Replace(s string) string
+ WriteString(w io.Writer, s string) (n int, err error)
+}
+
+// NewStringReplacer returns a new Replacer from a list of old, new string pairs.
+// Replacements are performed in order, without overlapping matches.
+func NewStringReplacer(oldnew ...string) *StringReplacer {
+ if len(oldnew)%2 == 1 {
+ panic("strings.NewReplacer: odd argument count")
+ }
+
+ return &StringReplacer{r: makeGenericReplacer(oldnew)}
+}
+
+// Replace returns a copy of s with all replacements performed.
+func (r *StringReplacer) Replace(s string) string {
+ return r.r.Replace(s)
+}
+
+// WriteString writes s to w with all replacements performed.
+func (r *StringReplacer) WriteString(w io.Writer, s string) (n int, err error) {
+ return r.r.WriteString(w, s)
+}
+
+// trieNode is a node in a lookup trie for prioritized key/value pairs. Keys
+// and values may be empty. For example, the trie containing keys "ax", "ay",
+// "bcbc", "x" and "xy" could have eight nodes:
+//
+// n0 -
+// n1 a-
+// n2 .x+
+// n3 .y+
+// n4 b-
+// n5 .cbc+
+// n6 x+
+// n7 .y+
+//
+// n0 is the root node, and its children are n1, n4 and n6; n1's children are
+// n2 and n3; n4's child is n5; n6's child is n7. Nodes n0, n1 and n4 (marked
+// with a trailing "-") are partial keys, and nodes n2, n3, n5, n6 and n7
+// (marked with a trailing "+") are complete keys.
+type trieNode struct {
+ // value is the value of the trie node's key/value pair. It is empty if
+ // this node is not a complete key.
+ value string
+ // priority is the priority (higher is more important) of the trie node's
+ // key/value pair; keys are not necessarily matched shortest- or longest-
+ // first. Priority is positive if this node is a complete key, and zero
+ // otherwise. In the example above, positive/zero priorities are marked
+ // with a trailing "+" or "-".
+ priority int
+
+ // A trie node may have zero, one or more child nodes:
+ // * if the remaining fields are zero, there are no children.
+ // * if prefix and next are non-zero, there is one child in next.
+ // * if table is non-zero, it defines all the children.
+ //
+ // Prefixes are preferred over tables when there is one child, but the
+ // root node always uses a table for lookup efficiency.
+
+ // prefix is the difference in keys between this trie node and the next.
+ // In the example above, node n4 has prefix "cbc" and n4's next node is n5.
+ // Node n5 has no children and so has zero prefix, next and table fields.
+ prefix string
+ next *trieNode
+
+ // table is a lookup table indexed by the next byte in the key, after
+ // remapping that byte through genericReplacer.mapping to create a dense
+ // index. In the example above, the keys only use 'a', 'b', 'c', 'x' and
+ // 'y', which remap to 0, 1, 2, 3 and 4. All other bytes remap to 5, and
+ // genericReplacer.tableSize will be 5. Node n0's table will be
+ // []*trieNode{ 0:n1, 1:n4, 3:n6 }, where the 0, 1 and 3 are the remapped
+ // 'a', 'b' and 'x'.
+ table []*trieNode
+}
+
+func (t *trieNode) add(key, val string, priority int, r *genericReplacer) {
+ if key == "" {
+ if t.priority == 0 {
+ t.value = val
+ t.priority = priority
+ }
+ return
+ }
+
+ if t.prefix != "" {
+ // Need to split the prefix among multiple nodes.
+ var n int // length of the longest common prefix
+ for ; n < len(t.prefix) && n < len(key); n++ {
+ if t.prefix[n] != key[n] {
+ break
+ }
+ }
+ if n == len(t.prefix) {
+ t.next.add(key[n:], val, priority, r)
+ } else if n == 0 {
+ // First byte differs, start a new lookup table here. Looking up
+ // what is currently t.prefix[0] will lead to prefixNode, and
+ // looking up key[0] will lead to keyNode.
+ var prefixNode *trieNode
+ if len(t.prefix) == 1 {
+ prefixNode = t.next
+ } else {
+ prefixNode = &trieNode{
+ prefix: t.prefix[1:],
+ next: t.next,
+ }
+ }
+ keyNode := new(trieNode)
+ t.table = make([]*trieNode, r.tableSize)
+ t.table[r.mapping[t.prefix[0]]] = prefixNode
+ t.table[r.mapping[key[0]]] = keyNode
+ t.prefix = ""
+ t.next = nil
+ keyNode.add(key[1:], val, priority, r)
+ } else {
+ // Insert new node after the common section of the prefix.
+ next := &trieNode{
+ prefix: t.prefix[n:],
+ next: t.next,
+ }
+ t.prefix = t.prefix[:n]
+ t.next = next
+ next.add(key[n:], val, priority, r)
+ }
+ } else if t.table != nil {
+ // Insert into existing table.
+ m := r.mapping[key[0]]
+ if t.table[m] == nil {
+ t.table[m] = new(trieNode)
+ }
+ t.table[m].add(key[1:], val, priority, r)
+ } else {
+ t.prefix = key
+ t.next = new(trieNode)
+ t.next.add("", val, priority, r)
+ }
+}
+
+func (r *genericReplacer) lookup(s string, ignoreRoot bool) (val string, keylen int, found bool) {
+ // Iterate down the trie to the end, and grab the value and keylen with
+ // the highest priority.
+ bestPriority := 0
+ node := &r.root
+ n := 0
+ for node != nil {
+ if node.priority > bestPriority && !(ignoreRoot && node == &r.root) {
+ bestPriority = node.priority
+ val = node.value
+ keylen = n
+ found = true
+ }
+
+ if s == "" {
+ break
+ }
+ if node.table != nil {
+ index := r.mapping[ByteToLower(s[0])]
+ if int(index) == r.tableSize {
+ break
+ }
+ node = node.table[index]
+ s = s[1:]
+ n++
+ } else if node.prefix != "" && StringHasPrefixFold(s, node.prefix) {
+ n += len(node.prefix)
+ s = s[len(node.prefix):]
+ node = node.next
+ } else {
+ break
+ }
+ }
+ return
+}
+
+// genericReplacer is the fully generic algorithm.
+// It's used as a fallback when nothing faster can be used.
+type genericReplacer struct {
+ root trieNode
+ // tableSize is the size of a trie node's lookup table. It is the number
+ // of unique key bytes.
+ tableSize int
+ // mapping maps from key bytes to a dense index for trieNode.table.
+ mapping [256]byte
+}
+
+func makeGenericReplacer(oldnew []string) *genericReplacer {
+ r := new(genericReplacer)
+ // Find each byte used, then assign them each an index.
+ for i := 0; i < len(oldnew); i += 2 {
+ key := strings.ToLower(oldnew[i])
+ for j := 0; j < len(key); j++ {
+ r.mapping[key[j]] = 1
+ }
+ }
+
+ for _, b := range r.mapping {
+ r.tableSize += int(b)
+ }
+
+ var index byte
+ for i, b := range r.mapping {
+ if b == 0 {
+ r.mapping[i] = byte(r.tableSize)
+ } else {
+ r.mapping[i] = index
+ index++
+ }
+ }
+ // Ensure root node uses a lookup table (for performance).
+ r.root.table = make([]*trieNode, r.tableSize)
+
+ for i := 0; i < len(oldnew); i += 2 {
+ r.root.add(strings.ToLower(oldnew[i]), oldnew[i+1], len(oldnew)-i, r)
+ }
+ return r
+}
+
+type appendSliceWriter []byte
+
+// Write writes to the buffer to satisfy io.Writer.
+func (w *appendSliceWriter) Write(p []byte) (int, error) {
+ *w = append(*w, p...)
+ return len(p), nil
+}
+
+// WriteString writes to the buffer without string->[]byte->string allocations.
+func (w *appendSliceWriter) WriteString(s string) (int, error) {
+ *w = append(*w, s...)
+ return len(s), nil
+}
+
+type stringWriterIface interface {
+ WriteString(string) (int, error)
+}
+
+type stringWriter struct {
+ w io.Writer
+}
+
+func (w stringWriter) WriteString(s string) (int, error) {
+ return w.w.Write([]byte(s))
+}
+
+func getStringWriter(w io.Writer) stringWriterIface {
+ sw, ok := w.(stringWriterIface)
+ if !ok {
+ sw = stringWriter{w}
+ }
+ return sw
+}
+
+func (r *genericReplacer) Replace(s string) string {
+ buf := make(appendSliceWriter, 0, len(s))
+ r.WriteString(&buf, s)
+ return string(buf)
+}
+
+func (r *genericReplacer) WriteString(w io.Writer, s string) (n int, err error) {
+ sw := getStringWriter(w)
+ var last, wn int
+ var prevMatchEmpty bool
+ for i := 0; i <= len(s); {
+ // Fast path: s[i] is not a prefix of any pattern.
+ if i != len(s) && r.root.priority == 0 {
+ index := int(r.mapping[ByteToLower(s[i])])
+ if index == r.tableSize || r.root.table[index] == nil {
+ i++
+ continue
+ }
+ }
+
+ // Ignore the empty match iff the previous loop found the empty match.
+ val, keylen, match := r.lookup(s[i:], prevMatchEmpty)
+ prevMatchEmpty = match && keylen == 0
+ if match {
+ orig := s[i : i+keylen]
+ switch CaseStyle(orig) {
+ case CaseUnknown:
+ // pretend we didn't match
+ // i++
+ // continue
+ case CaseUpper:
+ val = strings.ToUpper(val)
+ case CaseLower:
+ val = strings.ToLower(val)
+ case CaseTitle:
+ if len(val) < 2 {
+ val = strings.ToUpper(val)
+ } else {
+ val = strings.ToUpper(val[:1]) + strings.ToLower(val[1:])
+ }
+ }
+ wn, err = sw.WriteString(s[last:i])
+ n += wn
+ if err != nil {
+ return
+ }
+ //log.Printf("%d: Going to correct %q with %q", i, s[i:i+keylen], val)
+ wn, err = sw.WriteString(val)
+ n += wn
+ if err != nil {
+ return
+ }
+ i += keylen
+ last = i
+ continue
+ }
+ i++
+ }
+ if last != len(s) {
+ wn, err = sw.WriteString(s[last:])
+ n += wn
+ }
+ return
+}
diff --git a/vendor/github.com/golangci/misspell/stringreplacer_test.gox b/vendor/github.com/golangci/misspell/stringreplacer_test.gox
new file mode 100644
index 000000000..70da997f6
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/stringreplacer_test.gox
@@ -0,0 +1,421 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package misspell_test
+
+import (
+ "bytes"
+ "fmt"
+ "strings"
+ "testing"
+
+ . "github.com/client9/misspell"
+)
+
+var htmlEscaper = NewStringReplacer(
+ "&", "&amp;",
+ "<", "&lt;",
+ ">", "&gt;",
+ `"`, "&quot;",
+ "'", "&apos;",
+)
+
+var htmlUnescaper = NewStringReplacer(
+ "&amp;", "&",
+ "&lt;", "<",
+ "&gt;", ">",
+ "&quot;", `"`,
+ "&apos;", "'",
+)
+
+// The http package's old HTML escaping function.
+func oldHTMLEscape(s string) string {
+ s = strings.Replace(s, "&", "&amp;", -1)
+ s = strings.Replace(s, "<", "&lt;", -1)
+ s = strings.Replace(s, ">", "&gt;", -1)
+ s = strings.Replace(s, `"`, "&quot;", -1)
+ s = strings.Replace(s, "'", "&apos;", -1)
+ return s
+}
+
+var capitalLetters = NewStringReplacer("a", "A", "b", "B")
+
+// TestReplacer tests the replacer implementations.
+func TestReplacer(t *testing.T) {
+ type testCase struct {
+ r *StringReplacer
+ in, out string
+ }
+ var testCases []testCase
+
+ // str converts 0xff to "\xff". This isn't just string(b) since that converts to UTF-8.
+ str := func(b byte) string {
+ return string([]byte{b})
+ }
+ var s []string
+
+ // inc maps "\x00"->"\x01", ..., "a"->"b", "b"->"c", ..., "\xff"->"\x00".
+ for i := 0; i < 256; i++ {
+ s = append(s, str(byte(i)), str(byte(i+1)))
+ }
+ inc := NewStringReplacer(s...)
+
+ // Test cases with 1-byte old strings, 1-byte new strings.
+ testCases = append(testCases,
+ testCase{capitalLetters, "brad", "BrAd"},
+ testCase{capitalLetters, strings.Repeat("a", (32<<10)+123), strings.Repeat("A", (32<<10)+123)},
+ testCase{capitalLetters, "", ""},
+
+ testCase{inc, "brad", "csbe"},
+ testCase{inc, "\x00\xff", "\x01\x00"},
+ testCase{inc, "", ""},
+
+ testCase{NewStringReplacer("a", "1", "a", "2"), "brad", "br1d"},
+ )
+
+ // repeat maps "a"->"a", "b"->"bb", "c"->"ccc", ...
+ s = nil
+ for i := 0; i < 256; i++ {
+ n := i + 1 - 'a'
+ if n < 1 {
+ n = 1
+ }
+ s = append(s, str(byte(i)), strings.Repeat(str(byte(i)), n))
+ }
+ repeat := NewStringReplacer(s...)
+
+ // Test cases with 1-byte old strings, variable length new strings.
+ testCases = append(testCases,
+ testCase{htmlEscaper, "No changes", "No changes"},
+ testCase{htmlEscaper, "I <3 escaping & stuff", "I &lt;3 escaping &amp; stuff"},
+ testCase{htmlEscaper, "&&&", "&amp;&amp;&amp;"},
+ testCase{htmlEscaper, "", ""},
+
+ testCase{repeat, "brad", "bbrrrrrrrrrrrrrrrrrradddd"},
+ testCase{repeat, "abba", "abbbba"},
+ testCase{repeat, "", ""},
+
+ testCase{NewStringReplacer("a", "11", "a", "22"), "brad", "br11d"},
+ )
+
+ // The remaining test cases have variable length old strings.
+
+ testCases = append(testCases,
+ testCase{htmlUnescaper, "&amp;amp;", "&amp;"},
+ testCase{htmlUnescaper, "&lt;b&gt;HTML&apos;s neat&lt;/b&gt;", "<b>HTML's neat</b>"},
+ testCase{htmlUnescaper, "", ""},
+
+ testCase{NewStringReplacer("a", "1", "a", "2", "xxx", "xxx"), "brad", "br1d"},
+
+ testCase{NewStringReplacer("a", "1", "aa", "2", "aaa", "3"), "aaaa", "1111"},
+
+ testCase{NewStringReplacer("aaa", "3", "aa", "2", "a", "1"), "aaaa", "31"},
+ )
+
+ // gen1 has multiple old strings of variable length. There is no
+ // overall non-empty common prefix, but some pairwise common prefixes.
+ gen1 := NewStringReplacer(
+ "aaa", "3[aaa]",
+ "aa", "2[aa]",
+ "a", "1[a]",
+ "i", "i",
+ "longerst", "most long",
+ "longer", "medium",
+ "long", "short",
+ "xx", "xx",
+ "x", "X",
+ "X", "Y",
+ "Y", "Z",
+ )
+ testCases = append(testCases,
+ testCase{gen1, "fooaaabar", "foo3[aaa]b1[a]r"},
+ testCase{gen1, "long, longerst, longer", "short, most long, medium"},
+ testCase{gen1, "xxxxx", "xxxxX"},
+ testCase{gen1, "XiX", "YiY"},
+ testCase{gen1, "", ""},
+ )
+
+ // gen2 has multiple old strings with no pairwise common prefix.
+ gen2 := NewStringReplacer(
+ "roses", "red",
+ "violets", "blue",
+ "sugar", "sweet",
+ )
+ testCases = append(testCases,
+ testCase{gen2, "roses are red, violets are blue...", "red are red, blue are blue..."},
+ testCase{gen2, "", ""},
+ )
+
+ // gen3 has multiple old strings with an overall common prefix.
+ gen3 := NewStringReplacer(
+ "abracadabra", "poof",
+ "abracadabrakazam", "splat",
+ "abraham", "lincoln",
+ "abrasion", "scrape",
+ "abraham", "isaac",
+ )
+ testCases = append(testCases,
+ testCase{gen3, "abracadabrakazam abraham", "poofkazam lincoln"},
+ testCase{gen3, "abrasion abracad", "scrape abracad"},
+ testCase{gen3, "abba abram abrasive", "abba abram abrasive"},
+ testCase{gen3, "", ""},
+ )
+
+ // foo{1,2,3,4} have multiple old strings with an overall common prefix
+ // and 1- or 2- byte extensions from the common prefix.
+ foo1 := NewStringReplacer(
+ "foo1", "A",
+ "foo2", "B",
+ "foo3", "C",
+ )
+ foo2 := NewStringReplacer(
+ "foo1", "A",
+ "foo2", "B",
+ "foo31", "C",
+ "foo32", "D",
+ )
+ foo3 := NewStringReplacer(
+ "foo11", "A",
+ "foo12", "B",
+ "foo31", "C",
+ "foo32", "D",
+ )
+ foo4 := NewStringReplacer(
+ "foo12", "B",
+ "foo32", "D",
+ )
+ testCases = append(testCases,
+ testCase{foo1, "fofoofoo12foo32oo", "fofooA2C2oo"},
+ testCase{foo1, "", ""},
+
+ testCase{foo2, "fofoofoo12foo32oo", "fofooA2Doo"},
+ testCase{foo2, "", ""},
+
+ testCase{foo3, "fofoofoo12foo32oo", "fofooBDoo"},
+ testCase{foo3, "", ""},
+
+ testCase{foo4, "fofoofoo12foo32oo", "fofooBDoo"},
+ testCase{foo4, "", ""},
+ )
+
+ // genAll maps "\x00\x01\x02...\xfe\xff" to "[all]", amongst other things.
+ allBytes := make([]byte, 256)
+ for i := range allBytes {
+ allBytes[i] = byte(i)
+ }
+ allString := string(allBytes)
+ genAll := NewStringReplacer(
+ allString, "[all]",
+ "\xff", "[ff]",
+ "\x00", "[00]",
+ )
+ testCases = append(testCases,
+ testCase{genAll, allString, "[all]"},
+ testCase{genAll, "a\xff" + allString + "\x00", "a[ff][all][00]"},
+ testCase{genAll, "", ""},
+ )
+
+ // Test cases with empty old strings.
+
+ blankToX1 := NewStringReplacer("", "X")
+ blankToX2 := NewStringReplacer("", "X", "", "")
+ blankHighPriority := NewStringReplacer("", "X", "o", "O")
+ blankLowPriority := NewStringReplacer("o", "O", "", "X")
+ blankNoOp1 := NewStringReplacer("", "")
+ blankNoOp2 := NewStringReplacer("", "", "", "A")
+ blankFoo := NewStringReplacer("", "X", "foobar", "R", "foobaz", "Z")
+ testCases = append(testCases,
+ testCase{blankToX1, "foo", "XfXoXoX"},
+ testCase{blankToX1, "", "X"},
+
+ testCase{blankToX2, "foo", "XfXoXoX"},
+ testCase{blankToX2, "", "X"},
+
+ testCase{blankHighPriority, "oo", "XOXOX"},
+ testCase{blankHighPriority, "ii", "XiXiX"},
+ testCase{blankHighPriority, "oiio", "XOXiXiXOX"},
+ testCase{blankHighPriority, "iooi", "XiXOXOXiX"},
+ testCase{blankHighPriority, "", "X"},
+
+ testCase{blankLowPriority, "oo", "OOX"},
+ testCase{blankLowPriority, "ii", "XiXiX"},
+ testCase{blankLowPriority, "oiio", "OXiXiOX"},
+ testCase{blankLowPriority, "iooi", "XiOOXiX"},
+ testCase{blankLowPriority, "", "X"},
+
+ testCase{blankNoOp1, "foo", "foo"},
+ testCase{blankNoOp1, "", ""},
+
+ testCase{blankNoOp2, "foo", "foo"},
+ testCase{blankNoOp2, "", ""},
+
+ testCase{blankFoo, "foobarfoobaz", "XRXZX"},
+ testCase{blankFoo, "foobar-foobaz", "XRX-XZX"},
+ testCase{blankFoo, "", "X"},
+ )
+
+ // single string replacer
+
+ abcMatcher := NewStringReplacer("abc", "[match]")
+
+ testCases = append(testCases,
+ testCase{abcMatcher, "", ""},
+ testCase{abcMatcher, "ab", "ab"},
+ testCase{abcMatcher, "abc", "[match]"},
+ testCase{abcMatcher, "abcd", "[match]d"},
+ testCase{abcMatcher, "cabcabcdabca", "c[match][match]d[match]a"},
+ )
+
+ // Issue 6659 cases (more single string replacer)
+
+ noHello := NewStringReplacer("Hello", "")
+ testCases = append(testCases,
+ testCase{noHello, "Hello", ""},
+ testCase{noHello, "Hellox", "x"},
+ testCase{noHello, "xHello", "x"},
+ testCase{noHello, "xHellox", "xx"},
+ )
+
+ // No-arg test cases.
+
+ nop := NewStringReplacer()
+ testCases = append(testCases,
+ testCase{nop, "abc", "abc"},
+ testCase{nop, "", ""},
+ )
+
+ // Run the test cases.
+
+ for i, tc := range testCases {
+ if s := tc.r.Replace(tc.in); s != tc.out {
+ t.Errorf("%d. strings.Replace(%q) = %q, want %q", i, tc.in, s, tc.out)
+ }
+ var buf bytes.Buffer
+ n, err := tc.r.WriteString(&buf, tc.in)
+ if err != nil {
+ t.Errorf("%d. WriteString: %v", i, err)
+ continue
+ }
+ got := buf.String()
+ if got != tc.out {
+ t.Errorf("%d. WriteString(%q) wrote %q, want %q", i, tc.in, got, tc.out)
+ continue
+ }
+ if n != len(tc.out) {
+ t.Errorf("%d. WriteString(%q) wrote correct string but reported %d bytes; want %d (%q)",
+ i, tc.in, n, len(tc.out), tc.out)
+ }
+ }
+}
+
+type errWriter struct{}
+
+func (errWriter) Write(p []byte) (n int, err error) {
+ return 0, fmt.Errorf("unwritable")
+}
+
+func BenchmarkGenericNoMatch(b *testing.B) {
+ str := strings.Repeat("A", 100) + strings.Repeat("B", 100)
+ generic := NewStringReplacer("a", "A", "b", "B", "12", "123") // varying lengths forces generic
+ for i := 0; i < b.N; i++ {
+ generic.Replace(str)
+ }
+}
+
+func BenchmarkGenericMatch1(b *testing.B) {
+ str := strings.Repeat("a", 100) + strings.Repeat("b", 100)
+ generic := NewStringReplacer("a", "A", "b", "B", "12", "123")
+ for i := 0; i < b.N; i++ {
+ generic.Replace(str)
+ }
+}
+
+func BenchmarkGenericMatch2(b *testing.B) {
+ str := strings.Repeat("It&apos;s &lt;b&gt;HTML&lt;/b&gt;!", 100)
+ for i := 0; i < b.N; i++ {
+ htmlUnescaper.Replace(str)
+ }
+}
+
+func benchmarkSingleString(b *testing.B, pattern, text string) {
+ r := NewStringReplacer(pattern, "[match]")
+ b.SetBytes(int64(len(text)))
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ r.Replace(text)
+ }
+}
+
+func BenchmarkSingleMaxSkipping(b *testing.B) {
+ benchmarkSingleString(b, strings.Repeat("b", 25), strings.Repeat("a", 10000))
+}
+
+func BenchmarkSingleLongSuffixFail(b *testing.B) {
+ benchmarkSingleString(b, "b"+strings.Repeat("a", 500), strings.Repeat("a", 1002))
+}
+
+func BenchmarkSingleMatch(b *testing.B) {
+ benchmarkSingleString(b, "abcdef", strings.Repeat("abcdefghijklmno", 1000))
+}
+
+func BenchmarkByteByteNoMatch(b *testing.B) {
+ str := strings.Repeat("A", 100) + strings.Repeat("B", 100)
+ for i := 0; i < b.N; i++ {
+ capitalLetters.Replace(str)
+ }
+}
+
+func BenchmarkByteByteMatch(b *testing.B) {
+ str := strings.Repeat("a", 100) + strings.Repeat("b", 100)
+ for i := 0; i < b.N; i++ {
+ capitalLetters.Replace(str)
+ }
+}
+
+func BenchmarkByteStringMatch(b *testing.B) {
+ str := "<" + strings.Repeat("a", 99) + strings.Repeat("b", 99) + ">"
+ for i := 0; i < b.N; i++ {
+ htmlEscaper.Replace(str)
+ }
+}
+
+func BenchmarkHTMLEscapeNew(b *testing.B) {
+ str := "I <3 to escape HTML & other text too."
+ for i := 0; i < b.N; i++ {
+ htmlEscaper.Replace(str)
+ }
+}
+
+func BenchmarkHTMLEscapeOld(b *testing.B) {
+ str := "I <3 to escape HTML & other text too."
+ for i := 0; i < b.N; i++ {
+ oldHTMLEscape(str)
+ }
+}
+
+func BenchmarkByteStringReplacerWriteString(b *testing.B) {
+ str := strings.Repeat("I <3 to escape HTML & other text too.", 100)
+ buf := new(bytes.Buffer)
+ for i := 0; i < b.N; i++ {
+ htmlEscaper.WriteString(buf, str)
+ buf.Reset()
+ }
+}
+
+func BenchmarkByteReplacerWriteString(b *testing.B) {
+ str := strings.Repeat("abcdefghijklmnopqrstuvwxyz", 100)
+ buf := new(bytes.Buffer)
+ for i := 0; i < b.N; i++ {
+ capitalLetters.WriteString(buf, str)
+ buf.Reset()
+ }
+}
+
+// BenchmarkByteByteReplaces compares byteByteImpl against multiple Replaces.
+func BenchmarkByteByteReplaces(b *testing.B) {
+ str := strings.Repeat("a", 100) + strings.Repeat("b", 100)
+ for i := 0; i < b.N; i++ {
+ strings.Replace(strings.Replace(str, "a", "A", -1), "b", "B", -1)
+ }
+}
diff --git a/vendor/github.com/golangci/misspell/url.go b/vendor/github.com/golangci/misspell/url.go
new file mode 100644
index 000000000..1a259f5f9
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/url.go
@@ -0,0 +1,17 @@
+package misspell
+
+import (
+ "regexp"
+)
+
+// Regexp for URL https://mathiasbynens.be/demo/url-regex
+//
+// original @imme_emosol (54 chars) has trouble with dashes in hostname
+// @(https?|ftp)://(-\.)?([^\s/?\.#-]+\.?)+(/[^\s]*)?$@iS
+var reURL = regexp.MustCompile(`(?i)(https?|ftp)://(-\.)?([^\s/?\.#]+\.?)+(/[^\s]*)?`)
+
+// StripURL attemps to replace URLs with blank spaces, e.g.
+// "xxx http://foo.com/ yyy -> "xxx yyyy"
+func StripURL(s string) string {
+ return reURL.ReplaceAllStringFunc(s, replaceWithBlanks)
+}
diff --git a/vendor/github.com/golangci/misspell/words.go b/vendor/github.com/golangci/misspell/words.go
new file mode 100644
index 000000000..1603d87e6
--- /dev/null
+++ b/vendor/github.com/golangci/misspell/words.go
@@ -0,0 +1,31194 @@
+package misspell
+
+// Code generated automatically. DO NOT EDIT.
+
+// DictMain is the main rule set, not including locale-specific spellings
+var DictMain = []string{
+ "differentiatiations", "differentiations",
+ "disproportionaltely", "disproportionately",
+ "oversimplificiation", "oversimplification",
+ "transcendentational", "transcendental",
+ "anthromorphization", "anthropomorphization",
+ "disporportionately", "disproportionately",
+ "dispraportionately", "disproportionately",
+ "disproportianately", "disproportionately",
+ "disproportionatley", "disproportionately",
+ "disproprotionately", "disproportionately",
+ "fundamentalistisch", "fundamentalists",
+ "fundamentalistiska", "fundamentalists",
+ "fundamentalistiske", "fundamentalists",
+ "fundamentalistiskt", "fundamentalists",
+ "histocompatability", "histocompatibility",
+ "microtransacations", "microtransactions",
+ "microtransacciones", "microtransactions",
+ "microtransactional", "microtransactions",
+ "microtransactioned", "microtransactions",
+ "misunderstandingly", "misunderstandings",
+ "oversemplification", "oversimplification",
+ "oversimplifacation", "oversimplification",
+ "oversimplificaiton", "oversimplification",
+ "oversimplificating", "oversimplification",
+ "oversimplyfication", "oversimplification",
+ "cardiovasculaires", "cardiovascular",
+ "certificationkits", "certifications",
+ "counterporductive", "counterproductive",
+ "coutnerproductive", "counterproductive",
+ "disporportionatly", "disproportionately",
+ "disproportiantely", "disproportionately",
+ "disproportionatly", "disproportionately",
+ "disproportionnate", "disproportionate",
+ "disrepresentation", "misrepresentation",
+ "fundamentalistisk", "fundamentalists",
+ "incompatabilities", "incompatibilities",
+ "inconsequentional", "inconsequential",
+ "indistinguishible", "indistinguishable",
+ "indistingusihable", "indistinguishable",
+ "indistinquishable", "indistinguishable",
+ "indistuingishable", "indistinguishable",
+ "instatutionalized", "institutionalized",
+ "institucionalized", "institutionalized",
+ "institutionilized", "institutionalized",
+ "instutitionalized", "institutionalized",
+ "instututionalized", "institutionalized",
+ "interchangeablely", "interchangeably",
+ "interchangeablity", "interchangeably",
+ "intercontinential", "intercontinental",
+ "micortransactions", "microtransactions",
+ "microstansactions", "microtransactions",
+ "microtramsactions", "microtransactions",
+ "microtranasctions", "microtransactions",
+ "microtransacitons", "microtransactions",
+ "microtransacrions", "microtransactions",
+ "microtransactioms", "microtransactions",
+ "microtransactiosn", "microtransactions",
+ "microtranscations", "microtransactions",
+ "microtrasnactions", "microtransactions",
+ "mircotransactions", "microtransactions",
+ "misinterpretating", "misinterpreting",
+ "misrepresantation", "misrepresentation",
+ "misrepresentaiton", "misrepresentation",
+ "misrepresentating", "misrepresenting",
+ "misunderstantings", "misunderstandings",
+ "mocrotransactions", "microtransactions",
+ "oversimplifaction", "oversimplification",
+ "oversimplificaton", "oversimplification",
+ "oversimplifiction", "oversimplification",
+ "responsibillities", "responsibilities",
+ "unconstitutionnal", "unconstitutional",
+ "accomplishements", "accomplishments",
+ "admininistrative", "administrative",
+ "antidepresssants", "antidepressants",
+ "architechturally", "architecturally",
+ "cardiovasculaire", "cardiovascular",
+ "charactarization", "characterization",
+ "characterazation", "characterization",
+ "characterisitics", "characteristics",
+ "characteristsics", "characteristic",
+ "characterizarion", "characterization",
+ "charecterization", "characterization",
+ "charicterization", "characterization",
+ "circumstantional", "circumstantial",
+ "conversationable", "conversational",
+ "counterprodutive", "counterproductive",
+ "demonstrationens", "demonstrations",
+ "deterministische", "deterministic",
+ "differenciations", "differentiation",
+ "differentiantion", "differentiation",
+ "differentiatiors", "differentiation",
+ "differentitation", "differentiation",
+ "disperportionate", "disproportionate",
+ "disporportionate", "disproportionate",
+ "dispraportionate", "disproportionate",
+ "disproportianate", "disproportionate",
+ "disproportionaly", "disproportionately",
+ "disproprotionate", "disproportionate",
+ "electromagnectic", "electromagnetic",
+ "enviornmentalist", "environmentalist",
+ "environmentality", "environmentally",
+ "extraordinairily", "extraordinarily",
+ "extraordinarilly", "extraordinary",
+ "extraterrestials", "extraterrestrials",
+ "fundamentalismos", "fundamentalists",
+ "fundamentalismus", "fundamentalists",
+ "fundamentalistas", "fundamentalists",
+ "fundamentalisten", "fundamentalists",
+ "fundamentalister", "fundamentalists",
+ "imcomprehensible", "incomprehensible",
+ "immunosupressant", "immunosuppressant",
+ "imperfectionists", "imperfections",
+ "implementaciones", "implementations",
+ "implementationen", "implementations",
+ "implementationer", "implementations",
+ "inappropriatelly", "inappropriately",
+ "incompatablities", "incompatibilities",
+ "incompatiblities", "incompatibilities",
+ "incomprehencible", "incomprehensible",
+ "incomprehendible", "incomprehensible",
+ "incomprehenisble", "incomprehensible",
+ "incomprehensable", "incomprehensible",
+ "incomprehinsible", "incomprehensible",
+ "incomprihensible", "incomprehensible",
+ "inconprehensible", "incomprehensible",
+ "inconsistentcies", "inconsistencies",
+ "inconstitutional", "unconstitutional",
+ "incrompehensible", "incomprehensible",
+ "indistinguisable", "indistinguishable",
+ "institutionlized", "institutionalized",
+ "intellectualiser", "intellectuals",
+ "intellectualisme", "intellectuals",
+ "interchangeabley", "interchangeably",
+ "internationnally", "internationally",
+ "interpretaciones", "interpretations",
+ "interpretationen", "interpretations",
+ "manoeuverability", "maneuverability",
+ "massachusettians", "massachusetts",
+ "microtransacions", "microtransactions",
+ "microtransacting", "microtransactions",
+ "microtransactios", "microtransactions",
+ "microtransactons", "microtransactions",
+ "microtransations", "microtransactions",
+ "microtranscation", "microtransactions",
+ "mircotransaction", "microtransactions",
+ "miscommunciation", "miscommunication",
+ "miscommunicaiton", "miscommunication",
+ "miscomunnication", "miscommunication",
+ "miscummunication", "miscommunication",
+ "misinterpretated", "misinterpreted",
+ "misinterpretions", "misinterpreting",
+ "misinterpretting", "misinterpreting",
+ "misproportionate", "disproportionate",
+ "misrepresenation", "misrepresentation",
+ "misrepresentaion", "misrepresentation",
+ "misrepresentated", "misrepresented",
+ "misrepresentatie", "misrepresentation",
+ "misrepresentativ", "misrepresentation",
+ "misubderstanding", "misunderstandings",
+ "misudnerstanding", "misunderstandings",
+ "misundarstanding", "misunderstandings",
+ "misunderatanding", "misunderstandings",
+ "misunderdtanding", "misunderstandings",
+ "misundersatnding", "misunderstandings",
+ "misundersranding", "misunderstandings",
+ "misunderstadings", "misunderstandings",
+ "misunderstadning", "misunderstandings",
+ "misunderstamding", "misunderstandings",
+ "misunderstandigs", "misunderstandings",
+ "misunderstandimg", "misunderstandings",
+ "misunderstandind", "misunderstandings",
+ "misunderstanging", "misunderstandings",
+ "misunderstanidng", "misunderstandings",
+ "misunderstanings", "misunderstandings",
+ "misunderstansing", "misunderstandings",
+ "misunderstanting", "misunderstandings",
+ "misunderstending", "misunderstandings",
+ "misunderstnading", "misunderstandings",
+ "misunderstsnding", "misunderstandings",
+ "misunderstunding", "misunderstandings",
+ "misundertsanding", "misunderstandings",
+ "misundrestanding", "misunderstandings",
+ "misunterstanding", "misunderstandings",
+ "nationalistische", "nationalistic",
+ "nationalististic", "nationalistic",
+ "neconstitutional", "unconstitutional",
+ "notwhithstanding", "notwithstanding",
+ "objectificiation", "objectification",
+ "organisationnels", "organisations",
+ "perpendiculaires", "perpendicular",
+ "phillosophically", "philosophically",
+ "preinitalization", "preinitialization",
+ "prescriptionists", "prescriptions",
+ "procrastinarting", "procrastinating",
+ "procrastinationg", "procrastinating",
+ "procrastinazione", "procrastination",
+ "professionalisim", "professionalism",
+ "professionalisme", "professionals",
+ "professionallism", "professionalism",
+ "professionnalism", "professionalism",
+ "programattically", "programmatically",
+ "proportionallity", "proportionally",
+ "reaponsibilities", "responsibilities",
+ "reinitalizations", "reinitializations",
+ "representaciones", "representations",
+ "representationen", "representations",
+ "representationer", "representations",
+ "repsonsibilities", "responsibilities",
+ "responcibilities", "responsibilities",
+ "responisbilities", "responsibilities",
+ "responsabilities", "responsibilities",
+ "responsebilities", "responsibilities",
+ "straightforeward", "straightforward",
+ "surrepetitiously", "surreptitiously",
+ "technologicially", "technologically",
+ "unconditionnally", "unconditionally",
+ "unconfortability", "discomfort",
+ "unconstititional", "unconstitutional",
+ "uncontrollablely", "uncontrollably",
+ "underestimateing", "underestimating",
+ "understandablely", "understandably",
+ "unintentionnally", "unintentionally",
+ "unsubstantianted", "unsubstantiated",
+ "unsubstantiative", "unsubstantiated",
+ "acclimitization", "acclimatization",
+ "accomplishemnts", "accomplishments",
+ "accountabillity", "accountability",
+ "acknolwedgement", "acknowledgement",
+ "acknoweldgement", "acknowledgement",
+ "acknowldegement", "acknowledgement",
+ "acknowlegdement", "acknowledgement",
+ "administratieve", "administrative",
+ "administratiors", "administrators",
+ "administrativne", "administrative",
+ "aforementionned", "aforementioned",
+ "anitdepressants", "antidepressants",
+ "antidepressents", "antidepressants",
+ "archetecturally", "architecturally",
+ "associationthis", "associations",
+ "authobiographic", "autobiographic",
+ "awknowledgement", "acknowledgement",
+ "bureaucratische", "bureaucratic",
+ "cardiovascualar", "cardiovascular",
+ "carnagie-mellon", "carnegie-mellon",
+ "carnigie-mellon", "carnegie-mellon",
+ "celebrationists", "celebrations",
+ "charactaristics", "characteristics",
+ "characterisitcs", "characteristics",
+ "characterisitic", "characteristic",
+ "characterizaton", "characterization",
+ "charactersistic", "characteristic",
+ "charactersitics", "characteristics",
+ "charactoristics", "characteristics",
+ "charecteristics", "characteristics",
+ "comfrontational", "confrontational",
+ "commuinications", "communications",
+ "compatabilities", "compatibilities",
+ "complimentarity", "complimentary",
+ "compositionwise", "compositions",
+ "confidenciality", "confidential",
+ "confidentuality", "confidential",
+ "confrentational", "confrontational",
+ "confrontacional", "confrontational",
+ "conglaturations", "congratulations",
+ "congradulations", "congratulations",
+ "congragulations", "congratulations",
+ "congratualtions", "congratulations",
+ "congraturations", "congratulations",
+ "consequentually", "consequently",
+ "constitutionnal", "constitutional",
+ "deinitalization", "deinitialization",
+ "denominationals", "denominations",
+ "destinationhash", "destinations",
+ "deterministisch", "deterministic",
+ "developmentwise", "developments",
+ "differantiation", "differentiation",
+ "differenciation", "differentiation",
+ "differientation", "differentiation",
+ "discriminatoire", "discriminate",
+ "discriminatorie", "discriminate",
+ "disproportiante", "disproportionate",
+ "disproportinate", "disproportionate",
+ "elecrtomagnetic", "electromagnetic",
+ "electormagnetic", "electromagnetic",
+ "electromagentic", "electromagnetic",
+ "electromagnatic", "electromagnetic",
+ "electromangetic", "electromagnetic",
+ "electromegnetic", "electromagnetic",
+ "electronagnetic", "electromagnetic",
+ "enivronmentally", "environmentally",
+ "entrepreneurers", "entrepreneurs",
+ "enviornmentally", "environmentally",
+ "enviromentalist", "environmentalist",
+ "environemntally", "environmentally",
+ "envrionmentally", "environmentally",
+ "evolutionarilly", "evolutionary",
+ "experementation", "experimentation",
+ "experimantation", "experimentation",
+ "experimentacion", "experimentation",
+ "experimentating", "experimentation",
+ "experimenterade", "experimented",
+ "experimintation", "experimentation",
+ "expirementation", "experimentation",
+ "extraodrinarily", "extraordinarily",
+ "extraordinairly", "extraordinarily",
+ "extraordinarely", "extraordinarily",
+ "extraordinaryly", "extraordinarily",
+ "extraterrestial", "extraterrestrial",
+ "extroardinarily", "extraordinarily",
+ "fondamentalists", "fundamentalists",
+ "fundamendalists", "fundamentalists",
+ "fundamentalisme", "fundamentals",
+ "fundamentalismo", "fundamentals",
+ "fundamentalista", "fundamentals",
+ "fundamentalisti", "fundamentals",
+ "fundamnetalists", "fundamentalists",
+ "fundemantalists", "fundamentalists",
+ "fundimentalists", "fundamentalists",
+ "fundumentalists", "fundamentalists",
+ "gongratulations", "congratulations",
+ "grammaticallity", "grammatically",
+ "gundamentalists", "fundamentalists",
+ "idiosynchracies", "idiosyncrasies",
+ "implementaitons", "implementations",
+ "implimentations", "implementations",
+ "inapporpriately", "inappropriately",
+ "inappropraitely", "inappropriately",
+ "inappropriatley", "inappropriately",
+ "incompatability", "incompatibility",
+ "incompetentence", "incompetence",
+ "incomprehensibe", "incomprehensible",
+ "incomprehesible", "incomprehensible",
+ "inconcequential", "inconsequential",
+ "inconcistencies", "inconsistencies",
+ "inconditionally", "unconditionally",
+ "inconsecuential", "inconsequential",
+ "inconsequantial", "inconsequential",
+ "inconsequencial", "inconsequential",
+ "inconsequentual", "inconsequential",
+ "inconsiquential", "inconsequential",
+ "inconsistancies", "inconsistencies",
+ "inconsistencias", "inconsistencies",
+ "inconsistensies", "inconsistencies",
+ "inconsistenties", "inconsistencies",
+ "independentisme", "independents",
+ "independentiste", "independents",
+ "independentness", "independents",
+ "inexperiencable", "inexperience",
+ "inplementations", "implementations",
+ "instantaneoulsy", "instantaneous",
+ "institutionella", "institutional",
+ "institutionnels", "institutions",
+ "instutionalized", "institutionalized",
+ "insubstantiated", "unsubstantiated",
+ "interchangabley", "interchangeably",
+ "interchangebale", "interchangeable",
+ "intercontinetal", "intercontinental",
+ "interpertations", "interpretations",
+ "interpratations", "interpretations",
+ "interpritations", "interpretations",
+ "intersectionals", "intersections",
+ "intrepretations", "interpretations",
+ "investigationes", "investigations",
+ "journalistische", "journalistic",
+ "libertarianisim", "libertarianism",
+ "libertarianisme", "libertarians",
+ "libertarianismo", "libertarians",
+ "libertarianists", "libertarians",
+ "libertariansism", "libertarianism",
+ "manisfestations", "manifestations",
+ "manouverability", "maneuverability",
+ "manufacturerers", "manufacturers",
+ "marshmallowiest", "marshmallows",
+ "marshmallowness", "marshmallows",
+ "microtransacton", "microtransactions",
+ "mininterpreting", "misinterpreting",
+ "miscommuniation", "miscommunication",
+ "miscommunicatie", "miscommunication",
+ "miscommuniction", "miscommunication",
+ "misinterperting", "misinterpreting",
+ "misinterprating", "misinterpreting",
+ "misinterprented", "misinterpret",
+ "misinterprested", "misinterpret",
+ "misinterpretion", "misinterpreting",
+ "misinterpretted", "misinterpreted",
+ "misinterpriting", "misinterpreting",
+ "misintrepreting", "misinterpreting",
+ "misrepresention", "misrepresenting",
+ "misunderstading", "misunderstanding",
+ "misunderstandig", "misunderstandings",
+ "misunderstandng", "misunderstandings",
+ "misunderstaning", "misunderstanding",
+ "multicultralism", "multiculturalism",
+ "multinationella", "multinational",
+ "nationalistisch", "nationalists",
+ "nationalistisen", "nationalists",
+ "nationalistiska", "nationalists",
+ "nationalistiske", "nationalists",
+ "nationalistiskt", "nationalists",
+ "nationalistista", "nationalists",
+ "objectificaiton", "objectification",
+ "objectivication", "objectification",
+ "organisationens", "organisations",
+ "organisationers", "organisations",
+ "overestimateing", "overestimating",
+ "paychologically", "psychologically",
+ "performancetest", "performances",
+ "performancewise", "performances",
+ "perpendiculaire", "perpendicular",
+ "pharamceuticals", "pharmaceutical",
+ "pharmacueticals", "pharmaceutical",
+ "philoshopically", "philosophically",
+ "philosohpically", "philosophically",
+ "philosophycally", "philosophically",
+ "phsycologically", "psychologically",
+ "phychologically", "psychologically",
+ "phylosophically", "philosophically",
+ "physcologically", "psychologically",
+ "precrastination", "procrastination",
+ "prefessionalism", "professionalism",
+ "premonasterians", "premonstratensians",
+ "procastrinating", "procrastinating",
+ "procastrination", "procrastination",
+ "procrascinating", "procrastinating",
+ "procrastenating", "procrastinating",
+ "procrastiantion", "procrastination",
+ "procrastibating", "procrastinating",
+ "procrastibation", "procrastination",
+ "procrastonating", "procrastinating",
+ "procrestinating", "procrastinating",
+ "procrestination", "procrastination",
+ "professionalsim", "professionalism",
+ "prograstination", "procrastination",
+ "progressionists", "progressions",
+ "progressionwise", "progressions",
+ "prokrastination", "procrastination",
+ "proportionallly", "proportionally",
+ "proscratination", "procrastination",
+ "pscyhologically", "psychologically",
+ "pshycologically", "psychologically",
+ "psichologically", "psychologically",
+ "psychedelicious", "psychedelics",
+ "psychedelicness", "psychedelics",
+ "psycholigically", "psychologically",
+ "psychopathische", "psychopathic",
+ "pyschologically", "psychologically",
+ "racionalization", "rationalization",
+ "rationalizaiton", "rationalization",
+ "rationalizating", "rationalization",
+ "reccomendations", "recommendations",
+ "recommandations", "recommendations",
+ "recommondations", "recommendations",
+ "reinitalization", "reinitialization",
+ "repersentations", "representations",
+ "represantations", "representations",
+ "represantatives", "representatives",
+ "representatieve", "representative",
+ "representativas", "representatives",
+ "representetives", "representatives",
+ "representitives", "representatives",
+ "responibilities", "responsibilities",
+ "responsibilites", "responsibilities",
+ "responsibilitys", "responsibilities",
+ "responsibillity", "responsibility",
+ "responsibilties", "responsibilities",
+ "responsiblities", "responsibilities",
+ "ridiculoussness", "ridiculousness",
+ "saskatchewinian", "saskatchewan",
+ "satisfactorally", "satisfactory",
+ "satisfactorilly", "satisfactory",
+ "schizophreniiic", "schizophrenic",
+ "sensationalisim", "sensationalism",
+ "spreadsheeticus", "spreadsheets",
+ "starightforward", "straightforward",
+ "straigthforward", "straightforward",
+ "striaghtforward", "straightforward",
+ "sustainabillity", "sustainability",
+ "technoligically", "technologically",
+ "troubelshooting", "troubleshooting",
+ "troublehsooting", "troubleshooting",
+ "troubleshotting", "troubleshooting",
+ "trustworthyness", "trustworthiness",
+ "ubsubstantiated", "unsubstantiated",
+ "unappropriately", "inappropriately",
+ "uncomfortablely", "uncomfortably",
+ "uncomfortablity", "uncomfortably",
+ "unconditionable", "unconditional",
+ "unconstituional", "unconstitutional",
+ "uncontitutional", "unconstitutional",
+ "uncontrollabley", "uncontrollably",
+ "uncontrollablly", "uncontrollably",
+ "unconventionnal", "unconventional",
+ "underastimating", "underestimating",
+ "underestemating", "underestimating",
+ "understandabley", "understandably",
+ "unintensionally", "unintentionally",
+ "unprofessionnal", "unprofessional",
+ "unresponsivness", "unresponsive",
+ "unsibstantiated", "unsubstantiated",
+ "unsubstanciated", "unsubstantiated",
+ "unsubstansiated", "unsubstantiated",
+ "unsusbtantiated", "unsubstantiated",
+ "untranslateable", "untranslatable",
+ "vulernabilities", "vulnerabilities",
+ "vulnarabilities", "vulnerabilities",
+ "vulnurabilities", "vulnerabilities",
+ "vunlerabilities", "vulnerabilities",
+ "vurnerabilities", "vulnerabilities",
+ "accomplishemnt", "accomplishment",
+ "accomplishents", "accomplishes",
+ "acconplishment", "accomplishment",
+ "acknowledgeing", "acknowledging",
+ "acknowledgemnt", "acknowledgement",
+ "acomplishments", "accomplishments",
+ "administartion", "administration",
+ "administartors", "administrators",
+ "administraters", "administrators",
+ "administratief", "administrative",
+ "administratiei", "administrative",
+ "administratior", "administrator",
+ "administrativo", "administration",
+ "adminsitration", "administration",
+ "adminsitrative", "administrative",
+ "adminsitrators", "administrators",
+ "affectionatley", "affectionate",
+ "aforememtioned", "aforementioned",
+ "aforementioend", "aforementioned",
+ "alternativelly", "alternatively",
+ "amministrative", "administrative",
+ "anitdepressant", "antidepressants",
+ "approproximate", "approximate",
+ "approximatelly", "approximately",
+ "archeaologists", "archeologists",
+ "architechtures", "architectures",
+ "architectureal", "architectural",
+ "architecturial", "architectural",
+ "assassintation", "assassination",
+ "authenitcation", "authentication",
+ "authenticaiton", "authentication",
+ "authobiography", "autobiography",
+ "breakthroughts", "breakthroughs",
+ "bureaucratisch", "bureaucratic",
+ "calssification", "classification",
+ "capatilization", "capitalization",
+ "capitalizacion", "capitalization",
+ "capitalizaiton", "capitalization",
+ "capitalizating", "capitalization",
+ "capitilazation", "capitalization",
+ "capitolization", "capitalization",
+ "captialization", "capitalization",
+ "cardiocascular", "cardiovascular",
+ "cardiovascualr", "cardiovascular",
+ "cardiovasuclar", "cardiovascular",
+ "caridovascular", "cardiovascular",
+ "cessationalism", "sensationalism",
+ "cessationalist", "sensationalist",
+ "charactaristic", "characteristic",
+ "characterisics", "characteristics",
+ "characterisitc", "characteristics",
+ "characteristcs", "characteristics",
+ "characteritics", "characteristic",
+ "charactersitic", "characteristics",
+ "charasteristic", "characteristics",
+ "charecteristic", "characteristic",
+ "cheeseburguers", "cheeseburgers",
+ "cinematagraphy", "cinematography",
+ "cinematagrophy", "cinematography",
+ "cinematograhpy", "cinematography",
+ "cinematogrophy", "cinematography",
+ "cinematogrpahy", "cinematography",
+ "cinemetography", "cinematography",
+ "cinimatography", "cinematography",
+ "circumstansial", "circumstantial",
+ "circumstantual", "circumstantial",
+ "circumstential", "circumstantial",
+ "circunstantial", "circumstantial",
+ "classificaiton", "classification",
+ "coincedentally", "coincidentally",
+ "coinsidentally", "coincidentally",
+ "commemmorating", "commemorating",
+ "communciations", "communications",
+ "compatablities", "compatibilities",
+ "compatibillity", "compatibility",
+ "compatiblities", "compatibilities",
+ "competitioners", "competitions",
+ "comphrehensive", "comprehensive",
+ "computationnal", "computational",
+ "concatentation", "concatenation",
+ "conciderations", "considerations",
+ "condescenscion", "condescension",
+ "condradictions", "contradictions",
+ "configuartions", "configurations",
+ "confugurations", "configurations",
+ "conglaturation", "congratulations",
+ "congratulatons", "congratulations",
+ "conicidentally", "coincidentally",
+ "conifgurations", "configurations",
+ "conscioussness", "consciousness",
+ "consentrations", "concentrations",
+ "consiciousness", "consciousness",
+ "considerablely", "considerably",
+ "considerstions", "considerations",
+ "constititional", "constitutional",
+ "constitucional", "constitutional",
+ "contamporaries", "contemporaries",
+ "contemporaneus", "contemporaneous",
+ "contraceptivos", "contraceptives",
+ "contradicitons", "contradictions",
+ "contradictiong", "contradicting",
+ "contriceptives", "contraceptives",
+ "controceptives", "contraceptives",
+ "controdictions", "contradictions",
+ "conversacional", "conversational",
+ "converstaional", "conversational",
+ "correpsondence", "correspondence",
+ "correspondants", "correspondents",
+ "correspondense", "correspondence",
+ "correspondente", "correspondence",
+ "corrispondants", "correspondents",
+ "corrispondence", "correspondence",
+ "corrospondence", "correspondence",
+ "costumizations", "customization",
+ "councidentally", "coincidentally",
+ "crystalisation", "crystallisation",
+ "curcumstantial", "circumstantial",
+ "demenstrations", "demonstrations",
+ "deminstrations", "demonstrations",
+ "demonstartions", "demonstrations",
+ "demonstrativno", "demonstrations",
+ "demonstrativos", "demonstrations",
+ "demosntrations", "demonstrations",
+ "desintegration", "disintegration",
+ "deterioriating", "deteriorating",
+ "determinisitic", "deterministic",
+ "differentiaton", "differentiation",
+ "disatisfaction", "dissatisfaction",
+ "discrimanatory", "discriminatory",
+ "discriminacion", "discrimination",
+ "discriminitory", "discriminatory",
+ "disillusionned", "disillusioned",
+ "diskrimination", "discrimination",
+ "disproportiate", "disproportionate",
+ "distingiushing", "distinguishing",
+ "distingquished", "distinguished",
+ "distingusihing", "distinguishing",
+ "distinquishing", "distinguishing",
+ "distuingishing", "distinguishing",
+ "dysfunctionnal", "dysfunctional",
+ "eldistribution", "redistribution",
+ "electromagnetc", "electromagnetic",
+ "electromagntic", "electromagnetic",
+ "endoctrination", "indoctrination",
+ "enthusiastisch", "enthusiastic",
+ "entrepreneuers", "entrepreneurs",
+ "entrepreneures", "entrepreneurs",
+ "enviormentally", "environmentally",
+ "enviromentally", "environmentally",
+ "environmentals", "environments",
+ "environmentaly", "environmentally",
+ "experimentaion", "experimentation",
+ "experimentella", "experimental",
+ "extraordinairy", "extraordinary",
+ "extraordinarly", "extraordinary",
+ "extrordinarily", "extraordinarily",
+ "fondamentalist", "fundamentalist",
+ "foreshadowning", "foreshadowing",
+ "functionallity", "functionality",
+ "fundamendalist", "fundamentalist",
+ "fundamentalits", "fundamentalists",
+ "fundamnetalist", "fundamentalist",
+ "fundemantalist", "fundamentalist",
+ "fundimentalist", "fundamentalist",
+ "fundumentalist", "fundamentalist",
+ "generalizacion", "generalization",
+ "generalizating", "generalization",
+ "generelization", "generalization",
+ "geographacilly", "geographically",
+ "geographycally", "geographically",
+ "geogrpahically", "geographically",
+ "geopraphically", "geographically",
+ "goegraphically", "geographically",
+ "grandchilderen", "grandchildren",
+ "gravitationnal", "gravitational",
+ "groubdbreaking", "groundbreaking",
+ "groudnbreaking", "groundbreaking",
+ "hallcuinations", "hallucination",
+ "hallicunations", "hallucinations",
+ "hallucenations", "hallucinations",
+ "halluciantions", "hallucinations",
+ "hallucinaitons", "hallucination",
+ "hallunications", "hallucinations",
+ "hallusinations", "hallucinations",
+ "halluzinations", "hallucinations",
+ "hellucinations", "hallucinations",
+ "heterosexuella", "heterosexual",
+ "hipothetically", "hypothetically",
+ "homosexuallity", "homosexuality",
+ "hullucinations", "hallucinations",
+ "hyopthetically", "hypothetically",
+ "hypathetically", "hypothetically",
+ "hypethetically", "hypothetically",
+ "hypotehtically", "hypothetically",
+ "hypotethically", "hypothetically",
+ "identificacion", "identification",
+ "identificaiton", "identification",
+ "identificativo", "identification",
+ "identifikation", "identification",
+ "imlpementation", "implementations",
+ "impelmentation", "implementations",
+ "impersonationg", "impersonating",
+ "implementacion", "implementation",
+ "implementaiton", "implementation",
+ "implementating", "implementation",
+ "implementatino", "implementations",
+ "implemetnation", "implementations",
+ "implimentation", "implementation",
+ "impossibillity", "impossibility",
+ "inadvertantely", "inadvertently",
+ "inappropriatly", "inappropriately",
+ "inapproprietly", "inappropriately",
+ "incompatablity", "incompatibility",
+ "incompatiblity", "incompatibility",
+ "inconsequental", "inconsequential",
+ "inconsistentcy", "inconsistency",
+ "incontrollably", "uncontrollably",
+ "inconventional", "unconventional",
+ "inconvienenced", "inconvenience",
+ "indestrictible", "indestructible",
+ "indestructuble", "indestructible",
+ "indetification", "identification",
+ "indistructible", "indestructible",
+ "individuallity", "individuality",
+ "indocrtination", "indoctrination",
+ "indoctrication", "indoctrination",
+ "indoktrination", "indoctrination",
+ "industiralized", "industrialized",
+ "industrailized", "industrialized",
+ "industrualized", "industrialized",
+ "industructible", "indestructible",
+ "inexplicablely", "inexplicably",
+ "infrastracture", "infrastructure",
+ "infrastructuur", "infrastructure",
+ "infrastrucutre", "infrastructure",
+ "infrastrukture", "infrastructure",
+ "infrastrutture", "infrastructure",
+ "infrasturcture", "infrastructure",
+ "initalisations", "initialisations",
+ "initalizations", "initializations",
+ "inplementation", "implementation",
+ "inspirationnal", "inspirational",
+ "instinctivelly", "instinctively",
+ "institutionale", "institutionalized",
+ "institutionals", "institutions",
+ "institutionnal", "institutional",
+ "intellectualis", "intellectuals",
+ "intellectualls", "intellectuals",
+ "intellecutally", "intellectually",
+ "intercepticons", "interceptions",
+ "interchangable", "interchangeable",
+ "interchangably", "interchangeably",
+ "interchangeble", "interchangeable",
+ "interchangebly", "interchangeably",
+ "interlectually", "intellectually",
+ "internationaal", "international",
+ "internationaly", "internationally",
+ "internationnal", "international",
+ "interpersonnal", "interpersonal",
+ "interpertation", "interpretation",
+ "interpratation", "interpretation",
+ "interpretacion", "interpretation",
+ "interpretaiton", "interpretations",
+ "interpretating", "interpretation",
+ "interpritation", "interpretation",
+ "interstellaire", "interstellar",
+ "intillectually", "intellectually",
+ "intrepretation", "interpretation",
+ "invesitgations", "investigations",
+ "investiagtions", "investigations",
+ "investigatiors", "investigations",
+ "investigativos", "investigations",
+ "investigstions", "investigations",
+ "irrationallity", "irrationally",
+ "irresponsibile", "irresponsible",
+ "journalistisch", "journalistic",
+ "justificativos", "justifications",
+ "koncentrations", "concentrations",
+ "liberatrianism", "libertarianism",
+ "libertarainism", "libertarianism",
+ "libertariansim", "libertarianism",
+ "libertarinaism", "libertarianism",
+ "libertaryanism", "libertarianism",
+ "libertatianism", "libertarianism",
+ "liberterianism", "libertarianism",
+ "libretarianism", "libertarianism",
+ "manufactureers", "manufactures",
+ "manufactureras", "manufactures",
+ "manufacturered", "manufactured",
+ "manufactureres", "manufacturers",
+ "manufactureros", "manufactures",
+ "massachusettes", "massachusetts",
+ "massachussetts", "massachusetts",
+ "mataphorically", "metaphorically",
+ "mathameticians", "mathematicians",
+ "mathemagically", "mathematically",
+ "mathematitians", "mathematicians",
+ "mathemetically", "mathematically",
+ "mathemeticians", "mathematicians",
+ "mathimatically", "mathematically",
+ "mediterainnean", "mediterranean",
+ "mediterrannean", "mediterranean",
+ "metaphotically", "metaphorically",
+ "metephorically", "metaphorically",
+ "methaporically", "metaphorically",
+ "metiphorically", "metaphorically",
+ "metophorically", "metaphorically",
+ "metropolitaine", "metropolitan",
+ "misconseptions", "misconceptions",
+ "misinterperted", "misinterpreted",
+ "misintrepreted", "misinterpreted",
+ "mulitnationals", "multinational",
+ "mulitplication", "multiplication",
+ "multiplicacion", "multiplication",
+ "multiplicaiton", "multiplication",
+ "multiplicativo", "multiplication",
+ "multiplikation", "multiplication",
+ "mutlinationals", "multinational",
+ "mutliplication", "multiplication",
+ "nationalisitic", "nationalistic",
+ "nationalistics", "nationalists",
+ "nationalisties", "nationalists",
+ "nationalistisk", "nationalists",
+ "neighbourhoood", "neighbourhood",
+ "nieghbourhoods", "neighbourhood",
+ "northereastern", "northeastern",
+ "objectificaton", "objectification",
+ "opthalmologist", "ophthalmologist",
+ "organizacional", "organizational",
+ "organizaitonal", "organizational",
+ "organziational", "organizational",
+ "orginazational", "organizational",
+ "overestemating", "overestimating",
+ "overextimating", "overestimating",
+ "overhwelmingly", "overwhelmingly",
+ "overhwlemingly", "overwhelmingly",
+ "overpolulation", "overpopulation",
+ "overpopluation", "overpopulation",
+ "oversetimating", "overestimating",
+ "overshadowered", "overshadowed",
+ "overwhemlingly", "overwhelmingly",
+ "overwhlemingly", "overwhelmingly",
+ "paliamentarian", "parliamentarian",
+ "parliamentiary", "parliamentary",
+ "performancepcs", "performances",
+ "personalitites", "personalities",
+ "pharamceutical", "pharmaceutical",
+ "pharmaceudical", "pharmaceutical",
+ "pharmacuetical", "pharmaceutical",
+ "pharmaseutical", "pharmaceutical",
+ "pharmeceutical", "pharmaceutical",
+ "philosophicaly", "philosophically",
+ "phramaceutical", "pharmaceutical",
+ "playthroughers", "playthroughs",
+ "porportionally", "proportionally",
+ "practitionners", "practitioners",
+ "predeterminded", "predetermined",
+ "predominantely", "predominantly",
+ "predominantley", "predominantly",
+ "preinitalizing", "preinitializing",
+ "prerequisities", "prerequisite",
+ "procrastinatin", "procrastination",
+ "procrastinaton", "procrastination",
+ "professionials", "professionalism",
+ "professionnals", "professionals",
+ "profitabillity", "profitability",
+ "progressivelly", "progressively",
+ "progressivisme", "progressives",
+ "pronounciation", "pronunciation",
+ "proportianally", "proportionally",
+ "proportionalty", "proportionally",
+ "proportionella", "proportionally",
+ "proprotionally", "proportionally",
+ "protruberances", "protuberances",
+ "pseudononymous", "pseudonymous",
+ "psychologicaly", "psychologically",
+ "qaulifications", "qualification",
+ "qualifiactions", "qualification",
+ "qualificaitons", "qualifications",
+ "quarterbackers", "quarterbacks",
+ "rationalizaton", "rationalization",
+ "reaponsibility", "responsibility",
+ "recommandation", "recommendation",
+ "recommedations", "recommendations",
+ "recommondation", "recommendation",
+ "reconnaissence", "reconnaissance",
+ "reconstruccion", "reconstruction",
+ "reconsturction", "reconstruction",
+ "redistirbution", "redistribution",
+ "redistribucion", "redistribution",
+ "redistributivo", "redistribution",
+ "redistrubition", "redistribution",
+ "refridgeration", "refrigeration",
+ "rehabilitacion", "rehabilitation",
+ "rehabilitaiton", "rehabilitation",
+ "reinforcemnets", "reinforcements",
+ "rekommendation", "recommendation",
+ "rektifications", "certifications",
+ "reniforcements", "reinforcements",
+ "repersentation", "representation",
+ "represantation", "representation",
+ "represantative", "representative",
+ "representacion", "representation",
+ "representaiton", "representations",
+ "representatief", "representative",
+ "representating", "representation",
+ "representativo", "representation",
+ "representetive", "representative",
+ "representitive", "representative",
+ "representstion", "representations",
+ "representstive", "representatives",
+ "represetnation", "representations",
+ "represnetation", "representations",
+ "reprezentative", "representative",
+ "repsonsibility", "responsibility",
+ "resistribution", "redistribution",
+ "responcibility", "responsibility",
+ "responisbility", "responsibility",
+ "responnsibilty", "responsibility",
+ "responsability", "responsibility",
+ "responsibilies", "responsibilities",
+ "responsibities", "responsibilities",
+ "restaraunteurs", "restaurateurs",
+ "retroactivelly", "retroactively",
+ "revolutionairy", "revolutionary",
+ "revolutionnary", "revolutionary",
+ "ridicilousness", "ridiculousness",
+ "ridicoulusness", "ridiculousness",
+ "rienforcements", "reinforcements",
+ "righteoussness", "righteousness",
+ "satisfactoraly", "satisfactory",
+ "satisfactority", "satisfactorily",
+ "sceintifically", "scientifically",
+ "schizophrentic", "schizophrenic",
+ "screenwrighter", "screenwriter",
+ "sensacionalism", "sensationalism",
+ "sensacionalist", "sensationalist",
+ "sensasionalism", "sensationalism",
+ "sensasionalist", "sensationalist",
+ "sensationality", "sensationalist",
+ "sensationalizm", "sensationalism",
+ "sensationalsim", "sensationalism",
+ "sensationilism", "sensationalism",
+ "sensationilist", "sensationalist",
+ "sensationslism", "sensationalism",
+ "sensetionalism", "sensationalism",
+ "sensibilisiert", "sensibilities",
+ "sentationalism", "sensationalism",
+ "sentationalist", "sensationalist",
+ "senzationalism", "sensationalism",
+ "senzationalist", "sensationalist",
+ "sepcifications", "specification",
+ "simaltaneously", "simultaneously",
+ "simeltaneously", "simultaneously",
+ "similtaneously", "simultaneously",
+ "simlutaneously", "simultaneously",
+ "simplificacion", "simplification",
+ "simplificaiton", "simplification",
+ "simplificating", "simplification",
+ "simulatenously", "simultaneously",
+ "simulatneously", "simultaneously",
+ "simultaenously", "simultaneously",
+ "simultainously", "simultaneously",
+ "simultaneoulsy", "simultaneously",
+ "simultaniously", "simultaneously",
+ "simulteanously", "simultaneously",
+ "sistematically", "systematically",
+ "slaugterhouses", "slaughterhouses",
+ "specailization", "specialization",
+ "specialication", "specialization",
+ "specializaiton", "specialization",
+ "specificaitons", "specification",
+ "speciliazation", "specialization",
+ "spectacularely", "spectacularly",
+ "spectacularily", "spectacularly",
+ "spesifications", "specifications",
+ "spezialisation", "specialization",
+ "sportsmansship", "sportsmanship",
+ "spreadsheeters", "spreadsheets",
+ "straightforwad", "straightforward",
+ "subconcsiously", "subconsciously",
+ "subconsicously", "subconsciously",
+ "subsconciously", "subconsciously",
+ "sunconsciously", "subconsciously",
+ "superintendant", "superintendent",
+ "suppliementing", "supplementing",
+ "surrepetitious", "surreptitious",
+ "survivabililty", "survivability",
+ "survivabillity", "survivability",
+ "sustainabiltiy", "sustainability",
+ "syncronization", "synchronization",
+ "systemetically", "systematically",
+ "systimatically", "systematically",
+ "technologicaly", "technologically",
+ "thermodinamics", "thermodynamics",
+ "thermodyanmics", "thermodynamics",
+ "thermodymamics", "thermodynamics",
+ "thermodymanics", "thermodynamics",
+ "thermodynamcis", "thermodynamics",
+ "thermodynanics", "thermodynamics",
+ "thermodynmaics", "thermodynamics",
+ "thernodynamics", "thermodynamics",
+ "theromdynamics", "thermodynamics",
+ "transformacion", "transformation",
+ "transfromation", "transformation",
+ "transitionable", "transitional",
+ "transitionning", "transitioning",
+ "transofrmation", "transformation",
+ "trasnformation", "transformation",
+ "trasnportation", "transportation",
+ "unbelievablely", "unbelievably",
+ "unchallengable", "unchallengeable",
+ "uncomfortabley", "uncomfortably",
+ "uncomfortablly", "uncomfortably",
+ "unconciousness", "unconsciousness",
+ "unconditionaly", "unconditionally",
+ "unconditionnal", "unconditional",
+ "unconsciouslly", "unconsciously",
+ "uncontrallable", "uncontrollable",
+ "uncontrallably", "uncontrollably",
+ "uncontrolablly", "uncontrollably",
+ "unconvectional", "unconventional",
+ "unconvencional", "unconventional",
+ "unconvensional", "unconventional",
+ "unconventianal", "unconventional",
+ "underastimated", "underestimated",
+ "underestamated", "underestimated",
+ "underestemated", "underestimated",
+ "underestimeted", "underestimated",
+ "undersetimated", "underestimated",
+ "understandebly", "understandably",
+ "understandible", "understandable",
+ "understandibly", "understandably",
+ "undestructible", "indestructible",
+ "unforetunately", "unfortunately",
+ "unfortunatelly", "unfortunately",
+ "unfourtunately", "unfortunately",
+ "uninitalizable", "uninitializable",
+ "unintelligient", "unintelligent",
+ "unintentionaly", "unintentionally",
+ "unintentionnal", "unintentional",
+ "unmanouverable", "unmaneuverable",
+ "unneccessarily", "unnecessarily",
+ "unnecessarilly", "unnecessarily",
+ "unprecendented", "unprecedented",
+ "unprofessionel", "unprofessional",
+ "unreasonablely", "unreasonably",
+ "unsubstantiaed", "unsubstantiated",
+ "unsurprizingly", "unsurprisingly",
+ "vizualisations", "visualization",
+ "vulnerabilites", "vulnerabilities",
+ "vulnerabillity", "vulnerability",
+ "vulnerablility", "vulnerability",
+ "wholeheartadly", "wholeheartedly",
+ "wholeheartidly", "wholeheartedly",
+ "abbrievations", "abbreviation",
+ "accelleration", "acceleration",
+ "accomadations", "accommodations",
+ "accommadating", "accommodating",
+ "accommadation", "accommodation",
+ "accommidation", "accommodation",
+ "accomodations", "accommodations",
+ "accomondating", "accommodating",
+ "accomondation", "accommodation",
+ "accomplishent", "accomplishment",
+ "accountabilty", "accountability",
+ "accredidation", "accreditation",
+ "acknolwedging", "acknowledging",
+ "acknowlegding", "acknowledging",
+ "acomplishment", "accomplishment",
+ "acquaintaince", "acquaintance",
+ "acquaintences", "acquaintances",
+ "acquaintinces", "acquaintances",
+ "acquanitances", "acquaintance",
+ "acquantainces", "acquaintances",
+ "acquantiances", "acquaintances",
+ "acquiantances", "acquaintances",
+ "acquiantences", "acquaintances",
+ "adminastrator", "administrator",
+ "administartor", "administrator",
+ "administraion", "administration",
+ "administraron", "administrator",
+ "administrater", "administrator",
+ "administratio", "administrator",
+ "administraton", "administration",
+ "adminsitrator", "administrator",
+ "adminstration", "administration",
+ "adminstrative", "administrative",
+ "admissability", "admissibility",
+ "adnimistrator", "administrators",
+ "adverticement", "advertisement",
+ "advertisiment", "advertisement",
+ "advertisments", "advertisements",
+ "advirtisement", "advertisement",
+ "aestethically", "aesthetically",
+ "aesthatically", "aesthetically",
+ "aesthitically", "aesthetically",
+ "affectionnate", "affectionate",
+ "aforementiond", "aforementioned",
+ "agriculturual", "agricultural",
+ "agrumentative", "argumentative",
+ "alterantively", "alternatively",
+ "alternativets", "alternatives",
+ "alternativley", "alternatively",
+ "alternitavely", "alternatively",
+ "alternitively", "alternatively",
+ "aninteresting", "uninteresting",
+ "annoucnements", "announcements",
+ "antagonisitic", "antagonistic",
+ "anthropolgist", "anthropologist",
+ "apporpriately", "appropriately",
+ "apporpriation", "appropriation",
+ "apporximately", "approximately",
+ "appreciateing", "appreciating",
+ "appreciateive", "appreciative",
+ "appreciationg", "appreciating",
+ "appropirately", "appropriately",
+ "appropiration", "appropriation",
+ "appropraitely", "appropriately",
+ "appropreation", "appropriation",
+ "appropriatley", "appropriately",
+ "appropropiate", "appropriate",
+ "approrpiation", "appropriation",
+ "approxamately", "approximately",
+ "approxiamtely", "approximately",
+ "approximatley", "approximately",
+ "approximitely", "approximately",
+ "aqcuaintances", "acquaintances",
+ "aqquaintances", "acquaintances",
+ "archaelogical", "archaeological",
+ "archaelogists", "archaeologists",
+ "archeaologist", "archeologist",
+ "archetectural", "architectural",
+ "architechture", "architecture",
+ "architechural", "architectural",
+ "architectrual", "architectural",
+ "architecutral", "architectural",
+ "argumentitive", "argumentative",
+ "arugmentative", "argumentative",
+ "asethetically", "aesthetically",
+ "assasinations", "assassinations",
+ "audomoderator", "automoderator",
+ "australianess", "australians",
+ "authenticaion", "authentication",
+ "authenticaton", "authentication",
+ "autherization", "authorization",
+ "authoratitive", "authoritative",
+ "authoritatian", "authoritarian",
+ "authoritation", "authorization",
+ "authorititive", "authoritative",
+ "authoritorian", "authoritarian",
+ "authorotative", "authoritative",
+ "authroization", "authorization",
+ "automoderador", "automoderator",
+ "automoderater", "automoderator",
+ "automodorator", "automoderator",
+ "automoterator", "automoderator",
+ "autoritharian", "authoritarian",
+ "availabillity", "availability",
+ "awknowledging", "acknowledging",
+ "billingualism", "bilingualism",
+ "billionairres", "billionaire",
+ "borderlanders", "borderlands",
+ "breadtfeeding", "breastfeeding",
+ "breastfeading", "breastfeeding",
+ "breatsfeeding", "breastfeeding",
+ "broadacasting", "broadcasting",
+ "bureaucractic", "bureaucratic",
+ "bureaucratics", "bureaucrats",
+ "bureaucratius", "bureaucrats",
+ "californiaman", "californian",
+ "calrification", "clarification",
+ "capitalizaton", "capitalization",
+ "carbohdyrates", "carbohydrates",
+ "carbohidrates", "carbohydrates",
+ "carbohyrdates", "carbohydrates",
+ "carboyhdrates", "carbohydrates",
+ "carthographer", "cartographer",
+ "catagorically", "categorically",
+ "catastrophies", "catastrophe",
+ "catastrophize", "catastrophe",
+ "catigorically", "categorically",
+ "catterpillars", "caterpillars",
+ "celebrationis", "celebrations",
+ "ceritfication", "certifications",
+ "certificaiton", "certification",
+ "championchips", "championship",
+ "championshiop", "championships",
+ "championsship", "championships",
+ "chanpionships", "championships",
+ "charactarized", "characterized",
+ "characterisic", "characteristic",
+ "characteristc", "characteristics",
+ "characterists", "characteristics",
+ "charicterized", "characterized",
+ "charismatisch", "charismatic",
+ "checkpointusa", "checkpoints",
+ "cheeseburgare", "cheeseburger",
+ "cheeseburgler", "cheeseburger",
+ "cheeseburguer", "cheeseburger",
+ "cheezeburgers", "cheeseburgers",
+ "chornological", "chronological",
+ "chronoligical", "chronological",
+ "chronologicly", "chronological",
+ "cinematograhy", "cinematography",
+ "cinematograpy", "cinematography",
+ "circomference", "circumference",
+ "circumcission", "circumcision",
+ "circumferance", "circumference",
+ "circumsicions", "circumcision",
+ "circumstanial", "circumstantial",
+ "circumstantal", "circumstantial",
+ "circumstnaces", "circumstance",
+ "circunference", "circumference",
+ "circunstances", "circumstances",
+ "cirucmference", "circumference",
+ "cirucmstances", "circumstances",
+ "civilications", "civilizations",
+ "civilizaitons", "civilizations",
+ "clarificaiton", "clarification",
+ "clasification", "clarification",
+ "clerification", "clarification",
+ "coincidentaly", "coincidentally",
+ "coincidential", "coincidental",
+ "colaborations", "collaborations",
+ "collabaration", "collaboration",
+ "collaberation", "collaboration",
+ "collaberative", "collaborative",
+ "collaboratore", "collaborate",
+ "collectioners", "collections",
+ "collectivelly", "collectively",
+ "collobaration", "collaboration",
+ "combatibility", "compatibility",
+ "comeptitively", "competitively",
+ "comfortablely", "comfortably",
+ "comfortablity", "comfortably",
+ "comfrontation", "confrontation",
+ "commemerative", "commemorative",
+ "commericially", "commercially",
+ "commerorative", "commemorative",
+ "comminication", "communication",
+ "comminucation", "communications",
+ "commissionees", "commissions",
+ "commissionned", "commissioned",
+ "commissionner", "commissioner",
+ "commmemorated", "commemorated",
+ "commuications", "communications",
+ "commuincation", "communications",
+ "communciation", "communication",
+ "communiaction", "communications",
+ "communicaiton", "communication",
+ "communicatoin", "communications",
+ "communicatons", "communications",
+ "compadibility", "compatibility",
+ "comparativley", "comparatively",
+ "comparetively", "comparatively",
+ "comparitavely", "comparatively",
+ "comparitively", "comparatively",
+ "compatability", "compatibility",
+ "compatibiltiy", "compatibility",
+ "compeditively", "competitively",
+ "compensantion", "compensation",
+ "compensationg", "compensating",
+ "comperatively", "comparatively",
+ "comperhension", "comprehension",
+ "competatively", "competitively",
+ "competitavely", "competitively",
+ "competitevely", "competitively",
+ "competitivley", "competitively",
+ "competiveness", "competitiveness",
+ "compilcations", "complication",
+ "compitability", "compatibility",
+ "complciations", "complication",
+ "complecations", "complications",
+ "compliactions", "complication",
+ "complicaitons", "complication",
+ "complilations", "complications",
+ "complimentery", "complimentary",
+ "complimentoni", "complimenting",
+ "complimentory", "complimentary",
+ "comprehention", "comprehension",
+ "computacional", "computational",
+ "comtamination", "contamination",
+ "comtemplating", "contemplating",
+ "concatination", "contamination",
+ "conceivablely", "conceivably",
+ "concencration", "concentration",
+ "concenrtation", "concentrations",
+ "concentartion", "concentrations",
+ "concentracion", "concentration",
+ "concentraited", "concentrated",
+ "concentraiton", "concentrations",
+ "concentratons", "concentrations",
+ "concervatives", "conservatives",
+ "concideration", "consideration",
+ "concioussness", "consciousness",
+ "concnetration", "concentrations",
+ "concsiousness", "consciousness",
+ "condascending", "condescending",
+ "condescencion", "condescension",
+ "condescendion", "condescension",
+ "condescensing", "condescension",
+ "condiscending", "condescending",
+ "conditionning", "conditioning",
+ "condradicting", "contradicting",
+ "condradiction", "contradiction",
+ "condradictory", "contradictory",
+ "conecntration", "concentrations",
+ "conenctration", "concentrations",
+ "confidentally", "confidentially",
+ "configrations", "configurations",
+ "configruation", "configurations",
+ "configuartion", "configuration",
+ "configuracion", "configuration",
+ "configuraiton", "configuration",
+ "configuratoin", "configurations",
+ "configureable", "configurable",
+ "confrentation", "confrontation",
+ "confrontacion", "confrontation",
+ "confrontating", "confrontation",
+ "confrontativo", "confrontation",
+ "congratualted", "congratulate",
+ "conifguration", "configurations",
+ "conisderation", "considerations",
+ "connecticunts", "connecticut",
+ "connectivitiy", "connectivity",
+ "conpassionate", "compassionate",
+ "conplications", "complications",
+ "conplimentary", "complimentary",
+ "conplimenting", "complimenting",
+ "conprehension", "comprehension",
+ "consdieration", "considerations",
+ "consenquently", "consequently",
+ "consentrating", "concentrating",
+ "consentration", "concentration",
+ "consequencies", "consequence",
+ "consequentely", "consequently",
+ "consequeseces", "consequences",
+ "conservatisim", "conservatism",
+ "conservativsm", "conservatism",
+ "conservitives", "conservatives",
+ "consicousness", "consciousness",
+ "considerabely", "considerable",
+ "considerabile", "considerable",
+ "considerabley", "considerably",
+ "considerablly", "considerably",
+ "consideracion", "consideration",
+ "consideratoin", "considerations",
+ "considerstion", "considerations",
+ "considertaion", "considerations",
+ "consituencies", "constituencies",
+ "consitutional", "constitutional",
+ "constallation", "constellation",
+ "constarnation", "consternation",
+ "constillation", "constellation",
+ "constituintes", "constituents",
+ "constituional", "constitutional",
+ "constitutents", "constitutes",
+ "constitutinal", "constitutional",
+ "constructicon", "construction",
+ "constructieve", "constructive",
+ "constructiong", "constructing",
+ "consttruction", "construction",
+ "contaminacion", "contamination",
+ "contaminanted", "contaminated",
+ "contanimation", "contamination",
+ "contenplating", "contemplating",
+ "contimplating", "contemplating",
+ "contraceptivo", "contraception",
+ "contradiccion", "contradiction",
+ "contradicitng", "contradicting",
+ "contradiciton", "contradiction",
+ "contradictary", "contradictory",
+ "contradictons", "contradicts",
+ "contraticting", "contradicting",
+ "contravercial", "controversial",
+ "contraversial", "controversial",
+ "contreception", "contraception",
+ "contreversial", "controversial",
+ "contributeurs", "contributes",
+ "contributiors", "contributors",
+ "contriception", "contraception",
+ "contridictory", "contradictory",
+ "contritutions", "contributions",
+ "contriversial", "controversial",
+ "controception", "contraception",
+ "controdicting", "contradicting",
+ "controdiction", "contradiction",
+ "controvercial", "controversial",
+ "controverisal", "controversial",
+ "controversary", "controversy",
+ "controversity", "controversy",
+ "controvertial", "controversial",
+ "contstruction", "construction",
+ "conventionnal", "conventional",
+ "converastions", "conservation",
+ "conversationa", "conservation",
+ "conversationg", "conservation",
+ "conversationy", "conservation",
+ "conversatiosn", "conservation",
+ "conversatives", "conservatives",
+ "converstaions", "conversations",
+ "convorsations", "conversations",
+ "cooresponding", "corresponding",
+ "coorperations", "corporations",
+ "correctionals", "corrections",
+ "correpsonding", "corresponding",
+ "correspondant", "correspondent",
+ "correspondece", "correspondence",
+ "corresponders", "corresponds",
+ "corresponsing", "corresponding",
+ "corrispondant", "correspondent",
+ "corrisponding", "corresponding",
+ "corrosponding", "corresponding",
+ "costomization", "customization",
+ "costumization", "customization",
+ "counterfeight", "counterfeit",
+ "creationistas", "creationists",
+ "cricumference", "circumference",
+ "cringeworthey", "cringeworthy",
+ "cringeworthly", "cringeworthy",
+ "crytopgraphic", "cryptographic",
+ "curcumference", "circumference",
+ "curcumstances", "circumstances",
+ "custumization", "customization",
+ "cuztomization", "customization",
+ "decentraliced", "decentralized",
+ "decentrilized", "decentralized",
+ "decomissioned", "decommissioned",
+ "decompositing", "decomposing",
+ "definitivelly", "definitively",
+ "deinitalizing", "deinitializing",
+ "demenstration", "demonstration",
+ "democraticaly", "democratically",
+ "democraticlly", "democratically",
+ "demoninations", "denominations",
+ "demonstarting", "demonstrating",
+ "demonstartion", "demonstration",
+ "demonstraiton", "demonstrations",
+ "demonstratbly", "demonstrably",
+ "demonstraties", "demonstrate",
+ "demonstrativo", "demonstration",
+ "demosntrating", "demonstrating",
+ "demosntration", "demonstrations",
+ "denomenations", "denominations",
+ "denomonations", "denominations",
+ "deomnstration", "demonstrations",
+ "dermatalogist", "dermatologist",
+ "dermatolagist", "dermatologist",
+ "dermatoligist", "dermatologist",
+ "dermatologyst", "dermatologist",
+ "dermetologist", "dermatologist",
+ "dermitologist", "dermatologist",
+ "derpatologist", "dermatologist",
+ "desentralized", "decentralized",
+ "desillusioned", "disillusioned",
+ "desintegrated", "disintegrated",
+ "desinterested", "disinterested",
+ "determenation", "determination",
+ "determinacion", "determination",
+ "determinining", "determining",
+ "determinisitc", "deterministic",
+ "determinsitic", "deterministic",
+ "detmatologist", "dermatologist",
+ "developmently", "developmental",
+ "dezentralized", "decentralized",
+ "differantiate", "differentiate",
+ "differenciate", "differentiate",
+ "differintiate", "differentiate",
+ "diffirentiate", "differentiate",
+ "disadvandages", "disadvantaged",
+ "disadvantadge", "disadvantaged",
+ "disadvanteged", "disadvantaged",
+ "disadvanteges", "disadvantages",
+ "disadvatanges", "disadvantages",
+ "disadventaged", "disadvantaged",
+ "disadventages", "disadvantages",
+ "disallusioned", "disillusioned",
+ "disappearence", "disappearance",
+ "disappearnace", "disappearance",
+ "disappearring", "disappearing",
+ "disatvantaged", "disadvantaged",
+ "disatvantages", "disadvantages",
+ "disciplinairy", "disciplinary",
+ "disciplinerad", "disciplined",
+ "discipliniary", "disciplinary",
+ "disconnecters", "disconnects",
+ "discontinuted", "discontinued",
+ "discrimianted", "discriminated",
+ "discriminante", "discriminate",
+ "discriminatie", "discriminate",
+ "discriminatin", "discrimination",
+ "disillisioned", "disillusioned",
+ "disillutioned", "disillusioned",
+ "disingenuious", "disingenuous",
+ "disollusioned", "disillusioned",
+ "disrecpectful", "disrespectful",
+ "disrecpecting", "disrespecting",
+ "disrepsectful", "disrespectful",
+ "disrepsecting", "disrespecting",
+ "disresepctful", "disrespectful",
+ "disresepcting", "disrespecting",
+ "disrespection", "disrespecting",
+ "disrespekting", "disrespecting",
+ "disrispectful", "disrespectful",
+ "disrispecting", "disrespecting",
+ "dissagreement", "disagreement",
+ "dissapearance", "disappearance",
+ "dissapointted", "dissapointed",
+ "dissappointed", "disappointed",
+ "dissobediance", "disobedience",
+ "dissobedience", "disobedience",
+ "distingishing", "distinguishing",
+ "distinguising", "distinguishing",
+ "distinquished", "distinguished",
+ "distirbutions", "distributions",
+ "distiungished", "distinguished",
+ "distribustion", "distributions",
+ "distributiors", "distributors",
+ "distributivos", "distributions",
+ "distrobutions", "distributions",
+ "distrubitions", "distributions",
+ "distuingished", "distinguished",
+ "documantaries", "documentaries",
+ "documenatries", "documentaries",
+ "documentacion", "documentation",
+ "documentaires", "documentaries",
+ "documentaiton", "documentation",
+ "documentarios", "documentaries",
+ "documentaties", "documentaries",
+ "documentating", "documentation",
+ "documenteries", "documentaries",
+ "documentories", "documentaries",
+ "drammatically", "grammatically",
+ "dsyfunctional", "dysfunctional",
+ "dumbfoundeads", "dumbfounded",
+ "dusfunctional", "dysfunctional",
+ "dustification", "justification",
+ "dysfonctional", "dysfunctional",
+ "dysfucntional", "dysfunctional",
+ "dysfuncitonal", "dysfunctional",
+ "dysfunktional", "dysfunctional",
+ "easthetically", "aesthetically",
+ "effectiviness", "effectiveness",
+ "effictiveness", "effectiveness",
+ "effortlessely", "effortlessly",
+ "effortlessley", "effortlessly",
+ "embarrasement", "embarrassment",
+ "embarrasments", "embarrassment",
+ "embarressment", "embarrassment",
+ "emberrassment", "embarrassment",
+ "encarceration", "incarceration",
+ "encorporating", "incorporating",
+ "encyclopeadia", "encyclopedia",
+ "encyclopeadic", "encyclopedia",
+ "encyclopeedia", "encyclopedia",
+ "encycolpedias", "encyclopedia",
+ "endoctrinated", "indoctrinated",
+ "enlightenting", "enlightening",
+ "enlightnement", "enlightenment",
+ "enligthenment", "enlightenment",
+ "enteratinment", "entertainment",
+ "enterpreneurs", "entrepreneurs",
+ "enterprenuers", "entrepreneurs",
+ "enterpreuners", "entrepreneurs",
+ "entertianment", "entertainment",
+ "enthusiasists", "enthusiasts",
+ "enthusiastics", "enthusiasts",
+ "entrepraneurs", "entrepreneurs",
+ "entreprenaurs", "entrepreneurs",
+ "entrepreneuer", "entrepreneurs",
+ "entreprenours", "entrepreneurs",
+ "entreprenuers", "entrepreneurs",
+ "entreprenures", "entrepreneurs",
+ "entrepreuners", "entrepreneurs",
+ "entretainment", "entertainment",
+ "enviornmental", "environmental",
+ "environemntal", "environmental",
+ "environmently", "environmental",
+ "envolutionary", "evolutionary",
+ "envrionmental", "environmental",
+ "estabilshment", "establishments",
+ "establishemnt", "establishments",
+ "establishmnet", "establishments",
+ "establsihment", "establishments",
+ "estbalishment", "establishments",
+ "ethnocentricm", "ethnocentrism",
+ "evolutionairy", "evolutionary",
+ "evolutionarly", "evolutionary",
+ "evolutionnary", "evolutionary",
+ "exaggeratting", "exaggerating",
+ "excpetionally", "exceptionally",
+ "executioneers", "executioner",
+ "existentiella", "existential",
+ "expectionally", "exceptionally",
+ "experementing", "experimenting",
+ "experienceing", "experiencing",
+ "experimentais", "experiments",
+ "experimention", "experimenting",
+ "experimentors", "experiments",
+ "expirementing", "experimenting",
+ "expodentially", "exponentially",
+ "exponantially", "exponentially",
+ "exponencially", "exponentially",
+ "exponentiella", "exponential",
+ "extraodrinary", "extraordinary",
+ "extraordianry", "extraordinary",
+ "extraordinair", "extraordinary",
+ "extraordinaly", "extraordinary",
+ "extraoridnary", "extraordinary",
+ "extremeophile", "extremophile",
+ "extroardinary", "extraordinary",
+ "familiarizate", "familiarize",
+ "fantasitcally", "fantastically",
+ "fantasmically", "fantastically",
+ "fantistically", "fantastically",
+ "faptastically", "fantastically",
+ "figurativeley", "figuratively",
+ "figurativelly", "figuratively",
+ "frankenstiens", "frankenstein",
+ "frankenstined", "frankenstein",
+ "frankenstiner", "frankenstein",
+ "frankenstines", "frankenstein",
+ "friendzoneado", "friendzoned",
+ "fucntionality", "functionality",
+ "funcitonality", "functionality",
+ "functionailty", "functionality",
+ "fundamentalis", "fundamentals",
+ "fundamnetally", "fundamentally",
+ "fundementally", "fundamentally",
+ "fundimentally", "fundamentally",
+ "gamifications", "ramifications",
+ "generalizaing", "generalizing",
+ "generalizaton", "generalization",
+ "generationals", "generations",
+ "generationens", "generations",
+ "generationers", "generations",
+ "generationnal", "generational",
+ "geographicaly", "geographically",
+ "geographicial", "geographical",
+ "geometricians", "geometers",
+ "goreshadowing", "foreshadowing",
+ "governmential", "governmental",
+ "gradification", "gratification",
+ "grammarically", "grammatically",
+ "grandchildern", "grandchildren",
+ "gratificacion", "gratification",
+ "gratificaiton", "gratification",
+ "grativational", "gravitational",
+ "gravitacional", "gravitational",
+ "gravitaitonal", "gravitational",
+ "hallcuination", "hallucination",
+ "hallicunation", "hallucination",
+ "hallucenation", "hallucination",
+ "halluciantion", "hallucinations",
+ "hallukination", "hallucination",
+ "hallunication", "hallucination",
+ "hallusination", "hallucination",
+ "halluzination", "hallucination",
+ "heiroglyphics", "hieroglyphics",
+ "hellucination", "hallucination",
+ "highlightning", "highlighting",
+ "homesexuality", "homosexuality",
+ "homosexualtiy", "homosexuality",
+ "homosexulaity", "homosexuality",
+ "horizontallly", "horizontally",
+ "hullucination", "hallucination",
+ "hypocriticial", "hypocritical",
+ "hypotheticaly", "hypothetically",
+ "hystericallly", "hysterically",
+ "identificaton", "identification",
+ "ideoligically", "ideologically",
+ "ideosyncratic", "idiosyncratic",
+ "idiologically", "ideologically",
+ "illistrations", "illustrations",
+ "illustartions", "illustrations",
+ "imperfactions", "imperfections",
+ "impersinating", "impersonating",
+ "implementaion", "implementation",
+ "implementatin", "implementations",
+ "implimenation", "implementation",
+ "imprefections", "imperfections",
+ "impresonating", "impersonating",
+ "inaccessibile", "inaccessible",
+ "inadventently", "inadvertently",
+ "inadverdently", "inadvertently",
+ "inadvertantly", "inadvertently",
+ "inadvertendly", "inadvertently",
+ "inapporpriate", "inappropriate",
+ "inappropirate", "inappropriate",
+ "inappropraite", "inappropriate",
+ "inaproppriate", "inappropriate",
+ "incarcaration", "incarceration",
+ "incarciration", "incarceration",
+ "incarseration", "incarceration",
+ "incerceration", "incarceration",
+ "incidentially", "incidentally",
+ "incomfortable", "uncomfortable",
+ "incomfortably", "uncomfortably",
+ "incompatabile", "incompatible",
+ "incompatiable", "incompatible",
+ "incompatibile", "incompatible",
+ "inconciderate", "inconsiderate",
+ "inconcistency", "inconsistency",
+ "inconditional", "unconditional",
+ "inconsciously", "unconsciously",
+ "inconsiderant", "inconsiderate",
+ "inconsistance", "inconsistency",
+ "inconsistancy", "inconsistency",
+ "inconsistenly", "inconsistency",
+ "inconsistensy", "inconsistency",
+ "inconsistenty", "inconsistency",
+ "inconveinence", "inconvenience",
+ "inconveniance", "inconvenience",
+ "inconveniente", "inconvenience",
+ "inconvienence", "inconvenience",
+ "incoroporated", "incorporated",
+ "incorparating", "incorporating",
+ "incorperating", "incorporating",
+ "incorperation", "incorporation",
+ "incorruptable", "incorruptible",
+ "incramentally", "incrementally",
+ "incrementarla", "incremental",
+ "incrementarlo", "incremental",
+ "indavertently", "inadvertently",
+ "indefinitelly", "indefinitely",
+ "independantes", "independents",
+ "independantly", "independently",
+ "independendet", "independent",
+ "independendly", "independently",
+ "indepentently", "independently",
+ "indespensable", "indispensable",
+ "indespensible", "indispensable",
+ "indestructble", "indestructible",
+ "indestructibe", "indestructible",
+ "indictrinated", "indoctrinated",
+ "indipendently", "independently",
+ "indispensible", "indispensable",
+ "indivuduality", "individuality",
+ "indocrtinated", "indoctrinated",
+ "indocternated", "indoctrinated",
+ "indoctornated", "indoctrinated",
+ "indoctrinatie", "indoctrinated",
+ "indoctrinatin", "indoctrination",
+ "indoctronated", "indoctrinated",
+ "industrialied", "industrialized",
+ "industrialzed", "industrialized",
+ "inexeprienced", "inexperience",
+ "inexpeirenced", "inexperience",
+ "inexpereinced", "inexperienced",
+ "inexperianced", "inexperienced",
+ "inexperiecned", "inexperience",
+ "inexperineced", "inexperience",
+ "inexpierenced", "inexperienced",
+ "inexplicabley", "inexplicably",
+ "inexplicablly", "inexplicably",
+ "infilitration", "infiltration",
+ "infrastructre", "infrastructure",
+ "infrastrucure", "infrastructure",
+ "inintelligent", "unintelligent",
+ "ininteresting", "uninteresting",
+ "initalisation", "initialisation",
+ "initalization", "initialization",
+ "inperfections", "imperfections",
+ "inpersonating", "impersonating",
+ "inpossibility", "impossibility",
+ "inpredictable", "unpredictable",
+ "inresponsible", "irresponsible",
+ "insectiverous", "insectivorous",
+ "insecuritites", "insecurities",
+ "insiginficant", "insignificant",
+ "insiginifcant", "insignificant",
+ "insignificent", "insignificant",
+ "insignificunt", "insignificant",
+ "insignifigant", "insignificant",
+ "insiprational", "inspirational",
+ "insperational", "inspirational",
+ "inspiritional", "inspirational",
+ "inspriational", "inspirational",
+ "instantaenous", "instantaneous",
+ "instantanious", "instantaneous",
+ "instanteneous", "instantaneous",
+ "instantenious", "instantaneous",
+ "instincitvely", "instinctively",
+ "instinctivley", "instinctively",
+ "instititional", "institutional",
+ "institutionel", "institutional",
+ "insturmentals", "instrumental",
+ "instutitional", "institutional",
+ "insustainable", "unsustainable",
+ "intelelctuals", "intellectuals",
+ "intellectualy", "intellectually",
+ "intellectuels", "intellectuals",
+ "intellecutals", "intellectuals",
+ "intellegently", "intelligently",
+ "intelluctuals", "intellectuals",
+ "intepretation", "interpretation",
+ "intereactions", "intersections",
+ "interesctions", "intersections",
+ "interlectuals", "intellectuals",
+ "intermittient", "intermittent",
+ "intermittment", "intermittent",
+ "internacional", "international",
+ "interpersonel", "interpersonal",
+ "interpresonal", "interpersonal",
+ "interpretaion", "interpretation",
+ "interpretarea", "interpreter",
+ "interpretarem", "interpreter",
+ "interpretares", "interpreter",
+ "interpretarse", "interpreter",
+ "interpretarte", "interpreter",
+ "interpretatin", "interpretations",
+ "interpreteert", "interpreter",
+ "interragation", "interrogation",
+ "interregation", "interrogation",
+ "interrigation", "interrogation",
+ "interrogacion", "interrogation",
+ "interrogativo", "interrogation",
+ "intertainment", "entertainment",
+ "intillectuals", "intellectuals",
+ "intraspection", "introspection",
+ "intrensically", "intrinsically",
+ "intriniscally", "intrinsically",
+ "intrinsecally", "intrinsically",
+ "intrisincally", "intrinsically",
+ "intristically", "intrinsically",
+ "introductiory", "introductory",
+ "introspeccion", "introspection",
+ "introspectivo", "introspection",
+ "introspektion", "introspection",
+ "invertibrates", "invertebrates",
+ "invesitgation", "investigation",
+ "invesitgative", "investigative",
+ "invesitgators", "investigators",
+ "investagators", "investigators",
+ "investegating", "investigating",
+ "investegators", "investigators",
+ "investiagtion", "investigation",
+ "investiagtive", "investigative",
+ "investigacion", "investigation",
+ "investigaiton", "investigations",
+ "investigaters", "investigators",
+ "investigativo", "investigation",
+ "investigatons", "investigations",
+ "investigsting", "investigating",
+ "investigstion", "investigations",
+ "investogators", "investigators",
+ "invisibillity", "invisibility",
+ "involuntarely", "involuntary",
+ "involuntarity", "involuntary",
+ "invulnerabile", "invulnerable",
+ "irrationallly", "irrationally",
+ "irresponcible", "irresponsible",
+ "irresponisble", "irresponsible",
+ "irresponsable", "irresponsible",
+ "irresponsbile", "irresponsible",
+ "irreversiable", "irreversible",
+ "irreversibelt", "irreversible",
+ "irreversibile", "irreversible",
+ "irrisponsible", "irresponsible",
+ "jacksonvillle", "jacksonville",
+ "journalisitic", "journalistic",
+ "journalistens", "journalists",
+ "journalisters", "journalists",
+ "journalistisk", "journalists",
+ "jsutification", "justifications",
+ "jurisdicitons", "jurisdictions",
+ "jurisidctions", "jurisdictions",
+ "juristictions", "jurisdictions",
+ "jursidictions", "jurisdictions",
+ "jusitfication", "justifications",
+ "justifiaction", "justifications",
+ "justificacion", "justification",
+ "justificaiton", "justification",
+ "justificativo", "justification",
+ "justificatons", "justifications",
+ "justificstion", "justifications",
+ "justiifcation", "justifications",
+ "karbohydrates", "carbohydrates",
+ "knoweldgeable", "knowledgeable",
+ "knowledegable", "knowledgeable",
+ "knowledgebale", "knowledgable",
+ "knowlegdeable", "knowledgeable",
+ "kollaboration", "collaboration",
+ "koncentration", "concentration",
+ "konfiguration", "configuration",
+ "konfrontation", "confrontation",
+ "konservatives", "conservatives",
+ "konstellation", "constellation",
+ "kontamination", "contamination",
+ "legitimatelly", "legitimately",
+ "libertariaism", "libertarianism",
+ "libertariansm", "libertarianism",
+ "libitarianisn", "libertarianism",
+ "lighthearthed", "lighthearted",
+ "mainfestation", "manifestation",
+ "manafacturers", "manufacturers",
+ "manafacturing", "manufacturing",
+ "manafestation", "manifestation",
+ "manefestation", "manifestation",
+ "manfuacturers", "manufactures",
+ "manifacturers", "manufacturers",
+ "manifacturing", "manufacturing",
+ "manifastation", "manifestation",
+ "manifestacion", "manifestation",
+ "manifestating", "manifestation",
+ "manifistation", "manifestation",
+ "manipulationg", "manipulating",
+ "manufacterers", "manufacturers",
+ "manufactering", "manufacturing",
+ "manufacterurs", "manufactures",
+ "manufactorers", "manufacturers",
+ "manufactoring", "manufacturing",
+ "manufactuered", "manufactured",
+ "manufactuerer", "manufacturer",
+ "manufactueres", "manufactures",
+ "manufacturedd", "manufactured",
+ "manufactureds", "manufactures",
+ "manufacturerd", "manufactured",
+ "manufacturier", "manufacturer",
+ "manufacturors", "manufacturers",
+ "manufactuters", "manufactures",
+ "manufacutrers", "manufactures",
+ "manufcaturers", "manufactures",
+ "marshmalllows", "marshmallows",
+ "massachsuetts", "massachusetts",
+ "massachucetts", "massachusetts",
+ "massachuestts", "massachusetts",
+ "massachusents", "massachusetts",
+ "massachusites", "massachusetts",
+ "massachussets", "massachusetts",
+ "massechusetts", "massachusetts",
+ "masturbateing", "masturbating",
+ "materialisimo", "materialism",
+ "mathamatician", "mathematician",
+ "mathametician", "mathematician",
+ "mathematicals", "mathematics",
+ "mathematicaly", "mathematically",
+ "mathematicans", "mathematics",
+ "mathematicion", "mathematician",
+ "mathematitian", "mathematician",
+ "mathemetician", "mathematician",
+ "mathmatically", "mathematically",
+ "mathmaticians", "mathematicians",
+ "mechanicallly", "mechanically",
+ "medeterranean", "mediterranean",
+ "meditarrenean", "mediterranean",
+ "meditereanean", "mediterranean",
+ "membranaphone", "membranophone",
+ "metamorphysis", "metamorphosis",
+ "metaphoricaly", "metaphorically",
+ "metaphoricial", "metaphorical",
+ "metaphysicals", "metaphysics",
+ "metaphysicans", "metaphysics",
+ "methamatician", "mathematician",
+ "methematician", "mathematician",
+ "metropolitain", "metropolitan",
+ "metropolitcan", "metropolitan",
+ "metropolitian", "metropolitan",
+ "millionairres", "millionaire",
+ "minneapolites", "minneapolis",
+ "misanderstood", "misunderstood",
+ "miscellanious", "miscellaneous",
+ "misconcpetion", "misconceptions",
+ "misconecption", "misconceptions",
+ "misinterperet", "misinterpret",
+ "misinterprate", "misinterpret",
+ "misinterprent", "misinterpret",
+ "misinterprted", "misinterpret",
+ "misogynisitic", "misogynistic",
+ "misrepreseted", "misrepresented",
+ "misunterstood", "misunderstood",
+ "modificaitons", "modifications",
+ "motivationals", "motivations",
+ "motivationnal", "motivational",
+ "mulitnational", "multinational",
+ "multimational", "multinational",
+ "multiplicaton", "multiplication",
+ "muncipalities", "municipalities",
+ "munnicipality", "municipality",
+ "mutlinational", "multinational",
+ "nacionalistic", "nationalistic",
+ "narcissisitic", "narcissistic",
+ "narcississtic", "narcissistic",
+ "natioanlistic", "nationalistic",
+ "nationalisitc", "nationalistic",
+ "nationalistes", "nationalists",
+ "nationalsitic", "nationalistic",
+ "neigbhourhood", "neighbourhood",
+ "neighboorhoud", "neighbourhood",
+ "neighborehood", "neighbourhood",
+ "neighborhoood", "neighborhoods",
+ "neighbourbood", "neighbourhood",
+ "neighbourgood", "neighbourhood",
+ "neighbourhoud", "neighbourhood",
+ "neighourhoods", "neighborhoods",
+ "nieghborhoods", "neighborhoods",
+ "nieghbourhood", "neighbourhood",
+ "noncombatents", "noncombatants",
+ "noninitalized", "noninitialized",
+ "northwestener", "northwestern",
+ "notificaitons", "notifications",
+ "occassionally", "occasionally",
+ "operationable", "operational",
+ "oppertunities", "opportunities",
+ "opprotunities", "opportunities",
+ "oppurtunities", "opportunities",
+ "opthamologist", "ophthalmologist",
+ "organistaions", "organisations",
+ "organizatinal", "organizational",
+ "organizativos", "organizations",
+ "organsiations", "organisations",
+ "organziations", "organizations",
+ "orginasations", "organisations",
+ "orginazations", "organizations",
+ "overpopulaton", "overpopulation",
+ "overreactiong", "overreacting",
+ "overshaddowed", "overshadowed",
+ "overwheliming", "overwhelming",
+ "overwhelmigly", "overwhelmingly",
+ "overwhelmingy", "overwhelmingly",
+ "overwhelminly", "overwhelmingly",
+ "palestininans", "palestinians",
+ "paraphraseing", "paraphrasing",
+ "paraphrashing", "paraphrasing",
+ "parilamentary", "parliamentary",
+ "parlaimentary", "parliamentary",
+ "parliamantary", "parliamentary",
+ "parliamentery", "parliamentary",
+ "parliamnetary", "parliamentary",
+ "parliementary", "parliamentary",
+ "particiaption", "participation",
+ "participacion", "participation",
+ "participantes", "participants",
+ "participativo", "participation",
+ "particularely", "particularly",
+ "particularily", "particularly",
+ "particularlly", "particularly",
+ "partizipation", "participation",
+ "passionatelly", "passionately",
+ "paychiatrists", "psychiatrists",
+ "paychologists", "psychologists",
+ "pennsylvainia", "pennsylvania",
+ "pennsylvanica", "pennsylvania",
+ "pennsylvannia", "pennsylvania",
+ "perdominantly", "predominantly",
+ "perpandicular", "perpendicular",
+ "perpendicualr", "perpendicular",
+ "perpenticular", "perpendicular",
+ "perpetuationg", "perpetuating",
+ "perpindicular", "perpendicular",
+ "personalitits", "personalities",
+ "pessimistisch", "pessimistic",
+ "pharmaceutial", "pharmaceutical",
+ "philisophical", "philosophical",
+ "philosiphical", "philosophical",
+ "philosohpical", "philosophical",
+ "philosophycal", "philosophically",
+ "philospohical", "philosophical",
+ "phisiological", "physiological",
+ "photagraphers", "photographers",
+ "photographics", "photographs",
+ "photographied", "photographed",
+ "photographier", "photographer",
+ "photograpphed", "photographed",
+ "photogrophers", "photographers",
+ "photogrpahers", "photographers",
+ "photoshoppade", "photoshopped",
+ "photoshoppped", "photoshopped",
+ "phsyiological", "physiological",
+ "phychiatrists", "psychiatrists",
+ "phychological", "psychological",
+ "phychologists", "psychologists",
+ "phylosophical", "philosophical",
+ "physciatrists", "psychiatrists",
+ "physcological", "psychological",
+ "physcologists", "psychologists",
+ "physioligical", "physiological",
+ "planeswlakers", "planeswalker",
+ "plansewalkers", "planeswalker",
+ "playthroughts", "playthroughs",
+ "polysaccaride", "polysaccharide",
+ "practicallity", "practically",
+ "practicioners", "practitioners",
+ "practisioners", "practitioners",
+ "practitioneer", "practitioners",
+ "practitionner", "practitioner",
+ "pratictioners", "practitioners",
+ "preconceieved", "preconceived",
+ "predecessores", "predecessors",
+ "predetermiend", "predetermined",
+ "predetirmined", "predetermined",
+ "preditermined", "predetermined",
+ "predomenantly", "predominantly",
+ "predominently", "predominantly",
+ "pregressively", "progressively",
+ "preinitalized", "preinitialized",
+ "preinitalizes", "preinitializes",
+ "preliferation", "proliferation",
+ "prependicular", "perpendicular",
+ "preposterious", "preposterous",
+ "prerequisties", "prerequisite",
+ "prerequistite", "prerequisite",
+ "prescribtions", "prescriptions",
+ "presumptuious", "presumptuous",
+ "pretedermined", "predetermined",
+ "problematisch", "problematic",
+ "proclaimation", "proclamation",
+ "prodominantly", "predominantly",
+ "professionnal", "professional",
+ "profitiablity", "profitability",
+ "profitibality", "profitability",
+ "progressivily", "progressively",
+ "progressivley", "progressively",
+ "prononciation", "pronunciation",
+ "pronouciation", "pronunciation",
+ "pronunciacion", "pronunciation",
+ "pronunciating", "pronunciation",
+ "pronuncuation", "pronunciation",
+ "pronunication", "pronunciation",
+ "pronuntiation", "pronunciation",
+ "propabilities", "probabilities",
+ "proportionaly", "proportionally",
+ "proportionnal", "proportional",
+ "proseletyzing", "proselytizing",
+ "protagonistas", "protagonists",
+ "protagonistes", "protagonists",
+ "protestantisk", "protestants",
+ "protruberance", "protuberance",
+ "provocativley", "provocative",
+ "pscyhiatrists", "psychiatrists",
+ "pscyhological", "psychological",
+ "pscyhologists", "psychologists",
+ "pshycological", "psychological",
+ "pshycologists", "psychologists",
+ "psichological", "psychological",
+ "psychaitrists", "psychiatrists",
+ "psychedellics", "psychedelics",
+ "psychiatrisch", "psychiatric",
+ "psycholigical", "psychological",
+ "psycholigists", "psychologists",
+ "psychologycal", "psychologically",
+ "psychologysts", "psychologists",
+ "psychyatrists", "psychiatrists",
+ "psysiological", "physiological",
+ "purpendicular", "perpendicular",
+ "pyschiatrists", "psychiatrists",
+ "pyschological", "psychological",
+ "pyschologists", "psychologists",
+ "qaulification", "qualification",
+ "qualifiaction", "qualification",
+ "qualificaiton", "qualifications",
+ "qualificatons", "qualifications",
+ "qualifikation", "qualification",
+ "questionalble", "questionable",
+ "quinessential", "quintessential",
+ "ramificaitons", "ramifications",
+ "realisitcally", "realistically",
+ "realtionships", "relationships",
+ "reccommending", "recommending",
+ "receptionnist", "receptionist",
+ "receptionsist", "receptionist",
+ "reconaissance", "reconnaissance",
+ "reconcilation", "reconciliation",
+ "reconnaisance", "reconnaissance",
+ "reconstrucion", "reconstruction",
+ "recreationnal", "recreational",
+ "rectangulaire", "rectangular",
+ "redistribuito", "redistribution",
+ "redistributin", "redistribution",
+ "reencarnation", "reincarnation",
+ "refridgerator", "refrigerator",
+ "rehabilitaion", "rehabilitation",
+ "rehabilitatin", "rehabilitation",
+ "rehabilitaton", "rehabilitation",
+ "reincarantion", "reincarnation",
+ "reincatnation", "reincarnation",
+ "reinforcemens", "reinforcements",
+ "reinforcemnts", "reinforcements",
+ "reinitalising", "reinitialising",
+ "reinitalizing", "reinitializing",
+ "reinkarnation", "reincarnation",
+ "reinstallling", "reinstalling",
+ "reintarnation", "reincarnation",
+ "relationshits", "relationships",
+ "relationsship", "relationships",
+ "relatiopnship", "relationship",
+ "relentlessely", "relentlessly",
+ "relentlessley", "relentlessly",
+ "relinqushment", "relinquishment",
+ "remifications", "ramifications",
+ "reprehenisble", "reprehensible",
+ "reprehensable", "reprehensible",
+ "reprehinsible", "reprehensible",
+ "represenation", "representation",
+ "represensible", "reprehensible",
+ "representaion", "representation",
+ "representatie", "representatives",
+ "representatin", "representations",
+ "representerad", "represented",
+ "representitve", "representative",
+ "representives", "representatives",
+ "repricussions", "repercussions",
+ "reprihensible", "reprehensible",
+ "resolutionary", "revolutionary",
+ "respectivelly", "respectively",
+ "responsibiliy", "responsibility",
+ "responsibilty", "responsibility",
+ "responsiblity", "responsibility",
+ "respositories", "repositories",
+ "resssurecting", "resurrecting",
+ "ressurrection", "resurrection",
+ "restaraunteur", "restaurateur",
+ "retoractively", "retroactively",
+ "retroactivily", "retroactively",
+ "retroactivley", "retroactively",
+ "retrocatively", "retroactively",
+ "revelutionary", "revolutionary",
+ "revolutionair", "revolutionary",
+ "revolutionens", "revolutions",
+ "revolutioners", "revolutions",
+ "revoultionary", "revolutionary",
+ "ridiculouness", "ridiculousness",
+ "rienforcement", "reinforcements",
+ "righetousness", "righteousness",
+ "rightiousness", "righteousness",
+ "rigtheousness", "righteousness",
+ "rollarcoaster", "rollercoaster",
+ "rollercaoster", "rollercoaster",
+ "rollercoaters", "rollercoaster",
+ "rollercoatser", "rollercoaster",
+ "rollerocaster", "rollercoaster",
+ "rollertoaster", "rollercoaster",
+ "rollorcoaster", "rollercoaster",
+ "sacrastically", "sarcastically",
+ "sarcasitcally", "sarcastically",
+ "satisfactorly", "satisfactory",
+ "scandianvians", "scandinavian",
+ "scateboarding", "skateboarding",
+ "schisophrenic", "schizophrenic",
+ "schiziphrenic", "schizophrenic",
+ "schizophernia", "schizophrenia",
+ "schizophernic", "schizophrenic",
+ "schizophrania", "schizophrenia",
+ "schizoprhenia", "schizophrenia",
+ "schizoprhenic", "schizophrenic",
+ "schozophrenia", "schizophrenia",
+ "schozophrenic", "schizophrenic",
+ "schyzophrenia", "schizophrenia",
+ "schyzophrenic", "schizophrenic",
+ "schziophrenia", "schizophrenia",
+ "schziophrenic", "schizophrenic",
+ "scientificaly", "scientifically",
+ "scientificlly", "scientifically",
+ "segementation", "segmentation",
+ "sensationable", "sensational",
+ "sensationails", "sensationalism",
+ "sensationaism", "sensationalism",
+ "sensationalim", "sensationalism",
+ "sensationella", "sensational",
+ "shcizophrenic", "schizophrenic",
+ "significanlty", "significantly",
+ "significently", "significantly",
+ "signifigantly", "significantly",
+ "simultaneosly", "simultaneously",
+ "simultaneuous", "simultaneous",
+ "simultanously", "simultaneously",
+ "singificantly", "significantly",
+ "skatebaording", "skateboarding",
+ "skateborading", "skateboarding",
+ "socioecenomic", "socioeconomic",
+ "socioecomonic", "socioeconomic",
+ "socioeconimic", "socioeconomic",
+ "sohpisticated", "sophisticated",
+ "sophisitcated", "sophisticated",
+ "sophistacated", "sophisticated",
+ "sophistocated", "sophisticated",
+ "sophosticated", "sophisticated",
+ "spacification", "specification",
+ "specializaton", "specialization",
+ "specificaiton", "specifications",
+ "specificatons", "specifications",
+ "specifikation", "specification",
+ "spectaculaire", "spectacular",
+ "spectaculalry", "spectacularly",
+ "spectatularly", "spectacularly",
+ "spesification", "specification",
+ "spirituallity", "spiritually",
+ "sponatenously", "spontaneously",
+ "spontaenously", "spontaneously",
+ "spontainously", "spontaneously",
+ "spontaneoulsy", "spontaneously",
+ "spontaneuosly", "spontaneously",
+ "spontaniously", "spontaneously",
+ "spontanuously", "spontaneously",
+ "sponteanously", "spontaneously",
+ "sponteneously", "spontaneously",
+ "sporstmanship", "sportsmanship",
+ "sportmansship", "sportsmanship",
+ "sportsmamship", "sportsmanship",
+ "sportsmenship", "sportsmanship",
+ "sprotsmanship", "sportsmanship",
+ "stakeboarding", "skateboarding",
+ "startegically", "strategically",
+ "statisitcally", "statistically",
+ "statistacally", "statistically",
+ "stereotipical", "stereotypical",
+ "stereotpyical", "stereotypical",
+ "stereotypcial", "stereotypical",
+ "stereotypeing", "stereotyping",
+ "stereotypying", "stereotyping",
+ "steriotypical", "stereotypical",
+ "steroetypical", "stereotypical",
+ "steryotypical", "stereotypical",
+ "storytellling", "storytelling",
+ "stragegically", "strategically",
+ "stragetically", "strategically",
+ "straightenend", "straightened",
+ "straitforward", "straightforward",
+ "stratagically", "strategically",
+ "stratigically", "strategically",
+ "strawberrries", "strawberries",
+ "stregnthening", "strengthening",
+ "strenghtening", "strengthening",
+ "strengthining", "strengthening",
+ "stretegically", "strategically",
+ "subcatagories", "subcategories",
+ "subconsciosly", "subconsciously",
+ "subconsciouly", "subconsciously",
+ "subconsiously", "subconsciously",
+ "subjectivelly", "subjectively",
+ "subscribtions", "subscriptions",
+ "substancially", "substantially",
+ "substanitally", "substantially",
+ "substansially", "substantially",
+ "substantiable", "substantial",
+ "substantually", "substantially",
+ "substitutents", "substitutes",
+ "successfullly", "successfully",
+ "supermarkedet", "supermarket",
+ "supermarkerts", "supermarkets",
+ "superpowereds", "superpowers",
+ "supersticious", "superstitious",
+ "superstisious", "superstitious",
+ "superstitiosi", "superstitious",
+ "superstitiuos", "superstitious",
+ "superstituous", "superstitious",
+ "suphisticated", "sophisticated",
+ "supscriptions", "subscriptions",
+ "surreptiously", "surreptitiously",
+ "survavibility", "survivability",
+ "survibability", "survivability",
+ "survivabiltiy", "survivability",
+ "survivalibity", "survivability",
+ "survivavility", "survivability",
+ "survivebility", "survivability",
+ "susbtantially", "substantially",
+ "sustainabilty", "sustainability",
+ "synchornously", "synchronously",
+ "systematicaly", "systematically",
+ "systematiclly", "systematically",
+ "techmological", "technological",
+ "technicallity", "technically",
+ "technoligical", "technological",
+ "technologicly", "technological",
+ "techonlogical", "technological",
+ "telaportation", "teleportation",
+ "teleportating", "teleportation",
+ "teleprotation", "teleportation",
+ "teliportation", "teleportation",
+ "teloportation", "teleportation",
+ "territoriella", "territorial",
+ "theoratically", "theoretically",
+ "theoritically", "theoretically",
+ "therapeutisch", "therapeutic",
+ "thereotically", "theoretically",
+ "thermodynaics", "thermodynamics",
+ "thermodynamcs", "thermodynamics",
+ "theroetically", "theoretically",
+ "thoeretically", "theoretically",
+ "tranistioning", "transitioning",
+ "transcendance", "transcendence",
+ "transcribtion", "transcription",
+ "transcripcion", "transcription",
+ "transferrring", "transferring",
+ "transformarea", "transformer",
+ "transformarem", "transformer",
+ "transformarse", "transformers",
+ "transformaton", "transformation",
+ "transformered", "transformed",
+ "transgengered", "transgendered",
+ "transisioning", "transitioning",
+ "transitionals", "transitions",
+ "transitionnal", "transitional",
+ "transitionned", "transitioned",
+ "transkription", "transcription",
+ "translyvanian", "transylvania",
+ "transmisisons", "transmissions",
+ "transmissable", "transmissible",
+ "transmisssion", "transmissions",
+ "transparantie", "transparent",
+ "transparentcy", "transparency",
+ "transplantees", "transplants",
+ "transporation", "transportation",
+ "transportaion", "transportation",
+ "transportarme", "transporter",
+ "transportarse", "transporter",
+ "transportarte", "transporter",
+ "transporteurs", "transporter",
+ "transsexuella", "transsexual",
+ "transylvannia", "transylvania",
+ "trasngendered", "transgendered",
+ "troubleshooot", "troubleshoot",
+ "udnerestimate", "underestimated",
+ "umcomfortable", "uncomfortable",
+ "umcomfortably", "uncomfortably",
+ "umpredictable", "unpredictable",
+ "unappropriate", "inappropriate",
+ "unbelievabley", "unbelievably",
+ "unbelievablly", "unbelievably",
+ "uncertaintity", "uncertainty",
+ "uncomfertable", "uncomfortable",
+ "uncomfertably", "uncomfortably",
+ "uncomfortabel", "uncomfortably",
+ "uncomforyable", "uncomfortably",
+ "uncomfrotable", "uncomfortable",
+ "uncomfrotably", "uncomfortably",
+ "uncomftorable", "uncomfortable",
+ "uncomftorably", "uncomfortably",
+ "unconcsiously", "unconsciously",
+ "unconfortable", "uncomfortable",
+ "unconfortably", "uncomfortably",
+ "unconscioulsy", "unconsciously",
+ "unconsicously", "unconsciously",
+ "unconsiderate", "inconsiderate",
+ "uncontrollabe", "uncontrollable",
+ "uncontrollaby", "uncontrollably",
+ "unconventinal", "unconventional",
+ "uncounciously", "unconsciously",
+ "uncousciously", "unconsciously",
+ "underastimate", "underestimate",
+ "underesitmate", "underestimated",
+ "underestamate", "underestimate",
+ "underestemate", "underestimate",
+ "underestiamte", "underestimated",
+ "undergratuate", "undergraduate",
+ "underhwelming", "underwhelming",
+ "underhwleming", "underwhelming",
+ "underminining", "undermining",
+ "underpowererd", "underpowered",
+ "undersetimate", "underestimate",
+ "understandble", "understandable",
+ "understandbly", "understandably",
+ "underwealming", "underwhelming",
+ "underwhemling", "underwhelming",
+ "underwhleming", "underwhelming",
+ "undoctrinated", "indoctrinated",
+ "unexpectadely", "unexpectedly",
+ "unfomfortable", "uncomfortable",
+ "unforgiveable", "unforgivable",
+ "unfortuantely", "unfortunately",
+ "unfortunantly", "unfortunately",
+ "unfortunatley", "unfortunately",
+ "unfortuneatly", "unfortunately",
+ "unfortunetely", "unfortunately",
+ "unilaterallly", "unilaterally",
+ "uninstallling", "uninstalling",
+ "unintellegent", "unintelligent",
+ "unintelligant", "unintelligent",
+ "unintensional", "unintentional",
+ "uninteristing", "uninteresting",
+ "universitites", "universities",
+ "unnecassarily", "unnecessarily",
+ "unneccesarily", "unnecessarily",
+ "unnecessairly", "unnecessarily",
+ "unnecessarely", "unnecessarily",
+ "unnecessarity", "unnecessarily",
+ "unnecesserily", "unnecessarily",
+ "unnecissarily", "unnecessarily",
+ "unnessecarily", "unnecessarily",
+ "unoperational", "nonoperational",
+ "unprecendeted", "unprecedented",
+ "unprecidented", "unprecedented",
+ "unpredecented", "unprecedented",
+ "unpredicatble", "unpredictable",
+ "unpredictible", "unpredictable",
+ "unpresedented", "unprecedented",
+ "unpridictable", "unpredictable",
+ "unprofessinal", "unprofessional",
+ "unrealistisch", "unrealistic",
+ "unreasonabley", "unreasonably",
+ "unreasonablly", "unreasonably",
+ "unrestrictred", "unrestricted",
+ "unsistainable", "unsustainable",
+ "unsubscribade", "unsubscribed",
+ "unsubscribbed", "unsubscribe",
+ "unsuccesfully", "unsuccessfully",
+ "unsuccessfull", "unsuccessful",
+ "unsucessfully", "unsuccessfully",
+ "unsuprisingly", "unsurprisingly",
+ "unsuprizingly", "unsurprisingly",
+ "unsustainible", "unsustainable",
+ "unsustianable", "unsustainable",
+ "vertification", "certification",
+ "villification", "vilification",
+ "virualization", "visualization",
+ "visualizacion", "visualization",
+ "visualizaiton", "visualization",
+ "visualizating", "visualization",
+ "vitualization", "visualization",
+ "vizualization", "visualization",
+ "volounteering", "volunteering",
+ "vulberability", "vulnerability",
+ "vulernability", "vulnerability",
+ "vulnarability", "vulnerability",
+ "vulnerabiltiy", "vulnerability",
+ "vulnurability", "vulnerability",
+ "vunlerability", "vulnerability",
+ "vurnerability", "vulnerability",
+ "weightlfiting", "weightlifting",
+ "weightlifitng", "weightlifting",
+ "weightligting", "weightlifting",
+ "weigthlifting", "weightlifting",
+ "wholeheartdly", "wholeheartedly",
+ "wholeheartedy", "wholeheartedly",
+ "wholeheartely", "wholeheartedly",
+ "wieghtlifting", "weightlifting",
+ "abberivation", "abbreviation",
+ "abberviation", "abbreviation",
+ "abbreivation", "abbreviation",
+ "abbreveation", "abbreviation",
+ "abbrievation", "abbreviation",
+ "abortificant", "abortifacient",
+ "abrreviation", "abbreviation",
+ "academcially", "academically",
+ "accedentally", "accidentally",
+ "accelarating", "accelerating",
+ "accelaration", "acceleration",
+ "acceleartion", "acceleration",
+ "acceleraptor", "accelerator",
+ "accelorating", "accelerating",
+ "accessibilty", "accessibility",
+ "accidentlaly", "accidently",
+ "accomadating", "accommodating",
+ "accomadation", "accommodation",
+ "accomodating", "accommodating",
+ "accomodation", "accommodation",
+ "accrediation", "accreditation",
+ "acculumation", "accumulation",
+ "accumalation", "accumulation",
+ "accumilation", "accumulation",
+ "acedemically", "academically",
+ "acheivements", "achievements",
+ "acknolwedged", "acknowledged",
+ "acknolwedges", "acknowledges",
+ "acknoweldged", "acknowledged",
+ "acknoweldges", "acknowledges",
+ "acknowiedged", "acknowledged",
+ "acknowladges", "acknowledges",
+ "acknowldeged", "acknowledged",
+ "acknowledget", "acknowledgement",
+ "acknowleding", "acknowledging",
+ "acknowlegded", "acknowledged",
+ "acknowlegdes", "acknowledges",
+ "ackumulation", "accumulation",
+ "acquaintaces", "acquaintances",
+ "acquaintence", "acquaintance",
+ "acquantaince", "acquaintance",
+ "acquantiance", "acquaintances",
+ "acquiantance", "acquaintances",
+ "acquiantence", "acquaintance",
+ "adknowledged", "acknowledged",
+ "adknowledges", "acknowledges",
+ "administored", "administer",
+ "adminsitered", "administered",
+ "adminstrator", "administrator",
+ "advantagious", "advantageous",
+ "advantegeous", "advantageous",
+ "adventageous", "advantageous",
+ "adventureous", "adventures",
+ "adventureres", "adventures",
+ "adventurious", "adventurous",
+ "adventuruous", "adventurous",
+ "advertisiers", "advertisers",
+ "advertisment", "advertisement",
+ "advertisters", "advertisers",
+ "advertisting", "advertising",
+ "aestheticaly", "aesthetically",
+ "aestheticlly", "aesthetically",
+ "afficianados", "aficionados",
+ "afficionados", "aficionados",
+ "afghanisthan", "afghanistan",
+ "afterhtought", "afterthought",
+ "afterthougth", "afterthought",
+ "aggressivley", "aggressively",
+ "agircultural", "agricultural",
+ "agknowledged", "acknowledged",
+ "agnosticisim", "agnosticism",
+ "agracultural", "agricultural",
+ "agriculteral", "agricultural",
+ "agriculteurs", "agriculture",
+ "agricultrual", "agricultural",
+ "agriculutral", "agricultural",
+ "agrigultural", "agricultural",
+ "agrocultural", "agricultural",
+ "allegiancies", "allegiance",
+ "alterantives", "alternatives",
+ "alternatevly", "alternately",
+ "alternatiely", "alternately",
+ "alternatieve", "alternative",
+ "alternativly", "alternatively",
+ "alternativos", "alternatives",
+ "alternatvely", "alternately",
+ "alternitives", "alternatives",
+ "altruistisch", "altruistic",
+ "amendmenters", "amendments",
+ "amohetamines", "amphetamines",
+ "ampehtamines", "amphetamines",
+ "ampethamines", "amphetamines",
+ "amphatamines", "amphetamines",
+ "amphedamines", "amphetamines",
+ "amphetamenes", "amphetamines",
+ "amphetemines", "amphetamines",
+ "amphetimines", "amphetamines",
+ "amphetmaines", "amphetamines",
+ "anecdotallly", "anecdotally",
+ "annhiliation", "annihilation",
+ "annihalition", "annihilation",
+ "annihilatron", "annihilation",
+ "annihliation", "annihilation",
+ "annilihation", "annihilation",
+ "anniversairy", "anniversary",
+ "anniversarry", "anniversary",
+ "anniversiary", "anniversary",
+ "annoucenment", "announcements",
+ "annoucnement", "announcement",
+ "announcemnet", "announcements",
+ "announcemnts", "announcements",
+ "anphetamines", "amphetamines",
+ "ansalisation", "nasalisation",
+ "ansalization", "nasalization",
+ "antaganistic", "antagonistic",
+ "antagonisitc", "antagonistic",
+ "antagonostic", "antagonist",
+ "antibioticos", "antibiotics",
+ "anticiaption", "anticipation",
+ "anticipacion", "anticipation",
+ "antisipation", "anticipation",
+ "antogonistic", "antagonistic",
+ "antrhopology", "anthropology",
+ "antrophology", "anthropology",
+ "apllications", "applications",
+ "apocalypitic", "apocalyptic",
+ "apologistics", "apologists",
+ "apologizeing", "apologizing",
+ "apostrophied", "apostrophe",
+ "apostrophies", "apostrophe",
+ "apperciation", "appreciation",
+ "applicaitons", "applications",
+ "appoitnments", "appointments",
+ "apporachable", "approachable",
+ "appraochable", "approachable",
+ "appreceating", "appreciating",
+ "appreciaters", "appreciates",
+ "appreciatied", "appreciative",
+ "appreicating", "appreciating",
+ "appreication", "appreciation",
+ "appretiation", "appreciation",
+ "appropriatin", "appropriation",
+ "appropriatly", "appropriately",
+ "appropriaton", "appropriation",
+ "approprietly", "appropriately",
+ "approstraphe", "apostrophe",
+ "approxiately", "approximately",
+ "approximatly", "approximately",
+ "approximetly", "approximately",
+ "aproximately", "approximately",
+ "aqcuaintance", "acquaintance",
+ "aqquaintance", "acquaintance",
+ "arbitrariliy", "arbitrarily",
+ "arbitrarilly", "arbitrarily",
+ "archetecture", "architecture",
+ "architechure", "architecture",
+ "architectual", "architectural",
+ "architectuur", "architecture",
+ "architecutre", "architecture",
+ "architexture", "architecture",
+ "arcitechture", "architecture",
+ "areodynamics", "aerodynamics",
+ "argicultural", "agricultural",
+ "argumentatie", "argumentative",
+ "arithmetisch", "arithmetic",
+ "armageddomon", "armageddon",
+ "arrengements", "arrangements",
+ "articifially", "artificially",
+ "artificailly", "artificially",
+ "artificiella", "artificial",
+ "artificually", "artificially",
+ "artifiically", "artificially",
+ "assasination", "assassination",
+ "assassinatin", "assassination",
+ "assissinated", "assassinated",
+ "associationg", "associating",
+ "assoications", "associations",
+ "assosiations", "associations",
+ "assosication", "assassination",
+ "assotiations", "associations",
+ "assymetrical", "asymmetrical",
+ "asthetically", "aesthetically",
+ "astranomical", "astronomical",
+ "astromonical", "astronomical",
+ "astronautlis", "astronauts",
+ "astronimical", "astronomical",
+ "astronomicly", "astronomical",
+ "athleticisim", "athleticism",
+ "atmosphereic", "atmospheric",
+ "audiobookmrs", "audiobooks",
+ "auhtenticate", "authenticate",
+ "australianas", "australians",
+ "australianos", "australians",
+ "authentisity", "authenticity",
+ "authorithies", "authorities",
+ "authoritiers", "authorities",
+ "authorizaton", "authorization",
+ "authrorities", "authorities",
+ "autochtonous", "autochthonous",
+ "autocorrrect", "autocorrect",
+ "automobilies", "automobile",
+ "automodertor", "automoderator",
+ "automonomous", "autonomous",
+ "auxilliaries", "auxiliaries",
+ "avaliability", "availability",
+ "avialability", "availability",
+ "awknowledged", "acknowledged",
+ "awknowledges", "acknowledges",
+ "awkwardsness", "awkwardness",
+ "babysittting", "babysitting",
+ "beaurocratic", "bureaucratic",
+ "beautifullly", "beautifully",
+ "belligerante", "belligerent",
+ "beuraucratic", "bureaucratic",
+ "billionairre", "billionaire",
+ "billionaries", "billionaires",
+ "billioniares", "billionaires",
+ "bioligically", "biologically",
+ "birmingharam", "birmingham",
+ "bittersweeet", "bittersweet",
+ "blamethrower", "flamethrower",
+ "blueberrries", "blueberries",
+ "blueprintcss", "blueprints",
+ "boardcasting", "broadcasting",
+ "bobybuilding", "bodybuilding",
+ "bodybuidling", "bodybuilding",
+ "bodybuilidng", "bodybuilding",
+ "bodybuliding", "bodybuilding",
+ "bodydbuilder", "bodybuilder",
+ "bombardement", "bombardment",
+ "boradcasting", "broadcasting",
+ "botivational", "motivational",
+ "brainwahsing", "brainwashing",
+ "brakethrough", "breakthrough",
+ "braodcasting", "broadcasting",
+ "brazilianese", "brazilians",
+ "brazilianess", "brazilians",
+ "breakthorugh", "breakthrough",
+ "breaktrhough", "breakthrough",
+ "breastfeedig", "breastfeeding",
+ "breastfeeing", "breastfeeding",
+ "breasttaking", "breathtaking",
+ "brianwashing", "brainwashing",
+ "broadcastors", "broadcasts",
+ "brotherhoood", "brotherhood",
+ "buearucratic", "bureaucratic",
+ "bueraucratic", "bureaucratic",
+ "bulletprooof", "bulletproof",
+ "bureaocratic", "bureaucratic",
+ "bureaucracie", "bureaucratic",
+ "bureaucracts", "bureaucrats",
+ "bureaucrates", "bureaucrats",
+ "bureuacratic", "bureaucratic",
+ "businessemen", "businessmen",
+ "cababilities", "capabilities",
+ "caclulations", "calculations",
+ "calcluations", "calculation",
+ "calcualtions", "calculations",
+ "calculationg", "calculating",
+ "calculatoare", "calculator",
+ "californains", "californian",
+ "californican", "californian",
+ "californinan", "californian",
+ "caluclations", "calculations",
+ "camouflagued", "camouflage",
+ "canceltation", "cancellation",
+ "cannibalisim", "cannibalism",
+ "canniballism", "cannibalism",
+ "cannotations", "connotations",
+ "capitalistes", "capitalists",
+ "caracterized", "characterized",
+ "carbohydrats", "carbohydrates",
+ "carbohyrdate", "carbohydrates",
+ "caricaturale", "caricature",
+ "caricaturile", "caricature",
+ "caricaturise", "caricature",
+ "caricaturize", "caricature",
+ "catastraphic", "catastrophic",
+ "catastrohpic", "catastrophic",
+ "catastrophie", "catastrophe",
+ "categoricaly", "categorically",
+ "categoriezed", "categorized",
+ "catergorized", "categorized",
+ "caterpillers", "caterpillars",
+ "catestrophic", "catastrophic",
+ "catholicisim", "catholicism",
+ "catholocisim", "catholicism",
+ "catistrophic", "catastrophic",
+ "catostraphic", "catastrophic",
+ "catostrophic", "catastrophic",
+ "catterpilars", "caterpillars",
+ "catterpillar", "caterpillar",
+ "celebratings", "celebrations",
+ "celebritites", "celebrities",
+ "celibrations", "celebrations",
+ "cententenial", "centennial",
+ "cercumstance", "circumstance",
+ "cerification", "verification",
+ "certificiate", "certificate",
+ "challengeing", "challenging",
+ "chamiponship", "championships",
+ "champinoship", "championships",
+ "championchip", "championship",
+ "championsihp", "championships",
+ "championsips", "championships",
+ "champiosnhip", "championships",
+ "champoinship", "championship",
+ "chanpionship", "championship",
+ "charactarize", "characterize",
+ "charaterized", "characterized",
+ "charismastic", "charismatic",
+ "cheerlearder", "cheerleader",
+ "cheerleeders", "cheerleaders",
+ "cheeseberger", "cheeseburger",
+ "cheeseborger", "cheeseburger",
+ "cheesebruger", "cheeseburgers",
+ "cheeseburges", "cheeseburgers",
+ "cheeseburgie", "cheeseburger",
+ "cheezeburger", "cheeseburger",
+ "chirstianity", "christianity",
+ "chocolateers", "chocolates",
+ "chrisitanity", "christianity",
+ "christainity", "christianity",
+ "christiantiy", "christianity",
+ "christinaity", "christianity",
+ "chromosomers", "chromosomes",
+ "chronologial", "chronological",
+ "chrsitianity", "christianity",
+ "cilivization", "civilizations",
+ "circulatiing", "circulating",
+ "circulationg", "circulating",
+ "circumcisied", "circumcised",
+ "circumcition", "circumcision",
+ "circumsicion", "circumcision",
+ "circumsision", "circumcision",
+ "circumsition", "circumcision",
+ "circumsizion", "circumcision",
+ "circumstanes", "circumstance",
+ "circumstanta", "circumstantial",
+ "circumstante", "circumstance",
+ "circuncision", "circumcision",
+ "circunstance", "circumstance",
+ "civiliaztion", "civilizations",
+ "civilizacion", "civilization",
+ "civilizaiton", "civilization",
+ "civilizatoin", "civilizations",
+ "civilizatons", "civilizations",
+ "civilziation", "civilizations",
+ "civizilation", "civilizations",
+ "claculations", "calculations",
+ "classificato", "classification",
+ "cockroachers", "cockroaches",
+ "coefficienct", "coefficient",
+ "coencidental", "coincidental",
+ "coincedental", "coincidental",
+ "coincidencal", "coincidental",
+ "coincidentia", "coincidental",
+ "coindidental", "coincidental",
+ "coinsidental", "coincidental",
+ "cointerpoint", "counterpoint",
+ "collaberator", "collaborate",
+ "collaboratie", "collaborate",
+ "collaboratin", "collaboration",
+ "collectivily", "collectively",
+ "collectivley", "collectively",
+ "colonialisim", "colonialism",
+ "colonizacion", "colonization",
+ "colonizators", "colonizers",
+ "colonozation", "colonization",
+ "combanations", "combinations",
+ "combonations", "combinations",
+ "comdemnation", "condemnation",
+ "comemmorates", "commemorates",
+ "comemoretion", "commemoration",
+ "comeptitions", "competitions",
+ "comfirmation", "confirmation",
+ "comfortabley", "comfortably",
+ "comfortablly", "comfortably",
+ "comissioning", "commissioning",
+ "commandemnts", "commandment",
+ "commandmants", "commandments",
+ "commandmends", "commandments",
+ "commemmorate", "commemorate",
+ "commendments", "commandments",
+ "commenteries", "commenters",
+ "commenwealth", "commonwealth",
+ "commerciales", "commercials",
+ "commerically", "commercially",
+ "comminicated", "communicated",
+ "commishioned", "commissioned",
+ "commishioner", "commissioner",
+ "commisioning", "commissioning",
+ "commissionar", "commissioner",
+ "commissionor", "commissioner",
+ "committments", "commitments",
+ "commoditites", "commodities",
+ "commomwealth", "commonwealth",
+ "commonhealth", "commonwealth",
+ "commonweatlh", "commonwealth",
+ "commonwelath", "commonwealth",
+ "communciated", "communicated",
+ "communiation", "communication",
+ "communicatie", "communicate",
+ "communicatin", "communications",
+ "communicaton", "communication",
+ "communitites", "communities",
+ "compansating", "compensating",
+ "compansation", "compensation",
+ "comparativly", "comparatively",
+ "comparisions", "comparisons",
+ "comparission", "comparisons",
+ "comparissons", "comparisons",
+ "compatablity", "compatibility",
+ "compatibiliy", "compatibility",
+ "compatibilty", "compatibility",
+ "compatiblity", "compatibility",
+ "compensacion", "compensation",
+ "compensative", "compensate",
+ "compesitions", "compositions",
+ "competetions", "competitions",
+ "competitevly", "competitively",
+ "competitiion", "competition",
+ "competitiors", "competitors",
+ "competitivly", "competitively",
+ "competitivos", "competitions",
+ "compinsating", "compensating",
+ "compinsation", "compensation",
+ "complainging", "complaining",
+ "completetion", "completion",
+ "compliations", "compilation",
+ "complicacion", "complication",
+ "complicatied", "complicate",
+ "complicaties", "complicate",
+ "complicatred", "complicate",
+ "complicatted", "complicate",
+ "complilation", "complication",
+ "complimation", "complication",
+ "complimenary", "complimentary",
+ "complimentje", "complimented",
+ "complimentry", "complimentary",
+ "complination", "complication",
+ "complitation", "complication",
+ "composistion", "compositions",
+ "compramising", "compromising",
+ "compremising", "compromising",
+ "compresssion", "compression",
+ "compromissen", "compromise",
+ "compromisses", "compromises",
+ "compromizing", "compromising",
+ "compromosing", "compromising",
+ "comptability", "compatibility",
+ "compulsivley", "compulsive",
+ "compulsorary", "compulsory",
+ "computarized", "computerized",
+ "comrpomising", "compromising",
+ "comtaminated", "contaminated",
+ "comtemporary", "contemporary",
+ "conbinations", "combinations",
+ "concatinated", "contaminated",
+ "conceivabley", "conceivably",
+ "concellation", "cancellation",
+ "concentraded", "concentrated",
+ "concentraing", "concentrating",
+ "concentraion", "concentration",
+ "concentrarte", "concentrate",
+ "concentratie", "concentrate",
+ "concentratin", "concentration",
+ "concequences", "consequences",
+ "concequently", "consequently",
+ "concersation", "conservation",
+ "concervation", "conservation",
+ "concervatism", "conservatism",
+ "concervative", "conservative",
+ "conciderable", "considerable",
+ "conciderably", "considerably",
+ "conciousness", "consciousness",
+ "conclusiones", "conclusions",
+ "conclusivley", "conclusive",
+ "condamnation", "condemnation",
+ "condemantion", "condemnation",
+ "condenmation", "condemnation",
+ "condescening", "condescending",
+ "condescenion", "condescension",
+ "conditionnal", "conditional",
+ "conditionned", "conditioned",
+ "conditionner", "conditioner",
+ "condmenation", "condemnation",
+ "condolencies", "condolences",
+ "condolensces", "condolences",
+ "condomnation", "condemnation",
+ "condradicted", "contradicted",
+ "conenctivity", "connectivity",
+ "confedential", "confidential",
+ "confederancy", "confederacy",
+ "confederatie", "confederate",
+ "confermation", "confirmation",
+ "confersation", "conservation",
+ "confessionis", "confessions",
+ "confidencial", "confidential",
+ "confidentail", "confidential",
+ "confidentaly", "confidently",
+ "confidentely", "confidently",
+ "confidentiel", "confidential",
+ "configuratin", "configurations",
+ "configuraton", "configuration",
+ "confirmacion", "confirmation",
+ "confrimation", "confirmation",
+ "confrontaion", "confrontation",
+ "congegration", "congregation",
+ "congergation", "congregation",
+ "congradulate", "congratulate",
+ "congragation", "congregation",
+ "congragulate", "congratulate",
+ "congratualte", "congratulate",
+ "congregacion", "congregation",
+ "congresional", "congressional",
+ "congresssman", "congressman",
+ "congresssmen", "congressmen",
+ "congretation", "congregation",
+ "congrigation", "congregation",
+ "conicidental", "coincidental",
+ "connatations", "connotations",
+ "connecticuit", "connecticut",
+ "connectivety", "connectivity",
+ "connetations", "connotations",
+ "connitations", "connotations",
+ "connonations", "connotations",
+ "conolization", "colonization",
+ "conpensating", "compensating",
+ "conpensation", "compensation",
+ "conpetitions", "competitions",
+ "conplimented", "complimented",
+ "conpromising", "compromising",
+ "consciouness", "consciousness",
+ "consciouslly", "consciously",
+ "consectutive", "consecutive",
+ "consecuences", "consequences",
+ "consecuentes", "consequences",
+ "consecuently", "consequently",
+ "consensuarlo", "consensual",
+ "consentrated", "concentrated",
+ "consentrates", "concentrates",
+ "conseqeunces", "consequence",
+ "consequenses", "consequences",
+ "consequental", "consequently",
+ "consequneces", "consequence",
+ "conservacion", "conservation",
+ "conservaties", "conservatives",
+ "conservativo", "conservation",
+ "conservativs", "conservatism",
+ "conservitave", "conservatives",
+ "conservitism", "conservatism",
+ "conservitive", "conservative",
+ "considerarle", "considerable",
+ "considerarte", "considerate",
+ "consideraste", "considerate",
+ "consideratie", "considerate",
+ "consideratin", "considerations",
+ "consideribly", "considerably",
+ "consilidated", "consolidated",
+ "consipracies", "conspiracies",
+ "consiquently", "consequently",
+ "consistantly", "consistently",
+ "consistencey", "consistency",
+ "consistentcy", "consistently",
+ "consitutents", "constituents",
+ "consoldiated", "consolidated",
+ "consolitated", "consolidate",
+ "consolodated", "consolidated",
+ "consoltation", "consultation",
+ "conspericies", "conspiracies",
+ "conspiracize", "conspiracies",
+ "conspiriator", "conspirator",
+ "conspiricies", "conspiracies",
+ "conspriacies", "conspiracies",
+ "consqeuences", "consequence",
+ "constinually", "continually",
+ "constitition", "constitution",
+ "constituante", "constituents",
+ "constituants", "constituents",
+ "constituates", "constitutes",
+ "constitucion", "constitution",
+ "constituient", "constitute",
+ "constituinte", "constituents",
+ "constitutiei", "constitute",
+ "constitutues", "constitute",
+ "constiutents", "constituents",
+ "constracting", "constructing",
+ "constraction", "construction",
+ "constrainsts", "constraints",
+ "construccion", "construction",
+ "construciton", "construction",
+ "constructeds", "constructs",
+ "constructief", "constructive",
+ "constructies", "constructs",
+ "constructifs", "constructs",
+ "constructiin", "constructing",
+ "constructivo", "construction",
+ "consturction", "construction",
+ "consultating", "consultation",
+ "consumerisim", "consumerism",
+ "contaiminate", "contaminate",
+ "contaminatie", "contaminated",
+ "contaminaton", "contamination",
+ "contaminents", "containment",
+ "contamporary", "contemporary",
+ "contanimated", "contaminated",
+ "contaniments", "containment",
+ "contemperary", "contemporary",
+ "contemporany", "contemporary",
+ "continentais", "continents",
+ "continential", "continental",
+ "contineously", "continuously",
+ "continiously", "continuously",
+ "continuacion", "continuation",
+ "continuating", "continuation",
+ "continuativo", "continuation",
+ "continuining", "continuing",
+ "contirbution", "contribution",
+ "contirbutors", "contributors",
+ "contiunation", "continuation",
+ "contrabution", "contribution",
+ "contraceptie", "contraceptives",
+ "contradicing", "contradicting",
+ "contradicion", "contradiction",
+ "contradicory", "contradictory",
+ "contradictie", "contradicted",
+ "contradictin", "contradiction",
+ "contradicton", "contradiction",
+ "contraticted", "contradicted",
+ "contribucion", "contribution",
+ "contribuitor", "contributor",
+ "contributers", "contributors",
+ "contributivo", "contribution",
+ "contributons", "contributors",
+ "contrictions", "contractions",
+ "contridicted", "contradicted",
+ "controlleras", "controllers",
+ "controlllers", "controllers",
+ "controverial", "controversial",
+ "controveries", "controversies",
+ "controversal", "controversial",
+ "controversey", "controversy",
+ "contructions", "contractions",
+ "conveinently", "conveniently",
+ "convencional", "conventional",
+ "conveniantly", "conveniently",
+ "converastion", "conversations",
+ "converdation", "conservation",
+ "conversacion", "conversation",
+ "conversaiton", "conversations",
+ "conversatino", "conservation",
+ "conversatism", "conservatism",
+ "conversatoin", "conversations",
+ "conversiones", "conversions",
+ "converstaion", "conversation",
+ "convertables", "convertibles",
+ "convertiable", "convertible",
+ "convertibile", "convertible",
+ "convervation", "conservation",
+ "convervatism", "conservatism",
+ "converzation", "conservation",
+ "convesration", "conservation",
+ "convienently", "conveniently",
+ "convorsation", "conversation",
+ "convseration", "conservation",
+ "coordenation", "coordination",
+ "coordiantion", "coordination",
+ "coordinacion", "coordination",
+ "coordinaters", "coordinates",
+ "coordinatior", "coordinator",
+ "coordinatore", "coordinate",
+ "coordonation", "coordination",
+ "cooridnation", "coordination",
+ "coorperation", "cooperation",
+ "coprorations", "corporations",
+ "corinthianos", "corinthians",
+ "corinthinans", "corinthians",
+ "corparations", "corporations",
+ "corperations", "corporations",
+ "corporativos", "corporations",
+ "corproations", "corporations",
+ "corrdination", "coordination",
+ "correponding", "corresponding",
+ "correposding", "corresponding",
+ "correspondes", "corresponds",
+ "correspondig", "corresponding",
+ "corresponing", "corresponding",
+ "corrisponded", "corresponded",
+ "costomizable", "customizable",
+ "costumizable", "customizable",
+ "councidental", "coincidental",
+ "counsellling", "counselling",
+ "counterfiets", "counterfeit",
+ "counterfited", "counterfeit",
+ "counterracts", "counterparts",
+ "countertraps", "counterparts",
+ "countrywides", "countryside",
+ "coutnerparts", "counterparts",
+ "coutnerpoint", "counterpoint",
+ "covnersation", "conservation",
+ "crankenstein", "frankenstein",
+ "creationisim", "creationism",
+ "creationnism", "creationism",
+ "creationnist", "creationist",
+ "creationsism", "creationism",
+ "creationsist", "creationist",
+ "creationsits", "creationists",
+ "credibillity", "credibility",
+ "crigneworthy", "cringeworthy",
+ "cringewhorty", "cringeworthy",
+ "cringeworhty", "cringeworthy",
+ "cringewrothy", "cringeworthy",
+ "cringyworthy", "cringeworthy",
+ "criticallity", "critically",
+ "criticiszing", "criticising",
+ "croporations", "corporations",
+ "crucifiction", "crucifixion",
+ "cuestionable", "questionable",
+ "culiminating", "culminating",
+ "cumulatative", "cumulative",
+ "cuntaminated", "contaminated",
+ "curcumcision", "circumcision",
+ "curcumstance", "circumstance",
+ "custamizable", "customizable",
+ "custimizable", "customizable",
+ "customizaton", "customization",
+ "customizeble", "customizable",
+ "customizible", "customizable",
+ "custumizable", "customizable",
+ "cuztomizable", "customizable",
+ "dabilitating", "debilitating",
+ "dangerousely", "dangerously",
+ "decensitized", "desensitized",
+ "deceptionist", "receptionist",
+ "declareation", "declaration",
+ "decomposeion", "decomposition",
+ "decomposited", "decomposed",
+ "decscription", "description",
+ "deffensively", "defensively",
+ "deficiancies", "deficiencies",
+ "deficiencias", "deficiencies",
+ "deficiensies", "deficiencies",
+ "definatively", "definitively",
+ "defininitely", "definitively",
+ "definitavely", "definitively",
+ "definitevely", "definitively",
+ "definitifely", "definitively",
+ "definitinely", "definitively",
+ "definititely", "definitively",
+ "definitivley", "definitively",
+ "deinitalized", "deinitialized",
+ "deinitalizes", "deinitializes",
+ "delibaretely", "deliberately",
+ "deliberatley", "deliberately",
+ "delibirately", "deliberately",
+ "delibitating", "debilitating",
+ "deliverately", "deliberately",
+ "delusionally", "delusively",
+ "demesticated", "domesticated",
+ "democracries", "democracies",
+ "democraphics", "demographics",
+ "democratisch", "democratic",
+ "demograhpics", "demographics",
+ "demogrpahics", "demographics",
+ "demonination", "denominations",
+ "demonstarted", "demonstrated",
+ "demonstartes", "demonstrates",
+ "demonstrabil", "demonstrably",
+ "demonstraion", "demonstration",
+ "demonstraits", "demonstrates",
+ "demonstrants", "demonstrates",
+ "demonstratie", "demonstrate",
+ "demonstratin", "demonstration",
+ "demonstrerat", "demonstrate",
+ "demosntrably", "demonstrably",
+ "demosntrated", "demonstrated",
+ "demosntrates", "demonstrates",
+ "demostration", "demonstration",
+ "denomenation", "denomination",
+ "denominacion", "denomination",
+ "denominatior", "denominator",
+ "denominatons", "denominations",
+ "denomonation", "denomination",
+ "deomgraphics", "demographics",
+ "depencencies", "dependencies",
+ "dependancies", "dependencies",
+ "dependencias", "dependencies",
+ "dependenices", "dependencies",
+ "dependensies", "dependencies",
+ "deperecation", "deprecation",
+ "deplacements", "replacements",
+ "deregualtion", "deregulation",
+ "deregulaiton", "deregulation",
+ "derugulation", "deregulation",
+ "describtions", "descriptions",
+ "descriminant", "discriminant",
+ "descriptivos", "descriptions",
+ "desctiptions", "descriptions",
+ "desctruction", "destruction",
+ "desencitized", "desensitized",
+ "desensatized", "desensitized",
+ "desensitived", "desensitized",
+ "desentisized", "desensitized",
+ "desentitized", "desensitized",
+ "desentizised", "desensitized",
+ "desginations", "destinations",
+ "desgustingly", "disgustingly",
+ "desitnations", "destinations",
+ "despectively", "respectively",
+ "despensaries", "dispensaries",
+ "desperatedly", "desperately",
+ "desperatelly", "desperately",
+ "desqualified", "disqualified",
+ "desregarding", "disregarding",
+ "dessertation", "dissertation",
+ "destiantions", "destinations",
+ "destinctions", "destinations",
+ "destractions", "distractions",
+ "destributors", "distributors",
+ "determinanti", "determination",
+ "determinaton", "determination",
+ "determinging", "determining",
+ "determinisic", "deterministic",
+ "determinisim", "determinism",
+ "deterministc", "deterministic",
+ "determinitic", "deterministic",
+ "detrimential", "detrimental",
+ "developement", "development",
+ "developmenet", "developments",
+ "develpoments", "developments",
+ "devolopement", "development",
+ "devolopments", "developments",
+ "diasspointed", "dissapointed",
+ "dicitonaries", "dictionaries",
+ "dictadorship", "dictatorship",
+ "dictarorship", "dictatorship",
+ "dictatorshop", "dictatorship",
+ "dictionaires", "dictionaries",
+ "didsapointed", "dissapointed",
+ "differencial", "differential",
+ "differencies", "differences",
+ "differentate", "differentiate",
+ "differnetial", "differential",
+ "difficulites", "difficulties",
+ "difficutlies", "difficulties",
+ "diffuculties", "difficulties",
+ "dimensionals", "dimensions",
+ "dimensionnal", "dimensional",
+ "dimensionsal", "dimensional",
+ "diplomatisch", "diplomatic",
+ "directionnal", "directional",
+ "disaapointed", "dissapointed",
+ "disadvandage", "disadvantaged",
+ "disadvantged", "disadvantaged",
+ "disadvantges", "disadvantages",
+ "disadvatange", "disadvantage",
+ "disadventage", "disadvantage",
+ "disagremeent", "disagreements",
+ "disapointing", "disappointing",
+ "disappearnce", "disappearance",
+ "disappearred", "disappeared",
+ "disapperaing", "disappearing",
+ "disaspointed", "dissapointed",
+ "disastisfied", "dissatisfied",
+ "disatissfied", "dissatisfied",
+ "disatvantage", "disadvantage",
+ "discertation", "dissertation",
+ "disciniplary", "disciplinary",
+ "disciplanary", "disciplinary",
+ "disciplenary", "disciplinary",
+ "disciplinare", "discipline",
+ "disciplinera", "disciplinary",
+ "disciplinery", "disciplinary",
+ "disclipinary", "disciplinary",
+ "disconencted", "disconnected",
+ "disconnectes", "disconnects",
+ "disconnectme", "disconnected",
+ "disconnectus", "disconnects",
+ "discontiuned", "discontinued",
+ "discountined", "discontinued",
+ "discreditied", "discredited",
+ "discreditted", "discredited",
+ "discriminare", "discriminate",
+ "discriminted", "discriminated",
+ "disctinction", "distinction",
+ "disctinctive", "distinctive",
+ "disctintions", "distinctions",
+ "discualified", "disqualified",
+ "discustingly", "disgustingly",
+ "disemination", "dissemination",
+ "disenchanged", "disenchanted",
+ "disengenuous", "disingenuous",
+ "disenginuous", "disingenuous",
+ "disensitized", "desensitized",
+ "disgareement", "disagreements",
+ "disgruntaled", "disgruntled",
+ "disgrunteled", "disgruntled",
+ "disguntingly", "disgustingly",
+ "disingeneous", "disingenuous",
+ "disingenious", "disingenuous",
+ "disinteresed", "disinterested",
+ "disintereted", "disinterested",
+ "dismantleing", "dismantling",
+ "disobediance", "disobedience",
+ "disobeidence", "disobedience",
+ "dispalcement", "displacement",
+ "dispapointed", "dissapointed",
+ "dispencaries", "dispensaries",
+ "dispensaires", "dispensaries",
+ "dispensarios", "dispensaries",
+ "dispensiries", "dispensaries",
+ "dispensories", "dispensaries",
+ "disqaulified", "disqualified",
+ "disqualifyed", "disqualified",
+ "disqustingly", "disgustingly",
+ "disrecpected", "disrespected",
+ "disrepsected", "disrespected",
+ "disresepcted", "disrespected",
+ "disrespecful", "disrespectful",
+ "disrespecing", "disrespecting",
+ "disrespectul", "disrespectful",
+ "disrespekted", "disrespected",
+ "disrtibution", "distributions",
+ "dissapearing", "disappearing",
+ "dissapionted", "dissapointed",
+ "dissapoimted", "dissapointed",
+ "dissapoitned", "dissapointed",
+ "dissaponited", "dissapointed",
+ "dissapoonted", "dissapointed",
+ "dissapounted", "dissapointed",
+ "dissappinted", "dissapointed",
+ "dissapponted", "dissapointed",
+ "dissastified", "dissatisfied",
+ "dissatisifed", "dissatisfied",
+ "dissatsified", "dissatisfied",
+ "dissepointed", "dissapointed",
+ "dissipointed", "dissapointed",
+ "dissobediant", "disobedient",
+ "dissobedient", "disobedient",
+ "dissopointed", "dissapointed",
+ "disspaointed", "dissapointed",
+ "dissppointed", "dissapointed",
+ "dissspointed", "dissapointed",
+ "distinations", "distinctions",
+ "distincitons", "distinctions",
+ "distingished", "distinguished",
+ "distingishes", "distinguishes",
+ "distinguised", "distinguished",
+ "distirbuting", "distributing",
+ "distirbution", "distribution",
+ "distrabution", "distribution",
+ "distribitors", "distributors",
+ "distribtuion", "distributions",
+ "distribucion", "distribution",
+ "distribuited", "distributed",
+ "distribuiton", "distributions",
+ "distribuitor", "distributor",
+ "distribusion", "distributions",
+ "distributino", "distributions",
+ "distributior", "distributor",
+ "distributons", "distributors",
+ "distributore", "distribute",
+ "distriubtion", "distributions",
+ "distrobution", "distribution",
+ "distrubances", "disturbance",
+ "distrubiting", "distributing",
+ "distrubition", "distribution",
+ "distrubitors", "distributors",
+ "distrubution", "distribution",
+ "distrubutors", "distributors",
+ "distructions", "distractions",
+ "distustingly", "disgustingly",
+ "ditactorship", "dictatorship",
+ "documenation", "documentation",
+ "documentaion", "documentation",
+ "documentaire", "documentaries",
+ "documentarse", "documentaries",
+ "documentarsi", "documentaries",
+ "domesitcated", "domesticated",
+ "domisticated", "domesticated",
+ "donesticated", "domesticated",
+ "donwloadable", "downloadable",
+ "dossapointed", "dissapointed",
+ "downlaodable", "downloadable",
+ "downloadbale", "downloadable",
+ "downloadeble", "downloadable",
+ "drankenstein", "frankenstein",
+ "dublications", "publications",
+ "dusgustingly", "disgustingly",
+ "dynamicallly", "dynamically",
+ "dyregulation", "deregulation",
+ "earthquackes", "earthquakes",
+ "earthquakers", "earthquakes",
+ "econimically", "economically",
+ "economisesti", "economists",
+ "educationnal", "educational",
+ "effectionate", "affectionate",
+ "effectivelly", "effectively",
+ "effectivenss", "effectiveness",
+ "efficienctly", "efficiency",
+ "effordlessly", "effortlessly",
+ "ejacualtions", "ejaculation",
+ "electorlytes", "electrolytes",
+ "electricrain", "electrician",
+ "electrictian", "electrician",
+ "electrobytes", "electrolytes",
+ "electrocytes", "electrolytes",
+ "electrolites", "electrolytes",
+ "electroltyes", "electrolytes",
+ "electronicas", "electronics",
+ "electronicos", "electronics",
+ "electroyltes", "electrolytes",
+ "elektrolytes", "electrolytes",
+ "eloctrolytes", "electrolytes",
+ "embarassment", "embarrassment",
+ "embarasssing", "embarassing",
+ "embarrasment", "embarrassment",
+ "embarressing", "embarrassing",
+ "embarrissing", "embarrassing",
+ "emberrassing", "embarrassing",
+ "emphetamines", "amphetamines",
+ "emprisonment", "imprisonment",
+ "encarcerated", "incarcerated",
+ "enceclopedia", "encyclopedia",
+ "enchancement", "enhancement",
+ "enchancments", "enchantments",
+ "enchantmants", "enchantments",
+ "enchentments", "enchantments",
+ "enciclopedia", "encyclopedia",
+ "enclycopedia", "encyclopedia",
+ "encorporated", "incorporated",
+ "encourageing", "encouraging",
+ "encyclapedia", "encyclopedia",
+ "encyclepedia", "encyclopedia",
+ "encyclopadia", "encyclopedia",
+ "encyclopeida", "encyclopedia",
+ "encyclopidia", "encyclopedia",
+ "encycolpedia", "encyclopedia",
+ "encyklopedia", "encyclopedia",
+ "encylcopedia", "encyclopedia",
+ "encyplopedia", "encyclopedia",
+ "endoresments", "endorsement",
+ "enemployment", "unemployment",
+ "enfringement", "infringement",
+ "enlightended", "enlightened",
+ "enlightenend", "enlightened",
+ "enlightented", "enlightened",
+ "enlightining", "enlightening",
+ "enligthening", "enlightening",
+ "entaglements", "entanglements",
+ "entartaining", "entertaining",
+ "enterpreneur", "entrepreneurs",
+ "enterprenuer", "entrepreneur",
+ "entertainted", "entertained",
+ "enthusiaists", "enthusiasts",
+ "enthusuastic", "enthusiastic",
+ "entoxication", "intoxication",
+ "entrepeneurs", "entrepreneurs",
+ "entreperneur", "entrepreneurs",
+ "entreprenaur", "entrepreneur",
+ "entrepreners", "entrepreneurs",
+ "entrepreneus", "entrepreneurs",
+ "entreprenour", "entrepreneur",
+ "entreprenure", "entrepreneurs",
+ "entreprenurs", "entrepreneurs",
+ "entrepreuner", "entrepreneurs",
+ "entretaining", "entertaining",
+ "enviormental", "environmental",
+ "enviornments", "environments",
+ "enviromental", "environmental",
+ "environemnts", "environments",
+ "environmentl", "environmentally",
+ "environmetal", "environmental",
+ "envrionments", "environments",
+ "errorneously", "erroneously",
+ "establishmet", "establishments",
+ "evelutionary", "evolutionary",
+ "exagerrating", "exaggerating",
+ "exaggarating", "exaggerating",
+ "exaggaration", "exaggeration",
+ "exaggeratted", "exaggerated",
+ "exaggurating", "exaggerating",
+ "exagguration", "exaggeration",
+ "exceptionaly", "exceptionally",
+ "exceptionnal", "exceptional",
+ "exclusiveity", "exclusivity",
+ "exclusivelly", "exclusively",
+ "exclusivitiy", "exclusivity",
+ "excorciating", "excruciating",
+ "excrusiating", "excruciating",
+ "excurciating", "excruciating",
+ "exectuioners", "executioner",
+ "executioneer", "executioner",
+ "executionees", "executions",
+ "executioness", "executions",
+ "executionier", "executioner",
+ "executionner", "executioner",
+ "exeggerating", "exaggerating",
+ "exeggeration", "exaggeration",
+ "expeditonary", "expeditionary",
+ "expendatures", "expenditures",
+ "expendetures", "expenditures",
+ "expentitures", "expenditures",
+ "experamental", "experimental",
+ "expereincing", "experiencing",
+ "experemental", "experimental",
+ "experiancing", "experiencing",
+ "experiemntal", "experimental",
+ "experiemnted", "experimented",
+ "experimantal", "experimental",
+ "experimentan", "experimentation",
+ "experimentes", "experiments",
+ "experimentle", "experimented",
+ "experimentos", "experiments",
+ "experimentul", "experimental",
+ "expidentures", "expenditures",
+ "expierencing", "experiencing",
+ "expiremental", "experimental",
+ "expiremented", "experimented",
+ "explaination", "explanation",
+ "explenations", "explanations",
+ "expliotation", "exploitation",
+ "exploitaiton", "exploitation",
+ "exploitating", "exploitation",
+ "exploititive", "exploitative",
+ "explortation", "exploitation",
+ "explotiation", "exploitation",
+ "explotiative", "exploitative",
+ "expolitation", "exploitation",
+ "expolitative", "exploitative",
+ "exponentialy", "exponentially",
+ "expropiation", "expropriation",
+ "extensivelly", "extensively",
+ "extradiction", "extradition",
+ "extraordiary", "extraordinary",
+ "extraordinay", "extraordinary",
+ "extrapolerat", "extrapolate",
+ "extrapoloate", "extrapolate",
+ "extremistisk", "extremists",
+ "extrordinary", "extraordinary",
+ "extruciating", "excruciating",
+ "facilitatile", "facilitate",
+ "fahrenheight", "fahrenheit",
+ "falmethrower", "flamethrower",
+ "familiarlize", "familiarize",
+ "fanslaughter", "manslaughter",
+ "fantasticaly", "fantastically",
+ "fantasticlly", "fantastically",
+ "fashionalble", "fashionable",
+ "fermantation", "fermentation",
+ "fermentacion", "fermentation",
+ "fermentaiton", "fermentation",
+ "fermentating", "fermentation",
+ "fermintation", "fermentation",
+ "fictionaries", "dictionaries",
+ "figuartively", "figuratively",
+ "figuratevely", "figuratively",
+ "figurativley", "figuratively",
+ "figuretively", "figuratively",
+ "figuritively", "figuratively",
+ "fingerpoints", "fingerprints",
+ "firefigthers", "firefighters",
+ "flamethorwer", "flamethrower",
+ "flametrhower", "flamethrower",
+ "flanethrower", "flamethrower",
+ "flexibillity", "flexibility",
+ "flourishment", "flourishing",
+ "fluctiations", "fluctuations",
+ "flucutations", "fluctuations",
+ "fluxtuations", "fluctuations",
+ "forgivenness", "forgiveness",
+ "fortunatelly", "fortunately",
+ "framethrower", "flamethrower",
+ "frankenstain", "frankenstein",
+ "frankensteen", "frankenstein",
+ "frankenstine", "frankenstein",
+ "frankinstein", "frankenstein",
+ "frementation", "fermentation",
+ "friendzonded", "friendzoned",
+ "friendzonned", "friendzoned",
+ "friendzowned", "friendzoned",
+ "fringeworthy", "cringeworthy",
+ "fronkenstein", "frankenstein",
+ "fruitsations", "frustrations",
+ "frustrastion", "frustrations",
+ "fucntionally", "functionally",
+ "funcitonally", "functionally",
+ "functionable", "functional",
+ "functionaliy", "functionally",
+ "functionalty", "functionality",
+ "functionlity", "functionality",
+ "functionning", "functioning",
+ "fundamentais", "fundamentals",
+ "fundamentalt", "fundamentalist",
+ "fundamentaly", "fundamentally",
+ "fundemantals", "fundamentals",
+ "fundementals", "fundamentals",
+ "fundimentals", "fundamentals",
+ "furstrations", "frustrations",
+ "futuristisch", "futuristic",
+ "fwankenstein", "frankenstein",
+ "geneological", "genealogical",
+ "generacional", "generational",
+ "generalizare", "generalize",
+ "generalizate", "generalize",
+ "generelizing", "generalizing",
+ "geograhpical", "geographical",
+ "geographicly", "geographical",
+ "geographisch", "geographic",
+ "geogrpahical", "geographical",
+ "goegraphical", "geographical",
+ "governemntal", "governmental",
+ "governmently", "governmental",
+ "grammaticaal", "grammatical",
+ "grammaticaly", "grammatically",
+ "grandchilden", "grandchildren",
+ "grandchilder", "grandchildren",
+ "grandchilren", "grandchildren",
+ "grassrooters", "grassroots",
+ "gringeworthy", "cringeworthy",
+ "guantanameow", "guantanamo",
+ "guantanamero", "guantanamo",
+ "hallucinatin", "hallucinations",
+ "hallucinaton", "hallucination",
+ "handwritting", "handwriting",
+ "harrassments", "harassments",
+ "headqaurters", "headquarters",
+ "headquatered", "headquartered",
+ "healthercare", "healthcare",
+ "heavywieghts", "heavyweight",
+ "helicopteros", "helicopters",
+ "hererosexual", "heterosexual",
+ "heretosexual", "heterosexual",
+ "heteresexual", "heterosexual",
+ "hetreosexual", "heterosexual",
+ "highligthing", "highlighting",
+ "hipocritical", "hypocritical",
+ "hipothetical", "hypothetical",
+ "histarically", "historically",
+ "histerically", "historically",
+ "historicians", "historians",
+ "homogeneized", "homogenized",
+ "homogenenous", "homogeneous",
+ "homosexuales", "homosexuals",
+ "homosexualiy", "homosexuality",
+ "homosexualls", "homosexuals",
+ "homosexualty", "homosexuality",
+ "homosexuella", "homosexual",
+ "hopsitalized", "hospitalized",
+ "horisontally", "horizontally",
+ "horizantally", "horizontally",
+ "horiztonally", "horizontally",
+ "horozontally", "horizontally",
+ "hospitallity", "hospitality",
+ "hospitilized", "hospitalized",
+ "hospitolized", "hospitalized",
+ "hosptialized", "hospitalized",
+ "humanitarien", "humanitarian",
+ "humanitarion", "humanitarian",
+ "humanitatian", "humanitarian",
+ "humaniterian", "humanitarian",
+ "humantiarian", "humanitarian",
+ "huminatarian", "humanitarian",
+ "hurricanefps", "hurricanes",
+ "hyopthetical", "hypothetical",
+ "hypathetical", "hypothetical",
+ "hypertrophey", "hypertrophy",
+ "hypethetical", "hypothetical",
+ "hypocrticial", "hypocritical",
+ "hypocrytical", "hypocritical",
+ "hypotehtical", "hypothetical",
+ "hypotethical", "hypothetical",
+ "hypotherical", "hypothetical",
+ "hypotheticly", "hypothetical",
+ "hystarically", "hysterically",
+ "hystorically", "hysterically",
+ "idealistisch", "idealistic",
+ "identificato", "identification",
+ "identifierad", "identified",
+ "identifieras", "identifies",
+ "identifyable", "identifiable",
+ "ideologicaly", "ideologically",
+ "idiosyncracy", "idiosyncrasy",
+ "illegetimate", "illegitimate",
+ "illegitamate", "illegitimate",
+ "illegitamite", "illegitimate",
+ "illegitemate", "illegitimate",
+ "illegitimite", "illegitimate",
+ "illigetimate", "illegitimate",
+ "illigitemate", "illegitimate",
+ "illistration", "illustration",
+ "illsutration", "illustrations",
+ "illustartion", "illustration",
+ "illustraitor", "illustrator",
+ "illustraties", "illustrate",
+ "illustratior", "illustrator",
+ "imcompatible", "incompatible",
+ "imcompetence", "incompetence",
+ "imexperience", "inexperience",
+ "immediatelly", "immediately",
+ "immortallity", "immortality",
+ "imperialfist", "imperialist",
+ "imperialisim", "imperialism",
+ "imperialstic", "imperialist",
+ "implamenting", "implementing",
+ "implausibile", "implausible",
+ "implecations", "implications",
+ "implementase", "implements",
+ "implementasi", "implements",
+ "implementato", "implementation",
+ "implentation", "implementation",
+ "implimenting", "implementing",
+ "imporvements", "improvements",
+ "impossibilty", "impossibility",
+ "impossiblely", "impossibly",
+ "impossiblity", "impossibly",
+ "impovershied", "impoverished",
+ "impoversihed", "impoverished",
+ "imprefection", "imperfections",
+ "improsonment", "imprisonment",
+ "improviserad", "improvised",
+ "imrpovements", "improvements",
+ "imtimidating", "intimidating",
+ "imtimidation", "intimidation",
+ "inaccesibles", "inaccessible",
+ "inaccessable", "inaccessible",
+ "inaccessbile", "inaccessible",
+ "inaccurasies", "inaccuracies",
+ "inaccuraties", "inaccuracies",
+ "inaccuricies", "inaccuracies",
+ "inacuraccies", "inaccuracies",
+ "inadvertenly", "inadvertently",
+ "inappropiate", "inappropriate",
+ "inapproprate", "inappropriate",
+ "inappropriae", "inappropriately",
+ "inappropriet", "inappropriately",
+ "inattractive", "unattractive",
+ "inbelievable", "unbelievable",
+ "incarcelated", "incarcerated",
+ "incarcirated", "incarcerated",
+ "incarserated", "incarcerated",
+ "incedentally", "incidentally",
+ "incentiveise", "incentives",
+ "incestigator", "investigator",
+ "incomaptible", "incompatible",
+ "incomparible", "incompatible",
+ "incompatable", "incompatible",
+ "incompatibil", "incompatible",
+ "incompetance", "incompetence",
+ "incompetente", "incompetence",
+ "incompitable", "incompatible",
+ "incomptetent", "incompetent",
+ "inconcistent", "inconsistent",
+ "inconsistant", "inconsistent",
+ "inconsistecy", "inconsistency",
+ "inconsisteny", "inconsistency",
+ "inconveinent", "inconvenient",
+ "inconveniant", "inconvenient",
+ "inconveniece", "inconvenience",
+ "inconvenince", "inconvenience",
+ "inconvienent", "inconvenient",
+ "incorparated", "incorporated",
+ "incorperated", "incorporated",
+ "incorportaed", "incorporated",
+ "incorportate", "incorporate",
+ "incrediblely", "incredibly",
+ "incrementers", "increments",
+ "incremential", "incremental",
+ "indefinately", "indefinitely",
+ "indefineable", "undefinable",
+ "indefinetely", "indefinitely",
+ "indefinitive", "indefinite",
+ "indefinitley", "indefinitely",
+ "indefintiely", "indefinitely",
+ "indepedantly", "independently",
+ "indepencence", "independence",
+ "independance", "independence",
+ "independante", "independents",
+ "independenet", "independents",
+ "independenly", "independently",
+ "independense", "independents",
+ "independente", "independence",
+ "independetly", "independently",
+ "indepentents", "independents",
+ "indetifiable", "identifiable",
+ "indianaoplis", "indianapolis",
+ "indianopolis", "indianapolis",
+ "indicentally", "incidentally",
+ "indifferance", "indifference",
+ "indifferente", "indifference",
+ "indiffernece", "indifference",
+ "indimidating", "intimidating",
+ "indimidation", "intimidation",
+ "indipendence", "independence",
+ "indisputible", "indisputable",
+ "indisputibly", "indisputably",
+ "individuales", "individuals",
+ "individualty", "individuality",
+ "individuella", "individual",
+ "indiviudally", "individually",
+ "indivudually", "individually",
+ "indpendently", "independently",
+ "indroduction", "introduction",
+ "indroductory", "introductory",
+ "industriella", "industrial",
+ "industrijske", "industries",
+ "inefficienct", "inefficient",
+ "inefficienty", "inefficiently",
+ "inevitablely", "inevitably",
+ "inevitablity", "inevitably",
+ "inevititably", "inevitably",
+ "inexblicably", "inexplicably",
+ "inexpectedly", "unexpectedly",
+ "inexpereince", "inexperience",
+ "inexperiance", "inexperience",
+ "inexperieced", "inexperienced",
+ "inexperiened", "inexperienced",
+ "inexperiente", "inexperience",
+ "inexpierence", "inexperienced",
+ "inexplicabil", "inexplicably",
+ "inexplicibly", "inexplicably",
+ "infalability", "infallibility",
+ "infilitrated", "infiltrated",
+ "infiltraitor", "infiltrator",
+ "infiltratior", "infiltrator",
+ "infiltratred", "infiltrate",
+ "influenceing", "influencing",
+ "infogrpahics", "infographic",
+ "inforgivable", "unforgivable",
+ "infrantryman", "infantryman",
+ "infridgement", "infringement",
+ "infrignement", "infringement",
+ "ingestigator", "investigator",
+ "ingredientes", "ingredients",
+ "ingreediants", "ingredients",
+ "ininterested", "uninterested",
+ "initalizable", "initializable",
+ "inkompatible", "incompatible",
+ "inkompetence", "incompetence",
+ "inkonsistent", "inconsistent",
+ "inlightening", "enlightening",
+ "innersection", "intersection",
+ "innerstellar", "interstellar",
+ "inpenetrable", "impenetrable",
+ "inplementing", "implementing",
+ "inplications", "implications",
+ "inpoverished", "impoverished",
+ "inprisonment", "imprisonment",
+ "inproductive", "unproductive",
+ "inprovements", "improvements",
+ "inresponsive", "unresponsive",
+ "insentivised", "insensitive",
+ "insentivises", "insensitive",
+ "insignifiant", "insignificant",
+ "insignificat", "insignificant",
+ "insinuationg", "insinuating",
+ "instabillity", "instability",
+ "instalaltion", "installations",
+ "installatons", "installations",
+ "installatron", "installation",
+ "instantaneos", "instantaneous",
+ "instantaneus", "instantaneous",
+ "instantanous", "instantaneous",
+ "instinctivly", "instinctively",
+ "institutuion", "institution",
+ "instramental", "instrumental",
+ "instrcutions", "instruction",
+ "instrucitons", "instruction",
+ "instructiosn", "instruction",
+ "instructores", "instructors",
+ "instrumentos", "instruments",
+ "instrumentul", "instrumental",
+ "insturmental", "instrumental",
+ "instutitions", "institutions",
+ "insuccessful", "unsuccessful",
+ "insufficiant", "insufficient",
+ "insuffucient", "insufficient",
+ "insuspecting", "unsuspecting",
+ "intaxication", "intoxication",
+ "intelelctual", "intellectuals",
+ "intellectals", "intellectuals",
+ "intellectaul", "intellectuals",
+ "intellectuel", "intellectual",
+ "intellecutal", "intellectual",
+ "intelligance", "intelligence",
+ "intelligenly", "intelligently",
+ "intelligente", "intelligence",
+ "intelligenty", "intelligently",
+ "intelligient", "intelligent",
+ "intenational", "international",
+ "intentionnal", "intentional",
+ "intepretator", "interpretor",
+ "interatellar", "interstellar",
+ "interational", "international",
+ "intercection", "interception",
+ "intercepcion", "interception",
+ "interceptons", "interceptions",
+ "intereaction", "intersection",
+ "interections", "interactions",
+ "interersting", "interpreting",
+ "interesction", "intersection",
+ "interestigly", "interestingly",
+ "interestinly", "interestingly",
+ "interferance", "interference",
+ "interfereing", "interfering",
+ "interferisce", "interferes",
+ "interferisse", "interferes",
+ "interferring", "interfering",
+ "intergration", "integration",
+ "interlectual", "intellectual",
+ "intermediare", "intermediate",
+ "intermediete", "intermediate",
+ "intermettent", "intermittent",
+ "intermideate", "intermediate",
+ "intermidiate", "intermediate",
+ "internatinal", "international",
+ "internationl", "international",
+ "internations", "interactions",
+ "internediate", "intermediate",
+ "internelized", "internalized",
+ "internilized", "internalized",
+ "interperters", "interpreter",
+ "interperting", "interpreting",
+ "interprating", "interpreting",
+ "interpretare", "interpreter",
+ "interpretato", "interpretation",
+ "interpreteer", "interpreter",
+ "interpretier", "interpreter",
+ "interpretion", "interpreting",
+ "interpretter", "interpreter",
+ "interpriting", "interpreting",
+ "interraccial", "interracial",
+ "interractial", "interracial",
+ "interrogatin", "interrogation",
+ "interrumping", "interrupting",
+ "interrupteds", "interrupts",
+ "interruptors", "interrupts",
+ "interseccion", "intersection",
+ "interseciton", "intersections",
+ "interseption", "interception",
+ "intersetllar", "interstellar",
+ "interstallar", "interstellar",
+ "interstaller", "interstellar",
+ "intersteller", "interstellar",
+ "interstellor", "interstellar",
+ "intertaining", "entertaining",
+ "intertwinded", "intertwined",
+ "intertwinned", "intertwined",
+ "interveiwing", "interviewing",
+ "intervencion", "intervention",
+ "interveneing", "intervening",
+ "intervension", "intervention",
+ "interviening", "interviewing",
+ "intidimation", "intimidation",
+ "intillectual", "intellectual",
+ "intimidacion", "intimidation",
+ "intimidative", "intimidate",
+ "intimitading", "intimidating",
+ "intimitating", "intimidating",
+ "intimitation", "intimidation",
+ "intorduction", "introduction",
+ "intorductory", "introductory",
+ "intoxicacion", "intoxication",
+ "intoxination", "intoxication",
+ "intrepreting", "interpreting",
+ "intrinsicaly", "intrinsically",
+ "introdiction", "introduction",
+ "introduccion", "introduction",
+ "introduceras", "introduces",
+ "introduceres", "introduces",
+ "introduciton", "introduction",
+ "introductary", "introductory",
+ "introducting", "introduction",
+ "introductury", "introductory",
+ "introduktion", "introduction",
+ "introspectin", "introspection",
+ "intruduction", "introduction",
+ "intruductory", "introductory",
+ "intsrumental", "instrumental",
+ "intuitivelly", "intuitively",
+ "inturrupting", "interrupting",
+ "invervention", "intervention",
+ "investagated", "investigated",
+ "investagator", "investigator",
+ "investegated", "investigated",
+ "investegator", "investigator",
+ "investigaron", "investigator",
+ "investigater", "investigator",
+ "investigatie", "investigative",
+ "investigatin", "investigation",
+ "investigatio", "investigator",
+ "investigaton", "investigation",
+ "investingate", "investigate",
+ "investogator", "investigator",
+ "invicibility", "invisibility",
+ "invididually", "individually",
+ "invisibiltiy", "invisibility",
+ "invisilibity", "invisibility",
+ "invisivility", "invisibility",
+ "invlunerable", "invulnerable",
+ "involnerable", "invulnerable",
+ "involuntairy", "involuntary",
+ "involuntarly", "involuntary",
+ "invonvenient", "inconvenient",
+ "invulenrable", "invulnerable",
+ "invulernable", "invulnerable",
+ "invulnarable", "invulnerable",
+ "invulnerbale", "invulnerable",
+ "invulnurable", "invulnerable",
+ "invulverable", "invulnerable",
+ "invunlerable", "invulnerable",
+ "invurnerable", "invulnerable",
+ "irrationably", "irrationally",
+ "irrationatly", "irrationally",
+ "irrationella", "irrational",
+ "irreplacable", "irreplaceable",
+ "irresistable", "irresistible",
+ "irresistably", "irresistibly",
+ "irrespecitve", "irrespective",
+ "irresponsble", "irresponsible",
+ "irresponsibe", "irresponsible",
+ "irreverisble", "irreversible",
+ "irreversebly", "irreversible",
+ "irreversibel", "irreversible",
+ "irrevirsible", "irreversible",
+ "irrispective", "irrespective",
+ "irriversible", "irreversible",
+ "isdefinitely", "indefinitely",
+ "isntallation", "installation",
+ "isntrumental", "instrumental",
+ "jackonsville", "jacksonville",
+ "jounralistic", "journalistic",
+ "jouranlistic", "journalistic",
+ "journalisitc", "journalistic",
+ "journalistes", "journalists",
+ "judgementals", "judgements",
+ "juggernaunts", "juggernaut",
+ "juridisction", "jurisdictions",
+ "jurisdiccion", "jurisdiction",
+ "jurisdiciton", "jurisdiction",
+ "jurisdiktion", "jurisdiction",
+ "jurisfiction", "jurisdiction",
+ "jurisidction", "jurisdiction",
+ "juristiction", "jurisdiction",
+ "jursidiction", "jurisdiction",
+ "jusridiction", "jurisdiction",
+ "justificatin", "justifications",
+ "katastrophic", "catastrophic",
+ "kidnergarten", "kindergarten",
+ "kindergarden", "kindergarten",
+ "kingergarten", "kindergarten",
+ "kintergarten", "kindergarten",
+ "knolwedgable", "knowledgable",
+ "knoweldgable", "knowledgable",
+ "knowladgable", "knowledgable",
+ "knowldegable", "knowledgable",
+ "knowldgeable", "knowledgable",
+ "knowleagable", "knowledgable",
+ "knowledagble", "knowledgable",
+ "knowledeable", "knowledgable",
+ "knowledgabel", "knowledgable",
+ "knowledgeble", "knowledgeable",
+ "knowledgebly", "knowledgable",
+ "knowledgible", "knowledgable",
+ "knowlegdable", "knowledgable",
+ "knowlegeable", "knowledgeable",
+ "knwoledgable", "knowledgable",
+ "kolonization", "colonization",
+ "kombinations", "combinations",
+ "kommissioner", "commissioner",
+ "kompensation", "compensation",
+ "konfidential", "confidential",
+ "konfirmation", "confirmation",
+ "kongregation", "congregation",
+ "konservatism", "conservatism",
+ "konservative", "conservative",
+ "konsultation", "consultation",
+ "konversation", "conversation",
+ "koordination", "coordination",
+ "krankenstein", "frankenstein",
+ "leaglization", "legalization",
+ "legalizacion", "legalization",
+ "legalizaiton", "legalization",
+ "legendariske", "legendaries",
+ "legimitately", "legitimately",
+ "legislatiors", "legislators",
+ "legistration", "registration",
+ "legitamately", "legitimately",
+ "legitamitely", "legitimately",
+ "legitemately", "legitimately",
+ "legitimatley", "legitimately",
+ "legitimitely", "legitimately",
+ "liberatrians", "libertarians",
+ "libertarains", "libertarians",
+ "libertariens", "libertarians",
+ "libertaryans", "libertarians",
+ "libertatians", "libertarians",
+ "liberterians", "libertarians",
+ "libretarians", "libertarians",
+ "lighthearded", "lighthearted",
+ "linguisticas", "linguistics",
+ "linguisticos", "linguistics",
+ "linguistisch", "linguistics",
+ "litllefinger", "littlefinger",
+ "littelfinger", "littlefinger",
+ "litterfinger", "littlefinger",
+ "littiefinger", "littlefinger",
+ "littlefigner", "littlefinger",
+ "littlefinder", "littlefinger",
+ "littlepinger", "littlefinger",
+ "lnowledgable", "knowledgable",
+ "longitudonal", "longitudinal",
+ "madturbating", "masturbating",
+ "madturbation", "masturbation",
+ "magnificient", "magnificent",
+ "maintainance", "maintenance",
+ "maintainence", "maintenance",
+ "maintenaince", "maintenance",
+ "malfucntions", "malfunction",
+ "manafactured", "manufactured",
+ "manafacturer", "manufacturer",
+ "manafactures", "manufactures",
+ "manifactured", "manufactured",
+ "manifacturer", "manufacturer",
+ "manifactures", "manufactures",
+ "manifestaion", "manifestation",
+ "manifestanti", "manifestation",
+ "manipluating", "manipulating",
+ "manipluation", "manipulation",
+ "manipualting", "manipulating",
+ "manipualtion", "manipulation",
+ "manipualtive", "manipulative",
+ "manipulacion", "manipulation",
+ "manipulitive", "manipulative",
+ "maniuplating", "manipulating",
+ "maniuplation", "manipulation",
+ "maniuplative", "manipulative",
+ "manouverable", "maneuverable",
+ "mansalughter", "manslaughter",
+ "manslaugther", "manslaughter",
+ "mansluaghter", "manslaughter",
+ "manufactered", "manufactured",
+ "manufacterer", "manufacturer",
+ "manufacteres", "manufactures",
+ "manufacteurs", "manufactures",
+ "manufactored", "manufactured",
+ "manufactorer", "manufacturer",
+ "manufactores", "manufactures",
+ "manufactuers", "manufacturers",
+ "manufactuing", "manufacturing",
+ "manufacturas", "manufactures",
+ "manufacturor", "manufacturer",
+ "manufactuter", "manufacture",
+ "manufacuters", "manufactures",
+ "manufacutred", "manufacture",
+ "manufacutres", "manufactures",
+ "manufaturing", "manufacturing",
+ "manupilating", "manipulating",
+ "manupulating", "manipulating",
+ "manupulation", "manipulation",
+ "manupulative", "manipulative",
+ "marchmallows", "marshmallows",
+ "marganilized", "marginalized",
+ "margenalized", "marginalized",
+ "marginilized", "marginalized",
+ "marhsmallows", "marshmallows",
+ "marshamllows", "marshmallows",
+ "marshmallons", "marshmallows",
+ "masoginistic", "misogynistic",
+ "masogynistic", "misogynistic",
+ "massachusets", "massachusetts",
+ "massachustts", "massachusetts",
+ "masterbation", "masturbation",
+ "masterpeices", "masterpiece",
+ "mastrubating", "masturbating",
+ "mastrubation", "masturbation",
+ "mastubration", "masturbation",
+ "masturabting", "masturbating",
+ "masturabtion", "masturbation",
+ "masturbacion", "masturbation",
+ "masturbaited", "masturbated",
+ "masturbathon", "masturbation",
+ "masturbsting", "masturbating",
+ "masturdating", "masturbating",
+ "mastutbation", "masturbation",
+ "mataphorical", "metaphorical",
+ "mataphysical", "metaphysical",
+ "matchmakeing", "matchmaking",
+ "mathemathics", "mathematics",
+ "mathematican", "mathematician",
+ "mathematicas", "mathematics",
+ "mathematicks", "mathematics",
+ "mathematicly", "mathematical",
+ "mathematisch", "mathematics",
+ "mathemetical", "mathematical",
+ "matheticians", "mathematicians",
+ "mathimatical", "mathematical",
+ "mathmatician", "mathematician",
+ "mecahnically", "mechanically",
+ "mechancially", "mechanically",
+ "meditaciones", "medications",
+ "mediteranean", "mediterranean",
+ "mediterraean", "mediterranean",
+ "mediterranen", "mediterranean",
+ "memerization", "memorization",
+ "memorizacion", "memorization",
+ "memorozation", "memorization",
+ "metalurgical", "metallurgical",
+ "metaphisical", "metaphysical",
+ "metaphoricly", "metaphorical",
+ "metaphsyical", "metaphysical",
+ "metaphyiscal", "metaphysical",
+ "metaphyscial", "metaphysical",
+ "metaphysisch", "metaphysics",
+ "metephorical", "metaphorical",
+ "metephysical", "metaphysical",
+ "meterologist", "meteorologist",
+ "meterosexual", "heterosexual",
+ "methaporical", "metaphorical",
+ "methematical", "mathematical",
+ "metiphorical", "metaphorical",
+ "metophorical", "metaphorical",
+ "metorpolitan", "metropolitan",
+ "metrololitan", "metropolitan",
+ "metropilitan", "metropolitan",
+ "metroploitan", "metropolitan",
+ "metropolians", "metropolis",
+ "metropoliten", "metropolitan",
+ "metropolitin", "metropolitan",
+ "metropoliton", "metropolitan",
+ "microcentres", "microcenter",
+ "microphonies", "microphones",
+ "microscophic", "microscopic",
+ "microscopice", "microscope",
+ "microscoptic", "microscopic",
+ "midfieldiers", "midfielders",
+ "millenialism", "millennialism",
+ "millionairre", "millionaire",
+ "millionaries", "millionaires",
+ "millioniares", "millionaires",
+ "minimalisitc", "minimalist",
+ "minimalisity", "minimalist",
+ "mininterpret", "misinterpret",
+ "minipulating", "manipulating",
+ "minipulation", "manipulation",
+ "minipulative", "manipulative",
+ "miracilously", "miraculously",
+ "miracurously", "miraculous",
+ "miscarraiges", "miscarriage",
+ "miscelaneous", "miscellaneous",
+ "miscellanous", "miscellaneous",
+ "mischievious", "mischievous",
+ "misdameanors", "misdemeanors",
+ "misdeamenors", "misdemeanor",
+ "misfourtunes", "misfortunes",
+ "misgoynistic", "misogynistic",
+ "misinterpert", "misinterpret",
+ "misinterpred", "misinterpreted",
+ "misinterprit", "misinterpreting",
+ "misinterpted", "misinterpret",
+ "misintrepret", "misinterpret",
+ "misisonaries", "missionaries",
+ "misoganistic", "misogynistic",
+ "misogenistic", "misogynistic",
+ "misoginystic", "misogynistic",
+ "misognyistic", "misogynistic",
+ "misogonistic", "misogynistic",
+ "misogynisitc", "misogynistic",
+ "misogynsitic", "misogynistic",
+ "misogynystic", "misogynistic",
+ "missionaires", "missionaries",
+ "mississipppi", "mississippi",
+ "misspellling", "misspelling",
+ "misteriously", "mysteriously",
+ "misundersood", "misunderstood",
+ "misunderstod", "misunderstood",
+ "misygonistic", "misogynistic",
+ "modificacion", "modification",
+ "modificaiton", "modification",
+ "modificatons", "modifications",
+ "modifikation", "modification",
+ "modivational", "motivational",
+ "moisterizing", "moisturizing",
+ "moistorizing", "moisturizing",
+ "moisutrizing", "moisturizing",
+ "momentarilly", "momentarily",
+ "monolithisch", "monolithic",
+ "mositurizing", "moisturizing",
+ "motherbaords", "motherboards",
+ "motherborads", "motherboards",
+ "motivacional", "motivational",
+ "motovational", "motivational",
+ "mousturizing", "moisturizing",
+ "muktitasking", "multitasking",
+ "mulittasking", "multitasking",
+ "multinatinal", "multinational",
+ "multitaksing", "multitasking",
+ "munipulative", "manipulative",
+ "mutlitasking", "multitasking",
+ "mysoganistic", "misogynistic",
+ "mysogenistic", "misogynistic",
+ "mysogonistic", "misogynistic",
+ "mysterioulsy", "mysteriously",
+ "nacionalists", "nationalists",
+ "narcisisstic", "narcissistic",
+ "narcissictic", "narcissistic",
+ "narcissisism", "narcissism",
+ "narcissisist", "narcissist",
+ "narcissisitc", "narcissist",
+ "narcississts", "narcissist",
+ "narssicistic", "narcissistic",
+ "natioanlists", "nationalists",
+ "nationalisic", "nationalistic",
+ "nationalisim", "nationalism",
+ "nationalistc", "nationalistic",
+ "nationalites", "nationalist",
+ "nationalitic", "nationalistic",
+ "nationalitys", "nationalist",
+ "nationallity", "nationally",
+ "nationalsits", "nationalists",
+ "nationalties", "nationalist",
+ "nazionalists", "nationalists",
+ "neccessarily", "necessarily",
+ "neccessities", "necessities",
+ "necessarilly", "necessarily",
+ "necessitites", "necessities",
+ "neckbearders", "neckbeards",
+ "neckbeardese", "neckbeards",
+ "neckbeardest", "neckbeards",
+ "neckbeardies", "neckbeards",
+ "neckbeardius", "neckbeards",
+ "negociations", "negotiations",
+ "negoitations", "negotiations",
+ "negotiatians", "negotiations",
+ "negotiatiing", "negotiating",
+ "negotiationg", "negotiating",
+ "negotiatiors", "negotiations",
+ "neigbhorhood", "neighborhoods",
+ "neigbourhood", "neighbourhood",
+ "neighboorhod", "neighbourhood",
+ "neighborhing", "neighboring",
+ "neighborhods", "neighborhoods",
+ "neighbourghs", "neighbours",
+ "neighbourhod", "neighbourhood",
+ "neighbourood", "neighbourhood",
+ "neighbrohood", "neighborhoods",
+ "neighourhood", "neighborhood",
+ "neoroscience", "neuroscience",
+ "neruological", "neurological",
+ "neruoscience", "neuroscience",
+ "netropolitan", "metropolitan",
+ "neuorscience", "neuroscience",
+ "neuralogical", "neurological",
+ "neuroligical", "neurological",
+ "neurosceince", "neuroscience",
+ "neuroscienze", "neuroscience",
+ "neurosicence", "neuroscience",
+ "neverhteless", "nevertheless",
+ "nieghborhood", "neighborhood",
+ "norhtwestern", "northwestern",
+ "nothingsness", "nothingness",
+ "noticeablely", "noticeably",
+ "notificacion", "notification",
+ "notificaiton", "notification",
+ "notificatons", "notifications",
+ "nuerological", "neurological",
+ "nueroscience", "neuroscience",
+ "nutritionnal", "nutritional",
+ "obersvations", "observations",
+ "objectivelly", "objectively",
+ "objectiviser", "objectives",
+ "objectivitiy", "objectivity",
+ "obversations", "observations",
+ "ocassionally", "occasionally",
+ "occaisonally", "occasionally",
+ "occasioanlly", "occasionally",
+ "occassionaly", "occasionally",
+ "occationally", "occasionally",
+ "occurrencies", "occurrences",
+ "offensivelly", "offensively",
+ "ogranisation", "organisation",
+ "omniverously", "omnivorously",
+ "operationnal", "operational",
+ "opportuniste", "opportunities",
+ "opportunites", "opportunities",
+ "oppositition", "opposition",
+ "opthalmology", "ophthalmology",
+ "optimistisch", "optimistic",
+ "optimizacion", "optimization",
+ "optimizating", "optimization",
+ "optimziation", "optimization",
+ "optmizations", "optimizations",
+ "oragnisation", "organisation",
+ "orchastrated", "orchestrated",
+ "orchestarted", "orchestrated",
+ "orchestraded", "orchestrated",
+ "orchistrated", "orchestrated",
+ "orgainsation", "organisation",
+ "orgainzation", "organizations",
+ "organisaiton", "organisation",
+ "organisatons", "organisations",
+ "organistaion", "organisation",
+ "organizacion", "organization",
+ "organizaiton", "organization",
+ "organizativo", "organization",
+ "organizatons", "organizations",
+ "organsiation", "organisation",
+ "organziation", "organization",
+ "orginasation", "organisation",
+ "orginazation", "organization",
+ "orgnaisation", "organisations",
+ "originallity", "originality",
+ "outraegously", "outrageously",
+ "outrageoulsy", "outrageously",
+ "outragesouly", "outrageously",
+ "outrageuosly", "outrageously",
+ "outragiously", "outrageously",
+ "outsourceing", "outsourcing",
+ "overbearring", "overbearing",
+ "overblocking", "overclocking",
+ "overclcoking", "overclocking",
+ "overclicking", "overclocking",
+ "overcloaking", "overclocking",
+ "overclockign", "overclocking",
+ "overclokcing", "overclocking",
+ "overhearting", "overreacting",
+ "overheathing", "overheating",
+ "overhtinking", "overthinking",
+ "overhwelming", "overwhelming",
+ "overlappping", "overlapping",
+ "overlcocking", "overclocking",
+ "overreaktion", "overreaction",
+ "overwealming", "overwhelming",
+ "overwhelemed", "overwhelmed",
+ "overwhemling", "overwhelming",
+ "overwhleming", "overwhelming",
+ "owerpowering", "overpowering",
+ "painkilllers", "painkillers",
+ "palastinians", "palestinians",
+ "palesitnians", "palestinians",
+ "palestenians", "palestinians",
+ "palestinains", "palestinians",
+ "palestiniens", "palestinians",
+ "palestininan", "palestinian",
+ "palestininas", "palestinians",
+ "palistinians", "palestinians",
+ "palythroughs", "playthroughs",
+ "parapharsing", "paraphrasing",
+ "paraphenalia", "paraphernalia",
+ "paraphrashed", "paraphrase",
+ "paraphrazing", "paraphrasing",
+ "paraprashing", "paraphrasing",
+ "paraprhasing", "paraphrasing",
+ "parenthesees", "parentheses",
+ "parenthesies", "parenthesis",
+ "parliamentry", "parliamentary",
+ "partecipants", "participants",
+ "partecipated", "participated",
+ "parternships", "partnership",
+ "particapated", "participated",
+ "particiapnts", "participant",
+ "particiapted", "participated",
+ "participante", "participate",
+ "participaste", "participants",
+ "participatie", "participated",
+ "participatin", "participation",
+ "participatns", "participant",
+ "participaton", "participant",
+ "participents", "participants",
+ "particualrly", "particularly",
+ "particulalry", "particularly",
+ "particullary", "particularly",
+ "passionatley", "passionately",
+ "pathalogical", "pathological",
+ "pathelogical", "pathological",
+ "patholigical", "pathological",
+ "paychedelics", "psychedelics",
+ "paychiatrist", "psychiatrist",
+ "paychologist", "psychologist",
+ "paychopathic", "psychopathic",
+ "penetratiing", "penetrating",
+ "penisylvania", "pennsylvania",
+ "pennsilvania", "pennsylvania",
+ "pennslyvania", "pennsylvania",
+ "pennsylvaina", "pennsylvania",
+ "pennsyvlania", "pennsylvania",
+ "pennyslvania", "pennsylvania",
+ "penssylvania", "pennsylvania",
+ "pentsylvania", "pennsylvania",
+ "percentagens", "percentages",
+ "perferential", "preferential",
+ "performantes", "performances",
+ "performences", "performances",
+ "perfromances", "performances",
+ "peridoically", "periodically",
+ "peripathetic", "peripatetic",
+ "periphereals", "peripherals",
+ "peripherials", "peripherals",
+ "permanantely", "permanently",
+ "permanentely", "permanently",
+ "permissiable", "permissible",
+ "peroidically", "periodically",
+ "perpatrators", "perpetrators",
+ "perpatuating", "perpetuating",
+ "perpertators", "perpetrators",
+ "perpertrated", "perpetrated",
+ "perpetraitor", "perpetrator",
+ "perpetraters", "perpetrators",
+ "perpetuaters", "perpetuates",
+ "perpitrators", "perpetrators",
+ "perposefully", "purposefully",
+ "perposterous", "preposterous",
+ "perpretators", "perpetrators",
+ "perpsectives", "perspectives",
+ "perputrators", "perpetrators",
+ "perputuating", "perpetuating",
+ "persepctives", "perspectives",
+ "perservation", "preservation",
+ "perseverence", "perseverance",
+ "personalites", "personalities",
+ "personallity", "personally",
+ "personilized", "personalized",
+ "perspecitves", "perspectives",
+ "perspectivas", "perspectives",
+ "persumptuous", "presumptuous",
+ "perticularly", "particularly",
+ "pertubations", "perturbations",
+ "pessimisitic", "pessimistic",
+ "pessimisstic", "pessimistic",
+ "phenomenonal", "phenomenal",
+ "phenomenonly", "phenomenally",
+ "phenomonenon", "phenomenon",
+ "phialdelphia", "philadelphia",
+ "philadalphia", "philadelphia",
+ "philadelhpia", "philadelphia",
+ "philadeplhia", "philadelphia",
+ "philadlephia", "philadelphia",
+ "philedalphia", "philadelphia",
+ "philedelphia", "philadelphia",
+ "philidalphia", "philadelphia",
+ "philippinnes", "philippines",
+ "philippinoes", "philippines",
+ "philisophers", "philosophers",
+ "philisophies", "philosophies",
+ "phillippines", "philippines",
+ "philosiphers", "philosophers",
+ "philosiphies", "philosophies",
+ "philosohpers", "philosopher",
+ "philosohpies", "philosophies",
+ "philosophiae", "philosophies",
+ "philosophics", "philosophies",
+ "philosophios", "philosophies",
+ "philospohers", "philosophers",
+ "philospohies", "philosophies",
+ "photagrapher", "photographer",
+ "photochopped", "photoshopped",
+ "photograhper", "photographer",
+ "photograpers", "photographers",
+ "photographes", "photographs",
+ "photographyi", "photographic",
+ "photogropher", "photographer",
+ "photogrpahed", "photographed",
+ "photogrpaher", "photographer",
+ "photoshipped", "photoshopped",
+ "photoshooped", "photoshopped",
+ "photoshoppad", "photoshopped",
+ "phychedelics", "psychedelics",
+ "phychiatrist", "psychiatrist",
+ "phychologist", "psychologist",
+ "phychopathic", "psychopathic",
+ "physcedelics", "psychedelics",
+ "physciatrist", "psychiatrist",
+ "physcologist", "psychologist",
+ "physcopathic", "psychopathic",
+ "physicallity", "physically",
+ "physiologial", "physiological",
+ "pilgrimmages", "pilgrimages",
+ "pitchforkers", "pitchforks",
+ "pkaythroughs", "playthroughs",
+ "plabeswalker", "planeswalker",
+ "plaestinians", "palestinians",
+ "planeswaller", "planeswalker",
+ "planeswlaker", "planeswalker",
+ "planetwalker", "planeswalker",
+ "plansewalker", "planeswalker",
+ "plauthroughs", "playthroughs",
+ "playhtroughs", "playthroughs",
+ "playtgroughs", "playthroughs",
+ "playthorughs", "playthroughs",
+ "playthourghs", "playthroughs",
+ "playthrougth", "playthroughs",
+ "playthrouhgs", "playthroughs",
+ "playthtoughs", "playthroughs",
+ "playtrhoughs", "playthroughs",
+ "populationes", "populations",
+ "pornograpghy", "pornography",
+ "porportional", "proportional",
+ "portabillity", "portability",
+ "portagonists", "protagonists",
+ "positionning", "positioning",
+ "positivitely", "positivity",
+ "possessivize", "possessive",
+ "possibillity", "possibility",
+ "possiblility", "possibility",
+ "possiblities", "possibilities",
+ "powerfisting", "powerlifting",
+ "powerlfiting", "powerlifting",
+ "powerlifitng", "powerlifting",
+ "powerlisting", "powerlifting",
+ "powetlifting", "powerlifting",
+ "powrrlifting", "powerlifting",
+ "practicioner", "practitioner",
+ "practisioner", "practitioner",
+ "pratictioner", "practitioners",
+ "precedessors", "predecessors",
+ "preconveived", "preconceived",
+ "predacessors", "predecessors",
+ "predeccesors", "predecessor",
+ "predecesores", "predecessor",
+ "predescesors", "predecessors",
+ "predessecors", "predecessors",
+ "predetermind", "predetermined",
+ "predicessors", "predecessors",
+ "predocessors", "predecessors",
+ "predomiantly", "predominately",
+ "predominanty", "predominantly",
+ "predominatly", "predominantly",
+ "preferantial", "preferential",
+ "preferentail", "preferential",
+ "preformances", "performances",
+ "preinitalize", "preinitialize",
+ "preliminarly", "preliminary",
+ "prematurelly", "prematurely",
+ "premillenial", "premillennial",
+ "preocupation", "preoccupation",
+ "preperations", "preparations",
+ "prepetrators", "perpetrators",
+ "prepetuating", "perpetuating",
+ "prepostorous", "preposterous",
+ "preposturous", "preposterous",
+ "prerequisets", "prerequisite",
+ "prescirption", "prescriptions",
+ "prescribtion", "prescription",
+ "prescripcion", "prescription",
+ "prescriptons", "prescriptions",
+ "prescritpion", "prescriptions",
+ "presedential", "presidential",
+ "presentacion", "presentation",
+ "presentaiton", "presentations",
+ "preservacion", "preservation",
+ "preservating", "preservation",
+ "preservativo", "preservation",
+ "presidencial", "presidential",
+ "presidenital", "presidential",
+ "presidentail", "presidential",
+ "presnetation", "presentations",
+ "presonalized", "personalized",
+ "prespectives", "perspectives",
+ "presrciption", "prescriptions",
+ "presumpteous", "presumptuous",
+ "presumputous", "presumptuous",
+ "prevantative", "preventative",
+ "preventation", "presentation",
+ "preventetive", "preventative",
+ "preventitive", "preventative",
+ "prezidential", "presidential",
+ "principlaity", "principality",
+ "probabiliste", "probabilities",
+ "probabilites", "probabilities",
+ "probabillity", "probability",
+ "probablistic", "probabilistic",
+ "proclomation", "proclamation",
+ "proconceived", "preconceived",
+ "profesisonal", "professionals",
+ "professiinal", "professionalism",
+ "professioanl", "professionals",
+ "professiomal", "professionalism",
+ "professionel", "professional",
+ "professionsl", "professionalism",
+ "professoinal", "professionals",
+ "professonial", "professionals",
+ "proffesional", "professional",
+ "proficientcy", "proficiency",
+ "profissional", "professional",
+ "profitabiliy", "profitability",
+ "profitabilty", "profitability",
+ "profressions", "progressions",
+ "progatonists", "protagonists",
+ "programmeurs", "programmer",
+ "progressieve", "progressive",
+ "progressioin", "progressions",
+ "progressiong", "progressing",
+ "progressisme", "progresses",
+ "progressiste", "progresses",
+ "progressivas", "progressives",
+ "progressivey", "progressively",
+ "progressivly", "progressively",
+ "progressivsm", "progressives",
+ "progresssing", "progressing",
+ "progresssion", "progressions",
+ "progresssive", "progressives",
+ "prohibitting", "prohibiting",
+ "projecticles", "projectiles",
+ "proletariaat", "proletariat",
+ "proletariant", "proletariat",
+ "proletaricat", "proletariat",
+ "prominantely", "prominently",
+ "promiscuious", "promiscuous",
+ "promisculous", "promiscuous",
+ "promotionnal", "promotional",
+ "pronounceing", "pronouncing",
+ "pronunciaton", "pronunciation",
+ "propertional", "proportional",
+ "propesterous", "preposterous",
+ "proportianal", "proportional",
+ "proportionel", "proportional",
+ "proposterous", "preposterous",
+ "proprotional", "proportional",
+ "prostetution", "prostitution",
+ "prostitition", "prostitution",
+ "prostitucion", "prostitution",
+ "prostituiton", "prostitution",
+ "prostitutiei", "prostitute",
+ "protaganists", "protagonists",
+ "protaginists", "protagonists",
+ "protagnoists", "protagonists",
+ "protestantes", "protestants",
+ "protoganists", "protagonists",
+ "prouncements", "pronouncements",
+ "pruposefully", "purposefully",
+ "pscyhologist", "psychologist",
+ "pscyhopathic", "psychopathic",
+ "pshyciatrist", "psychiatrist",
+ "pshycologist", "psychologist",
+ "pshycopathic", "psychopathic",
+ "psichologist", "psychologist",
+ "psychaitrist", "psychiatrist",
+ "psychedellic", "psychedelic",
+ "psychedilics", "psychedelics",
+ "psychemedics", "psychedelics",
+ "psychiatirst", "psychiatrists",
+ "psychiatrics", "psychiatrist",
+ "psychiatrict", "psychiatrist",
+ "psychiatrits", "psychiatrists",
+ "psychistrist", "psychiatrist",
+ "psychodelics", "psychedelics",
+ "psycholigist", "psychologist",
+ "psychologial", "psychological",
+ "psychologits", "psychologists",
+ "psychologyst", "psychologist",
+ "psychopathes", "psychopaths",
+ "psychyatrist", "psychiatrist",
+ "puplications", "publications",
+ "puritannical", "puritanical",
+ "purpetrators", "perpetrators",
+ "purpetuating", "perpetuating",
+ "purpusefully", "purposefully",
+ "pyschedelics", "psychedelics",
+ "pyschiatrist", "psychiatrist",
+ "pyschologist", "psychologist",
+ "pyschopathic", "psychopathic",
+ "qualificaton", "qualification",
+ "qualifierais", "qualifiers",
+ "qualtitative", "quantitative",
+ "quantatitive", "quantitative",
+ "quantititive", "quantitative",
+ "quarterblack", "quarterback",
+ "quesitonable", "questionable",
+ "questionalbe", "questionable",
+ "questionning", "questioning",
+ "questionsign", "questioning",
+ "radioactieve", "radioactive",
+ "rationallity", "rationally",
+ "reactionairy", "reactionary",
+ "reactionnary", "reactionary",
+ "realisticaly", "realistically",
+ "realisticlly", "realistically",
+ "reasonablely", "reasonably",
+ "recallection", "recollection",
+ "reccomending", "recommending",
+ "reccommended", "recommended",
+ "recepcionist", "receptionist",
+ "receptionest", "receptionist",
+ "recgonizable", "recognizable",
+ "reciporcated", "reciprocate",
+ "reciprociate", "reciprocate",
+ "reciprocrate", "reciprocate",
+ "recognizible", "recognizable",
+ "recolleciton", "recollection",
+ "recommanding", "recommending",
+ "recommendeds", "recommends",
+ "recommendors", "recommends",
+ "recommeneded", "recommended",
+ "recommenting", "recommending",
+ "recongizable", "recognizable",
+ "recontructed", "reconstructed",
+ "recpetionist", "receptionist",
+ "recreacional", "recreational",
+ "recriational", "recreational",
+ "referenceing", "referencing",
+ "refirgerator", "refrigerator",
+ "refriderator", "refrigerator",
+ "refrigarator", "refrigerator",
+ "refrigerador", "refrigerator",
+ "refrigerater", "refrigerator",
+ "refrigirator", "refrigerator",
+ "regenaration", "regeneration",
+ "regeneracion", "regeneration",
+ "regestration", "registration",
+ "registartion", "registration",
+ "registrating", "registration",
+ "regrigerator", "refrigerator",
+ "regulatorias", "regulators",
+ "regulatories", "regulators",
+ "regulatorios", "regulators",
+ "reicarnation", "reincarnation",
+ "reinforcemnt", "reinforcement",
+ "reinitalised", "reinitialised",
+ "reinitalises", "reinitialises",
+ "reinitalized", "reinitialized",
+ "reinitalizes", "reinitializes",
+ "reinstallled", "reinstalled",
+ "reisntalling", "reinstalling",
+ "relaitonship", "relationships",
+ "relatinoship", "relationships",
+ "reliabillity", "reliability",
+ "reluctanctly", "reluctantly",
+ "remarkablely", "remarkably",
+ "rememberance", "remembrance",
+ "reminiscient", "reminiscent",
+ "renaissaince", "renaissance",
+ "renegeration", "regeneration",
+ "reorganision", "reorganisation",
+ "repalcements", "replacements",
+ "repersenting", "representing",
+ "reporduction", "reproduction",
+ "reporductive", "reproductive",
+ "reprecussion", "repercussions",
+ "representate", "representative",
+ "represention", "representing",
+ "representive", "representative",
+ "reproducable", "reproducible",
+ "reproduccion", "reproduction",
+ "reproduciton", "reproduction",
+ "reproducting", "reproduction",
+ "reproductivo", "reproduction",
+ "reproduktion", "reproduction",
+ "repsectfully", "respectfully",
+ "repsectively", "respectively",
+ "republicanas", "republicans",
+ "republicanos", "republicans",
+ "republicants", "republicans",
+ "republicians", "republicans",
+ "requerimento", "requirement",
+ "requeriments", "requirements",
+ "requierments", "requirements",
+ "requriements", "requirements",
+ "resembelance", "resemblance",
+ "reseptionist", "receptionist",
+ "reserrection", "resurrection",
+ "resintalling", "reinstalling",
+ "resistancies", "resistances",
+ "resistencias", "resistances",
+ "respecitvely", "respectively",
+ "respectabile", "respectable",
+ "respectivily", "respectively",
+ "respectivley", "respectively",
+ "respectuflly", "respectfully",
+ "respiratiory", "respiratory",
+ "responsabile", "responsible",
+ "responsaveis", "responsive",
+ "responsbilty", "responsibly",
+ "responsibile", "responsible",
+ "responsibily", "responsibility",
+ "responsibley", "responsibly",
+ "responsibliy", "responsibly",
+ "responsiblty", "responsibly",
+ "ressemblance", "resemblance",
+ "ressemblence", "resemblance",
+ "ressurection", "resurrection",
+ "restaurantes", "restaurants",
+ "restauration", "restoration",
+ "restauraunts", "restaurants",
+ "restirctions", "restrictions",
+ "restrainting", "restraining",
+ "restrcitions", "restriction",
+ "restricitons", "restrictions",
+ "resurreccion", "resurrection",
+ "resurrektion", "resurrection",
+ "retalitation", "retaliation",
+ "retributioon", "retribution",
+ "retroactivly", "retroactively",
+ "revolutionay", "revolutionary",
+ "revolutionos", "revolutions",
+ "rezurrection", "resurrection",
+ "rictatorship", "dictatorship",
+ "ridicilously", "ridiculously",
+ "ridicoulusly", "ridiculously",
+ "righteouness", "righteousness",
+ "rockerfeller", "rockefeller",
+ "rollercoaser", "rollercoaster",
+ "rollercoater", "rollercoaster",
+ "romanitcally", "romantically",
+ "roundabounts", "roundabout",
+ "rudimentatry", "rudimentary",
+ "rysurrection", "resurrection",
+ "sacksonville", "jacksonville",
+ "sacreligious", "sacrilegious",
+ "sacrificeing", "sacrificing",
+ "saksatchewan", "saskatchewan",
+ "salughtering", "slaughtering",
+ "sanctionning", "sanctioning",
+ "sarcasticaly", "sarcastically",
+ "sarcasticlly", "sarcastically",
+ "sascatchewan", "saskatchewan",
+ "saskatcehwan", "saskatchewan",
+ "saskatchawan", "saskatchewan",
+ "saskatechwan", "saskatchewan",
+ "sasketchawan", "saskatchewan",
+ "sasketchewan", "saskatchewan",
+ "sasktachewan", "saskatchewan",
+ "satasfaction", "satisfaction",
+ "satasfactory", "satisfactory",
+ "satisfaccion", "satisfaction",
+ "satisfacting", "satisfaction",
+ "satisfcation", "satisfaction",
+ "satisfiction", "satisfaction",
+ "satistactory", "satisfactory",
+ "satsifaction", "satisfaction",
+ "satsifactory", "satisfactory",
+ "scandanivian", "scandinavian",
+ "scandenavian", "scandinavian",
+ "scandianvian", "scandinavian",
+ "scandinacian", "scandinavian",
+ "scandinaivan", "scandinavia",
+ "scandinavica", "scandinavian",
+ "scandinavien", "scandinavian",
+ "scandinavion", "scandinavian",
+ "scandivanian", "scandinavian",
+ "scandonavian", "scandinavian",
+ "schizophrena", "schizophrenia",
+ "scholarhsips", "scholarships",
+ "scholerships", "scholarships",
+ "scholorships", "scholarships",
+ "scnadinavian", "scandinavian",
+ "screenshoots", "screenshot",
+ "sensationail", "sensational",
+ "sensationnal", "sensational",
+ "sensibilites", "sensibilities",
+ "sensitivitiy", "sensitivity",
+ "sentimentals", "sentiments",
+ "sertificates", "certificates",
+ "serveillance", "surveillance",
+ "seskatchewan", "saskatchewan",
+ "shakesperean", "shakespeare",
+ "shamelessely", "shamelessly",
+ "shamelessley", "shamelessly",
+ "shampionship", "championship",
+ "shardholders", "shareholders",
+ "shenanigains", "shenanigans",
+ "shenanigangs", "shenanigans",
+ "shenaniganns", "shenanigans",
+ "shenanighans", "shenanigans",
+ "shopkeeepers", "shopkeepers",
+ "showboarding", "snowboarding",
+ "siginificant", "significant",
+ "significanly", "significantly",
+ "significante", "significance",
+ "significanty", "significantly",
+ "significatly", "significantly",
+ "signleplayer", "singleplayer",
+ "simaltaneous", "simultaneous",
+ "simeltaneous", "simultaneous",
+ "similaraties", "similarities",
+ "similiarites", "similarities",
+ "similiarties", "similarities",
+ "similiraties", "similarities",
+ "similtaneous", "simultaneous",
+ "simliarities", "similarities",
+ "simlutaneous", "simultaneous",
+ "simpathizers", "sympathizers",
+ "simplistisch", "simplistic",
+ "simulatenous", "simultaneous",
+ "simulatneous", "simultaneous",
+ "simultaenous", "simultaneous",
+ "simultaneuos", "simultaneous",
+ "simultanious", "simultaneous",
+ "simulteneous", "simultaneous",
+ "singelplayer", "singleplayer",
+ "singlepalyer", "singleplayer",
+ "sinlgeplayer", "singleplayer",
+ "situationals", "situations",
+ "situationnal", "situational",
+ "skandinavian", "scandinavian",
+ "skateboaring", "skateboarding",
+ "skrawberries", "strawberries",
+ "slaugthering", "slaughtering",
+ "sloughtering", "slaughtering",
+ "sluaghtering", "slaughtering",
+ "snowballling", "snowballing",
+ "snowbaording", "snowboarding",
+ "socialistisk", "socialists",
+ "socialogical", "sociological",
+ "socioeconimc", "socioeconomic",
+ "socioeconmic", "socioeconomic",
+ "socioligical", "sociological",
+ "sociopolical", "sociological",
+ "somethingest", "somethings",
+ "sophisticaed", "sophisticated",
+ "sophisticted", "sophisticated",
+ "southamption", "southampton",
+ "southernerns", "southerners",
+ "sovereighnty", "sovereignty",
+ "sovereignety", "sovereignty",
+ "sovereignity", "sovereignty",
+ "specialistes", "specialists",
+ "specializare", "specialize",
+ "specializate", "specialize",
+ "specializeds", "specializes",
+ "specializied", "specialize",
+ "speciallized", "specialised",
+ "specifcation", "specification",
+ "spectacuarly", "spectacular",
+ "spectaculair", "spectacular",
+ "spectaculary", "spectacularly",
+ "spectacullar", "spectacularly",
+ "specualtions", "speculation",
+ "spermatozoan", "spermatozoon",
+ "spesifically", "specifically",
+ "spirituallly", "spiritually",
+ "spirtiuality", "spirituality",
+ "spirutuality", "spirituality",
+ "spontaneosly", "spontaneously",
+ "spontaneouly", "spontaneously",
+ "spreadhseets", "spreadsheets",
+ "spreadsheats", "spreadsheets",
+ "spreadsheeds", "spreadsheets",
+ "spreadsheeet", "spreadsheets",
+ "standartized", "standardized",
+ "standerdized", "standardized",
+ "stardardized", "standardized",
+ "starightened", "straightened",
+ "starwberries", "strawberries",
+ "statisticaly", "statistically",
+ "stereotpying", "stereotyping",
+ "stereotypers", "stereotypes",
+ "stereotypian", "stereotyping",
+ "steriotyping", "stereotyping",
+ "steroetyping", "stereotyping",
+ "steryotyping", "stereotyping",
+ "straigntened", "straightened",
+ "straigthened", "straightened",
+ "strategicaly", "strategically",
+ "strategiclly", "strategically",
+ "strawburries", "strawberries",
+ "streemlining", "streamlining",
+ "streightened", "straightened",
+ "strenghening", "strengthening",
+ "strenghtened", "strengthened",
+ "strengtheing", "strengthening",
+ "stroytelling", "storytelling",
+ "subconcsious", "subconscious",
+ "subconsicous", "subconscious",
+ "subcouncious", "subconscious",
+ "subcsription", "subscriptions",
+ "subesquently", "subsequently",
+ "subjectivety", "subjectively",
+ "subjectivily", "subjectively",
+ "subjectivley", "subjectively",
+ "subjudgation", "subjugation",
+ "subredditors", "subreddits",
+ "subscirption", "subscriptions",
+ "subsconcious", "subconscious",
+ "subscribbers", "subscribers",
+ "subscribbing", "subscribing",
+ "subscribirse", "subscriber",
+ "subscribtion", "subscription",
+ "subscriptons", "subscriptions",
+ "subscritpion", "subscriptions",
+ "subscrpition", "subscriptions",
+ "subsiquently", "subsequently",
+ "subsrciption", "subscriptions",
+ "subsricption", "subscriptions",
+ "substantialy", "substantially",
+ "substantitve", "substantive",
+ "substitition", "substitution",
+ "substituters", "substitutes",
+ "substitutivo", "substitution",
+ "substitutues", "substitutes",
+ "substracting", "subtracting",
+ "substraction", "subtraction",
+ "subterranian", "subterranean",
+ "succsessfull", "successful",
+ "sunconscious", "subconscious",
+ "supermarkeds", "supermarkets",
+ "supermarkers", "supermarkets",
+ "supermarkert", "supermarkets",
+ "supermarkten", "supermarket",
+ "supermarktes", "supermarkets",
+ "supernarkets", "supermarkets",
+ "supernatrual", "supernatural",
+ "supersticion", "superstition",
+ "superstision", "superstition",
+ "superstitios", "superstitious",
+ "superstitous", "superstitious",
+ "supervisiors", "supervisors",
+ "supervisoras", "supervisors",
+ "supervisores", "supervisors",
+ "supllemental", "supplemental",
+ "supplamental", "supplemental",
+ "supplamented", "supplemented",
+ "supplimental", "supplemental",
+ "suppresssion", "suppression",
+ "supscription", "subscription",
+ "supsiciously", "suspiciously",
+ "surprizingly", "surprisingly",
+ "surrenderred", "surrendered",
+ "surrundering", "surrendering",
+ "survaillance", "surveillance",
+ "survaillence", "surveillance",
+ "survallience", "surveillance",
+ "surveillence", "surveillance",
+ "survelliance", "surveillance",
+ "surviellance", "surveillance",
+ "survivabiity", "survivability",
+ "survivabiliy", "survivability",
+ "survivabilty", "survivability",
+ "susceptiable", "susceptible",
+ "susceptibile", "susceptible",
+ "suspeciously", "suspiciously",
+ "suspicioulsy", "suspiciously",
+ "suspiciuosly", "suspiciously",
+ "suspisiously", "suspiciously",
+ "sustainabily", "sustainability",
+ "symapthizers", "sympathizers",
+ "symetrically", "symmetrically",
+ "symmetricaly", "symmetrically",
+ "sympathethic", "sympathetic",
+ "sympathsizer", "sympathizers",
+ "sympathyzers", "sympathizers",
+ "sympethizers", "sympathizers",
+ "symphatizers", "sympathizers",
+ "sympithizers", "sympathizers",
+ "syncronously", "synchronously",
+ "sysmatically", "systematically",
+ "systematisch", "systematic",
+ "tablespooons", "tablespoon",
+ "tacticallity", "tactically",
+ "tangencially", "tangentially",
+ "tangenitally", "tangentially",
+ "tangientally", "tangentially",
+ "teamfighters", "teamfights",
+ "teansylvania", "transylvania",
+ "techanically", "mechanically",
+ "techincality", "technicality",
+ "technologial", "technological",
+ "telelevision", "television",
+ "teleportaion", "teleportation",
+ "teleportaton", "teleportation",
+ "temepratures", "temperatures",
+ "temparatures", "temperatures",
+ "temperaturas", "temperatures",
+ "temporarilly", "temporarily",
+ "tempreatures", "temperatures",
+ "tempuratures", "temperatures",
+ "tengentially", "tangentially",
+ "termendously", "tremendously",
+ "territorrial", "territorial",
+ "territorries", "territories",
+ "testasterone", "testosterone",
+ "testestorone", "testosterone",
+ "thanskgiving", "thanksgiving",
+ "theologicial", "theological",
+ "theoreticaly", "theoretically",
+ "thermomenter", "thermometer",
+ "thermomether", "thermometer",
+ "thumbnailers", "thumbnails",
+ "thunderboldt", "thunderbolt",
+ "tindergarten", "kindergarten",
+ "torubleshoot", "troubleshoot",
+ "totalitarion", "totalitarian",
+ "totalitatian", "totalitarian",
+ "touchscreeen", "touchscreen",
+ "traditionaly", "traditionally",
+ "traditionnal", "traditional",
+ "tradtionally", "traditionally",
+ "tramendously", "tremendously",
+ "tramsformers", "transformers",
+ "tramsforming", "transforming",
+ "tranditional", "transitional",
+ "tranistional", "transitional",
+ "tranistioned", "transitioned",
+ "tranlsations", "translations",
+ "tranmsission", "transmissions",
+ "transaltions", "translations",
+ "transaprency", "transparency",
+ "transational", "transitional",
+ "transcations", "transactions",
+ "transcendant", "transcendent",
+ "transcripton", "transcription",
+ "transcriptus", "transcripts",
+ "transesxuals", "transsexuals",
+ "transfarmers", "transformers",
+ "transfarring", "transferring",
+ "transferrred", "transferred",
+ "transformare", "transformers",
+ "transformase", "transforms",
+ "transformees", "transforms",
+ "transforners", "transformers",
+ "transfromers", "transformers",
+ "transfroming", "transforming",
+ "transgenderd", "transgendered",
+ "transgendred", "transgendered",
+ "transgenered", "transgender",
+ "transicional", "transitional",
+ "transilvania", "transylvania",
+ "transimssion", "transmissions",
+ "transisioned", "transitioned",
+ "translastion", "translations",
+ "translateing", "translating",
+ "translationg", "translating",
+ "translucient", "translucent",
+ "translyvania", "transylvania",
+ "transmisions", "transmission",
+ "transmisison", "transmission",
+ "transmissons", "transmissions",
+ "transmitirte", "transmitter",
+ "transmittted", "transmitted",
+ "transmorfers", "transformer",
+ "transofrmers", "transformers",
+ "transofrming", "transforming",
+ "transparancy", "transparency",
+ "transparenty", "transparency",
+ "transparrent", "transparent",
+ "transperancy", "transparency",
+ "transperency", "transparency",
+ "transplantes", "transplants",
+ "transporteur", "transporter",
+ "transportion", "transporting",
+ "transpotting", "transporting",
+ "transsmision", "transmissions",
+ "transylmania", "transylvania",
+ "transylvanai", "transylvania",
+ "trasnferring", "transferring",
+ "trasnformers", "transformers",
+ "trasnforming", "transforming",
+ "trasnmission", "transmissions",
+ "trasnparency", "transparency",
+ "trasnporting", "transporting",
+ "trememdously", "tremendously",
+ "tremendoulsy", "tremendously",
+ "tremondously", "tremendously",
+ "troubelshoot", "troubleshoot",
+ "troublehsoot", "troubleshoot",
+ "trumendously", "tremendously",
+ "trustworthly", "trustworthy",
+ "ubsubscribed", "unsubscribed",
+ "udnerpowered", "underpowered",
+ "umbelievable", "unbelievable",
+ "umemployment", "unemployment",
+ "unaccaptable", "unacceptable",
+ "unacceptible", "unacceptable",
+ "unaccpetable", "unacceptable",
+ "unacompanied", "unaccompanied",
+ "unappealling", "unappealing",
+ "unattractice", "unattractive",
+ "unautherized", "unauthorized",
+ "unauthroized", "unauthorized",
+ "unbeleivable", "unbelievable",
+ "unbeleivably", "unbelievably",
+ "unbeliavable", "unbelievable",
+ "unbeliavably", "unbelievably",
+ "unbeliebable", "unbelievable",
+ "unbelieveble", "unbelievable",
+ "unbelievibly", "unbelievably",
+ "unbeliveable", "unbelievable",
+ "unbeliveably", "unbelievably",
+ "unbelizeable", "unbelievable",
+ "unbolievable", "unbelievable",
+ "uncertainity", "uncertainty",
+ "uncertaintly", "uncertainty",
+ "uncompatible", "incompatible",
+ "unconditinal", "unconditional",
+ "unconsciosly", "unconsciously",
+ "unconsciouly", "unconsciously",
+ "unconsistent", "inconsistent",
+ "unconvenient", "inconvenient",
+ "unconvential", "unconventional",
+ "undecideable", "undecidable",
+ "undefinitely", "indefinitely",
+ "undeniablely", "undeniably",
+ "undergradate", "undergraduate",
+ "undergradute", "undergraduate",
+ "underminding", "undermining",
+ "undermineing", "undermining",
+ "undermineras", "undermines",
+ "undermineres", "undermines",
+ "underminging", "undermining",
+ "underminning", "undermining",
+ "undertakeing", "undertaking",
+ "underwhelimg", "underwhelming",
+ "underwheling", "underwhelming",
+ "undesireable", "undesirable",
+ "undoubtedbly", "undoubtedly",
+ "unemployemnt", "unemployment",
+ "unemplyoment", "unemployment",
+ "unempolyment", "unemployment",
+ "unenployment", "unemployment",
+ "unequalities", "inequalities",
+ "unexpectadly", "unexpectedly",
+ "unexpectetly", "unexpectedly",
+ "unexpectidly", "unexpectedly",
+ "unexperience", "inexperience",
+ "unexpextedly", "unexpectedly",
+ "unexplicably", "inexplicably",
+ "unforgetable", "unforgettable",
+ "unforgiveble", "unforgivable",
+ "unforgivible", "unforgivable",
+ "unfortunatly", "unfortunately",
+ "unfortunetly", "unfortunately",
+ "unilatreally", "unilaterally",
+ "uniliterally", "unilaterally",
+ "unimpresssed", "unimpressed",
+ "uninitalised", "uninitialised",
+ "uninitalized", "uninitialized",
+ "uninstallimg", "uninstalling",
+ "uninstallled", "uninstalled",
+ "unintentinal", "unintentional",
+ "uninteresing", "uninteresting",
+ "uninterneted", "uninterested",
+ "uninterruped", "uninterrupted",
+ "uninterupted", "uninterrupted",
+ "unisntalling", "uninstalling",
+ "unitesstates", "unitedstates",
+ "univerisites", "universities",
+ "univeristies", "universities",
+ "universitets", "universities",
+ "unliaterally", "unilaterally",
+ "unneccessary", "unnecessary",
+ "unnecesarily", "unnecessarily",
+ "unnecessairy", "unnecessarily",
+ "unnecessarly", "unnecessarily",
+ "unnistalling", "uninstalling",
+ "unpredictabe", "unpredictable",
+ "unpreductive", "unproductive",
+ "unproduktive", "unproductive",
+ "unrealisitic", "unrealistic",
+ "unreaponsive", "unresponsive",
+ "unreasonalby", "unreasonably",
+ "unrepsonsive", "unresponsive",
+ "unresponcive", "unresponsive",
+ "unresponisve", "unresponsive",
+ "unresponsibe", "unresponsive",
+ "unrestircted", "unrestricted",
+ "unrestrcited", "unrestricted",
+ "unristricted", "unrestricted",
+ "unseccessful", "unsuccessful",
+ "unsespecting", "unsuspecting",
+ "unsibscribed", "unsubscribed",
+ "unsoliciated", "unsolicited",
+ "unsolicitied", "unsolicited",
+ "unsubscirbed", "unsubscribed",
+ "unsubscrible", "unsubscribed",
+ "unsubscrided", "unsubscribed",
+ "unsubscriped", "unsubscribed",
+ "unsubscrubed", "unsubscribed",
+ "unsubsrcibed", "unsubscribed",
+ "unsucessfull", "unsuccessful",
+ "unsunscribed", "unsubscribed",
+ "unsurprizing", "unsurprising",
+ "unsusbcribed", "unsubscribed",
+ "unsustainble", "unsustainable",
+ "unvelievable", "unbelievable",
+ "unvelievably", "unbelievably",
+ "unviersities", "universities",
+ "unvulnerable", "invulnerable",
+ "varification", "verification",
+ "vegetarianas", "vegetarians",
+ "vegetarianos", "vegetarians",
+ "verficiation", "verification",
+ "verificacion", "verification",
+ "verificaiton", "verification",
+ "verifikation", "verification",
+ "vernaculaire", "vernacular",
+ "versatillity", "versatility",
+ "verticallity", "vertically",
+ "videogamemes", "videogames",
+ "visualizaton", "visualization",
+ "vocabularily", "vocabulary",
+ "vocabularity", "vocabulary",
+ "volonteering", "volunteering",
+ "volounteered", "volunteered",
+ "voluntarilly", "voluntarily",
+ "volunterring", "volunteering",
+ "vulnerabilty", "vulnerability",
+ "weightlifing", "weightlifting",
+ "withdrawalls", "withdrawals",
+ "withdrawling", "withdrawing",
+ "withdrawning", "withdrawing",
+ "wonderfullly", "wonderfully",
+ "worshippping", "worshipping",
+ "xenophobical", "xenophobia",
+ "abandenment", "abandonment",
+ "abandomnent", "abandonment",
+ "abandonding", "abandoning",
+ "abandonnent", "abandonment",
+ "abandonning", "abandoning",
+ "abbreviatin", "abbreviation",
+ "abbreviaton", "abbreviation",
+ "abdominable", "abdominal",
+ "abomanation", "abomination",
+ "abominacion", "abomination",
+ "abomonation", "abomination",
+ "abonimation", "abomination",
+ "aboriginial", "aboriginal",
+ "aborigional", "aboriginal",
+ "abreviation", "abbreviation",
+ "abritrarily", "arbitrarily",
+ "abritration", "arbitration",
+ "absolutelly", "absolutely",
+ "absolutelys", "absolutes",
+ "absolutisme", "absolutes",
+ "absolutiste", "absolutes",
+ "abstraccion", "abstraction",
+ "abstraktion", "abstraction",
+ "abstruction", "abstraction",
+ "abundancies", "abundances",
+ "academicaly", "academically",
+ "academicese", "academics",
+ "accelarated", "accelerated",
+ "accelarator", "accelerator",
+ "accelerater", "accelerator",
+ "acceleratie", "accelerate",
+ "acceleratio", "accelerator",
+ "acceleraton", "acceleration",
+ "accelorated", "accelerated",
+ "accelorator", "accelerator",
+ "acceptabelt", "acceptable",
+ "accesseries", "accessories",
+ "accessibile", "accessible",
+ "accessibily", "accessibility",
+ "accessoires", "accessories",
+ "accidantely", "accidently",
+ "accidentaly", "accidentally",
+ "accidentely", "accidently",
+ "accidential", "accidental",
+ "accidentily", "accidently",
+ "accidentlay", "accidently",
+ "accidentley", "accidently",
+ "accidentlly", "accidently",
+ "accomadated", "accommodated",
+ "accomadates", "accommodates",
+ "accommadate", "accommodate",
+ "accommidate", "accommodate",
+ "accomodated", "accommodated",
+ "accomodates", "accommodates",
+ "accomondate", "accommodate",
+ "accompained", "accompanied",
+ "accompanyed", "accompanied",
+ "accompianed", "accompanied",
+ "accompinied", "accompanied",
+ "accomplises", "accomplishes",
+ "accomplishs", "accomplishes",
+ "accomponied", "accompanied",
+ "accountatns", "accountants",
+ "accountents", "accountants",
+ "accquainted", "acquainted",
+ "accrediated", "accredited",
+ "accreditied", "accredited",
+ "accreditted", "accredited",
+ "acculumated", "accumulated",
+ "accumalated", "accumulated",
+ "accumelated", "accumulated",
+ "accumilated", "accumulated",
+ "accumulatin", "accumulation",
+ "accumulaton", "accumulation",
+ "accuratelly", "accurately",
+ "accustommed", "accustomed",
+ "acheivement", "achievement",
+ "acheivments", "achievements",
+ "achievemint", "achievement",
+ "achievemnts", "achievements",
+ "achievments", "achievements",
+ "achivements", "achievements",
+ "acknolwedge", "acknowledge",
+ "acknoweldge", "acknowledge",
+ "acknowleded", "acknowledged",
+ "acknowlegde", "acknowledge",
+ "acknowleged", "acknowledge",
+ "acknowleges", "acknowledges",
+ "acknwoledge", "acknowledges",
+ "acomplished", "accomplished",
+ "acopalyptic", "apocalyptic",
+ "acquaintace", "acquaintance",
+ "acquisation", "acquisition",
+ "activateing", "activating",
+ "activationg", "activating",
+ "activistion", "activision",
+ "additinally", "additionally",
+ "additionaly", "additionally",
+ "additonally", "additionally",
+ "adequatedly", "adequately",
+ "adjectiveus", "adjectives",
+ "administerd", "administered",
+ "administrar", "administrator",
+ "administren", "administer",
+ "administrer", "administer",
+ "administres", "administer",
+ "administrez", "administer",
+ "adminstered", "administered",
+ "adminstrate", "administrate",
+ "admittadely", "admittedly",
+ "adolencence", "adolescence",
+ "adolescance", "adolescence",
+ "adolescense", "adolescence",
+ "advantadges", "advantages",
+ "advantageos", "advantageous",
+ "advantageus", "advantageous",
+ "advantagous", "advantageous",
+ "adventerous", "adventures",
+ "adventourus", "adventurous",
+ "adversiting", "advertising",
+ "advertisors", "advertisers",
+ "advertisted", "advertised",
+ "aesthethics", "aesthetics",
+ "afficionado", "aficionado",
+ "affiliction", "affiliation",
+ "affirmitave", "affirmative",
+ "affirmitive", "affirmative",
+ "affixiation", "affiliation",
+ "affrimative", "affirmative",
+ "afgahnistan", "afghanistan",
+ "afganhistan", "afghanistan",
+ "afghanastan", "afghanistan",
+ "afghansitan", "afghanistan",
+ "afhganistan", "afghanistan",
+ "afternarket", "aftermarket",
+ "afterthougt", "afterthought",
+ "aggaravates", "aggravates",
+ "aggragating", "aggravating",
+ "aggregatore", "aggregate",
+ "aggressivly", "aggressively",
+ "aggresssion", "aggression",
+ "aggrovating", "aggravating",
+ "agnostacism", "agnosticism",
+ "agnostisicm", "agnosticism",
+ "agnostisism", "agnosticism",
+ "agnostocism", "agnosticism",
+ "agnsoticism", "agnosticism",
+ "agonsticism", "agnosticism",
+ "agressively", "aggressively",
+ "agressivley", "agressive",
+ "agressivnes", "agressive",
+ "agricolture", "agriculture",
+ "agriculteur", "agriculture",
+ "agricultral", "agricultural",
+ "agricultual", "agricultural",
+ "agricutlure", "agriculture",
+ "ahtleticism", "athleticism",
+ "alcoholicas", "alcoholics",
+ "alcoholicos", "alcoholics",
+ "alcoholisim", "alcoholism",
+ "algorithems", "algorithm",
+ "algorithims", "algorithm",
+ "algorithmes", "algorithms",
+ "algorithmns", "algorithms",
+ "algorithmus", "algorithms",
+ "algorithyms", "algorithm",
+ "algorythims", "algorithms",
+ "alientating", "alienating",
+ "alleigances", "allegiance",
+ "alltogether", "altogether",
+ "alterantive", "alternative",
+ "alternatley", "alternately",
+ "alternitive", "alternative",
+ "altheticism", "athleticism",
+ "altnerately", "alternately",
+ "altruisitic", "altruistic",
+ "altruistric", "altruistic",
+ "amalgomated", "amalgamated",
+ "ambulancier", "ambulance",
+ "amerliorate", "ameliorate",
+ "ammendments", "amendments",
+ "ampehtamine", "amphetamine",
+ "ampethamine", "amphetamine",
+ "amphetamies", "amphetamines",
+ "amphetamins", "amphetamines",
+ "amphetemine", "amphetamine",
+ "amphetimine", "amphetamine",
+ "amphetmaine", "amphetamines",
+ "analyticals", "analytics",
+ "anarchistes", "anarchists",
+ "ancedotally", "anecdotally",
+ "androgenous", "androgynous",
+ "anecdatally", "anecdotally",
+ "anecdotelly", "anecdotally",
+ "anecodtally", "anecdotally",
+ "anectodally", "anecdotally",
+ "anectotally", "anecdotally",
+ "anedoctally", "anecdotally",
+ "angosticism", "agnosticism",
+ "anihilation", "annihilation",
+ "anitbiotics", "antibiotics",
+ "annihalated", "annihilated",
+ "annihilaton", "annihilation",
+ "annihilited", "annihilated",
+ "annihliated", "annihilated",
+ "annilihated", "annihilated",
+ "anniversery", "anniversary",
+ "annonymouse", "anonymous",
+ "announceing", "announcing",
+ "announcemet", "announcements",
+ "announcemnt", "announcement",
+ "announcents", "announces",
+ "annoymously", "anonymously",
+ "anonamously", "anonymously",
+ "anonimously", "anonymously",
+ "anonmyously", "anonymously",
+ "anonomously", "anonymously",
+ "anonymousny", "anonymously",
+ "anouncement", "announcement",
+ "antagonisic", "antagonistic",
+ "antagonistc", "antagonistic",
+ "antagonstic", "antagonist",
+ "anthropolgy", "anthropology",
+ "anthropoloy", "anthropology",
+ "antibiodics", "antibiotics",
+ "antibioitcs", "antibiotic",
+ "antibioitic", "antibiotic",
+ "antibitoics", "antibiotics",
+ "antiboitics", "antibiotics",
+ "anticapated", "anticipated",
+ "anticiapted", "anticipated",
+ "anticipatin", "anticipation",
+ "antiobitics", "antibiotic",
+ "antiquaited", "antiquated",
+ "antisipated", "anticipated",
+ "apacolyptic", "apocalyptic",
+ "apocaliptic", "apocalyptic",
+ "apocalpytic", "apocalyptic",
+ "apocalytpic", "apocalyptic",
+ "apolagizing", "apologizing",
+ "apolegetics", "apologetics",
+ "apologistas", "apologists",
+ "apologistes", "apologists",
+ "apostrophie", "apostrophe",
+ "apparantely", "apparently",
+ "appareances", "appearances",
+ "apparentely", "apparently",
+ "appartments", "apartments",
+ "appeareance", "appearance",
+ "appearences", "appearances",
+ "apperciated", "appreciated",
+ "apperciates", "appreciates",
+ "appereances", "appearances",
+ "applicabile", "applicable",
+ "applicaiton", "application",
+ "applicatins", "applicants",
+ "applicatons", "applications",
+ "appoitnment", "appointments",
+ "apporaching", "approaching",
+ "apporpriate", "appropriate",
+ "apporximate", "approximate",
+ "appraoching", "approaching",
+ "apprearance", "appearance",
+ "apprecaited", "appreciated",
+ "apprecaites", "appreciates",
+ "appreciaite", "appreciative",
+ "appreciatie", "appreciative",
+ "appreciatin", "appreciation",
+ "appreciaton", "appreciation",
+ "appreciatve", "appreciative",
+ "appreicated", "appreciated",
+ "appreicates", "appreciates",
+ "apprentince", "apprentice",
+ "appriciated", "appreciated",
+ "appriciates", "appreciates",
+ "apprieciate", "appreciate",
+ "appropirate", "appropriate",
+ "appropraite", "appropriate",
+ "appropriato", "appropriation",
+ "approxamate", "approximate",
+ "approxiamte", "approximate",
+ "approxmiate", "approximate",
+ "aprehensive", "apprehensive",
+ "apsirations", "aspirations",
+ "aqcuisition", "acquisition",
+ "aquaintance", "acquaintance",
+ "aquiantance", "acquaintance",
+ "arbitrairly", "arbitrarily",
+ "arbitralily", "arbitrarily",
+ "arbitrarely", "arbitrarily",
+ "arbitrarion", "arbitration",
+ "arbitratily", "arbitrarily",
+ "arbritarily", "arbitrarily",
+ "arbritation", "arbitration",
+ "arcaheology", "archaeology",
+ "archaoelogy", "archeology",
+ "archeaology", "archaeology",
+ "archimedian", "archimedean",
+ "architechts", "architect",
+ "architectes", "architects",
+ "architecure", "architecture",
+ "argiculture", "agriculture",
+ "argumentate", "argumentative",
+ "aribtrarily", "arbitrarily",
+ "aribtration", "arbitration",
+ "arithmentic", "arithmetic",
+ "arithmethic", "arithmetic",
+ "arithmetric", "arithmetic",
+ "armagedddon", "armageddon",
+ "armageddeon", "armageddon",
+ "arrangments", "arrangements",
+ "arrengement", "arrangement",
+ "articluated", "articulated",
+ "articualted", "articulated",
+ "artifically", "artificially",
+ "artificialy", "artificially",
+ "aspergerers", "aspergers",
+ "asphyxation", "asphyxiation",
+ "aspriations", "aspirations",
+ "assasinated", "assassinated",
+ "assasinates", "assassinates",
+ "assassiante", "assassinate",
+ "assassinare", "assassinate",
+ "assassinatd", "assassinated",
+ "assassinato", "assassination",
+ "assassinats", "assassins",
+ "assassinted", "assassinated",
+ "assembleing", "assembling",
+ "assemblying", "assembling",
+ "assertation", "assertion",
+ "assignemnts", "assignments",
+ "assimialted", "assimilate",
+ "assimilatie", "assimilate",
+ "assimilerat", "assimilate",
+ "assimiliate", "assimilate",
+ "assimliated", "assimilate",
+ "assingments", "assignments",
+ "assistantes", "assistants",
+ "assocaition", "associations",
+ "associaiton", "associations",
+ "associaties", "associates",
+ "associatons", "associations",
+ "assoication", "association",
+ "assosiating", "associating",
+ "assosiation", "association",
+ "assoziation", "association",
+ "assumptious", "assumptions",
+ "astonashing", "astonishing",
+ "astonoshing", "astonishing",
+ "astronaught", "astronaut",
+ "astronaunts", "astronaut",
+ "astronautas", "astronauts",
+ "astronautes", "astronauts",
+ "asychronous", "asynchronous",
+ "asyncronous", "asynchronous",
+ "atatchments", "attachments",
+ "atheistisch", "atheistic",
+ "athelticism", "athleticism",
+ "athletecism", "athleticism",
+ "athleticsim", "athleticism",
+ "athletisicm", "athleticism",
+ "athletisism", "athleticism",
+ "atmopsheric", "atmospheric",
+ "atmoshperic", "atmospheric",
+ "atmosoheric", "atmospheric",
+ "atomspheric", "atmospheric",
+ "atrocitites", "atrocities",
+ "attachemnts", "attachments",
+ "attackerasu", "attackers",
+ "attackerats", "attackers",
+ "attactments", "attachments",
+ "attributred", "attributed",
+ "attributted", "attribute",
+ "attrocities", "atrocities",
+ "atttributes", "attributes",
+ "audiobookas", "audiobooks",
+ "audioboooks", "audiobook",
+ "auotcorrect", "autocorrect",
+ "austrailans", "australians",
+ "austrailian", "australian",
+ "australiaan", "australians",
+ "australiams", "australians",
+ "australiens", "australians",
+ "australlian", "australian",
+ "authenticiy", "authenticity",
+ "authenticor", "authenticator",
+ "authenticty", "authenticity",
+ "authorative", "authoritative",
+ "authoritate", "authoritative",
+ "authoroties", "authorities",
+ "autoatttack", "autoattack",
+ "autocoreect", "autocorrect",
+ "autocorrekt", "autocorrect",
+ "autocorrent", "autocorrect",
+ "autocorrext", "autocorrect",
+ "autoctonous", "autochthonous",
+ "autokorrect", "autocorrect",
+ "automaticly", "automatically",
+ "automatonic", "automation",
+ "automoblies", "automobile",
+ "auxillaries", "auxiliaries",
+ "availabiliy", "availability",
+ "availabilty", "availability",
+ "availablity", "availability",
+ "awesoneness", "awesomeness",
+ "babysittter", "babysitter",
+ "backbacking", "backpacking",
+ "backgorunds", "backgrounds",
+ "backhacking", "backpacking",
+ "backjacking", "backpacking",
+ "backtacking", "backpacking",
+ "bangaldeshi", "bangladesh",
+ "bangladesch", "bangladesh",
+ "barceloneta", "barcelona",
+ "bargainning", "bargaining",
+ "battelfield", "battlefield",
+ "battelfront", "battlefront",
+ "battelships", "battleship",
+ "battlefeild", "battlefield",
+ "battlefiend", "battlefield",
+ "battlefiled", "battlefield",
+ "battlefornt", "battlefront",
+ "battlehsips", "battleship",
+ "beastiality", "bestiality",
+ "beaurocracy", "bureaucracy",
+ "beautyfully", "beautifully",
+ "behaviorial", "behavioral",
+ "belittleing", "belittling",
+ "belittlling", "belittling",
+ "belligerant", "belligerent",
+ "belligirent", "belligerent",
+ "bellweather", "bellwether",
+ "benefitical", "beneficial",
+ "bestiallity", "bestiality",
+ "beuatifully", "beautifully",
+ "beuraucracy", "bureaucracy",
+ "beuraucrats", "bureaucrats",
+ "billegerent", "belligerent",
+ "billionairs", "billionaires",
+ "billionarie", "billionaire",
+ "billioniare", "billionaire",
+ "biologicaly", "biologically",
+ "birthdayers", "birthdays",
+ "birthdaymas", "birthdays",
+ "bittersweat", "bittersweet",
+ "bitterwseet", "bittersweet",
+ "blackberrry", "blackberry",
+ "blacksmitch", "blacksmith",
+ "bloodboorne", "bloodborne",
+ "bluebarries", "blueberries",
+ "blueburries", "blueberries",
+ "blueprients", "blueprints",
+ "bodybuildig", "bodybuilding",
+ "bodybuildng", "bodybuilding",
+ "bodybuiling", "bodybuilding",
+ "bombardeada", "bombarded",
+ "bombardeado", "bombarded",
+ "bombarderad", "bombarded",
+ "bordelrands", "borderlands",
+ "bordlerands", "borderlands",
+ "bortherhood", "brotherhood",
+ "bourgeousie", "bourgeois",
+ "boycottting", "boycotting",
+ "bracelettes", "bracelets",
+ "brainwahsed", "brainwashed",
+ "brainwasing", "brainwashing",
+ "braziliians", "brazilians",
+ "breakthough", "breakthrough",
+ "breakthrouh", "breakthrough",
+ "breathtakng", "breathtaking",
+ "brianwashed", "brainwashed",
+ "brillaintly", "brilliantly",
+ "broadcasing", "broadcasting",
+ "broadcastes", "broadcasts",
+ "broderlands", "borderlands",
+ "brotherwood", "brotherhood",
+ "buddhistisk", "buddhists",
+ "buearucrats", "bureaucrats",
+ "bueraucracy", "bureaucracy",
+ "bueraucrats", "bureaucrats",
+ "buisnessman", "businessman",
+ "buisnessmen", "businessmen",
+ "bullerproof", "bulletproof",
+ "bulletbroof", "bulletproof",
+ "bulletproff", "bulletproof",
+ "bulletprrof", "bulletproof",
+ "bullitproof", "bulletproof",
+ "bureacuracy", "bureaucracy",
+ "bureaocracy", "bureaucracy",
+ "bureaocrats", "bureaucrats",
+ "bureaucraps", "bureaucrats",
+ "bureaucrash", "bureaucrats",
+ "bureaucrasy", "bureaucrats",
+ "bureaucrazy", "bureaucracy",
+ "bureuacracy", "bureaucracy",
+ "bureuacrats", "bureaucrats",
+ "burueacrats", "bureaucrats",
+ "businessnes", "businessmen",
+ "busniessmen", "businessmen",
+ "butterfiles", "butterflies",
+ "butterfleye", "butterfly",
+ "butterflyes", "butterflies",
+ "butterfries", "butterflies",
+ "butterlfies", "butterflies",
+ "caclulating", "calculating",
+ "caclulation", "calculation",
+ "caclulators", "calculators",
+ "cailbration", "calibration",
+ "calbiration", "calibration",
+ "calcualting", "calculating",
+ "calcualtion", "calculations",
+ "calcualtors", "calculators",
+ "calculaters", "calculators",
+ "calculatios", "calculators",
+ "calculatons", "calculations",
+ "calibartion", "calibration",
+ "calibraiton", "calibration",
+ "califorinan", "californian",
+ "californain", "californian",
+ "californica", "california",
+ "californien", "californian",
+ "californiia", "californian",
+ "californina", "californian",
+ "californnia", "californian",
+ "califronian", "californian",
+ "caluclating", "calculating",
+ "caluclation", "calculation",
+ "caluclators", "calculators",
+ "caluculated", "calculated",
+ "caluiflower", "cauliflower",
+ "camouflague", "camouflage",
+ "camouflauge", "camouflage",
+ "campagining", "campaigning",
+ "campainging", "campaigning",
+ "canadianese", "canadians",
+ "cannabilism", "cannibalism",
+ "cannabolism", "cannibalism",
+ "canniablism", "cannibalism",
+ "cannibalizm", "cannibalism",
+ "cannibaljim", "cannibalism",
+ "cannibalsim", "cannibalism",
+ "cannibilism", "cannibalism",
+ "cannobalism", "cannibalism",
+ "cannotation", "connotation",
+ "capabilites", "capabilities",
+ "capabilitiy", "capability",
+ "capabillity", "capability",
+ "capacitaron", "capacitor",
+ "capacitores", "capacitors",
+ "capatilists", "capitalists",
+ "capatilized", "capitalized",
+ "caperbility", "capability",
+ "capitalisim", "capitalism",
+ "capitilists", "capitalists",
+ "capitilized", "capitalized",
+ "capitolists", "capitalists",
+ "capitolized", "capitalized",
+ "captialists", "capitalists",
+ "captialized", "capitalized",
+ "cariactures", "caricature",
+ "carniverous", "carnivorous",
+ "castatrophe", "catastrophe",
+ "catagorized", "categorized",
+ "catapillars", "caterpillars",
+ "catapillers", "caterpillars",
+ "catasthrope", "catastrophe",
+ "catastraphe", "catastrophe",
+ "catastrohpe", "catastrophe",
+ "catastropic", "catastrophic",
+ "categroized", "categorized",
+ "catepillars", "caterpillars",
+ "catergorize", "categorize",
+ "caterogized", "categorized",
+ "caterpilars", "caterpillars",
+ "caterpiller", "caterpillar",
+ "catholacism", "catholicism",
+ "catholicsim", "catholicism",
+ "catholisicm", "catholicism",
+ "catholisism", "catholicism",
+ "catholizism", "catholicism",
+ "catholocism", "catholicism",
+ "catogerized", "categorized",
+ "catterpilar", "caterpillar",
+ "cauilflower", "cauliflower",
+ "caulfilower", "cauliflower",
+ "celebartion", "celebrations",
+ "celebirties", "celebrities",
+ "celebracion", "celebration",
+ "celebrasion", "celebrations",
+ "celebratons", "celebrations",
+ "centipeddle", "centipede",
+ "cerimonious", "ceremonious",
+ "certaintity", "certainty",
+ "certificaat", "certificate",
+ "certificare", "certificate",
+ "certificato", "certification",
+ "certificats", "certificates",
+ "challanging", "challenging",
+ "challeneged", "challenged",
+ "challeneger", "challenger",
+ "challeneges", "challenges",
+ "chameleooon", "chameleon",
+ "championshp", "championship",
+ "championsip", "championship",
+ "chancellour", "chancellor",
+ "charachters", "characters",
+ "charasmatic", "charismatic",
+ "charimastic", "charismatic",
+ "charsimatic", "charismatic",
+ "cheerleadra", "cheerleader",
+ "cheerleards", "cheerleaders",
+ "cheerleeder", "cheerleader",
+ "cheesebuger", "cheeseburger",
+ "cheeseburgs", "cheeseburgers",
+ "chihuahuita", "chihuahua",
+ "childrenmrs", "childrens",
+ "chloesterol", "cholesterol",
+ "cholesteral", "cholesterol",
+ "cholestoral", "cholesterol",
+ "cholestorol", "cholesterol",
+ "cholosterol", "cholesterol",
+ "chormosomes", "chromosomes",
+ "christianty", "christianity",
+ "chromasomes", "chromosomes",
+ "chromesomes", "chromosomes",
+ "chromisomes", "chromosomes",
+ "chromosones", "chromosomes",
+ "chromossome", "chromosomes",
+ "chromozomes", "chromosomes",
+ "chronicales", "chronicles",
+ "chronichles", "chronicles",
+ "cicrulating", "circulating",
+ "cincinnasti", "cincinnati",
+ "cincinnatti", "cincinnati",
+ "cincinnnati", "cincinnati",
+ "circimcised", "circumcised",
+ "circluating", "circulating",
+ "circualtion", "circulation",
+ "circulacion", "circulation",
+ "circumcison", "circumcision",
+ "circumsiced", "circumcised",
+ "circumsised", "circumcised",
+ "circumstace", "circumstance",
+ "circumvrent", "circumvent",
+ "circuncised", "circumcised",
+ "cirticising", "criticising",
+ "ciruclating", "circulating",
+ "ciruclation", "circulation",
+ "citicenship", "citizenship",
+ "citisenship", "citizenship",
+ "citizinship", "citizenship",
+ "civilizatin", "civilizations",
+ "civilizaton", "civilization",
+ "claculators", "calculators",
+ "classifides", "classified",
+ "cleanilness", "cleanliness",
+ "cleanleness", "cleanliness",
+ "cleanlyness", "cleanliness",
+ "cleansiness", "cleanliness",
+ "cliffbanger", "cliffhanger",
+ "cliffhander", "cliffhanger",
+ "cliffhangar", "cliffhanger",
+ "clifthanger", "cliffhanger",
+ "cockaroches", "cockroaches",
+ "cockraoches", "cockroaches",
+ "cockroackes", "cockroaches",
+ "cocktailers", "cocktails",
+ "coefficeint", "coefficient",
+ "coefficiant", "coefficient",
+ "coincedince", "coincidence",
+ "coincidance", "coincidence",
+ "coincidense", "coincidence",
+ "coincidente", "coincidence",
+ "coincidince", "coincidence",
+ "coinsidence", "coincidence",
+ "collabarate", "collaborate",
+ "collaberate", "collaborate",
+ "collaborant", "collaborate",
+ "collaborare", "collaborate",
+ "collaborato", "collaboration",
+ "collapseing", "collapsing",
+ "collaterial", "collateral",
+ "collectieve", "collective",
+ "collectivly", "collectively",
+ "collectivos", "collections",
+ "collobarate", "collaborate",
+ "colloborate", "collaborate",
+ "colonializm", "colonialism",
+ "colonialsim", "colonialism",
+ "colonianism", "colonialism",
+ "colonizaton", "colonization",
+ "comaprisons", "comparisons",
+ "combiantion", "combinations",
+ "combinacion", "combination",
+ "combinaison", "combinations",
+ "combinaiton", "combinations",
+ "combinatino", "combinations",
+ "combinatins", "combinations",
+ "combinatios", "combinations",
+ "combinining", "combining",
+ "combonation", "combination",
+ "comediantes", "comedians",
+ "comeptition", "competition",
+ "comeptitive", "competitive",
+ "comeptitors", "competitors",
+ "comfertable", "comfortable",
+ "comfertably", "comfortably",
+ "comfortabel", "comfortably",
+ "comfortabil", "comfortably",
+ "comfrotable", "comfortable",
+ "comftorable", "comfortable",
+ "comftorably", "comfortably",
+ "comisioning", "commissioning",
+ "comissioned", "commissioned",
+ "comissioner", "commissioner",
+ "commandered", "commanded",
+ "commandmant", "commandment",
+ "commantator", "commentator",
+ "commendment", "commandment",
+ "commentarea", "commenter",
+ "commentaren", "commenter",
+ "commentater", "commentator",
+ "commenteers", "commenter",
+ "commentries", "commenters",
+ "commercialy", "commercially",
+ "commericals", "commercials",
+ "commericial", "commercial",
+ "comminicate", "communicate",
+ "comminucate", "communicate",
+ "commisioned", "commissioned",
+ "commisioner", "commissioner",
+ "commisssion", "commissions",
+ "committment", "commitment",
+ "commodoties", "commodities",
+ "commomplace", "commonplace",
+ "commonspace", "commonplace",
+ "commonweath", "commonwealth",
+ "commonwelth", "commonwealth",
+ "commuincate", "communicated",
+ "communciate", "communicate",
+ "communicted", "communicated",
+ "communistas", "communists",
+ "communistes", "communists",
+ "compability", "compatibility",
+ "compalation", "compilation",
+ "compansated", "compensated",
+ "comparabile", "comparable",
+ "comparasion", "comparison",
+ "comparasons", "comparisons",
+ "comparement", "compartment",
+ "comparetive", "comparative",
+ "comparision", "comparison",
+ "comparisson", "comparisons",
+ "comparitave", "comparative",
+ "comparitive", "comparative",
+ "comparsions", "comparisons",
+ "compassione", "compassionate",
+ "compasssion", "compassion",
+ "compatabile", "compatible",
+ "compatative", "comparative",
+ "compatiable", "compatible",
+ "compatibile", "compatible",
+ "compatibily", "compatibility",
+ "compeditive", "competitive",
+ "compeditors", "competitors",
+ "compeitions", "competitions",
+ "compeittion", "competitions",
+ "compelation", "compilation",
+ "compensante", "compensate",
+ "compensatie", "compensate",
+ "compensatin", "compensation",
+ "compenstate", "compensate",
+ "comperative", "comparative",
+ "compesition", "composition",
+ "competation", "computation",
+ "competative", "competitive",
+ "competators", "competitors",
+ "competetion", "competition",
+ "competetors", "competitors",
+ "competiters", "competitors",
+ "competiting", "competition",
+ "competitior", "competitor",
+ "competitivo", "competition",
+ "competitoin", "competitions",
+ "competitons", "competitors",
+ "competution", "computation",
+ "compilacion", "compilation",
+ "compilcated", "complicate",
+ "compination", "compilation",
+ "compinsated", "compensated",
+ "compitation", "computation",
+ "compitetion", "competitions",
+ "complacient", "complacent",
+ "complciated", "complicate",
+ "compleation", "compilation",
+ "complecated", "complicated",
+ "completaste", "completes",
+ "completeing", "completing",
+ "completeion", "completion",
+ "completelly", "completely",
+ "completelyl", "completely",
+ "completelys", "completes",
+ "completenes", "completes",
+ "complexitiy", "complexity",
+ "compliacted", "complicate",
+ "compliation", "compilation",
+ "complicarte", "complicate",
+ "complicatie", "complicit",
+ "complicatii", "complicit",
+ "complicatin", "complicit",
+ "complictaed", "complicate",
+ "complimente", "complement",
+ "complimenty", "complimentary",
+ "complusions", "compulsion",
+ "compolation", "compilation",
+ "componenets", "components",
+ "componentes", "components",
+ "composicion", "composition",
+ "composiiton", "compositions",
+ "composision", "compositions",
+ "compositied", "composite",
+ "composities", "composite",
+ "compositoin", "compositions",
+ "compositons", "compositions",
+ "compositore", "composite",
+ "compostiion", "compositions",
+ "compotition", "composition",
+ "compramised", "compromised",
+ "compramises", "compromises",
+ "compremised", "compromised",
+ "compremises", "compromises",
+ "comprension", "compression",
+ "compresores", "compressor",
+ "compresssed", "compressed",
+ "compresssor", "compressor",
+ "comprimised", "compromised",
+ "comprimises", "compromises",
+ "compromessi", "compromises",
+ "compromisng", "compromising",
+ "compromisse", "compromises",
+ "compromisso", "compromises",
+ "compromized", "compromised",
+ "compulstion", "compulsion",
+ "compunation", "computation",
+ "computacion", "computation",
+ "computating", "computation",
+ "computition", "computation",
+ "conceivibly", "conceivably",
+ "concencrate", "concentrate",
+ "concentrace", "concentrate",
+ "concentrade", "concentrated",
+ "concentrait", "concentrate",
+ "concentrant", "concentrate",
+ "concentrare", "concentrate",
+ "concentrato", "concentration",
+ "concertmate", "concentrate",
+ "conceviable", "conceivable",
+ "conceviably", "conceivably",
+ "concidering", "considering",
+ "conciveable", "conceivable",
+ "conciveably", "conceivably",
+ "conclsuions", "concussions",
+ "concludendo", "concluded",
+ "conclussion", "conclusions",
+ "conclussive", "conclusive",
+ "conclutions", "conclusions",
+ "concsiously", "consciously",
+ "conculsions", "conclusions",
+ "concusssion", "concussions",
+ "condeferacy", "confederacy",
+ "condicional", "conditional",
+ "condidtions", "conditions",
+ "conditionar", "conditioner",
+ "conditionel", "conditional",
+ "condolances", "condolences",
+ "condolenses", "condolences",
+ "condolonces", "condolences",
+ "conductiong", "conducting",
+ "condulences", "condolences",
+ "conenctions", "connections",
+ "conescutive", "consecutive",
+ "confedaracy", "confederacy",
+ "confedarate", "confederate",
+ "confederecy", "confederacy",
+ "conferances", "conferences",
+ "conferedate", "confederate",
+ "confererate", "confederate",
+ "confescated", "confiscated",
+ "confesssion", "confessions",
+ "confidantly", "confidently",
+ "configurare", "configure",
+ "configurate", "configure",
+ "configurato", "configuration",
+ "confilcting", "conflicting",
+ "confisgated", "confiscated",
+ "conflciting", "conflicting",
+ "confortable", "comfortable",
+ "confrontato", "confrontation",
+ "confussions", "confessions",
+ "congrassman", "congressman",
+ "congratuate", "congratulate",
+ "conicidence", "coincidence",
+ "conjonction", "conjunction",
+ "conjucntion", "conjunction",
+ "conjuncting", "conjunction",
+ "conlcusions", "conclusions",
+ "connatation", "connotation",
+ "connecitcut", "connecticut",
+ "connecticon", "connection",
+ "connectiong", "connecting",
+ "connectivty", "connectivity",
+ "connetation", "connotation",
+ "connonation", "connotation",
+ "connotacion", "connotation",
+ "conontation", "connotation",
+ "conotations", "connotations",
+ "conquerring", "conquering",
+ "consdidered", "considered",
+ "consectuive", "consecutive",
+ "consecuence", "consequence",
+ "conseguence", "consequence",
+ "conselation", "consolation",
+ "consentrate", "concentrate",
+ "consequenes", "consequence",
+ "consequense", "consequences",
+ "consequente", "consequence",
+ "consequenty", "consequently",
+ "consequtive", "consecutive",
+ "conservanti", "conservation",
+ "conservatie", "conservatives",
+ "conservaton", "conservation",
+ "consficated", "confiscated",
+ "considerabe", "considerate",
+ "considerais", "considers",
+ "considerant", "considerate",
+ "considerato", "consideration",
+ "considerble", "considerable",
+ "considerbly", "considerably",
+ "considereis", "considers",
+ "consilation", "consolation",
+ "consilidate", "consolidate",
+ "consistance", "consistency",
+ "consistenly", "consistently",
+ "consistensy", "consistency",
+ "consistenty", "consistently",
+ "consitution", "constitution",
+ "conslutants", "consultant",
+ "consolacion", "consolation",
+ "consoldiate", "consolidate",
+ "consolidare", "consolidate",
+ "consolodate", "consolidate",
+ "consomation", "consolation",
+ "conspiraces", "conspiracies",
+ "conspiracys", "conspiracies",
+ "conspirancy", "conspiracy",
+ "constantins", "constants",
+ "constantivs", "constants",
+ "constarints", "constraint",
+ "constituant", "constituent",
+ "constituion", "constitution",
+ "constituite", "constitute",
+ "constitutie", "constitutes",
+ "constrating", "constraint",
+ "constriants", "constraints",
+ "construcing", "constructing",
+ "construcion", "construction",
+ "construcive", "constructive",
+ "constructie", "constructive",
+ "constructos", "constructs",
+ "constructur", "constructor",
+ "constructus", "constructs",
+ "constuction", "construction",
+ "consturcted", "constructed",
+ "consuelling", "counselling",
+ "consulation", "consolation",
+ "consultaion", "consultation",
+ "consultanti", "consultation",
+ "consumation", "consumption",
+ "consumbales", "consumables",
+ "consumersim", "consumerism",
+ "consumibles", "consumables",
+ "contagiosum", "contagious",
+ "containered", "contained",
+ "containmemt", "containment",
+ "containters", "containers",
+ "containting", "containing",
+ "contaminato", "contamination",
+ "contaminent", "containment",
+ "contaminted", "contaminated",
+ "contancting", "contracting",
+ "contanimate", "contaminated",
+ "contemplare", "contemplate",
+ "contempoary", "contemporary",
+ "contemporay", "contemporary",
+ "contencious", "contentious",
+ "contenental", "continental",
+ "contengency", "contingency",
+ "contenintal", "continental",
+ "contenplate", "contemplate",
+ "contensious", "contentious",
+ "contentants", "contestants",
+ "contentuous", "contentious",
+ "contestaste", "contestants",
+ "contestents", "contestants",
+ "contianment", "containment",
+ "contientous", "contentious",
+ "contimplate", "contemplate",
+ "continenets", "continents",
+ "continentes", "continents",
+ "continentul", "continental",
+ "contingancy", "contingency",
+ "contingient", "contingent",
+ "contingincy", "contingency",
+ "continously", "continuously",
+ "continuarla", "continual",
+ "continuarlo", "continual",
+ "continuasse", "continues",
+ "continueing", "continuing",
+ "continuemos", "continues",
+ "continueous", "continuous",
+ "continuious", "continuous",
+ "continuning", "continuing",
+ "continunity", "continuity",
+ "continuosly", "continuously",
+ "continuting", "continuing",
+ "continutity", "continuity",
+ "continuuing", "continuing",
+ "continuuity", "continuity",
+ "contirbuted", "contributed",
+ "contiunally", "continually",
+ "contraccion", "contraction",
+ "contraddice", "contradicted",
+ "contradices", "contradicts",
+ "contradtion", "contraction",
+ "contraversy", "controversy",
+ "contreversy", "controversy",
+ "contribuent", "contribute",
+ "contribuito", "contribution",
+ "contributer", "contributor",
+ "contributie", "contribute",
+ "contributin", "contribution",
+ "contributos", "contributors",
+ "contribuyes", "contributes",
+ "contricting", "contracting",
+ "contriction", "contraction",
+ "contridicts", "contradicts",
+ "contriversy", "controversy",
+ "controleurs", "controllers",
+ "controllore", "controllers",
+ "controvercy", "controversy",
+ "controversa", "controversial",
+ "contrubutes", "contributes",
+ "contructing", "contracting",
+ "contruction", "construction",
+ "contructors", "contractors",
+ "conveinence", "convenience",
+ "conveneince", "convenience",
+ "conveniance", "convenience",
+ "conveniente", "convenience",
+ "convenietly", "conveniently",
+ "conventinal", "conventional",
+ "converitble", "convertible",
+ "conversaion", "conversion",
+ "conversatin", "conversations",
+ "converseley", "conversely",
+ "converstion", "conversion",
+ "convertirea", "converter",
+ "convertirle", "convertible",
+ "convertirme", "converter",
+ "convertirte", "converter",
+ "convicitons", "convictions",
+ "convienence", "convenience",
+ "convienient", "convenient",
+ "convinceing", "convincing",
+ "convincente", "convenient",
+ "convincersi", "convinces",
+ "convirtible", "convertible",
+ "cooperacion", "cooperation",
+ "cooperativo", "cooperation",
+ "cooporation", "cooperation",
+ "cooporative", "cooperative",
+ "coordenated", "coordinated",
+ "coordenates", "coordinates",
+ "coordianted", "coordinated",
+ "coordiantes", "coordinates",
+ "coordiantor", "coordinator",
+ "coordinador", "coordinator",
+ "coordinants", "coordinates",
+ "coordinater", "coordinator",
+ "coordinaton", "coordination",
+ "coordonated", "coordinated",
+ "coordonates", "coordinates",
+ "coordonator", "coordinator",
+ "cooridnated", "coordinated",
+ "cooridnates", "coordinates",
+ "cooridnator", "coordinator",
+ "copenhaagen", "copenhagen",
+ "copenhaegen", "copenhagen",
+ "copenhaguen", "copenhagen",
+ "copenhangen", "copenhagen",
+ "copmetitors", "competitors",
+ "coproration", "corporation",
+ "copyrigthed", "copyrighted",
+ "corinthains", "corinthians",
+ "corintheans", "corinthians",
+ "corinthiens", "corinthians",
+ "corinthinas", "corinthians",
+ "cornithians", "corinthians",
+ "corparation", "corporation",
+ "corperation", "corporation",
+ "corporacion", "corporation",
+ "corporativo", "corporation",
+ "corralation", "correlation",
+ "correctings", "corrections",
+ "correctivos", "corrections",
+ "correktions", "corrections",
+ "correktness", "correctness",
+ "correlacion", "correlation",
+ "correlaties", "correlates",
+ "corrilation", "correlation",
+ "corrisponds", "corresponds",
+ "corrolation", "correlation",
+ "corrosponds", "corresponds",
+ "costitution", "constitution",
+ "councellors", "councillors",
+ "counrtyside", "countryside",
+ "counsilling", "counselling",
+ "countercoat", "counteract",
+ "counteredit", "counterfeit",
+ "counterfact", "counteract",
+ "counterfait", "counterfeit",
+ "counterfest", "counterfeit",
+ "counterfiet", "counterfeit",
+ "counterpaly", "counterplay",
+ "counterpary", "counterplay",
+ "counterpath", "counterpart",
+ "counterpats", "counterparts",
+ "counterpont", "counterpoint",
+ "counterract", "counterpart",
+ "counterside", "countryside",
+ "countertrap", "counterpart",
+ "countriside", "countryside",
+ "countrycide", "countryside",
+ "countrywise", "countryside",
+ "courthourse", "courthouse",
+ "coutnerfeit", "counterfeit",
+ "coutnerpart", "counterpart",
+ "coutnerplay", "counterplay",
+ "creacionism", "creationism",
+ "creationkit", "creationist",
+ "creationsim", "creationism",
+ "creationsit", "creationist",
+ "creationsts", "creationists",
+ "creativelly", "creatively",
+ "credencials", "credentials",
+ "credentails", "credentials",
+ "credentaisl", "credentials",
+ "credientals", "credentials",
+ "credintials", "credentials",
+ "cricitising", "criticising",
+ "criculating", "circulating",
+ "cringeworhy", "cringeworthy",
+ "cringeworty", "cringeworthy",
+ "cringewothy", "cringeworthy",
+ "criticicing", "criticising",
+ "criticisied", "criticise",
+ "criticisims", "criticisms",
+ "criticisize", "criticise",
+ "criticiszed", "criticise",
+ "critisicing", "criticizing",
+ "critisising", "criticising",
+ "critizicing", "criticizing",
+ "critizising", "criticizing",
+ "critizizing", "criticizing",
+ "crockodiles", "crocodiles",
+ "crocodiller", "crocodile",
+ "crocodilule", "crocodile",
+ "croporation", "corporation",
+ "crossfiters", "crossfire",
+ "cultivative", "cultivate",
+ "curricullum", "curriculum",
+ "customizabe", "customizable",
+ "customizble", "customizable",
+ "dangeroulsy", "dangerously",
+ "dardenelles", "dardanelles",
+ "deadlifters", "deadlifts",
+ "dealershits", "dealerships",
+ "deceptivley", "deceptive",
+ "declaracion", "declaration",
+ "decleration", "declaration",
+ "declinining", "declining",
+ "decloration", "declaration",
+ "decoartions", "decoration",
+ "decomposits", "decomposes",
+ "decoratieve", "decorative",
+ "decorativos", "decorations",
+ "decotations", "decorations",
+ "decsendants", "descendants",
+ "deductiable", "deductible",
+ "defenderlas", "defenders",
+ "defenderlos", "defenders",
+ "defendernos", "defenders",
+ "defenesless", "defenseless",
+ "defenisvely", "defensively",
+ "defensivley", "defensively",
+ "deficiencey", "deficiency",
+ "deficienies", "deficiencies",
+ "deficientcy", "deficiency",
+ "definantley", "definately",
+ "definatedly", "definately",
+ "definateley", "definately",
+ "definatelly", "definately",
+ "definatelty", "definately",
+ "definatetly", "definately",
+ "definations", "definitions",
+ "definatlely", "definately",
+ "definetally", "definately",
+ "definetlely", "definetly",
+ "definitaley", "definately",
+ "definitelly", "definitely",
+ "definitevly", "definitively",
+ "definitiely", "definitively",
+ "definitieve", "definitive",
+ "definitiley", "definitively",
+ "definitivly", "definitively",
+ "definitivno", "definition",
+ "definitivos", "definitions",
+ "definitlely", "definitly",
+ "definitlety", "definitly",
+ "deflecticon", "deflection",
+ "degenererat", "degenerate",
+ "degradacion", "degradation",
+ "degradating", "degradation",
+ "degragation", "degradation",
+ "degridation", "degradation",
+ "dehyrdation", "dehydration",
+ "deinitalize", "deinitialize",
+ "delaerships", "dealerships",
+ "delapidated", "dilapidated",
+ "delcaration", "declaration",
+ "delearships", "dealerships",
+ "delevopment", "development",
+ "deliberante", "deliberate",
+ "deliberatly", "deliberately",
+ "deliberetly", "deliberately",
+ "delightlful", "delightful",
+ "deliverying", "delivering",
+ "delusionnal", "delusional",
+ "deminsional", "dimensional",
+ "democarcies", "democracies",
+ "democracize", "democracies",
+ "democractic", "democratic",
+ "democraphic", "demographic",
+ "democrasies", "democracies",
+ "democrazies", "democracies",
+ "democrocies", "democracies",
+ "demograhpic", "demographic",
+ "demographis", "demographics",
+ "demograpics", "demographics",
+ "demogrpahic", "demographic",
+ "demoninator", "denominator",
+ "demonstarte", "demonstrate",
+ "demonstates", "demonstrates",
+ "demonstraby", "demonstrably",
+ "demonstrant", "demonstrate",
+ "demonstrats", "demonstrates",
+ "demosntrate", "demonstrate",
+ "denegrating", "denigrating",
+ "denomenator", "denominator",
+ "denominador", "denominator",
+ "denominaron", "denominator",
+ "denominater", "denominator",
+ "denominaton", "denomination",
+ "denomitator", "denominator",
+ "denomonator", "denominator",
+ "denonimator", "denominator",
+ "deocrations", "decorations",
+ "deomcracies", "democracies",
+ "deparmental", "departmental",
+ "depedencies", "dependencies",
+ "dependancey", "dependency",
+ "dependencey", "dependency",
+ "dependencie", "dependence",
+ "dependenies", "dependencies",
+ "deplorabile", "deplorable",
+ "depressieve", "depressive",
+ "depresssion", "depression",
+ "deprevation", "deprivation",
+ "deprication", "deprivation",
+ "deprivating", "deprivation",
+ "deprivition", "deprivation",
+ "deprovation", "deprivation",
+ "depserately", "desperately",
+ "depseration", "desperation",
+ "deregulatin", "deregulation",
+ "derivativos", "derivatives",
+ "derivitaves", "derivatives",
+ "derivitives", "derivatives",
+ "derpivation", "deprivation",
+ "derviatives", "derivatives",
+ "descandants", "descendants",
+ "descendands", "descendants",
+ "descendends", "descended",
+ "descendenta", "descendants",
+ "descentants", "descendants",
+ "descirption", "descriptions",
+ "descprition", "descriptions",
+ "describiste", "describes",
+ "describtion", "description",
+ "descripcion", "description",
+ "descripiton", "descriptions",
+ "descripters", "descriptors",
+ "descriptoin", "descriptions",
+ "descriptons", "descriptions",
+ "descritpion", "descriptions",
+ "descrpition", "descriptions",
+ "desensitied", "desensitized",
+ "desensitzed", "desensitized",
+ "desentisize", "desensitized",
+ "desgination", "designation",
+ "designacion", "designation",
+ "designstion", "designation",
+ "desinations", "destinations",
+ "desingation", "designation",
+ "desitnation", "destination",
+ "desoriented", "disoriented",
+ "desparately", "desperately",
+ "desparation", "desperation",
+ "desperating", "desperation",
+ "desperatley", "desperately",
+ "despirately", "desperately",
+ "despiration", "desperation",
+ "destablized", "destabilized",
+ "destiantion", "destinations",
+ "destinaiton", "destinations",
+ "destinatons", "destinations",
+ "destinction", "destination",
+ "destraction", "destruction",
+ "destruccion", "destruction",
+ "destruciton", "destruction",
+ "destructivo", "destruction",
+ "destruktion", "destruction",
+ "destruktive", "destructive",
+ "deteoriated", "deteriorated",
+ "determanism", "determinism",
+ "determening", "determining",
+ "determenism", "determinism",
+ "determinare", "determine",
+ "determinato", "determination",
+ "determinded", "determine",
+ "determinsim", "determinism",
+ "detramental", "detrimental",
+ "detremental", "detrimental",
+ "detrimentul", "detrimental",
+ "detuschland", "deutschland",
+ "deustchland", "deutschland",
+ "deutchsland", "deutschland",
+ "deutcshland", "deutschland",
+ "deutschalnd", "deutschland",
+ "deutshcland", "deutschland",
+ "develepmont", "developments",
+ "develompent", "developments",
+ "developemnt", "developments",
+ "developmant", "developmental",
+ "developmetn", "developments",
+ "developmnet", "developments",
+ "developpers", "developers",
+ "develpoment", "developments",
+ "deveolpment", "developments",
+ "deveploment", "developments",
+ "devestating", "devastating",
+ "devistating", "devastating",
+ "deyhdration", "dehydration",
+ "diagnositcs", "diagnostic",
+ "diagnositic", "diagnostic",
+ "diagonstics", "diagnostic",
+ "dictatorhip", "dictatorship",
+ "dictionaire", "dictionaries",
+ "dictionairy", "dictionary",
+ "dictionarys", "dictionaries",
+ "dictionnary", "dictionary",
+ "differances", "differences",
+ "differantly", "differently",
+ "differental", "differential",
+ "differentes", "differences",
+ "differneces", "differences",
+ "differnetly", "differently",
+ "difficulity", "difficulty",
+ "difficultes", "difficulties",
+ "dificulties", "difficulties",
+ "dimensiones", "dimensions",
+ "dimentional", "dimensional",
+ "dimesnional", "dimensional",
+ "diminisheds", "diminishes",
+ "diminsihing", "diminishing",
+ "diminuitive", "diminutive",
+ "diminushing", "diminishing",
+ "dinosaurios", "dinosaurs",
+ "direccional", "directional",
+ "direcitonal", "directional",
+ "directorguy", "directory",
+ "directorios", "directors",
+ "direktional", "directional",
+ "disadvantge", "disadvantage",
+ "disagreemet", "disagreements",
+ "disagreemtn", "disagreements",
+ "disapperead", "disappeared",
+ "disapporval", "disapproval",
+ "disapprovel", "disapproval",
+ "disasterous", "disastrous",
+ "disastreous", "disastrous",
+ "disastrious", "disastrous",
+ "disastruous", "disastrous",
+ "disatisfied", "dissatisfied",
+ "disciplened", "disciplined",
+ "disciplinas", "disciplines",
+ "disciplince", "disciplines",
+ "disclipined", "disciplined",
+ "disclipines", "disciplines",
+ "discogrophy", "discography",
+ "discogrpahy", "discography",
+ "disconencts", "disconnects",
+ "disconneted", "disconnected",
+ "disconnnect", "disconnect",
+ "discontined", "discontinued",
+ "discontiued", "discontinued",
+ "discrapency", "discrepancy",
+ "discretited", "discredited",
+ "discrimante", "discriminate",
+ "discrimiate", "discriminate",
+ "discussiong", "discussing",
+ "discusssion", "discussions",
+ "disgraseful", "disgraceful",
+ "disgrateful", "disgraceful",
+ "disgrunteld", "disgruntled",
+ "disgustigly", "disgustingly",
+ "disgustingy", "disgustingly",
+ "disgustinly", "disgustingly",
+ "disicplined", "disciplined",
+ "disicplines", "disciplines",
+ "disingenuos", "disingenuous",
+ "dismanlting", "dismantling",
+ "dismantaled", "dismantled",
+ "dismanteled", "dismantled",
+ "disobediant", "disobedient",
+ "disocgraphy", "discography",
+ "disparingly", "disparagingly",
+ "dispensaire", "dispensaries",
+ "dispensarie", "dispenser",
+ "dispensiary", "dispensary",
+ "displacemnt", "displacement",
+ "disposicion", "disposition",
+ "disputandem", "disputandum",
+ "disqualifed", "disqualified",
+ "disregaring", "disregarding",
+ "dissapeared", "disappeared",
+ "dissapoined", "dissapointed",
+ "dissapointd", "dissapointed",
+ "dissapoited", "dissapointed",
+ "dissappears", "disappears",
+ "dissatisfed", "dissatisfied",
+ "disscusions", "discussions",
+ "dissertaion", "dissertation",
+ "dissipatore", "dissipate",
+ "distatesful", "distasteful",
+ "distatseful", "distasteful",
+ "disterbance", "disturbance",
+ "disticntion", "distinctions",
+ "distinciton", "distinction",
+ "distincitve", "distinctive",
+ "distinctily", "distinctly",
+ "distingiush", "distinguish",
+ "distinguise", "distinguished",
+ "distinktion", "distinction",
+ "distinquish", "distinguish",
+ "distirbance", "disturbance",
+ "distirbuted", "distribute",
+ "distirbutor", "distributor",
+ "distraccion", "distraction",
+ "distractons", "distracts",
+ "distraktion", "distraction",
+ "distribitor", "distributor",
+ "distribuent", "distribute",
+ "distribuite", "distribute",
+ "distribuito", "distribution",
+ "distributie", "distributed",
+ "distributin", "distribution",
+ "distributio", "distributor",
+ "distrobuted", "distributed",
+ "distrubance", "disturbance",
+ "distrubited", "distributed",
+ "distrubitor", "distributor",
+ "distrubuted", "distributed",
+ "distrubutor", "distributor",
+ "distructive", "destructive",
+ "distuingish", "distinguish",
+ "distunguish", "distinguish",
+ "disturbante", "disturbance",
+ "disturbence", "disturbance",
+ "disucssions", "discussions",
+ "divisionals", "divisions",
+ "doccumented", "documented",
+ "documantary", "documentary",
+ "documenatry", "documentary",
+ "documentare", "documentaries",
+ "documentato", "documentation",
+ "documentery", "documentary",
+ "documentory", "documentary",
+ "domesticted", "domesticated",
+ "dominateurs", "dominates",
+ "dominationg", "dominating",
+ "donwloading", "downloading",
+ "doublellift", "doublelift",
+ "downlaoding", "downloading",
+ "downloadbel", "downloadable",
+ "downloadbig", "downloading",
+ "downloadble", "downloadable",
+ "downvoteers", "downvoters",
+ "downvoteing", "downvoting",
+ "downvoteres", "downvoters",
+ "downvoteros", "downvoters",
+ "downvoteurs", "downvoters",
+ "downvotters", "downvoters",
+ "downvotting", "downvoting",
+ "dramaticaly", "dramatically",
+ "dramaticlly", "dramatically",
+ "drasitcally", "drastically",
+ "dsyfunction", "dysfunction",
+ "duetschland", "deutschland",
+ "durabillity", "durability",
+ "dyanmically", "dynamically",
+ "dymanically", "dynamically",
+ "dysfonction", "dysfunction",
+ "dysfucntion", "dysfunction",
+ "dysfunciton", "dysfunction",
+ "dysfunktion", "dysfunction",
+ "earhtquakes", "earthquakes",
+ "earthqaukes", "earthquakes",
+ "earthquacks", "earthquakes",
+ "economicaly", "economically",
+ "economiclly", "economically",
+ "economisiti", "economist",
+ "economistes", "economists",
+ "educacional", "educational",
+ "effeciently", "efficiently",
+ "effecitvely", "effectively",
+ "effectivley", "effectively",
+ "efficeintly", "efficiently",
+ "efficiantly", "efficiently",
+ "efficientcy", "efficiently",
+ "effortlesly", "effortlessly",
+ "effortlessy", "effortlessly",
+ "egaletarian", "egalitarian",
+ "egalitatian", "egalitarian",
+ "egaliterian", "egalitarian",
+ "egostitical", "egotistical",
+ "egotastical", "egotistical",
+ "egotestical", "egotistical",
+ "egotisitcal", "egotistical",
+ "egotisticle", "egotistical",
+ "egotystical", "egotistical",
+ "ehtnicities", "ethnicities",
+ "ejacluation", "ejaculation",
+ "ejacualtion", "ejaculation",
+ "electoratul", "electoral",
+ "electornics", "electronics",
+ "electricain", "electrician",
+ "electricial", "electrical",
+ "electricien", "electrician",
+ "electricion", "electrician",
+ "electricman", "electrician",
+ "electrisity", "electricity",
+ "electritian", "electrician",
+ "electrocity", "electricity",
+ "electrolyes", "electrolytes",
+ "electrolyts", "electrolytes",
+ "electroncis", "electrons",
+ "electroylte", "electrolytes",
+ "elementrary", "elementary",
+ "eleminating", "eliminating",
+ "elimanation", "elimination",
+ "eliminacion", "elimination",
+ "elimintates", "eliminates",
+ "ellipitcals", "elliptical",
+ "eloquentely", "eloquently",
+ "emabrassing", "embarassing",
+ "embaraasing", "embarassing",
+ "embarasaing", "embarassing",
+ "embarassign", "embarassing",
+ "embarassimg", "embarassing",
+ "embarassing", "embarrassing",
+ "embarissing", "embarassing",
+ "embarrasing", "embarrassing",
+ "embarressed", "embarrassed",
+ "embarrssing", "embarassing",
+ "emergancies", "emergencies",
+ "emergencias", "emergencies",
+ "emergenices", "emergencies",
+ "emmediately", "immediately",
+ "emmisarries", "emissaries",
+ "emotionella", "emotionally",
+ "empahsizing", "emphasizing",
+ "empathethic", "empathetic",
+ "emphacizing", "emphasizing",
+ "emphatising", "emphasizing",
+ "emphatizing", "emphasizing",
+ "emphazising", "emphasizing",
+ "emphesizing", "emphasizing",
+ "empiracally", "empirically",
+ "empirialism", "imperialism",
+ "empirialist", "imperialist",
+ "enchamtment", "enchantment",
+ "enchancment", "enchantment",
+ "enchanement", "enchantment",
+ "enchanthing", "enchanting",
+ "enchantmant", "enchantment",
+ "enchantmens", "enchantments",
+ "enchantmets", "enchantments",
+ "encomapsses", "encompasses",
+ "encompasess", "encompasses",
+ "encompesses", "encompasses",
+ "encounteres", "encounters",
+ "encoutnered", "encountered",
+ "encryptiion", "encryption",
+ "encyclopdia", "encyclopedia",
+ "encylopedia", "encyclopedia",
+ "endagnering", "endangering",
+ "endandering", "endangering",
+ "endorcement", "endorsement",
+ "endoresment", "endorsement",
+ "engagaments", "engagements",
+ "engeneering", "engineering",
+ "enginerring", "engineering",
+ "enginnering", "engineering",
+ "enlargments", "enlargements",
+ "enligthened", "enlightened",
+ "enourmously", "enormously",
+ "enterpirses", "enterprises",
+ "enterprices", "enterprises",
+ "enterprishe", "enterprises",
+ "entertainig", "entertaining",
+ "entertwined", "entertained",
+ "enthicities", "ethnicities",
+ "enthisiasts", "enthusiasts",
+ "enthuasists", "enthusiasts",
+ "enthuisasts", "enthusiasts",
+ "enthusaists", "enthusiasts",
+ "enthusiants", "enthusiast",
+ "enthusiasic", "enthusiastic",
+ "enthusiasim", "enthusiasm",
+ "enthusiasum", "enthusiasm",
+ "enthusiatic", "enthusiastic",
+ "enthusiests", "enthusiasts",
+ "enthusigasm", "enthusiasm",
+ "enthusisast", "enthusiasts",
+ "entrepeneur", "entrepreneur",
+ "entreperure", "entrepreneur",
+ "entrepeuner", "entrepreneur",
+ "entreprener", "entrepreneurs",
+ "entreprenur", "entrepreneur",
+ "entretained", "entertained",
+ "envinroment", "environments",
+ "enviorments", "environments",
+ "enviornment", "environment",
+ "envirnoment", "environment",
+ "enviroments", "environments",
+ "enviromnent", "environments",
+ "environemnt", "environment",
+ "environmnet", "environments",
+ "envrionment", "environment",
+ "equilavents", "equivalents",
+ "equilbirium", "equilibrium",
+ "equilevants", "equivalents",
+ "equilibirum", "equilibrium",
+ "equilibriam", "equilibrium",
+ "equilibruim", "equilibrium",
+ "equivalance", "equivalence",
+ "equivalants", "equivalents",
+ "equivalenet", "equivalents",
+ "equivallent", "equivalent",
+ "equivelance", "equivalence",
+ "equivelants", "equivalents",
+ "equivelents", "equivalents",
+ "equivilants", "equivalents",
+ "equivilence", "equivalence",
+ "equivilents", "equivalents",
+ "equivlalent", "equivalent",
+ "equivlanets", "equivalents",
+ "equivolence", "equivalence",
+ "equivolents", "equivalents",
+ "essencially", "essentially",
+ "essentailly", "essentially",
+ "essentialls", "essentials",
+ "essentually", "essentially",
+ "establising", "establishing",
+ "ethicallity", "ethically",
+ "ethincities", "ethnicities",
+ "ethniticies", "ethnicities",
+ "europeaners", "europeans",
+ "europeaness", "europeans",
+ "evaluatiing", "evaluating",
+ "evaluationg", "evaluating",
+ "evangalical", "evangelical",
+ "evangelikal", "evangelical",
+ "evengalical", "evangelical",
+ "evenhtually", "eventually",
+ "everyonehas", "everyones",
+ "everyonelse", "everyones",
+ "evidentally", "evidently",
+ "exacarbated", "exacerbated",
+ "exacberated", "exacerbated",
+ "exagerating", "exaggerating",
+ "exagerrated", "exaggerated",
+ "exagerrates", "exaggerates",
+ "exaggarated", "exaggerated",
+ "exaggareted", "exaggerate",
+ "exaggeratin", "exaggeration",
+ "exaggerrate", "exaggerate",
+ "exaggurated", "exaggerated",
+ "exarcebated", "exacerbated",
+ "excalmation", "exclamation",
+ "excepcional", "exceptional",
+ "exceptionel", "exceptional",
+ "excessivley", "excessively",
+ "exceutioner", "executioner",
+ "exchanching", "exchanging",
+ "exclamacion", "exclamation",
+ "exclamating", "exclamation",
+ "exclamativo", "exclamation",
+ "exclemation", "exclamation",
+ "exclimation", "exclamation",
+ "exclucivity", "exclusivity",
+ "exclusivety", "exclusivity",
+ "exclusivily", "exclusivity",
+ "exclusivley", "exclusively",
+ "excpetional", "exceptional",
+ "exculsively", "exclusively",
+ "exculsivity", "exclusivity",
+ "execitioner", "executioner",
+ "execptional", "exceptional",
+ "exectuables", "executable",
+ "exectuioner", "executioner",
+ "executionar", "executioner",
+ "executionor", "executioner",
+ "exerciseing", "exercising",
+ "exeuctioner", "executioner",
+ "existantial", "existential",
+ "existencial", "existential",
+ "existensial", "existential",
+ "existentiel", "existential",
+ "exlcamation", "exclamation",
+ "exlcusively", "exclusively",
+ "exlcusivity", "exclusivity",
+ "exoskelaton", "exoskeleton",
+ "expansiones", "expansions",
+ "expectantcy", "expectancy",
+ "expectating", "expectation",
+ "expectional", "exceptional",
+ "expendature", "expenditure",
+ "expendeture", "expenditure",
+ "expentiture", "expenditure",
+ "expereinced", "experienced",
+ "expereinces", "experiences",
+ "experements", "experiments",
+ "experianced", "experienced",
+ "experiances", "experiences",
+ "experiemnts", "experiments",
+ "experiening", "experiencing",
+ "experimetal", "experimental",
+ "experimeted", "experimented",
+ "experssions", "expressions",
+ "expiditions", "expeditions",
+ "expierenced", "experienced",
+ "expierences", "experiences",
+ "expirements", "experiments",
+ "explainging", "explaining",
+ "explaintory", "explanatory",
+ "explanaiton", "explanations",
+ "explanetary", "explanatory",
+ "explanetory", "explanatory",
+ "explanitary", "explanatory",
+ "explanotory", "explanatory",
+ "explenation", "explanation",
+ "explenatory", "explanatory",
+ "explicitely", "explicitly",
+ "explicitily", "explicitly",
+ "explination", "explanation",
+ "explinatory", "explanatory",
+ "exploitaion", "exploitation",
+ "exploitatie", "exploitative",
+ "explonation", "exploration",
+ "exploracion", "exploration",
+ "explorating", "exploration",
+ "explorerers", "explorers",
+ "explosiones", "explosions",
+ "explotacion", "exploration",
+ "expodential", "exponential",
+ "exponantial", "exponential",
+ "exponencial", "exponential",
+ "exponentiel", "exponential",
+ "expresscoin", "expression",
+ "expressivos", "expressions",
+ "expresssive", "expressive",
+ "expressview", "expressive",
+ "exprimental", "experimental",
+ "expropiated", "expropriated",
+ "extensiones", "extensions",
+ "extensivley", "extensively",
+ "extragavant", "extravagant",
+ "extrapalate", "extrapolate",
+ "extraploate", "extrapolate",
+ "extrapolant", "extrapolate",
+ "extrapolare", "extrapolate",
+ "extrapolite", "extrapolate",
+ "extrapulate", "extrapolate",
+ "extravagent", "extravagant",
+ "extravagina", "extravagant",
+ "extravegant", "extravagant",
+ "extravigant", "extravagant",
+ "extravogant", "extravagant",
+ "extremistas", "extremists",
+ "extremistes", "extremists",
+ "extropolate", "extrapolate",
+ "fabircation", "fabrication",
+ "fabricacion", "fabrication",
+ "fabrikation", "fabrication",
+ "facilitarte", "facilitate",
+ "facilitiate", "facilitate",
+ "facillitate", "facilitate",
+ "facisnation", "fascination",
+ "facsination", "fascination",
+ "factuallity", "factually",
+ "familairity", "familiarity",
+ "familairize", "familiarize",
+ "familiaries", "familiarize",
+ "familierize", "familiarize",
+ "fanatsizing", "fantasizing",
+ "fanficitons", "fanfiction",
+ "fantacising", "fantasizing",
+ "fantacizing", "fantasizing",
+ "fantasazing", "fantasizing",
+ "fantasiaing", "fantasizing",
+ "fantasyzing", "fantasizing",
+ "fantazising", "fantasizing",
+ "fascinacion", "fascination",
+ "fascinatinf", "fascination",
+ "fascisation", "fascination",
+ "fascization", "fascination",
+ "fashionalbe", "fashionable",
+ "fashoinable", "fashionable",
+ "fatalitites", "fatalities",
+ "favoritisme", "favorites",
+ "favoutrable", "favourable",
+ "felxibility", "flexibility",
+ "feministers", "feminists",
+ "feministisk", "feminists",
+ "fermentaion", "fermentation",
+ "fermenterad", "fermented",
+ "fertilizier", "fertilizer",
+ "fertizilers", "fertilizer",
+ "festivalens", "festivals",
+ "fignernails", "fingernails",
+ "fignerprint", "fingerprint",
+ "figurativly", "figuratively",
+ "finanically", "financially",
+ "finantially", "financially",
+ "fingerpints", "fingertips",
+ "fingerpoint", "fingerprint",
+ "fingertrips", "fingertips",
+ "firefighers", "firefighters",
+ "firefigther", "firefighters",
+ "firendzoned", "friendzoned",
+ "firghtening", "frightening",
+ "flatterende", "flattered",
+ "flawlessely", "flawlessly",
+ "flawlessley", "flawlessly",
+ "flexibiltiy", "flexibility",
+ "flourescent", "fluorescent",
+ "fluctuaties", "fluctuate",
+ "fluctuative", "fluctuate",
+ "flutteryshy", "fluttershy",
+ "forcefullly", "forcefully",
+ "foreseaable", "foreseeable",
+ "foresseable", "foreseeable",
+ "forgettting", "forgetting",
+ "forgiviness", "forgiveness",
+ "formallized", "formalized",
+ "formattting", "formatting",
+ "formidabble", "formidable",
+ "formidabelt", "formidable",
+ "formidabile", "formidable",
+ "fortitudine", "fortitude",
+ "fortuantely", "fortunately",
+ "fortunantly", "fortunately",
+ "fortunatley", "fortunately",
+ "fortunetely", "fortunately",
+ "franchieses", "franchises",
+ "frankensite", "frankenstein",
+ "frankensten", "frankenstein",
+ "fransiscans", "franciscans",
+ "freindships", "friendships",
+ "freindzoned", "friendzoned",
+ "frequenices", "frequencies",
+ "frequensies", "frequencies",
+ "frequenties", "frequencies",
+ "frequentily", "frequently",
+ "frequenzies", "frequencies",
+ "friendboned", "friendzoned",
+ "friendlines", "friendlies",
+ "friendzonie", "friendzoned",
+ "frientships", "friendships",
+ "frientzoned", "friendzoned",
+ "frightenend", "frightened",
+ "frightining", "frightening",
+ "frigthening", "frightening",
+ "frinedzoned", "friendzoned",
+ "frontlinies", "frontline",
+ "frontlinjen", "frontline",
+ "frustartion", "frustrations",
+ "frustracion", "frustration",
+ "frustraited", "frustrated",
+ "frustrantes", "frustrates",
+ "frustrasion", "frustrations",
+ "frustrasted", "frustrates",
+ "frustraties", "frustrates",
+ "fucntioning", "functioning",
+ "fulfillling", "fulfilling",
+ "fulfullment", "fulfillment",
+ "fullfilment", "fulfillment",
+ "fullscreeen", "fullscreen",
+ "funcitoning", "functioning",
+ "functionaly", "functionally",
+ "functionnal", "functional",
+ "fundamentas", "fundamentals",
+ "fundamently", "fundamental",
+ "fundametals", "fundamentals",
+ "fundamnetal", "fundamentals",
+ "fundemantal", "fundamental",
+ "fundemental", "fundamental",
+ "fundimental", "fundamental",
+ "furhtermore", "furthermore",
+ "furstration", "frustration",
+ "furthremore", "furthermore",
+ "furthurmore", "furthermore",
+ "futurisitic", "futuristic",
+ "gangsterest", "gangsters",
+ "gangsterous", "gangsters",
+ "gauntlettes", "gauntlets",
+ "geneologies", "genealogies",
+ "generalizng", "generalizing",
+ "generatting", "generating",
+ "genitaliban", "genitalia",
+ "gentlemanne", "gentlemen",
+ "girlfirends", "girlfriends",
+ "girlfreinds", "girlfriends",
+ "girlfrients", "girlfriends",
+ "glorifierad", "glorified",
+ "glorifindel", "glorified",
+ "goosebumbps", "goosebumps",
+ "govenrments", "governments",
+ "govermental", "governmental",
+ "governemnts", "governments",
+ "governmanet", "governmental",
+ "governmeant", "governmental",
+ "govormental", "governmental",
+ "gracefullly", "gracefully",
+ "grahpically", "graphically",
+ "grammarical", "grammatical",
+ "grammaticly", "grammatical",
+ "grammitical", "grammatical",
+ "graphcially", "graphically",
+ "grassrooots", "grassroots",
+ "gratuitious", "gratuitous",
+ "gratuituous", "gratuitous",
+ "gravitatiei", "gravitate",
+ "grilfriends", "girlfriends",
+ "grpahically", "graphically",
+ "guaranteeds", "guarantees",
+ "guerrillera", "guerrilla",
+ "gunslingner", "gunslinger",
+ "hamburgaren", "hamburger",
+ "hamburgeres", "hamburgers",
+ "hamburglers", "hamburgers",
+ "hamburguers", "hamburgers",
+ "handlebards", "handlebars",
+ "handrwiting", "handwriting",
+ "handycapped", "handicapped",
+ "hanidcapped", "handicapped",
+ "harassement", "harassment",
+ "harrasments", "harassments",
+ "harrassment", "harassment",
+ "harvestgain", "harvesting",
+ "headquartes", "headquarters",
+ "headquaters", "headquarters",
+ "hearhtstone", "hearthstone",
+ "heartborken", "heartbroken",
+ "heartbraker", "heartbreak",
+ "heartbrakes", "heartbreak",
+ "heartsthone", "hearthstone",
+ "heaviweight", "heavyweight",
+ "heavyweigth", "heavyweight",
+ "heavywieght", "heavyweight",
+ "helicoptors", "helicopters",
+ "helicotpers", "helicopters",
+ "helicpoters", "helicopters",
+ "helictopers", "helicopters",
+ "helikopters", "helicopters",
+ "hemipsheres", "hemisphere",
+ "hemishperes", "hemisphere",
+ "herathstone", "hearthstone",
+ "heterosexal", "heterosexual",
+ "hexidecimal", "hexadecimal",
+ "hierachical", "hierarchical",
+ "hierarcical", "hierarchical",
+ "highlighing", "highlighting",
+ "highschoool", "highschool",
+ "hipopotamus", "hippopotamus",
+ "historicaly", "historically",
+ "historicans", "historians",
+ "historietas", "histories",
+ "historinhas", "historians",
+ "homecomeing", "homecoming",
+ "homecomming", "homecoming",
+ "homelesness", "homelessness",
+ "homelessess", "homelessness",
+ "homeowneris", "homeowners",
+ "homoegenous", "homogeneous",
+ "homogeneize", "homogenize",
+ "homogenious", "homogeneous",
+ "homogenuous", "homogeneous",
+ "homophoboes", "homophobe",
+ "homosexuais", "homosexuals",
+ "homosexuels", "homosexuals",
+ "hopelessely", "hopelessly",
+ "hopelessley", "hopelessly",
+ "hopsitality", "hospitality",
+ "horizonatal", "horizontal",
+ "horizontaal", "horizontal",
+ "horizontaly", "horizontally",
+ "horrendeous", "horrendous",
+ "horrendious", "horrendous",
+ "horrenduous", "horrendous",
+ "hospitalzed", "hospitalized",
+ "hospotality", "hospitality",
+ "househoulds", "households",
+ "humanitarna", "humanitarian",
+ "humanitites", "humanities",
+ "humilitaing", "humiliating",
+ "humilitaion", "humiliation",
+ "humillating", "humiliating",
+ "humillation", "humiliation",
+ "hurricaines", "hurricanes",
+ "hurricances", "hurricanes",
+ "hurricanger", "hurricane",
+ "hyperbollic", "hyperbolic",
+ "hyperbrophy", "hypertrophy",
+ "hyperthropy", "hypertrophy",
+ "hypertorphy", "hypertrophy",
+ "hypertrohpy", "hypertrophy",
+ "hypocritcal", "hypocritical",
+ "hypocritial", "hypocritical",
+ "hypocrities", "hypocrite",
+ "hypothesees", "hypotheses",
+ "hypothesies", "hypothesis",
+ "hystericaly", "hysterically",
+ "hystericlly", "hysterically",
+ "iconclastic", "iconoclastic",
+ "idealisitic", "idealistic",
+ "identifible", "identifiable",
+ "identitites", "identities",
+ "identitties", "identities",
+ "ideologiers", "ideologies",
+ "ideologisen", "ideologies",
+ "ideologiset", "ideologies",
+ "ideologiske", "ideologies",
+ "illegallity", "illegally",
+ "illegitamte", "illegitimate",
+ "illegitmate", "illegitimate",
+ "illsutrator", "illustrator",
+ "illuminanti", "illuminati",
+ "illuminarti", "illuminati",
+ "illuminatti", "illuminati",
+ "illuminauti", "illuminati",
+ "illuminiati", "illuminati",
+ "illuminista", "illuminati",
+ "illumintati", "illuminati",
+ "illustarted", "illustrated",
+ "illustartor", "illustrator",
+ "illustraded", "illustrated",
+ "illustraion", "illustration",
+ "illustrater", "illustrator",
+ "illustratie", "illustrate",
+ "illustratin", "illustrations",
+ "illustraton", "illustration",
+ "imaganative", "imaginative",
+ "imaganitive", "imaginative",
+ "imaginacion", "imagination",
+ "imaginatiei", "imaginative",
+ "imaginating", "imagination",
+ "imaginativo", "imagination",
+ "imaginitave", "imaginative",
+ "imbalanaced", "imbalanced",
+ "imbalanaces", "imbalances",
+ "imbalancers", "imbalances",
+ "immatureity", "immaturity",
+ "immedeately", "immediately",
+ "immediantly", "immediately",
+ "immediatley", "immediately",
+ "immedietely", "immediately",
+ "immideately", "immediately",
+ "immidiately", "immediately",
+ "immigraiton", "immigration",
+ "immigrantes", "immigrants",
+ "immoratlity", "immortality",
+ "immortailty", "immortality",
+ "immortalisy", "immortals",
+ "impeccabile", "impeccable",
+ "imperailist", "imperialist",
+ "imperealist", "imperialist",
+ "imperialims", "imperialism",
+ "imperialsim", "imperialism",
+ "imperiarist", "imperialist",
+ "imperically", "empirically",
+ "imperislist", "imperialist",
+ "implausable", "implausible",
+ "implausbile", "implausible",
+ "implementas", "implements",
+ "implementes", "implements",
+ "implementig", "implementing",
+ "implementos", "implements",
+ "implicacion", "implication",
+ "implicatons", "implications",
+ "implicitely", "implicitly",
+ "implicitily", "implicitly",
+ "implikation", "implication",
+ "implimented", "implemented",
+ "importantce", "importance",
+ "importently", "importantly",
+ "imporvement", "improvement",
+ "impossibile", "impossible",
+ "impossibily", "impossibly",
+ "impossibley", "impossibly",
+ "impossiblly", "impossibly",
+ "impoverised", "impoverished",
+ "impracticle", "impractical",
+ "impressario", "impresario",
+ "impresssion", "impressions",
+ "imprisonent", "imprisonment",
+ "imprisonned", "imprisoned",
+ "improbabile", "improbable",
+ "improtantly", "importantly",
+ "improvemnts", "improvements",
+ "improvished", "improvised",
+ "improvision", "improvisation",
+ "improvments", "improvements",
+ "impulsivley", "impulsive",
+ "imrpovement", "improvement",
+ "inaccessble", "inaccessible",
+ "inaccuraces", "inaccuracies",
+ "inaccurrate", "inaccurate",
+ "inadvertant", "inadvertent",
+ "inaguration", "inauguration",
+ "inahbitants", "inhabitants",
+ "incarantion", "incarnation",
+ "incarcerato", "incarceration",
+ "incarnacion", "incarnation",
+ "incentivare", "incentive",
+ "incentivate", "incentive",
+ "incentivice", "incentive",
+ "incentivies", "incentives",
+ "incidencies", "incidence",
+ "incidentaly", "incidentally",
+ "incidential", "incidental",
+ "inclanation", "inclination",
+ "inclenation", "inclination",
+ "inclinacion", "inclination",
+ "inclinaison", "inclination",
+ "incognition", "incognito",
+ "incoherrent", "incoherent",
+ "incompatble", "incompatible",
+ "incompatent", "incompetent",
+ "incompetant", "incompetent",
+ "incompitent", "incompetent",
+ "incompotent", "incompetent",
+ "incomptable", "incompatible",
+ "inconsisent", "inconsistent",
+ "inconveniet", "inconvenient",
+ "incoroprate", "incorporate",
+ "incorparate", "incorporate",
+ "incorperate", "incorporate",
+ "incorporare", "incorporate",
+ "incorported", "incorporated",
+ "incorprates", "incorporates",
+ "incorproate", "incorporated",
+ "incramental", "incremental",
+ "increadible", "incredible",
+ "incrediable", "incredible",
+ "incrediably", "incredibly",
+ "incredibile", "incredible",
+ "incredibily", "incredibly",
+ "incredibley", "incredibly",
+ "incrememnts", "increments",
+ "incremenets", "increments",
+ "incrementas", "increments",
+ "incremently", "incremental",
+ "incrementos", "increments",
+ "incrimental", "incremental",
+ "inctroduced", "introduced",
+ "indefinetly", "indefinitely",
+ "indefininte", "indefinite",
+ "indefinitly", "indefinitely",
+ "indepdenent", "independents",
+ "indepedence", "independence",
+ "indepednent", "independents",
+ "independant", "independent",
+ "independece", "independence",
+ "independens", "independents",
+ "independetn", "independents",
+ "independets", "independents",
+ "independnet", "independents",
+ "indepentend", "independents",
+ "indepentent", "independent",
+ "indianapols", "indianapolis",
+ "indicateurs", "indicates",
+ "indicatiors", "indicators",
+ "indictement", "indictment",
+ "indifferant", "indifferent",
+ "indiffernce", "indifference",
+ "indigeneous", "indigenous",
+ "indigenious", "indigenous",
+ "indigenuous", "indigenous",
+ "indigineous", "indigenous",
+ "indipendent", "independent",
+ "indirectely", "indirectly",
+ "individiual", "individual",
+ "individuais", "individuals",
+ "individualy", "individually",
+ "individuati", "individuality",
+ "individuels", "individuals",
+ "indivuduals", "individuals",
+ "industriels", "industries",
+ "ineffecitve", "ineffective",
+ "ineffektive", "ineffective",
+ "inefficeint", "inefficient",
+ "inefficiant", "inefficient",
+ "ineffictive", "ineffective",
+ "ineffizient", "inefficient",
+ "inequallity", "inequality",
+ "inevitabile", "inevitable",
+ "inevitabily", "inevitably",
+ "inevitabley", "inevitably",
+ "inevitablly", "inevitably",
+ "inexpencive", "inexpensive",
+ "inexpenisve", "inexpensive",
+ "inexperiece", "inexperience",
+ "inexperince", "inexperience",
+ "inexplicaby", "inexplicably",
+ "infallibale", "infallible",
+ "infallibile", "infallible",
+ "infectation", "infestation",
+ "inferioirty", "inferiority",
+ "infestating", "infestation",
+ "infilitrate", "infiltrate",
+ "infiltartor", "infiltrator",
+ "infiltraron", "infiltrator",
+ "infiltrarte", "infiltrate",
+ "infiltrater", "infiltrator",
+ "infiltratie", "infiltrate",
+ "infiltrerat", "infiltrate",
+ "infinitelly", "infinitely",
+ "infintrator", "infiltrator",
+ "inflamation", "inflammation",
+ "inflatabale", "inflatable",
+ "inflitrator", "infiltrator",
+ "influancing", "influencing",
+ "influencial", "influential",
+ "influencian", "influencing",
+ "influenting", "influencing",
+ "influentual", "influential",
+ "influincing", "influencing",
+ "infograhpic", "infographic",
+ "infograpgic", "infographic",
+ "infogrpahic", "infographic",
+ "informacion", "information",
+ "informatice", "informative",
+ "informatief", "informative",
+ "informatiei", "informative",
+ "informatike", "informative",
+ "informativo", "information",
+ "informitive", "informative",
+ "infrigement", "infringement",
+ "infringeing", "infringing",
+ "infromation", "information",
+ "infromative", "informative",
+ "infulential", "influential",
+ "ingerdients", "ingredients",
+ "ingrediants", "ingredients",
+ "ingreidents", "ingredient",
+ "ingriedents", "ingredient",
+ "inhabitents", "inhabitants",
+ "inheirtance", "inheritance",
+ "inheratance", "inheritance",
+ "inheretance", "inheritance",
+ "inheritence", "inheritance",
+ "inhertiance", "inheritance",
+ "initaitives", "initiatives",
+ "initalisers", "initialisers",
+ "initalising", "initialising",
+ "initalizers", "initializers",
+ "initalizing", "initializing",
+ "initiaitive", "initiative",
+ "inititiaves", "initiatives",
+ "innocenters", "innocents",
+ "innocentius", "innocents",
+ "innoculated", "inoculated",
+ "inpsiration", "inspiration",
+ "inquisicion", "inquisition",
+ "inquisistor", "inquisitor",
+ "inquisiting", "inquisition",
+ "inquisitior", "inquisitor",
+ "inquisitivo", "inquisition",
+ "inquizition", "inquisition",
+ "insecurites", "insecurities",
+ "insensative", "insensitive",
+ "insensetive", "insensitive",
+ "insentitive", "insensitive",
+ "insepctions", "inspections",
+ "inseperable", "inseparable",
+ "insipration", "inspiration",
+ "insitutions", "institutions",
+ "insparation", "inspiration",
+ "inspecticon", "inspection",
+ "inspectoras", "inspectors",
+ "insperation", "inspiration",
+ "inspiracion", "inspiration",
+ "inspirating", "inspiration",
+ "inspriation", "inspiration",
+ "instalation", "installation",
+ "instalement", "installment",
+ "installatin", "installations",
+ "installeert", "installer",
+ "installemnt", "installment",
+ "installling", "installing",
+ "installmant", "installment",
+ "instanciate", "instantiate",
+ "instantaneu", "instantaneous",
+ "institucion", "institution",
+ "institutiei", "institute",
+ "instituttet", "institute",
+ "instraments", "instruments",
+ "instruccion", "instruction",
+ "instruciton", "instruction",
+ "instructers", "instructors",
+ "instructior", "instructor",
+ "instructios", "instructors",
+ "instructivo", "instruction",
+ "instructons", "instructors",
+ "instruktion", "instruction",
+ "instrumenal", "instrumental",
+ "instrumetal", "instrumental",
+ "insturction", "instruction",
+ "insturctors", "instructors",
+ "insturments", "instruments",
+ "instutition", "institution",
+ "instutution", "institution",
+ "insufficent", "insufficient",
+ "insuinating", "insinuating",
+ "insuniating", "insinuating",
+ "insurgencey", "insurgency",
+ "intangiable", "intangible",
+ "intangibile", "intangible",
+ "inteferring", "interfering",
+ "integracion", "integration",
+ "integratron", "integration",
+ "integrering", "interfering",
+ "intelectual", "intellectual",
+ "inteligence", "intelligence",
+ "intellectul", "intellectuals",
+ "intellectus", "intellectuals",
+ "intellecual", "intellectual",
+ "intellegent", "intelligent",
+ "intelligant", "intelligent",
+ "intencional", "intentional",
+ "intentionly", "intentional",
+ "interaccion", "interaction",
+ "interactice", "interactive",
+ "interacties", "interacts",
+ "interactifs", "interacts",
+ "interactins", "interacts",
+ "interactios", "interacts",
+ "interactivo", "interaction",
+ "interactons", "interacts",
+ "interaktion", "interaction",
+ "interaktive", "interactive",
+ "interasting", "interacting",
+ "intercation", "integration",
+ "interceptin", "interception",
+ "intercoarse", "intercourse",
+ "intercource", "intercourse",
+ "interecting", "interacting",
+ "interection", "interaction",
+ "interelated", "interrelated",
+ "interersted", "interpreted",
+ "interesring", "interfering",
+ "interessted", "interested",
+ "interferece", "interference",
+ "interferens", "interferes",
+ "interferire", "interfere",
+ "interfernce", "interference",
+ "interferred", "interfere",
+ "interferres", "interferes",
+ "intergation", "integration",
+ "intergrated", "integrated",
+ "intermedate", "intermediate",
+ "intermedite", "intermediate",
+ "intermitent", "intermittent",
+ "internation", "international",
+ "interneters", "internets",
+ "internetese", "internets",
+ "internetest", "internets",
+ "interneting", "interesting",
+ "internetors", "internets",
+ "internettes", "internets",
+ "interperted", "interpreted",
+ "interperter", "interpreter",
+ "interprered", "interpreter",
+ "interpretor", "interpreter",
+ "interratial", "interracial",
+ "interresing", "interfering",
+ "interrogato", "interrogation",
+ "interrputed", "interrupted",
+ "interruping", "interrupting",
+ "interruptes", "interrupts",
+ "interruptis", "interrupts",
+ "intersecton", "intersection",
+ "interstelar", "interstellar",
+ "intertained", "intertwined",
+ "intertvined", "intertwined",
+ "intertwyned", "intertwined",
+ "intervalles", "intervals",
+ "intervation", "integration",
+ "interveiwed", "interviewed",
+ "interveiwer", "interviewer",
+ "intervenion", "intervening",
+ "intervenire", "intervene",
+ "interventie", "intervene",
+ "intervewing", "intervening",
+ "interviened", "interviewed",
+ "interviewes", "interviews",
+ "interviewie", "interviewer",
+ "intervining", "intervening",
+ "interwebers", "interwebs",
+ "interwiever", "interviewer",
+ "intestinces", "intestines",
+ "inticracies", "intricacies",
+ "intimadated", "intimidated",
+ "intimidades", "intimidated",
+ "intimidante", "intimidate",
+ "intimidatie", "intimidated",
+ "intimidatin", "intimidation",
+ "intimidaton", "intimidation",
+ "intimidiate", "intimidate",
+ "intiminated", "intimidated",
+ "intimitaded", "intimidated",
+ "intimitated", "intimidated",
+ "intiutively", "intuitively",
+ "intoleranse", "intolerance",
+ "intolerante", "intolerance",
+ "intolerence", "intolerance",
+ "intolernace", "intolerance",
+ "intolorance", "intolerance",
+ "intolorence", "intolerance",
+ "intorducing", "introducing",
+ "intorverted", "introverted",
+ "intoxicatin", "intoxication",
+ "intoxicaton", "intoxication",
+ "intoxinated", "intoxicated",
+ "intoxocated", "intoxicated",
+ "intracacies", "intricacies",
+ "intracicies", "intricacies",
+ "intraverted", "introverted",
+ "intrecacies", "intricacies",
+ "intrepreted", "interpreted",
+ "intrepreter", "interpreter",
+ "intrerupted", "interrupted",
+ "intricasies", "intricacies",
+ "intricicies", "intricacies",
+ "intrigueing", "intriguing",
+ "intrinsisch", "intrinsic",
+ "introducion", "introduction",
+ "introducted", "introduced",
+ "introductie", "introduce",
+ "introvertie", "introverted",
+ "introvertis", "introverts",
+ "intruducing", "introducing",
+ "intrumental", "instrumental",
+ "intuatively", "intuitively",
+ "intuitevely", "intuitively",
+ "intuitivley", "intuitively",
+ "intuituvely", "intuitively",
+ "inutitively", "intuitively",
+ "invaldiates", "invalidates",
+ "invalidades", "invalidates",
+ "invalidante", "invalidate",
+ "invariabley", "invariably",
+ "invariablly", "invariably",
+ "inventiones", "inventions",
+ "invesitgate", "investigate",
+ "investagate", "investigate",
+ "investiagte", "investigate",
+ "investigare", "investigate",
+ "invincibile", "invincible",
+ "invincinble", "invincible",
+ "invisibiity", "invisibility",
+ "invisibiliy", "invisibility",
+ "invokations", "invocations",
+ "involantary", "involuntary",
+ "involentary", "involuntary",
+ "involintary", "involuntary",
+ "involontary", "involuntary",
+ "involunatry", "involuntary",
+ "invulnerabe", "invulnerable",
+ "invulnerble", "invulnerable",
+ "iresistable", "irresistible",
+ "iresistably", "irresistibly",
+ "iresistible", "irresistible",
+ "iresistibly", "irresistibly",
+ "irrationaly", "irrationally",
+ "irrationnal", "irrational",
+ "islamisists", "islamists",
+ "islamisters", "islamists",
+ "islamistisk", "islamists",
+ "isntruments", "instruments",
+ "jacksonvile", "jacksonville",
+ "jailbroaken", "jailbroken",
+ "jailbrocken", "jailbroken",
+ "jounralists", "journalists",
+ "jouranlists", "journalists",
+ "journalisim", "journalism",
+ "journalistc", "journalistic",
+ "journolists", "journalists",
+ "judegmental", "judgemental",
+ "judgamental", "judgemental",
+ "judgementle", "judgemental",
+ "judgementsl", "judgemental",
+ "judgenental", "judgemental",
+ "jugdemental", "judgemental",
+ "juggernaugt", "juggernaut",
+ "juggernault", "juggernaut",
+ "juggernaunt", "juggernaut",
+ "justifyable", "justifiable",
+ "kidnappning", "kidnapping",
+ "kidnappping", "kidnapping",
+ "kilometeres", "kilometers",
+ "kindergaten", "kindergarten",
+ "knowledgabe", "knowledgable",
+ "knowledgble", "knowledgable",
+ "kryptoninte", "kryptonite",
+ "lacklusture", "lackluster",
+ "laughablely", "laughably",
+ "legalizaing", "legalizing",
+ "legalizaton", "legalization",
+ "legalizeing", "legalizing",
+ "legenadries", "legendaries",
+ "legendaires", "legendaries",
+ "legendarios", "legendaries",
+ "legendarisk", "legendaries",
+ "legendaryes", "legendaries",
+ "legenderies", "legendaries",
+ "legilsation", "legislation",
+ "legislacion", "legislation",
+ "legislativo", "legislation",
+ "legistation", "legislation",
+ "legistative", "legislative",
+ "legistators", "legislators",
+ "legitematly", "legitimately",
+ "legitimancy", "legitimacy",
+ "legitimatcy", "legitimacy",
+ "legitimatly", "legitimately",
+ "legitimetly", "legitimately",
+ "legnedaries", "legendaries",
+ "lengedaries", "legendaries",
+ "liberalisim", "liberalism",
+ "liberatrian", "libertarians",
+ "libertairan", "libertarians",
+ "libertarain", "libertarian",
+ "libertarias", "libertarians",
+ "libertarien", "libertarian",
+ "libertaryan", "libertarian",
+ "libertatian", "libertarian",
+ "liberterian", "libertarian",
+ "libguistics", "linguistics",
+ "libretarian", "libertarian",
+ "lieutennant", "lieutenant",
+ "lieutentant", "lieutenant",
+ "lightenning", "lightening",
+ "lightenting", "lightening",
+ "lightheared", "lighthearted",
+ "lightheated", "lighthearted",
+ "lightweigth", "lightweight",
+ "lightwieght", "lightweight",
+ "lightwright", "lightweight",
+ "ligthweight", "lightweight",
+ "limitaitons", "limitation",
+ "linguisitcs", "linguistics",
+ "linguisitic", "linguistic",
+ "lingusitics", "linguistics",
+ "lithuaninan", "lithuania",
+ "littlefiger", "littlefinger",
+ "littlefiner", "littlefinger",
+ "lockscreeen", "lockscreen",
+ "longevitity", "longevity",
+ "lotharingen", "lothringen",
+ "louisvillle", "louisville",
+ "maginficent", "magnificent",
+ "magneficent", "magnificent",
+ "magnicifent", "magnificent",
+ "magnifacent", "magnificent",
+ "magnifecent", "magnificent",
+ "magnificant", "magnificent",
+ "magnitudine", "magnitude",
+ "maintainted", "maintained",
+ "maintanance", "maintenance",
+ "maintanence", "maintenance",
+ "maintenence", "maintenance",
+ "maintianing", "maintaining",
+ "maintinaing", "maintaining",
+ "maintinance", "maintenance",
+ "maintinence", "maintenance",
+ "malfonction", "malfunction",
+ "malfucntion", "malfunction",
+ "malfunciton", "malfunction",
+ "malfuncting", "malfunction",
+ "malfunktion", "malfunction",
+ "malpractise", "malpractice",
+ "malpractive", "malpractice",
+ "maneouvring", "manoeuvring",
+ "manifestado", "manifesto",
+ "manifestano", "manifesto",
+ "manifestato", "manifesto",
+ "manifestion", "manifesto",
+ "manifestior", "manifesto",
+ "manifestons", "manifests",
+ "manifestors", "manifests",
+ "manipluated", "manipulated",
+ "manipualted", "manipulated",
+ "manipulatie", "manipulative",
+ "manipulatin", "manipulation",
+ "manipulaton", "manipulation",
+ "maniuplated", "manipulated",
+ "mannerisims", "mannerisms",
+ "manslaugher", "manslaughter",
+ "manslaugter", "manslaughter",
+ "manufacters", "manufactures",
+ "manufacteur", "manufactures",
+ "manufactued", "manufactured",
+ "manufactuer", "manufacture",
+ "manufacturs", "manufactures",
+ "manufacuter", "manufacture",
+ "manufacutre", "manufactures",
+ "manufatured", "manufactured",
+ "manupilated", "manipulated",
+ "marganilize", "marginalized",
+ "marhsmallow", "marshmallow",
+ "marijuannas", "marijuana",
+ "markerplace", "marketplace",
+ "marketpalce", "marketplace",
+ "marshamllow", "marshmallow",
+ "marshmalows", "marshmallows",
+ "masculanity", "masculinity",
+ "masculenity", "masculinity",
+ "masrhmallow", "marshmallow",
+ "mastermined", "mastermind",
+ "masterpeace", "masterpiece",
+ "masterpeice", "masterpiece",
+ "mastrubated", "masturbated",
+ "mastrubates", "masturbate",
+ "masturabted", "masturbated",
+ "masturbaing", "masturbating",
+ "masturbarte", "masturbate",
+ "masturbathe", "masturbated",
+ "masturbatie", "masturbated",
+ "masturbatin", "masturbation",
+ "masturbaton", "masturbation",
+ "masturbsted", "masturbated",
+ "masturpiece", "masterpiece",
+ "masuclinity", "masculinity",
+ "matchamking", "matchmaking",
+ "materalists", "materialist",
+ "materialsim", "materialism",
+ "mathamatics", "mathematics",
+ "mathcmaking", "matchmaking",
+ "mathemagics", "mathematics",
+ "mathemetics", "mathematics",
+ "mathimatics", "mathematics",
+ "matieralism", "materialism",
+ "maybelleine", "maybelline",
+ "maybelliene", "maybelline",
+ "maybellinne", "maybelline",
+ "maybellline", "maybelline",
+ "mdifielders", "midfielders",
+ "meatballers", "meatballs",
+ "mecernaries", "mercenaries",
+ "mechanicaly", "mechanically",
+ "mechanichal", "mechanical",
+ "mechaniclly", "mechanically",
+ "mechanicsms", "mechanisms",
+ "mechanisims", "mechanism",
+ "mechanismus", "mechanisms",
+ "medicaitons", "medications",
+ "medicineras", "medicines",
+ "meditatiing", "meditating",
+ "meditationg", "meditating",
+ "mentionning", "mentioning",
+ "mercanaries", "mercenaries",
+ "mercaneries", "mercenaries",
+ "mercenaires", "mercenaries",
+ "mercenarias", "mercenaries",
+ "mercenarios", "mercenaries",
+ "merceneries", "mercenaries",
+ "merchandice", "merchandise",
+ "merchandies", "merchandise",
+ "merchanidse", "merchandise",
+ "merchanters", "merchants",
+ "merchendise", "merchandise",
+ "merchindise", "merchandise",
+ "mercinaries", "mercenaries",
+ "mercineries", "mercenaries",
+ "metabolisim", "metabolism",
+ "metabolitic", "metabolic",
+ "metaphisics", "metaphysics",
+ "metaphorial", "metaphorical",
+ "metaphorics", "metaphors",
+ "metaphsyics", "metaphysics",
+ "metaphyiscs", "metaphysics",
+ "methodoligy", "methodology",
+ "metholodogy", "methodology",
+ "metropolian", "metropolitan",
+ "metropolies", "metropolis",
+ "metropollis", "metropolis",
+ "metropolois", "metropolis",
+ "micorcenter", "microcenter",
+ "micorphones", "microphones",
+ "microcender", "microcenter",
+ "microcentre", "microcenter",
+ "microcentro", "microcenter",
+ "microhpones", "microphones",
+ "microscrope", "microscope",
+ "microwavees", "microwaves",
+ "microwavers", "microwaves",
+ "midfeilders", "midfielders",
+ "midfiedlers", "midfielders",
+ "midfileders", "midfielders",
+ "midifelders", "midfielders",
+ "millienaire", "millionaire",
+ "millionairs", "millionaires",
+ "millionarie", "millionaire",
+ "millioniare", "millionaire",
+ "mindlessely", "mindlessly",
+ "mindlessley", "mindlessly",
+ "minimalstic", "minimalist",
+ "ministerens", "ministers",
+ "ministerios", "ministers",
+ "minneaoplis", "minneapolis",
+ "minneaplois", "minneapolis",
+ "minniapolis", "minneapolis",
+ "miraculaous", "miraculous",
+ "miraculosly", "miraculously",
+ "miraculousy", "miraculously",
+ "mircocenter", "microcenter",
+ "mircophones", "microphones",
+ "mircoscopic", "microscopic",
+ "miscairrage", "miscarriage",
+ "miscarraige", "miscarriage",
+ "miscarridge", "miscarriage",
+ "miscarriege", "miscarriage",
+ "mischeivous", "mischievous",
+ "mischevious", "mischievous",
+ "misdameanor", "misdemeanor",
+ "misdeamenor", "misdemeanor",
+ "misdemeaner", "misdemeanor",
+ "misdemenaor", "misdemeanor",
+ "misdemenors", "misdemeanors",
+ "misdimeanor", "misdemeanor",
+ "misdomeanor", "misdemeanor",
+ "miserablely", "miserably",
+ "misfortunte", "misfortune",
+ "misimformed", "misinformed",
+ "misinterept", "misinterpret",
+ "misinterpet", "misinterpret",
+ "misoginysts", "misogynist",
+ "misognyists", "misogynist",
+ "misogyinsts", "misogynist",
+ "misogynisic", "misogynistic",
+ "misogynistc", "misogynistic",
+ "misogynstic", "misogynist",
+ "missionaire", "missionaries",
+ "missionairy", "missionary",
+ "missionares", "missionaries",
+ "missionaris", "missionaries",
+ "missionarry", "missionary",
+ "missionnary", "missionary",
+ "mississipis", "mississippi",
+ "misspeeling", "misspelling",
+ "misspellled", "misspelled",
+ "mistakengly", "mistakenly",
+ "mistakently", "mistakenly",
+ "moderatedly", "moderately",
+ "moderateurs", "moderates",
+ "moderatorin", "moderation",
+ "modificaton", "modification",
+ "moisterizer", "moisturizer",
+ "moistruizer", "moisturizer",
+ "moisturizng", "moisturizing",
+ "moisturizor", "moisturizer",
+ "moistutizer", "moisturizer",
+ "moisutrizer", "moisturizer",
+ "moleculaire", "molecular",
+ "molestating", "molestation",
+ "moleststion", "molestation",
+ "momemtarily", "momentarily",
+ "momentairly", "momentarily",
+ "momentaraly", "momentarily",
+ "momentarely", "momentarily",
+ "momenterily", "momentarily",
+ "monestaries", "monasteries",
+ "monitoreada", "monitored",
+ "monitoreado", "monitored",
+ "monogameous", "monogamous",
+ "monolitihic", "monolithic",
+ "monopollies", "monopolies",
+ "monstorsity", "monstrosity",
+ "monstrasity", "monstrosity",
+ "monstrisity", "monstrosity",
+ "monstrocity", "monstrosity",
+ "monstrosoty", "monstrosity",
+ "monstrostiy", "monstrosity",
+ "monumentaal", "monumental",
+ "monumentais", "monuments",
+ "monumentals", "monuments",
+ "monumentous", "monuments",
+ "mositurizer", "moisturizer",
+ "mosntrosity", "monstrosity",
+ "motehrboard", "motherboard",
+ "mothebroard", "motherboards",
+ "motherbaord", "motherboard",
+ "motherboads", "motherboards",
+ "motherboars", "motherboards",
+ "motherborad", "motherboard",
+ "motherbords", "motherboards",
+ "motherobard", "motherboards",
+ "mothreboard", "motherboards",
+ "motivatinal", "motivational",
+ "motorcicles", "motorcycles",
+ "motorcylces", "motorcycles",
+ "mouthpeices", "mouthpiece",
+ "mulitplayer", "multiplayer",
+ "mulitplying", "multiplying",
+ "multipalyer", "multiplayer",
+ "multiplater", "multiplayer",
+ "multiplebgs", "multiples",
+ "multipleies", "multiples",
+ "multitaskng", "multitasking",
+ "multitudine", "multitude",
+ "multiverese", "multiverse",
+ "multyplayer", "multiplayer",
+ "multyplying", "multiplying",
+ "muncipality", "municipality",
+ "murdererous", "murderers",
+ "musicallity", "musically",
+ "mutliplayer", "multiplayer",
+ "mutliplying", "multiplying",
+ "mysterieuse", "mysteries",
+ "mysteriosly", "mysteriously",
+ "mysteriouly", "mysteriously",
+ "mysteriousy", "mysteriously",
+ "napoleonian", "napoleonic",
+ "narcisissim", "narcissism",
+ "narcisissts", "narcissist",
+ "narcisscism", "narcissism",
+ "narcisscist", "narcissist",
+ "narcissisim", "narcissism",
+ "narcississm", "narcissism",
+ "narcississt", "narcissist",
+ "narcissistc", "narcissistic",
+ "narcissitic", "narcissistic",
+ "narcisssism", "narcissism",
+ "narcisssist", "narcissist",
+ "narcissstic", "narcissist",
+ "natioanlist", "nationalist",
+ "nationailty", "nationality",
+ "nationalesl", "nationals",
+ "nationalisn", "nationals",
+ "nationalite", "nationalist",
+ "nationalits", "nationalist",
+ "nationalizm", "nationalism",
+ "nationalsim", "nationalism",
+ "neccesarily", "necessarily",
+ "necessairly", "necessarily",
+ "necessaties", "necessities",
+ "necesseraly", "necessarily",
+ "necesserily", "necessarily",
+ "necessiates", "necessities",
+ "necessitive", "necessities",
+ "neckbeardos", "neckbeards",
+ "neckbeardus", "neckbeards",
+ "necormancer", "necromancer",
+ "necromamcer", "necromancer",
+ "necromanser", "necromancer",
+ "necromencer", "necromancer",
+ "needlessley", "needlessly",
+ "negativeity", "negativity",
+ "negativelly", "negatively",
+ "negativitiy", "negativity",
+ "negiotating", "negotiating",
+ "negligiable", "negligible",
+ "negociating", "negotiating",
+ "negociation", "negotiation",
+ "negoitating", "negotiating",
+ "negoitation", "negotiation",
+ "negotiatied", "negotiate",
+ "negotiative", "negotiate",
+ "negotiatons", "negotiations",
+ "neigborhood", "neighborhood",
+ "neigbouring", "neighbouring",
+ "neighborhod", "neighborhood",
+ "neighbourgs", "neighbours",
+ "neighouring", "neighboring",
+ "nercomancer", "necromancer",
+ "nessasarily", "necessarily",
+ "neurologial", "neurological",
+ "neurosciene", "neuroscience",
+ "neutrallity", "neutrality",
+ "neverthelss", "nevertheless",
+ "neverthless", "nevertheless",
+ "newspapaers", "newspapers",
+ "newspappers", "newspapers",
+ "nieghboring", "neighboring",
+ "nightmarket", "nightmare",
+ "nonsencical", "nonsensical",
+ "nonsenscial", "nonsensical",
+ "nonsensicle", "nonsensical",
+ "normallized", "normalized",
+ "northwesten", "northwestern",
+ "nostalgisch", "nostalgic",
+ "noteworthly", "noteworthy",
+ "noticeabley", "noticeably",
+ "notificaton", "notification",
+ "notoriuosly", "notoriously",
+ "numericable", "numerical",
+ "nurtitional", "nutritional",
+ "nutricional", "nutritional",
+ "nutrutional", "nutritional",
+ "obamination", "abomination",
+ "obersvation", "observation",
+ "obilterated", "obliterated",
+ "objectivety", "objectivity",
+ "objectivify", "objectivity",
+ "objectivily", "objectivity",
+ "objectivley", "objectively",
+ "obliberated", "obliterated",
+ "obliderated", "obliterated",
+ "obligerated", "obliterated",
+ "oblitarated", "obliterated",
+ "obliteraded", "obliterated",
+ "obliterared", "obliterated",
+ "oblitirated", "obliterated",
+ "oblitorated", "obliterated",
+ "obliverated", "obliterated",
+ "observacion", "observation",
+ "observaiton", "observant",
+ "observasion", "observations",
+ "observating", "observation",
+ "observerats", "observers",
+ "obsessivley", "obsessive",
+ "obstruccion", "obstruction",
+ "obstruktion", "obstruction",
+ "obsturction", "obstruction",
+ "obversation", "observation",
+ "ocasionally", "occasionally",
+ "ocassionaly", "occasionally",
+ "occasionals", "occasions",
+ "occasionaly", "occasionally",
+ "occasionnal", "occasional",
+ "occassional", "occasional",
+ "occassioned", "occasioned",
+ "occurrances", "occurrences",
+ "offensivley", "offensively",
+ "offesnively", "offensively",
+ "officiallly", "officially",
+ "olbiterated", "obliterated",
+ "omniscienct", "omniscient",
+ "operacional", "operational",
+ "operasional", "operational",
+ "operationel", "operational",
+ "oppresssing", "oppressing",
+ "oppresssion", "oppression",
+ "opprotunity", "opportunity",
+ "optimisitic", "optimistic",
+ "optimizaton", "optimization",
+ "optmization", "optimization",
+ "orchestraed", "orchestrated",
+ "orchestrial", "orchestra",
+ "oreintation", "orientation",
+ "organisaton", "organisation",
+ "organiserad", "organised",
+ "organistion", "organisation",
+ "organizarea", "organizer",
+ "organizarem", "organizer",
+ "organizarme", "organizer",
+ "organizarte", "organizer",
+ "organiztion", "organization",
+ "oridinarily", "ordinarily",
+ "orientacion", "orientation",
+ "originially", "originally",
+ "originnally", "originally",
+ "origniality", "originality",
+ "ostensiably", "ostensibly",
+ "ostensibily", "ostensibly",
+ "outclasssed", "outclassed",
+ "outnunbered", "outnumbered",
+ "outperfroms", "outperform",
+ "outpreforms", "outperform",
+ "outrageosly", "outrageously",
+ "outrageouly", "outrageously",
+ "outragerous", "outrageous",
+ "outskirters", "outskirts",
+ "outsorucing", "outsourcing",
+ "outsourcade", "outsourced",
+ "outsoursing", "outsourcing",
+ "overbraking", "overbearing",
+ "overcapping", "overlapping",
+ "overcharing", "overarching",
+ "overclcoked", "overclocked",
+ "overclicked", "overclocked",
+ "overcloaked", "overclocked",
+ "overclocing", "overclocking",
+ "overclockig", "overclocking",
+ "overclocled", "overclocked",
+ "overcomeing", "overcoming",
+ "overcomming", "overcoming",
+ "overeaching", "overarching",
+ "overfapping", "overlapping",
+ "overheading", "overheating",
+ "overhooking", "overlooking",
+ "overhwelmed", "overwhelmed",
+ "overkapping", "overlapping",
+ "overklocked", "overclocked",
+ "overlapsing", "overlapping",
+ "overlcocked", "overclocked",
+ "overlcoking", "overlooking",
+ "overlooming", "overlooking",
+ "overloooked", "overlooked",
+ "overlordess", "overlords",
+ "overmapping", "overlapping",
+ "overpooling", "overlooking",
+ "overpovered", "overpowered",
+ "overpoweing", "overpowering",
+ "overreacing", "overreacting",
+ "overreactin", "overreaction",
+ "overreacton", "overreaction",
+ "overshaddow", "overshadowed",
+ "overshadowd", "overshadowed",
+ "overtapping", "overlapping",
+ "overthining", "overthinking",
+ "overthinkig", "overthinking",
+ "overvlocked", "overclocked",
+ "overwealmed", "overwhelmed",
+ "overwelming", "overwhelming",
+ "overwhelemd", "overwhelmed",
+ "overwhelimg", "overwhelm",
+ "overwheling", "overwhelming",
+ "overwhemled", "overwhelmed",
+ "overwhlemed", "overwhelmed",
+ "overwritted", "overwrite",
+ "pakistanais", "pakistani",
+ "pakistanezi", "pakistani",
+ "palceholder", "placeholder",
+ "palesitnian", "palestinians",
+ "palestenian", "palestinian",
+ "palestinain", "palestinians",
+ "palestinans", "palestinians",
+ "palestinier", "palestine",
+ "palistinian", "palestinian",
+ "palythrough", "playthrough",
+ "papanicalou", "papanicolaou",
+ "parachutage", "parachute",
+ "paragraphes", "paragraphs",
+ "paramedicks", "paramedics",
+ "paramedicos", "paramedics",
+ "parameteres", "parameters",
+ "paranthesis", "parenthesis",
+ "parapharsed", "paraphrase",
+ "paraprhased", "paraphrase",
+ "parasitisme", "parasites",
+ "parenthasis", "parenthesis",
+ "parenthesys", "parentheses",
+ "parenthises", "parenthesis",
+ "parenthisis", "parenthesis",
+ "parliamenty", "parliamentary",
+ "parntership", "partnership",
+ "parrallelly", "parallelly",
+ "partecipant", "participant",
+ "partecipate", "participate",
+ "parternship", "partnership",
+ "partiarchal", "patriarchal",
+ "particapate", "participate",
+ "particiapte", "participate",
+ "participait", "participant",
+ "participans", "participants",
+ "participare", "participate",
+ "participatd", "participant",
+ "participati", "participant",
+ "participats", "participant",
+ "participent", "participant",
+ "particpiate", "participated",
+ "particually", "particularly",
+ "particulaly", "particularly",
+ "particulary", "particularly",
+ "partnetship", "partnership",
+ "partonizing", "patronizing",
+ "passionatly", "passionately",
+ "passionetly", "passionately",
+ "passionnate", "passionate",
+ "passporters", "passports",
+ "pathologial", "pathological",
+ "patriarchia", "patriarchal",
+ "patriarcial", "patriarchal",
+ "patriarical", "patriarchal",
+ "patriotisch", "patriotic",
+ "patriotisim", "patriotism",
+ "patriottism", "patriotism",
+ "patronozing", "patronizing",
+ "peacefullly", "peacefully",
+ "pedestirans", "pedestrians",
+ "pedestrains", "pedestrians",
+ "pedophilies", "pedophile",
+ "pedophilles", "pedophile",
+ "penetracion", "penetration",
+ "penetrading", "penetrating",
+ "penetrarion", "penetration",
+ "penninsular", "peninsular",
+ "pennsylvnia", "pennsylvania",
+ "pepperocini", "pepperoni",
+ "percantages", "percentages",
+ "percautions", "precautions",
+ "percentille", "percentile",
+ "percpetions", "perceptions",
+ "percusssion", "percussion",
+ "perdicament", "predicament",
+ "perdictable", "predictable",
+ "perdictions", "predictions",
+ "perephirals", "peripherals",
+ "pereptually", "perpetually",
+ "perferences", "preferences",
+ "perfomrance", "performances",
+ "perforamnce", "performances",
+ "performaces", "performances",
+ "performacne", "performances",
+ "performanes", "performances",
+ "performanse", "performances",
+ "performence", "performance",
+ "performnace", "performances",
+ "perfromance", "performance",
+ "perhiperals", "peripherals",
+ "perihperals", "peripherals",
+ "periodicaly", "periodically",
+ "periperhals", "peripherals",
+ "periphereal", "peripheral",
+ "peripherial", "peripheral",
+ "periphirals", "peripherals",
+ "periphreals", "peripherals",
+ "periphrials", "peripherals",
+ "perjorative", "pejorative",
+ "perliminary", "preliminary",
+ "permamently", "permanently",
+ "permanantly", "permanently",
+ "permaturely", "prematurely",
+ "permenantly", "permanently",
+ "permenently", "permanently",
+ "perminantly", "permanently",
+ "perminently", "permanently",
+ "permisisons", "permissions",
+ "permissable", "permissible",
+ "permisssion", "permissions",
+ "pernamently", "permanently",
+ "perosnality", "personality",
+ "perparation", "preparation",
+ "perpatrated", "perpetrated",
+ "perpatrator", "perpetrator",
+ "perpatuated", "perpetuated",
+ "perpatuates", "perpetuates",
+ "perpertated", "perpetuated",
+ "perpertator", "perpetrators",
+ "perpetraded", "perpetrated",
+ "perpetrador", "perpetrator",
+ "perpetraron", "perpetrator",
+ "perpetrater", "perpetrator",
+ "perpetuaded", "perpetuated",
+ "perpetutate", "perpetuate",
+ "perpetuties", "perpetuates",
+ "perpitrated", "perpetrated",
+ "perpitrator", "perpetrator",
+ "perpretated", "perpetrated",
+ "perpretator", "perpetrators",
+ "perpsective", "perspective",
+ "perputrator", "perpetrator",
+ "perputually", "perpetually",
+ "perputuated", "perpetuated",
+ "perputuates", "perpetuates",
+ "perrogative", "prerogative",
+ "persceptive", "perspectives",
+ "persectuion", "persecution",
+ "persecucion", "persecution",
+ "persecusion", "persecution",
+ "persecutted", "persecuted",
+ "persepctive", "perspective",
+ "persicution", "persecution",
+ "persistance", "persistence",
+ "persistante", "persistent",
+ "persistense", "persistence",
+ "persistente", "persistence",
+ "personhoood", "personhood",
+ "perspecitve", "perspective",
+ "perspectief", "perspective",
+ "perspektive", "perspective",
+ "persuassion", "persuasion",
+ "persuassive", "persuasive",
+ "persucution", "persecution",
+ "persumption", "presumption",
+ "pertubation", "perturbation",
+ "pessimestic", "pessimistic",
+ "pharamcists", "pharmacist",
+ "phenomenona", "phenomena",
+ "philadelpha", "philadelphia",
+ "philadelpia", "philadelphia",
+ "philiphines", "philippines",
+ "philippenes", "philippines",
+ "philippenis", "philippines",
+ "philippides", "philippines",
+ "philippinas", "philippines",
+ "philippinos", "philippines",
+ "philisopher", "philosopher",
+ "phillipines", "philippines",
+ "philosipher", "philosopher",
+ "philosopers", "philosophers",
+ "philosophae", "philosopher",
+ "philosophia", "philosophical",
+ "philosopies", "philosophies",
+ "philosphies", "philosophies",
+ "philospoher", "philosopher",
+ "photograhed", "photographed",
+ "photograher", "photographer",
+ "photograhic", "photographic",
+ "photograhpy", "photography",
+ "photograped", "photographed",
+ "photograper", "photographer",
+ "photograpgh", "photographs",
+ "photograpic", "photographic",
+ "photogrpahs", "photographs",
+ "photogrpahy", "photography",
+ "physcedelic", "psychedelic",
+ "physciatric", "psychiatric",
+ "physcopaths", "psychopaths",
+ "piankillers", "painkillers",
+ "pilgrimmage", "pilgrimage",
+ "pitchforcks", "pitchforks",
+ "pitchforkes", "pitchforks",
+ "plaestinian", "palestinian",
+ "plagiariasm", "plagiarism",
+ "planeswaker", "planeswalker",
+ "planeswaler", "planeswalker",
+ "planeswalkr", "planeswalker",
+ "platfromers", "platformer",
+ "playhtrough", "playthrough",
+ "playthorugh", "playthrough",
+ "playthourgh", "playthrough",
+ "playthroguh", "playthroughs",
+ "playthrougs", "playthroughs",
+ "playthrouhg", "playthroughs",
+ "playthtough", "playthrough",
+ "playtrhough", "playthrough",
+ "ploretariat", "proletariat",
+ "policitally", "politically",
+ "policitians", "politicians",
+ "politicains", "politicians",
+ "politicanti", "politician",
+ "politiciens", "politicians",
+ "politiicans", "politician",
+ "polititians", "politicians",
+ "polyphonyic", "polyphonic",
+ "pomegranite", "pomegranate",
+ "popluations", "populations",
+ "poportional", "proportional",
+ "popoulation", "population",
+ "porjectiles", "projectiles",
+ "porletariat", "proletariat",
+ "pornagraphy", "pornography",
+ "pornograghy", "pornography",
+ "pornograhpy", "pornography",
+ "pornograpgy", "pornography",
+ "pornogrophy", "pornography",
+ "pornogrpahy", "pornography",
+ "porportions", "proportions",
+ "portestants", "protestants",
+ "portuguease", "portuguese",
+ "portuguesse", "portuguese",
+ "positionial", "positional",
+ "positionnal", "positional",
+ "positionned", "positioned",
+ "positiveity", "positivity",
+ "positiviely", "positively",
+ "positivisme", "positives",
+ "positivisty", "positivity",
+ "positivitey", "positivity",
+ "positivitiy", "positivity",
+ "possesseurs", "possesses",
+ "possesssion", "possessions",
+ "possestions", "possessions",
+ "possiblilty", "possibility",
+ "potencially", "potentially",
+ "potentailly", "potentially",
+ "powerhourse", "powerhouse",
+ "powerlifing", "powerlifting",
+ "powerliftng", "powerlifting",
+ "pracitcally", "practically",
+ "practicarlo", "practical",
+ "practioners", "practitioners",
+ "practitions", "practitioners",
+ "pragmatisch", "pragmatic",
+ "precausions", "precautions",
+ "precedessor", "predecessor",
+ "precendence", "precedence",
+ "precentages", "percentages",
+ "preconceved", "preconceived",
+ "preconcieve", "preconceived",
+ "precuations", "precautions",
+ "predacessor", "predecessor",
+ "predecesser", "predecessor",
+ "predections", "predictions",
+ "predescesor", "predecessors",
+ "predesessor", "predecessors",
+ "predesposed", "predisposed",
+ "predessecor", "predecessor",
+ "predicatble", "predictable",
+ "predicement", "predicament",
+ "predicessor", "predecessor",
+ "prediciment", "predicament",
+ "predicitons", "predictions",
+ "predictible", "predictable",
+ "predictious", "predictions",
+ "predictment", "predicament",
+ "predisposte", "predisposed",
+ "predocessor", "predecessor",
+ "preferabbly", "preferably",
+ "preferabely", "preferable",
+ "preferabley", "preferably",
+ "preferablly", "preferably",
+ "preferances", "preferences",
+ "preferenser", "preferences",
+ "preferental", "preferential",
+ "preferentes", "preferences",
+ "preferrably", "preferably",
+ "preferrring", "preferring",
+ "preformance", "performance",
+ "pregnanices", "pregnancies",
+ "pregnencies", "pregnancies",
+ "pregorative", "prerogative",
+ "preipherals", "peripherals",
+ "prejudicies", "prejudice",
+ "preleminary", "preliminary",
+ "prelimanary", "preliminary",
+ "prelimenary", "preliminary",
+ "premanently", "permanently",
+ "prematuraly", "prematurely",
+ "prematurily", "prematurely",
+ "prematurley", "prematurely",
+ "premilinary", "preliminary",
+ "premissible", "permissible",
+ "premissions", "permissions",
+ "preorderded", "preordered",
+ "preorderers", "preorders",
+ "preparacion", "preparation",
+ "preperation", "preparation",
+ "prepetrated", "perpetrated",
+ "prepetrator", "perpetrator",
+ "prepetually", "perpetually",
+ "prepetuated", "perpetuated",
+ "prepetuates", "perpetuates",
+ "preporation", "preparation",
+ "preposterus", "preposterous",
+ "prerequesit", "prerequisite",
+ "prerequiste", "prerequisite",
+ "prerequites", "prerequisite",
+ "prerogitive", "prerogative",
+ "prerogotive", "prerogative",
+ "prescripton", "prescription",
+ "presecution", "persecution",
+ "presedintia", "presidential",
+ "presentaion", "presentation",
+ "presentatin", "presentations",
+ "preservaton", "preservation",
+ "preservered", "preserved",
+ "presidencey", "presidency",
+ "presidental", "presidential",
+ "presidentcy", "presidency",
+ "presistence", "persistence",
+ "presitgious", "prestigious",
+ "presitigous", "prestigious",
+ "presomption", "presumption",
+ "prespective", "perspective",
+ "pressureing", "pressuring",
+ "prestegious", "prestigious",
+ "prestigeous", "prestigious",
+ "prestigieus", "prestigious",
+ "prestigiosa", "prestigious",
+ "prestigiose", "prestigious",
+ "prestigiosi", "prestigious",
+ "prestigioso", "prestigious",
+ "prestiguous", "prestigious",
+ "presumabely", "presumably",
+ "presumabley", "presumably",
+ "presumptous", "presumptuous",
+ "presumptuos", "presumptuous",
+ "pretencious", "pretentious",
+ "pretendendo", "pretended",
+ "pretensious", "pretentious",
+ "pretentieus", "pretentious",
+ "prevailaing", "prevailing",
+ "prevailling", "prevailing",
+ "preventitve", "preventative",
+ "preventivno", "prevention",
+ "primatively", "primitively",
+ "princessses", "princesses",
+ "principales", "principles",
+ "principalis", "principals",
+ "principielt", "principle",
+ "privatizied", "privatized",
+ "priveledges", "privileges",
+ "privelleges", "privileges",
+ "privilegeds", "privileges",
+ "privilegied", "privileged",
+ "privilegien", "privilege",
+ "privilegier", "privilege",
+ "privilegies", "privilege",
+ "proactivley", "proactive",
+ "probabilaty", "probability",
+ "probabilite", "probabilities",
+ "probalibity", "probability",
+ "probelmatic", "problematic",
+ "problamatic", "problematic",
+ "problimatic", "problematic",
+ "problomatic", "problematic",
+ "proccedings", "proceedings",
+ "proccessing", "processing",
+ "proceddings", "proceedings",
+ "procedureal", "procedural",
+ "procedurial", "procedural",
+ "procedurile", "procedure",
+ "processesor", "processors",
+ "processeurs", "processes",
+ "processsors", "processors",
+ "procrastion", "procreation",
+ "procriation", "procreation",
+ "prodcutions", "productions",
+ "prodictions", "productions",
+ "producerats", "producers",
+ "producitons", "productions",
+ "productioin", "productions",
+ "productivos", "productions",
+ "productivty", "productivity",
+ "produktions", "productions",
+ "professinal", "professional",
+ "professionl", "professionals",
+ "professoras", "professors",
+ "professores", "professors",
+ "professorin", "profession",
+ "professsion", "professions",
+ "proficiancy", "proficiency",
+ "proficienct", "proficient",
+ "proficienty", "proficiency",
+ "proficinecy", "proficiency",
+ "profitabile", "profitable",
+ "progerssion", "progressions",
+ "progerssive", "progressives",
+ "programable", "programmable",
+ "programmare", "programmer",
+ "programmars", "programmers",
+ "programmate", "programme",
+ "programmets", "programmers",
+ "programmeur", "programmer",
+ "programmier", "programmer",
+ "programmmed", "programme",
+ "programmmer", "programme",
+ "progresison", "progressions",
+ "progressers", "progresses",
+ "progressief", "progressive",
+ "progressino", "progressions",
+ "progressivo", "progression",
+ "progressoin", "progressions",
+ "progressvie", "progressives",
+ "prohabition", "prohibition",
+ "prohibation", "prohibition",
+ "prohibicion", "prohibition",
+ "prohibiteds", "prohibits",
+ "prohibitied", "prohibited",
+ "prohibitifs", "prohibits",
+ "prohibitivo", "prohibition",
+ "prohibitons", "prohibits",
+ "prohibitted", "prohibited",
+ "projecticle", "projectile",
+ "projectives", "projectiles",
+ "projectlies", "projectiles",
+ "prolateriat", "proletariat",
+ "proletariet", "proletariat",
+ "proletariot", "proletariat",
+ "proletaryat", "proletariat",
+ "proleteriat", "proletariat",
+ "prolitariat", "proletariat",
+ "prologomena", "prolegomena",
+ "promenantly", "prominently",
+ "promenently", "prominently",
+ "prometheius", "prometheus",
+ "prometheous", "prometheus",
+ "promethesus", "prometheus",
+ "prometheyus", "prometheus",
+ "promimently", "prominently",
+ "prominantly", "prominently",
+ "prominately", "prominently",
+ "promiscious", "promiscuous",
+ "promocional", "promotional",
+ "promsicuous", "promiscuous",
+ "pronography", "pornography",
+ "pronoucning", "pronouncing",
+ "pronounched", "pronounced",
+ "pronunciato", "pronunciation",
+ "propaganada", "propaganda",
+ "properitary", "proprietary",
+ "propertiary", "proprietary",
+ "propertions", "proportions",
+ "prophechies", "prophecies",
+ "propiertary", "proprietary",
+ "propogation", "propagation",
+ "proponenets", "proponents",
+ "proponentes", "proponents",
+ "proporition", "proposition",
+ "proportians", "proportions",
+ "proportinal", "proportional",
+ "proposicion", "proposition",
+ "propositivo", "proposition",
+ "propostions", "proportions",
+ "propreitary", "proprietary",
+ "propriatary", "proprietary",
+ "propriatery", "proprietary",
+ "propriatory", "proprietary",
+ "proprietery", "proprietary",
+ "proprietory", "proprietary",
+ "propriotary", "proprietary",
+ "proprotions", "proportions",
+ "propsective", "prospective",
+ "propulstion", "propulsion",
+ "prosectuion", "prosecution",
+ "prosectuors", "prosecutors",
+ "prosecuters", "prosecutors",
+ "prosicution", "prosecution",
+ "prosocution", "prosecution",
+ "prosperious", "prosperous",
+ "prospertity", "prosperity",
+ "prospettive", "prospective",
+ "prostethics", "prosthetic",
+ "prosthethic", "prosthetic",
+ "prostitites", "prostitutes",
+ "prostitiute", "prostitute",
+ "prostituate", "prostitute",
+ "prostitudes", "prostitutes",
+ "prostituees", "prostitutes",
+ "prostituion", "prostitution",
+ "prostitures", "prostitutes",
+ "prostitutas", "prostitutes",
+ "prostitutie", "prostitute",
+ "prostitutin", "prostitution",
+ "prostitutke", "prostitutes",
+ "prostituton", "prostitution",
+ "prostitutos", "prostitutes",
+ "protability", "portability",
+ "protaganist", "protagonist",
+ "protaginist", "protagonist",
+ "protagnoist", "protagonist",
+ "protagoinst", "protagonists",
+ "protagonits", "protagonists",
+ "protagonsit", "protagonists",
+ "protectings", "protections",
+ "protectoras", "protectors",
+ "protectores", "protectors",
+ "protectrons", "protections",
+ "protelariat", "proletariat",
+ "protestents", "protestants",
+ "protistants", "protestants",
+ "protoganist", "protagonist",
+ "protogonist", "protagonist",
+ "protostants", "protestants",
+ "protototype", "prototype",
+ "provacative", "provocative",
+ "provacotive", "provocative",
+ "provicative", "provocative",
+ "providencie", "providence",
+ "provinciaal", "provincial",
+ "provinicial", "provincial",
+ "provisiones", "provisions",
+ "provoactive", "provocative",
+ "provocatief", "provocative",
+ "provocitive", "provocative",
+ "provocotive", "provocative",
+ "provokative", "provocative",
+ "pscyhedelic", "psychedelic",
+ "pscyhiatric", "psychiatric",
+ "pscyhopaths", "psychopaths",
+ "pshyciatric", "psychiatric",
+ "pshycopaths", "psychopaths",
+ "psychaitric", "psychiatric",
+ "psychedilic", "psychedelic",
+ "psychedleic", "psychedelics",
+ "psychiatist", "psychiatrist",
+ "psychidelic", "psychedelic",
+ "psychodelic", "psychedelic",
+ "psychopants", "psychopaths",
+ "psychopatch", "psychopath",
+ "psychopatic", "psychopathic",
+ "psychotisch", "psychotic",
+ "psychriatic", "psychiatric",
+ "publikation", "publication",
+ "punctiation", "punctuation",
+ "puncutation", "punctuation",
+ "punshiments", "punishments",
+ "punsihments", "punishments",
+ "purchaseing", "purchasing",
+ "purchashing", "purchasing",
+ "purposefuly", "purposefully",
+ "pyschedelic", "psychedelic",
+ "pyschiatric", "psychiatric",
+ "pyschopaths", "psychopaths",
+ "qaurterback", "quarterback",
+ "qualificato", "qualification",
+ "qualifieres", "qualifiers",
+ "quantitaive", "quantitative",
+ "quantitatve", "quantitative",
+ "quantitites", "quantities",
+ "quantitties", "quantities",
+ "quarantaine", "quarantine",
+ "quarantenni", "quarantine",
+ "quartercask", "quarterbacks",
+ "quesitoning", "questioning",
+ "questionned", "questioned",
+ "questonable", "questionable",
+ "radiaoctive", "radioactive",
+ "radioactice", "radioactive",
+ "radioactief", "radioactive",
+ "radioaktive", "radioactive",
+ "radiocative", "radioactive",
+ "raidoactive", "radioactive",
+ "reaccurring", "recurring",
+ "reactionair", "reactionary",
+ "realibility", "reliability",
+ "realistisch", "realistic",
+ "reaserchers", "researchers",
+ "reaserching", "researching",
+ "reasonabley", "reasonably",
+ "reasonablly", "reasonably",
+ "reassureing", "reassuring",
+ "reassurring", "reassuring",
+ "rebuildling", "rebuilding",
+ "rebuplicans", "republicans",
+ "reccomended", "recommended",
+ "receptionst", "receptionist",
+ "recgonition", "recognition",
+ "recgonizing", "recognizing",
+ "rechargable", "rechargeable",
+ "recipientes", "recipients",
+ "reciporcate", "reciprocate",
+ "recipricate", "reciprocate",
+ "reciprocant", "reciprocate",
+ "reciprocite", "reciprocate",
+ "recivership", "receivership",
+ "reclutantly", "reluctantly",
+ "recognicing", "recognizing",
+ "recognision", "recognition",
+ "recomending", "recommending",
+ "recommandes", "recommends",
+ "recommendes", "recommends",
+ "recommented", "recommended",
+ "reconcilled", "reconcile",
+ "recongition", "recognition",
+ "recongizing", "recognizing",
+ "reconsidder", "reconsider",
+ "recrational", "recreational",
+ "recrutiment", "recruitment",
+ "rectangluar", "rectangular",
+ "rectangualr", "rectangular",
+ "rectengular", "rectangular",
+ "recuritment", "recruitment",
+ "redundantcy", "redundancy",
+ "reevalulate", "reevaluate",
+ "reevalutate", "reevaluate",
+ "reevaulated", "reevaluate",
+ "refelctions", "reflections",
+ "referancing", "referencing",
+ "refereneced", "referenced",
+ "refereneces", "references",
+ "referincing", "referencing",
+ "referrences", "references",
+ "reflectivos", "reflections",
+ "refreshener", "refresher",
+ "refrubished", "refurbished",
+ "refubrished", "refurbished",
+ "refurbushed", "refurbished",
+ "regeneratin", "regeneration",
+ "regeneraton", "regeneration",
+ "registerdns", "registers",
+ "registeries", "registers",
+ "registerred", "registered",
+ "registraion", "registration",
+ "regocnition", "recognition",
+ "regresssion", "regression",
+ "regresssive", "regressive",
+ "regualtions", "regulations",
+ "regulationg", "regulating",
+ "regulatiors", "regulators",
+ "reinassance", "renaissance",
+ "reinforcemt", "reinforcement",
+ "reinfornced", "reinforced",
+ "reinitalise", "reinitialise",
+ "reinitalize", "reinitialize",
+ "reinstaling", "reinstalling",
+ "reinstallng", "reinstalling",
+ "reisntalled", "reinstalled",
+ "relaibility", "reliability",
+ "relatiation", "retaliation",
+ "relationshp", "relationships",
+ "relativiser", "relatives",
+ "relativisme", "relatives",
+ "relativitiy", "relativity",
+ "relativitly", "relativity",
+ "relcutantly", "reluctantly",
+ "relentlesly", "relentlessly",
+ "relentlessy", "relentlessly",
+ "relevations", "revelations",
+ "relfections", "reflections",
+ "religeously", "religiously",
+ "religionens", "religions",
+ "religioners", "religions",
+ "relpacement", "replacement",
+ "reluctently", "reluctantly",
+ "remarkabley", "remarkably",
+ "remarkablly", "remarkably",
+ "remasterred", "remastered",
+ "remembrence", "remembrance",
+ "reminescent", "reminiscent",
+ "reminicient", "reminiscent",
+ "reminiscant", "reminiscent",
+ "reminiscint", "reminiscent",
+ "reminscient", "reminiscent",
+ "reminsicent", "reminiscent",
+ "renaiisance", "renaissance",
+ "renaiscance", "renaissance",
+ "renaissanse", "renaissance",
+ "renaissence", "renaissance",
+ "renassaince", "renaissance",
+ "renassiance", "renaissance",
+ "reniassance", "renaissance",
+ "rennovating", "renovating",
+ "rennovation", "renovation",
+ "repalcement", "replacement",
+ "repbulicans", "republicans",
+ "repeateadly", "repeatedly",
+ "repectively", "respectively",
+ "repersented", "represented",
+ "replacemnet", "replacements",
+ "replacemnts", "replacements",
+ "repleacable", "replaceable",
+ "repositiory", "repository",
+ "representas", "represents",
+ "representes", "represents",
+ "represssion", "repression",
+ "reproducion", "reproduction",
+ "reproducive", "reproductive",
+ "repsectable", "respectable",
+ "repsonsible", "responsible",
+ "repsonsibly", "responsibly",
+ "republcians", "republicans",
+ "republician", "republican",
+ "republicons", "republicans",
+ "repuglicans", "republicans",
+ "requeriment", "requirement",
+ "requierment", "requirements",
+ "resemblence", "resemblance",
+ "resemblense", "resembles",
+ "reserachers", "researchers",
+ "reseraching", "researching",
+ "resgination", "resignation",
+ "residencial", "residential",
+ "residentail", "residential",
+ "residentual", "residential",
+ "resignacion", "resignation",
+ "resignating", "resignation",
+ "resignement", "resignment",
+ "resignition", "resignation",
+ "resintalled", "reinstalled",
+ "resistansen", "resistances",
+ "resistanses", "resistances",
+ "resistences", "resistances",
+ "resistnaces", "resistances",
+ "resoltuions", "resolutions",
+ "resotration", "restoration",
+ "resoultions", "resolutions",
+ "respecatble", "respectable",
+ "respectabil", "respectable",
+ "respectfuly", "respectfully",
+ "respectible", "respectable",
+ "respectivly", "respectively",
+ "respectuful", "respectful",
+ "respektable", "respectable",
+ "resperatory", "respiratory",
+ "resperitory", "respiratory",
+ "respiritory", "respiratory",
+ "respitatory", "respiratory",
+ "responcible", "responsible",
+ "responcibly", "responsibly",
+ "respondendo", "responded",
+ "responisble", "responsible",
+ "responisbly", "responsibly",
+ "responsable", "responsible",
+ "responsably", "responsibly",
+ "responsbile", "responsible",
+ "responsbily", "responsibly",
+ "responsibel", "responsibly",
+ "responsibil", "responsibly",
+ "responsivle", "responsive",
+ "resporatory", "respiratory",
+ "respository", "repository",
+ "respriatory", "respiratory",
+ "ressembling", "resembling",
+ "ressurected", "resurrected",
+ "restaraunts", "restaurants",
+ "restaruants", "restaurants",
+ "restauraunt", "restaurant",
+ "restaurents", "restaurants",
+ "resteraunts", "restaurants",
+ "restirction", "restriction",
+ "restorarion", "restoration",
+ "restorating", "restoration",
+ "restrainted", "restrained",
+ "restrective", "restrictive",
+ "restriccion", "restriction",
+ "restricitng", "restricting",
+ "restriciton", "restrictions",
+ "restricitve", "restrictive",
+ "restricteds", "restricts",
+ "restricters", "restricts",
+ "restrictied", "restrictive",
+ "restrictifs", "restricts",
+ "restrictins", "restricts",
+ "restrictios", "restricts",
+ "restrictivo", "restriction",
+ "restrictons", "restricts",
+ "restriktion", "restriction",
+ "restriktive", "restrictive",
+ "restrittive", "restrictive",
+ "restructing", "restricting",
+ "restruction", "restriction",
+ "restuarants", "restaurants",
+ "resturaunts", "restaurants",
+ "resurecting", "resurrecting",
+ "resurrecion", "resurrection",
+ "retailation", "retaliation",
+ "retalitated", "retaliated",
+ "retardathon", "retardation",
+ "retardating", "retardation",
+ "retardatron", "retardation",
+ "retartation", "retardation",
+ "retirbution", "retribution",
+ "retrebution", "retribution",
+ "retribucion", "retribution",
+ "retribuiton", "retribution",
+ "retributivo", "retribution",
+ "retribvtion", "retribution",
+ "retrobution", "retribution",
+ "retrubution", "retribution",
+ "revealtions", "revelations",
+ "revelaitons", "revelations",
+ "revolations", "revolutions",
+ "revoultions", "revolutions",
+ "ridiculious", "ridiculous",
+ "ridiculosly", "ridiculously",
+ "ridiculouly", "ridiculously",
+ "ridiculousy", "ridiculously",
+ "rightfullly", "rightfully",
+ "rolepalying", "roleplaying",
+ "romanticaly", "romantically",
+ "roundabaout", "roundabout",
+ "roundabount", "roundabout",
+ "rudimentery", "rudimentary",
+ "rudimentory", "rudimentary",
+ "ruidmentary", "rudimentary",
+ "sacrifacing", "sacrificing",
+ "sacrificare", "sacrifice",
+ "sacrificied", "sacrifice",
+ "sacrificies", "sacrifice",
+ "sacrifieced", "sacrificed",
+ "sacrifising", "sacrificing",
+ "sacrifizing", "sacrificing",
+ "salughtered", "slaughtered",
+ "sanctionned", "sanctioned",
+ "sarcastisch", "sarcastic",
+ "saskatchewn", "saskatchewan",
+ "saskatchwan", "saskatchewan",
+ "satisfacion", "satisfaction",
+ "satisfacory", "satisfactory",
+ "scandanavia", "scandinavia",
+ "scandanivia", "scandinavian",
+ "scandenavia", "scandinavia",
+ "scandianvia", "scandinavian",
+ "scandimania", "scandinavia",
+ "scandinaiva", "scandinavian",
+ "scandinavan", "scandinavian",
+ "scandivania", "scandinavian",
+ "scandonavia", "scandinavia",
+ "scarificing", "sacrificing",
+ "scheduleing", "scheduling",
+ "schedulling", "scheduling",
+ "schoalrship", "scholarships",
+ "scholarhips", "scholarship",
+ "scholarstic", "scholastic",
+ "scholership", "scholarship",
+ "scholorship", "scholarship",
+ "scientiests", "scientists",
+ "scnadinavia", "scandinavia",
+ "scrambleing", "scrambling",
+ "screenshoot", "screenshot",
+ "seamlessley", "seamlessly",
+ "sedentarity", "sedentary",
+ "seflishness", "selfishness",
+ "segergation", "segregation",
+ "segragation", "segregation",
+ "segregacion", "segregation",
+ "segretation", "segregation",
+ "segrigation", "segregation",
+ "selectivley", "selectively",
+ "selfeshness", "selfishness",
+ "senitmental", "sentimental",
+ "sensacional", "sensational",
+ "sensasional", "sensational",
+ "sensationel", "sensational",
+ "sensetional", "sensational",
+ "sensitivety", "sensitivity",
+ "sentamental", "sentimental",
+ "sentemental", "sentimental",
+ "sentenceing", "sentencing",
+ "sentimentos", "sentiments",
+ "sentimentul", "sentimental",
+ "separatedly", "separately",
+ "separatelly", "separately",
+ "separatisme", "separates",
+ "separatiste", "separates",
+ "sepculating", "speculating",
+ "serivceable", "serviceable",
+ "serviciable", "serviceable",
+ "settelement", "settlement",
+ "settelments", "settlements",
+ "settlemetns", "settlements",
+ "sexualizied", "sexualized",
+ "shakeapeare", "shakespeare",
+ "shakepseare", "shakespeare",
+ "shakesphere", "shakespeare",
+ "shanenigans", "shenanigans",
+ "shareholdes", "shareholders",
+ "sharpeneing", "sharpening",
+ "sharpenning", "sharpening",
+ "shatterling", "shattering",
+ "shatterring", "shattering",
+ "sheakspeare", "shakespeare",
+ "shenadigans", "shenanigans",
+ "shenanagans", "shenanigans",
+ "shenanagins", "shenanigans",
+ "shenanegans", "shenanigans",
+ "shenanegins", "shenanigans",
+ "shenangians", "shenanigans",
+ "shenanigens", "shenanigans",
+ "shenanigins", "shenanigans",
+ "shenenigans", "shenanigans",
+ "sheninigans", "shenanigans",
+ "shennaigans", "shenanigans",
+ "shortenning", "shortening",
+ "shortenting", "shortening",
+ "signficiant", "significant",
+ "signifantly", "significantly",
+ "significane", "significance",
+ "significato", "significant",
+ "signifigant", "significant",
+ "signifikant", "significant",
+ "signitories", "signatories",
+ "signularity", "singularity",
+ "similarites", "similarities",
+ "similarlity", "similarity",
+ "similiarity", "similarity",
+ "simluations", "simulations",
+ "simplefying", "simplifying",
+ "simplicitly", "simplicity",
+ "simplifiing", "simplifying",
+ "simplisitic", "simplistic",
+ "simplyifing", "simplifying",
+ "simualtions", "simulations",
+ "simulatious", "simulations",
+ "simultaneos", "simultaneous",
+ "simultaneus", "simultaneous",
+ "simultanous", "simultaneous",
+ "singluarity", "singularity",
+ "singualrity", "singularity",
+ "singulairty", "singularity",
+ "singularily", "singularity",
+ "sitautional", "situational",
+ "situacional", "situational",
+ "situationly", "situational",
+ "siutational", "situational",
+ "skatebaords", "skateboard",
+ "skateboader", "skateboard",
+ "skepticisim", "skepticism",
+ "skillshoots", "skillshots",
+ "skillshosts", "skillshots",
+ "slaugthered", "slaughtered",
+ "slefishness", "selfishness",
+ "sluaghtered", "slaughtered",
+ "smarthpones", "smartphones",
+ "snowboaring", "snowboarding",
+ "snowbolling", "snowballing",
+ "snowfalling", "snowballing",
+ "socailizing", "socializing",
+ "socialicing", "socializing",
+ "socialistes", "socialists",
+ "socialistos", "socialists",
+ "socializare", "socialize",
+ "sociapathic", "sociopathic",
+ "sociologial", "sociological",
+ "sociopathes", "sociopaths",
+ "sociopathis", "sociopaths",
+ "sociophatic", "sociopathic",
+ "solidariety", "solidarity",
+ "somethingis", "somethings",
+ "sorrounding", "surrounding",
+ "soundtrakcs", "soundtracks",
+ "southamtpon", "southampton",
+ "southanpton", "southampton",
+ "southapmton", "southampton",
+ "southernese", "southerners",
+ "southerness", "southerners",
+ "southernest", "southerners",
+ "southernors", "southerners",
+ "southmapton", "southampton",
+ "southtampon", "southampton",
+ "soveregnity", "sovereignty",
+ "sovereighty", "sovereignty",
+ "sovereingty", "sovereignty",
+ "sovereinity", "sovereignty",
+ "soveriegnty", "sovereignty",
+ "soveriengty", "sovereignty",
+ "soverignity", "sovereignty",
+ "specailists", "specialists",
+ "specailized", "specialized",
+ "specailizes", "specializes",
+ "specatcular", "spectacular",
+ "specialiced", "specialized",
+ "specialices", "specializes",
+ "specialites", "specializes",
+ "speciallist", "specialist",
+ "speciallity", "specially",
+ "speciallize", "specialize",
+ "specialzied", "specialized",
+ "specifcally", "specifically",
+ "specificaly", "specifically",
+ "specificato", "specification",
+ "specificies", "specifics",
+ "specifiying", "specifying",
+ "specilaized", "specialize",
+ "speciliazed", "specialize",
+ "spectatores", "spectators",
+ "spectatular", "spectacular",
+ "spectauclar", "spectacular",
+ "spectaulars", "spectaculars",
+ "spectecular", "spectacular",
+ "specualting", "speculating",
+ "specualtion", "speculation",
+ "specualtive", "speculative",
+ "specularite", "speculative",
+ "speculaties", "speculative",
+ "spiritualiy", "spiritually",
+ "spiritualty", "spirituality",
+ "spirituella", "spiritually",
+ "spirtiually", "spiritually",
+ "spirutually", "spiritually",
+ "spitirually", "spiritually",
+ "sponatenous", "spontaneous",
+ "sponatneous", "spontaneous",
+ "sponsership", "sponsorship",
+ "sponsorhips", "sponsorship",
+ "sponsorhsip", "sponsorship",
+ "sponsorshop", "sponsorship",
+ "spontaenous", "spontaneous",
+ "spontainous", "spontaneous",
+ "spontaneuos", "spontaneous",
+ "spontanious", "spontaneous",
+ "sponteanous", "spontaneous",
+ "sponteneous", "spontaneous",
+ "spreadhseet", "spreadsheet",
+ "spreadsheat", "spreadsheet",
+ "spreadshets", "spreadsheets",
+ "spreedsheet", "spreadsheet",
+ "springfeild", "springfield",
+ "springfiled", "springfield",
+ "sprinklered", "sprinkled",
+ "squirrelies", "squirrels",
+ "squirrelius", "squirrels",
+ "stabilizare", "stabilize",
+ "stabilizied", "stabilize",
+ "stabilizier", "stabilize",
+ "stabilizies", "stabilize",
+ "staggerring", "staggering",
+ "staggerwing", "staggering",
+ "stationairy", "stationary",
+ "stationerad", "stationed",
+ "stationnary", "stationary",
+ "statisitcal", "statistical",
+ "statisticly", "statistical",
+ "statistisch", "statistics",
+ "statsitical", "statistical",
+ "stereotpyes", "stereotypes",
+ "stereotying", "stereotyping",
+ "steriotypes", "stereotypes",
+ "steroetypes", "stereotypes",
+ "steryotypes", "stereotypes",
+ "stimluating", "stimulating",
+ "stimualting", "stimulating",
+ "stimualtion", "stimulation",
+ "stimulantes", "stimulants",
+ "stockpilled", "stockpile",
+ "stormfrount", "stormfront",
+ "storyteling", "storytelling",
+ "straightden", "straightened",
+ "straightend", "straightened",
+ "straightmen", "straighten",
+ "straightned", "straightened",
+ "straightner", "straighten",
+ "strangeshit", "strangest",
+ "strategisch", "strategic",
+ "strategiske", "strategies",
+ "strawberies", "strawberries",
+ "strawberrry", "strawberry",
+ "strawbrerry", "strawberry",
+ "strenghened", "strengthened",
+ "strenghtend", "strengthen",
+ "strenghtens", "strengthen",
+ "strengtened", "strengthened",
+ "structurels", "structures",
+ "strugglebus", "struggles",
+ "struggleing", "struggling",
+ "stubborness", "stubbornness",
+ "stutterring", "stuttering",
+ "subcatagory", "subcategory",
+ "subconscius", "subconscious",
+ "subconscous", "subconscious",
+ "subisdizing", "subsidizing",
+ "subjectivly", "subjectively",
+ "submergered", "submerged",
+ "submisisons", "submissions",
+ "subredddits", "subreddits",
+ "subscirbers", "subscribers",
+ "subscribbed", "subscribe",
+ "subscribber", "subscriber",
+ "subscriping", "subscribing",
+ "subscriptin", "subscriptions",
+ "subscripton", "subscription",
+ "subsequenty", "subsequently",
+ "subsidiezed", "subsidized",
+ "subsidizied", "subsidized",
+ "subsidizies", "subsidize",
+ "subsiziding", "subsidizing",
+ "subsquently", "subsequently",
+ "subsrcibers", "subscribers",
+ "substancial", "substantial",
+ "substansial", "substantial",
+ "substansive", "substantive",
+ "substantied", "substantive",
+ "substanties", "substantive",
+ "substential", "substantial",
+ "substitiute", "substitute",
+ "substituded", "substituted",
+ "substitudes", "substitutes",
+ "substituion", "substitution",
+ "substitures", "substitutes",
+ "substitutie", "substitutes",
+ "substitutos", "substitutes",
+ "substitutue", "substitutes",
+ "substracted", "subtracted",
+ "suburburban", "suburban",
+ "succesfully", "successfully",
+ "successeurs", "successes",
+ "successfull", "successful",
+ "successfuly", "successfully",
+ "successsion", "succession",
+ "successully", "successfully",
+ "succsesfull", "successfully",
+ "sucessfully", "successfully",
+ "sucseptible", "susceptible",
+ "sufficently", "sufficiently",
+ "suggestieve", "suggestive",
+ "sumbissions", "submissions",
+ "sunglassses", "sunglasses",
+ "superceeded", "superseded",
+ "superficiel", "superficial",
+ "superfulous", "superfluous",
+ "superhereos", "superhero",
+ "superifical", "superficial",
+ "superiorest", "superiors",
+ "supermacist", "supremacist",
+ "supermakert", "supermarkets",
+ "supermakret", "supermarkets",
+ "supermakter", "supermarkets",
+ "supermarkts", "supermarkets",
+ "supermaster", "supermarkets",
+ "supernatual", "supernatural",
+ "supersition", "supervision",
+ "superstiton", "superstition",
+ "supervisers", "supervisors",
+ "supervisior", "supervisor",
+ "suplimented", "supplemented",
+ "supplaments", "supplements",
+ "supplemetal", "supplemental",
+ "supporteurs", "supporters",
+ "supposedely", "supposedly",
+ "supposidely", "supposedly",
+ "supposingly", "supposedly",
+ "suppresions", "suppression",
+ "suppresssor", "suppressor",
+ "supramacist", "supremacist",
+ "supremacits", "supremacist",
+ "supremasist", "supremacist",
+ "supremicist", "supremacist",
+ "suprimacist", "supremacist",
+ "suprisingly", "surprisingly",
+ "suprizingly", "surprisingly",
+ "suroundings", "surroundings",
+ "surpemacist", "supremacist",
+ "surprisinly", "surprisingly",
+ "surreptious", "surreptitious",
+ "surroundign", "surroundings",
+ "surroundigs", "surrounds",
+ "surroundins", "surrounds",
+ "surroundngs", "surrounds",
+ "surveilence", "surveillance",
+ "survivabily", "survivability",
+ "susbtantial", "substantial",
+ "susbtantive", "substantive",
+ "suscepitble", "susceptible",
+ "susceptable", "susceptible",
+ "suscpetible", "susceptible",
+ "susecptible", "susceptible",
+ "suspectible", "susceptible",
+ "suspiciosly", "suspiciously",
+ "suspiciouly", "suspiciously",
+ "suspiciouns", "suspicion",
+ "suspicision", "suspicions",
+ "suspicisons", "suspicions",
+ "sustainible", "sustainable",
+ "switerzland", "switzerland",
+ "switserland", "switzerland",
+ "switzlerand", "switzerland",
+ "swizterland", "switzerland",
+ "swtizerland", "switzerland",
+ "symapthetic", "sympathetic",
+ "symmertical", "symmetrical",
+ "sympathatic", "sympathetic",
+ "sympathiers", "sympathizers",
+ "sympathsize", "sympathize",
+ "sympethetic", "sympathetic",
+ "symphatetic", "sympathetic",
+ "symphatized", "sympathize",
+ "symphatizer", "sympathizers",
+ "symphatizes", "sympathize",
+ "sympothetic", "sympathetic",
+ "synthesasia", "synthesis",
+ "synthesesia", "synthesis",
+ "sypmathetic", "sympathetic",
+ "tabelspoons", "tablespoons",
+ "tablepsoons", "tablespoons",
+ "tablespooon", "tablespoon",
+ "tablesppons", "tablespoons",
+ "tailgateing", "tailgating",
+ "tailgatting", "tailgating",
+ "tangentialy", "tangentially",
+ "techincally", "technically",
+ "techincians", "technicians",
+ "techiniques", "techniques",
+ "techncially", "technically",
+ "technicalty", "technicality",
+ "technichian", "technician",
+ "technicials", "technicians",
+ "techniciens", "technicians",
+ "technitians", "technicians",
+ "technnology", "technology",
+ "technologia", "technological",
+ "techticians", "technicians",
+ "teleportato", "teleportation",
+ "teleportion", "teleporting",
+ "teleproting", "teleporting",
+ "temeprature", "temperature",
+ "temparament", "temperament",
+ "temparature", "temperature",
+ "temparement", "temperament",
+ "tempearture", "temperatures",
+ "temperamant", "temperament",
+ "temperarily", "temporarily",
+ "temperatues", "temperatures",
+ "temperaturs", "temperatures",
+ "temperatuur", "temperature",
+ "temperement", "temperament",
+ "tempermeant", "temperament",
+ "tempertaure", "temperature",
+ "temporairly", "temporarily",
+ "temporaraly", "temporarily",
+ "temporarity", "temporarily",
+ "tempreature", "temperature",
+ "temproarily", "temporarily",
+ "tempurature", "temperature",
+ "tepmorarily", "temporarily",
+ "termanology", "terminology",
+ "terminacion", "termination",
+ "terminaison", "termination",
+ "terminalogy", "terminology",
+ "terminatior", "terminator",
+ "terminatorn", "termination",
+ "terminilogy", "terminology",
+ "terminoligy", "terminology",
+ "terratorial", "territorial",
+ "terratories", "territories",
+ "terretorial", "territorial",
+ "terretories", "territories",
+ "terrirorial", "territorial",
+ "terrirories", "territories",
+ "terriroties", "territories",
+ "terristrial", "territorial",
+ "territoires", "territories",
+ "territorist", "terrorist",
+ "territority", "territory",
+ "terroristas", "terrorists",
+ "terroristes", "terrorists",
+ "terrorities", "territories",
+ "terrotorial", "territorial",
+ "terrotories", "territories",
+ "testiclular", "testicular",
+ "thankfullly", "thankfully",
+ "thanksgivng", "thanksgiving",
+ "theoligical", "theological",
+ "theoratical", "theoretical",
+ "theoreticly", "theoretical",
+ "theoritical", "theoretical",
+ "therapautic", "therapeutic",
+ "therapeudic", "therapeutic",
+ "therapeutuc", "therapeutic",
+ "therapuetic", "therapeutic",
+ "theraupetic", "therapeutic",
+ "thereaputic", "therapeutic",
+ "thereotical", "theoretical",
+ "therepeutic", "therapeutic",
+ "thermometor", "thermometer",
+ "thermometre", "thermometer",
+ "thermomiter", "thermometer",
+ "thermomoter", "thermometer",
+ "thermoneter", "thermometer",
+ "thermostaat", "thermostat",
+ "theroetical", "theoretical",
+ "thoeretical", "theoretical",
+ "threataning", "threatening",
+ "threatended", "threatened",
+ "threatining", "threatening",
+ "throttleing", "throttling",
+ "throughoput", "throughput",
+ "throughtout", "throughout",
+ "throughtput", "throughput",
+ "thudnerbolt", "thunderbolt",
+ "thunberbolt", "thunderbolt",
+ "thunderblot", "thunderbolt",
+ "thunderboat", "thunderbolt",
+ "thunderbots", "thunderbolt",
+ "thunderbowl", "thunderbolt",
+ "thunderjolt", "thunderbolt",
+ "thundervolt", "thunderbolt",
+ "tightenting", "tightening",
+ "tocuhscreen", "touchscreen",
+ "torrentking", "torrenting",
+ "torrentting", "torrenting",
+ "torublesome", "troublesome",
+ "torunaments", "tournaments",
+ "totalitaran", "totalitarian",
+ "totalitarni", "totalitarian",
+ "touranments", "tournaments",
+ "tournamnets", "tournaments",
+ "tournemants", "tournaments",
+ "tournements", "tournaments",
+ "tournmanets", "tournaments",
+ "tradicional", "traditional",
+ "tradionally", "traditionally",
+ "tradisional", "traditional",
+ "traditionel", "traditional",
+ "traditition", "tradition",
+ "tragicallly", "tragically",
+ "tramautized", "traumatized",
+ "tramuatized", "traumatized",
+ "trancendent", "transcendent",
+ "trancending", "transcending",
+ "tranclucent", "translucent",
+ "trandgender", "transgender",
+ "tranditions", "transitions",
+ "tranistions", "transitions",
+ "tranlastion", "translations",
+ "tranlsating", "translating",
+ "tranlsation", "translation",
+ "tranluscent", "translucent",
+ "trannsexual", "transsexual",
+ "tranpshobic", "transphobic",
+ "transaccion", "transaction",
+ "transaciton", "transactions",
+ "transalting", "translating",
+ "transaltion", "translation",
+ "transations", "transitions",
+ "transcluent", "translucent",
+ "transcripto", "transcription",
+ "transctions", "transitions",
+ "transculent", "translucent",
+ "transending", "transcending",
+ "transfender", "transgender",
+ "transferers", "transfers",
+ "transfering", "transferring",
+ "transfersom", "transforms",
+ "transfomers", "transforms",
+ "transformas", "transforms",
+ "transformes", "transformers",
+ "transformis", "transforms",
+ "transformus", "transforms",
+ "transforums", "transforms",
+ "transfromed", "transformed",
+ "transfromer", "transformers",
+ "transgemder", "transgender",
+ "transgended", "transgendered",
+ "transgenger", "transgender",
+ "transgenres", "transgender",
+ "transhpobic", "transphobic",
+ "transisions", "transitions",
+ "transisitor", "transistor",
+ "transistion", "transition",
+ "transistior", "transistor",
+ "transitiond", "transitioned",
+ "transitiong", "transitioning",
+ "translatron", "translation",
+ "translusent", "translucent",
+ "transmatter", "transmitter",
+ "transmision", "transmission",
+ "transmissin", "transmissions",
+ "transmisson", "transmission",
+ "transmittor", "transmitter",
+ "transmorged", "transformed",
+ "transmutter", "transmitter",
+ "transofrmed", "transformed",
+ "transohobic", "transphobic",
+ "transparant", "transparent",
+ "transparecy", "transparency",
+ "transpareny", "transparency",
+ "transperant", "transparent",
+ "transperent", "transparent",
+ "transphonic", "transphobic",
+ "transphopic", "transphobic",
+ "transplanet", "transplant",
+ "transporder", "transporter",
+ "transporing", "transporting",
+ "transportar", "transporter",
+ "transportng", "transporting",
+ "transportor", "transporter",
+ "transseuxal", "transsexual",
+ "transsexaul", "transsexual",
+ "transsexuel", "transsexual",
+ "transulcent", "translucent",
+ "transylvnia", "transylvania",
+ "tranzformer", "transformer",
+ "tranzitions", "transitions",
+ "tranzporter", "transporter",
+ "trasncripts", "transcripts",
+ "trasnferred", "transferred",
+ "trasnformed", "transformed",
+ "trasnformer", "transformer",
+ "trasngender", "transgender",
+ "trasnmitted", "transmitted",
+ "trasnmitter", "transmitter",
+ "trasnparent", "transparent",
+ "trasnphobic", "transphobic",
+ "trasnported", "transported",
+ "trasnporter", "transporter",
+ "traumatisch", "traumatic",
+ "traumetized", "traumatized",
+ "traumitized", "traumatized",
+ "travellerhd", "travelled",
+ "travellodge", "travelled",
+ "tremendeous", "tremendous",
+ "tremendious", "tremendous",
+ "tremenduous", "tremendous",
+ "trespessing", "trespassing",
+ "tresspasing", "trespassing",
+ "triggereing", "triggering",
+ "triggerring", "triggering",
+ "troubelsome", "troublesome",
+ "truamatized", "traumatized",
+ "trushworthy", "trustworthy",
+ "trustowrthy", "trustworthy",
+ "trustwhorty", "trustworthy",
+ "trustworhty", "trustworthy",
+ "truthfullly", "truthfully",
+ "tupperwears", "tupperware",
+ "turstworthy", "trustworthy",
+ "ubiquitious", "ubiquitous",
+ "ubiquituous", "ubiquitous",
+ "ukraininans", "ukrainians",
+ "ultimatelly", "ultimately",
+ "unanimoulsy", "unanimous",
+ "unappeasing", "unappealing",
+ "unappeeling", "unappealing",
+ "unathorised", "unauthorised",
+ "unattendend", "unattended",
+ "unatteneded", "unattended",
+ "unattracive", "unattractive",
+ "unauthoried", "unauthorized",
+ "unavailible", "unavailable",
+ "unavaliable", "unavailable",
+ "unaviodable", "unavoidable",
+ "unbalanaced", "unbalanced",
+ "unbraikable", "unbreakable",
+ "unbrakeable", "unbreakable",
+ "unbreakabie", "unbreakable",
+ "unbreakabke", "unbreakable",
+ "unbreakbale", "unbreakable",
+ "unbreakeble", "unbreakable",
+ "unbrearable", "unbreakable",
+ "uncensorred", "uncensored",
+ "uncertaincy", "uncertainty",
+ "uncertanity", "uncertainty",
+ "uncertianty", "uncertainty",
+ "unchangable", "unchangeable",
+ "uncompetive", "uncompetitive",
+ "unconcsious", "unconscious",
+ "unconsicous", "unconscious",
+ "uncouncious", "unconscious",
+ "undeniabely", "undeniably",
+ "undeniabley", "undeniably",
+ "undeniablly", "undeniably",
+ "undenialbly", "undeniably",
+ "underestime", "underestimate",
+ "undergating", "undertaking",
+ "undergorund", "underground",
+ "underheight", "underweight",
+ "undermiming", "undermining",
+ "undermindes", "undermines",
+ "undernearth", "underneath",
+ "underneight", "underweight",
+ "underpining", "undermining",
+ "underpowerd", "underpowered",
+ "underpowred", "underpowered",
+ "underratted", "underrated",
+ "understannd", "understands",
+ "understsand", "understands",
+ "undertacker", "undertaker",
+ "underwarter", "underwater",
+ "underwieght", "underweight",
+ "underwright", "underweight",
+ "undesireble", "undesirable",
+ "undesriable", "undesirable",
+ "undetecable", "undetectable",
+ "undiserable", "undesirable",
+ "undoubedtly", "undoubtedly",
+ "undoubetdly", "undoubtedly",
+ "undoubtadly", "undoubtedly",
+ "undoubtebly", "undoubtedly",
+ "undoubtetly", "undoubtedly",
+ "undreground", "underground",
+ "unemployeed", "unemployed",
+ "unemployent", "unemployment",
+ "unemploymed", "unemployed",
+ "unexpectdly", "unexpectedly",
+ "unexpectely", "unexpectedly",
+ "unfamilliar", "unfamiliar",
+ "unfortuante", "unfortunate",
+ "ungreatfull", "ungrateful",
+ "unilateraly", "unilaterally",
+ "unilaterlly", "unilaterally",
+ "unimportent", "unimportant",
+ "uninspiried", "uninspired",
+ "uninstaling", "uninstalling",
+ "uninstallng", "uninstalling",
+ "uninteresed", "uninterested",
+ "uniquesness", "uniqueness",
+ "unisntalled", "uninstalled",
+ "universella", "universally",
+ "universites", "universities",
+ "univesities", "universities",
+ "unjustifyed", "unjustified",
+ "unknowinlgy", "unknowingly",
+ "unkowningly", "unknowingly",
+ "unnecassary", "unnecessary",
+ "unneccesary", "unnecessary",
+ "unnecessery", "unnecessary",
+ "unnecissary", "unnecessary",
+ "unnessecary", "unnecessary",
+ "unnistalled", "uninstalled",
+ "unoriginial", "unoriginal",
+ "unorigional", "unoriginal",
+ "unoticeable", "unnoticeable",
+ "unpleaseant", "unpleasant",
+ "unportected", "unprotected",
+ "unprepaired", "unprepared",
+ "unpreparred", "unprepared",
+ "unproducive", "unproductive",
+ "unprotexted", "unprotected",
+ "unqaulified", "unqualified",
+ "unrealisitc", "unrealistic",
+ "unrealsitic", "unrealistic",
+ "unreasonbly", "unreasonably",
+ "unregluated", "unregulated",
+ "unregualted", "unregulated",
+ "unregulared", "unregulated",
+ "unrepentent", "unrepentant",
+ "unresponive", "unresponsive",
+ "unrestriced", "unrestricted",
+ "unsettleing", "unsettling",
+ "unsintalled", "uninstalled",
+ "unsolicated", "unsolicited",
+ "unsoliticed", "unsolicited",
+ "unsolocited", "unsolicited",
+ "unsubscirbe", "unsubscribe",
+ "unsubscrbed", "unsubscribed",
+ "unsubscried", "unsubscribed",
+ "unsubscripe", "unsubscribe",
+ "unsubscrive", "unsubscribe",
+ "unsubscrube", "unsubscribe",
+ "unsubsrcibe", "unsubscribe",
+ "unsuccesful", "unsuccessful",
+ "unsuccessul", "unsuccessful",
+ "unsucesfuly", "unsuccessfully",
+ "unsucessful", "unsuccessful",
+ "unsunscribe", "unsubscribe",
+ "unsuprising", "unsurprising",
+ "unsuprizing", "unsurprising",
+ "unsurprized", "unsurprised",
+ "unsusbcribe", "unsubscribe",
+ "unviersally", "universally",
+ "unwarrented", "unwarranted",
+ "utiliatrian", "utilitarian",
+ "utilitatian", "utilitarian",
+ "utiliterian", "utilitarian",
+ "utilizacion", "utilization",
+ "utilizaiton", "utilization",
+ "utilizating", "utilization",
+ "utiltiarian", "utilitarian",
+ "vacciantion", "vaccination",
+ "vaccinaties", "vaccinate",
+ "vegaterians", "vegetarians",
+ "vegetariens", "vegetarians",
+ "vegetatians", "vegetarians",
+ "vegeterians", "vegetarians",
+ "vehementely", "vehemently",
+ "venezuelean", "venezuela",
+ "venezuelian", "venezuela",
+ "ventalation", "ventilation",
+ "ventelation", "ventilation",
+ "ventialtion", "ventilation",
+ "ventilacion", "ventilation",
+ "verastility", "versatility",
+ "verfication", "verification",
+ "versatality", "versatility",
+ "versitality", "versatility",
+ "versitilaty", "versatility",
+ "victorieuse", "victories",
+ "victoriuous", "victorious",
+ "vietnameese", "vietnamese",
+ "vietnamesse", "vietnamese",
+ "vietnamiese", "vietnamese",
+ "vietnamnese", "vietnamese",
+ "vigilanties", "vigilante",
+ "visibillity", "visibility",
+ "vocabularly", "vocabulary",
+ "volatillity", "volatility",
+ "volonteered", "volunteered",
+ "volounteers", "volunteers",
+ "volunatrily", "voluntarily",
+ "voluntairly", "voluntarily",
+ "volunteeers", "volunteers",
+ "volunteraly", "voluntarily",
+ "voluntereed", "volunteered",
+ "volunterily", "voluntarily",
+ "vulnerabile", "vulnerable",
+ "wallpapaers", "wallpapers",
+ "wallpappers", "wallpapers",
+ "washingtion", "washington",
+ "watermeleon", "watermelon",
+ "waterprooof", "waterproof",
+ "wavelegnths", "wavelength",
+ "wavelenghth", "wavelength",
+ "wavelenghts", "wavelength",
+ "weaknessses", "weaknesses",
+ "wellingston", "wellington",
+ "wellingtion", "wellington",
+ "westernerns", "westerners",
+ "westmisnter", "westminster",
+ "westmnister", "westminster",
+ "westmonster", "westminster",
+ "whisperered", "whispered",
+ "whitholding", "withholding",
+ "wikileakers", "wikileaks",
+ "willingless", "willingness",
+ "wincheseter", "winchester",
+ "windsheilds", "windshield",
+ "withdrawels", "withdrawals",
+ "withdrawles", "withdrawals",
+ "withhelding", "withholding",
+ "withrdawing", "withdrawing",
+ "witnesssing", "witnessing",
+ "woodowrking", "woodworking",
+ "woodworkign", "woodworking",
+ "worhsipping", "worshipping",
+ "workstaiton", "workstation",
+ "workststion", "workstation",
+ "worshopping", "worshipping",
+ "xenophoblic", "xenophobic",
+ "abandining", "abandoning",
+ "abandonned", "abandoned",
+ "abbreviato", "abbreviation",
+ "abnoramlly", "abnormally",
+ "abnormalty", "abnormally",
+ "abnornally", "abnormally",
+ "abominaton", "abomination",
+ "abondoning", "abandoning",
+ "aborginial", "aboriginal",
+ "aboriganal", "aboriginal",
+ "aborigenal", "aboriginal",
+ "aborignial", "aboriginal",
+ "aborigonal", "aboriginal",
+ "aboroginal", "aboriginal",
+ "aboslutely", "absolutely",
+ "abosrption", "absorption",
+ "abreviated", "abbreviated",
+ "absintence", "abstinence",
+ "absitnence", "abstinence",
+ "absolument", "absolute",
+ "absolutley", "absolutely",
+ "absoprtion", "absorption",
+ "absorbsion", "absorption",
+ "absorbtion", "absorption",
+ "absorpsion", "absorption",
+ "absoultely", "absolutely",
+ "abstanence", "abstinence",
+ "abstenance", "abstinence",
+ "abstenince", "abstinence",
+ "abstinense", "abstinence",
+ "abstinince", "abstinence",
+ "absurditiy", "absurdity",
+ "abundacies", "abundances",
+ "academicas", "academics",
+ "academicos", "academics",
+ "academicus", "academics",
+ "accdiently", "accidently",
+ "accelarate", "accelerate",
+ "accelerade", "accelerated",
+ "accelerare", "accelerate",
+ "accelerato", "acceleration",
+ "acceleread", "accelerated",
+ "accelertor", "accelerator",
+ "accelorate", "accelerate",
+ "acceptabel", "acceptable",
+ "acceptabil", "acceptable",
+ "acceptence", "acceptance",
+ "accepterad", "accepted",
+ "acceptible", "acceptable",
+ "accerelate", "accelerated",
+ "accesories", "accessories",
+ "accessable", "accessible",
+ "accessbile", "accessible",
+ "accessoire", "accessories",
+ "accessoirs", "accessories",
+ "accicently", "accidently",
+ "accidantly", "accidently",
+ "accidebtly", "accidently",
+ "accidenlty", "accidently",
+ "accidentes", "accidents",
+ "accidentky", "accidently",
+ "accidently", "accidentally",
+ "accidnetly", "accidently",
+ "accomadate", "accommodate",
+ "accomodate", "accommodate",
+ "accompined", "accompanied",
+ "accomplise", "accomplishes",
+ "accompliss", "accomplishes",
+ "accostumed", "accustomed",
+ "accountent", "accountant",
+ "accpetable", "acceptable",
+ "accpetance", "acceptance",
+ "accuastion", "accusation",
+ "acculumate", "accumulate",
+ "accumalate", "accumulate",
+ "accumelate", "accumulate",
+ "accumilate", "accumulate",
+ "accumulare", "accumulate",
+ "accumulato", "accumulation",
+ "accumulted", "accumulated",
+ "accuratley", "accurately",
+ "accusating", "accusation",
+ "accusition", "accusation",
+ "accustumed", "accustomed",
+ "acheivable", "achievable",
+ "acheivment", "achievement",
+ "acheviable", "achievable",
+ "achiavable", "achievable",
+ "achieveble", "achievable",
+ "achievemnt", "achievement",
+ "achievemts", "achieves",
+ "achievents", "achieves",
+ "achievment", "achievement",
+ "achilleous", "achilles",
+ "achiveable", "achievable",
+ "achivement", "achievement",
+ "acitvating", "activating",
+ "acitvision", "activision",
+ "acknowldge", "acknowledge",
+ "acknowlede", "acknowledge",
+ "acknowlege", "acknowledge",
+ "acommodate", "accommodate",
+ "acopalypse", "apocalypse",
+ "acordingly", "accordingly",
+ "acqauinted", "acquainted",
+ "acquanited", "acquainted",
+ "acquianted", "acquainted",
+ "acquinated", "acquainted",
+ "acquisiton", "acquisition",
+ "acticating", "activating",
+ "actication", "activation",
+ "activacion", "activation",
+ "activaters", "activates",
+ "activiates", "activist",
+ "activiites", "activist",
+ "activisiom", "activism",
+ "activisits", "activist",
+ "activistas", "activists",
+ "activistes", "activists",
+ "activiting", "activating",
+ "activizion", "activision",
+ "acustommed", "accustomed",
+ "adaptacion", "adaptation",
+ "adaptating", "adaptation",
+ "adaquetely", "adequately",
+ "addicitons", "addictions",
+ "addionally", "additionally",
+ "additivies", "additive",
+ "additivley", "additive",
+ "addittions", "addictions",
+ "addmission", "admission",
+ "addresable", "addressable",
+ "addressess", "addresses",
+ "adequatley", "adequately",
+ "adequetely", "adequately",
+ "adequitely", "adequately",
+ "adernaline", "adrenaline",
+ "adjectivos", "adjectives",
+ "adjustible", "adjustable",
+ "admendment", "amendment",
+ "administed", "administered",
+ "administor", "administer",
+ "administre", "administer",
+ "administro", "administer",
+ "adminsiter", "administer",
+ "admissable", "admissible",
+ "admittadly", "admittedly",
+ "admittetly", "admittedly",
+ "admittidly", "admittedly",
+ "adolencent", "adolescent",
+ "adolescant", "adolescent",
+ "adolescene", "adolescence",
+ "adoloscent", "adolescent",
+ "adolsecent", "adolescent",
+ "adpatation", "adaptation",
+ "adreanline", "adrenaline",
+ "adrelanine", "adrenaline",
+ "adreneline", "adrenaline",
+ "adreniline", "adrenaline",
+ "adressable", "addressable",
+ "advanteges", "advantages",
+ "advatanges", "advantages",
+ "adventrous", "adventurous",
+ "adventrues", "adventures",
+ "adventuers", "adventures",
+ "adventuous", "adventurous",
+ "adventuros", "adventurous",
+ "adventurus", "adventurous",
+ "adverticed", "advertised",
+ "aestethics", "aesthetics",
+ "aesthatics", "aesthetics",
+ "aesthestic", "aesthetics",
+ "affiliaton", "affiliation",
+ "affilliate", "affiliate",
+ "affirmitve", "affirmative",
+ "afflcition", "affliction",
+ "afflection", "affliction",
+ "affliation", "affliction",
+ "affliciton", "affliction",
+ "afforadble", "affordable",
+ "affordible", "affordable",
+ "affortable", "affordable",
+ "africaners", "africans",
+ "africaness", "africans",
+ "aftermaket", "aftermarket",
+ "afternooon", "afternoon",
+ "aggravanti", "aggravating",
+ "aggraveted", "aggravated",
+ "aggreement", "agreement",
+ "aggregious", "egregious",
+ "aggresions", "aggression",
+ "aggressivo", "aggression",
+ "aggrovated", "aggravated",
+ "agnosticim", "agnosticism",
+ "agnosticsm", "agnosticism",
+ "agnostisch", "agnostic",
+ "agnostiscm", "agnosticism",
+ "agnostisim", "agnosticism",
+ "agreeement", "agreement",
+ "agricultre", "agriculture",
+ "agricultue", "agriculture",
+ "agriculure", "agriculture",
+ "agricuture", "agriculture",
+ "ailenating", "alienating",
+ "ajdectives", "adjectives",
+ "alchoholic", "alcoholic",
+ "alchoolism", "alcoholism",
+ "alcohalics", "alcoholics",
+ "alcohalism", "alcoholism",
+ "alcoholsim", "alcoholism",
+ "aleinating", "alienating",
+ "algorhitms", "algorithms",
+ "algorithem", "algorithm",
+ "algorithim", "algorithm",
+ "algorithsm", "algorithms",
+ "algorithum", "algorithm",
+ "algorithym", "algorithm",
+ "algoritmes", "algorithms",
+ "algoritmos", "algorithms",
+ "algorthims", "algorithms",
+ "algortihms", "algorithms",
+ "algorythms", "algorithms",
+ "alievating", "alienating",
+ "alledgedly", "allegedly",
+ "allegeance", "allegiance",
+ "allegedely", "allegedly",
+ "allegedley", "allegedly",
+ "allegience", "allegiance",
+ "alleigance", "allegiance",
+ "allergisch", "allergic",
+ "alliegance", "allegiance",
+ "alligeance", "allegiance",
+ "alocholics", "alcoholics",
+ "alocholism", "alcoholism",
+ "alogrithms", "algorithms",
+ "alphabeast", "alphabet",
+ "alteracion", "alteration",
+ "alterarion", "alteration",
+ "alterating", "alteration",
+ "alternador", "alternator",
+ "alternater", "alternator",
+ "alternatie", "alternatives",
+ "alternatly", "alternately",
+ "alternatve", "alternate",
+ "alternetly", "alternately",
+ "altogehter", "altogether",
+ "altogheter", "altogether",
+ "altriustic", "altruistic",
+ "altruisitc", "altruistic",
+ "altrusitic", "altruistic",
+ "alturistic", "altruistic",
+ "aluminimum", "aluminum",
+ "amargeddon", "armageddon",
+ "amateurest", "amateurs",
+ "ambassabor", "ambassador",
+ "ambassader", "ambassador",
+ "ambassator", "ambassador",
+ "ambassedor", "ambassador",
+ "ambassidor", "ambassador",
+ "ambassodor", "ambassador",
+ "ambiguitiy", "ambiguity",
+ "amendmants", "amendments",
+ "amendmends", "amendments",
+ "americains", "americas",
+ "americanas", "americans",
+ "americanis", "americas",
+ "americanss", "americas",
+ "americants", "americas",
+ "americanus", "americans",
+ "americares", "americas",
+ "ammendment", "amendment",
+ "amrageddon", "armageddon",
+ "analitical", "analytical",
+ "analitycal", "analytical",
+ "analogeous", "analogous",
+ "analyitcal", "analytical",
+ "analyseles", "analyses",
+ "analyseras", "analyses",
+ "analyseres", "analyses",
+ "analysised", "analyses",
+ "analysises", "analyses",
+ "analysisto", "analysts",
+ "analystics", "analysts",
+ "anarchisim", "anarchism",
+ "anarchistm", "anarchism",
+ "anarchiszm", "anarchism",
+ "anarchsits", "anarchists",
+ "anayltical", "analytical",
+ "ancilliary", "ancillary",
+ "androiders", "androids",
+ "androidtvs", "androids",
+ "anecdotale", "anecdote",
+ "anecdotice", "anecdote",
+ "anestheisa", "anesthesia",
+ "anesthetia", "anesthesia",
+ "anesthisia", "anesthesia",
+ "anitbiotic", "antibiotic",
+ "anitquated", "antiquated",
+ "anitsocial", "antisocial",
+ "aniversary", "anniversary",
+ "annilihate", "annihilated",
+ "anniverary", "anniversary",
+ "anniversay", "anniversary",
+ "anniversry", "anniversary",
+ "annointing", "anointing",
+ "annonceurs", "announcers",
+ "annoucners", "announcers",
+ "annoucning", "announcing",
+ "announched", "announce",
+ "annyoingly", "annoyingly",
+ "anonymosly", "anonymously",
+ "anonymousy", "anonymously",
+ "antaganist", "antagonist",
+ "antagnoist", "antagonist",
+ "antarcitca", "antarctica",
+ "antarctida", "antarctica",
+ "anthropoly", "anthropology",
+ "antibiodic", "antibiotic",
+ "antibiotcs", "antibiotics",
+ "antibitoic", "antibiotic",
+ "antiboitic", "antibiotics",
+ "anticapate", "anticipate",
+ "anticiapte", "anticipate",
+ "anticipare", "anticipate",
+ "anticipato", "anticipation",
+ "anticuated", "antiquated",
+ "antiquited", "antiquated",
+ "antiqvated", "antiquated",
+ "antisipate", "anticipate",
+ "antisocail", "antisocial",
+ "antisosial", "antisocial",
+ "antoganist", "antagonist",
+ "antractica", "antarctica",
+ "apacolypse", "apocalypse",
+ "apartheied", "apartheid",
+ "aplication", "application",
+ "apocalipse", "apocalypse",
+ "apocalpyse", "apocalypse",
+ "apocalypes", "apocalypse",
+ "apocalypic", "apocalyptic",
+ "apocalyspe", "apocalypse",
+ "apocalytic", "apocalyptic",
+ "apocaplyse", "apocalypse",
+ "apocolapse", "apocalypse",
+ "apolagetic", "apologetic",
+ "apolagized", "apologized",
+ "apolegetic", "apologetic",
+ "apoligetic", "apologetic",
+ "apoligists", "apologists",
+ "apoligized", "apologized",
+ "apologisms", "apologists",
+ "apologiste", "apologise",
+ "apologitic", "apologetic",
+ "apostraphe", "apostrophe",
+ "apostrephe", "apostrophe",
+ "apostrohpe", "apostrophe",
+ "apostropes", "apostrophe",
+ "apparantly", "apparently",
+ "appareance", "appearance",
+ "apparenlty", "apparently",
+ "appartment", "apartment",
+ "appealling", "appealing",
+ "appearence", "appearance",
+ "appearnace", "appearances",
+ "apperances", "appearances",
+ "apperantly", "apparently",
+ "apperciate", "appreciate",
+ "appereance", "appearance",
+ "appetities", "appetite",
+ "appetitite", "appetite",
+ "appication", "application",
+ "applainces", "appliances",
+ "applicaple", "applicable",
+ "applicates", "applicants",
+ "applicaton", "application",
+ "applicible", "applicable",
+ "appliences", "appliances",
+ "appointmet", "appointments",
+ "appologies", "apologies",
+ "apporached", "approached",
+ "apporaches", "approaches",
+ "appraoched", "approached",
+ "appraoches", "approaches",
+ "apprecaite", "appreciate",
+ "appreciato", "appreciation",
+ "appreciste", "appreciates",
+ "apprecitae", "appreciates",
+ "apprecited", "appreciated",
+ "apprectice", "apprentice",
+ "appreicate", "appreciate",
+ "apprendice", "apprentice",
+ "apprentace", "apprentice",
+ "apprentise", "apprentice",
+ "appretiate", "appreciate",
+ "appretince", "apprentice",
+ "appriceate", "appreciates",
+ "appriciate", "appreciate",
+ "appriecate", "appreciates",
+ "approacing", "approaching",
+ "appropiate", "appropriate",
+ "approprate", "appropriate",
+ "apropriate", "appropriate",
+ "aproximate", "approximate",
+ "apsotrophe", "apostrophe",
+ "aptitudine", "aptitude",
+ "aqcuainted", "acquainted",
+ "aquisition", "acquisition",
+ "aramgeddon", "armageddon",
+ "arangement", "arrangement",
+ "arbitarily", "arbitrarily",
+ "arbitraily", "arbitrarily",
+ "arbitraion", "arbitration",
+ "arbitrairy", "arbitrarily",
+ "arbitrarly", "arbitrary",
+ "arbitraton", "arbitration",
+ "arcehtypes", "archetypes",
+ "archaelogy", "archaeology",
+ "archaeolgy", "archaeology",
+ "archaology", "archeology",
+ "archatypes", "archetypes",
+ "archetects", "architects",
+ "archetipes", "archetypes",
+ "archetpyes", "archetypes",
+ "archetypus", "archetypes",
+ "archeytpes", "archetypes",
+ "archictect", "architect",
+ "architechs", "architects",
+ "architecht", "architect",
+ "architecte", "architecture",
+ "architexts", "architects",
+ "architypes", "archetypes",
+ "archtiects", "architects",
+ "archytypes", "archetypes",
+ "argentinia", "argentina",
+ "arguements", "arguments",
+ "argumentas", "arguments",
+ "argumentos", "arguments",
+ "arithemtic", "arithmetic",
+ "arithmitic", "arithmetic",
+ "aritmethic", "arithmetic",
+ "armagaddon", "armageddon",
+ "armageddan", "armageddon",
+ "armagedden", "armageddon",
+ "armageddin", "armageddon",
+ "armagedeon", "armageddon",
+ "armageedon", "armageddon",
+ "armagideon", "armageddon",
+ "armegaddon", "armageddon",
+ "arrangerad", "arranged",
+ "arrangment", "arrangement",
+ "arthimetic", "arithmetic",
+ "articifial", "artificial",
+ "articluate", "articulate",
+ "articualte", "articulate",
+ "articulted", "articulated",
+ "artifactos", "artifacts",
+ "artificiel", "artificial",
+ "artihmetic", "arithmetic",
+ "artillerly", "artillery",
+ "asbestoast", "asbestos",
+ "asethetics", "aesthetics",
+ "asisstants", "assistants",
+ "aspiratons", "aspirations",
+ "assasinate", "assassinate",
+ "assassians", "assassin",
+ "assassinas", "assassins",
+ "assassines", "assassins",
+ "assassinos", "assassins",
+ "assemblare", "assemble",
+ "assempling", "assembling",
+ "assersions", "assertions",
+ "assesement", "assessment",
+ "assestment", "assessment",
+ "assigments", "assignments",
+ "assignemnt", "assignment",
+ "assimalate", "assimilate",
+ "assimilant", "assimilate",
+ "assimilare", "assimilate",
+ "assimliate", "assimilate",
+ "assimulate", "assimilate",
+ "assingment", "assignment",
+ "assistanat", "assistants",
+ "assistanse", "assistants",
+ "assistante", "assistance",
+ "assistence", "assistance",
+ "assistendo", "assisted",
+ "assistents", "assistants",
+ "assmebling", "assembling",
+ "assocaited", "associated",
+ "assocaites", "associates",
+ "assocation", "association",
+ "associatie", "associated",
+ "associatin", "associations",
+ "associaton", "association",
+ "associsted", "associates",
+ "assoicated", "associated",
+ "assoicates", "associates",
+ "assosiated", "associated",
+ "assosiates", "associates",
+ "asssassans", "assassins",
+ "assupmtion", "assumptions",
+ "assymetric", "asymmetric",
+ "asteroides", "asteroids",
+ "asthetical", "aesthetical",
+ "astonising", "astonishing",
+ "astornauts", "astronauts",
+ "astranauts", "astronauts",
+ "astronatus", "astronauts",
+ "astronaunt", "astronaut",
+ "astronomia", "astronomical",
+ "astronouts", "astronauts",
+ "astronuats", "astronauts",
+ "asutralian", "australian",
+ "atatchment", "attachment",
+ "athleticos", "athletics",
+ "athleticsm", "athleticism",
+ "athletiscm", "athleticism",
+ "athletisim", "athleticism",
+ "atmopshere", "atmosphere",
+ "atmoshpere", "atmosphere",
+ "atomsphere", "atmosphere",
+ "atriculate", "articulate",
+ "atrocoties", "atrocities",
+ "atrosities", "atrocities",
+ "attachemnt", "attachment",
+ "attackeras", "attackers",
+ "attactment", "attachment",
+ "attemtping", "attempting",
+ "attendence", "attendance",
+ "attendents", "attendants",
+ "attirbutes", "attributes",
+ "attmepting", "attempting",
+ "attracters", "attracts",
+ "attractice", "attractive",
+ "attracties", "attracts",
+ "attractifs", "attracts",
+ "attraktion", "attraction",
+ "attraktive", "attractive",
+ "attribuito", "attribution",
+ "attritubes", "attributes",
+ "auctioners", "auctions",
+ "audioboook", "audiobook",
+ "audioboost", "audiobooks",
+ "auidobooks", "audiobooks",
+ "auotattack", "autoattack",
+ "austrailan", "australian",
+ "austrailia", "australia",
+ "australain", "australians",
+ "australien", "australian",
+ "australina", "australians",
+ "austrlaian", "australians",
+ "authenticy", "authenticity",
+ "autherized", "authorized",
+ "authoritay", "authority",
+ "authorites", "authorities",
+ "authorithy", "authority",
+ "authroized", "authorized",
+ "autistisch", "autistic",
+ "autoattaks", "autoattack",
+ "autocorect", "autocorrect",
+ "autocorrct", "autocorrect",
+ "autocorret", "autocorrect",
+ "autograpgh", "autograph",
+ "automatice", "automate",
+ "automatico", "automation",
+ "automatied", "automate",
+ "automatiek", "automate",
+ "automatron", "automation",
+ "automatted", "automate",
+ "automibile", "automobile",
+ "automitive", "automotive",
+ "automoblie", "automobile",
+ "automomous", "autonomous",
+ "automonous", "autonomous",
+ "automotice", "automotive",
+ "automotion", "automation",
+ "automotize", "automotive",
+ "automotove", "automotive",
+ "autonamous", "autonomous",
+ "autonation", "automation",
+ "autonimous", "autonomous",
+ "autonomity", "autonomy",
+ "autononous", "autonomous",
+ "auttoatack", "autoattack",
+ "auxilliary", "auxiliary",
+ "availabale", "available",
+ "availaible", "available",
+ "availiable", "available",
+ "averageadi", "averaged",
+ "averageifs", "averages",
+ "awesomeley", "awesomely",
+ "awesomelly", "awesomely",
+ "awesomenss", "awesomeness",
+ "awkwardess", "awkwardness",
+ "babysister", "babysitter",
+ "babysiting", "babysitting",
+ "babysittng", "babysitting",
+ "bachelores", "bachelors",
+ "backgorund", "background",
+ "backgroudn", "backgrounds",
+ "backgrouds", "backgrounds",
+ "backgrouns", "backgrounds",
+ "backgruond", "backgrounds",
+ "backpacing", "backpacking",
+ "backpackng", "backpacking",
+ "backrgound", "backgrounds",
+ "backrounds", "backgrounds",
+ "baksetball", "basketball",
+ "balanceada", "balanced",
+ "balanceado", "balanced",
+ "balckberry", "blackberry",
+ "balckhawks", "blackhawks",
+ "balcksmith", "blacksmith",
+ "bandwagoon", "bandwagon",
+ "bangaldesh", "bangladesh",
+ "bangladash", "bangladesh",
+ "bangledash", "bangladesh",
+ "bangledesh", "bangladesh",
+ "banglidesh", "bangladesh",
+ "bankrupcty", "bankruptcy",
+ "bankruptsy", "bankruptcy",
+ "bankrutpcy", "bankruptcy",
+ "barabrians", "barbarians",
+ "barbariens", "barbarians",
+ "barbarions", "barbarians",
+ "barbarisch", "barbaric",
+ "barberians", "barbarians",
+ "bargianing", "bargaining",
+ "bartendars", "bartenders",
+ "basektball", "basketball",
+ "baskteball", "basketball",
+ "bastardous", "bastards",
+ "battelship", "battleship",
+ "battelstar", "battlestar",
+ "battlearts", "battlestar",
+ "battlechip", "battleship",
+ "battlefied", "battlefield",
+ "battlefont", "battlefront",
+ "battlehips", "battleship",
+ "battlesaur", "battlestar",
+ "battlescar", "battlestar",
+ "battleshop", "battleship",
+ "battlestsr", "battlestar",
+ "beahviours", "behaviours",
+ "beautifuly", "beautifully",
+ "beautilful", "beautifully",
+ "beautyfull", "beautiful",
+ "becnhmarks", "benchmarks",
+ "beethoveen", "beethoven",
+ "begginings", "beginnings",
+ "begininngs", "beginnings",
+ "beginninng", "beginnings",
+ "behaivours", "behaviours",
+ "behaviorly", "behavioral",
+ "behavoiral", "behavioral",
+ "behavoiurs", "behaviours",
+ "behavorial", "behavioral",
+ "behavoural", "behavioral",
+ "behvaiours", "behaviours",
+ "beleagured", "beleaguered",
+ "beleivable", "believable",
+ "beliavable", "believable",
+ "beliebable", "believable",
+ "believeble", "believable",
+ "beliveable", "believable",
+ "benchamrks", "benchmarks",
+ "benchmakrs", "benchmarks",
+ "benckmarks", "benchmarks",
+ "benefecial", "beneficial",
+ "beneficary", "beneficiary",
+ "beneficiul", "beneficial",
+ "benefitial", "beneficial",
+ "beneifical", "beneficial",
+ "benelovent", "benevolent",
+ "benevalent", "benevolent",
+ "benevelant", "benevolent",
+ "benevelent", "benevolent",
+ "benevelont", "benevolent",
+ "benevloent", "benevolent",
+ "benevolant", "benevolent",
+ "benificial", "beneficial",
+ "benovelent", "benevolent",
+ "bernouilli", "bernoulli",
+ "besitality", "bestiality",
+ "bestaility", "bestiality",
+ "besteality", "bestiality",
+ "betrayeado", "betrayed",
+ "bilateraly", "bilaterally",
+ "billborads", "billboards",
+ "bioligical", "biological",
+ "biologiset", "biologist",
+ "biologiskt", "biologist",
+ "birghtness", "brightness",
+ "birmignham", "birmingham",
+ "birmimgham", "birmingham",
+ "bisexuella", "bisexual",
+ "bitterseet", "bittersweet",
+ "bitterswet", "bittersweet",
+ "blackahwks", "blackhawks",
+ "blackbarry", "blackberry",
+ "blackbeary", "blackberry",
+ "blackbeery", "blackberry",
+ "blackcawks", "blackhawks",
+ "blackhakws", "blackhawks",
+ "blackhwaks", "blackhawks",
+ "blackmsith", "blacksmith",
+ "blackshits", "blacksmith",
+ "blasphemey", "blasphemy",
+ "blitzkreig", "blitzkrieg",
+ "blochchain", "blockchain",
+ "blockcahin", "blockchain",
+ "blockchian", "blockchain",
+ "bloodboner", "bloodborne",
+ "bloodbonre", "bloodborne",
+ "bloodborbe", "bloodborne",
+ "bloodbrone", "bloodborne",
+ "bloodporne", "bloodborne",
+ "bloorborne", "bloodborne",
+ "blueberies", "blueberries",
+ "blueberris", "blueberries",
+ "blueberrry", "blueberry",
+ "bluebrints", "blueprints",
+ "boardcasts", "broadcasts",
+ "bodyheight", "bodyweight",
+ "bodyweigth", "bodyweight",
+ "bodywieght", "bodyweight",
+ "bombarment", "bombardment",
+ "bookmakred", "bookmarked",
+ "bootlaoder", "bootloader",
+ "bootleader", "bootloader",
+ "boradcasts", "broadcasts",
+ "borderlads", "borderlands",
+ "borderlans", "borderlands",
+ "bottelneck", "bottleneck",
+ "bottlebeck", "bottleneck",
+ "boundaires", "boundaries",
+ "bounderies", "boundaries",
+ "bourgeoius", "bourgeois",
+ "boycutting", "boycotting",
+ "boyfirends", "boyfriends",
+ "boyfreinds", "boyfriends",
+ "boyfrients", "boyfriends",
+ "braceletes", "bracelets",
+ "braceletts", "bracelets",
+ "brainwased", "brainwashed",
+ "brakedowns", "breakdowns",
+ "braodcasts", "broadcasts",
+ "brasillian", "brazilian",
+ "bratenders", "bartenders",
+ "brazilains", "brazilians",
+ "brazileans", "brazilians",
+ "braziliaan", "brazilians",
+ "brazilions", "brazilians",
+ "brazillans", "brazilians",
+ "brightoner", "brighten",
+ "brigthness", "brightness",
+ "brillaince", "brilliance",
+ "brilliante", "brilliance",
+ "brillianty", "brilliantly",
+ "brimestone", "brimstone",
+ "brimingham", "birmingham",
+ "broacasted", "broadcast",
+ "brotherhod", "brotherhood",
+ "brotherood", "brotherhood",
+ "brusselers", "brussels",
+ "brutallity", "brutally",
+ "buisnesses", "businesses",
+ "bulgariska", "bulgaria",
+ "bulletpoof", "bulletproof",
+ "bulletprof", "bulletproof",
+ "bureaucats", "bureaucrats",
+ "businesman", "businessman",
+ "businesmen", "businessmen",
+ "businessen", "businessmen",
+ "butterfies", "butterflies",
+ "cabinettas", "cabinets",
+ "caclulated", "calculated",
+ "caclulator", "calculator",
+ "cahracters", "characters",
+ "calcluator", "calculators",
+ "calcualted", "calculated",
+ "calcualtor", "calculator",
+ "calculador", "calculator",
+ "calcularon", "calculator",
+ "calculater", "calculator",
+ "calculatin", "calculations",
+ "calibratin", "calibration",
+ "calibraton", "calibration",
+ "califnoria", "californian",
+ "califonria", "californian",
+ "califorian", "californian",
+ "califorina", "california",
+ "californai", "californian",
+ "califronia", "california",
+ "caligraphy", "calligraphy",
+ "caliofrnia", "californian",
+ "calrifying", "clarifying",
+ "calssified", "classified",
+ "caluclated", "calculated",
+ "caluclator", "calculator",
+ "caluculate", "calculate",
+ "cambodican", "cambodia",
+ "camofluage", "camouflage",
+ "camoufalge", "camouflage",
+ "camouglage", "camouflage",
+ "campaiging", "campaigning",
+ "campaignes", "campaigns",
+ "cancellato", "cancellation",
+ "candidatas", "candidates",
+ "candidatxs", "candidates",
+ "candidiate", "candidate",
+ "canditates", "candidates",
+ "cannibalsm", "cannibalism",
+ "cannisters", "canisters",
+ "cannonical", "canonical",
+ "capabality", "capability",
+ "capabiltiy", "capability",
+ "capacators", "capacitors",
+ "capaciters", "capacitors",
+ "capactiors", "capacitors",
+ "capasitors", "capacitors",
+ "capatilism", "capitalism",
+ "capatilist", "capitalist",
+ "capatilize", "capitalize",
+ "capialized", "capitalized",
+ "capicators", "capacitors",
+ "capitalisn", "capitals",
+ "capitalits", "capitalists",
+ "capitalsim", "capitalism",
+ "capitalsit", "capitalists",
+ "capitarist", "capitalist",
+ "capitilism", "capitalism",
+ "capitilist", "capitalist",
+ "capitilize", "capitalize",
+ "capitlaism", "capitalism",
+ "capitlaist", "capitalist",
+ "capitlaize", "capitalized",
+ "capitolism", "capitalism",
+ "capitolist", "capitalist",
+ "capitolize", "capitalize",
+ "captainers", "captains",
+ "captialism", "capitalism",
+ "captialist", "capitalist",
+ "captialize", "capitalize",
+ "captivitiy", "captivity",
+ "caraciture", "caricature",
+ "carciature", "caricature",
+ "cardinales", "cardinals",
+ "cardinalis", "cardinals",
+ "carefullly", "carefully",
+ "cariacture", "caricature",
+ "caricatore", "caricature",
+ "cariciture", "caricature",
+ "caricuture", "caricature",
+ "carismatic", "charismatic",
+ "carribbean", "caribbean",
+ "cartdridge", "cartridge",
+ "cartdriges", "cartridges",
+ "carthagian", "carthaginian",
+ "cartilidge", "cartilage",
+ "cartirdges", "cartridges",
+ "cartrdiges", "cartridges",
+ "cartriages", "cartridges",
+ "cartrigdes", "cartridges",
+ "casaulties", "casualties",
+ "cassowarry", "cassowary",
+ "casualites", "casualties",
+ "casualries", "casualties",
+ "casulaties", "casualties",
+ "cataclysim", "cataclysm",
+ "cataclysym", "cataclysm",
+ "catagories", "categories",
+ "catapillar", "caterpillar",
+ "catapiller", "caterpillar",
+ "catastrope", "catastrophe",
+ "catastrphe", "catastrophe",
+ "categorice", "categorize",
+ "categoried", "categorized",
+ "categoriei", "categorize",
+ "cateogrize", "categorized",
+ "catepillar", "caterpillar",
+ "caterpilar", "caterpillar",
+ "catholicsm", "catholicism",
+ "catholicus", "catholics",
+ "catholisim", "catholicism",
+ "cativating", "activating",
+ "cattleship", "battleship",
+ "causalties", "casualties",
+ "cautionsly", "cautiously",
+ "celebratin", "celebration",
+ "celebrites", "celebrities",
+ "celebritiy", "celebrity",
+ "cellpading", "cellpadding",
+ "cellulaire", "cellular",
+ "cemetaries", "cemeteries",
+ "censorhsip", "censorship",
+ "censurship", "censorship",
+ "centipedle", "centipede",
+ "ceremonias", "ceremonies",
+ "ceremoniis", "ceremonies",
+ "ceremonije", "ceremonies",
+ "cerimonial", "ceremonial",
+ "cerimonies", "ceremonies",
+ "certainity", "certainty",
+ "certainlyt", "certainty",
+ "chairtable", "charitable",
+ "chalenging", "challenging",
+ "challanged", "challenged",
+ "challanges", "challenges",
+ "challegner", "challenger",
+ "challender", "challenger",
+ "challengue", "challenger",
+ "challengur", "challenger",
+ "challening", "challenging",
+ "challneger", "challenger",
+ "chanceller", "chancellor",
+ "chancillor", "chancellor",
+ "chansellor", "chancellor",
+ "charachter", "character",
+ "charactere", "characterize",
+ "characterz", "characterize",
+ "charactors", "characters",
+ "charakters", "characters",
+ "charatable", "charitable",
+ "charecters", "characters",
+ "charistics", "characteristics",
+ "charitible", "charitable",
+ "chartiable", "charitable",
+ "chechpoint", "checkpoint",
+ "checkpiont", "checkpoint",
+ "checkpoins", "checkpoints",
+ "checkponts", "checkpoints",
+ "cheesecase", "cheesecake",
+ "cheesecave", "cheesecake",
+ "cheeseface", "cheesecake",
+ "cheezecake", "cheesecake",
+ "chemcially", "chemically",
+ "chidlbirth", "childbirth",
+ "chihuahuha", "chihuahua",
+ "childbrith", "childbirth",
+ "childrends", "childrens",
+ "childrenis", "childrens",
+ "childrents", "childrens",
+ "chirstians", "christians",
+ "chocalates", "chocolates",
+ "chocloates", "chocolates",
+ "chocoaltes", "chocolates",
+ "chocolatie", "chocolates",
+ "chocolatos", "chocolates",
+ "chocolatte", "chocolates",
+ "chocolotes", "chocolates",
+ "cholestrol", "cholesterol",
+ "chormosome", "chromosome",
+ "chornicles", "chronicles",
+ "chrisitans", "christians",
+ "christains", "christians",
+ "christiaan", "christian",
+ "christimas", "christians",
+ "christinas", "christians",
+ "christines", "christians",
+ "christmans", "christians",
+ "chromasome", "chromosome",
+ "chromesome", "chromosome",
+ "chromisome", "chromosome",
+ "chromosmes", "chromosomes",
+ "chromosoms", "chromosomes",
+ "chromosone", "chromosome",
+ "chromosoom", "chromosome",
+ "chromozome", "chromosome",
+ "chronciles", "chronicles",
+ "chronicals", "chronicles",
+ "chronicels", "chronicles",
+ "chronocles", "chronicles",
+ "chronosome", "chromosome",
+ "chrsitians", "christians",
+ "cigarattes", "cigarettes",
+ "cigerattes", "cigarettes",
+ "cincinatti", "cincinnati",
+ "cinncinati", "cincinnati",
+ "circulaire", "circular",
+ "circulaton", "circulation",
+ "circumsice", "circumcised",
+ "circumsied", "circumcised",
+ "circumwent", "circumvent",
+ "circunvent", "circumvent",
+ "cirruculum", "curriculum",
+ "claculator", "calculator",
+ "clairfying", "clarifying",
+ "clasically", "classically",
+ "classicals", "classics",
+ "classrooom", "classroom",
+ "cleanliess", "cleanliness",
+ "cleareance", "clearance",
+ "cleverleys", "cleverly",
+ "cliffhager", "cliffhanger",
+ "climateers", "climates",
+ "climatiser", "climates",
+ "clincially", "clinically",
+ "clitoridis", "clitoris",
+ "clitorious", "clitoris",
+ "co-incided", "coincided",
+ "cockroachs", "cockroaches",
+ "cockroahes", "cockroaches",
+ "coefficent", "coefficient",
+ "cognatious", "contagious",
+ "cognitivie", "cognitive",
+ "coincidnce", "coincide",
+ "colelctive", "collective",
+ "colelctors", "collectors",
+ "collapsers", "collapses",
+ "collaquial", "colloquial",
+ "collasping", "collapsing",
+ "collataral", "collateral",
+ "collaterol", "collateral",
+ "collatoral", "collateral",
+ "collcetion", "collections",
+ "colleauges", "colleagues",
+ "colleciton", "collection",
+ "collectems", "collects",
+ "collectief", "collective",
+ "collecties", "collects",
+ "collectifs", "collects",
+ "collectivo", "collection",
+ "collectoin", "collections",
+ "collectons", "collections",
+ "collectros", "collects",
+ "collegaues", "colleagues",
+ "collequial", "colloquial",
+ "colleteral", "collateral",
+ "colliquial", "colloquial",
+ "collission", "collisions",
+ "collitions", "collisions",
+ "colloqiual", "colloquial",
+ "colloquail", "colloquial",
+ "colloqueal", "colloquial",
+ "collpasing", "collapsing",
+ "colonialsm", "colonialism",
+ "colorblend", "colorblind",
+ "coloublind", "colorblind",
+ "columbidae", "columbia",
+ "comapnions", "companions",
+ "comaprable", "comparable",
+ "comaprison", "comparison",
+ "comaptible", "compatible",
+ "combatabts", "combatants",
+ "combatents", "combatants",
+ "combinatin", "combinations",
+ "combinaton", "combination",
+ "comediants", "comedians",
+ "comepndium", "compendium",
+ "comferting", "comforting",
+ "comforming", "comforting",
+ "comfortbly", "comfortably",
+ "comisioned", "commissioned",
+ "comisioner", "commissioner",
+ "comissions", "commissions",
+ "commandbox", "commando",
+ "commandent", "commandment",
+ "commandeur", "commanders",
+ "commandore", "commanders",
+ "commandpod", "commando",
+ "commanists", "communists",
+ "commemters", "commenters",
+ "commencera", "commerce",
+ "commenciez", "commence",
+ "commentaar", "commentary",
+ "commentare", "commenter",
+ "commentars", "commenters",
+ "commentart", "commentator",
+ "commentery", "commentary",
+ "commentsry", "commenters",
+ "commercail", "commercials",
+ "commercent", "commence",
+ "commerical", "commercial",
+ "comminists", "communists",
+ "commisison", "commissions",
+ "commissons", "commissions",
+ "commiteted", "commited",
+ "commodites", "commodities",
+ "commtiment", "commitments",
+ "communicae", "communicated",
+ "communisim", "communism",
+ "communiste", "communities",
+ "communites", "communities",
+ "communters", "commenters",
+ "compadible", "compatible",
+ "compagnons", "companions",
+ "compainons", "companions",
+ "compairson", "comparison",
+ "compalined", "complained",
+ "compandium", "compendium",
+ "companians", "companions",
+ "companines", "companions",
+ "compansate", "compensate",
+ "comparabil", "comparable",
+ "comparason", "comparison",
+ "comparaste", "compares",
+ "comparatie", "comparative",
+ "compareble", "comparable",
+ "comparemos", "compares",
+ "comparions", "comparison",
+ "compariosn", "comparisons",
+ "comparisen", "compares",
+ "comparitve", "comparative",
+ "comparsion", "comparison",
+ "compartent", "compartment",
+ "compartmet", "compartment",
+ "compatibel", "compatible",
+ "compatibil", "compatible",
+ "compeating", "completing",
+ "compeditor", "competitor",
+ "compednium", "compendium",
+ "compeeting", "completing",
+ "compeltely", "completely",
+ "compelting", "completing",
+ "compeltion", "completion",
+ "compemdium", "compendium",
+ "compenduim", "compendium",
+ "compenents", "components",
+ "compenidum", "compendium",
+ "compensare", "compensate",
+ "comperable", "comparable",
+ "comperhend", "comprehend",
+ "compession", "compassion",
+ "competance", "competence",
+ "competator", "competitor",
+ "competenet", "competence",
+ "competense", "competence",
+ "competenze", "competence",
+ "competeted", "competed",
+ "competetor", "competitor",
+ "competidor", "competitor",
+ "competiors", "competitors",
+ "competitie", "competitive",
+ "competitin", "competitions",
+ "competitio", "competitor",
+ "competiton", "competition",
+ "competitve", "competitive",
+ "compilance", "compliance",
+ "compilaton", "compilation",
+ "compinsate", "compensate",
+ "compitable", "compatible",
+ "compitance", "compliance",
+ "complacant", "complacent",
+ "complaince", "compliance",
+ "complaines", "complaints",
+ "complainig", "complaining",
+ "complainte", "complained",
+ "complation", "completion",
+ "compleatly", "completely",
+ "complecate", "complicate",
+ "completeds", "completes",
+ "completent", "complement",
+ "completily", "complexity",
+ "completito", "completion",
+ "completley", "completely",
+ "complexers", "complexes",
+ "complexety", "complexity",
+ "complianed", "compliance",
+ "compliants", "complaints",
+ "complicaed", "complicate",
+ "complicare", "complicate",
+ "complicati", "complicit",
+ "complicato", "complication",
+ "complicite", "complicate",
+ "complicted", "complicated",
+ "complience", "compliance",
+ "complimate", "complicate",
+ "complition", "completion",
+ "complusion", "compulsion",
+ "complusive", "compulsive",
+ "complusory", "compulsory",
+ "compolsive", "compulsive",
+ "compolsory", "compulsory",
+ "compolsury", "compulsory",
+ "componants", "components",
+ "componenet", "components",
+ "componsate", "compensate",
+ "comporable", "comparable",
+ "compositae", "composite",
+ "compositie", "composite",
+ "compositon", "composition",
+ "compraison", "comparisons",
+ "compramise", "compromise",
+ "comprassem", "compress",
+ "comprehand", "comprehend",
+ "compresion", "compression",
+ "compresors", "compressor",
+ "compresser", "compressor",
+ "compressio", "compressor",
+ "compresson", "compression",
+ "comprihend", "comprehend",
+ "comprimise", "compromise",
+ "compromiss", "compromises",
+ "compromize", "compromise",
+ "compromsie", "compromises",
+ "comprossor", "compressor",
+ "compteting", "completing",
+ "comptetion", "completion",
+ "compulisve", "compulsive",
+ "compulosry", "compulsory",
+ "compulsary", "compulsory",
+ "compulsery", "compulsory",
+ "compulsing", "compulsion",
+ "compulsivo", "compulsion",
+ "compulsury", "compulsory",
+ "compuslion", "compulsion",
+ "compuslive", "compulsive",
+ "compuslory", "compulsory",
+ "compustion", "compulsion",
+ "computanti", "computation",
+ "conatiners", "containers",
+ "concedendo", "conceded",
+ "concedered", "conceded",
+ "conceitual", "conceptual",
+ "concentate", "concentrate",
+ "concenting", "connecting",
+ "conceptial", "conceptual",
+ "conceptuel", "conceptual",
+ "concersion", "concession",
+ "concesions", "concession",
+ "concidered", "considered",
+ "conciously", "consciously",
+ "concission", "concession",
+ "conclsuion", "concussion",
+ "conclusies", "conclusive",
+ "conclution", "conclusion",
+ "concorrent", "concurrent",
+ "concsience", "conscience",
+ "conculsion", "conclusion",
+ "conculsive", "conclusive",
+ "concurment", "concurrent",
+ "concurrant", "concurrent",
+ "concurrect", "concurrent",
+ "concusions", "concussion",
+ "concusison", "concussions",
+ "condamning", "condemning",
+ "condemming", "condemning",
+ "condencing", "condemning",
+ "condenming", "condemning",
+ "condensend", "condensed",
+ "condidtion", "condition",
+ "conditinal", "conditional",
+ "conditiner", "conditioner",
+ "conditiond", "conditioned",
+ "conditiong", "conditioning",
+ "condmening", "condemning",
+ "conduiting", "conducting",
+ "conencting", "connecting",
+ "conenction", "connection",
+ "conenctors", "connectors",
+ "conesencus", "consensus",
+ "confedarcy", "confederacy",
+ "confedence", "conference",
+ "confedercy", "confederacy",
+ "conferance", "conference",
+ "conferenze", "conference",
+ "conferming", "confirming",
+ "confernece", "conferences",
+ "confessino", "confessions",
+ "confidance", "confidence",
+ "confidenly", "confidently",
+ "confidense", "confidence",
+ "confidenty", "confidently",
+ "conflcting", "conflating",
+ "conflicing", "conflicting",
+ "conflictos", "conflicts",
+ "confliting", "conflating",
+ "confriming", "confirming",
+ "confussion", "confession",
+ "congratule", "congratulate",
+ "congresman", "congressman",
+ "congresmen", "congressmen",
+ "congressen", "congressmen",
+ "conjecutre", "conjecture",
+ "conjuction", "conjunction",
+ "conjuncion", "conjunction",
+ "conlcusion", "conclusion",
+ "conncetion", "connections",
+ "conneciton", "connection",
+ "connecties", "connects",
+ "connectins", "connects",
+ "connectivy", "connectivity",
+ "connectpro", "connector",
+ "conneticut", "connecticut",
+ "connotaion", "connotation",
+ "conpsiracy", "conspiracy",
+ "conqeuring", "conquering",
+ "conqouring", "conquering",
+ "conquerers", "conquerors",
+ "conquoring", "conquering",
+ "consciense", "conscience",
+ "consciouly", "consciously",
+ "consdiered", "considered",
+ "consending", "consenting",
+ "consensuel", "consensual",
+ "consenusal", "consensual",
+ "consequece", "consequence",
+ "consequnce", "consequence",
+ "conservare", "conserve",
+ "conservato", "conservation",
+ "conservice", "conserve",
+ "conservies", "conserve",
+ "conservite", "conserve",
+ "consicence", "conscience",
+ "consideras", "considers",
+ "consideret", "considerate",
+ "consipracy", "conspiracy",
+ "consistant", "consistent",
+ "consistens", "consists",
+ "consisteny", "consistency",
+ "consitency", "consistency",
+ "consituted", "constituted",
+ "conslutant", "consultant",
+ "consluting", "consulting",
+ "consolidad", "consolidated",
+ "consonents", "consonants",
+ "consorcium", "consortium",
+ "conspirace", "conspiracies",
+ "conspiricy", "conspiracy",
+ "conspriacy", "conspiracy",
+ "constaints", "constraints",
+ "constatnly", "constantly",
+ "constently", "constantly",
+ "constitude", "constitute",
+ "constitued", "constitute",
+ "constituem", "constitute",
+ "constituer", "constitute",
+ "constitues", "constitutes",
+ "constituie", "constitute",
+ "constituit", "constitute",
+ "constitutn", "constituents",
+ "constituye", "constitute",
+ "constnatly", "constantly",
+ "constracts", "constructs",
+ "constraits", "constraints",
+ "constransi", "constraints",
+ "constrants", "constraints",
+ "construced", "constructed",
+ "constructo", "construction",
+ "construint", "constraint",
+ "construits", "constructs",
+ "construted", "constructed",
+ "consueling", "consulting",
+ "consultata", "consultant",
+ "consultate", "consultant",
+ "consultati", "consultant",
+ "consultato", "consultation",
+ "consultent", "consultant",
+ "consumated", "consummated",
+ "consumbale", "consumables",
+ "consuments", "consumes",
+ "consumirem", "consumerism",
+ "consumires", "consumerism",
+ "consumirse", "consumerism",
+ "consumiste", "consumes",
+ "consumpion", "consumption",
+ "contaction", "contacting",
+ "contageous", "contagious",
+ "contagiosa", "contagious",
+ "contagioso", "contagious",
+ "contaigous", "contagious",
+ "containors", "containers",
+ "contaminen", "containment",
+ "contanting", "contacting",
+ "contection", "contention",
+ "contectual", "contextual",
+ "conteiners", "contenders",
+ "contempate", "contemplate",
+ "contemplat", "contempt",
+ "contempory", "contemporary",
+ "contenants", "continents",
+ "contencion", "contention",
+ "contendors", "contenders",
+ "contenents", "continents",
+ "conteneurs", "contenders",
+ "contengent", "contingent",
+ "contension", "contention",
+ "contentino", "contention",
+ "contentios", "contentious",
+ "contentous", "contentious",
+ "contestais", "contests",
+ "contestans", "contests",
+ "contestase", "contests",
+ "contestion", "contention",
+ "contestors", "contests",
+ "contextful", "contextual",
+ "contextuel", "contextual",
+ "contextura", "contextual",
+ "contianers", "containers",
+ "contianing", "containing",
+ "contibuted", "contributed",
+ "contibutes", "contributes",
+ "contigents", "continents",
+ "contigious", "contagious",
+ "contignent", "contingent",
+ "continants", "continents",
+ "continenal", "continental",
+ "continenet", "continents",
+ "contineous", "continuous",
+ "continetal", "continental",
+ "contingecy", "contingency",
+ "contingeny", "contingency",
+ "continient", "contingent",
+ "continious", "continuous",
+ "continiuty", "continuity",
+ "contintent", "contingent",
+ "continualy", "continually",
+ "continuare", "continue",
+ "continuati", "continuity",
+ "continuato", "continuation",
+ "continuent", "contingent",
+ "continuety", "continuity",
+ "continunes", "continents",
+ "continuons", "continuous",
+ "continutiy", "continuity",
+ "continuuum", "continuum",
+ "contitnent", "contingent",
+ "contiuning", "containing",
+ "contiunity", "continuity",
+ "contorller", "controllers",
+ "contracing", "contracting",
+ "contractar", "contractor",
+ "contracter", "contractor",
+ "contractin", "contraction",
+ "contractos", "contracts",
+ "contradice", "contradicted",
+ "contradics", "contradicts",
+ "contredict", "contradict",
+ "contribued", "contributed",
+ "contribuem", "contribute",
+ "contribuer", "contribute",
+ "contribues", "contributes",
+ "contribuie", "contribute",
+ "contribuit", "contribute",
+ "contributo", "contribution",
+ "contributs", "contributes",
+ "contribuye", "contribute",
+ "contricted", "contracted",
+ "contridict", "contradict",
+ "contriubte", "contributes",
+ "controlelr", "controllers",
+ "controlers", "controls",
+ "controling", "controlling",
+ "controlles", "controls",
+ "controvery", "controversy",
+ "controvesy", "controversy",
+ "contrubite", "contributes",
+ "contrubute", "contribute",
+ "contuining", "continuing",
+ "contuinity", "continuity",
+ "convaluted", "convoluted",
+ "convcition", "convictions",
+ "conveinent", "convenient",
+ "conveluted", "convoluted",
+ "convencion", "convention",
+ "conveniant", "convenient",
+ "conveniece", "convenience",
+ "convenince", "convenience",
+ "convential", "conventional",
+ "converesly", "conversely",
+ "convergens", "converse",
+ "converison", "conversions",
+ "converning", "converting",
+ "conversare", "converse",
+ "conversino", "conversions",
+ "conversley", "conversely",
+ "conversoin", "conversions",
+ "conversons", "conversions",
+ "convertion", "conversion",
+ "convertire", "converter",
+ "converying", "converting",
+ "conveyered", "conveyed",
+ "conviccion", "conviction",
+ "conviciton", "conviction",
+ "convienent", "convenient",
+ "conviluted", "convoluted",
+ "convincted", "convince",
+ "convinsing", "convincing",
+ "convinving", "convincing",
+ "convoluded", "convoluted",
+ "convoulted", "convoluted",
+ "convulated", "convoluted",
+ "convuluted", "convoluted",
+ "cooperatve", "cooperative",
+ "coordenate", "coordinate",
+ "coordiante", "coordinate",
+ "coordinare", "coordinate",
+ "coordinato", "coordination",
+ "coordinats", "coordinates",
+ "coordonate", "coordinate",
+ "cooridnate", "coordinate",
+ "copehnagen", "copenhagen",
+ "copenaghen", "copenhagen",
+ "copenahgen", "copenhagen",
+ "copengagen", "copenhagen",
+ "copengahen", "copenhagen",
+ "copenhagan", "copenhagen",
+ "copenhague", "copenhagen",
+ "copenhagun", "copenhagen",
+ "copenhaven", "copenhagen",
+ "copenhegan", "copenhagen",
+ "copyrighed", "copyrighted",
+ "copyrigted", "copyrighted",
+ "corinthans", "corinthians",
+ "corinthias", "corinthians",
+ "corinthins", "corinthians",
+ "cornmitted", "committed",
+ "corporatie", "corporate",
+ "corralated", "correlated",
+ "corralates", "correlates",
+ "correccion", "correction",
+ "correciton", "corrections",
+ "correcters", "correctors",
+ "correctess", "correctness",
+ "correctivo", "correction",
+ "correctons", "corrections",
+ "corregated", "correlated",
+ "correkting", "correcting",
+ "correlatas", "correlates",
+ "correlatie", "correlated",
+ "correlatos", "correlates",
+ "correspend", "correspond",
+ "corrilated", "correlated",
+ "corrilates", "correlates",
+ "corrispond", "correspond",
+ "corrolated", "correlated",
+ "corrolates", "correlates",
+ "corrospond", "correspond",
+ "corrpution", "corruption",
+ "corrulates", "correlates",
+ "corrupcion", "corruption",
+ "cosmeticas", "cosmetics",
+ "cosmeticos", "cosmetics",
+ "costumized", "customized",
+ "counceling", "counseling",
+ "councellor", "councillor",
+ "councelors", "counselors",
+ "councilers", "councils",
+ "counselers", "counselors",
+ "counsellng", "counselling",
+ "counsilers", "counselors",
+ "counsiling", "counseling",
+ "counsilors", "counselors",
+ "counsolers", "counselors",
+ "counsoling", "counseling",
+ "countepart", "counteract",
+ "counteratk", "counteract",
+ "counterbat", "counteract",
+ "countercat", "counteract",
+ "countercut", "counteract",
+ "counteries", "counters",
+ "countoring", "countering",
+ "countryies", "countryside",
+ "countrying", "countering",
+ "courcework", "coursework",
+ "coursefork", "coursework",
+ "courthosue", "courthouse",
+ "courtrooom", "courtroom",
+ "cousnelors", "counselors",
+ "coutneract", "counteract",
+ "coutnering", "countering",
+ "covenental", "covenant",
+ "cranberrry", "cranberry",
+ "creationis", "creations",
+ "creationsm", "creationism",
+ "creationst", "creationist",
+ "creativily", "creatively",
+ "creativley", "creatively",
+ "credibilty", "credibility",
+ "creeperest", "creepers",
+ "crimanally", "criminally",
+ "criminalty", "criminally",
+ "criminalul", "criminally",
+ "criticable", "critical",
+ "criticarlo", "critical",
+ "criticiing", "criticising",
+ "criticisim", "criticism",
+ "criticisme", "criticise",
+ "criticisng", "criticising",
+ "criticists", "critics",
+ "criticisze", "criticise",
+ "criticizms", "criticisms",
+ "criticizng", "criticizing",
+ "critisiced", "criticized",
+ "critisicms", "criticisms",
+ "critisicsm", "criticisms",
+ "critisiscm", "criticisms",
+ "critisisms", "criticisms",
+ "critisizes", "criticises",
+ "critisizms", "criticisms",
+ "critiziced", "criticized",
+ "critizised", "criticized",
+ "critizisms", "criticisms",
+ "critizized", "criticized",
+ "crocodille", "crocodile",
+ "crossfiter", "crossfire",
+ "crutchetts", "crutches",
+ "crystalens", "crystals",
+ "crystalisk", "crystals",
+ "crystallis", "crystals",
+ "cuatiously", "cautiously",
+ "culterally", "culturally",
+ "cultrually", "culturally",
+ "culumative", "cumulative",
+ "culutrally", "culturally",
+ "cumbersone", "cumbersome",
+ "cumbursome", "cumbersome",
+ "cumpolsory", "compulsory",
+ "cumulitive", "cumulative",
+ "currancies", "currencies",
+ "currenctly", "currency",
+ "currenices", "currencies",
+ "currentfps", "currents",
+ "currentlys", "currents",
+ "currentpos", "currents",
+ "currentusa", "currents",
+ "curriculem", "curriculum",
+ "curriculim", "curriculum",
+ "curriences", "currencies",
+ "curroption", "corruption",
+ "custimized", "customized",
+ "customzied", "customized",
+ "custumized", "customized",
+ "cutscences", "cutscene",
+ "cutscenses", "cutscene",
+ "dangerouly", "dangerously",
+ "dealerhsip", "dealerships",
+ "deathamtch", "deathmatch",
+ "deathmacth", "deathmatch",
+ "debateable", "debatable",
+ "decembeard", "december",
+ "decendants", "descendants",
+ "decendents", "descendants",
+ "decideable", "decidable",
+ "deciptions", "depictions",
+ "decisiones", "decisions",
+ "declarasen", "declares",
+ "declaraste", "declares",
+ "declaremos", "declares",
+ "decomposit", "decompose",
+ "decoracion", "decoration",
+ "decorativo", "decoration",
+ "decoritive", "decorative",
+ "decroative", "decorative",
+ "decsending", "descending",
+ "dedicacion", "dedication",
+ "dedikation", "dedication",
+ "deducatble", "deductible",
+ "deducitble", "deductible",
+ "defacation", "defamation",
+ "defamating", "defamation",
+ "defanitely", "definately",
+ "defelction", "deflection",
+ "defendeers", "defender",
+ "defendents", "defendants",
+ "defenderes", "defenders",
+ "defenesman", "defenseman",
+ "defenselss", "defenseless",
+ "defensivly", "defensively",
+ "defianetly", "definately",
+ "defiantely", "definately",
+ "defiantley", "definately",
+ "defibately", "definately",
+ "deficately", "definately",
+ "deficiancy", "deficiency",
+ "deficience", "deficiencies",
+ "deficienct", "deficient",
+ "deficienty", "deficiency",
+ "defiintely", "definately",
+ "definaetly", "definately",
+ "definaitly", "definately",
+ "definaltey", "definately",
+ "definataly", "definately",
+ "definateky", "definately",
+ "definately", "definitely",
+ "definatily", "definately",
+ "defination", "definition",
+ "definative", "definitive",
+ "definatlly", "definately",
+ "definatrly", "definately",
+ "definayely", "definately",
+ "defineatly", "definately",
+ "definetaly", "definately",
+ "definetely", "definitely",
+ "definetily", "definately",
+ "definetlly", "definetly",
+ "definettly", "definately",
+ "definicion", "definition",
+ "definietly", "definitely",
+ "definining", "defining",
+ "definitaly", "definately",
+ "definiteyl", "definitly",
+ "definitivo", "definition",
+ "definitley", "definitely",
+ "definitlly", "definitly",
+ "definitlry", "definitly",
+ "definitlty", "definitly",
+ "definjtely", "definately",
+ "definltely", "definately",
+ "definotely", "definately",
+ "definstely", "definately",
+ "defintaley", "definately",
+ "defintiely", "definitely",
+ "defintiion", "definitions",
+ "definutely", "definately",
+ "deflaction", "deflection",
+ "defleciton", "deflection",
+ "deflektion", "deflection",
+ "defniately", "definately",
+ "degenarate", "degenerate",
+ "degenerare", "degenerate",
+ "degenerite", "degenerate",
+ "degoratory", "derogatory",
+ "degraderad", "degraded",
+ "dehydraded", "dehydrated",
+ "dehyrdated", "dehydrated",
+ "deifnately", "definately",
+ "deisgnated", "designated",
+ "delaership", "dealership",
+ "delearship", "dealership",
+ "delegaties", "delegate",
+ "delegative", "delegate",
+ "delfection", "deflection",
+ "delibarate", "deliberate",
+ "deliberant", "deliberate",
+ "delibirate", "deliberate",
+ "deligthful", "delightful",
+ "deliverate", "deliberate",
+ "deliverees", "deliveries",
+ "deliviered", "delivered",
+ "deliviring", "delivering",
+ "delporable", "deplorable",
+ "delpoyment", "deployment",
+ "delutional", "delusional",
+ "dementieva", "dementia",
+ "deminsions", "dimensions",
+ "democracis", "democracies",
+ "democracts", "democrat",
+ "democratas", "democrats",
+ "democrates", "democrats",
+ "demograhic", "demographic",
+ "demographs", "demographics",
+ "demograpic", "demographic",
+ "demolation", "demolition",
+ "demolicion", "demolition",
+ "demolision", "demolition",
+ "demolitian", "demolition",
+ "demoliting", "demolition",
+ "demoloshed", "demolished",
+ "demolution", "demolition",
+ "demonished", "demolished",
+ "demonstate", "demonstrate",
+ "demonstras", "demonstrates",
+ "demorcracy", "democracy",
+ "denegerate", "degenerate",
+ "denominato", "denomination",
+ "denomintor", "denominator",
+ "deocrative", "decorative",
+ "deomcratic", "democratic",
+ "deparments", "departments",
+ "departmens", "departments",
+ "departmnet", "departments",
+ "depcitions", "depictions",
+ "depdending", "depending",
+ "depencency", "dependency",
+ "dependance", "dependence",
+ "dependancy", "dependency",
+ "dependandt", "dependant",
+ "dependends", "depended",
+ "dependened", "depended",
+ "dependenta", "dependant",
+ "dependente", "dependence",
+ "depicitons", "depictions",
+ "deplorabel", "deplorable",
+ "deplorabil", "deplorable",
+ "deplorible", "deplorable",
+ "deplyoment", "deployment",
+ "depolyment", "deployment",
+ "depositers", "deposits",
+ "depressief", "depressive",
+ "depressies", "depressive",
+ "deprivaton", "deprivation",
+ "deragotory", "derogatory",
+ "derivaties", "derivatives",
+ "deriviated", "derived",
+ "derivitave", "derivative",
+ "derivitive", "derivative",
+ "derogatary", "derogatory",
+ "derogatery", "derogatory",
+ "derogetory", "derogatory",
+ "derogitory", "derogatory",
+ "derogotary", "derogatory",
+ "derogotory", "derogatory",
+ "derviative", "derivative",
+ "descendats", "descendants",
+ "descendend", "descended",
+ "descenting", "descending",
+ "descerning", "descending",
+ "descipable", "despicable",
+ "descisions", "decisions",
+ "descriibes", "describes",
+ "descripton", "description",
+ "desginated", "designated",
+ "desigining", "designing",
+ "desireable", "desirable",
+ "desktopbsd", "desktops",
+ "despciable", "despicable",
+ "desperatly", "desperately",
+ "desperetly", "desperately",
+ "despicaple", "despicable",
+ "despicible", "despicable",
+ "dessicated", "desiccated",
+ "destinatin", "destinations",
+ "destinaton", "destination",
+ "destoryers", "destroyers",
+ "destorying", "destroying",
+ "destroyeds", "destroyers",
+ "destroyeer", "destroyers",
+ "destrucion", "destruction",
+ "destrucive", "destructive",
+ "destryoing", "destroying",
+ "detectarlo", "detector",
+ "detectaron", "detector",
+ "detectoare", "detector",
+ "determinas", "determines",
+ "determinig", "determining",
+ "determinsm", "determinism",
+ "deutschand", "deutschland",
+ "devastaded", "devastated",
+ "devastaing", "devastating",
+ "devastanti", "devastating",
+ "devasteted", "devastated",
+ "develepors", "developers",
+ "develoeprs", "developers",
+ "developmet", "developments",
+ "developors", "develops",
+ "developped", "developed",
+ "developres", "develops",
+ "develpment", "development",
+ "devestated", "devastated",
+ "devolvendo", "devolved",
+ "deyhdrated", "dehydrated",
+ "diagnosied", "diagnose",
+ "diagnosies", "diagnosis",
+ "diagnositc", "diagnostic",
+ "diagnossed", "diagnose",
+ "diagnosted", "diagnose",
+ "diagnotics", "diagnostic",
+ "diagonstic", "diagnostic",
+ "dichotomoy", "dichotomy",
+ "dicitonary", "dictionary",
+ "diconnects", "disconnects",
+ "dicovering", "discovering",
+ "dictateurs", "dictates",
+ "dictionare", "dictionaries",
+ "differance", "difference",
+ "differenly", "differently",
+ "differense", "differences",
+ "differente", "difference",
+ "differentl", "differential",
+ "differenty", "differently",
+ "differnece", "difference",
+ "difficulte", "difficulties",
+ "difficults", "difficulties",
+ "difficutly", "difficulty",
+ "diffuculty", "difficulty",
+ "diganostic", "diagnostic",
+ "dimensinal", "dimensional",
+ "dimentions", "dimensions",
+ "dimesnions", "dimensions",
+ "dimineshes", "diminishes",
+ "diminising", "diminishing",
+ "dimunitive", "diminutive",
+ "dinosaures", "dinosaurs",
+ "dinosaurus", "dinosaurs",
+ "dipections", "depictions",
+ "diplimatic", "diplomatic",
+ "diplomacia", "diplomatic",
+ "diplomancy", "diplomacy",
+ "dipolmatic", "diplomatic",
+ "directinla", "directional",
+ "directionl", "directional",
+ "directivos", "directions",
+ "directores", "directors",
+ "directorys", "directors",
+ "directsong", "directions",
+ "disaapoint", "disappoint",
+ "disagreeed", "disagreed",
+ "disapeared", "disappeared",
+ "disappeard", "disappeared",
+ "disappered", "disappeared",
+ "disappiont", "disappoint",
+ "disaproval", "disapproval",
+ "disastorus", "disastrous",
+ "disastrosa", "disastrous",
+ "disastrose", "disastrous",
+ "disastrosi", "disastrous",
+ "disastroso", "disastrous",
+ "disaterous", "disastrous",
+ "discalimer", "disclaimer",
+ "discapline", "discipline",
+ "discepline", "discipline",
+ "disception", "discretion",
+ "discharded", "discharged",
+ "disciplers", "disciples",
+ "disciplies", "disciplines",
+ "disciplins", "disciplines",
+ "disciprine", "discipline",
+ "disclamier", "disclaimer",
+ "discliamer", "disclaimer",
+ "disclipine", "discipline",
+ "disclousre", "disclosure",
+ "disclsoure", "disclosure",
+ "discograhy", "discography",
+ "discograpy", "discography",
+ "discolsure", "disclosure",
+ "disconenct", "disconnect",
+ "disconncet", "disconnects",
+ "disconnets", "disconnects",
+ "discontued", "discounted",
+ "discoruage", "discourages",
+ "discources", "discourse",
+ "discourgae", "discourages",
+ "discourges", "discourages",
+ "discoveres", "discovers",
+ "discoveryd", "discovered",
+ "discoverys", "discovers",
+ "discrecion", "discretion",
+ "discreddit", "discredited",
+ "discrepany", "discrepancy",
+ "discresion", "discretion",
+ "discreting", "discretion",
+ "discribing", "describing",
+ "discrimine", "discriminate",
+ "discrouage", "discourages",
+ "discrption", "discretion",
+ "discusison", "discussions",
+ "discusting", "discussing",
+ "disgracful", "disgraceful",
+ "disgrunted", "disgruntled",
+ "disgruntld", "disgruntled",
+ "disguisted", "disguise",
+ "disgustiny", "disgustingly",
+ "disgustosa", "disgusts",
+ "disgustose", "disgusts",
+ "disgustosi", "disgusts",
+ "disgustoso", "disgusts",
+ "dishcarged", "discharged",
+ "dishinored", "dishonored",
+ "disicpline", "discipline",
+ "disiplined", "disciplined",
+ "dislcaimer", "disclaimer",
+ "dismanteld", "dismantled",
+ "dismanting", "dismantling",
+ "dismentled", "dismantled",
+ "dispecable", "despicable",
+ "dispencary", "dispensary",
+ "dispencers", "dispenser",
+ "dispencing", "dispensing",
+ "dispensare", "dispenser",
+ "dispensory", "dispensary",
+ "dispesnary", "dispensary",
+ "dispicable", "despicable",
+ "displayfps", "displays",
+ "dispositon", "disposition",
+ "dispostion", "disposition",
+ "disputerad", "disputed",
+ "disrecpect", "disrespect",
+ "disrection", "discretion",
+ "disrepsect", "disrespect",
+ "disresepct", "disrespect",
+ "disrespekt", "disrespect",
+ "disription", "disruption",
+ "disrispect", "disrespect",
+ "disrputing", "disrupting",
+ "disruptivo", "disruption",
+ "disruptron", "disruption",
+ "dissapears", "disappears",
+ "dissappear", "disappear",
+ "disscusion", "discussion",
+ "dissmisive", "dismissive",
+ "dissodance", "dissonance",
+ "dissonante", "dissonance",
+ "dissonence", "dissonance",
+ "distastful", "distasteful",
+ "disticntly", "distinctly",
+ "distiction", "distinction",
+ "distincion", "distinction",
+ "distincive", "distinctive",
+ "distinclty", "distinctly",
+ "distinctie", "distinctive",
+ "distinctin", "distinctions",
+ "distingish", "distinguish",
+ "distingush", "distinguish",
+ "distintcly", "distinctly",
+ "distoriton", "distortion",
+ "distorsion", "distortion",
+ "distortian", "distortion",
+ "distortron", "distortion",
+ "distractes", "distracts",
+ "distractia", "district",
+ "distractin", "district",
+ "distractiv", "district",
+ "distration", "distortion",
+ "distribuem", "distribute",
+ "distribuer", "distribute",
+ "distribuie", "distribute",
+ "distribuit", "distribute",
+ "distributs", "distributors",
+ "distribuye", "distribute",
+ "distrotion", "distortion",
+ "distrubing", "disturbing",
+ "distrubtes", "distrust",
+ "distrubute", "distribute",
+ "distubring", "disturbing",
+ "disturbace", "disturbance",
+ "disturping", "disrupting",
+ "disucssing", "discussing",
+ "disucssion", "discussion",
+ "disurption", "disruption",
+ "ditributed", "distributed",
+ "diversifiy", "diversify",
+ "dividendes", "dividends",
+ "dividendos", "dividends",
+ "divideneds", "dividend",
+ "divinition", "divination",
+ "divinitory", "divinity",
+ "divisiones", "divisions",
+ "dobulelift", "doublelift",
+ "doccuments", "documents",
+ "documentry", "documentary",
+ "dogmatisch", "dogmatic",
+ "dolphinese", "dolphins",
+ "domianting", "dominating",
+ "domimation", "domination",
+ "dominacion", "domination",
+ "dominaters", "dominates",
+ "donwgraded", "downgraded",
+ "donwloaded", "downloaded",
+ "donwvoters", "downvoters",
+ "donwvoting", "downvoting",
+ "doomsdaily", "doomsday",
+ "doubellift", "doublelift",
+ "doubleiift", "doublelift",
+ "doubleleft", "doublelift",
+ "doublelfit", "doublelift",
+ "doublerift", "doublelift",
+ "doulbelift", "doublelift",
+ "downgarded", "downgraded",
+ "downgrated", "downgrade",
+ "downlaoded", "downloaded",
+ "downloadas", "downloads",
+ "downloades", "downloads",
+ "downovting", "downvoting",
+ "downroaded", "downgraded",
+ "downsiders", "downsides",
+ "downstaris", "downstairs",
+ "downstiars", "downstairs",
+ "downtokers", "downvoters",
+ "downtoking", "downvoting",
+ "downtraded", "downgraded",
+ "downviting", "downvoting",
+ "downvotear", "downvoters",
+ "downvoteas", "downvoters",
+ "downvoteds", "downvoters",
+ "downvotees", "downvoters",
+ "downvotesd", "downvoters",
+ "downvotess", "downvoters",
+ "downvotest", "downvoters",
+ "downvoteur", "downvoters",
+ "downvoties", "downvoters",
+ "downvotres", "downvoters",
+ "downvotted", "downvote",
+ "downvottes", "downvoters",
+ "downwoters", "downvoters",
+ "downwoting", "downvoting",
+ "drasticaly", "drastically",
+ "drasticlly", "drastically",
+ "draughtman", "draughtsman",
+ "dumbbellls", "dumbbells",
+ "dumbfouded", "dumbfounded",
+ "dumbfouned", "dumbfounded",
+ "dungeoness", "dungeons",
+ "dupilcates", "duplicates",
+ "duplicants", "duplicates",
+ "duplicatas", "duplicates",
+ "duplicitas", "duplicates",
+ "duplifaces", "duplicates",
+ "durabiltiy", "durability",
+ "dyamically", "dynamically",
+ "dynamicaly", "dynamically",
+ "dynamicdns", "dynamics",
+ "dynamiclly", "dynamically",
+ "dynamicpsf", "dynamics",
+ "dynamitage", "dynamite",
+ "dysfuncion", "dysfunction",
+ "earhtbound", "earthbound",
+ "earthqauke", "earthquake",
+ "earthquack", "earthquake",
+ "earthquaks", "earthquakes",
+ "earthquate", "earthquake",
+ "earthqukes", "earthquakes",
+ "easthetics", "aesthetics",
+ "ecoligical", "ecological",
+ "ecomonical", "economical",
+ "econimical", "economical",
+ "econimists", "economists",
+ "economicas", "economics",
+ "economicos", "economics",
+ "economicus", "economics",
+ "economisch", "economic",
+ "economisit", "economists",
+ "effeciency", "efficiency",
+ "effectivly", "effectively",
+ "efficeincy", "efficiency",
+ "efficently", "efficiently",
+ "efficiancy", "efficiency",
+ "efficienct", "efficient",
+ "efficienty", "efficiently",
+ "egotistcal", "egotistical",
+ "ehtnically", "ethnically",
+ "ejaculaion", "ejaculation",
+ "ejaculatie", "ejaculate",
+ "ejaculatin", "ejaculation",
+ "ejaculaton", "ejaculation",
+ "ejaculatte", "ejaculate",
+ "electircal", "electrical",
+ "electivite", "elective",
+ "electoraat", "electorate",
+ "electorale", "electorate",
+ "electorite", "electorate",
+ "electornic", "electronic",
+ "electrican", "electrician",
+ "electriciy", "electricity",
+ "electricty", "electricity",
+ "electrinic", "electrician",
+ "electroate", "electorate",
+ "electrodan", "electron",
+ "electroinc", "electron",
+ "electrolye", "electrolytes",
+ "electroman", "electron",
+ "electroncs", "electrons",
+ "electrones", "electrons",
+ "electronik", "election",
+ "electronis", "electronics",
+ "electronix", "election",
+ "elemantary", "elementary",
+ "elementery", "elementary",
+ "elementray", "elementary",
+ "eleminated", "eliminated",
+ "elephantes", "elephants",
+ "elephantis", "elephants",
+ "elephantos", "elephants",
+ "elephantus", "elephants",
+ "eletricity", "electricity",
+ "elimanates", "eliminates",
+ "elimenates", "eliminates",
+ "elimentary", "elementary",
+ "elimimates", "eliminates",
+ "eliminaste", "eliminates",
+ "eliminatin", "elimination",
+ "eliminaton", "elimination",
+ "eliminster", "eliminates",
+ "ellipitcal", "elliptical",
+ "ellipsical", "elliptical",
+ "ellipticle", "elliptical",
+ "ellitpical", "elliptical",
+ "ellpitical", "elliptical",
+ "eloquantly", "eloquently",
+ "eloquintly", "eloquently",
+ "emapthetic", "empathetic",
+ "embarassed", "embarrassed",
+ "embarassig", "embarassing",
+ "embarrased", "embarrassed",
+ "embarrases", "embarrassed",
+ "embezelled", "embezzled",
+ "emblamatic", "emblematic",
+ "embodyment", "embodiment",
+ "emergenies", "emergencies",
+ "emmigrated", "emigrated",
+ "emminently", "eminently",
+ "emmisaries", "emissaries",
+ "emobdiment", "embodiment",
+ "emotionaly", "emotionally",
+ "empahsized", "emphasized",
+ "empahsizes", "emphasizes",
+ "empathatic", "empathetic",
+ "emphacized", "emphasized",
+ "emphatetic", "empathetic",
+ "emphatised", "emphasized",
+ "emphatized", "emphasized",
+ "emphatizes", "emphasizes",
+ "emphazised", "emphasized",
+ "emphazises", "emphasizes",
+ "emphesized", "emphasized",
+ "emphesizes", "emphasizes",
+ "emphisized", "emphasized",
+ "emphisizes", "emphasizes",
+ "empiricaly", "empirically",
+ "employeers", "employees",
+ "employeurs", "employer",
+ "emprisoned", "imprisoned",
+ "encahnting", "enchanting",
+ "enchancing", "enchanting",
+ "enchanging", "enchanting",
+ "enchantent", "enchantment",
+ "enchantmet", "enchantments",
+ "encompases", "encompasses",
+ "encounterd", "encountered",
+ "encountred", "encountered",
+ "encouraing", "encouraging",
+ "encoutners", "encounters",
+ "encription", "encryption",
+ "encrpytion", "encryption",
+ "encyrption", "encryption",
+ "endlessley", "endlessly",
+ "endolithes", "endoliths",
+ "enforceing", "enforcing",
+ "engagemnet", "engagements",
+ "engagemnts", "engagements",
+ "engieneers", "engineers",
+ "enginereed", "engineered",
+ "enivitable", "inevitable",
+ "enlargment", "enlargement",
+ "enlighment", "enlighten",
+ "enlightend", "enlightened",
+ "enlightned", "enlightened",
+ "enrolement", "enrollment",
+ "enrollemnt", "enrollment",
+ "enterpirse", "enterprise",
+ "enterprice", "enterprise",
+ "enterpries", "enterprises",
+ "enterprize", "enterprise",
+ "enterprsie", "enterprises",
+ "enterrpise", "enterprises",
+ "entertaing", "entertaining",
+ "enthically", "ethnically",
+ "enthisiast", "enthusiast",
+ "enthuiasts", "enthusiast",
+ "enthuisast", "enthusiasts",
+ "enthusiams", "enthusiasm",
+ "enthusiant", "enthusiast",
+ "enthusiats", "enthusiast",
+ "enthusiest", "enthusiast",
+ "enthusists", "enthusiasts",
+ "envelopped", "envelope",
+ "enveloppen", "envelope",
+ "enveloppes", "envelope",
+ "enviorment", "environment",
+ "enviroment", "environment",
+ "environmet", "environments",
+ "equiavlent", "equivalents",
+ "equilavent", "equivalent",
+ "equilibium", "equilibrium",
+ "equilibrim", "equilibrium",
+ "equilibrum", "equilibrium",
+ "equippment", "equipment",
+ "equitorial", "equatorial",
+ "equivalant", "equivalent",
+ "equivalnce", "equivalence",
+ "equivalnet", "equivalents",
+ "equivelant", "equivalent",
+ "equivelent", "equivalent",
+ "equivilant", "equivalent",
+ "equivilent", "equivalent",
+ "equivlaent", "equivalents",
+ "equivolent", "equivalent",
+ "eratically", "erratically",
+ "escalative", "escalate",
+ "escavation", "escalation",
+ "esitmation", "estimation",
+ "esoterisch", "esoteric",
+ "especailly", "especially",
+ "espeically", "especially",
+ "espressino", "espresso",
+ "espression", "espresso",
+ "essencials", "essentials",
+ "essensials", "essentials",
+ "essentails", "essentials",
+ "essentialy", "essentially",
+ "essentiels", "essentials",
+ "essentuals", "essentials",
+ "estabishes", "establishes",
+ "estimacion", "estimation",
+ "estimativo", "estimation",
+ "estination", "estimation",
+ "ethicallly", "ethically",
+ "ethincally", "ethnically",
+ "ethnicites", "ethnicities",
+ "ethnicitiy", "ethnicity",
+ "euphorical", "euphoria",
+ "euphorisch", "euphoric",
+ "euthanaisa", "euthanasia",
+ "euthanazia", "euthanasia",
+ "euthanesia", "euthanasia",
+ "evaluacion", "evaluation",
+ "evalutaion", "evaluation",
+ "evaulating", "evaluating",
+ "evaulation", "evaluation",
+ "eventaully", "eventually",
+ "eventially", "eventually",
+ "everyoneis", "everyones",
+ "exacberate", "exacerbated",
+ "exagerated", "exaggerated",
+ "exagerates", "exaggerates",
+ "exagerrate", "exaggerate",
+ "exaggarate", "exaggerate",
+ "exaggurate", "exaggerate",
+ "exahusting", "exhausting",
+ "exahustion", "exhaustion",
+ "examinated", "examined",
+ "examinerad", "examined",
+ "exapansion", "expansion",
+ "exapnsions", "expansions",
+ "exauhsting", "exhausting",
+ "exauhstion", "exhaustion",
+ "excecuting", "executing",
+ "excecution", "execution",
+ "exceedigly", "exceedingly",
+ "exceedinly", "exceedingly",
+ "excellance", "excellence",
+ "excellenet", "excellence",
+ "excellenze", "excellence",
+ "excerising", "exercising",
+ "excessivly", "excessively",
+ "exchangees", "exchanges",
+ "excitiment", "excitement",
+ "exclsuives", "exclusives",
+ "exclusivas", "exclusives",
+ "exclusivly", "exclusively",
+ "exclusivos", "exclusives",
+ "exclusivty", "exclusivity",
+ "exclussive", "exclusives",
+ "exclusvies", "exclusives",
+ "excpetions", "exceptions",
+ "exculsives", "exclusives",
+ "exculsivly", "exclusively",
+ "execptions", "exceptions",
+ "exectuable", "executable",
+ "exectuions", "executions",
+ "exectuives", "executives",
+ "execusions", "executions",
+ "executabil", "executable",
+ "executible", "executable",
+ "executiner", "executioner",
+ "executings", "executions",
+ "executivas", "executives",
+ "exeedingly", "exceedingly",
+ "exepmtions", "exemptions",
+ "exeptional", "exceptional",
+ "exercicing", "exercising",
+ "exercizing", "exercising",
+ "exersicing", "exercising",
+ "exersising", "exercising",
+ "exersizing", "exercising",
+ "exerternal", "external",
+ "exeuctions", "executions",
+ "exhasuting", "exhausting",
+ "exhasution", "exhaustion",
+ "exhaustivo", "exhaustion",
+ "exhibicion", "exhibition",
+ "exhibitons", "exhibits",
+ "exhuasting", "exhausting",
+ "exhuastion", "exhaustion",
+ "exibitions", "exhibitions",
+ "exictement", "excitement",
+ "exipration", "expiration",
+ "existantes", "existent",
+ "existenial", "existential",
+ "existental", "existential",
+ "exlcusives", "exclusives",
+ "exorbatant", "exorbitant",
+ "exorbatent", "exorbitant",
+ "exorbidant", "exorbitant",
+ "exorbirant", "exorbitant",
+ "exorbitent", "exorbitant",
+ "expalining", "explaining",
+ "expanisons", "expansions",
+ "expansivos", "expansions",
+ "expanssion", "expansions",
+ "expantions", "expansions",
+ "expecially", "especially",
+ "expectaion", "expectation",
+ "expectansy", "expectancy",
+ "expectency", "expectancy",
+ "expections", "exceptions",
+ "expedetion", "expedition",
+ "expedicion", "expedition",
+ "expeditivo", "expedition",
+ "expeiments", "experiments",
+ "expemtions", "exemptions",
+ "expendeble", "expendable",
+ "expendible", "expendable",
+ "expensable", "expendable",
+ "expentancy", "expectancy",
+ "expereince", "experience",
+ "experement", "experiment",
+ "experiance", "experience",
+ "experieced", "experienced",
+ "experieces", "experiences",
+ "experiemnt", "experiment",
+ "experiened", "experienced",
+ "experiense", "experiences",
+ "expermient", "experiments",
+ "experssion", "expression",
+ "expextancy", "expectancy",
+ "expidetion", "expedition",
+ "expierence", "experience",
+ "expination", "expiration",
+ "expirement", "experiment",
+ "explanatin", "explanations",
+ "explicatia", "explicit",
+ "explicatie", "explicit",
+ "explicatif", "explicit",
+ "explicatii", "explicit",
+ "explicetly", "explicitly",
+ "explicilty", "explicitly",
+ "explioting", "exploiting",
+ "exploiding", "exploiting",
+ "exploition", "exploiting",
+ "explorarea", "explorer",
+ "exploreres", "explorers",
+ "explosivas", "explosives",
+ "explossion", "explosions",
+ "explossive", "explosives",
+ "explosvies", "explosives",
+ "explotions", "explosions",
+ "explusions", "explosions",
+ "expodition", "exposition",
+ "expoliting", "exploiting",
+ "expolsions", "explosions",
+ "expolsives", "explosives",
+ "exponental", "exponential",
+ "exposicion", "exposition",
+ "expositivo", "exposition",
+ "expotition", "exposition",
+ "exprensive", "expressive",
+ "expresions", "expression",
+ "expresison", "expressions",
+ "expressens", "expresses",
+ "expressief", "expressive",
+ "expressley", "expressly",
+ "expriation", "expiration",
+ "extensivly", "extensively",
+ "extentions", "extensions",
+ "exterioara", "exterior",
+ "exterioare", "exterior",
+ "extermally", "externally",
+ "extermists", "extremists",
+ "extraccion", "extraction",
+ "extractivo", "extraction",
+ "extractnow", "extraction",
+ "extradtion", "extraction",
+ "extremaste", "extremes",
+ "extremeley", "extremely",
+ "extremelly", "extremely",
+ "extrememly", "extremely",
+ "extremests", "extremists",
+ "extremised", "extremes",
+ "extremisim", "extremism",
+ "extremisme", "extremes",
+ "extremiste", "extremes",
+ "extrenally", "externally",
+ "extrimists", "extremists",
+ "eyeballers", "eyeballs",
+ "fabriacted", "fabricated",
+ "fabricatie", "fabricated",
+ "faciliated", "facilitated",
+ "facilitait", "facilitate",
+ "facilitant", "facilitate",
+ "facilitare", "facilitate",
+ "facisnated", "fascinated",
+ "facitilies", "facilities",
+ "facsinated", "fascinated",
+ "fahernheit", "fahrenheit",
+ "fahrenhiet", "fahrenheit",
+ "fallatious", "fallacious",
+ "fallicious", "fallacious",
+ "falshbacks", "flashbacks",
+ "familiarty", "familiarity",
+ "familiarze", "familiarize",
+ "fanaticals", "fanatics",
+ "fanfaction", "fanfiction",
+ "fanfcition", "fanfiction",
+ "fanficiton", "fanfiction",
+ "fanserivce", "fanservice",
+ "fanservise", "fanservice",
+ "fanservive", "fanservice",
+ "fantasiose", "fantasies",
+ "farehnheit", "fahrenheit",
+ "farhenheit", "fahrenheit",
+ "fascianted", "fascinated",
+ "fascinatie", "fascinated",
+ "fascinatin", "fascination",
+ "fascistisk", "fascists",
+ "fatalaties", "fatalities",
+ "favoruites", "favourites",
+ "favourates", "favourites",
+ "favouritsm", "favourites",
+ "favourties", "favourites",
+ "federacion", "federation",
+ "federativo", "federation",
+ "fellowhsip", "fellowship",
+ "fellowshop", "fellowship",
+ "feminimity", "femininity",
+ "feministas", "feminists",
+ "feminitity", "femininity",
+ "fermentato", "fermentation",
+ "fertalizer", "fertilizer",
+ "fertelizer", "fertilizer",
+ "fertilizar", "fertilizer",
+ "fertilzier", "fertilizer",
+ "fertiziler", "fertilizer",
+ "festivales", "festivals",
+ "fetishiste", "fetishes",
+ "ficticious", "fictitious",
+ "filessytem", "filesystem",
+ "filesytems", "filesystem",
+ "filmamkers", "filmmakers",
+ "filmmakare", "filmmakers",
+ "finallizes", "finalizes",
+ "financialy", "financially",
+ "fingernals", "fingernails",
+ "fingerpies", "fingertips",
+ "fingerpint", "fingerprint",
+ "fingertaps", "fingertips",
+ "fingertits", "fingertips",
+ "fingertops", "fingertips",
+ "fireballls", "fireballs",
+ "firefigher", "firefighter",
+ "firefigter", "firefighter",
+ "firendlies", "friendlies",
+ "firghtened", "frightened",
+ "fisionable", "fissionable",
+ "flashligth", "flashlight",
+ "flaskbacks", "flashbacks",
+ "flawleslly", "flawlessly",
+ "flexibiliy", "flexibility",
+ "flexibilty", "flexibility",
+ "flimmakers", "filmmakers",
+ "fluctuatie", "fluctuate",
+ "fluctuatin", "fluctuations",
+ "flutterhsy", "fluttershy",
+ "fluttersky", "fluttershy",
+ "flutterspy", "fluttershy",
+ "forcifully", "forcefully",
+ "forecfully", "forcefully",
+ "foreginers", "foreigners",
+ "foregorund", "foreground",
+ "foreignese", "foreigners",
+ "foreigness", "foreigners",
+ "foreignors", "foreigners",
+ "foreingers", "foreigners",
+ "forensisch", "forensic",
+ "foreseeble", "foreseeable",
+ "forgeiners", "foreigners",
+ "forgieners", "foreigners",
+ "forgivance", "forgiven",
+ "forgivenss", "forgiveness",
+ "forgotting", "forgetting",
+ "foriegners", "foreigners",
+ "formadible", "formidable",
+ "formalhaut", "fomalhaut",
+ "formallity", "formally",
+ "formallize", "formalize",
+ "formatiing", "formatting",
+ "formatings", "formations",
+ "formativos", "formations",
+ "formidabel", "formidable",
+ "formidabil", "formidable",
+ "formidible", "formidable",
+ "forminable", "formidable",
+ "formitable", "formidable",
+ "formuladas", "formulas",
+ "formulados", "formulas",
+ "forseeable", "foreseeable",
+ "fortelling", "foretelling",
+ "fortunatly", "fortunately",
+ "fortunetly", "fortunately",
+ "foundaiton", "foundations",
+ "foundaries", "foundries",
+ "foundatoin", "foundations",
+ "fractalers", "fractals",
+ "fractalius", "fractals",
+ "fractalpus", "fractals",
+ "fracturare", "fracture",
+ "fragmanted", "fragment",
+ "francaises", "franchises",
+ "franchices", "franchises",
+ "franchines", "franchises",
+ "franchizes", "franchises",
+ "franchsies", "franchises",
+ "fransiscan", "franciscan",
+ "franticaly", "frantically",
+ "franticlly", "frantically",
+ "fraternaty", "fraternity",
+ "fraternety", "fraternity",
+ "fraterntiy", "fraternity",
+ "fraturnity", "fraternity",
+ "fraudalent", "fraudulent",
+ "fraudelant", "fraudulent",
+ "fraudelent", "fraudulent",
+ "fraudolent", "fraudulent",
+ "fraudulant", "fraudulent",
+ "freedomers", "freedoms",
+ "freedomest", "freedoms",
+ "freindlies", "friendlies",
+ "freindship", "friendship",
+ "frequencey", "frequency",
+ "friednship", "friendships",
+ "friednzone", "friendzoned",
+ "friendhsip", "friendship",
+ "friendsies", "friendlies",
+ "friendzies", "friendlies",
+ "friendzond", "friendzoned",
+ "frientship", "friendship",
+ "frigthened", "frightened",
+ "fromatting", "formatting",
+ "fromidable", "formidable",
+ "frontlinie", "frontline",
+ "fruadulent", "fraudulent",
+ "frustraded", "frustrated",
+ "frustradet", "frustrates",
+ "frustraits", "frustrates",
+ "frustrants", "frustrates",
+ "frustratin", "frustration",
+ "frustrsted", "frustrates",
+ "fucntional", "functional",
+ "fulfulling", "fulfilling",
+ "fullfiling", "fulfilling",
+ "fullfilled", "fulfilled",
+ "fullscrean", "fullscreen",
+ "fulttershy", "fluttershy",
+ "funcitonal", "functional",
+ "fundametal", "fundamental",
+ "furstrated", "frustrated",
+ "furstrates", "frustrates",
+ "furutistic", "futuristic",
+ "futhermore", "furthermore",
+ "futurestic", "futuristic",
+ "futurisitc", "futuristic",
+ "futurustic", "futuristic",
+ "galvinized", "galvanized",
+ "garuanteed", "guaranteed",
+ "garuantees", "guarantees",
+ "gauntanamo", "guantanamo",
+ "gauntlents", "gauntlet",
+ "gauranteed", "guaranteed",
+ "gaurantees", "guarantees",
+ "gaurenteed", "guaranteed",
+ "gaurentees", "guarantees",
+ "generalice", "generalize",
+ "generalife", "generalize",
+ "generalnie", "generalize",
+ "generaters", "generates",
+ "generaties", "generate",
+ "generatios", "generators",
+ "generatons", "generators",
+ "generatore", "generate",
+ "generelize", "generalize",
+ "generocity", "generosity",
+ "generoisty", "generosity",
+ "generostiy", "generosity",
+ "geneticaly", "genetically",
+ "geneticlly", "genetically",
+ "genitalias", "genitals",
+ "genuinelly", "genuinely",
+ "geographia", "geographical",
+ "geogrpahic", "geographic",
+ "germanisch", "germanic",
+ "gigantisch", "gigantic",
+ "gimmickers", "gimmicks",
+ "girlfirend", "girlfriend",
+ "girlfreind", "girlfriend",
+ "girlfriens", "girlfriends",
+ "girlfrinds", "girlfriends",
+ "girlfrined", "girlfriends",
+ "goalkeaper", "goalkeeper",
+ "goalkeeprs", "goalkeeper",
+ "goalkepeer", "goalkeeper",
+ "goegraphic", "geographic",
+ "golakeeper", "goalkeeper",
+ "goldburger", "goldberg",
+ "goosebumbs", "goosebumps",
+ "goosegumps", "goosebumps",
+ "goosepumps", "goosebumps",
+ "gothenberg", "gothenburg",
+ "govenrment", "government",
+ "govermenet", "goverment",
+ "govermnent", "governments",
+ "governemnt", "government",
+ "governened", "governed",
+ "governered", "governed",
+ "governmant", "governmental",
+ "governmetn", "governments",
+ "governmnet", "government",
+ "govnerment", "government",
+ "govornment", "government",
+ "gradiating", "graduating",
+ "gradiation", "graduation",
+ "graduacion", "graduation",
+ "grapefriut", "grapefruit",
+ "grapefrukt", "grapefruit",
+ "graphicaly", "graphically",
+ "graphiclly", "graphically",
+ "gratituous", "gratuitous",
+ "gratiutous", "gratuitous",
+ "gratuidous", "gratuitous",
+ "gratuituos", "gratuitous",
+ "gratutious", "gratuitous",
+ "graudating", "graduating",
+ "graudation", "graduation",
+ "gravitatie", "gravitate",
+ "greatfully", "gratefully",
+ "greenhosue", "greenhouse",
+ "greviances", "grievances",
+ "grievences", "grievances",
+ "grilfriend", "girlfriend",
+ "guaduloupe", "guadalupe",
+ "guanatanmo", "guantanamo",
+ "guantamamo", "guantanamo",
+ "guantamano", "guantanamo",
+ "guantanano", "guantanamo",
+ "guantanemo", "guantanamo",
+ "guantanoma", "guantanamo",
+ "guantanomo", "guantanamo",
+ "guantonamo", "guantanamo",
+ "guarantess", "guarantees",
+ "guardiands", "guardians",
+ "guardianes", "guardians",
+ "guardianis", "guardians",
+ "guarenteed", "guaranteed",
+ "guarentees", "guarantees",
+ "guarnateed", "guaranteed",
+ "guarnatees", "guarantees",
+ "guarunteed", "guaranteed",
+ "guaruntees", "guarantees",
+ "guatamalan", "guatemalan",
+ "gunatanamo", "guantanamo",
+ "gunlsinger", "gunslinger",
+ "gunsiinger", "gunslinger",
+ "gunslanger", "gunslinger",
+ "gunsligner", "gunslinger",
+ "gunstinger", "gunslinger",
+ "gymanstics", "gymnastics",
+ "gymnasitcs", "gymnastics",
+ "gynmastics", "gymnastics",
+ "haemorrage", "haemorrhage",
+ "halloweeen", "halloween",
+ "hambergers", "hamburgers",
+ "hamburgare", "hamburger",
+ "hamburgesa", "hamburgers",
+ "hamburgles", "hamburgers",
+ "hamburgurs", "hamburgers",
+ "handcuffes", "handcuffs",
+ "handelbars", "handlebars",
+ "handicaped", "handicapped",
+ "handwritng", "handwriting",
+ "harasments", "harassments",
+ "hardlinked", "hardline",
+ "harmoniacs", "harmonic",
+ "harmonisch", "harmonic",
+ "harrasment", "harassment",
+ "harrassing", "harassing",
+ "harvasting", "harvesting",
+ "haversting", "harvesting",
+ "headhpones", "headphones",
+ "headphoens", "headphones",
+ "headquarer", "headquarter",
+ "headquater", "headquarter",
+ "headshoots", "headshot",
+ "healtchare", "healthcare",
+ "healtheast", "healthiest",
+ "healthyest", "healthiest",
+ "heapdhones", "headphones",
+ "heartbeart", "heartbeat",
+ "heartbeast", "heartbeat",
+ "heartborne", "heartbroken",
+ "heartbrake", "heartbreak",
+ "hearthsone", "hearthstone",
+ "heatlhcare", "healthcare",
+ "heavyweght", "heavyweight",
+ "heavyweigt", "heavyweight",
+ "hedgehodge", "hedgehog",
+ "heidelburg", "heidelberg",
+ "heigthened", "heightened",
+ "heistation", "hesitation",
+ "helathcare", "healthcare",
+ "helicopers", "helicopters",
+ "helicoptor", "helicopter",
+ "helicotper", "helicopters",
+ "helicpoter", "helicopter",
+ "helictoper", "helicopters",
+ "helikopter", "helicopter",
+ "hemingwary", "hemingway",
+ "hemingwavy", "hemingway",
+ "hemipshere", "hemisphere",
+ "hemishpere", "hemisphere",
+ "hemmorhage", "hemorrhage",
+ "hempishere", "hemisphere",
+ "herculeans", "hercules",
+ "herculeasy", "hercules",
+ "herculeees", "hercules",
+ "hesitstion", "hesitation",
+ "hestiation", "hesitation",
+ "hieghtened", "heightened",
+ "hierachies", "hierarchies",
+ "hieroglphs", "hieroglyphs",
+ "highalnder", "highlander",
+ "highlighed", "highlighted",
+ "highligted", "highlighted",
+ "highloader", "highlander",
+ "highpander", "highlander",
+ "highscholl", "highschool",
+ "highshcool", "highschool",
+ "hillarious", "hilarious",
+ "hinderance", "hindrance",
+ "hinderence", "hindrance",
+ "hipsterest", "hipsters",
+ "hispanicos", "hispanics",
+ "hispanicus", "hispanics",
+ "histarical", "historical",
+ "histerical", "historical",
+ "historiaan", "historians",
+ "historicas", "historians",
+ "historicly", "historical",
+ "historiens", "histories",
+ "historisch", "historic",
+ "hoemopathy", "homeopathy",
+ "hollywoood", "hollywood",
+ "homecuming", "homecoming",
+ "homeoapthy", "homeopathy",
+ "homeonwers", "homeowners",
+ "homeopahty", "homeopathy",
+ "homeophaty", "homeopathy",
+ "homeopothy", "homeopathy",
+ "homeothapy", "homeopathy",
+ "homepoathy", "homeopathy",
+ "homewoners", "homeowners",
+ "homoepathy", "homeopathy",
+ "homogeneos", "homogeneous",
+ "homogeneus", "homogeneous",
+ "homophibia", "homophobia",
+ "homophibic", "homophobic",
+ "homophobie", "homophobe",
+ "homophonia", "homophobia",
+ "homophopia", "homophobia",
+ "homophopic", "homophobic",
+ "homosexaul", "homosexual",
+ "homosexuel", "homosexual",
+ "honeymooon", "honeymoon",
+ "hopefullly", "hopefully",
+ "hopeleslly", "hopelessly",
+ "horisontal", "horizontal",
+ "horizantal", "horizontal",
+ "horizontes", "horizons",
+ "horiztonal", "horizontal",
+ "horrendeus", "horrendous",
+ "horriblely", "horribly",
+ "hospitales", "hospitals",
+ "hospitalty", "hospitality",
+ "hospitible", "hospitable",
+ "hsitorians", "historians",
+ "humanaties", "humanities",
+ "humanitary", "humanity",
+ "humiliatin", "humiliation",
+ "humiliaton", "humiliation",
+ "humilitied", "humiliated",
+ "humillated", "humiliated",
+ "hurricance", "hurricane",
+ "hurriganes", "hurricanes",
+ "hurrikanes", "hurricanes",
+ "hurrycanes", "hurricanes",
+ "hydropilic", "hydrophilic",
+ "hydropobic", "hydrophobic",
+ "hyperbolie", "hyperbole",
+ "hyperlobic", "hyperbolic",
+ "hyperlogic", "hyperbolic",
+ "hypertrohy", "hypertrophy",
+ "hypertropy", "hypertrophy",
+ "hyphotesis", "hypothesis",
+ "hypocrates", "hypocrites",
+ "hypocriscy", "hypocrisy",
+ "hypocrises", "hypocrites",
+ "hypocritus", "hypocrites",
+ "hypocrties", "hypocrites",
+ "hypocrytes", "hypocrites",
+ "hypokrites", "hypocrites",
+ "hypothecis", "hypothesis",
+ "hypotheiss", "hypotheses",
+ "hypothesus", "hypotheses",
+ "hypothises", "hypotheses",
+ "hypothisis", "hypothesis",
+ "hypothosis", "hypothesis",
+ "hyprocites", "hypocrites",
+ "hystarical", "hysterical",
+ "hystericly", "hysterical",
+ "hysteriska", "hysteria",
+ "ibuprofein", "ibuprofen",
+ "ibuprofine", "ibuprofen",
+ "icelandinc", "icelandic",
+ "idealisitc", "idealistic",
+ "idealogies", "ideologies",
+ "identicial", "identical",
+ "identifyed", "identified",
+ "identitets", "identities",
+ "ideolagies", "ideologies",
+ "ideoligies", "ideologies",
+ "ideologias", "ideologies",
+ "ideologice", "ideologies",
+ "ideologije", "ideologies",
+ "ideologins", "ideologies",
+ "ideologisk", "ideologies",
+ "ideolouges", "ideologies",
+ "illegalest", "illegals",
+ "illegallly", "illegally",
+ "illegimacy", "illegitimacy",
+ "illegitime", "illegitimate",
+ "illegitimt", "illegitimate",
+ "illimunati", "illuminati",
+ "illinoians", "illinois",
+ "illistrate", "illiterate",
+ "illitarate", "illiterate",
+ "illitirate", "illiterate",
+ "illumanati", "illuminati",
+ "illumaniti", "illuminati",
+ "illumianti", "illuminati",
+ "illumimati", "illuminati",
+ "illuminaci", "illuminati",
+ "illuminadi", "illuminati",
+ "illuminami", "illuminati",
+ "illuminazi", "illuminati",
+ "illuminite", "illuminati",
+ "illuminiti", "illuminati",
+ "illuminoti", "illuminati",
+ "illuminuti", "illuminati",
+ "illumniati", "illuminati",
+ "illumunati", "illuminati",
+ "illuninati", "illuminati",
+ "illusiones", "illusions",
+ "illustrant", "illustrate",
+ "illustrare", "illustrate",
+ "illustrato", "illustration",
+ "imablanced", "imbalanced",
+ "imablances", "imbalances",
+ "imaginatie", "imaginative",
+ "imaginaton", "imagination",
+ "imaginitve", "imaginative",
+ "imbalenced", "imbalanced",
+ "imbalences", "imbalances",
+ "imcomplete", "incomplete",
+ "imediately", "immediately",
+ "imigration", "emigration",
+ "immaturaty", "immaturity",
+ "immaturety", "immaturity",
+ "immedeatly", "immediately",
+ "immediatly", "immediately",
+ "immedietly", "immediately",
+ "immenseley", "immensely",
+ "immidately", "immediately",
+ "immigranti", "immigration",
+ "immigrents", "immigrants",
+ "immitating", "imitating",
+ "immobilien", "immobile",
+ "immobilier", "immobile",
+ "immobilzed", "immobile",
+ "immobilzer", "immobile",
+ "immobilzes", "immobile",
+ "immortales", "immortals",
+ "immortalis", "immortals",
+ "immortaliy", "immortality",
+ "immortalls", "immortals",
+ "immortalty", "immortality",
+ "impartirla", "impartial",
+ "impecabbly", "impeccably",
+ "impeccible", "impeccable",
+ "impeckable", "impeccable",
+ "impelments", "implements",
+ "imperetive", "imperative",
+ "imperialsm", "imperialism",
+ "imperialst", "imperialist",
+ "imperitave", "imperative",
+ "imperitive", "imperative",
+ "implaments", "implements",
+ "implantase", "implants",
+ "implausble", "implausible",
+ "implausibe", "implausible",
+ "implemenet", "implements",
+ "implicatia", "implicit",
+ "implicatie", "implicit",
+ "implicatii", "implicit",
+ "implicetly", "implicitly",
+ "impliciete", "implicit",
+ "implicilty", "implicitly",
+ "impliments", "implements",
+ "imporbable", "improbable",
+ "importanly", "importantly",
+ "importanty", "importantly",
+ "importence", "importance",
+ "importerad", "imported",
+ "imporvised", "improvised",
+ "impossable", "impossible",
+ "impossbily", "impossibly",
+ "impossibal", "impossibly",
+ "impossibel", "impossibly",
+ "impossibry", "impossibly",
+ "impossibul", "impossibly",
+ "impractial", "impractical",
+ "impreative", "imperative",
+ "impresison", "impressions",
+ "impressoin", "impressions",
+ "impressons", "impressions",
+ "improbabil", "improbable",
+ "improbible", "improbable",
+ "impropable", "improbable",
+ "improsined", "imprisoned",
+ "improsoned", "imprisoned",
+ "improvemnt", "improvement",
+ "improvents", "improves",
+ "improvized", "improvised",
+ "imprsioned", "imprisoned",
+ "impulsemos", "impulses",
+ "imrpovised", "improvised",
+ "inablility", "inability",
+ "inaccruate", "inaccurate",
+ "inadaquate", "inadequate",
+ "inadaquete", "inadequate",
+ "inadecuate", "inadequate",
+ "inadeguate", "inadequate",
+ "inadeqaute", "inadequate",
+ "inadequete", "inadequate",
+ "inadequite", "inadequate",
+ "inadiquate", "inadequate",
+ "inagurated", "inaugurated",
+ "inbalanced", "imbalanced",
+ "inbetweeen", "inbetween",
+ "incarnaton", "incarnation",
+ "incentivos", "incentives",
+ "inchoerent", "incoherent",
+ "incidentes", "incidents",
+ "incidently", "incidentally",
+ "incidentul", "incidental",
+ "inclreased", "increased",
+ "incognitio", "incognito",
+ "incoherant", "incoherent",
+ "incohorent", "incoherent",
+ "incorectly", "incorrectly",
+ "incorrecly", "incorrectly",
+ "incorrecty", "incorrectly",
+ "incorretly", "incorrectly",
+ "incraments", "increments",
+ "incredable", "incredible",
+ "incredably", "incredibly",
+ "incremetal", "incremental",
+ "incriments", "increments",
+ "inctroduce", "introduce",
+ "indefenite", "indefinite",
+ "indefinate", "indefinite",
+ "indefinete", "indefinite",
+ "indefinity", "indefinitely",
+ "indeginous", "indigenous",
+ "indentical", "identical",
+ "independet", "independent",
+ "indepenent", "independent",
+ "inderictly", "indirectly",
+ "indicaters", "indicates",
+ "indicativo", "indication",
+ "indicatore", "indicate",
+ "indicitave", "indicative",
+ "indicitive", "indicative",
+ "indiffernt", "indifferent",
+ "indigenius", "indigenous",
+ "indiginous", "indigenous",
+ "indigneous", "indigenous",
+ "indikation", "indication",
+ "indireclty", "indirectly",
+ "indirektly", "indirectly",
+ "individuel", "individual",
+ "indiviudal", "individuals",
+ "indivudual", "individual",
+ "indoensian", "indonesian",
+ "indonasian", "indonesian",
+ "indoneisan", "indonesian",
+ "indonesean", "indonesian",
+ "indonesien", "indonesian",
+ "indonesion", "indonesian",
+ "indonisian", "indonesian",
+ "indonistan", "indonesian",
+ "indpendent", "independent",
+ "industiral", "industrial",
+ "industires", "industries",
+ "industrail", "industrial",
+ "industrees", "industries",
+ "industrias", "industries",
+ "industriel", "industrial",
+ "industrija", "industrial",
+ "industrije", "industries",
+ "indviduals", "individuals",
+ "inefficent", "inefficient",
+ "ineqaulity", "inequality",
+ "inequailty", "inequality",
+ "inevatible", "inevitable",
+ "inevetable", "inevitable",
+ "inevetably", "inevitably",
+ "inevetible", "inevitable",
+ "inevidable", "inevitable",
+ "inevidably", "inevitably",
+ "inevitible", "inevitable",
+ "inevitibly", "inevitably",
+ "inevtiable", "inevitable",
+ "inevtiably", "inevitably",
+ "infallable", "infallible",
+ "infaltable", "inflatable",
+ "infeccious", "infectious",
+ "infecteous", "infectious",
+ "infectuous", "infectious",
+ "infedility", "infidelity",
+ "infektious", "infectious",
+ "inferioara", "inferior",
+ "inferioare", "inferior",
+ "inferiorty", "inferiority",
+ "inferrence", "inference",
+ "infestaion", "infestation",
+ "infestaton", "infestation",
+ "infestions", "infections",
+ "infideltiy", "infidelity",
+ "infidility", "infidelity",
+ "infiltrade", "infiltrate",
+ "infiltrait", "infiltrate",
+ "infiltrare", "infiltrate",
+ "infiltrase", "infiltrate",
+ "infinately", "infinitely",
+ "infinetely", "infinitely",
+ "infiniment", "infinite",
+ "infinitley", "infinitely",
+ "infintiely", "infinitely",
+ "inflamable", "inflatable",
+ "inflateble", "inflatable",
+ "inflatible", "inflatable",
+ "infleunced", "influenced",
+ "inflitrate", "infiltrate",
+ "influanced", "influenced",
+ "influances", "influences",
+ "influencie", "influences",
+ "influening", "influencing",
+ "influensed", "influences",
+ "influenser", "influences",
+ "influenses", "influences",
+ "influental", "influential",
+ "influented", "influenced",
+ "influentes", "influences",
+ "influneced", "influenced",
+ "infograhic", "infographic",
+ "infograpic", "infographic",
+ "infomation", "information",
+ "informable", "informal",
+ "informarla", "informal",
+ "informarle", "informal",
+ "informarlo", "informal",
+ "informatie", "informative",
+ "informella", "informal",
+ "informerad", "informed",
+ "informtion", "information",
+ "infridging", "infringing",
+ "infrigning", "infringing",
+ "infulenced", "influenced",
+ "infulences", "influences",
+ "ingenuitiy", "ingenuity",
+ "ingrediant", "ingredient",
+ "ingrediens", "ingredients",
+ "ingrediets", "ingredient",
+ "inhabitans", "inhabitants",
+ "inhabitats", "inhabitants",
+ "inherantly", "inherently",
+ "inherintly", "inherently",
+ "inheritage", "heritage",
+ "inhernetly", "inherently",
+ "inifnitely", "infinitely",
+ "initaition", "initiation",
+ "initalised", "initialised",
+ "initaliser", "initialiser",
+ "initalises", "initialises",
+ "initalisms", "initialisms",
+ "initalized", "initialized",
+ "initalizer", "initializer",
+ "initalizes", "initializes",
+ "initalling", "initialling",
+ "initalness", "initialness",
+ "initiaitve", "initiatives",
+ "initiaties", "initiatives",
+ "initiativs", "initiatives",
+ "initiatves", "initiatives",
+ "initiavite", "initiatives",
+ "inititaive", "initiatives",
+ "inititiave", "initiatives",
+ "initmately", "intimately",
+ "initmidate", "intimidate",
+ "inituition", "initiation",
+ "injustaces", "injustices",
+ "injusticas", "injustices",
+ "inmigrants", "immigrants",
+ "innoavtion", "innovations",
+ "innocentes", "innocents",
+ "innotation", "innovation",
+ "innovacion", "innovation",
+ "innovaiton", "innovations",
+ "innovatief", "innovate",
+ "innovaties", "innovate",
+ "innovativo", "innovation",
+ "innvoation", "innovation",
+ "inofficial", "unofficial",
+ "inpsection", "inspection",
+ "inquisator", "inquisitor",
+ "inquisidor", "inquisitor",
+ "inquisiter", "inquisitor",
+ "inquisitio", "inquisitor",
+ "inquisitir", "inquisitor",
+ "inquisiton", "inquisition",
+ "inquistior", "inquisitor",
+ "inquizitor", "inquisitor",
+ "inqusitior", "inquisitor",
+ "insensitve", "insensitive",
+ "insepction", "inspection",
+ "insistance", "insistence",
+ "insistente", "insistence",
+ "insistenze", "insistence",
+ "insistince", "insistence",
+ "insitution", "institution",
+ "inspeccion", "inspection",
+ "inspeciton", "inspections",
+ "inspectons", "inspections",
+ "inspectres", "inspectors",
+ "inspektion", "inspection",
+ "inspektors", "inspectors",
+ "inspiraste", "inspires",
+ "inspiraton", "inspiration",
+ "inspirerad", "inspired",
+ "inspireras", "inspires",
+ "insrugency", "insurgency",
+ "instabiliy", "instability",
+ "instabilty", "instability",
+ "installeer", "installer",
+ "installent", "installment",
+ "installesd", "installs",
+ "installion", "installing",
+ "instatance", "instance",
+ "instelling", "installing",
+ "instituded", "instituted",
+ "instituion", "institution",
+ "institutie", "institute",
+ "institutue", "instituted",
+ "instrament", "instrument",
+ "instrcutor", "instructors",
+ "instrucion", "instruction",
+ "instructer", "instructor",
+ "instructie", "instructed",
+ "instruktor", "instructor",
+ "instuction", "instruction",
+ "instuments", "instruments",
+ "insturcted", "instructed",
+ "insturctor", "instructor",
+ "insturment", "instrument",
+ "instutions", "intuitions",
+ "instututed", "instituted",
+ "insurgance", "insurgency",
+ "insurgancy", "insurgency",
+ "intangable", "intangible",
+ "intangeble", "intangible",
+ "intangibil", "intangible",
+ "intanjible", "intangible",
+ "integraded", "integrated",
+ "integrarla", "integral",
+ "integrarlo", "integral",
+ "integratie", "integrated",
+ "integreres", "interferes",
+ "integreted", "integrated",
+ "inteligent", "intelligent",
+ "intenseley", "intensely",
+ "intensitiy", "intensity",
+ "intentinal", "intentional",
+ "intentines", "intestines",
+ "interacive", "interactive",
+ "interactes", "interacts",
+ "interactie", "interactive",
+ "interactue", "interacted",
+ "interasted", "interacted",
+ "interbread", "interbreed",
+ "intercepto", "interception",
+ "intercorse", "intercourse",
+ "intercouse", "intercourse",
+ "intereacts", "interfaces",
+ "interected", "interacted",
+ "interefers", "interferes",
+ "interesant", "interest",
+ "interesing", "interesting",
+ "interestes", "interests",
+ "interfacce", "interfaces",
+ "interfears", "interferes",
+ "interfeers", "interferes",
+ "interferce", "interferes",
+ "interferre", "interfere",
+ "intergated", "integrated",
+ "interioara", "interior",
+ "interioare", "interior",
+ "intermedie", "intermediate",
+ "internetbs", "internets",
+ "internetes", "internets",
+ "internetis", "internets",
+ "internetts", "internets",
+ "internetus", "internets",
+ "interprate", "interpret",
+ "interrugum", "interregnum",
+ "interruped", "interrupted",
+ "interstela", "interstellar",
+ "intervalls", "intervals",
+ "intervalos", "intervals",
+ "interveign", "intervening",
+ "interveing", "intervening",
+ "interveiws", "interviews",
+ "intervento", "intervention",
+ "intervenue", "intervene",
+ "interveres", "interferes",
+ "intervieni", "interviewing",
+ "intervieuw", "interviews",
+ "interviewd", "interviewed",
+ "interviewr", "interviewer",
+ "intervines", "intervenes",
+ "interviwed", "interviewed",
+ "interviwer", "interviewer",
+ "interwebbs", "interwebs",
+ "intestents", "intestines",
+ "intestinas", "intestines",
+ "intestinos", "intestines",
+ "intestions", "intestines",
+ "intidimate", "intimidate",
+ "intimadate", "intimidate",
+ "intimatley", "intimately",
+ "intimiated", "intimidate",
+ "intimidade", "intimidated",
+ "intimidant", "intimidate",
+ "intimidare", "intimidate",
+ "intimitade", "intimidated",
+ "intimitaly", "intimately",
+ "intimitate", "intimidate",
+ "intimitely", "intimately",
+ "intolarant", "intolerant",
+ "intolerace", "intolerance",
+ "intolerate", "intolerant",
+ "intolerent", "intolerant",
+ "intolorant", "intolerant",
+ "intolorent", "intolerant",
+ "intorduced", "introduced",
+ "intorduces", "introduces",
+ "intorverts", "introverts",
+ "intoxicted", "intoxicated",
+ "intraverts", "introverts",
+ "intreguing", "intriguing",
+ "intricaces", "intricacies",
+ "intriguied", "intrigue",
+ "intrigured", "intrigue",
+ "intrinseci", "intrinsic",
+ "intrinsinc", "intrinsic",
+ "intriquing", "intriguing",
+ "intriuging", "intriguing",
+ "introdecks", "introduces",
+ "introdused", "introduces",
+ "introvents", "introverts",
+ "introvered", "introverted",
+ "introversa", "introverts",
+ "introverse", "introverts",
+ "introversi", "introverts",
+ "introverso", "introverts",
+ "introversy", "introverts",
+ "introveted", "introverted",
+ "intruduced", "introduced",
+ "intruduces", "introduces",
+ "intruiging", "intriguing",
+ "intruments", "instruments",
+ "intuitevly", "intuitively",
+ "intuitivly", "intuitively",
+ "intuitivno", "intuition",
+ "intutively", "intuitively",
+ "inumerable", "enumerable",
+ "inusrgency", "insurgency",
+ "invaderats", "invaders",
+ "invaildate", "invalidates",
+ "invairably", "invariably",
+ "invaldiate", "invalidates",
+ "invalidade", "invalidate",
+ "invalidare", "invalidate",
+ "invalubale", "invaluable",
+ "invalueble", "invaluable",
+ "invaraibly", "invariably",
+ "invariabil", "invariably",
+ "invaribaly", "invariably",
+ "invaulable", "invaluable",
+ "inveitable", "inevitable",
+ "inveitably", "inevitably",
+ "invensions", "inventions",
+ "inventario", "inventor",
+ "inventarlo", "inventor",
+ "inventaron", "inventor",
+ "inventings", "inventions",
+ "inventivos", "inventions",
+ "invertendo", "inverted",
+ "inverterad", "inverted",
+ "invertions", "inventions",
+ "investemnt", "investments",
+ "investiage", "investigate",
+ "investions", "inventions",
+ "investirat", "investigator",
+ "investmens", "investments",
+ "invicinble", "invincible",
+ "invididual", "individual",
+ "invincable", "invincible",
+ "invinceble", "invincible",
+ "invinicble", "invincible",
+ "invinsible", "invincible",
+ "invinvible", "invincible",
+ "invisibily", "invisibility",
+ "invitacion", "invitation",
+ "invitating", "invitation",
+ "involunary", "involuntary",
+ "involvment", "involvement",
+ "ironcially", "ironically",
+ "irracional", "irrational",
+ "irrationel", "irrational",
+ "irrelavant", "irrelevant",
+ "irrelavent", "irrelevant",
+ "irrelevent", "irrelevant",
+ "irrelivant", "irrelevant",
+ "irrelivent", "irrelevant",
+ "irrevelant", "irrelevant",
+ "irreverant", "irrelevant",
+ "irridation", "irritation",
+ "irriration", "irritation",
+ "irritacion", "irritation",
+ "irritaties", "irritate",
+ "islamisist", "islamist",
+ "islamistas", "islamists",
+ "isntalling", "installing",
+ "isntructed", "instructed",
+ "isntrument", "instrument",
+ "israeliens", "israelis",
+ "israelitas", "israelis",
+ "italianess", "italians",
+ "itnroduced", "introduced",
+ "jailborken", "jailbroken",
+ "jalibroken", "jailbroken",
+ "jamaicains", "jamaican",
+ "jamaicaman", "jamaican",
+ "jerusaleum", "jerusalem",
+ "jounralism", "journalism",
+ "jounralist", "journalist",
+ "jouranlism", "journalism",
+ "jouranlist", "journalist",
+ "journalims", "journals",
+ "journalits", "journals",
+ "journalizm", "journalism",
+ "journalsim", "journalism",
+ "journolist", "journalist",
+ "judegments", "judgements",
+ "judgemenal", "judgemental",
+ "judgemetal", "judgemental",
+ "jugdements", "judgements",
+ "juggarnaut", "juggernaut",
+ "juggeranut", "juggernaut",
+ "juggernath", "juggernaut",
+ "juggernout", "juggernaut",
+ "juggernuat", "juggernaut",
+ "juggetnaut", "juggernaut",
+ "jugglenaut", "juggernaut",
+ "juggurnaut", "juggernaut",
+ "justifible", "justifiable",
+ "juvenilles", "juvenile",
+ "kickstarer", "kickstarter",
+ "kickstartr", "kickstarter",
+ "kickstater", "kickstarter",
+ "kidnapning", "kidnapping",
+ "kidnappade", "kidnapped",
+ "killingest", "killings",
+ "kilometros", "kilometers",
+ "kilomiters", "kilometers",
+ "kilomoters", "kilometers",
+ "kilomteres", "kilometers",
+ "kindapping", "kidnapping",
+ "kingdomers", "kingdoms",
+ "krpytonite", "kryptonite",
+ "krypotnite", "kryptonite",
+ "krypronite", "kryptonite",
+ "kryptinite", "kryptonite",
+ "kryptolite", "kryptonite",
+ "kryptonyte", "kryptonite",
+ "krypyonite", "kryptonite",
+ "krytponite", "kryptonite",
+ "kyrptonite", "kryptonite",
+ "labarotory", "laboratory",
+ "laboratroy", "laboratory",
+ "laborerers", "laborers",
+ "laboritory", "laboratory",
+ "laborotory", "laboratory",
+ "lackbuster", "lackluster",
+ "lacklaster", "lackluster",
+ "landacapes", "landscapes",
+ "landingers", "landings",
+ "landshapes", "landscapes",
+ "landspaces", "landscapes",
+ "lannasters", "lannisters",
+ "lannesters", "lannisters",
+ "lannistars", "lannisters",
+ "lannsiters", "lannisters",
+ "lateration", "alteration",
+ "latitudine", "latitude",
+ "laughabley", "laughably",
+ "laughablly", "laughably",
+ "launchered", "launched",
+ "leaglizing", "legalizing",
+ "lectureres", "lectures",
+ "legalazing", "legalizing",
+ "legalizare", "legalize",
+ "legalizate", "legalize",
+ "legendaies", "legendaries",
+ "legendaris", "legendaries",
+ "legimitacy", "legitimacy",
+ "legimitate", "legitimate",
+ "legislatie", "legislative",
+ "legitamacy", "legitimacy",
+ "legitamate", "legitimate",
+ "legitamicy", "legitimacy",
+ "legitamite", "legitimate",
+ "legitemacy", "legitimacy",
+ "legitemate", "legitimate",
+ "legitimaly", "legitimacy",
+ "legitimicy", "legitimacy",
+ "legitimite", "legitimate",
+ "leiutenant", "lieutenant",
+ "lesbianese", "lesbians",
+ "lesbianest", "lesbians",
+ "leuitenant", "lieutenant",
+ "levetating", "levitating",
+ "liberacion", "liberation",
+ "liberalest", "liberate",
+ "liberalizm", "liberalism",
+ "liberalnim", "liberalism",
+ "liberalsim", "liberalism",
+ "liberarion", "liberation",
+ "liberaties", "liberate",
+ "liberatore", "liberate",
+ "libertania", "libertarians",
+ "libguistic", "linguistic",
+ "lietuenant", "lieutenant",
+ "lieutanant", "lieutenant",
+ "lieutanent", "lieutenant",
+ "lieutenent", "lieutenant",
+ "lifestiles", "lifestyles",
+ "lifestlyes", "lifestyles",
+ "lifesystem", "filesystem",
+ "lifesytles", "lifestyles",
+ "lifetimers", "lifetimes",
+ "lifetsyles", "lifestyles",
+ "lighhtning", "lightening",
+ "lightergas", "lighters",
+ "lighthning", "lightening",
+ "lighthorse", "lighthouse",
+ "lighthosue", "lighthouse",
+ "lighthours", "lighthouse",
+ "lightining", "lighting",
+ "lightneing", "lightening",
+ "lightnting", "lightening",
+ "lightrooom", "lightroom",
+ "lightweigt", "lightweight",
+ "ligitation", "litigation",
+ "ligthening", "lightening",
+ "ligthhouse", "lighthouse",
+ "likelyhood", "likelihood",
+ "limination", "limitation",
+ "limitacion", "limitation",
+ "limitaiton", "limitation",
+ "limitating", "limitation",
+ "limitativo", "limitation",
+ "linguisics", "linguistics",
+ "linguisitc", "linguistics",
+ "linguistcs", "linguistics",
+ "linguistis", "linguistics",
+ "linguitics", "linguistic",
+ "lingusitic", "linguistics",
+ "lingvistic", "linguistic",
+ "liousville", "louisville",
+ "listeneres", "listeners",
+ "literallly", "literally",
+ "literarely", "literary",
+ "literarlly", "literary",
+ "literatire", "literate",
+ "literative", "literate",
+ "literatute", "literate",
+ "lithuanina", "lithuania",
+ "litterally", "literally",
+ "liuetenant", "lieutenant",
+ "liveatream", "livestream",
+ "livelehood", "livelihood",
+ "liverpoool", "liverpool",
+ "livescream", "livestream",
+ "livestreem", "livestream",
+ "livestrems", "livestream",
+ "livilehood", "livelihood",
+ "livliehood", "livelihood",
+ "lobbyistes", "lobbyists",
+ "lockacreen", "lockscreen",
+ "logictical", "logistical",
+ "logisitcal", "logistical",
+ "logisticas", "logistics",
+ "logisticly", "logistical",
+ "loiusville", "louisville",
+ "lollipoopy", "lollipop",
+ "lonelyness", "loneliness",
+ "longevitiy", "longevity",
+ "lonileness", "loneliness",
+ "lonlieness", "loneliness",
+ "louieville", "louisville",
+ "louisiania", "louisiana",
+ "louisianna", "louisiana",
+ "louisivlle", "louisville",
+ "louisviile", "louisville",
+ "lousiville", "louisville",
+ "luietenant", "lieutenant",
+ "mabyelline", "maybelline",
+ "magnifient", "magnificent",
+ "mainpulate", "manipulate",
+ "mainstreem", "mainstream",
+ "maintaince", "maintained",
+ "maintaines", "maintains",
+ "maintainig", "maintaining",
+ "maintenace", "maintenance",
+ "maintianed", "maintained",
+ "maintioned", "mentioned",
+ "malfuncion", "malfunction",
+ "malpractce", "malpractice",
+ "managebale", "manageable",
+ "maneagable", "manageable",
+ "maneouvred", "manoeuvred",
+ "maneouvres", "manoeuvres",
+ "maneuveres", "maneuvers",
+ "maneuveurs", "maneuver",
+ "manifestas", "manifests",
+ "manifestes", "manifests",
+ "manifestus", "manifests",
+ "manipluate", "manipulate",
+ "manipualte", "manipulate",
+ "manipulant", "manipulate",
+ "manipulare", "manipulate",
+ "manipulted", "manipulated",
+ "maniuplate", "manipulate",
+ "mannarisms", "mannerisms",
+ "mannersims", "mannerisms",
+ "mannorisms", "mannerisms",
+ "manufacter", "manufacture",
+ "manufacure", "manufacture",
+ "manufature", "manufacture",
+ "maraudeurs", "marauder",
+ "margaritte", "margaret",
+ "margianlly", "marginally",
+ "marginaali", "marginal",
+ "marginable", "marginal",
+ "marignally", "marginally",
+ "marijuanna", "marijuana",
+ "marketting", "marketing",
+ "marshmalow", "marshmallow",
+ "masculinty", "masculinity",
+ "massacrare", "massacre",
+ "massivelly", "massively",
+ "masteriers", "masteries",
+ "masternind", "mastermind",
+ "masterpice", "masterpiece",
+ "mastrubate", "masturbate",
+ "mastubrate", "masturbated",
+ "masturabte", "masturbate",
+ "masturbait", "masturbate",
+ "masturbare", "masturbate",
+ "masturbeta", "masturbated",
+ "masturdate", "masturbate",
+ "materiales", "materials",
+ "materialsm", "materialism",
+ "maximazing", "maximizing",
+ "maximixing", "maximizing",
+ "mayballine", "maybelline",
+ "maybellene", "maybelline",
+ "maybellibe", "maybelline",
+ "maybilline", "maybelline",
+ "mccarthyst", "mccarthyist",
+ "mdifielder", "midfielder",
+ "meagthread", "megathread",
+ "meaningess", "meanings",
+ "meaningles", "meanings",
+ "meatballls", "meatballs",
+ "mecahnical", "mechanical",
+ "mecahnisms", "mechanisms",
+ "mechancial", "mechanical",
+ "mechandise", "merchandise",
+ "mechanichs", "mechanics",
+ "mechanicle", "mechanical",
+ "mechanicly", "mechanical",
+ "mechanicus", "mechanics",
+ "mechanincs", "mechanic",
+ "mechanisim", "mechanism",
+ "mechansims", "mechanisms",
+ "mechinical", "mechanical",
+ "mechinisms", "mechanisms",
+ "mediaction", "medications",
+ "medicacion", "medication",
+ "medicaiton", "medication",
+ "medicalert", "medicare",
+ "medicallly", "medically",
+ "medicatons", "medications",
+ "medicinens", "medicines",
+ "medicinske", "medicine",
+ "medicority", "mediocrity",
+ "medidating", "meditating",
+ "mediocirty", "mediocrity",
+ "mediocraty", "mediocrity",
+ "mediocrety", "mediocrity",
+ "mediocricy", "mediocrity",
+ "mediocrily", "mediocrity",
+ "mediocrisy", "mediocrity",
+ "meditacion", "medications",
+ "meditaiton", "meditation",
+ "melatonian", "melatonin",
+ "melatonion", "melatonin",
+ "mellinnium", "millennium",
+ "melodieuse", "melodies",
+ "membrances", "membrane",
+ "mentallity", "mentally",
+ "mentionnes", "mentions",
+ "mercenaire", "mercenaries",
+ "mercenares", "mercenaries",
+ "mercentile", "mercantile",
+ "merchanise", "merchandise",
+ "merchantos", "merchants",
+ "messagease", "messages",
+ "messagepad", "messaged",
+ "messenging", "messaging",
+ "metabalism", "metabolism",
+ "metabilism", "metabolism",
+ "metabloism", "metabolism",
+ "metablosim", "metabolism",
+ "metabolics", "metabolism",
+ "metabolizm", "metabolism",
+ "metabolsim", "metabolism",
+ "metalurgic", "metallurgic",
+ "metaphoras", "metaphors",
+ "metaphores", "metaphors",
+ "metaphyics", "metaphysics",
+ "meterology", "meteorology",
+ "methaphors", "metaphors",
+ "methodolgy", "methodology",
+ "methodoloy", "methodology",
+ "metrapolis", "metropolis",
+ "metrolopis", "metropolis",
+ "metropilis", "metropolis",
+ "metroplois", "metropolis",
+ "metropolin", "metropolitan",
+ "metropolos", "metropolis",
+ "metropolys", "metropolis",
+ "mexicanese", "mexicans",
+ "mexicaness", "mexicans",
+ "michelline", "michelle",
+ "micorwaves", "microwaves",
+ "microhpone", "microphone",
+ "microscoop", "microscope",
+ "microvaves", "microwaves",
+ "microvaxes", "microwaves",
+ "micrpohone", "microphones",
+ "midfeilder", "midfielder",
+ "midfiedler", "midfielder",
+ "midfieldes", "midfielders",
+ "midfielers", "midfielders",
+ "midfileder", "midfielder",
+ "midifelder", "midfielder",
+ "midnlessly", "mindlessly",
+ "migitation", "mitigation",
+ "migrainers", "migraines",
+ "miletsones", "milestones",
+ "milisecond", "millisecond",
+ "militiades", "militias",
+ "militiants", "militias",
+ "millinnium", "millennium",
+ "miminalist", "minimalist",
+ "minamilist", "minimalist",
+ "mindleslly", "mindlessly",
+ "minimazing", "minimizing",
+ "minimilast", "minimalist",
+ "minimilist", "minimalist",
+ "mininalist", "minimalist",
+ "ministeres", "ministers",
+ "ministerns", "ministers",
+ "minneaplis", "minneapolis",
+ "minneapols", "minneapolis",
+ "minnesotta", "minnesota",
+ "minoritets", "minorities",
+ "minoroties", "minorities",
+ "miracalous", "miraculous",
+ "miracluous", "miraculous",
+ "miracoulus", "miraculous",
+ "mircophone", "microphone",
+ "mircoscope", "microscope",
+ "mircowaves", "microwaves",
+ "misandrony", "misandry",
+ "miscarrage", "miscarriage",
+ "miscarrige", "miscarriage",
+ "misdemenor", "misdemeanor",
+ "miserabley", "miserably",
+ "miserablly", "miserably",
+ "misforture", "misfortune",
+ "misgoynist", "misogynist",
+ "misinfomed", "misinformed",
+ "misinterpt", "misinterpret",
+ "misisonary", "missionary",
+ "misoganist", "misogynist",
+ "misogenist", "misogynist",
+ "misoginist", "misogynist",
+ "misoginyst", "misogynist",
+ "misognyist", "misogynist",
+ "misogonist", "misogynist",
+ "misogonyst", "misogynist",
+ "misogyinst", "misogynist",
+ "misogynyst", "misogynist",
+ "misoygnist", "misogynist",
+ "mispelling", "misspelling",
+ "missionare", "missionaries",
+ "missionera", "missionary",
+ "missisippi", "mississippi",
+ "mississipi", "mississippi",
+ "mississppi", "mississippi",
+ "misspeling", "misspelling",
+ "misspellng", "misspelling",
+ "mistakedly", "mistakenly",
+ "mistakinly", "mistakenly",
+ "mistankely", "mistakenly",
+ "misterious", "mysterious",
+ "misteryous", "mysterious",
+ "mistreaded", "mistreated",
+ "misygonist", "misogynist",
+ "mitigaiton", "mitigation",
+ "moderacion", "moderation",
+ "moderaters", "moderates",
+ "moderatley", "moderately",
+ "moderatore", "moderate",
+ "moderatorn", "moderation",
+ "modificato", "modification",
+ "modifieras", "modifiers",
+ "modifieres", "modifiers",
+ "moisturier", "moisturizer",
+ "moleculair", "molecular",
+ "molestaion", "molestation",
+ "molestarle", "molester",
+ "molestarme", "molester",
+ "molestarse", "molester",
+ "molestarte", "molester",
+ "molestered", "molested",
+ "momentarly", "momentarily",
+ "monagomous", "monogamous",
+ "monetizare", "monetize",
+ "monitering", "monitoring",
+ "monogymous", "monogamous",
+ "monolistic", "monolithic",
+ "monolitich", "monolithic",
+ "monolopies", "monopolies",
+ "monolothic", "monolithic",
+ "monolythic", "monolithic",
+ "monopilies", "monopolies",
+ "monoploies", "monopolies",
+ "monopolets", "monopolies",
+ "monopolice", "monopolies",
+ "monopolios", "monopolies",
+ "monothilic", "monolithic",
+ "monsterous", "monsters",
+ "montioring", "monitoring",
+ "monumentos", "monuments",
+ "monumentul", "monumental",
+ "monumentus", "monuments",
+ "mormonisim", "mormonism",
+ "morphinate", "morphine",
+ "morrisette", "morissette",
+ "morrisound", "morrison",
+ "mosquitero", "mosquito",
+ "mosquiters", "mosquitoes",
+ "motherbard", "motherboard",
+ "motherboad", "motherboard",
+ "motherbord", "motherboard",
+ "motivaiton", "motivations",
+ "motiviated", "motivated",
+ "motorcicle", "motorcycle",
+ "motorcylce", "motorcycle",
+ "motorcyles", "motorcycles",
+ "motorollas", "motorola",
+ "mouthpeace", "mouthpiece",
+ "mouthpeice", "mouthpiece",
+ "movespeeed", "movespeed",
+ "mozzaralla", "mozzarella",
+ "mozzeralla", "mozzarella",
+ "mozzorella", "mozzarella",
+ "mulitation", "mutilation",
+ "mulitplied", "multiplied",
+ "mulitplier", "multiplier",
+ "mulitverse", "multiverse",
+ "multilpier", "multiplier",
+ "multiplaer", "multiplier",
+ "multiplaye", "multiply",
+ "multiplayr", "multiply",
+ "multiplays", "multiply",
+ "multipleye", "multiply",
+ "multipling", "multiplying",
+ "multiplyed", "multiplied",
+ "multiplyer", "multiple",
+ "multiplyng", "multiplying",
+ "murderered", "murdered",
+ "murdereres", "murderers",
+ "muscicians", "musicians",
+ "musculaire", "muscular",
+ "mushroooms", "mushroom",
+ "mutialtion", "mutilation",
+ "mutiliated", "mutilated",
+ "mutliation", "mutilation",
+ "mutliplied", "multiplied",
+ "mutliplier", "multiplier",
+ "mutliverse", "multiverse",
+ "mysogynist", "misogynist",
+ "mysterieus", "mysteries",
+ "nagivating", "navigating",
+ "nagivation", "navigation",
+ "narcassism", "narcissism",
+ "narcassist", "narcissist",
+ "narcessist", "narcissist",
+ "narciscism", "narcissism",
+ "narciscist", "narcissist",
+ "narcisissm", "narcissism",
+ "narcisisst", "narcissist",
+ "narcisists", "narcissist",
+ "narcissicm", "narcissism",
+ "narcissict", "narcissist",
+ "narcissitc", "narcissist",
+ "narcissits", "narcissist",
+ "narcoticos", "narcotics",
+ "narrativas", "narratives",
+ "narrativos", "narratives",
+ "narritives", "narratives",
+ "nashvillle", "nashville",
+ "nationales", "nationals",
+ "nationalis", "nationals",
+ "nationalit", "nationalist",
+ "nationaliy", "nationality",
+ "nationalty", "nationality",
+ "nationella", "national",
+ "naturually", "naturally",
+ "naviagting", "navigating",
+ "naviagtion", "navigation",
+ "navigatore", "navigate",
+ "neccessary", "necessary",
+ "necesarily", "necessarily",
+ "necessairy", "necessarily",
+ "necessarly", "necessary",
+ "necessarry", "necessary",
+ "necessiate", "necessitate",
+ "necessites", "necessities",
+ "neckbeared", "neckbeard",
+ "neckboards", "neckbeards",
+ "neckbreads", "neckbeards",
+ "neckneards", "neckbeards",
+ "necromacer", "necromancer",
+ "necromaner", "necromancer",
+ "needleslly", "needlessly",
+ "negativaty", "negativity",
+ "negativley", "negatively",
+ "negelcting", "neglecting",
+ "negilgence", "negligence",
+ "negiotated", "negotiated",
+ "neglacting", "neglecting",
+ "neglagence", "negligence",
+ "neglegance", "negligence",
+ "neglegible", "negligible",
+ "neglegting", "neglecting",
+ "neglibible", "negligible",
+ "neglicence", "negligence",
+ "neglicible", "negligible",
+ "neglicting", "neglecting",
+ "negligable", "negligible",
+ "negligance", "negligence",
+ "negligeble", "negligible",
+ "negligente", "negligence",
+ "negociated", "negotiated",
+ "negogiated", "negotiated",
+ "negoitated", "negotiated",
+ "negotaited", "negotiated",
+ "negotation", "negotiation",
+ "negotiaion", "negotiation",
+ "negotiatie", "negotiated",
+ "negotiatin", "negotiations",
+ "negotiaton", "negotiation",
+ "neigbhours", "neighbours",
+ "neighbhors", "neighbours",
+ "neighbords", "neighbours",
+ "neighbores", "neighbours",
+ "netowrking", "networking",
+ "netruality", "neutrality",
+ "neturality", "neutrality",
+ "netwroking", "networking",
+ "neurologia", "neurological",
+ "neutrailty", "neutrality",
+ "newletters", "newsletters",
+ "newlsetter", "newsletter",
+ "newsettler", "newsletter",
+ "newslatter", "newsletter",
+ "nieghbours", "neighbours",
+ "nightmates", "nightmares",
+ "nightmears", "nightmares",
+ "nightmeres", "nightmares",
+ "nigthmares", "nightmares",
+ "nipticking", "nitpicking",
+ "nitpciking", "nitpicking",
+ "nominacion", "nomination",
+ "nominatino", "nominations",
+ "nominativo", "nomination",
+ "nominatons", "nominations",
+ "nonsencial", "nonsensical",
+ "nontheless", "nonetheless",
+ "northerend", "northern",
+ "nostalgica", "nostalgia",
+ "nostalgija", "nostalgia",
+ "noteworhty", "noteworthy",
+ "nothingess", "nothingness",
+ "noticabely", "noticeably",
+ "noticabley", "noticeably",
+ "noticiably", "noticeably",
+ "notoriosly", "notoriously",
+ "novembeard", "november",
+ "nuetrality", "neutrality",
+ "nutricious", "nutritious",
+ "nutrientes", "nutrients",
+ "nutritents", "nutrients",
+ "nutritinal", "nutritional",
+ "nutritiuos", "nutritious",
+ "nutritivos", "nutritious",
+ "nutrituous", "nutritious",
+ "nutrutious", "nutritious",
+ "obatinable", "obtainable",
+ "obejctives", "objectives",
+ "obilgatory", "obligatory",
+ "objecitves", "objectives",
+ "objectivas", "objectives",
+ "objectivly", "objectively",
+ "objectivst", "objectives",
+ "objectivty", "objectivity",
+ "objektives", "objectives",
+ "obligitary", "obligatory",
+ "obligitory", "obligatory",
+ "observabil", "observable",
+ "observarse", "observers",
+ "observaton", "observation",
+ "observeras", "observers",
+ "observered", "observed",
+ "observeres", "observers",
+ "observible", "observable",
+ "obstancles", "obstacles",
+ "obstrucion", "obstruction",
+ "obstructin", "obstruction",
+ "obtainabie", "obtainable",
+ "obtaineble", "obtainable",
+ "obtainible", "obtainable",
+ "obtianable", "obtainable",
+ "ocasionaly", "occasionally",
+ "ocassional", "occasional",
+ "ocassioned", "occasioned",
+ "occaisonal", "occasional",
+ "occasionly", "occasional",
+ "occassions", "occasions",
+ "occational", "occasional",
+ "occulation", "occupation",
+ "occupaiton", "occupation",
+ "occurances", "occurrences",
+ "occurences", "occurrences",
+ "occurrance", "occurrence",
+ "octohedral", "octahedral",
+ "octohedron", "octahedron",
+ "offensivly", "offensively",
+ "offereings", "offerings",
+ "officailly", "officially",
+ "olbigatory", "obligatory",
+ "ominpotent", "omnipotent",
+ "ominscient", "omniscient",
+ "omnipetent", "omnipotent",
+ "omnipitent", "omnipotent",
+ "omnipotant", "omnipotent",
+ "omnisicent", "omniscient",
+ "omniverous", "omnivorous",
+ "omnsicient", "omniscient",
+ "on-premise", "on-premises",
+ "onmipotent", "omnipotent",
+ "onmiscient", "omniscient",
+ "operatings", "operations",
+ "operativne", "operative",
+ "operativos", "operations",
+ "oportunity", "opportunity",
+ "opponenets", "opponent",
+ "oppononent", "opponent",
+ "oppressiun", "oppressing",
+ "optimisitc", "optimistic",
+ "optimizare", "optimize",
+ "optimizate", "optimize",
+ "optimizied", "optimize",
+ "organicaly", "organically",
+ "organiclly", "organically",
+ "organisate", "organise",
+ "organische", "organise",
+ "organisera", "organizers",
+ "organisere", "organizers",
+ "organisert", "organizers",
+ "organisier", "organise",
+ "organisims", "organism",
+ "organismed", "organise",
+ "organismen", "organise",
+ "organismer", "organise",
+ "organismes", "organisms",
+ "organismus", "organisms",
+ "organisten", "organise",
+ "organiszed", "organise",
+ "organizaed", "organize",
+ "organizare", "organizer",
+ "organizate", "organize",
+ "organizors", "organizers",
+ "organizuje", "organize",
+ "organziers", "organizers",
+ "orientaion", "orientation",
+ "orientarla", "oriental",
+ "orientarlo", "oriental",
+ "origianlly", "originally",
+ "originales", "originals",
+ "originalet", "originated",
+ "originalis", "originals",
+ "originalty", "originality",
+ "orignially", "originally",
+ "origniated", "originated",
+ "origonally", "originally",
+ "origonated", "originated",
+ "ostencibly", "ostensibly",
+ "ostenisbly", "ostensibly",
+ "ostensably", "ostensibly",
+ "ostentibly", "ostensibly",
+ "ostrasiced", "ostracized",
+ "ostrasized", "ostracized",
+ "ostraziced", "ostracized",
+ "ostrazised", "ostracized",
+ "ostrecized", "ostracized",
+ "ostricized", "ostracized",
+ "ostrocized", "ostracized",
+ "oustanding", "outstanding",
+ "outcalssed", "outclassed",
+ "outlcassed", "outclassed",
+ "outnumberd", "outnumbered",
+ "outnumbred", "outnumbered",
+ "outperfoms", "outperform",
+ "outperfrom", "outperform",
+ "outpreform", "outperform",
+ "outrageuos", "outrageous",
+ "outragious", "outrageous",
+ "outragoues", "outrageous",
+ "outreagous", "outrageous",
+ "outsourcad", "outsourced",
+ "outsouring", "outsourcing",
+ "outsoursed", "outsourced",
+ "outweighes", "outweighs",
+ "overarcing", "overarching",
+ "overclockd", "overclocked",
+ "overcloked", "overclocked",
+ "overcoding", "overcoming",
+ "overheards", "overhead",
+ "overheared", "overhead",
+ "overhooked", "overlooked",
+ "overlanded", "overloaded",
+ "overlaoded", "overloaded",
+ "overlaping", "overlapping",
+ "overlauded", "overloaded",
+ "overloards", "overload",
+ "overlorded", "overloaded",
+ "overlordes", "overlords",
+ "overnurfed", "overturned",
+ "overpirced", "overpriced",
+ "overpowerd", "overpowered",
+ "overpowred", "overpowered",
+ "overprised", "overpriced",
+ "overtunned", "overturned",
+ "overtunred", "overturned",
+ "overturing", "overturn",
+ "overweigth", "overweight",
+ "overwhemed", "overwhelmed",
+ "overwieght", "overweight",
+ "overwritte", "overwrite",
+ "pahtfinder", "pathfinder",
+ "painfullly", "painfully",
+ "painkilers", "painkillers",
+ "pairlament", "parliament",
+ "pakistanti", "pakistani",
+ "paladinlst", "paladins",
+ "palcements", "placements",
+ "paleolitic", "paleolithic",
+ "palestinan", "palestinian",
+ "paltformer", "platformer",
+ "palyerbase", "playerbase",
+ "parachutte", "parachute",
+ "parademics", "paramedics",
+ "paradiggum", "paradigm",
+ "paragraghs", "paragraphs",
+ "paragrahps", "paragraphs",
+ "paragrapgh", "paragraphs",
+ "paragrpahs", "paragraphs",
+ "parahprase", "paraphrase",
+ "paralleles", "parallels",
+ "parallells", "parallels",
+ "paramadics", "paramedics",
+ "paramaters", "parameters",
+ "paramecias", "paramedics",
+ "parametics", "paramedics",
+ "parametros", "parameters",
+ "paramiters", "parameters",
+ "paramormal", "paranormal",
+ "paranoicas", "paranoia",
+ "paranomral", "paranormal",
+ "paranornal", "paranormal",
+ "parapharse", "paraphrase",
+ "paraphraze", "paraphrase",
+ "paraprhase", "paraphrase",
+ "parasitter", "parasite",
+ "parilament", "parliament",
+ "parituclar", "particular",
+ "parlaiment", "parliament",
+ "parliamant", "parliament",
+ "parliamone", "parliament",
+ "parliement", "parliament",
+ "parrallell", "parallel",
+ "parrallely", "parallelly",
+ "partiarchy", "patriarchy",
+ "participas", "participants",
+ "participat", "participants",
+ "participte", "participate",
+ "particualr", "particular",
+ "partiotism", "patriotism",
+ "passionais", "passions",
+ "passionale", "passionately",
+ "passionant", "passionate",
+ "passionite", "passionate",
+ "passivedns", "passives",
+ "passivelly", "passively",
+ "patenterad", "patented",
+ "pathfidner", "pathfinder",
+ "pathfindir", "pathfinder",
+ "pathifnder", "pathfinder",
+ "patientens", "patients",
+ "patrairchy", "patriarchy",
+ "patriachry", "patriarchy",
+ "patriarcal", "patriarchal",
+ "patriarhal", "patriarchal",
+ "patriatchy", "patriarchy",
+ "patriatism", "patriotism",
+ "patrionism", "patriotism",
+ "patriotics", "patriotism",
+ "patriotisk", "patriots",
+ "patroitism", "patriotism",
+ "patryarchy", "patriarchy",
+ "pedantisch", "pedantic",
+ "pedestiran", "pedestrian",
+ "pedestrain", "pedestrian",
+ "pedictions", "depictions",
+ "pedohpiles", "pedophiles",
+ "pedohpilia", "pedophilia",
+ "pedophilac", "pedophilia",
+ "pedophilea", "pedophilia",
+ "pedophilie", "pedophile",
+ "pedophilla", "pedophilia",
+ "pedophille", "pedophile",
+ "pedopholia", "pedophilia",
+ "penetraion", "penetration",
+ "penetratin", "penetration",
+ "penetraton", "penetration",
+ "penguinese", "penguins",
+ "penguiness", "penguins",
+ "peninsulla", "peninsula",
+ "penninsula", "peninsula",
+ "peodphiles", "pedophiles",
+ "peodphilia", "pedophilia",
+ "pepperment", "peppermint",
+ "pepperonni", "pepperoni",
+ "percantage", "percentage",
+ "percantile", "percentile",
+ "percaution", "precaution",
+ "percenatge", "percentages",
+ "percential", "percentile",
+ "percentige", "percentile",
+ "perceptoin", "perceptions",
+ "percession", "percussion",
+ "percetange", "percentages",
+ "percetnage", "percentages",
+ "percintile", "percentile",
+ "percission", "percussion",
+ "percpetion", "perceptions",
+ "percusions", "percussion",
+ "perdicting", "predicting",
+ "perdiction", "prediction",
+ "perdictive", "predictive",
+ "perenially", "perennially",
+ "perfeccion", "perfection",
+ "perfecxion", "perfection",
+ "perfektion", "perfection",
+ "perferable", "preferable",
+ "perferably", "preferably",
+ "perference", "preference",
+ "perferring", "preferring",
+ "perfexcion", "perfection",
+ "perfomance", "performance",
+ "performace", "performance",
+ "performane", "performances",
+ "performans", "performances",
+ "performens", "performers",
+ "performous", "performs",
+ "perfromers", "performers",
+ "perhiperal", "peripheral",
+ "peridinkle", "periwinkle",
+ "perihperal", "peripheral",
+ "periodisch", "periodic",
+ "periperhal", "peripheral",
+ "peripheals", "peripherals",
+ "peripheria", "peripheral",
+ "periphiral", "peripheral",
+ "periphreal", "peripheral",
+ "periphrial", "peripheral",
+ "peritinkle", "periwinkle",
+ "periwankle", "periwinkle",
+ "periwinkel", "periwinkle",
+ "periwinkie", "periwinkle",
+ "periwinlke", "periwinkle",
+ "permanenty", "permanently",
+ "permanetly", "permanently",
+ "permisions", "permission",
+ "permisison", "permissions",
+ "permissble", "permissible",
+ "permissibe", "permissible",
+ "permissons", "permissions",
+ "perogative", "prerogative",
+ "perordered", "preordered",
+ "perpatuate", "perpetuate",
+ "perpetualy", "perpetually",
+ "perpetuare", "perpetuate",
+ "persausion", "persuasion",
+ "persausive", "persuasive",
+ "persective", "respective",
+ "persectued", "persecuted",
+ "persecutie", "persecuted",
+ "persecutin", "persecution",
+ "perserving", "preserving",
+ "persicuted", "persecuted",
+ "persistant", "persistent",
+ "persistens", "persists",
+ "persoanlly", "personally",
+ "persocuted", "persecuted",
+ "personalie", "personalized",
+ "personalis", "personas",
+ "personarse", "personas",
+ "personatus", "personas",
+ "personnell", "personnel",
+ "perspecive", "perspective",
+ "perspectie", "perspectives",
+ "persuasian", "persuasion",
+ "persuasing", "persuasion",
+ "persuasivo", "persuasion",
+ "persuation", "persuasion",
+ "persucuted", "persecuted",
+ "persumably", "presumably",
+ "persussion", "persuasion",
+ "persvasive", "persuasive",
+ "perswasion", "persuasion",
+ "pertinante", "pertinent",
+ "pervailing", "prevailing",
+ "pervalence", "prevalence",
+ "pervention", "prevention",
+ "perversley", "perverse",
+ "pesitcides", "pesticides",
+ "pessimistc", "pessimistic",
+ "pessimitic", "pessimistic",
+ "pestacides", "pesticides",
+ "pestecides", "pesticides",
+ "pesticedes", "pesticides",
+ "pesticidas", "pesticides",
+ "pestisides", "pesticides",
+ "pestizides", "pesticides",
+ "pharamcist", "pharmacist",
+ "pharmacias", "pharmacist",
+ "pharmacyst", "pharmacist",
+ "pharmasist", "pharmacist",
+ "pharmicist", "pharmacist",
+ "phemonenon", "phenomenon",
+ "phenemenon", "phenomenon",
+ "phenemonal", "phenomenal",
+ "phenomanal", "phenomenal",
+ "phenomanon", "phenomenon",
+ "phenomemon", "phenomenon",
+ "phenomenen", "phenomenon",
+ "phenomenol", "phenomenal",
+ "phenomenom", "phenomenon",
+ "phenominon", "phenomenon",
+ "phenomonal", "phenomenal",
+ "phenomonen", "phenomenon",
+ "phenomonon", "phenomenon",
+ "phenonemal", "phenomenal",
+ "phenonemon", "phenomenon",
+ "phenonmena", "phenomena",
+ "philipines", "philippines",
+ "philippins", "philippines",
+ "philisophy", "philosophy",
+ "phillipine", "philippine",
+ "phillipses", "phillies",
+ "philosiphy", "philosophy",
+ "philosohpy", "philosophy",
+ "philosoper", "philosopher",
+ "philospher", "philosopher",
+ "philospohy", "philosophy",
+ "photogragh", "photograph",
+ "photograhs", "photographs",
+ "photograhy", "photography",
+ "photograps", "photographs",
+ "photograpy", "photography",
+ "photogrpah", "photographs",
+ "photoshopd", "photoshopped",
+ "photoshope", "photoshopped",
+ "phramacist", "pharmacist",
+ "phsyically", "physically",
+ "phsyicians", "physicians",
+ "phsyicists", "physicists",
+ "phsyiology", "physiology",
+ "phycisians", "physicians",
+ "phycisists", "physicists",
+ "phyiscally", "physically",
+ "phyisology", "physiology",
+ "physcially", "physically",
+ "physcology", "psychology",
+ "physcopath", "psychopath",
+ "physicials", "physicians",
+ "physiciens", "physicians",
+ "physioligy", "physiology",
+ "picthforks", "pitchforks",
+ "pinoneered", "pioneered",
+ "pitchferks", "pitchforks",
+ "pitchfolks", "pitchforks",
+ "pitchfords", "pitchforks",
+ "pitchworks", "pitchforks",
+ "pitckforks", "pitchforks",
+ "pittaburgh", "pittsburgh",
+ "pittsbrugh", "pittsburgh",
+ "placehoder", "placeholder",
+ "placeholdr", "placeholder",
+ "placeholer", "placeholder",
+ "placemenet", "placements",
+ "plagairism", "plagiarism",
+ "plagarisim", "plagiarism",
+ "plagiariam", "plagiarism",
+ "plagiarios", "plagiarism",
+ "plagiarius", "plagiarism",
+ "plagiarizm", "plagiarism",
+ "plagierism", "plagiarism",
+ "plaguarism", "plagiarism",
+ "plaigarism", "plagiarism",
+ "plasticosa", "plastics",
+ "platfarmer", "platformer",
+ "platformar", "platformer",
+ "platformie", "platformer",
+ "platfotmer", "platformer",
+ "platfromer", "platformer",
+ "platofrmer", "platformer",
+ "playaround", "playground",
+ "playersare", "playerbase",
+ "playgorund", "playground",
+ "playthrogh", "playthrough",
+ "playthrouh", "playthrough",
+ "playwrites", "playwrights",
+ "plethorian", "plethora",
+ "policitian", "politician",
+ "polinators", "pollinators",
+ "polishuset", "polishes",
+ "politessen", "politeness",
+ "politicain", "politician",
+ "politicaly", "politically",
+ "politicien", "politician",
+ "politicing", "politician",
+ "politicion", "politician",
+ "politickin", "politician",
+ "politiikan", "politician",
+ "politiness", "politeness",
+ "polititian", "politician",
+ "popualtion", "populations",
+ "populairty", "popularity",
+ "populaiton", "populations",
+ "popularaty", "popularity",
+ "popularest", "populate",
+ "popularily", "popularity",
+ "populaties", "populate",
+ "populatiry", "popularity",
+ "populative", "populate",
+ "populatoin", "populations",
+ "popultaion", "populations",
+ "pormetheus", "prometheus",
+ "pornograhy", "pornography",
+ "pornograpy", "pornography",
+ "pornogrphy", "pornography",
+ "porportion", "proportion",
+ "portabilty", "portability",
+ "portarying", "portraying",
+ "portoguese", "portuguese",
+ "portraiing", "portraying",
+ "portrating", "portraying",
+ "portrayels", "portrays",
+ "portugeuse", "portuguese",
+ "portuguise", "portuguese",
+ "posessions", "possessions",
+ "posicional", "positional",
+ "positevely", "positively",
+ "positioing", "positioning",
+ "positionly", "positional",
+ "positionne", "positioned",
+ "positivley", "positively",
+ "possesives", "possessive",
+ "possessers", "possesses",
+ "possessess", "possesses",
+ "possibiliy", "possibility",
+ "possibilty", "possibility",
+ "possissive", "possessive",
+ "posthomous", "posthumous",
+ "potentialy", "potentially",
+ "poulations", "populations",
+ "powerhorse", "powerhouse",
+ "powerhosue", "powerhouse",
+ "powerhours", "powerhouse",
+ "powerhsell", "powershell",
+ "powerprint", "powerpoint",
+ "powersehll", "powershell",
+ "ppublisher", "publisher",
+ "practially", "practically",
+ "practicaly", "practically",
+ "practicess", "practise",
+ "practiclly", "practically",
+ "practioner", "practitioner",
+ "precaucion", "precaution",
+ "precausion", "precaution",
+ "precautios", "precautions",
+ "precedance", "precedence",
+ "precedense", "precedence",
+ "preceeding", "preceding",
+ "precendece", "precedence",
+ "precentage", "percentage",
+ "precentile", "percentile",
+ "preciselly", "precisely",
+ "precuation", "precautions",
+ "precussion", "percussion",
+ "predecated", "predicated",
+ "predecence", "precedence",
+ "predecesor", "predecessor",
+ "predection", "prediction",
+ "predective", "predictive",
+ "prediccion", "prediction",
+ "prediceted", "predicated",
+ "predicited", "predicated",
+ "predicitng", "predicting",
+ "prediciton", "prediction",
+ "predicitve", "predictive",
+ "predickted", "predicated",
+ "predictave", "predictive",
+ "predictivo", "prediction",
+ "predictons", "predictions",
+ "predjuiced", "prejudiced",
+ "predjuices", "prejudices",
+ "preduction", "prediction",
+ "preductive", "predictive",
+ "predujiced", "prejudiced",
+ "predujices", "prejudices",
+ "prefarable", "preferable",
+ "prefarably", "preferably",
+ "prefection", "perfection",
+ "preferance", "preference",
+ "prefereble", "preferable",
+ "preferente", "preference",
+ "preferenze", "preference",
+ "preferible", "preferable",
+ "preferibly", "preferably",
+ "prefernece", "preferences",
+ "preformers", "performers",
+ "pregancies", "pregnancies",
+ "pregnanies", "pregnancies",
+ "preipheral", "peripheral",
+ "preisdents", "presidents",
+ "preisthood", "priesthood",
+ "prejeduced", "prejudiced",
+ "prejeduces", "prejudices",
+ "prejiduced", "prejudiced",
+ "prejiduces", "prejudices",
+ "prejucided", "prejudiced",
+ "prejucides", "prejudices",
+ "prejuduced", "prejudiced",
+ "prejuduces", "prejudices",
+ "prelimiary", "preliminary",
+ "prematurly", "prematurely",
+ "preminence", "preeminence",
+ "premission", "permission",
+ "preorderes", "preorders",
+ "prepartion", "preparation",
+ "prepetuate", "perpetuate",
+ "preposters", "preposterous",
+ "prescients", "presidents",
+ "prescirbed", "prescribed",
+ "prescriped", "prescribed",
+ "presearing", "preserving",
+ "presecuted", "persecuted",
+ "presedency", "presidency",
+ "presedents", "presidents",
+ "presenning", "presenting",
+ "presentase", "presents",
+ "presentato", "presentation",
+ "presention", "presenting",
+ "presentors", "presents",
+ "preservare", "preserve",
+ "preservato", "preservation",
+ "preserverd", "preserved",
+ "presidancy", "presidency",
+ "presidante", "presidents",
+ "presidenta", "presidential",
+ "presidenty", "presidency",
+ "presidunce", "presidency",
+ "presistent", "persistent",
+ "presonally", "personally",
+ "presonhood", "personhood",
+ "pressuming", "pressuring",
+ "prestigios", "prestigious",
+ "prestigous", "prestigious",
+ "presuambly", "presumably",
+ "presuasion", "persuasion",
+ "presuasive", "persuasive",
+ "presumebly", "presumably",
+ "presumendo", "presumed",
+ "presumibly", "presumably",
+ "presumpton", "presumption",
+ "pretaining", "pertaining",
+ "pretection", "protection",
+ "pretendias", "pretends",
+ "pretensive", "pretense",
+ "pretentios", "pretentious",
+ "pretentous", "pretentious",
+ "prevalecen", "prevalence",
+ "prevalente", "prevalence",
+ "prevencion", "prevention",
+ "preventivo", "prevention",
+ "preventors", "prevents",
+ "previaling", "prevailing",
+ "previosuly", "previously",
+ "previoulsy", "previously",
+ "prevolence", "prevalence",
+ "pricinpals", "principals",
+ "primarilly", "primarily",
+ "primatives", "primitives",
+ "princepals", "principals",
+ "princesess", "princesses",
+ "princibles", "principles",
+ "principaly", "principality",
+ "principels", "principals",
+ "principial", "principal",
+ "principias", "principals",
+ "principlas", "principals",
+ "prinicipal", "principal",
+ "prinicpals", "principals",
+ "prinicples", "principles",
+ "printerest", "printers",
+ "prioratize", "prioritize",
+ "prioretize", "prioritize",
+ "prioritice", "prioritize",
+ "prioritied", "prioritize",
+ "prioroties", "priorities",
+ "priorotize", "prioritize",
+ "priotities", "priorities",
+ "priotitize", "prioritize",
+ "privaleged", "privileged",
+ "privaleges", "privileges",
+ "privaticed", "privatized",
+ "privelaged", "privileged",
+ "privelages", "privileges",
+ "priveldges", "privileges",
+ "priveleged", "privileged",
+ "priveleges", "privileges",
+ "privelidge", "privileged",
+ "priveliged", "privileged",
+ "priveliges", "privileges",
+ "privetized", "privatized",
+ "privilaged", "privileged",
+ "privilages", "privileges",
+ "priviledge", "privilege",
+ "privilegde", "privileges",
+ "privilegie", "privilege",
+ "priviliged", "privileged",
+ "priviliges", "privileges",
+ "privitazed", "privatized",
+ "privitized", "privatized",
+ "probabiliy", "probability",
+ "probabilty", "probability",
+ "probablies", "probable",
+ "probablybe", "probable",
+ "problemita", "problematic",
+ "procalimed", "proclaimed",
+ "procceding", "proceeding",
+ "procedding", "proceeding",
+ "procederal", "procedural",
+ "procedings", "proceedings",
+ "procedrual", "procedural",
+ "proceededs", "proceeds",
+ "proceedure", "procedure",
+ "proceesing", "proceeding",
+ "processsor", "processors",
+ "proclamied", "proclaimed",
+ "proclaming", "proclaiming",
+ "procliamed", "proclaimed",
+ "procreatin", "procreation",
+ "procudures", "procedures",
+ "prodcution", "production",
+ "prodecural", "procedural",
+ "prodecures", "procedures",
+ "produccion", "production",
+ "produceras", "produces",
+ "produceres", "produces",
+ "producirse", "producers",
+ "produciton", "production",
+ "producting", "production",
+ "productino", "productions",
+ "productivo", "production",
+ "productivy", "productivity",
+ "productoin", "productions",
+ "produktion", "production",
+ "produktive", "productive",
+ "produtcion", "productions",
+ "profesions", "profession",
+ "professers", "professors",
+ "professorn", "profession",
+ "professsor", "professors",
+ "proffesion", "profession",
+ "proficeint", "proficient",
+ "proficiant", "proficient",
+ "proficieny", "proficiency",
+ "proficincy", "proficiency",
+ "profitabel", "profitable",
+ "profitabil", "profitable",
+ "profitible", "profitable",
+ "proftiable", "profitable",
+ "programmar", "programmer",
+ "programmme", "programme",
+ "progresing", "progressing",
+ "progresion", "progression",
+ "progresive", "progressive",
+ "progressie", "progressives",
+ "progressin", "progression",
+ "progresson", "progression",
+ "progressos", "progresses",
+ "progressus", "progresses",
+ "prohibirte", "prohibit",
+ "prohibites", "prohibits",
+ "prohibitng", "prohibiting",
+ "prohibiton", "prohibition",
+ "prohibitus", "prohibits",
+ "prohibitve", "prohibited",
+ "prohobited", "prohibited",
+ "prohpecies", "prophecies",
+ "projecitle", "projectiles",
+ "projectiel", "projectiles",
+ "projecties", "projectiles",
+ "projectils", "projectiles",
+ "projectles", "projectiles",
+ "projectlie", "projectiles",
+ "projectyle", "projectile",
+ "projektile", "projectile",
+ "projektion", "projection",
+ "prometheas", "prometheus",
+ "promethese", "prometheus",
+ "promethius", "prometheus",
+ "promethous", "prometheus",
+ "promethues", "prometheus",
+ "prominance", "prominence",
+ "prominenty", "prominently",
+ "prominetly", "prominently",
+ "promiscous", "promiscuous",
+ "promiscuos", "promiscuous",
+ "promoteurs", "promotes",
+ "promotheus", "prometheus",
+ "promotinal", "promotional",
+ "pronoucned", "pronounced",
+ "pronouning", "pronouncing",
+ "propechies", "prophecies",
+ "propencity", "propensity",
+ "propenents", "proponents",
+ "properites", "properties",
+ "propersity", "propensity",
+ "propertion", "proportion",
+ "propertius", "properties",
+ "prophacies", "prophecies",
+ "prophocies", "prophecies",
+ "propietary", "proprietary",
+ "proplusion", "propulsion",
+ "propoganda", "propaganda",
+ "propogates", "propagates",
+ "propolsion", "propulsion",
+ "proponants", "proponents",
+ "proponenet", "proponent",
+ "proporcion", "proportion",
+ "proporties", "properties",
+ "proporting", "proportion",
+ "propositon", "proposition",
+ "propotions", "proportions",
+ "proprietry", "proprietary",
+ "proprotion", "proportion",
+ "propserity", "prosperity",
+ "propserous", "prosperous",
+ "propulaios", "propulsion",
+ "propulsing", "propulsion",
+ "propultion", "propulsion",
+ "propuslion", "propulsion",
+ "prosectued", "prosecuted",
+ "prosectuor", "prosecutor",
+ "prosecuter", "prosecutor",
+ "prosecutie", "prosecuted",
+ "prosicuted", "prosecuted",
+ "prosicutor", "prosecutor",
+ "prosocuted", "prosecuted",
+ "prosparity", "prosperity",
+ "prospectos", "prospects",
+ "prosperety", "prosperity",
+ "prospertiy", "prosperity",
+ "prosphetic", "prosthetic",
+ "prosporous", "prosperous",
+ "prostehtic", "prosthetic",
+ "prosterity", "prosperity",
+ "prostethic", "prosthetic",
+ "prostitite", "prostitute",
+ "prostitude", "prostitute",
+ "prostituee", "prostitute",
+ "prostituer", "prostitute",
+ "prostitues", "prostitutes",
+ "prostiture", "prostitute",
+ "prostituto", "prostitution",
+ "prostituye", "prostitute",
+ "protaginst", "protagonist",
+ "protastant", "protestant",
+ "proteccion", "protection",
+ "proteciton", "protections",
+ "protectice", "protective",
+ "protectiei", "protective",
+ "protectoin", "protections",
+ "protectons", "protectors",
+ "protectron", "protection",
+ "protestans", "protests",
+ "protestare", "protesters",
+ "protestato", "protestant",
+ "protestent", "protestant",
+ "protestina", "protestant",
+ "prothsetic", "prosthetic",
+ "protistant", "protestant",
+ "protocoles", "protocols",
+ "protocolls", "protocols",
+ "protocolos", "protocols",
+ "protohypes", "prototypes",
+ "protostant", "protestant",
+ "prototipes", "prototypes",
+ "prototpyes", "prototypes",
+ "protraying", "portraying",
+ "protuguese", "portuguese",
+ "provencial", "provincial",
+ "proveribal", "proverbial",
+ "provervial", "proverbial",
+ "providance", "providence",
+ "providince", "providence",
+ "provinciae", "province",
+ "provincies", "province",
+ "provincija", "provincial",
+ "provinence", "providence",
+ "provinical", "provincial",
+ "provintial", "provincial",
+ "provinvial", "provincial",
+ "provisiosn", "provision",
+ "provisonal", "provisional",
+ "provocatie", "provocative",
+ "pscyhology", "psychology",
+ "pscyhopath", "psychopath",
+ "pshycology", "psychology",
+ "pshycopath", "psychopath",
+ "psychedlic", "psychedelic",
+ "psychiatic", "psychiatric",
+ "psycholoog", "psychology",
+ "psychopaat", "psychopath",
+ "psychopats", "psychopaths",
+ "ptichforks", "pitchforks",
+ "publicitan", "publication",
+ "publisheed", "published",
+ "publisherr", "publisher",
+ "publishher", "publisher",
+ "publissher", "publisher",
+ "publlisher", "publisher",
+ "punihsment", "punishments",
+ "punishemnt", "punishments",
+ "punishible", "punishable",
+ "punishmnet", "punishments",
+ "punissable", "punishable",
+ "punsihable", "punishable",
+ "purchacing", "purchasing",
+ "purpolsion", "propulsion",
+ "purposedly", "purposely",
+ "purposelly", "purposely",
+ "purpotedly", "purportedly",
+ "pususading", "persuading",
+ "pyschology", "psychology",
+ "pyschopath", "psychopath",
+ "qaulifiers", "qualifiers",
+ "quailfiers", "qualifiers",
+ "qualfiiers", "qualifiers",
+ "qualifieds", "qualifies",
+ "qualifiies", "qualifiers",
+ "qualifiing", "qualifying",
+ "qualifires", "qualifiers",
+ "qualifyers", "qualifiers",
+ "qualitying", "qualifying",
+ "quanitites", "quantities",
+ "quantaties", "quantities",
+ "quantitize", "quantities",
+ "quarantena", "quarantine",
+ "quarantene", "quarantine",
+ "quarantied", "quarantine",
+ "quarintine", "quarantine",
+ "quaruntine", "quarantine",
+ "quesitoned", "questioned",
+ "questional", "questionable",
+ "questionne", "questioned",
+ "rabinnical", "rabbinical",
+ "radiactive", "radioactive",
+ "radioacive", "radioactive",
+ "rainbowers", "rainbows",
+ "randmoness", "randomness",
+ "randomzied", "randomized",
+ "randonmess", "randomness",
+ "randumness", "randomness",
+ "raspberrry", "raspberry",
+ "rationalle", "rationale",
+ "readmition", "readmission",
+ "realitvely", "relatively",
+ "realtively", "relatively",
+ "realtivity", "relativity",
+ "reaserched", "researched",
+ "reasercher", "researcher",
+ "rebiulding", "rebuilding",
+ "reboudning", "rebounding",
+ "rebouncing", "rebounding",
+ "rebuidling", "rebuilding",
+ "rebuliding", "rebuilding",
+ "rebuplican", "republican",
+ "reccommend", "recommend",
+ "recepients", "recipients",
+ "receptoras", "receptors",
+ "receptores", "receptors",
+ "recgonised", "recognised",
+ "recgonized", "recognized",
+ "recgonizes", "recognizes",
+ "reciepents", "recipients",
+ "recipeints", "recipients",
+ "recipiants", "recipients",
+ "recocnised", "recognised",
+ "recoginsed", "recognised",
+ "recoginzed", "recognized",
+ "recognices", "recognizes",
+ "recogniton", "recognition",
+ "recognzied", "recognised",
+ "recomended", "recommended",
+ "recommande", "recommend",
+ "recommands", "recommends",
+ "recommeded", "recommended",
+ "recommened", "recommend",
+ "recommennd", "recommends",
+ "recomments", "recommends",
+ "recompence", "recompense",
+ "reconcider", "reconsider",
+ "reconcille", "reconcile",
+ "recongised", "recognised",
+ "recongized", "recognized",
+ "recongizes", "recognizes",
+ "reconisder", "reconsider",
+ "reconsiled", "reconsider",
+ "recordarle", "recorder",
+ "recordarme", "recorder",
+ "recordarse", "recorder",
+ "recordarte", "recorder",
+ "recreacion", "recreation",
+ "recreatief", "recreate",
+ "recreativo", "recreation",
+ "recrutiers", "recruiters",
+ "rectanglar", "rectangular",
+ "rectangual", "rectangular",
+ "rectanguar", "rectangular",
+ "recuriters", "recruiters",
+ "recurrance", "recurrence",
+ "recursivly", "recursively",
+ "redefinied", "redefine",
+ "redefinine", "redefine",
+ "redemtpion", "redemption",
+ "redepmtion", "redemption",
+ "redesiging", "redesign",
+ "rediculous", "ridiculous",
+ "redmeption", "redemption",
+ "redneckers", "rednecks",
+ "redneckese", "rednecks",
+ "redneckest", "rednecks",
+ "reduncancy", "redundancy",
+ "redundency", "redundancy",
+ "redundnacy", "redundancy",
+ "redunduncy", "redundancy",
+ "reenforced", "reinforced",
+ "reevaulate", "reevaluate",
+ "refedendum", "referendum",
+ "refelcting", "reflecting",
+ "refelction", "reflection",
+ "refelctive", "reflective",
+ "referances", "references",
+ "referandum", "referendum",
+ "referemces", "references",
+ "referemdum", "referendum",
+ "referendim", "referendum",
+ "referendom", "referendum",
+ "referenece", "reference",
+ "referening", "referencing",
+ "referenses", "referees",
+ "referentes", "references",
+ "referneces", "references",
+ "referrence", "reference",
+ "referundum", "referendum",
+ "refference", "reference",
+ "refleciton", "reflections",
+ "reflecters", "reflects",
+ "reflektion", "reflection",
+ "reflextion", "reflection",
+ "reformerad", "reformed",
+ "refrigerar", "refrigerator",
+ "refurbised", "refurbished",
+ "regenarate", "regenerate",
+ "registeres", "registers",
+ "registrato", "registration",
+ "regresives", "regressive",
+ "regressivo", "regression",
+ "regualting", "regulating",
+ "regualtion", "regulations",
+ "regualtors", "regulators",
+ "regulacion", "regulation",
+ "regulament", "regulate",
+ "regulaotrs", "regulators",
+ "regularily", "regularly",
+ "regularing", "regulating",
+ "regularlas", "regulars",
+ "regularlos", "regulars",
+ "regulaters", "regulators",
+ "regulatios", "regulators",
+ "regulatons", "regulations",
+ "rehtorical", "rhetorical",
+ "reinstaled", "reinstalled",
+ "reitrement", "retirement",
+ "relagation", "relaxation",
+ "relatation", "relaxation",
+ "relativety", "relativity",
+ "relativily", "relativity",
+ "relativley", "relatively",
+ "relavation", "relaxation",
+ "relaxating", "relaxation",
+ "relazation", "relaxation",
+ "releagtion", "relegation",
+ "relegetion", "relegation",
+ "relentness", "relentless",
+ "reletnless", "relentless",
+ "relevation", "revelation",
+ "relexation", "relegation",
+ "relfecting", "reflecting",
+ "relfection", "reflection",
+ "relfective", "reflective",
+ "reliabilty", "reliability",
+ "reliablely", "reliably",
+ "religiones", "religions",
+ "religiosly", "religiously",
+ "religiousy", "religiously",
+ "religously", "religiously",
+ "relitavely", "relatively",
+ "reluctanct", "reluctant",
+ "reluctanly", "reluctantly",
+ "reluctanty", "reluctantly",
+ "remarcably", "remarkably",
+ "remarkibly", "remarkably",
+ "rememberes", "remembers",
+ "remenicent", "reminiscent",
+ "reminisent", "reminiscent",
+ "reminscent", "reminiscent",
+ "remmebered", "remembered",
+ "renaissace", "renaissance",
+ "renderered", "rendered",
+ "renegerate", "regenerate",
+ "renewabels", "renewables",
+ "renewebles", "renewables",
+ "rennovated", "renovated",
+ "renweables", "renewables",
+ "repatition", "repetition",
+ "repblicans", "republicans",
+ "repbulican", "republican",
+ "repeadedly", "repeatedly",
+ "repeadetly", "repeatedly",
+ "repearable", "repeatable",
+ "repearedly", "repealed",
+ "repeatadly", "repeatedly",
+ "repeatedlt", "repealed",
+ "repeatetly", "repeatedly",
+ "repeatible", "repeatable",
+ "repeatidly", "repeatedly",
+ "repectable", "repeatable",
+ "repentable", "repeatable",
+ "repentence", "repentance",
+ "repersents", "represents",
+ "repetation", "repetition",
+ "repeteadly", "repeatedly",
+ "repetetion", "repetition",
+ "repeticion", "repetition",
+ "repetitivo", "repetition",
+ "replacated", "replicated",
+ "replaceble", "replaceable",
+ "replacemet", "replacements",
+ "replacemnt", "replacement",
+ "replacemtn", "replacements",
+ "replecated", "replicated",
+ "repoistory", "repository",
+ "reponsible", "responsible",
+ "reportadly", "reportedly",
+ "reporteros", "reporters",
+ "reportidly", "reportedly",
+ "repositary", "repository",
+ "reposotory", "repository",
+ "repostiory", "repository",
+ "representn", "representing",
+ "repressent", "represents",
+ "repressivo", "repression",
+ "repsectful", "respectful",
+ "repsecting", "respecting",
+ "repsective", "respective",
+ "repsonding", "responding",
+ "repsonsive", "responsive",
+ "reptuation", "reputation",
+ "repubicans", "republicans",
+ "republcian", "republican",
+ "republians", "republicans",
+ "republicon", "republican",
+ "repuglican", "republican",
+ "repulicans", "republicans",
+ "reputacion", "reputation",
+ "requirment", "requirement",
+ "requrement", "requirement",
+ "resemblace", "resemble",
+ "reserached", "researched",
+ "reseracher", "researchers",
+ "reserverad", "reserved",
+ "reservered", "reserved",
+ "residental", "residential",
+ "resistable", "resistible",
+ "resistanes", "resistances",
+ "resistanse", "resistances",
+ "resistence", "resistance",
+ "resistendo", "resisted",
+ "resistered", "resisted",
+ "resistnace", "resistances",
+ "resitsance", "resistances",
+ "resoltuion", "resolutions",
+ "resolucion", "resolution",
+ "resolutino", "resolutions",
+ "resolutoin", "resolutions",
+ "resolutons", "resolutions",
+ "resolvemos", "resolves",
+ "resolvendo", "resolved",
+ "resolveres", "resolves",
+ "resolverse", "resolves",
+ "resolviste", "resolves",
+ "resonabelt", "resonate",
+ "resoultion", "resolution",
+ "respecitve", "respective",
+ "respectifs", "respects",
+ "respection", "respecting",
+ "respectons", "respects",
+ "respectuos", "respects",
+ "respektive", "respective",
+ "respiratoy", "respiratory",
+ "responcive", "responsive",
+ "responisve", "responsive",
+ "responsibe", "responsive",
+ "responsiby", "responsibly",
+ "responsile", "responsive",
+ "responsing", "responding",
+ "ressembled", "resembled",
+ "restarants", "restaurants",
+ "restaraunt", "restaurant",
+ "restaruant", "restaurant",
+ "restatting", "restarting",
+ "restaurent", "restaurant",
+ "restauring", "restarting",
+ "resteraunt", "restaurant",
+ "restircted", "restricted",
+ "restorting", "restarting",
+ "restrainig", "restraining",
+ "restrcited", "restricted",
+ "restrcting", "restarting",
+ "restricing", "restricting",
+ "restricion", "restriction",
+ "restricive", "restrictive",
+ "restrictes", "restricts",
+ "restrictie", "restrictive",
+ "restricton", "restriction",
+ "restructed", "restricted",
+ "restuarant", "restaurant",
+ "resturants", "restaurants",
+ "resturaunt", "restaurant",
+ "retaliaton", "retaliation",
+ "rethorical", "rhetorical",
+ "retierment", "retirement",
+ "retribuito", "retribution",
+ "retrosepct", "retrospect",
+ "retrospekt", "retrospect",
+ "revaluated", "reevaluated",
+ "revealtion", "revelations",
+ "revelaiton", "revelations",
+ "revelatons", "revelations",
+ "revelution", "revelation",
+ "reversable", "reversible",
+ "reversably", "reversal",
+ "reviewtrue", "reviewer",
+ "revisiones", "revisions",
+ "revisionis", "revisions",
+ "revoltuion", "revolution",
+ "revoluiton", "revolutions",
+ "revolutoin", "revolutions",
+ "revoultion", "revolution",
+ "rewarching", "rewatching",
+ "rewatchibg", "rewatching",
+ "rewatchign", "rewatching",
+ "rewatchimg", "rewatching",
+ "rhapsodomy", "rhapsody",
+ "rhetorisch", "rhetoric",
+ "ridicilous", "ridiculous",
+ "ridicoulus", "ridiculous",
+ "ridiculise", "ridicule",
+ "ridiculize", "ridicule",
+ "ridiculled", "ridicule",
+ "ridiculose", "ridicule",
+ "ridiculued", "ridicule",
+ "rienforced", "reinforced",
+ "rigthfully", "rightfully",
+ "roleplaing", "roleplaying",
+ "romanmania", "romanian",
+ "roundaboot", "roundabout",
+ "rucuperate", "recuperate",
+ "rudimentry", "rudimentary",
+ "sacarmento", "sacramento",
+ "sacntioned", "sanctioned",
+ "sacraficed", "sacrificed",
+ "sacrafices", "sacrifices",
+ "sacramenno", "sacramento",
+ "sacreficed", "sacrificed",
+ "sacrefices", "sacrifices",
+ "sacremento", "sacramento",
+ "sacrifaced", "sacrificed",
+ "sacrifaces", "sacrifices",
+ "sacrifical", "sacrificial",
+ "sacrificas", "sacrifices",
+ "sacrificie", "sacrificed",
+ "sacrificng", "sacrificing",
+ "sacrifises", "sacrifices",
+ "sacrifized", "sacrificed",
+ "sacrifizes", "sacrifices",
+ "sacromento", "sacramento",
+ "sadistisch", "sadistic",
+ "sanctionne", "sanctioned",
+ "sandiwches", "sandwiches",
+ "sandviches", "sandwiches",
+ "sandwishes", "sandwiches",
+ "sanitazion", "sanitation",
+ "santiation", "sanitation",
+ "sastifying", "satisfying",
+ "satellitte", "satellites",
+ "satifsying", "satisfying",
+ "satrically", "satirically",
+ "satsifying", "satisfying",
+ "sattelites", "satellites",
+ "saturacion", "saturation",
+ "scandalosa", "scandals",
+ "scandalose", "scandals",
+ "scandalosi", "scandals",
+ "scandaloso", "scandals",
+ "scandaniva", "scandinavia",
+ "scandinava", "scandinavian",
+ "scandinvia", "scandinavia",
+ "scaramento", "sacramento",
+ "scarificed", "sacrificed",
+ "scarifices", "sacrifices",
+ "scarmbling", "scrambling",
+ "scartching", "scratching",
+ "sceintific", "scientific",
+ "sceintists", "scientists",
+ "scenarioes", "scenarios",
+ "scenarions", "scenarios",
+ "scenarious", "scenarios",
+ "scheudling", "scheduling",
+ "scholarhip", "scholarship",
+ "scholarley", "scholarly",
+ "sciencists", "scientists",
+ "scientests", "scientists",
+ "scirptures", "scriptures",
+ "scooterers", "scooters",
+ "scorebaord", "scoreboard",
+ "scoreborad", "scoreboard",
+ "scorebored", "scoreboard",
+ "scorpiomon", "scorpion",
+ "scracthing", "scratching",
+ "scramblies", "scramble",
+ "screenshat", "screenshot",
+ "screenshit", "screenshot",
+ "scriptores", "scriptures",
+ "scripturae", "scriptures",
+ "scriputres", "scriptures",
+ "scritpures", "scriptures",
+ "scrutinity", "scrutiny",
+ "seahawkers", "seahawks",
+ "sebastiaan", "sebastian",
+ "segegrated", "segregated",
+ "segragated", "segregated",
+ "segregaded", "segregated",
+ "segregatie", "segregated",
+ "segretated", "segregated",
+ "segrigated", "segregated",
+ "selectiose", "selections",
+ "selectivly", "selectively",
+ "selectivos", "selections",
+ "selfishess", "selfishness",
+ "senitments", "sentiments",
+ "sensitiviy", "sensitivity",
+ "sensitivty", "sensitivity",
+ "sentaments", "sentiments",
+ "sentancing", "sentencing",
+ "sentements", "sentiments",
+ "sentencian", "sentencing",
+ "sentensing", "sentencing",
+ "sentimenal", "sentimental",
+ "sentimetal", "sentimental",
+ "sentincing", "sentencing",
+ "sentinents", "sentiments",
+ "separacion", "separation",
+ "separaters", "separates",
+ "separatley", "separately",
+ "separatron", "separation",
+ "separetely", "separately",
+ "seperately", "separately",
+ "seperating", "separating",
+ "seperation", "separation",
+ "seperatism", "separatism",
+ "seperatist", "separatist",
+ "seperatley", "seperate",
+ "sepulchure", "sepulchre",
+ "serenitary", "serenity",
+ "serviceble", "serviceable",
+ "settelment", "settlement",
+ "settlemens", "settlements",
+ "settlemets", "settlements",
+ "settlemnts", "settlements",
+ "seuxalized", "sexualized",
+ "seventeeen", "seventeen",
+ "sexaulized", "sexualized",
+ "sexualixed", "sexualized",
+ "sexuallity", "sexually",
+ "sexualzied", "sexualized",
+ "sexulaized", "sexualized",
+ "shakespare", "shakespeare",
+ "shakespeer", "shakespeare",
+ "shakespere", "shakespeare",
+ "shamelesly", "shamelessly",
+ "shamelessy", "shamelessly",
+ "shaprening", "sharpening",
+ "shareholds", "shareholders",
+ "sharkening", "sharpening",
+ "sharpining", "sharpening",
+ "shartening", "sharpening",
+ "shatnering", "shattering",
+ "shattening", "shattering",
+ "shepharded", "shepherd",
+ "shilouette", "silhouette",
+ "shitlasses", "shitless",
+ "shortenend", "shortened",
+ "shortining", "shortening",
+ "sidelinien", "sideline",
+ "sidelinjen", "sideline",
+ "sidelinked", "sideline",
+ "sigantures", "signatures",
+ "sightstine", "sightstone",
+ "signficant", "significant",
+ "signifiant", "significant",
+ "significat", "significant",
+ "signitures", "signatures",
+ "sigthstone", "sightstone",
+ "sihlouette", "silhouette",
+ "silohuette", "silhouette",
+ "silouhette", "silhouette",
+ "similairty", "similarity",
+ "similarily", "similarly",
+ "similarlly", "similarly",
+ "similiarly", "similarly",
+ "similiarty", "similarity",
+ "simliarity", "similarity",
+ "simluation", "simulation",
+ "simplictic", "simplistic",
+ "simplifing", "simplifying",
+ "simplifyed", "simplified",
+ "simplifyng", "simplifying",
+ "simplisitc", "simplistic",
+ "simplisity", "simplicity",
+ "simplistes", "simplest",
+ "simplivity", "simplicity",
+ "simplyfied", "simplified",
+ "simualtion", "simulation",
+ "simulacion", "simulation",
+ "simulaiton", "simulations",
+ "simulaties", "simulate",
+ "simulative", "simulate",
+ "simulatons", "simulations",
+ "simulatore", "simulate",
+ "sincereley", "sincerely",
+ "sincerelly", "sincerely",
+ "singatures", "signatures",
+ "singulaire", "singular",
+ "singulariy", "singularity",
+ "singularty", "singularity",
+ "singulator", "singular",
+ "sitautions", "situations",
+ "situatinal", "situational",
+ "skatebaord", "skateboard",
+ "skateborad", "skateboard",
+ "skatebored", "skateboard",
+ "skatebrand", "skateboard",
+ "skeletones", "skeletons",
+ "skeptecism", "skepticism",
+ "skepticals", "skeptics",
+ "skepticles", "skeptics",
+ "skepticons", "skeptics",
+ "skeptisicm", "skepticism",
+ "skeptisism", "skepticism",
+ "sketchysex", "sketches",
+ "sketpicism", "skepticism",
+ "skillhosts", "skillshots",
+ "skillshits", "skillshots",
+ "skillshoot", "skillshots",
+ "skillslots", "skillshots",
+ "skillsofts", "skillshots",
+ "skillsshot", "skillshots",
+ "skirmiches", "skirmish",
+ "skpeticism", "skepticism",
+ "slaughterd", "slaughtered",
+ "slipperies", "slippers",
+ "smarpthone", "smartphones",
+ "smarthpone", "smartphone",
+ "snadwiches", "sandwiches",
+ "snowbaling", "snowballing",
+ "snowballes", "snowballs",
+ "snowballls", "snowballs",
+ "socailists", "socialists",
+ "socailized", "socialized",
+ "socialisim", "socialism",
+ "socializng", "socializing",
+ "socialsits", "socialists",
+ "sociapaths", "sociopaths",
+ "socilaists", "socialists",
+ "socilaized", "socialized",
+ "sociologia", "sociological",
+ "sociopatas", "sociopaths",
+ "sociopatch", "sociopaths",
+ "sociopatic", "sociopathic",
+ "socratease", "socrates",
+ "socreboard", "scoreboard",
+ "soemthings", "somethings",
+ "soldiarity", "solidarity",
+ "solidairty", "solidarity",
+ "soliditary", "solidarity",
+ "solitudine", "solitude",
+ "somehtings", "somethings",
+ "someonelse", "someones",
+ "somethibng", "somethin",
+ "somethigng", "somethin",
+ "somethigns", "somethings",
+ "somethihng", "somethin",
+ "somethiing", "somethin",
+ "somethijng", "somethin",
+ "somethikng", "somethin",
+ "somethimng", "somethin",
+ "somethinbg", "somethings",
+ "somethines", "somethings",
+ "somethinfg", "somethings",
+ "somethinhg", "somethings",
+ "somethinig", "somethings",
+ "somethinkg", "somethings",
+ "somethinks", "somethings",
+ "somethinmg", "somethings",
+ "somethinng", "somethings",
+ "somethintg", "somethings",
+ "somethiong", "somethin",
+ "somethiung", "somethin",
+ "sophicated", "sophisticated",
+ "sotrmfront", "stormfront",
+ "sotrylines", "storylines",
+ "soudntrack", "soundtrack",
+ "soundrtack", "soundtracks",
+ "soundtracs", "soundtracks",
+ "soundtrakc", "soundtracks",
+ "soundtrakk", "soundtrack",
+ "soundtraks", "soundtracks",
+ "southampon", "southampton",
+ "southamton", "southampton",
+ "southerers", "southerners",
+ "southernes", "southerners",
+ "southerton", "southern",
+ "souveniers", "souvenirs",
+ "sovereigny", "sovereignty",
+ "sovereinty", "sovereignty",
+ "soverignty", "sovereignty",
+ "spartaniis", "spartans",
+ "spartanops", "spartans",
+ "specailist", "specialist",
+ "specailize", "specializes",
+ "specialice", "specialize",
+ "specialied", "specialized",
+ "specialies", "specializes",
+ "specialits", "specials",
+ "speciallly", "specially",
+ "speciallty", "specially",
+ "specialops", "specials",
+ "specialsts", "specialists",
+ "specialtys", "specials",
+ "specialzed", "specialized",
+ "specialzes", "specializes",
+ "specifices", "specifics",
+ "specifiing", "specifying",
+ "specifiyng", "specifying",
+ "speciliast", "specialists",
+ "specimines", "specimen",
+ "spectarors", "spectators",
+ "spectaters", "spectators",
+ "spectracal", "spectral",
+ "spectraply", "spectral",
+ "spectrolab", "spectral",
+ "speculatie", "speculative",
+ "speculatin", "speculation",
+ "speecheasy", "speeches",
+ "speicalist", "specialist",
+ "spiritualy", "spiritually",
+ "sponsorees", "sponsors",
+ "sponsorhip", "sponsorship",
+ "sponsorise", "sponsors",
+ "spontaneos", "spontaneous",
+ "spontaneus", "spontaneous",
+ "spontanous", "spontaneous",
+ "spoonfulls", "spoonfuls",
+ "spreadshet", "spreadsheet",
+ "springfeld", "springfield",
+ "springfied", "springfield",
+ "spriritual", "spiritual",
+ "squirrells", "squirrels",
+ "squirrelus", "squirrels",
+ "stabelized", "stabilized",
+ "stabilzied", "stabilized",
+ "stablility", "stability",
+ "stablizied", "stabilized",
+ "staggaring", "staggering",
+ "stakeboard", "skateboard",
+ "starighten", "straighten",
+ "starnation", "starvation",
+ "startegies", "strategies",
+ "startupbus", "startups",
+ "starwberry", "strawberry",
+ "statememts", "statements",
+ "statictics", "statistics",
+ "stationair", "stationary",
+ "statisitcs", "statistics",
+ "statistcal", "statistical",
+ "statistisk", "statistics",
+ "stauration", "saturation",
+ "stealthboy", "stealthy",
+ "stealthely", "stealthy",
+ "stealthify", "stealthy",
+ "stealthray", "stealthy",
+ "steeleries", "steelers",
+ "stereotipe", "stereotype",
+ "stereotpye", "stereotypes",
+ "steriotype", "stereotype",
+ "steroetype", "stereotype",
+ "sterotypes", "stereotypes",
+ "steryotype", "stereotype",
+ "stimilants", "stimulants",
+ "stimilated", "stimulated",
+ "stimualted", "stimulated",
+ "stimulatie", "stimulated",
+ "stimulatin", "stimulation",
+ "stimulaton", "stimulation",
+ "stimulents", "stimulants",
+ "stomrfront", "stormfront",
+ "storelines", "storylines",
+ "stormfornt", "stormfront",
+ "stormfromt", "stormfront",
+ "stornfront", "stormfront",
+ "stornghold", "stronghold",
+ "stradegies", "strategies",
+ "strageties", "strategies",
+ "straighted", "straightened",
+ "straightie", "straighten",
+ "straightin", "straighten",
+ "straigthen", "straighten",
+ "stranglove", "strangle",
+ "strangreal", "strangle",
+ "stratagies", "strategies",
+ "strategems", "strategies",
+ "strategice", "strategies",
+ "strategisk", "strategies",
+ "stravation", "starvation",
+ "strawbarry", "strawberry",
+ "strawbeary", "strawberry",
+ "strawbeery", "strawberry",
+ "strawbrary", "strawberry",
+ "strawburry", "strawberry",
+ "streaching", "stretching",
+ "streamtrue", "streamer",
+ "strechting", "stretching",
+ "strecthing", "stretching",
+ "stregnthen", "strengthen",
+ "streichung", "stretching",
+ "strenghten", "strengthen",
+ "strengsten", "strengthen",
+ "strengthes", "strengths",
+ "strengthin", "strengthen",
+ "stressende", "stressed",
+ "striaghten", "straighten",
+ "stromfront", "stormfront",
+ "stronkhold", "stronghold",
+ "stroylines", "storylines",
+ "structered", "structured",
+ "structrual", "structural",
+ "structurel", "structural",
+ "strucutral", "structural",
+ "strucutred", "structured",
+ "strucutres", "structures",
+ "strugglign", "struggling",
+ "strwaberry", "strawberry",
+ "sttutering", "stuttering",
+ "stupidfree", "stupider",
+ "stupiditiy", "stupidity",
+ "sturctural", "structural",
+ "sturctures", "structures",
+ "sturggling", "struggling",
+ "subarmines", "submarines",
+ "subcultuur", "subculture",
+ "subesquent", "subsequent",
+ "subisdized", "subsidized",
+ "subjectief", "subjective",
+ "subjectifs", "subjects",
+ "subjectivy", "subjectively",
+ "subjektive", "subjective",
+ "submariens", "submarines",
+ "submarinas", "submarines",
+ "submergerd", "submerged",
+ "submerines", "submarines",
+ "submisison", "submissions",
+ "submissies", "submissive",
+ "submissons", "submissions",
+ "submittion", "submitting",
+ "subsadized", "subsidized",
+ "subscirbed", "subscribed",
+ "subscirber", "subscribers",
+ "subscribar", "subscriber",
+ "subscribir", "subscriber",
+ "subscrible", "subscriber",
+ "subscriped", "subscribed",
+ "subscrubed", "subscribed",
+ "subscryber", "subscriber",
+ "subsedized", "subsidized",
+ "subsequant", "subsequent",
+ "subsidezed", "subsidized",
+ "subsidiced", "subsidized",
+ "subsidizng", "subsidizing",
+ "subsiduary", "subsidiary",
+ "subsiquent", "subsequent",
+ "subsittute", "substitutes",
+ "subsizided", "subsidized",
+ "subsrcibed", "subscribed",
+ "substanial", "substantial",
+ "substansen", "substances",
+ "substanser", "substances",
+ "substanses", "substances",
+ "substantie", "substantive",
+ "substatial", "substantial",
+ "substences", "substances",
+ "substitite", "substitute",
+ "substittue", "substitutes",
+ "substitude", "substitute",
+ "substitued", "substitute",
+ "substituer", "substitute",
+ "substitues", "substitutes",
+ "substiture", "substitute",
+ "substituto", "substitution",
+ "substituts", "substitutes",
+ "substracts", "subtracts",
+ "substutite", "substitutes",
+ "subsudized", "subsidized",
+ "subtitltes", "subtitle",
+ "succceeded", "succeeded",
+ "succcesses", "successes",
+ "succesfuly", "successfully",
+ "succesions", "succession",
+ "successing", "succession",
+ "successivo", "succession",
+ "sucesfully", "successfully",
+ "sucessfull", "successful",
+ "sucessfuly", "successfully",
+ "sudnerland", "sunderland",
+ "sufferered", "suffered",
+ "sufferring", "suffering",
+ "sufficiant", "sufficient",
+ "suggestied", "suggestive",
+ "suggestief", "suggestive",
+ "suggestons", "suggests",
+ "sumbarines", "submarines",
+ "sumbissive", "submissive",
+ "sumbitting", "submitting",
+ "summerized", "summarized",
+ "summorized", "summarized",
+ "summurized", "summarized",
+ "sunderlona", "sunderland",
+ "sunderlund", "sunderland",
+ "sungalsses", "sunglasses",
+ "sunglesses", "sunglasses",
+ "sunglinger", "gunslinger",
+ "sunscreeen", "sunscreen",
+ "superfical", "superficial",
+ "superfluos", "superfluous",
+ "superioara", "superior",
+ "superioare", "superior",
+ "superioris", "superiors",
+ "superivsor", "supervisors",
+ "supermaket", "supermarket",
+ "supermarkt", "supermarket",
+ "superouman", "superhuman",
+ "superposer", "superpowers",
+ "superviors", "supervisors",
+ "superviosr", "supervisors",
+ "supervisar", "supervisor",
+ "superviser", "supervisor",
+ "supervisin", "supervision",
+ "supervison", "supervision",
+ "supervsior", "supervisors",
+ "supperssor", "suppressor",
+ "supplament", "supplement",
+ "supplemant", "supplemental",
+ "supplemets", "supplements",
+ "supportare", "supporters",
+ "supporteur", "supporter",
+ "supportied", "supported",
+ "supportors", "supporters",
+ "supposdely", "supposedly",
+ "supposebly", "supposedly",
+ "supposidly", "supposedly",
+ "suppresion", "suppression",
+ "suppresors", "suppressor",
+ "suppressin", "suppression",
+ "suppressio", "suppressor",
+ "suppresson", "suppression",
+ "suprassing", "surpassing",
+ "supressing", "suppressing",
+ "supression", "suppression",
+ "supsension", "suspension",
+ "supsicions", "suspicions",
+ "supsicious", "suspicious",
+ "surounding", "surrounding",
+ "surplanted", "supplanted",
+ "surpressed", "suppressed",
+ "surprizing", "surprising",
+ "surrenderd", "surrendered",
+ "surrouding", "surrounding",
+ "surroundes", "surrounds",
+ "surroundig", "surroundings",
+ "survivours", "survivor",
+ "suseptable", "susceptible",
+ "suseptible", "susceptible",
+ "suspecions", "suspicions",
+ "suspecious", "suspicious",
+ "suspencion", "suspension",
+ "suspendeds", "suspense",
+ "suspention", "suspension",
+ "suspicians", "suspicions",
+ "suspiciois", "suspicions",
+ "suspicioso", "suspicions",
+ "suspicioun", "suspicion",
+ "suspicison", "suspicions",
+ "suspiciuos", "suspicions",
+ "suspicsion", "suspicions",
+ "suspisions", "suspicions",
+ "suspisious", "suspicious",
+ "suspitions", "suspicions",
+ "sustainble", "sustainable",
+ "swaetshirt", "sweatshirt",
+ "swearengin", "swearing",
+ "swearshirt", "sweatshirt",
+ "sweathsirt", "sweatshirt",
+ "sweatshits", "sweatshirt",
+ "sweatshort", "sweatshirt",
+ "sweatshrit", "sweatshirt",
+ "sweerheart", "sweetheart",
+ "sweetshart", "sweetheart",
+ "switcheasy", "switches",
+ "switzerand", "switzerland",
+ "symapthize", "sympathize",
+ "symbolisch", "symbolic",
+ "symbolisim", "symbolism",
+ "symetrical", "symmetrical",
+ "sympatheic", "sympathetic",
+ "sympathiek", "sympathize",
+ "sympathien", "sympathize",
+ "sympathtic", "sympathetic",
+ "sympathyze", "sympathize",
+ "sympethize", "sympathize",
+ "symphatize", "sympathize",
+ "symphonity", "symphony",
+ "sympothize", "sympathize",
+ "syncronous", "synchronous",
+ "synomymous", "synonymous",
+ "synomynous", "synonymous",
+ "synonamous", "synonymous",
+ "synonimous", "synonymous",
+ "synonmyous", "synonymous",
+ "synonomous", "synonymous",
+ "synonumous", "synonymous",
+ "synonynous", "synonymous",
+ "sypmathize", "sympathize",
+ "systamatic", "systematic",
+ "systemetic", "systematic",
+ "systemisch", "systemic",
+ "systimatic", "systematic",
+ "tabelspoon", "tablespoon",
+ "tablespons", "tablespoons",
+ "tablesppon", "tablespoon",
+ "tacitcally", "tactically",
+ "taiwanesse", "taiwanese",
+ "taligating", "tailgating",
+ "tantrumers", "tantrums",
+ "targetting", "targeting",
+ "teamfigths", "teamfights",
+ "teamifghts", "teamfights",
+ "teamspeack", "teamspeak",
+ "techicians", "technicians",
+ "techincian", "technician",
+ "techinican", "technician",
+ "techinques", "techniques",
+ "technicain", "technician",
+ "technicaly", "technically",
+ "technicans", "technicians",
+ "technichan", "technician",
+ "technicien", "technician",
+ "technicion", "technician",
+ "technitian", "technician",
+ "technqiues", "techniques",
+ "techtician", "technician",
+ "tehnically", "ethnically",
+ "telegrapgh", "telegraph",
+ "teleporing", "teleporting",
+ "televesion", "television",
+ "televisivo", "television",
+ "temafights", "teamfights",
+ "temerature", "temperature",
+ "temperatue", "temperature",
+ "temperment", "temperament",
+ "temperture", "temperature",
+ "templarios", "templars",
+ "templarius", "templars",
+ "temporaily", "temporarily",
+ "temporarly", "temporary",
+ "temptating", "temptation",
+ "temptetion", "temptation",
+ "tendancies", "tendencies",
+ "tendencias", "tendencies",
+ "tendencije", "tendencies",
+ "tendensies", "tendencies",
+ "tendincies", "tendencies",
+ "tensionors", "tensions",
+ "tentacreul", "tentacle",
+ "termanator", "terminator",
+ "termendous", "tremendous",
+ "termiantor", "terminator",
+ "termigator", "terminator",
+ "terminales", "terminals",
+ "terminalis", "terminals",
+ "terminarla", "terminal",
+ "terminarlo", "terminal",
+ "terminaron", "terminator",
+ "terminater", "terminator",
+ "terminolgy", "terminology",
+ "terorrists", "terrorists",
+ "terrerists", "terrorists",
+ "terrestial", "terrestrial",
+ "terriblely", "terribly",
+ "terriories", "territories",
+ "territoral", "territorial",
+ "territores", "territories",
+ "territoris", "territories",
+ "territorry", "territory",
+ "terrorisim", "terrorism",
+ "terrorsits", "terrorists",
+ "terrurists", "terrorists",
+ "testiclees", "testicles",
+ "testiclies", "testicle",
+ "testimoney", "testimony",
+ "thankyooou", "thankyou",
+ "themselfes", "themselves",
+ "themsevles", "themselves",
+ "themsleves", "themselves",
+ "theocracry", "theocracy",
+ "theologial", "theological",
+ "therapetic", "therapeutic",
+ "therepists", "therapists",
+ "theripists", "therapists",
+ "thermastat", "thermostat",
+ "thermistat", "thermostat",
+ "thermomter", "thermometer",
+ "theromstat", "thermostat",
+ "thorttling", "throttling",
+ "thorughout", "throughout",
+ "thouroghly", "thoroughly",
+ "threadened", "threaded",
+ "threatenes", "threatens",
+ "threatning", "threatening",
+ "threshhold", "threshold",
+ "throthling", "throttling",
+ "throtlling", "throttling",
+ "throughiut", "throughput",
+ "thubmnails", "thumbnails",
+ "thumbmails", "thumbnails",
+ "thunderbot", "thunderbolt",
+ "thunderolt", "thunderbolt",
+ "tighetning", "tightening",
+ "tightining", "tightening",
+ "tigthening", "tightening",
+ "tjpanishad", "upanishad",
+ "toothbruch", "toothbrush",
+ "toothbruth", "toothbrush",
+ "toothbursh", "toothbrush",
+ "toothrbush", "toothbrush",
+ "toppingest", "toppings",
+ "torchilght", "torchlight",
+ "torchlgiht", "torchlight",
+ "torchligth", "torchlight",
+ "torhclight", "torchlight",
+ "torrentbig", "torrenting",
+ "torrenters", "torrents",
+ "torrentors", "torrents",
+ "tortillera", "tortilla",
+ "tortillias", "tortilla",
+ "tortillita", "tortilla",
+ "tortilllas", "tortilla",
+ "torunament", "tournament",
+ "totalitara", "totalitarian",
+ "touchsceen", "touchscreen",
+ "touchscren", "touchscreen",
+ "touranment", "tournaments",
+ "tourmanent", "tournaments",
+ "tournamets", "tournaments",
+ "tournamnet", "tournament",
+ "tournemant", "tournament",
+ "tournement", "tournament",
+ "toxicitity", "toxicity",
+ "trafficing", "trafficking",
+ "trainwreak", "trainwreck",
+ "traitorise", "traitors",
+ "tramboline", "trampoline",
+ "tramploine", "trampoline",
+ "trampolene", "trampoline",
+ "tranformed", "transformed",
+ "tranistion", "transition",
+ "tranlsated", "translated",
+ "transalted", "translated",
+ "transaltes", "translates",
+ "transaltor", "translator",
+ "transation", "transition",
+ "transciprt", "transcripts",
+ "transcirpt", "transcripts",
+ "transcrips", "transcripts",
+ "transcrito", "transcript",
+ "transcrits", "transcripts",
+ "transcrpit", "transcript",
+ "transfered", "transferred",
+ "transferer", "transferred",
+ "transferes", "transfers",
+ "transferrs", "transfers",
+ "transferts", "transfers",
+ "transfomed", "transformed",
+ "transfored", "transformed",
+ "transforme", "transfer",
+ "transfroms", "transforms",
+ "transgeder", "transgender",
+ "transgener", "transgender",
+ "transicion", "transition",
+ "transision", "transition",
+ "transister", "transistor",
+ "transitons", "transitions",
+ "transitors", "transistor",
+ "transkript", "transcript",
+ "translater", "translator",
+ "translatin", "translations",
+ "translatio", "translator",
+ "translpant", "transplants",
+ "transluent", "translucent",
+ "transmited", "transmitted",
+ "transmiter", "transmitter",
+ "transmitor", "transistor",
+ "transmorgs", "transforms",
+ "transpalnt", "transplants",
+ "transphoic", "transphobic",
+ "transplain", "transplant",
+ "transplate", "transplant",
+ "transplats", "transplants",
+ "transpoder", "transported",
+ "transportr", "transporter",
+ "transsexal", "transsexual",
+ "transtator", "translator",
+ "tranzistor", "transistor",
+ "trasncript", "transcript",
+ "trasnforms", "transforms",
+ "trasnlated", "translated",
+ "trasnlator", "translator",
+ "trasnplant", "transplant",
+ "traveleres", "travelers",
+ "travelodge", "traveled",
+ "traverlers", "traverse",
+ "traversare", "traverse",
+ "traversier", "traverse",
+ "treasurery", "treasury",
+ "trememdous", "tremendous",
+ "tremondous", "tremendous",
+ "trespasing", "trespassing",
+ "trianwreck", "trainwreck",
+ "trochlight", "torchlight",
+ "trustworhy", "trustworthy",
+ "trustworty", "trustworthy",
+ "trustwothy", "trustworthy",
+ "tryannical", "tyrannical",
+ "tunraround", "turnaround",
+ "tupparware", "tupperware",
+ "turnapound", "turnaround",
+ "turthfully", "truthfully",
+ "tutoriales", "tutorials",
+ "tyrantical", "tyrannical",
+ "ubiqituous", "ubiquitous",
+ "ubiquotous", "ubiquitous",
+ "ubiqutious", "ubiquitous",
+ "ukrainains", "ukrainians",
+ "ukraineans", "ukrainians",
+ "ukrainiens", "ukrainians",
+ "ukraininas", "ukrainians",
+ "ukrianians", "ukrainians",
+ "ulitmately", "ultimately",
+ "ulterioara", "ulterior",
+ "ulterioare", "ulterior",
+ "ultimative", "ultimate",
+ "ultimatley", "ultimately",
+ "ultimatuum", "ultimatum",
+ "unanwsered", "unanswered",
+ "unasnwered", "unanswered",
+ "unattanded", "unattended",
+ "unattented", "unattended",
+ "unavailabe", "unavailable",
+ "unavailble", "unavailable",
+ "unavoidble", "unavoidable",
+ "unawnsered", "unanswered",
+ "unbalenced", "unbalanced",
+ "unballance", "unbalance",
+ "unbalnaced", "unbalanced",
+ "unbareable", "unbearable",
+ "unbeakable", "unbeatable",
+ "unbeareble", "unbearable",
+ "unbeatbale", "unbeatable",
+ "unbeateble", "unbeatable",
+ "unbeerable", "unbearable",
+ "unbeetable", "unbeatable",
+ "unbeknowst", "unbeknownst",
+ "unbreakble", "unbreakable",
+ "uncencored", "uncensored",
+ "uncensered", "uncensored",
+ "uncersored", "uncensored",
+ "uncertainy", "uncertainty",
+ "uncertanty", "uncertainty",
+ "uncesnored", "uncensored",
+ "uncomitted", "uncommitted",
+ "uncommited", "uncommitted",
+ "unconcious", "unconscious",
+ "unconscous", "unconscious",
+ "undebiably", "undeniably",
+ "undeinable", "undeniable",
+ "undeinably", "undeniably",
+ "undenaible", "undeniable",
+ "undenaibly", "undeniably",
+ "undenyable", "undeniable",
+ "undenyably", "undeniably",
+ "underbaker", "undertaker",
+ "undercling", "underlying",
+ "underfaker", "undertaker",
+ "undergated", "underrated",
+ "undergrand", "undergrad",
+ "undergroud", "underground",
+ "undergrund", "underground",
+ "undermimes", "undermines",
+ "underminde", "undermines",
+ "underminig", "undermining",
+ "underneeth", "underneath",
+ "underneith", "underneath",
+ "undernieth", "underneath",
+ "underpowed", "underpowered",
+ "underraged", "underrated",
+ "underraker", "undertaker",
+ "underrater", "undertaker",
+ "undersatnd", "understands",
+ "understadn", "understands",
+ "understans", "understands",
+ "understnad", "understands",
+ "understoon", "understood",
+ "understsnd", "understands",
+ "undertoker", "undertaker",
+ "undertsand", "understands",
+ "undertunes", "undertones",
+ "underwager", "underwater",
+ "underwares", "underwater",
+ "underwolrd", "underworld",
+ "underwoord", "underworld",
+ "underwrold", "underworld",
+ "underyling", "underlying",
+ "undesrtand", "understands",
+ "undoubtedy", "undoubtedly",
+ "undoubtely", "undoubtedly",
+ "undoubtley", "undoubtedly",
+ "uneccesary", "unnecessary",
+ "unecessary", "unnecessary",
+ "unedcuated", "uneducated",
+ "unedicated", "uneducated",
+ "unempolyed", "unemployed",
+ "unexplaind", "unexplained",
+ "unexplaned", "unexplained",
+ "unfamilair", "unfamiliar",
+ "unfamilier", "unfamiliar",
+ "unfinsihed", "unfinished",
+ "unfirendly", "unfriendly",
+ "unfortuate", "unfortunate",
+ "unfreindly", "unfriendly",
+ "unfriednly", "unfriendly",
+ "unfriently", "unfriendly",
+ "ungrapeful", "ungrateful",
+ "ungreatful", "ungrateful",
+ "unhealthly", "unhealthy",
+ "unicornios", "unicorns",
+ "unifnished", "unfinished",
+ "unihabited", "uninhabited",
+ "unilatreal", "unilateral",
+ "unimporant", "unimportant",
+ "unimpresed", "unimpressed",
+ "unimpressd", "unimpressed",
+ "uninsipred", "uninspired",
+ "uninspried", "uninspired",
+ "uninstaled", "uninstalled",
+ "uniquiness", "uniqueness",
+ "univercity", "university",
+ "univeristy", "university",
+ "universale", "universe",
+ "universaly", "universally",
+ "universels", "universes",
+ "universets", "universes",
+ "universite", "universities",
+ "universtiy", "university",
+ "unjustifed", "unjustified",
+ "unknowingy", "unknowingly",
+ "unknowinly", "unknowingly",
+ "unnecesary", "unnecessary",
+ "unofficail", "unofficial",
+ "unoffocial", "unofficial",
+ "unorginial", "unoriginal",
+ "unorignial", "unoriginal",
+ "unorigonal", "unoriginal",
+ "unplacable", "unplayable",
+ "unplaybale", "unplayable",
+ "unplayeble", "unplayable",
+ "unpleasent", "unpleasant",
+ "unpopulair", "unpopular",
+ "unproteced", "unprotected",
+ "unqiueness", "uniqueness",
+ "unqualifed", "unqualified",
+ "unrealesed", "unreleased",
+ "unrealible", "unreliable",
+ "unrealistc", "unrealistic",
+ "unrealitic", "unrealistic",
+ "unreasonal", "unreasonably",
+ "unrelaible", "unreliable",
+ "unreleated", "unreleased",
+ "unrelyable", "unreliable",
+ "unrepetant", "unrepentant",
+ "unrepetent", "unrepentant",
+ "unresponse", "unresponsive",
+ "unsencored", "uncensored",
+ "unsetlling", "unsettling",
+ "unsolicted", "unsolicited",
+ "unsubscibe", "unsubscribe",
+ "unsubscrbe", "unsubscribe",
+ "unsucesful", "unsuccessful",
+ "unsuprised", "unsurprised",
+ "unsuprized", "unsurprised",
+ "unviersity", "university",
+ "unwrittern", "unwritten",
+ "urkainians", "ukrainians",
+ "utlimately", "ultimately",
+ "utlrasound", "ultrasound",
+ "vaccinatie", "vaccinated",
+ "vaccineras", "vaccines",
+ "valentians", "valentines",
+ "valentiens", "valentines",
+ "valentimes", "valentines",
+ "valentinas", "valentines",
+ "valentinos", "valentines",
+ "valentones", "valentines",
+ "validitity", "validity",
+ "valnetines", "valentines",
+ "vandalisim", "vandalism",
+ "vasectomey", "vasectomy",
+ "vegatarian", "vegetarian",
+ "vegaterian", "vegetarian",
+ "vegeratian", "vegetarians",
+ "vegetairan", "vegetarians",
+ "vegetarain", "vegetarians",
+ "vegetarien", "vegetarian",
+ "vegetarion", "vegetarian",
+ "vegetatian", "vegetarian",
+ "vegeterian", "vegetarian",
+ "vegitables", "vegetables",
+ "vehemantly", "vehemently",
+ "vehemontly", "vehemently",
+ "veitnamese", "vietnamese",
+ "veiwership", "viewership",
+ "veiwpoints", "viewpoints",
+ "venezuella", "venezuela",
+ "verificato", "verification",
+ "verifyable", "verifiable",
+ "veritcally", "vertically",
+ "veritiable", "verifiable",
+ "vernecular", "vernacular",
+ "vernicular", "vernacular",
+ "versatiliy", "versatility",
+ "versatille", "versatile",
+ "versatilty", "versatility",
+ "versitlity", "versatility",
+ "vewiership", "viewership",
+ "vibratoare", "vibrator",
+ "vicitmized", "victimized",
+ "vicotrious", "victorious",
+ "victemized", "victimized",
+ "victomized", "victimized",
+ "victorinos", "victorious",
+ "victorinus", "victorious",
+ "victoriosa", "victorious",
+ "victorioso", "victorious",
+ "victoriuos", "victorious",
+ "victumized", "victimized",
+ "videogaems", "videogames",
+ "videojames", "videogames",
+ "vidoegames", "videogames",
+ "vientamese", "vietnamese",
+ "vietmanese", "vietnamese",
+ "vietnamees", "vietnamese",
+ "vietnamise", "vietnamese",
+ "viewpionts", "viewpoints",
+ "vigilantie", "vigilante",
+ "vigoruosly", "vigorously",
+ "vigourosly", "vigorously",
+ "villageois", "villages",
+ "vindicitve", "vindictive",
+ "vindictave", "vindictive",
+ "visibiltiy", "visibility",
+ "vitenamese", "vietnamese",
+ "vocabluary", "vocabulary",
+ "volatiltiy", "volatility",
+ "volativity", "volatility",
+ "volitality", "volatility",
+ "volleyboll", "volleyball",
+ "vollyeball", "volleyball",
+ "volonteers", "volunteers",
+ "volounteer", "volunteer",
+ "voluntairy", "voluntarily",
+ "voluntarly", "voluntary",
+ "voluntears", "volunteers",
+ "volunteeer", "volunteers",
+ "volunteerd", "volunteered",
+ "voluntered", "volunteered",
+ "vulernable", "vulnerable",
+ "vulnarable", "vulnerable",
+ "vulnerabil", "vulnerable",
+ "vulnurable", "vulnerable",
+ "vunlerable", "vulnerable",
+ "warrandyte", "warranty",
+ "warrantles", "warranties",
+ "warrenties", "warranties",
+ "washignton", "washington",
+ "waterlemon", "watermelon",
+ "watermalon", "watermelon",
+ "waterproff", "waterproof",
+ "wavelegnth", "wavelength",
+ "wavelenghs", "wavelength",
+ "wavelenght", "wavelength",
+ "weakensses", "weaknesses",
+ "weaknesess", "weaknesses",
+ "weathliest", "wealthiest",
+ "wedensdays", "wednesdays",
+ "wednesdsay", "wednesdays",
+ "wednessday", "wednesdays",
+ "wednsedays", "wednesdays",
+ "weightened", "weighted",
+ "welathiest", "wealthiest",
+ "wellignton", "wellington",
+ "wellingotn", "wellington",
+ "wendesdays", "wednesdays",
+ "wereabouts", "whereabouts",
+ "westbroook", "westbrook",
+ "westernese", "westerners",
+ "westerness", "westerners",
+ "westminser", "westminster",
+ "westminter", "westminster",
+ "whatosever", "whatsoever",
+ "whatseover", "whatsoever",
+ "whipsering", "whispering",
+ "whsipering", "whispering",
+ "widepsread", "widespread",
+ "wikileakes", "wikileaks",
+ "wilderniss", "wilderness",
+ "wildreness", "wilderness",
+ "willfullly", "willfully",
+ "winchestor", "winchester",
+ "windhsield", "windshield",
+ "windsheild", "windshield",
+ "windshiled", "windshield",
+ "wisconsion", "wisconsin",
+ "wishpering", "whispering",
+ "withdrawan", "withdrawn",
+ "withdrawel", "withdrawal",
+ "withdrawin", "withdrawn",
+ "withholdng", "withholding",
+ "withrdawal", "withdrawals",
+ "witnissing", "witnessing",
+ "wonderfull", "wonderful",
+ "wonderfuly", "wonderfully",
+ "wonderwand", "wonderland",
+ "worhsiping", "worshiping",
+ "workingest", "workings",
+ "workstaion", "workstation",
+ "workstaton", "workstation",
+ "worshippig", "worshipping",
+ "worshoping", "worshiping",
+ "wrestlewar", "wrestler",
+ "xenohpobic", "xenophobic",
+ "xenophibia", "xenophobia",
+ "xenophibic", "xenophobic",
+ "xenophonic", "xenophobic",
+ "xenophopia", "xenophobia",
+ "xenophopic", "xenophobic",
+ "xeonphobia", "xenophobia",
+ "xeonphobic", "xenophobic",
+ "yourselfes", "yourselves",
+ "yoursleves", "yourselves",
+ "zimbabwaen", "zimbabwe",
+ "zionistisk", "zionists",
+ "abandonig", "abandoning",
+ "abandonne", "abandonment",
+ "abanonded", "abandoned",
+ "abdomnial", "abdominal",
+ "abdonimal", "abdominal",
+ "aberation", "aberration",
+ "abnormaly", "abnormally",
+ "abodminal", "abdominal",
+ "abondoned", "abandoned",
+ "aborigene", "aborigine",
+ "aboslutes", "absolutes",
+ "abosrbing", "absorbing",
+ "abreviate", "abbreviate",
+ "abritrary", "arbitrary",
+ "abruptley", "abruptly",
+ "absailing", "abseiling",
+ "absloutes", "absolutes",
+ "absolutey", "absolutely",
+ "absolutly", "absolutely",
+ "absoultes", "absolutes",
+ "abstracto", "abstraction",
+ "absurdley", "absurdly",
+ "absuridty", "absurdity",
+ "abusrdity", "absurdity",
+ "academica", "academia",
+ "accademic", "academic",
+ "accalimed", "acclaimed",
+ "accelerar", "accelerator",
+ "accending", "ascending",
+ "accension", "accession",
+ "accidenty", "accidently",
+ "acclamied", "acclaimed",
+ "accliamed", "acclaimed",
+ "accomdate", "accommodate",
+ "accordeon", "accordion",
+ "accordian", "accordion",
+ "accoridng", "according",
+ "accountas", "accountants",
+ "accountat", "accountants",
+ "accoustic", "acoustic",
+ "accroding", "according",
+ "accuraccy", "accuracy",
+ "acftually", "factually",
+ "acheiving", "achieving",
+ "achieveds", "achieves",
+ "achillees", "achilles",
+ "achilleos", "achilles",
+ "achilleus", "achilles",
+ "achiveing", "achieving",
+ "acitvates", "activates",
+ "aclhemist", "alchemist",
+ "acomplish", "accomplish",
+ "acquisito", "acquisition",
+ "acronymes", "acronyms",
+ "acronymns", "acronyms",
+ "acsending", "ascending",
+ "acsension", "ascension",
+ "activaste", "activates",
+ "activatin", "activation",
+ "activelly", "actively",
+ "activisim", "activism",
+ "activisit", "activist",
+ "activites", "activities",
+ "actresess", "actresses",
+ "acusation", "causation",
+ "acutality", "actuality",
+ "adavanced", "advanced",
+ "adbominal", "abdominal",
+ "additonal", "additional",
+ "addoptive", "adoptive",
+ "addresing", "addressing",
+ "addtional", "additional",
+ "adhearing", "adhering",
+ "adherance", "adherence",
+ "adjectivs", "adjectives",
+ "adjustabe", "adjustable",
+ "administr", "administer",
+ "admitedly", "admittedly",
+ "adolecent", "adolescent",
+ "adovcated", "advocated",
+ "adovcates", "advocates",
+ "adquiring", "acquiring",
+ "adresable", "addressable",
+ "adressing", "addressing",
+ "aduiobook", "audiobook",
+ "advatange", "advantage",
+ "adventurs", "adventures",
+ "adveristy", "adversity",
+ "advertisy", "adversity",
+ "advisorys", "advisors",
+ "aeorspace", "aerospace",
+ "aeropsace", "aerospace",
+ "aerosapce", "aerospace",
+ "aersopace", "aerospace",
+ "aestethic", "aesthetic",
+ "aethistic", "atheistic",
+ "affiliato", "affiliation",
+ "affinitiy", "affinity",
+ "affirmate", "affirmative",
+ "affliated", "affiliated",
+ "africanas", "africans",
+ "africanos", "africans",
+ "aggegrate", "aggregate",
+ "aggresive", "aggressive",
+ "agnosticm", "agnosticism",
+ "agregates", "aggregates",
+ "agreggate", "aggregate",
+ "agrentina", "argentina",
+ "agression", "aggression",
+ "agressive", "aggressive",
+ "agressvie", "agressive",
+ "agruement", "arguement",
+ "agruments", "arguments",
+ "agurement", "arguement",
+ "ailenated", "alienated",
+ "airbourne", "airborne",
+ "aircrafts", "aircraft",
+ "airplance", "airplane",
+ "airrcraft", "aircraft",
+ "aksreddit", "askreddit",
+ "alcehmist", "alchemist",
+ "alchemsit", "alchemist",
+ "alchimest", "alchemist",
+ "alchmeist", "alchemist",
+ "alchoolic", "alcoholic",
+ "alcoholis", "alcoholics",
+ "alechmist", "alchemist",
+ "alegience", "allegiance",
+ "aleinated", "alienated",
+ "algoriths", "algorithms",
+ "algoritms", "algorithms",
+ "algorthim", "algorithm",
+ "algortihm", "algorithm",
+ "alignemnt", "alignment",
+ "alimunium", "aluminium",
+ "alingment", "alignment",
+ "allainces", "alliances",
+ "alledgely", "allegedly",
+ "allegence", "allegiance",
+ "alleivate", "alleviate",
+ "allievate", "alleviate",
+ "alliviate", "alleviate",
+ "allopones", "allophones",
+ "allthough", "although",
+ "almightly", "almighty",
+ "alocholic", "alcoholic",
+ "alogrithm", "algorithm",
+ "alphabeat", "alphabet",
+ "alrightey", "alrighty",
+ "alrightly", "alrighty",
+ "alrightty", "alrighty",
+ "alrington", "arlington",
+ "alrorythm", "algorithm",
+ "alterante", "alternate",
+ "alternatr", "alternator",
+ "althetics", "athletics",
+ "althought", "although",
+ "altruisim", "altruism",
+ "amateures", "amateurs",
+ "ambluance", "ambulance",
+ "ambuigity", "ambiguity",
+ "amendmant", "amendment",
+ "amercians", "americans",
+ "americain", "american",
+ "americams", "americas",
+ "americaps", "americas",
+ "americats", "americas",
+ "amibguity", "ambiguity",
+ "aminosity", "animosity",
+ "amrstrong", "armstrong",
+ "amublance", "ambulance",
+ "amunition", "ammunition",
+ "anachrist", "anarchist",
+ "analagous", "analogous",
+ "analitycs", "analytics",
+ "analtyics", "analytics",
+ "analyitcs", "analytics",
+ "analyseas", "analyses",
+ "analysees", "analyses",
+ "analysens", "analyses",
+ "analysise", "analyses",
+ "analystes", "analysts",
+ "analzying", "analyzing",
+ "anarchsim", "anarchism",
+ "anayltics", "analytics",
+ "anaylzing", "analyzing",
+ "ancedotal", "anecdotal",
+ "ancedotes", "anecdotes",
+ "ancestory", "ancestry",
+ "androgeny", "androgyny",
+ "androides", "androids",
+ "androidos", "androids",
+ "anecdotle", "anecdote",
+ "anecodtal", "anecdotal",
+ "anecodtes", "anecdotes",
+ "anectodal", "anecdotal",
+ "anectodes", "anecdotes",
+ "anedoctal", "anecdotal",
+ "anedoctes", "anecdotes",
+ "animostiy", "animosity",
+ "anitvirus", "antivirus",
+ "anlaytics", "analytics",
+ "anniversy", "anniversary",
+ "annointed", "anointed",
+ "annoucnes", "announces",
+ "annoyingy", "annoyingly",
+ "annoymous", "anonymous",
+ "annoynace", "annoyance",
+ "annyoance", "annoyance",
+ "anomisity", "animosity",
+ "anomolies", "anomalies",
+ "anomolous", "anomalous",
+ "anomynity", "anonymity",
+ "anomynous", "anonymous",
+ "anonimity", "anonymity",
+ "anonmyous", "anonymous",
+ "anonymoys", "anonymously",
+ "anorexiac", "anorexic",
+ "anorexica", "anorexia",
+ "anrachist", "anarchist",
+ "ansestors", "ancestors",
+ "antarctia", "antarctica",
+ "antennaes", "antennas",
+ "antiviurs", "antivirus",
+ "antivrius", "antivirus",
+ "antivuris", "antivirus",
+ "anwsering", "answering",
+ "anynomity", "anonymity",
+ "anynomous", "anonymous",
+ "aparthide", "apartheid",
+ "aparthied", "apartheid",
+ "apartmens", "apartments",
+ "apocalype", "apocalypse",
+ "apostrope", "apostrophe",
+ "apparenty", "apparently",
+ "appearane", "appearances",
+ "appenines", "apennines",
+ "apperance", "appearance",
+ "appetitie", "appetite",
+ "applaudes", "applause",
+ "applicato", "application",
+ "appreciae", "appreciates",
+ "apprentie", "apprentice",
+ "approachs", "approaches",
+ "apratheid", "apartheid",
+ "apsaragus", "asparagus",
+ "apsergers", "aspergers",
+ "aquainted", "acquainted",
+ "arbirtary", "arbitrary",
+ "arbritary", "arbitrary",
+ "arcehtype", "archetype",
+ "archetect", "architect",
+ "archetpye", "archetype",
+ "archetyps", "archetypes",
+ "architecs", "architects",
+ "archtypes", "archetypes",
+ "aregument", "arguement",
+ "areospace", "aerospace",
+ "argessive", "agressive",
+ "argeument", "arguement",
+ "arguabley", "arguably",
+ "arguablly", "arguably",
+ "arguement", "argument",
+ "arguemnet", "arguement",
+ "arguemnts", "arguments",
+ "argumeent", "arguement",
+ "arhtritis", "arthritis",
+ "aribtrary", "arbitrary",
+ "ariplanes", "airplanes",
+ "aristolte", "aristotle",
+ "aristotel", "aristotle",
+ "aritfacts", "artifacts",
+ "arlignton", "arlington",
+ "arlingotn", "arlington",
+ "armistace", "armistice",
+ "armstorng", "armstrong",
+ "arpatheid", "apartheid",
+ "arthirtis", "arthritis",
+ "artifcats", "artifacts",
+ "artifical", "artificial",
+ "artillary", "artillery",
+ "arugement", "arguement",
+ "arugments", "arguments",
+ "asapragus", "asparagus",
+ "asbestoes", "asbestos",
+ "asborbing", "absorbing",
+ "asburdity", "absurdity",
+ "ascendend", "ascended",
+ "ascneding", "ascending",
+ "ascnesion", "ascension",
+ "asethetic", "aesthetic",
+ "asnwering", "answering",
+ "asociated", "associated",
+ "assasined", "assassinated",
+ "assassian", "assassin",
+ "assassine", "assassinate",
+ "assasssin", "assassins",
+ "assaultes", "assaults",
+ "assembeld", "assembled",
+ "assembley", "assembly",
+ "assemblie", "assemble",
+ "assisnate", "assassinate",
+ "assistans", "assistants",
+ "assistsnt", "assistants",
+ "assmebled", "assembled",
+ "associato", "association",
+ "assoicate", "associate",
+ "asssasins", "assassins",
+ "assualted", "assaulted",
+ "assulated", "assaulted",
+ "asteorids", "asteroids",
+ "astericks", "asterisk",
+ "asteriods", "asteroids",
+ "astroanut", "astronaut",
+ "astronuat", "astronaut",
+ "astrounat", "astronaut",
+ "asuterity", "austerity",
+ "atempting", "attempting",
+ "atheltics", "athletics",
+ "atheneans", "athenians",
+ "athesitic", "atheistic",
+ "athetlics", "athletics",
+ "athiestic", "atheistic",
+ "athleticm", "athleticism",
+ "atmosphir", "atmospheric",
+ "atributed", "attributed",
+ "atributes", "attributes",
+ "atrifacts", "artifacts",
+ "atrillery", "artillery",
+ "atrittion", "attrition",
+ "attachmet", "attachments",
+ "attaindre", "attainder",
+ "attemting", "attempting",
+ "attemtped", "attempted",
+ "attendent", "attendant",
+ "attension", "attention",
+ "attirbute", "attribute",
+ "attirtion", "attrition",
+ "attmepted", "attempted",
+ "attractes", "attracts",
+ "attractin", "attraction",
+ "attributo", "attribution",
+ "attributs", "attributes",
+ "attritube", "attribute",
+ "auctionrs", "auctions",
+ "auidobook", "audiobook",
+ "auromated", "automated",
+ "australin", "australians",
+ "authroity", "authority",
+ "autoattak", "autoattack",
+ "autogrpah", "autograph",
+ "autonomos", "autonomous",
+ "auxillary", "auxiliary",
+ "avaialble", "available",
+ "availible", "available",
+ "avalaible", "available",
+ "avaliable", "available",
+ "averageed", "averaged",
+ "avialable", "available",
+ "awakenend", "awakened",
+ "awesomley", "awesomely",
+ "awkawrdly", "awkwardly",
+ "awnsering", "answering",
+ "bacehlors", "bachelors",
+ "bachelour", "bachelor",
+ "bachleors", "bachelors",
+ "bacholers", "bachelors",
+ "backdooor", "backdoor",
+ "backfeild", "backfield",
+ "backfiled", "backfield",
+ "backgroud", "background",
+ "backpakcs", "backpacks",
+ "badnwagon", "bandwagon",
+ "badnwidth", "bandwidth",
+ "balckjack", "blackjack",
+ "balcklist", "blacklist",
+ "balitmore", "baltimore",
+ "ballisitc", "ballistic",
+ "ballsitic", "ballistic",
+ "balsphemy", "blasphemy",
+ "bandiwdth", "bandwidth",
+ "bandwdith", "bandwidth",
+ "bandwidht", "bandwidth",
+ "bandwitdh", "bandwidth",
+ "bankrupcy", "bankruptcy",
+ "bankrupty", "bankruptcy",
+ "banruptcy", "bankruptcy",
+ "baordwalk", "boardwalk",
+ "barabrian", "barbarian",
+ "barbarain", "barbarian",
+ "barbarina", "barbarian",
+ "barcelets", "bracelets",
+ "barcleona", "barcelona",
+ "bareclona", "barcelona",
+ "barrackus", "barracks",
+ "bascially", "basically",
+ "bastardes", "bastards",
+ "bastardos", "bastards",
+ "bastardus", "bastards",
+ "bathrooom", "bathroom",
+ "batlimore", "baltimore",
+ "battailon", "battalion",
+ "battlaion", "battalion",
+ "beahviour", "behaviour",
+ "beauitful", "beautiful",
+ "beautifyl", "beautifully",
+ "becnhmark", "benchmark",
+ "becomeing", "becoming",
+ "becomming", "becoming",
+ "beehtoven", "beethoven",
+ "begginers", "beginners",
+ "beggining", "beginning",
+ "begininng", "beginning",
+ "beginnins", "beginnings",
+ "behaivors", "behaviors",
+ "behaivour", "behaviour",
+ "behavoirs", "behaviors",
+ "behavoiur", "behaviour",
+ "behvaiour", "behaviour",
+ "beleiving", "believing",
+ "beliveing", "believing",
+ "belssings", "blessings",
+ "bemusemnt", "bemusement",
+ "benchamrk", "benchmark",
+ "benchmars", "benchmarks",
+ "benedicat", "benedict",
+ "benedickt", "benedict",
+ "benghazhi", "benghazi",
+ "benghazzi", "benghazi",
+ "bergamont", "bergamot",
+ "berkelely", "berkeley",
+ "bersekrer", "berserker",
+ "berskerer", "berserker",
+ "beseiging", "besieging",
+ "bestialiy", "bestiality",
+ "beuatiful", "beautiful",
+ "biginning", "beginning",
+ "bigrading", "brigading",
+ "billbaord", "billboard",
+ "billboars", "billboards",
+ "binominal", "binomial",
+ "birgading", "brigading",
+ "birghtest", "brightest",
+ "birhtdays", "birthdays",
+ "bitcoints", "bitcoins",
+ "blackbery", "blackberry",
+ "blackhaws", "blackhawks",
+ "blackshit", "blacksmith",
+ "blanketts", "blankets",
+ "blapshemy", "blasphemy",
+ "blashpemy", "blasphemy",
+ "blaspehmy", "blasphemy",
+ "blasphmey", "blasphemy",
+ "blatanlty", "blatantly",
+ "blatimore", "baltimore",
+ "bleuberry", "blueberry",
+ "bleutooth", "bluetooth",
+ "blisteres", "blisters",
+ "blizzcoin", "blizzcon",
+ "blockchan", "blockchain",
+ "blockeras", "blockers",
+ "bloodbore", "bloodborne",
+ "boardband", "broadband",
+ "boardcast", "broadcast",
+ "bodyweigt", "bodyweight",
+ "bookamrks", "bookmarks",
+ "bookmakrs", "bookmarks",
+ "bookmarkd", "bookmarked",
+ "boradband", "broadband",
+ "boradcast", "broadcast",
+ "boradwalk", "boardwalk",
+ "bouregois", "bourgeois",
+ "bourgeios", "bourgeois",
+ "bourgoeis", "bourgeois",
+ "boyfirend", "boyfriend",
+ "boyfreind", "boyfriend",
+ "boyfriens", "boyfriends",
+ "brabarian", "barbarian",
+ "bracelona", "barcelona",
+ "braodband", "broadband",
+ "braodcast", "broadcast",
+ "brazilias", "brazilians",
+ "breakdows", "breakdowns",
+ "breserker", "berserker",
+ "bretheren", "brethren",
+ "bridaging", "brigading",
+ "brightern", "brighten",
+ "brigthest", "brightest",
+ "brilliany", "brilliantly",
+ "brithdays", "birthdays",
+ "broadwalk", "boardwalk",
+ "bruiseres", "bruisers",
+ "brunettte", "brunette",
+ "brusseles", "brussels",
+ "brussells", "brussels",
+ "brutailty", "brutality",
+ "brutallly", "brutally",
+ "buddhisim", "buddhism",
+ "buddihsts", "buddhists",
+ "buddishts", "buddhists",
+ "buhddists", "buddhists",
+ "buidlings", "buildings",
+ "bulidings", "buildings",
+ "burgunday", "burgundy",
+ "burgundry", "burgundy",
+ "burritoes", "burritos",
+ "burtality", "brutality",
+ "busineses", "business",
+ "businessa", "businessman",
+ "businesse", "businessmen",
+ "businesss", "businesses",
+ "bussiness", "business",
+ "buthcered", "butchered",
+ "butterlfy", "butterfly",
+ "cacausian", "caucasian",
+ "caclulate", "calculate",
+ "cacuasian", "caucasian",
+ "caculater", "calculator",
+ "cafeteira", "cafeteria",
+ "cafetiera", "cafeteria",
+ "caffeinne", "caffeine",
+ "calcualte", "calculate",
+ "californa", "california",
+ "caluclate", "calculate",
+ "calulated", "calculated",
+ "calulater", "calculator",
+ "cambirdge", "cambridge",
+ "cambrdige", "cambridge",
+ "cambrigde", "cambridge",
+ "camoflage", "camouflage",
+ "campagins", "campaigns",
+ "campaings", "campaigns",
+ "campiagns", "campaigns",
+ "campusers", "campuses",
+ "camrbidge", "cambridge",
+ "canadains", "canadians",
+ "candadate", "candidate",
+ "candidats", "candidates",
+ "cannister", "canister",
+ "cannoical", "canonical",
+ "canoncial", "canonical",
+ "capactior", "capacitor",
+ "capicator", "capacitor",
+ "capitalis", "capitals",
+ "caprenter", "carpenter",
+ "capsulers", "capsules",
+ "capsulets", "capsules",
+ "carachter", "character",
+ "cardbaord", "cardboard",
+ "cardborad", "cardboard",
+ "cardianls", "cardinals",
+ "cardnials", "cardinals",
+ "caridnals", "cardinals",
+ "carmalite", "carmelite",
+ "carnberry", "cranberry",
+ "carolinia", "carolina",
+ "carpetner", "carpenter",
+ "carptener", "carpenter",
+ "carribean", "caribbean",
+ "cartdrige", "cartridge",
+ "cartilege", "cartilage",
+ "cartirdge", "cartridge",
+ "cartrdige", "cartridge",
+ "cartrigde", "cartridge",
+ "casaulity", "causality",
+ "cashieres", "cashiers",
+ "cassawory", "cassowary",
+ "cassettte", "cassette",
+ "casuation", "causation",
+ "cataclsym", "cataclysm",
+ "cataclyms", "cataclysm",
+ "catacylsm", "cataclysm",
+ "catacyslm", "cataclysm",
+ "catalcysm", "cataclysm",
+ "catalgoue", "catalogue",
+ "cathderal", "cathedral",
+ "catherdal", "cathedral",
+ "cathloics", "catholics",
+ "cathredal", "cathedral",
+ "caucaisan", "caucasian",
+ "caucasain", "caucasian",
+ "causacian", "caucasian",
+ "causailty", "causality",
+ "celebirty", "celebrity",
+ "celebrato", "celebration",
+ "celebrite", "celebrities",
+ "celesital", "celestial",
+ "celestail", "celestial",
+ "cementary", "cemetery",
+ "cemetarey", "cemetery",
+ "cenitpede", "centipede",
+ "centepide", "centipede",
+ "centipeed", "centipede",
+ "centruies", "centuries",
+ "centuties", "centuries",
+ "cerebrawl", "cerebral",
+ "certanity", "certainty",
+ "certianty", "certainty",
+ "cesspoool", "cesspool",
+ "chairmain", "chairman",
+ "challange", "challenge",
+ "challengr", "challenger",
+ "challengs", "challenges",
+ "chameloen", "chameleon",
+ "champagen", "champagne",
+ "champange", "champagne",
+ "chandlure", "chandler",
+ "changable", "changeable",
+ "charactor", "character",
+ "chatedral", "cathedral",
+ "chatolics", "catholics",
+ "checkmeat", "checkmate",
+ "checkpoit", "checkpoints",
+ "chekcmate", "checkmate",
+ "chemestry", "chemistry",
+ "chemicaly", "chemically",
+ "chemsitry", "chemistry",
+ "chernboyl", "chernobyl",
+ "chernobly", "chernobyl",
+ "chernoybl", "chernobyl",
+ "chernyobl", "chernobyl",
+ "cheronbyl", "chernobyl",
+ "chidlfree", "childfree",
+ "chidlrens", "childrens",
+ "chihauhua", "chihuahua",
+ "chihuahau", "chihuahua",
+ "childbird", "childbirth",
+ "childerns", "childrens",
+ "childisch", "childish",
+ "childresn", "childrens",
+ "chirstian", "christian",
+ "chirstmas", "christmas",
+ "chiuhahua", "chihuahua",
+ "chlidfree", "childfree",
+ "chlidrens", "childrens",
+ "chocloate", "chocolate",
+ "chocoalte", "chocolate",
+ "chocolats", "chocolates",
+ "chocolste", "chocolates",
+ "cholocate", "chocolate",
+ "chrenobyl", "chernobyl",
+ "chrisitan", "christian",
+ "christain", "christian",
+ "christams", "christmas",
+ "chrsitian", "christian",
+ "chrsitmas", "christmas",
+ "churchers", "churches",
+ "cigaretts", "cigarettes",
+ "cigeratte", "cigarette",
+ "cilivians", "civilians",
+ "cilpboard", "clipboard",
+ "cilynders", "cylinders",
+ "circuitos", "circuits",
+ "ciriculum", "curriculum",
+ "cirticise", "criticise",
+ "civilains", "civilians",
+ "civillian", "civilian",
+ "classicos", "classics",
+ "classicus", "classics",
+ "classifiy", "classify",
+ "cleanisng", "cleansing",
+ "cleasning", "cleansing",
+ "clikcbait", "clickbait",
+ "clinicaly", "clinically",
+ "clipbaord", "clipboard",
+ "clitories", "clitoris",
+ "clitorios", "clitoris",
+ "clitorius", "clitoris",
+ "clucthing", "clutching",
+ "clutchign", "clutching",
+ "cluthcing", "clutching",
+ "coca cola", "coca-cola",
+ "cockatils", "cocktails",
+ "cocktials", "cocktails",
+ "cognizent", "cognizant",
+ "colateral", "collateral",
+ "collabore", "collaborate",
+ "collasped", "collapsed",
+ "collaspes", "collapses",
+ "colleauge", "colleague",
+ "collectes", "collects",
+ "collectie", "collective",
+ "collecton", "collection",
+ "collectos", "collectors",
+ "collegaue", "colleague",
+ "collegues", "colleagues",
+ "collisson", "collisions",
+ "collonade", "colonnade",
+ "collonies", "colonies",
+ "collpased", "collapsed",
+ "collpases", "collapses",
+ "colombina", "colombia",
+ "columbina", "columbia",
+ "comapnies", "companies",
+ "combatans", "combatants",
+ "combinato", "combination",
+ "combusion", "combustion",
+ "comestics", "cosmetics",
+ "comisions", "commissions",
+ "comission", "commission",
+ "comitting", "committing",
+ "commandes", "commands",
+ "commentar", "commentator",
+ "commentes", "commenters",
+ "commercie", "commerce",
+ "commision", "commission",
+ "commiteed", "commited",
+ "commiting", "committing",
+ "commitmet", "commitments",
+ "commments", "comments",
+ "commongly", "commonly",
+ "communiss", "communists",
+ "communite", "communities",
+ "communits", "communist",
+ "communsim", "communism",
+ "compaines", "companies",
+ "compalins", "complains",
+ "compalint", "compliant",
+ "comparisn", "comparisons",
+ "compeltes", "completes",
+ "competant", "competent",
+ "competend", "competed",
+ "competion", "competition",
+ "competive", "competitive",
+ "compilant", "compliant",
+ "compilare", "compiler",
+ "compilato", "compilation",
+ "compitent", "competent",
+ "complaind", "complained",
+ "complaing", "complaining",
+ "completen", "complement",
+ "completey", "completely",
+ "completin", "completion",
+ "complians", "complains",
+ "componant", "component",
+ "comprable", "comparable",
+ "compresas", "compress",
+ "compreses", "compress",
+ "compteurs", "computers",
+ "comptuers", "computers",
+ "computato", "computation",
+ "comradets", "comrades",
+ "comsetics", "cosmetics",
+ "conanical", "canonical",
+ "conatiner", "container",
+ "concelaed", "concealed",
+ "concelaer", "concealer",
+ "concelear", "concealer",
+ "concensus", "consensus",
+ "conceptos", "concepts",
+ "conceptul", "conceptual",
+ "concernig", "concerning",
+ "concertas", "concerts",
+ "concevied", "conceived",
+ "conciders", "considers",
+ "concieted", "conceited",
+ "concieved", "conceived",
+ "conclusie", "conclusive",
+ "concsious", "conscious",
+ "concurret", "concurrent",
+ "condamned", "condemned",
+ "condemend", "condemned",
+ "condemmed", "condemned",
+ "condemnig", "condemning",
+ "condenmed", "condemned",
+ "condesend", "condensed",
+ "condesned", "condensed",
+ "condmened", "condemned",
+ "conection", "connection",
+ "conenctor", "connector",
+ "conferene", "conferences",
+ "confessin", "confession",
+ "confideny", "confidently",
+ "confilcts", "conflicts",
+ "confimred", "confirmed",
+ "confirmas", "confirms",
+ "conflcits", "conflicts",
+ "confrimed", "confirmed",
+ "congitive", "cognitive",
+ "conlcuded", "concluded",
+ "connectes", "connects",
+ "connectit", "connecticut",
+ "connectos", "connectors",
+ "conquerer", "conqueror",
+ "consdider", "consider",
+ "consensul", "consensual",
+ "conserned", "concerned",
+ "consicous", "conscious",
+ "considerd", "considered",
+ "considert", "considerate",
+ "consisent", "consistent",
+ "consistes", "consists",
+ "consolato", "consolation",
+ "consolide", "consolidate",
+ "consonent", "consonant",
+ "constanly", "constantly",
+ "constanst", "constants",
+ "constanty", "constantly",
+ "constasnt", "constants",
+ "constitue", "constitutes",
+ "constrait", "constraints",
+ "construcs", "constructs",
+ "construde", "construed",
+ "construst", "constructs",
+ "constucts", "constructs",
+ "constured", "construed",
+ "consulant", "consultant",
+ "consultat", "consultant",
+ "consumate", "consummate",
+ "contactes", "contacts",
+ "contactos", "contacts",
+ "contagios", "contagious",
+ "containes", "contains",
+ "containig", "containing",
+ "containts", "contains",
+ "contemple", "contemplate",
+ "contendor", "contender",
+ "contentas", "contents",
+ "contentes", "contents",
+ "contentos", "contents",
+ "contestas", "contests",
+ "contestat", "contestants",
+ "contestes", "contests",
+ "contextes", "contexts",
+ "contextos", "contexts",
+ "contianer", "container",
+ "contibute", "contribute",
+ "contigent", "contingent",
+ "continant", "continental",
+ "continens", "continents",
+ "continous", "continuous",
+ "continuos", "continuous",
+ "continute", "continue",
+ "contiunal", "continual",
+ "contracto", "contraction",
+ "contribue", "contribute",
+ "contribuo", "contributor",
+ "controlas", "controls",
+ "controled", "controlled",
+ "controles", "controls",
+ "controlls", "controls",
+ "convenant", "covenant",
+ "convencen", "convenience",
+ "conveniet", "convenient",
+ "conversie", "converse",
+ "conversin", "conversions",
+ "convertie", "convertible",
+ "convertis", "converts",
+ "cooldwons", "cooldowns",
+ "coordinar", "coordinator",
+ "copenhagn", "copenhagen",
+ "coprorate", "corporate",
+ "copywrite", "copyright",
+ "corcodile", "crocodile",
+ "corparate", "corporate",
+ "corproate", "corporate",
+ "correclty", "correctly",
+ "correctin", "correction",
+ "correlato", "correlation",
+ "corridoor", "corridor",
+ "corruptin", "corruption",
+ "corssfire", "crossfire",
+ "corsshair", "crosshair",
+ "corsspost", "crosspost",
+ "coruching", "crouching",
+ "cosemtics", "cosmetics",
+ "costumise", "costumes",
+ "counciles", "councils",
+ "councills", "councils",
+ "councilos", "councils",
+ "countains", "contains",
+ "counteres", "counters",
+ "countires", "countries",
+ "courching", "crouching",
+ "courtesey", "courtesy",
+ "courtesty", "courtesy",
+ "coururier", "courier",
+ "coutnered", "countered",
+ "crapenter", "carpenter",
+ "creativey", "creatively",
+ "creedence", "credence",
+ "crhistmas", "christmas",
+ "cricketts", "crickets",
+ "criminaly", "criminally",
+ "critereon", "criterion",
+ "criterias", "criteria",
+ "criticaly", "critically",
+ "criticies", "criticise",
+ "criticisn", "criticising",
+ "critisice", "criticise",
+ "critisicm", "criticism",
+ "critising", "criticising",
+ "critisism", "criticism",
+ "critisize", "criticise",
+ "critizing", "criticizing",
+ "crosshiar", "crosshair",
+ "crossifre", "crossfire",
+ "crticised", "criticised",
+ "crusdaers", "crusaders",
+ "crutchers", "crutches",
+ "crystalls", "crystals",
+ "crystalus", "crystals",
+ "crystalys", "crystals",
+ "cuacasian", "caucasian",
+ "cuasality", "causality",
+ "culitvate", "cultivate",
+ "culturaly", "culturally",
+ "culturels", "cultures",
+ "curiostiy", "curiosity",
+ "curisoity", "curiosity",
+ "currenlty", "currently",
+ "curriculm", "curriculum",
+ "cursaders", "crusaders",
+ "custcenes", "cutscenes",
+ "cutsceens", "cutscenes",
+ "cutscence", "cutscene",
+ "cutsences", "cutscenes",
+ "cyclinder", "cylinder",
+ "cyclistes", "cyclists",
+ "cylindres", "cylinders",
+ "cynicisim", "cynicism",
+ "dahsboard", "dashboard",
+ "dalmation", "dalmatian",
+ "dangeroys", "dangerously",
+ "dashbaord", "dashboard",
+ "daugthers", "daughters",
+ "davantage", "advantage",
+ "deadlfits", "deadlifts",
+ "deadpoool", "deadpool",
+ "dealershp", "dealerships",
+ "deathmath", "deathmatch",
+ "decalring", "declaring",
+ "decendant", "descendant",
+ "decendent", "descendant",
+ "decipting", "depicting",
+ "deciption", "depiction",
+ "decisivie", "decisive",
+ "declarase", "declares",
+ "declarees", "declares",
+ "decoratie", "decorative",
+ "decoratin", "decorations",
+ "decpetion", "deception",
+ "decpetive", "deceptive",
+ "decribing", "describing",
+ "decsended", "descended",
+ "deductibe", "deductible",
+ "defaintly", "defiantly",
+ "defaltion", "deflation",
+ "defanitly", "defiantly",
+ "defeintly", "definetly",
+ "defendent", "defendant",
+ "defensese", "defenseless",
+ "defianlty", "defiantly",
+ "deficeint", "deficient",
+ "deficieny", "deficiency",
+ "deficites", "deficits",
+ "definance", "defiance",
+ "definatey", "definately",
+ "definatly", "definitely",
+ "definetly", "definitely",
+ "definetyl", "definetly",
+ "definilty", "definitly",
+ "definitie", "definitive",
+ "definitin", "definitions",
+ "definitly", "definitely",
+ "definiton", "definition",
+ "definitve", "definite",
+ "definityl", "definitly",
+ "definltey", "definetly",
+ "defintaly", "defiantly",
+ "defintily", "definitly",
+ "defintion", "definition",
+ "defintley", "definetly",
+ "defitenly", "definetly",
+ "defitinly", "definitly",
+ "defitnaly", "defiantly",
+ "defitnely", "definetly",
+ "deflectin", "deflection",
+ "defnietly", "definetly",
+ "degeneret", "degenerate",
+ "degradato", "degradation",
+ "degradead", "degraded",
+ "degrassie", "degrasse",
+ "degrassse", "degrasse",
+ "deifnetly", "definetly",
+ "deifnitly", "definitly",
+ "deisgners", "designers",
+ "delagates", "delegates",
+ "delcaring", "declaring",
+ "delcining", "declining",
+ "delegatie", "delegate",
+ "delerious", "delirious",
+ "deleteing", "deleting",
+ "delfation", "deflation",
+ "deliveres", "delivers",
+ "deliverys", "delivers",
+ "delpoying", "deploying",
+ "demcorats", "democrats",
+ "deminsion", "dimension",
+ "democarcy", "democracy",
+ "democract", "democrat",
+ "demonstre", "demonstrate",
+ "denominar", "denominator",
+ "dentistas", "dentists",
+ "dentistes", "dentists",
+ "deomcrats", "democrats",
+ "deopsited", "deposited",
+ "deparment", "department",
+ "departmet", "departments",
+ "depciting", "depicting",
+ "depcition", "depiction",
+ "depection", "deception",
+ "depedency", "dependency",
+ "depicitng", "depicting",
+ "depiciton", "depiction",
+ "deplyoing", "deploying",
+ "depoisted", "deposited",
+ "depolying", "deploying",
+ "depositas", "deposits",
+ "deposites", "deposits",
+ "depositis", "deposits",
+ "depositos", "deposits",
+ "depostied", "deposited",
+ "depressie", "depressive",
+ "depressin", "depression",
+ "depserate", "desperate",
+ "depsoited", "deposited",
+ "descirbes", "describes",
+ "descision", "decision",
+ "desginers", "designers",
+ "desgining", "designing",
+ "desicions", "decisions",
+ "designade", "designated",
+ "designato", "designation",
+ "desingage", "disengage",
+ "desingers", "designers",
+ "desinging", "designing",
+ "desktopos", "desktops",
+ "desparate", "desperate",
+ "desperato", "desperation",
+ "despoited", "deposited",
+ "desriable", "desirable",
+ "dessigned", "designed",
+ "destinato", "destination",
+ "destoryed", "destroyed",
+ "destoryer", "destroyer",
+ "destroyes", "destroys",
+ "destructo", "destruction",
+ "destryoed", "destroyed",
+ "destryoer", "destroyer",
+ "desuction", "seduction",
+ "detailled", "detailed",
+ "detatched", "detached",
+ "detectivs", "detectives",
+ "deteriate", "deteriorate",
+ "determing", "determining",
+ "determins", "determines",
+ "developrs", "develops",
+ "diabetees", "diabetes",
+ "diablical", "diabolical",
+ "diagonaal", "diagonal",
+ "diagonsed", "diagnosed",
+ "diagonsis", "diagnosis",
+ "diagramas", "diagrams",
+ "diagramms", "diagrams",
+ "dialectes", "dialects",
+ "dialectos", "dialects",
+ "diarrheoa", "diarrhea",
+ "diasbling", "disabling",
+ "dichomoty", "dichotomy",
+ "dicovered", "discovered",
+ "dictaters", "dictates",
+ "dictionay", "dictionary",
+ "difenitly", "definitly",
+ "diferrent", "different",
+ "differene", "differences",
+ "differens", "differences",
+ "differeny", "differently",
+ "difficuly", "difficulty",
+ "diffucult", "difficult",
+ "dificulty", "difficulty",
+ "diganosed", "diagnosed",
+ "diganosis", "diagnosis",
+ "dimenions", "dimensions",
+ "dimention", "dimension",
+ "dimesnion", "dimension",
+ "diminishs", "diminishes",
+ "dinasours", "dinosaurs",
+ "dinosuars", "dinosaurs",
+ "dinsoaurs", "dinosaurs",
+ "dionsaurs", "dinosaurs",
+ "diphtongs", "diphthongs",
+ "dipthongs", "diphthongs",
+ "direcotry", "directory",
+ "directoty", "directory",
+ "directroy", "directory",
+ "disapears", "disappears",
+ "disaprity", "disparity",
+ "disastros", "disastrous",
+ "disatrous", "disastrous",
+ "disbaling", "disabling",
+ "disbeleif", "disbelief",
+ "disbelife", "disbelief",
+ "disciplen", "disciplines",
+ "disclamer", "disclaimer",
+ "disclosue", "disclosure",
+ "disconnet", "disconnect",
+ "discosure", "discourse",
+ "discoverd", "discovered",
+ "discovere", "discoveries",
+ "discredid", "discredited",
+ "discribed", "described",
+ "discribes", "describes",
+ "discussin", "discussion",
+ "diserable", "desirable",
+ "disgarees", "disagrees",
+ "disgiused", "disguised",
+ "disgusied", "disguised",
+ "disgustes", "disgusts",
+ "disgustos", "disgusts",
+ "disgustus", "disgusts",
+ "dishonesy", "dishonesty",
+ "dishonord", "dishonored",
+ "disicples", "disciples",
+ "dismantel", "dismantle",
+ "dismisals", "dismissal",
+ "disnegage", "disengage",
+ "dispairty", "disparity",
+ "dispalyed", "displayed",
+ "dispartiy", "disparity",
+ "dispenced", "dispensed",
+ "dispeners", "dispenser",
+ "displayes", "displays",
+ "disruptin", "disruption",
+ "dissapear", "disappear",
+ "dissarray", "disarray",
+ "dissmisal", "dismissal",
+ "disspiate", "dissipate",
+ "distincte", "distinctive",
+ "distrcits", "districts",
+ "distribue", "distributed",
+ "distrubed", "disturbed",
+ "distrupts", "distrust",
+ "disturben", "disturbance",
+ "diverisfy", "diversify",
+ "diveristy", "diversity",
+ "diverstiy", "diversity",
+ "dividened", "dividend",
+ "divinitiy", "divinity",
+ "doccument", "document",
+ "docrtines", "doctrines",
+ "docuhebag", "douchebag",
+ "dogdammit", "goddammit",
+ "dogfather", "godfather",
+ "dolphines", "dolphins",
+ "domecracy", "democracy",
+ "domecrats", "democrats",
+ "domiantes", "dominates",
+ "dominatin", "domination",
+ "dominaton", "domination",
+ "dominiant", "dominant",
+ "donwgrade", "downgrade",
+ "donwloads", "downloads",
+ "donwsides", "downsides",
+ "donwvoted", "downvoted",
+ "donwvotes", "downvotes",
+ "doublelit", "doublelift",
+ "doucehbag", "douchebag",
+ "downgarde", "downgrade",
+ "downlaods", "downloads",
+ "downloaad", "download",
+ "downovted", "downvoted",
+ "dravadian", "dravidian",
+ "drummless", "drumless",
+ "dsyphoria", "dysphoria",
+ "dsytopian", "dystopian",
+ "duaghters", "daughters",
+ "duplicats", "duplicates",
+ "durabiliy", "durability",
+ "dynamicus", "dynamics",
+ "dypshoria", "dysphoria",
+ "dyshporia", "dysphoria",
+ "dysoptian", "dystopian",
+ "dysphoira", "dysphoria",
+ "dysphroia", "dysphoria",
+ "dyspohria", "dysphoria",
+ "dyspotian", "dystopian",
+ "dystopain", "dystopian",
+ "dystpoian", "dystopian",
+ "eachohter", "eachother",
+ "eachotehr", "eachother",
+ "eachtoher", "eachother",
+ "earpluggs", "earplugs",
+ "earthboud", "earthbound",
+ "eastwoood", "eastwood",
+ "eastwoord", "eastwood",
+ "ecclectic", "eclectic",
+ "ecomonics", "economics",
+ "edficient", "deficient",
+ "effecient", "efficient",
+ "efficeint", "efficient",
+ "efficency", "efficiency",
+ "efficieny", "efficiency",
+ "effulence", "effluence",
+ "egalitara", "egalitarian",
+ "egpytians", "egyptians",
+ "egyptains", "egyptians",
+ "egytpians", "egyptians",
+ "ehtically", "ethically",
+ "ehtnicity", "ethnicity",
+ "eighteeen", "eighteen",
+ "eitquette", "etiquette",
+ "ejacualte", "ejaculate",
+ "electivre", "elective",
+ "electorns", "electrons",
+ "electrial", "electrical",
+ "electricy", "electricity",
+ "electroal", "electoral",
+ "elementay", "elementary",
+ "elepahnts", "elephants",
+ "eliminase", "eliminates",
+ "eliminato", "elimination",
+ "ellignton", "ellington",
+ "ellingotn", "ellington",
+ "eloquenty", "eloquently",
+ "elsehwere", "elsewhere",
+ "emapthize", "empathize",
+ "embarress", "embarrassed",
+ "emmisarry", "emissary",
+ "emmisions", "emissions",
+ "emmitting", "emitting",
+ "empahsize", "emphasize",
+ "emperical", "empirical",
+ "emphaised", "emphasised",
+ "emphatize", "empathize",
+ "emphazise", "emphasize",
+ "emphysyma", "emphysema",
+ "empitness", "emptiness",
+ "employeer", "employer",
+ "employeur", "employer",
+ "empolyees", "employees",
+ "emtpiness", "emptiness",
+ "emualtion", "emulation",
+ "enahncing", "enhancing",
+ "enchantig", "enchanting",
+ "enclousre", "enclosure",
+ "enclsoure", "enclosure",
+ "encolsure", "enclosure",
+ "encompase", "encompass",
+ "enconding", "encoding",
+ "encounted", "encountered",
+ "encrpyted", "encrypted",
+ "encrytped", "encrypted",
+ "encyrpted", "encrypted",
+ "endangerd", "endangered",
+ "enevlopes", "envelopes",
+ "enforcees", "enforces",
+ "engagemet", "engagements",
+ "engagment", "engagement",
+ "engieneer", "engineer",
+ "engineeer", "engineer",
+ "engineerd", "engineered",
+ "enhacning", "enhancing",
+ "enhanceds", "enhances",
+ "enligthen", "enlighten",
+ "enourmous", "enormous",
+ "ensconsed", "ensconced",
+ "enthicity", "ethnicity",
+ "enthusiam", "enthusiasm",
+ "enthusiat", "enthusiast",
+ "entirelly", "entirely",
+ "entitlied", "entitled",
+ "enveloppe", "envelope",
+ "epidsodes", "episodes",
+ "epilepsey", "epilepsy",
+ "epiphanny", "epiphany",
+ "episonage", "espionage",
+ "epscially", "specially",
+ "epsionage", "espionage",
+ "eqautions", "equations",
+ "equialent", "equivalent",
+ "equivalet", "equivalents",
+ "ermington", "remington",
+ "erroenous", "erroneous",
+ "escalatie", "escalate",
+ "escalatin", "escalation",
+ "esitmated", "estimated",
+ "esitmates", "estimates",
+ "eslewhere", "elsewhere",
+ "especialy", "especially",
+ "espianoge", "espionage",
+ "espinoage", "espionage",
+ "espoinage", "espionage",
+ "esponiage", "espionage",
+ "espressso", "espresso",
+ "essencial", "essential",
+ "essentail", "essential",
+ "essentias", "essentials",
+ "essentual", "essential",
+ "essesital", "essential",
+ "estiamted", "estimated",
+ "estiamtes", "estimates",
+ "estimatin", "estimation",
+ "ethcially", "ethically",
+ "ethincity", "ethnicity",
+ "ethnicaly", "ethnically",
+ "ethniticy", "ethnicity",
+ "etmyology", "etymology",
+ "euclidian", "euclidean",
+ "euorpeans", "europeans",
+ "euphoriac", "euphoric",
+ "euphorica", "euphoria",
+ "europenas", "europeans",
+ "europians", "europeans",
+ "eurpoeans", "europeans",
+ "evangelia", "evangelical",
+ "evelation", "elevation",
+ "evenlopes", "envelopes",
+ "eventally", "eventually",
+ "eventualy", "eventually",
+ "everthing", "everything",
+ "evertyime", "everytime",
+ "everwhere", "everywhere",
+ "everyoens", "everyones",
+ "everyteim", "everytime",
+ "everytiem", "everytime",
+ "everyting", "everything",
+ "eveyrones", "everyones",
+ "evreyones", "everyones",
+ "evreytime", "everytime",
+ "exagerate", "exaggerate",
+ "exahusted", "exhausted",
+ "exapnsive", "expansive",
+ "exauhsted", "exhausted",
+ "excahnges", "exchanges",
+ "excecuted", "executed",
+ "excecutes", "executes",
+ "excellant", "excellent",
+ "excercise", "exercise",
+ "excerised", "exercised",
+ "excerises", "exercises",
+ "exceuting", "executing",
+ "exchnages", "exchanges",
+ "exclsuive", "exclusive",
+ "excludeds", "excludes",
+ "exclusivs", "exclusives",
+ "exclusivy", "exclusivity",
+ "excpetion", "exception",
+ "exculding", "excluding",
+ "exculsion", "exclusion",
+ "exculsive", "exclusive",
+ "execising", "exercising",
+ "execption", "exception",
+ "exectuing", "executing",
+ "exectuion", "execution",
+ "exectuive", "executive",
+ "executabe", "executable",
+ "exepmtion", "exemption",
+ "exerbated", "exacerbated",
+ "exercices", "exercise",
+ "exerciese", "exercises",
+ "exercizes", "exercise",
+ "exersices", "exercises",
+ "exhasuted", "exhausted",
+ "exhaustin", "exhaustion",
+ "exhibites", "exhibits",
+ "exhibitin", "exhibition",
+ "exhibtion", "exhibition",
+ "exhuasted", "exhausted",
+ "exibition", "exhibition",
+ "existance", "existence",
+ "existenta", "existential",
+ "existince", "existence",
+ "existnace", "existance",
+ "exlcuding", "excluding",
+ "exlcusion", "exclusion",
+ "exlcusive", "exclusive",
+ "exlpoding", "exploding",
+ "exlporers", "explorers",
+ "exlposion", "explosion",
+ "exonorate", "exonerate",
+ "expalined", "explained",
+ "expanisve", "expansive",
+ "expatriot", "expatriate",
+ "expectany", "expectancy",
+ "expection", "exception",
+ "expemtion", "exemption",
+ "experimet", "experiments",
+ "explaines", "explains",
+ "explainig", "explaining",
+ "explaning", "explaining",
+ "expliciet", "explicit",
+ "explicity", "explicitly",
+ "explictly", "explicitly",
+ "explioted", "exploited",
+ "explodeds", "explodes",
+ "exploites", "exploits",
+ "explorare", "explorer",
+ "explotied", "exploited",
+ "expolding", "exploding",
+ "expolited", "exploited",
+ "expolsion", "explosion",
+ "expolsive", "explosive",
+ "expressie", "expressive",
+ "expressin", "expression",
+ "exsitance", "existance",
+ "extention", "extension",
+ "exteriour", "exterior",
+ "extermely", "extremely",
+ "extermism", "extremism",
+ "extermist", "extremist",
+ "externaly", "externally",
+ "extractin", "extraction",
+ "extrapole", "extrapolate",
+ "extreemly", "extremely",
+ "extremers", "extremes",
+ "extremley", "extremely",
+ "extrotion", "extortion",
+ "eyeballls", "eyeballs",
+ "eyebrowes", "eyebrows",
+ "eyebrowns", "eyebrows",
+ "eyesahdow", "eyeshadow",
+ "eyeshdaow", "eyeshadow",
+ "eygptians", "egyptians",
+ "eytmology", "etymology",
+ "faceboook", "facebook",
+ "faciliate", "facilitate",
+ "facilites", "facilities",
+ "facilitiy", "facility",
+ "facinated", "fascinated",
+ "facutally", "factually",
+ "familiair", "familiar",
+ "familiare", "familiarize",
+ "familiary", "familiarity",
+ "familliar", "familiar",
+ "fanaticas", "fanatics",
+ "fanaticos", "fanatics",
+ "fanaticus", "fanatics",
+ "fanatsies", "fantasies",
+ "fanatsize", "fantasize",
+ "fandation", "foundation",
+ "fanservie", "fanservice",
+ "fantazise", "fantasize",
+ "farenheit", "fahrenheit",
+ "fascistes", "fascists",
+ "fashoined", "fashioned",
+ "favorties", "favorites",
+ "favoruite", "favourite",
+ "favourits", "favourites",
+ "favourtie", "favourite",
+ "fedreally", "federally",
+ "feminisim", "feminism",
+ "feminsits", "feminists",
+ "femminist", "feminist",
+ "fesitvals", "festivals",
+ "fetishers", "fetishes",
+ "fightings", "fighting",
+ "filetimes", "lifetimes",
+ "filiament", "filament",
+ "filmmakes", "filmmakers",
+ "fingernal", "fingernails",
+ "flashligt", "flashlight",
+ "flavorade", "flavored",
+ "flavoures", "flavours",
+ "flavourus", "flavours",
+ "flawlessy", "flawlessly",
+ "flexibily", "flexibility",
+ "fluctaute", "fluctuate",
+ "flucutate", "fluctuate",
+ "fluttersy", "fluttershy",
+ "follwoing", "following",
+ "foootball", "football",
+ "forcefuly", "forcefully",
+ "forcibley", "forcibly",
+ "forciblly", "forcibly",
+ "forearmes", "forearms",
+ "foreginer", "foreigner",
+ "foregroud", "foreground",
+ "foreinger", "foreigner",
+ "forgeiner", "foreigner",
+ "forgiener", "foreigner",
+ "forgivens", "forgiveness",
+ "foriegner", "foreigner",
+ "forigener", "foreigner",
+ "formerlly", "formerly",
+ "formualte", "formulate",
+ "formulaes", "formulas",
+ "formulars", "formulas",
+ "forntline", "frontline",
+ "forntpage", "frontpage",
+ "fortuante", "fortunate",
+ "forumlate", "formulate",
+ "foundatin", "foundations",
+ "fourteeen", "fourteen",
+ "fractales", "fractals",
+ "fractalis", "fractals",
+ "fractalus", "fractals",
+ "fragement", "fragment",
+ "fragmenot", "fragment",
+ "franchies", "franchise",
+ "francsico", "francisco",
+ "franscico", "francisco",
+ "frecklers", "freckles",
+ "freedomes", "freedoms",
+ "freestlye", "freestyle",
+ "freesytle", "freestyle",
+ "fremented", "fermented",
+ "freqeuncy", "frequency",
+ "frequence", "frequencies",
+ "friendlis", "friendlies",
+ "frightend", "frightened",
+ "fromation", "formation",
+ "frontapge", "frontpage",
+ "frontilne", "frontline",
+ "frustrato", "frustration",
+ "frustrats", "frustrates",
+ "fucntions", "functions",
+ "fullscren", "fullscreen",
+ "funcitons", "functions",
+ "functiong", "functioning",
+ "functtion", "function",
+ "furiosuly", "furiously",
+ "furiuosly", "furiously",
+ "futuristc", "futuristic",
+ "gagnsters", "gangsters",
+ "galations", "galatians",
+ "galdiator", "gladiator",
+ "gallaxies", "galaxies",
+ "garanteed", "guaranteed",
+ "garantees", "guarantees",
+ "garuantee", "guarantee",
+ "gatherins", "gatherings",
+ "gauntelts", "gauntlets",
+ "gauntlent", "gauntlet",
+ "gaurantee", "guarantee",
+ "gaurentee", "guarantee",
+ "genatilia", "genitalia",
+ "geneology", "genealogy",
+ "generalbs", "generals",
+ "generalis", "generals",
+ "generaste", "generates",
+ "generatie", "generate",
+ "generatin", "generations",
+ "generatos", "generators",
+ "genitaila", "genitalia",
+ "genitales", "genitals",
+ "genitalis", "genitals",
+ "geniunely", "genuinely",
+ "gentailia", "genitalia",
+ "gentelmen", "gentlemen",
+ "gentialia", "genitalia",
+ "genuienly", "genuinely",
+ "genuinley", "genuinely",
+ "geogrpahy", "geography",
+ "germaniac", "germanic",
+ "geurrilla", "guerrilla",
+ "gimmickey", "gimmicky",
+ "gimmickly", "gimmicky",
+ "girlfried", "girlfriend",
+ "goalkeepr", "goalkeeper",
+ "godafther", "godfather",
+ "godspeeed", "godspeed",
+ "goegraphy", "geography",
+ "goldfisch", "goldfish",
+ "goosebums", "goosebumps",
+ "gorvement", "goverment",
+ "govemrent", "goverment",
+ "govenment", "government",
+ "goverance", "governance",
+ "goveremnt", "goverment",
+ "goverment", "government",
+ "govermetn", "goverment",
+ "govermnet", "goverment",
+ "governmet", "governments",
+ "govorment", "government",
+ "govrement", "goverment",
+ "gracefull", "graceful",
+ "gracefuly", "gracefully",
+ "graduaste", "graduates",
+ "graduatin", "graduation",
+ "grahpical", "graphical",
+ "grativate", "gravitate",
+ "graudally", "gradually",
+ "graudates", "graduates",
+ "greenalnd", "greenland",
+ "grenaders", "grenades",
+ "grpahical", "graphical",
+ "guadulupe", "guadalupe",
+ "guaranted", "guaranteed",
+ "guarantes", "guarantees",
+ "guardains", "guardians",
+ "guarentee", "guarantee",
+ "guaridans", "guardians",
+ "guatamala", "guatemala",
+ "guerrilas", "guerrillas",
+ "guradians", "guardians",
+ "guranteed", "guaranteed",
+ "gurantees", "guarantees",
+ "gutiarist", "guitarist",
+ "habsbourg", "habsburg",
+ "hairstlye", "hairstyle",
+ "hairsytle", "hairstyle",
+ "halarious", "hilarious",
+ "hambruger", "hamburger",
+ "hamburges", "hamburgers",
+ "hamphsire", "hampshire",
+ "hamsphire", "hampshire",
+ "handboook", "handbook",
+ "handedley", "handedly",
+ "handedlly", "handedly",
+ "handicape", "handicapped",
+ "hapmshire", "hampshire",
+ "happended", "happened",
+ "happenend", "happened",
+ "happenned", "happened",
+ "harasment", "harassment",
+ "hardenend", "hardened",
+ "hardwoord", "hardwood",
+ "haristyle", "hairstyle",
+ "harrasing", "harassing",
+ "harrassed", "harassed",
+ "harrasses", "harassed",
+ "hdinsight", "hindsight",
+ "headahces", "headaches",
+ "headhpone", "headphone",
+ "headshoot", "headshot",
+ "healither", "healthier",
+ "healtheir", "healthier",
+ "healthiet", "healthiest",
+ "healthire", "healthier",
+ "heapdhone", "headphone",
+ "hedgehoog", "hedgehog",
+ "hedgehorg", "hedgehog",
+ "heightend", "heightened",
+ "heirarchy", "hierarchy",
+ "herculase", "hercules",
+ "herculeas", "hercules",
+ "herculees", "hercules",
+ "herculeus", "hercules",
+ "heriarchy", "hierarchy",
+ "hesistant", "hesitant",
+ "hesistate", "hesitate",
+ "hesitatin", "hesitation",
+ "hieroglph", "hieroglyph",
+ "highschol", "highschool",
+ "hindisght", "hindsight",
+ "hindrence", "hindrance",
+ "hinduisim", "hinduism",
+ "hinduisum", "hinduism",
+ "hipsanics", "hispanics",
+ "hirearchy", "hierarchy",
+ "hirsohima", "hiroshima",
+ "hispancis", "hispanics",
+ "hitboxers", "hitboxes",
+ "hoepfully", "hopefully",
+ "holocasut", "holocaust",
+ "holocuast", "holocaust",
+ "homeonwer", "homeowner",
+ "homeopaty", "homeopathy",
+ "homewolrd", "homeworld",
+ "homewoner", "homeowner",
+ "homewrold", "homeworld",
+ "homogenes", "homogeneous",
+ "homosexul", "homosexuals",
+ "hopelessy", "hopelessly",
+ "hopsitals", "hospitals",
+ "horishima", "hiroshima",
+ "horizones", "horizons",
+ "horizonts", "horizons",
+ "horrendos", "horrendous",
+ "horribley", "horribly",
+ "horriblly", "horribly",
+ "horrifing", "horrifying",
+ "hositlity", "hostility",
+ "hospitaly", "hospitality",
+ "hosptials", "hospitals",
+ "hourgalss", "hourglass",
+ "hourlgass", "hourglass",
+ "househols", "households",
+ "humanitis", "humanities",
+ "humanoind", "humanoid",
+ "humiditiy", "humidity",
+ "hunagrian", "hungarian",
+ "hurriance", "hurricane",
+ "hurricans", "hurricanes",
+ "husbandos", "husbands",
+ "hydraluic", "hydraulic",
+ "hydropile", "hydrophile",
+ "hydropobe", "hydrophobe",
+ "hydrualic", "hydraulic",
+ "hyopcrite", "hypocrite",
+ "hypcorite", "hypocrite",
+ "hyperoble", "hyperbole",
+ "hypocracy", "hypocrisy",
+ "hypocrasy", "hypocrisy",
+ "hypocricy", "hypocrisy",
+ "hypocriet", "hypocrite",
+ "hypocrits", "hypocrites",
+ "hyporcite", "hypocrite",
+ "hypothess", "hypotheses",
+ "hyprocisy", "hypocrisy",
+ "hyprocite", "hypocrite",
+ "hyrdation", "hydration",
+ "hyrdaulic", "hydraulic",
+ "hysterica", "hysteria",
+ "hysteriia", "hysteria",
+ "iburpofen", "ibuprofen",
+ "icleandic", "icelandic",
+ "icongnito", "incognito",
+ "idealisim", "idealism",
+ "idealistc", "idealistic",
+ "identifer", "identifier",
+ "identifiy", "identify",
+ "ideologis", "ideologies",
+ "ignornace", "ignorance",
+ "illegales", "illegals",
+ "illegalis", "illegals",
+ "illegalls", "illegals",
+ "illnesess", "illnesses",
+ "illsuions", "illusions",
+ "illuminai", "illuminati",
+ "imagenary", "imaginary",
+ "imaginery", "imaginary",
+ "imaptient", "impatient",
+ "imigrated", "emigrated",
+ "immensley", "immensely",
+ "immerisve", "immersive",
+ "immesnely", "immensely",
+ "immidiate", "immediate",
+ "immigrato", "immigration",
+ "immitated", "imitated",
+ "immitator", "imitator",
+ "immobilie", "immobile",
+ "immobille", "immobile",
+ "immobilze", "immobile",
+ "immortaly", "immortality",
+ "immserive", "immersive",
+ "impaitent", "impatient",
+ "imparital", "impartial",
+ "impedence", "impedance",
+ "implantes", "implants",
+ "implicati", "implicit",
+ "impliciet", "implicit",
+ "implicity", "implicitly",
+ "impliment", "implement",
+ "implusive", "impulsive",
+ "importamt", "important",
+ "importend", "imported",
+ "imporving", "improving",
+ "impossibe", "impossible",
+ "imprefect", "imperfect",
+ "impressin", "impressions",
+ "imprioned", "imprisoned",
+ "improbabe", "improbable",
+ "impulisve", "impulsive",
+ "impuslive", "impulsive",
+ "imrpoving", "improving",
+ "inadequet", "inadequate",
+ "inadquate", "inadequate",
+ "inaugures", "inaugurates",
+ "inbalance", "imbalance",
+ "inbeetwen", "inbetween",
+ "inbetween", "between",
+ "inbewteen", "inbetween",
+ "incarnato", "incarnation",
+ "incgonito", "incognito",
+ "inclinato", "inclination",
+ "includeds", "includes",
+ "incoginto", "incognito",
+ "incongito", "incognito",
+ "incorpore", "incorporate",
+ "incpetion", "inception",
+ "incredibe", "incredible",
+ "incrediby", "incredibly",
+ "inculding", "including",
+ "incunabla", "incunabula",
+ "indicaste", "indicates",
+ "indicatie", "indicative",
+ "indicence", "incidence",
+ "indicents", "incidents",
+ "indigenos", "indigenous",
+ "indirecty", "indirectly",
+ "indisious", "insidious",
+ "individul", "individual",
+ "individus", "individuals",
+ "indoensia", "indonesia",
+ "indoneisa", "indonesia",
+ "indutrial", "industrial",
+ "inersting", "inserting",
+ "inexpense", "inexpensive",
+ "infallibe", "infallible",
+ "inferioir", "inferior",
+ "inferiour", "inferior",
+ "infestato", "infestation",
+ "infiltrar", "infiltrator",
+ "infinitey", "infinity",
+ "infinitie", "infinite",
+ "infinitiy", "infinity",
+ "infinitly", "infinity",
+ "inflatabe", "inflatable",
+ "influense", "influences",
+ "influenta", "influential",
+ "informate", "informative",
+ "infraread", "infrared",
+ "ingeniuty", "ingenuity",
+ "ingeunity", "ingenuity",
+ "ingocnito", "incognito",
+ "ingorance", "ignorance",
+ "inguenity", "ingenuity",
+ "inhabitat", "inhabitants",
+ "inheirted", "inherited",
+ "inhertied", "inherited",
+ "initailly", "initially",
+ "initalese", "initialese",
+ "initaling", "initialing",
+ "initalise", "initialise",
+ "initalism", "initialism",
+ "initalize", "initialize",
+ "initalled", "initialled",
+ "initation", "initiation",
+ "initiales", "initials",
+ "initiatie", "initiatives",
+ "initiatin", "initiation",
+ "initiatve", "initiate",
+ "injustics", "injustices",
+ "inlcuding", "including",
+ "inmigrant", "immigrant",
+ "innoucous", "innocuous",
+ "innovatin", "innovations",
+ "innovatve", "innovate",
+ "inpection", "inception",
+ "inpending", "impending",
+ "inproving", "improving",
+ "inpsector", "inspector",
+ "inpsiring", "inspiring",
+ "inquisito", "inquisition",
+ "inquisitr", "inquisitor",
+ "inresting", "inserting",
+ "insanelly", "insanely",
+ "insepctor", "inspector",
+ "insidiuos", "insidious",
+ "insipring", "inspiring",
+ "insluated", "insulated",
+ "inspectin", "inspection",
+ "instabilt", "instability",
+ "installes", "installs",
+ "installus", "installs",
+ "instering", "inserting",
+ "insticnts", "instincts",
+ "institude", "instituted",
+ "instituto", "institution",
+ "insualted", "insulated",
+ "insurence", "insurance",
+ "insurgeny", "insurgency",
+ "integirty", "integrity",
+ "integraal", "integral",
+ "integrade", "integrated",
+ "integrato", "integration",
+ "intenisty", "intensity",
+ "intensley", "intensely",
+ "interacte", "interactive",
+ "interents", "internets",
+ "interesat", "interest",
+ "interesst", "interests",
+ "interewbs", "interwebs",
+ "interfase", "interfaces",
+ "interfeer", "interfere",
+ "interfers", "interferes",
+ "intergate", "integrate",
+ "intergity", "integrity",
+ "interiour", "interior",
+ "internest", "internets",
+ "interpert", "interpret",
+ "interprut", "interrupt",
+ "interrups", "interrupts",
+ "interstae", "interstate",
+ "interveen", "intervene",
+ "intervied", "interviewed",
+ "intervier", "interviewer",
+ "intervies", "interviews",
+ "intesnely", "intensely",
+ "intesnity", "intensity",
+ "intestins", "intestines",
+ "intialize", "initialize",
+ "inticrate", "intricate",
+ "intimidad", "intimidated",
+ "intircate", "intricate",
+ "intiution", "intuition",
+ "intiutive", "intuitive",
+ "intorduce", "introduce",
+ "intorvert", "introvert",
+ "intracite", "intricate",
+ "intrduced", "introduced",
+ "intregity", "integrity",
+ "intrenets", "internets",
+ "intrepret", "interpret",
+ "intrerupt", "interrupt",
+ "intrewebs", "interwebs",
+ "intrinisc", "intrinsic",
+ "intrisinc", "intrinsic",
+ "intrisnic", "intrinsic",
+ "intriuged", "intrigued",
+ "introdued", "introduced",
+ "introduse", "introduces",
+ "introvers", "introverts",
+ "intruiged", "intrigued",
+ "intrument", "instrument",
+ "inutition", "intuition",
+ "inutitive", "intuitive",
+ "invaderas", "invaders",
+ "invalidas", "invalidates",
+ "inventios", "inventions",
+ "investige", "investigate",
+ "investmet", "investments",
+ "invincibe", "invincible",
+ "invloving", "involving",
+ "invovling", "involving",
+ "ipubrofen", "ibuprofen",
+ "iranianos", "iranians",
+ "irelevent", "irrelevant",
+ "ironicaly", "ironically",
+ "irritatie", "irritate",
+ "irritatin", "irritation",
+ "isalmists", "islamists",
+ "isalnders", "islanders",
+ "islamiskt", "islamist",
+ "islamsits", "islamists",
+ "islmaists", "islamists",
+ "isntaller", "installer",
+ "isntances", "instances",
+ "isntantly", "instantly",
+ "israelies", "israelis",
+ "israelits", "israelis",
+ "italianas", "italians",
+ "italianos", "italians",
+ "jailbrake", "jailbreak",
+ "jalibreak", "jailbreak",
+ "jamaicain", "jamaican",
+ "jersualem", "jerusalem",
+ "jeruselam", "jerusalem",
+ "jeruslaem", "jerusalem",
+ "journalis", "journals",
+ "judegment", "judgement",
+ "judgemant", "judgemental",
+ "judisuary", "judiciary",
+ "jugdement", "judgement",
+ "juggernat", "juggernaut",
+ "juvenille", "juvenile",
+ "keneysian", "keynesian",
+ "kentuckey", "kentucky",
+ "kenyesian", "keynesian",
+ "keybaords", "keyboards",
+ "keyensian", "keynesian",
+ "keyesnian", "keynesian",
+ "keynseian", "keynesian",
+ "keysenian", "keynesian",
+ "kilometes", "kilometers",
+ "kindapped", "kidnapped",
+ "kncokback", "knockback",
+ "knoweldge", "knowledge",
+ "knowlegde", "knowledge",
+ "konckback", "knockback",
+ "kryptonie", "kryptonite",
+ "labirynth", "labyrinth",
+ "laboratoy", "laboratory",
+ "laboreres", "laborers",
+ "labratory", "laboratory",
+ "labriynth", "labyrinth",
+ "labryinth", "labyrinth",
+ "labyrnith", "labyrinth",
+ "landscaps", "landscapes",
+ "landscspe", "landscapes",
+ "langauges", "languages",
+ "languague", "language",
+ "lanuchers", "launchers",
+ "lanugages", "languages",
+ "larington", "arlington",
+ "latitudie", "latitude",
+ "lattitude", "latitude",
+ "laucnhers", "launchers",
+ "laucnhing", "launching",
+ "launchign", "launching",
+ "laybrinth", "labyrinth",
+ "lebanesse", "lebanese",
+ "leceister", "leicester",
+ "leciester", "leicester",
+ "legitmate", "legitimate",
+ "legnedary", "legendary",
+ "lesbianas", "lesbians",
+ "lesbianus", "lesbians",
+ "letivicus", "leviticus",
+ "leutenant", "lieutenant",
+ "levaithan", "leviathan",
+ "levellign", "levelling",
+ "levetated", "levitated",
+ "levetates", "levitates",
+ "levicitus", "leviticus",
+ "levleling", "levelling",
+ "lfiesteal", "lifesteal",
+ "liberales", "liberals",
+ "liberalim", "liberalism",
+ "liberalis", "liberals",
+ "liberatin", "liberation",
+ "libraires", "libraries",
+ "liecester", "leicester",
+ "lieuenant", "lieutenant",
+ "lieutenat", "lieutenant",
+ "lifespawn", "lifespan",
+ "lifestlye", "lifestyle",
+ "lighnting", "lightning",
+ "lightnign", "lightning",
+ "ligthning", "lightning",
+ "ligthroom", "lightroom",
+ "lingerine", "lingerie",
+ "lispticks", "lipsticks",
+ "listenend", "listened",
+ "literarly", "literary",
+ "literarry", "literary",
+ "literatre", "literate",
+ "literatue", "literate",
+ "literture", "literature",
+ "lithaunia", "lithuania",
+ "lithuaina", "lithuania",
+ "lithuiana", "lithuania",
+ "lithunaia", "lithuania",
+ "litigatin", "litigation",
+ "lituhania", "lithuania",
+ "liveprool", "liverpool",
+ "livestrem", "livestream",
+ "lobbysits", "lobbyists",
+ "lockscren", "lockscreen",
+ "logisitcs", "logistics",
+ "logsitics", "logistics",
+ "loiusiana", "louisiana",
+ "lollipoop", "lollipop",
+ "louisvile", "louisville",
+ "luanchers", "launchers",
+ "luanching", "launching",
+ "lubicrant", "lubricant",
+ "lubircant", "lubricant",
+ "ludcrious", "ludicrous",
+ "ludricous", "ludicrous",
+ "lunaticos", "lunatics",
+ "lunaticus", "lunatics",
+ "macaronni", "macaroni",
+ "maestries", "masteries",
+ "magainzes", "magazines",
+ "magensium", "magnesium",
+ "magincian", "magician",
+ "magintude", "magnitude",
+ "magneisum", "magnesium",
+ "magnesuim", "magnesium",
+ "magnifine", "magnificent",
+ "mainfesto", "manifesto",
+ "mainfests", "manifests",
+ "mainstrem", "mainstream",
+ "maintaing", "maintaining",
+ "maintance", "maintenance",
+ "maintians", "maintains",
+ "mairjuana", "marijuana",
+ "malasyian", "malaysian",
+ "malayisan", "malaysian",
+ "malaysain", "malaysian",
+ "maletonin", "melatonin",
+ "maltesian", "maltese",
+ "malyasian", "malaysian",
+ "managable", "manageable",
+ "managment", "management",
+ "mandarian", "mandarin",
+ "mandarijn", "mandarin",
+ "mandarion", "mandarin",
+ "maneouvre", "manoeuvre",
+ "maneuveur", "maneuver",
+ "maneveurs", "maneuvers",
+ "manfiesto", "manifesto",
+ "manfiests", "manifests",
+ "mangesium", "magnesium",
+ "mangitude", "magnitude",
+ "manouvers", "maneuvers",
+ "mantained", "maintained",
+ "manuevers", "maneuvers",
+ "maraudeur", "marauder",
+ "marevlous", "marvelous",
+ "margarent", "margaret",
+ "margarite", "margaret",
+ "marginaal", "marginal",
+ "marginaly", "marginally",
+ "marijauna", "marijuana",
+ "marineras", "mariners",
+ "marineris", "mariners",
+ "marineros", "mariners",
+ "marjiuana", "marijuana",
+ "marjority", "majority",
+ "marmelade", "marmalade",
+ "marrtyred", "martyred",
+ "massagens", "massages",
+ "massivley", "massively",
+ "masteires", "masteries",
+ "mastereis", "masteries",
+ "masterise", "masteries",
+ "mastermid", "mastermind",
+ "mastieres", "masteries",
+ "masturbae", "masturbated",
+ "materiaal", "material",
+ "matierals", "materials",
+ "mattreses", "mattress",
+ "mayalsian", "malaysian",
+ "maylasian", "malaysian",
+ "mccarthey", "mccarthy",
+ "mecahnics", "mechanics",
+ "mecernary", "mercenary",
+ "mechancis", "mechanics",
+ "mechanims", "mechanism",
+ "mechaninc", "mechanic",
+ "mechansim", "mechanism",
+ "medicince", "medicine",
+ "mediciney", "mediciny",
+ "meditatie", "meditate",
+ "meditatin", "meditation",
+ "megathred", "megathread",
+ "melanotin", "melatonin",
+ "melborune", "melbourne",
+ "melbounre", "melbourne",
+ "membrance", "membrane",
+ "menstraul", "menstrual",
+ "menstural", "menstrual",
+ "mensutral", "menstrual",
+ "mentiones", "mentions",
+ "mercanery", "mercenary",
+ "merhcants", "merchants",
+ "messagers", "messages",
+ "messanger", "messenger",
+ "metabloic", "metabolic",
+ "metalurgy", "metallurgy",
+ "methaphor", "metaphor",
+ "methapors", "metaphors",
+ "methodoly", "methodology",
+ "metropols", "metropolis",
+ "mexicanas", "mexicans",
+ "mexicants", "mexicans",
+ "mexicanus", "mexicans",
+ "michellle", "michelle",
+ "micorwave", "microwave",
+ "micoscopy", "microscopy",
+ "microphen", "microphone",
+ "migrantes", "migrants",
+ "migrianes", "migraines",
+ "milawukee", "milwaukee",
+ "milennium", "millennium",
+ "milestons", "milestones",
+ "militians", "militias",
+ "millenial", "millennial",
+ "millenian", "millennia",
+ "millenium", "millennium",
+ "millionar", "millionaire",
+ "millitary", "military",
+ "miluwakee", "milwaukee",
+ "milwakuee", "milwaukee",
+ "milwuakee", "milwaukee",
+ "mindcarck", "mindcrack",
+ "mindlessy", "mindlessly",
+ "minerales", "minerals",
+ "minisclue", "miniscule",
+ "miniscuel", "miniscule",
+ "ministery", "ministry",
+ "minisucle", "miniscule",
+ "minitaure", "miniature",
+ "minituare", "miniature",
+ "minneosta", "minnesota",
+ "minnestoa", "minnesota",
+ "minsicule", "miniscule",
+ "minsiters", "ministers",
+ "minstries", "ministries",
+ "miraculos", "miraculous",
+ "mircowave", "microwave",
+ "mirrorred", "mirrored",
+ "miserabel", "miserable",
+ "mispelled", "misspelled",
+ "misreable", "miserable",
+ "misreably", "miserably",
+ "missisipi", "mississippi",
+ "missonary", "missionary",
+ "missourri", "missouri",
+ "misspelld", "misspelled",
+ "mobilitiy", "mobility",
+ "moderatey", "moderately",
+ "moderatin", "moderation",
+ "modifires", "modifiers",
+ "moelcules", "molecules",
+ "moleclues", "molecules",
+ "molestare", "molester",
+ "molestato", "molestation",
+ "molesterd", "molested",
+ "monestary", "monastery",
+ "monitores", "monitors",
+ "monolgoue", "monologue",
+ "monolight", "moonlight",
+ "monolouge", "monologue",
+ "monopolis", "monopolies",
+ "monopolly", "monopoly",
+ "monopoloy", "monopoly",
+ "monserrat", "montserrat",
+ "monstorus", "monstrous",
+ "monstruos", "monstrous",
+ "montanous", "mountainous",
+ "montoring", "monitoring",
+ "monumnets", "monuments",
+ "moratlity", "mortality",
+ "morbidley", "morbidly",
+ "morgatges", "mortgages",
+ "morgtages", "mortgages",
+ "morisette", "morissette",
+ "mormonsim", "mormonism",
+ "morroccan", "moroccan",
+ "mortailty", "mortality",
+ "mosquitto", "mosquito",
+ "motivatie", "motivate",
+ "motivatin", "motivations",
+ "motorcyce", "motorcycles",
+ "motorolja", "motorola",
+ "motoroloa", "motorola",
+ "moustahce", "moustache",
+ "movepseed", "movespeed",
+ "mozzarela", "mozzarella",
+ "mucisians", "musicians",
+ "mulitated", "mutilated",
+ "mulitples", "multiples",
+ "multipled", "multiplied",
+ "multplies", "multiples",
+ "murdererd", "murdered",
+ "muscially", "musically",
+ "muscician", "musician",
+ "musculair", "muscular",
+ "mushrooom", "mushroom",
+ "musicains", "musicians",
+ "mutatiohn", "mutation",
+ "mutialted", "mutilated",
+ "mutilatin", "mutilation",
+ "mutliated", "mutilated",
+ "mutliples", "multiples",
+ "mutlitude", "multitude",
+ "mysterise", "mysteries",
+ "mysterous", "mysterious",
+ "nacrotics", "narcotics",
+ "naferious", "nefarious",
+ "nahsville", "nashville",
+ "narcissim", "narcissism",
+ "narcissit", "narcissist",
+ "narcissts", "narcissist",
+ "narctoics", "narcotics",
+ "nasvhille", "nashville",
+ "nationaal", "national",
+ "nationaly", "nationally",
+ "nativelly", "natively",
+ "natrually", "naturally",
+ "navigatie", "navigate",
+ "navigatin", "navigation",
+ "neccesary", "necessary",
+ "necessite", "necessities",
+ "neckbears", "neckbeards",
+ "neckbread", "neckbeard",
+ "nedlessly", "endlessly",
+ "needlessy", "needlessly",
+ "negiotate", "negotiate",
+ "negociate", "negotiate",
+ "negoitate", "negotiate",
+ "neigbhour", "neighbour",
+ "neigbours", "neighbours",
+ "neighboor", "neighbor",
+ "nessecary", "necessary",
+ "newcaslte", "newcastle",
+ "newcastel", "newcastle",
+ "nieghbour", "neighbour",
+ "nightfa;;", "nightfall",
+ "nightlcub", "nightclub",
+ "nigthclub", "nightclub",
+ "nigthlife", "nightlife",
+ "nigthmare", "nightmare",
+ "nihilisim", "nihilism",
+ "ninteenth", "nineteenth",
+ "nominatie", "nominate",
+ "nominatin", "nomination",
+ "noninital", "noninitial",
+ "norhteast", "northeast",
+ "norhtwest", "northwest",
+ "normanday", "normandy",
+ "northeren", "northern",
+ "norwegain", "norwegian",
+ "norwiegan", "norwegian",
+ "nostaglia", "nostalgia",
+ "nostaglic", "nostalgic",
+ "nostaliga", "nostalgia",
+ "nostaligc", "nostalgic",
+ "nostlagia", "nostalgia",
+ "nostlagic", "nostalgic",
+ "nostriles", "nostrils",
+ "nostrills", "nostrils",
+ "notacible", "noticable",
+ "notciable", "noticable",
+ "noteboook", "notebook",
+ "noteriety", "notoriety",
+ "noteworty", "noteworthy",
+ "noticable", "noticeable",
+ "noticably", "noticeably",
+ "noticalbe", "noticable",
+ "noticeing", "noticing",
+ "noticible", "noticeable",
+ "notoroius", "notorious",
+ "novermber", "november",
+ "nullabour", "nullarbor",
+ "numberous", "numerous",
+ "numercial", "numerical",
+ "numerious", "numerous",
+ "nuremburg", "nuremberg",
+ "nurtients", "nutrients",
+ "nutirents", "nutrients",
+ "nutreints", "nutrients",
+ "nutritent", "nutrient",
+ "nutritian", "nutritional",
+ "nutritios", "nutritious",
+ "obediance", "obedience",
+ "obeidence", "obedience",
+ "obersvant", "observant",
+ "obersvers", "observers",
+ "obesssion", "obsession",
+ "obiedence", "obedience",
+ "obivously", "obviously",
+ "objectivs", "objectives",
+ "objectivy", "objectivity",
+ "obscruity", "obscurity",
+ "obscuirty", "obscurity",
+ "observare", "observer",
+ "observerd", "observed",
+ "obssesion", "obsession",
+ "obssesive", "obsessive",
+ "obssessed", "obsessed",
+ "obstruced", "obstructed",
+ "obsucrity", "obscurity",
+ "obtainabe", "obtainable",
+ "obviosuly", "obviously",
+ "obvioulsy", "obviously",
+ "obvisouly", "obviously",
+ "obvoiusly", "obviously",
+ "ocasional", "occasional",
+ "ocasioned", "occasioned",
+ "ocassions", "occasions",
+ "occaisons", "occasions",
+ "occassion", "occasion",
+ "occurance", "occurrence",
+ "occurence", "occurrence",
+ "octohedra", "octahedra",
+ "ocuntries", "countries",
+ "ocurrance", "occurrence",
+ "ocurrence", "occurrence",
+ "offcially", "officially",
+ "offically", "officially",
+ "officialy", "officially",
+ "offpsring", "offspring",
+ "offspirng", "offspring",
+ "offsrping", "offspring",
+ "ogliarchy", "oligarchy",
+ "oilgarchy", "oligarchy",
+ "oligrachy", "oligarchy",
+ "ommitting", "omitting",
+ "onlsaught", "onslaught",
+ "onsalught", "onslaught",
+ "onslaugth", "onslaught",
+ "onsluaght", "onslaught",
+ "onwership", "ownership",
+ "opiniones", "opinions",
+ "oposition", "opposition",
+ "opponenet", "opponent",
+ "opposiste", "opposites",
+ "opposties", "opposites",
+ "oppressin", "oppression",
+ "opression", "oppression",
+ "opressive", "oppressive",
+ "opthalmic", "ophthalmic",
+ "optimisim", "optimism",
+ "optimistc", "optimistic",
+ "optinally", "optimally",
+ "oragnered", "orangered",
+ "oragnised", "organised",
+ "oragnizer", "organizer",
+ "orcehstra", "orchestra",
+ "ordinarly", "ordinary",
+ "orgainsed", "organised",
+ "orgainzer", "organizer",
+ "organered", "orangered",
+ "organices", "organise",
+ "organisim", "organism",
+ "organiske", "organise",
+ "organiste", "organise",
+ "organites", "organise",
+ "organizms", "organism",
+ "organsied", "organised",
+ "organsims", "organisms",
+ "organzier", "organizer",
+ "orginally", "originally",
+ "orgnaised", "organised",
+ "orhcestra", "orchestra",
+ "orientato", "orientation",
+ "origanaly", "originally",
+ "originall", "original",
+ "originalt", "originality",
+ "originaly", "originally",
+ "origintea", "originate",
+ "origional", "original",
+ "orignally", "originally",
+ "orignials", "originals",
+ "oublisher", "publisher",
+ "oursleves", "ourselves",
+ "oustiders", "outsiders",
+ "oustpoken", "outspoken",
+ "outisders", "outsiders",
+ "outnumbed", "outnumbered",
+ "outpalyed", "outplayed",
+ "outperfom", "outperform",
+ "outpsoken", "outspoken",
+ "outrageos", "outrageous",
+ "outskirst", "outskirts",
+ "outskrits", "outskirts",
+ "outwieghs", "outweighs",
+ "overbaord", "overboard",
+ "overclcok", "overclock",
+ "overdirve", "overdrive",
+ "overhpyed", "overhyped",
+ "overhwelm", "overwhelm",
+ "overlcock", "overclock",
+ "overloard", "overload",
+ "overpaied", "overpaid",
+ "overpowed", "overpowered",
+ "overriden", "overridden",
+ "overwhlem", "overwhelm",
+ "overwirte", "overwrite",
+ "overwtach", "overwatch",
+ "overyhped", "overhyped",
+ "owernship", "ownership",
+ "pacificts", "pacifist",
+ "packageid", "packaged",
+ "pactivity", "captivity",
+ "painkills", "painkillers",
+ "paitently", "patiently",
+ "paitience", "patience",
+ "pakistain", "pakistani",
+ "pakistian", "pakistani",
+ "pakistnai", "pakistani",
+ "paksitani", "pakistani",
+ "paladines", "paladins",
+ "paladinos", "paladins",
+ "palestein", "palestine",
+ "palestina", "palestinian",
+ "palistian", "palestinian",
+ "paltforms", "platforms",
+ "palystyle", "playstyle",
+ "pancakers", "pancakes",
+ "pantomine", "pantomime",
+ "paradimes", "paradise",
+ "paragraps", "paragraphs",
+ "paragrpah", "paragraph",
+ "paralells", "parallels",
+ "paralelly", "parallelly",
+ "paralisys", "paralysis",
+ "parallely", "parallelly",
+ "paralzyed", "paralyzed",
+ "paramedis", "paramedics",
+ "paramters", "parameters",
+ "paranoica", "paranoia",
+ "paranoida", "paranoia",
+ "parasties", "parasites",
+ "paraylsis", "paralysis",
+ "paraylzed", "paralyzed",
+ "parellels", "parallels",
+ "paricular", "particular",
+ "parisitic", "parasitic",
+ "paritally", "partially",
+ "parliment", "parliament",
+ "parmesaen", "parmesan",
+ "parntered", "partnered",
+ "parrallel", "parallel",
+ "partchett", "pratchett",
+ "parterned", "partnered",
+ "participe", "participate",
+ "partiotic", "patriotic",
+ "partisain", "partisan",
+ "pasengers", "passengers",
+ "passagens", "passages",
+ "passagers", "passages",
+ "passerbys", "passersby",
+ "passiones", "passions",
+ "passivley", "passively",
+ "passowrds", "passwords",
+ "pateintly", "patiently",
+ "paticular", "particular",
+ "patinetly", "patiently",
+ "patriarca", "patriarchal",
+ "patriarcy", "patriarchy",
+ "patriotas", "patriots",
+ "patriotes", "patriots",
+ "patroitic", "patriotic",
+ "pattented", "patented",
+ "pavillion", "pavilion",
+ "pbulisher", "publisher",
+ "peacefuly", "peacefully",
+ "pedohpile", "pedophile",
+ "pedophila", "pedophilia",
+ "pedophils", "pedophiles",
+ "peircings", "piercings",
+ "penalites", "penalties",
+ "penatlies", "penalties",
+ "penduluum", "pendulum",
+ "penerator", "penetrator",
+ "penguines", "penguins",
+ "penguings", "penguins",
+ "penguinos", "penguins",
+ "peninsual", "peninsula",
+ "peninusla", "peninsula",
+ "penisnula", "peninsula",
+ "penisular", "peninsular",
+ "pennisula", "peninsula",
+ "pensinula", "peninsula",
+ "pentagoon", "pentagon",
+ "peodphile", "pedophile",
+ "pepperino", "pepperoni",
+ "peppermit", "peppermint",
+ "percepted", "perceived",
+ "percevied", "perceived",
+ "percieved", "perceived",
+ "percisely", "precisely",
+ "percision", "precision",
+ "percursor", "precursor",
+ "perdators", "predators",
+ "peremiter", "perimeter",
+ "perfeclty", "perfectly",
+ "perfomers", "performers",
+ "performas", "performs",
+ "perfromer", "performer",
+ "pericings", "piercings",
+ "perimetre", "perimeter",
+ "peristent", "persistent",
+ "periwinke", "periwinkle",
+ "permanant", "permanent",
+ "permature", "premature",
+ "permenant", "permanent",
+ "permieter", "perimeter",
+ "permissie", "permissible",
+ "permissin", "permissions",
+ "permisson", "permission",
+ "pernament", "permanent",
+ "perorders", "preorders",
+ "perpetrar", "perpetrator",
+ "perpetuae", "perpetuate",
+ "perpetuas", "perpetuates",
+ "persauded", "persuaded",
+ "perscribe", "prescribe",
+ "perserved", "preserved",
+ "persistes", "persists",
+ "personaes", "personas",
+ "personaly", "personally",
+ "personell", "personnel",
+ "personhod", "personhood",
+ "persuated", "persuade",
+ "pertended", "pretended",
+ "pertoleum", "petroleum",
+ "perusaded", "persuaded",
+ "pervertes", "perverse",
+ "pesticids", "pesticides",
+ "petroluem", "petroleum",
+ "phemonena", "phenomena",
+ "phenemona", "phenomena",
+ "phenonema", "phenomena",
+ "phillipse", "phillies",
+ "philosopy", "philosophy",
+ "philosphy", "philosophy",
+ "phonecian", "phoenecian",
+ "phonemena", "phenomena",
+ "phongraph", "phonograph",
+ "photograh", "photograph",
+ "phsyician", "physician",
+ "phsyicist", "physicist",
+ "phycisian", "physician",
+ "phycisist", "physicist",
+ "physicaly", "physically",
+ "physicits", "physicist",
+ "physisict", "physicist",
+ "piblisher", "publisher",
+ "picthfork", "pitchfork",
+ "pinetrest", "pinterest",
+ "placeheld", "placeholder",
+ "placemens", "placements",
+ "plaestine", "palestine",
+ "plagarism", "plagiarism",
+ "planatery", "planetary",
+ "planation", "plantation",
+ "planteary", "planetary",
+ "plasticas", "plastics",
+ "plasticos", "plastics",
+ "plasticus", "plastics",
+ "platfroms", "platforms",
+ "platofrms", "platforms",
+ "plausable", "plausible",
+ "plausbile", "plausible",
+ "plausibel", "plausible",
+ "playgroud", "playground",
+ "playright", "playwright",
+ "playstlye", "playstyle",
+ "playwrite", "playwright",
+ "plebicite", "plebiscite",
+ "plethoria", "plethora",
+ "ploarized", "polarized",
+ "pointeres", "pointers",
+ "polinator", "pollinator",
+ "polishees", "polishes",
+ "politelly", "politely",
+ "politican", "politician",
+ "politicas", "politics",
+ "politicin", "politician",
+ "politicus", "politics",
+ "polygammy", "polygamy",
+ "populatin", "populations",
+ "poralized", "polarized",
+ "porcelian", "porcelain",
+ "porcelina", "porcelain",
+ "poreclain", "porcelain",
+ "porftolio", "portfolio",
+ "porgramme", "programme",
+ "portfoilo", "portfolio",
+ "portoflio", "portfolio",
+ "portraing", "portraying",
+ "portrayes", "portrays",
+ "portrayls", "portrays",
+ "portriats", "portraits",
+ "portugese", "portuguese",
+ "portugues", "portuguese",
+ "posessing", "possessing",
+ "posession", "possession",
+ "positiond", "positioned",
+ "positiong", "positioning",
+ "positionl", "positional",
+ "positiviy", "positivity",
+ "possesess", "possesses",
+ "possesing", "possessing",
+ "possesion", "possession",
+ "possessin", "possessions",
+ "possibile", "possible",
+ "possibily", "possibility",
+ "possibley", "possibly",
+ "possiblly", "possibly",
+ "possition", "position",
+ "powderade", "powdered",
+ "powerfull", "powerful",
+ "pracitcal", "practical",
+ "practhett", "pratchett",
+ "practicly", "practically",
+ "practives", "practise",
+ "pragamtic", "pragmatic",
+ "preadtors", "predators",
+ "precedeed", "preceded",
+ "preceeded", "preceded",
+ "preceived", "perceived",
+ "preciesly", "precisely",
+ "precisley", "precisely",
+ "precurors", "precursor",
+ "precurosr", "precursor",
+ "precurser", "precursor",
+ "predatobr", "predator",
+ "predictie", "predictive",
+ "predictin", "prediction",
+ "predjuice", "prejudice",
+ "predujice", "prejudice",
+ "prefectly", "perfectly",
+ "preferens", "preferences",
+ "prefering", "preferring",
+ "preformer", "performer",
+ "pregnance", "pregnancies",
+ "preimeter", "perimeter",
+ "prejiduce", "prejudice",
+ "prejucide", "prejudice",
+ "premanent", "permanent",
+ "premeired", "premiered",
+ "preorderd", "preordered",
+ "preparato", "preparation",
+ "prepatory", "preparatory",
+ "presentas", "presents",
+ "presentes", "presents",
+ "presicely", "precisely",
+ "presicion", "precision",
+ "presideny", "presidency",
+ "prestigiu", "prestigious",
+ "prestigue", "prestige",
+ "presuaded", "persuaded",
+ "pretendas", "pretends",
+ "pretensje", "pretense",
+ "pretinent", "pertinent",
+ "prevelant", "prevalent",
+ "preventin", "prevention",
+ "previvous", "previous",
+ "priesthod", "priesthood",
+ "priestood", "priesthood",
+ "primaires", "primaries",
+ "primairly", "primarily",
+ "primarliy", "primarily",
+ "primative", "primitive",
+ "primordal", "primordial",
+ "princesas", "princess",
+ "princeses", "princess",
+ "princesss", "princesses",
+ "principas", "principals",
+ "principly", "principally",
+ "prinicple", "principle",
+ "prioritie", "prioritize",
+ "prioritse", "priorities",
+ "privalege", "privilege",
+ "privelege", "privilege",
+ "privelige", "privilege",
+ "privilage", "privilege",
+ "privilegs", "privileges",
+ "privledge", "privilege",
+ "probabily", "probability",
+ "probablly", "probably",
+ "problemas", "problems",
+ "procative", "proactive",
+ "procedger", "procedure",
+ "proceding", "proceeding",
+ "proceedes", "proceeds",
+ "procelain", "porcelain",
+ "procesess", "processes",
+ "processer", "processor",
+ "processos", "processors",
+ "proclamed", "proclaimed",
+ "procotols", "protocols",
+ "prodecure", "procedure",
+ "productie", "productive",
+ "productin", "productions",
+ "productos", "products",
+ "profesion", "profusion",
+ "professer", "professor",
+ "professin", "professions",
+ "proffesed", "professed",
+ "proffesor", "professor",
+ "progessed", "progressed",
+ "programas", "programs",
+ "programem", "programme",
+ "programes", "programs",
+ "programms", "programs",
+ "progresso", "progression",
+ "progresss", "progresses",
+ "projectie", "projectile",
+ "projectin", "projection",
+ "prominant", "prominent",
+ "promiscus", "promiscuous",
+ "promotted", "promoted",
+ "pronomial", "pronominal",
+ "pronouced", "pronounced",
+ "pronounds", "pronouns",
+ "pronounes", "pronouns",
+ "propagana", "propaganda",
+ "properies", "properties",
+ "propertly", "property",
+ "propeties", "properties",
+ "prophesie", "prophecies",
+ "prophetes", "prophets",
+ "propogate", "propagate",
+ "proposels", "proposes",
+ "proposito", "proposition",
+ "propperly", "properly",
+ "propsects", "prospects",
+ "prosperos", "prosperous",
+ "prostitue", "prostitute",
+ "protectes", "protects",
+ "protectie", "protective",
+ "protectos", "protectors",
+ "proteinas", "proteins",
+ "proteines", "proteins",
+ "protestas", "protests",
+ "protestat", "protestant",
+ "protestes", "protests",
+ "protestos", "protests",
+ "protfolio", "portfolio",
+ "protocool", "protocol",
+ "prototpye", "prototype",
+ "prototyps", "prototypes",
+ "protraits", "portraits",
+ "protrayal", "portrayal",
+ "protrayed", "portrayed",
+ "provicial", "provincial",
+ "provincie", "province",
+ "provisios", "provisions",
+ "pruchased", "purchased",
+ "pruchases", "purchases",
+ "prugatory", "purgatory",
+ "pruposely", "purposely",
+ "pscyhotic", "psychotic",
+ "pseudonyn", "pseudonym",
+ "pshycosis", "psychosis",
+ "pshycotic", "psychotic",
+ "psycology", "psychology",
+ "psycothic", "psychotic",
+ "ptichfork", "pitchfork",
+ "pubilsher", "publisher",
+ "publiaher", "publisher",
+ "publicaly", "publicly",
+ "publicani", "publication",
+ "publicher", "publisher",
+ "publiclly", "publicly",
+ "publihser", "publisher",
+ "publisehr", "publisher",
+ "publisger", "publisher",
+ "publishor", "publisher",
+ "publishre", "publisher",
+ "publsiher", "publisher",
+ "publusher", "publisher",
+ "puchasing", "purchasing",
+ "punishmet", "punishments",
+ "puplisher", "publisher",
+ "puragtory", "purgatory",
+ "purcahsed", "purchased",
+ "purcahses", "purchases",
+ "purhcased", "purchased",
+ "purposley", "purposely",
+ "pursuaded", "persuaded",
+ "pursuades", "persuades",
+ "pyramidas", "pyramids",
+ "pyramides", "pyramids",
+ "pyschosis", "psychosis",
+ "pyschotic", "psychotic",
+ "qaulifies", "qualifies",
+ "quantifiy", "quantify",
+ "quantitiy", "quantity",
+ "quantitty", "quantity",
+ "quartlery", "quarterly",
+ "queations", "equations",
+ "queenland", "queensland",
+ "questiond", "questioned",
+ "questiong", "questioning",
+ "questionn", "questioning",
+ "radicalis", "radicals",
+ "rapsberry", "raspberry",
+ "rasbperry", "raspberry",
+ "rationaly", "rationally",
+ "reactiony", "reactionary",
+ "realisitc", "realistic",
+ "realoding", "reloading",
+ "realsitic", "realistic",
+ "realtable", "relatable",
+ "realtions", "relations",
+ "realtives", "relatives",
+ "reamining", "remaining",
+ "reaplying", "replaying",
+ "reasearch", "research",
+ "reaveling", "revealing",
+ "rebellios", "rebellious",
+ "rebllions", "rebellions",
+ "recations", "creations",
+ "reccomend", "recommend",
+ "reccuring", "recurring",
+ "receeding", "receding",
+ "recepient", "recipient",
+ "recgonise", "recognise",
+ "recgonize", "recognize",
+ "recidents", "residents",
+ "recievers", "receivers",
+ "recieving", "receiving",
+ "recipiant", "recipient",
+ "reciproce", "reciprocate",
+ "reclutant", "reluctant",
+ "recoginse", "recognise",
+ "recoginze", "recognize",
+ "recomends", "recommends",
+ "recommens", "recommends",
+ "reconenct", "reconnect",
+ "recongise", "recognise",
+ "recongize", "recognize",
+ "reconicle", "reconcile",
+ "reconized", "recognized",
+ "recordare", "recorder",
+ "recoveres", "recovers",
+ "recoverys", "recovers",
+ "recpetive", "receptive",
+ "recpetors", "receptors",
+ "recquired", "required",
+ "recreatie", "recreate",
+ "recruitcs", "recruits",
+ "recruites", "recruits",
+ "recrusion", "recursion",
+ "recrutied", "recruited",
+ "recrutier", "recruiter",
+ "rectangel", "rectangle",
+ "rectanlge", "rectangle",
+ "recuiting", "recruiting",
+ "recurison", "recursion",
+ "recurited", "recruited",
+ "recuriter", "recruiter",
+ "recusrion", "recursion",
+ "redeemeed", "redeemed",
+ "redundany", "redundancy",
+ "redundent", "redundant",
+ "reedeming", "redeeming",
+ "refelcted", "reflected",
+ "refereces", "references",
+ "refereees", "referees",
+ "refereers", "referees",
+ "referemce", "reference",
+ "referencs", "references",
+ "referense", "references",
+ "referiang", "referring",
+ "referinng", "refering",
+ "refernces", "references",
+ "refernece", "reference",
+ "refershed", "refreshed",
+ "refersher", "refresher",
+ "reffering", "referring",
+ "reflectie", "reflective",
+ "refrehser", "refresher",
+ "refrences", "references",
+ "refromist", "reformist",
+ "regionaal", "regional",
+ "registerd", "registered",
+ "registery", "registry",
+ "regualrly", "regularly",
+ "regualtor", "regulator",
+ "regulaion", "regulation",
+ "regulalry", "regularly",
+ "regulares", "regulars",
+ "regularis", "regulars",
+ "regulatin", "regulations",
+ "regurally", "regularly",
+ "reigining", "reigning",
+ "reinstale", "reinstalled",
+ "reisntall", "reinstall",
+ "reknowned", "renowned",
+ "relaoding", "reloading",
+ "relatiate", "retaliate",
+ "relativiy", "relativity",
+ "relativly", "relatively",
+ "relativno", "relation",
+ "relavence", "relevance",
+ "relcutant", "reluctant",
+ "relevence", "relevance",
+ "relfected", "reflected",
+ "reliabily", "reliability",
+ "reliabley", "reliably",
+ "religeous", "religious",
+ "remasterd", "remastered",
+ "rememberd", "remembered",
+ "rememebrs", "remembers",
+ "remianing", "remaining",
+ "remignton", "remington",
+ "remingotn", "remington",
+ "remmebers", "remembers",
+ "remotelly", "remotely",
+ "rendevous", "rendezvous",
+ "rendezous", "rendezvous",
+ "renedered", "rende",
+ "renegated", "renegade",
+ "rennovate", "renovate",
+ "repalying", "replaying",
+ "repblican", "republican",
+ "repeatedy", "repeatedly",
+ "repective", "receptive",
+ "repeition", "repetition",
+ "repentent", "repentant",
+ "rephrasse", "rephrase",
+ "replusive", "repulsive",
+ "reportedy", "reportedly",
+ "represend", "represented",
+ "repressin", "repression",
+ "reprtoire", "repertoire",
+ "repsonded", "responded",
+ "reptition", "repetition",
+ "reptuable", "reputable",
+ "repubican", "republican",
+ "republian", "republican",
+ "repulican", "republican",
+ "repulisve", "repulsive",
+ "repuslive", "repulsive",
+ "resaurant", "restaurant",
+ "researchs", "researchers",
+ "resembels", "resembles",
+ "reserverd", "reserved",
+ "resintall", "reinstall",
+ "resistane", "resistances",
+ "resistans", "resistances",
+ "resistend", "resisted",
+ "resistent", "resistant",
+ "resmebles", "resembles",
+ "resolutin", "resolutions",
+ "resoruces", "resources",
+ "respectes", "respects",
+ "respectos", "respects",
+ "responces", "response",
+ "respondas", "responds",
+ "respondis", "responds",
+ "respondus", "responds",
+ "respoting", "reposting",
+ "ressemble", "resemble",
+ "ressurect", "resurrect",
+ "restarant", "restaurant",
+ "resticted", "restricted",
+ "restircts", "restricts",
+ "restorani", "restoration",
+ "restraind", "restrained",
+ "restraing", "restraining",
+ "restraunt", "restraint",
+ "restriant", "restraint",
+ "restricte", "restrictive",
+ "resturant", "restaurant",
+ "retailate", "retaliate",
+ "retalaite", "retaliate",
+ "retaliers", "retailers",
+ "reteriver", "retriever",
+ "retirever", "retriever",
+ "retrevier", "retriever",
+ "retriving", "retrieving",
+ "reuptable", "reputable",
+ "reveiwers", "reviewers",
+ "revelaing", "revealing",
+ "revelance", "relevance",
+ "revolutin", "revolutions",
+ "rewachted", "rewatched",
+ "rewatchig", "rewatching",
+ "rferences", "references",
+ "ridiculos", "ridiculous",
+ "ridiculue", "ridicule",
+ "ridiculus", "ridiculous",
+ "righetous", "righteous",
+ "rightfuly", "rightfully",
+ "rightoues", "righteous",
+ "rigourous", "rigorous",
+ "rigtheous", "righteous",
+ "rilvaries", "rivalries",
+ "rininging", "ringing",
+ "rivarlies", "rivalries",
+ "rivlaries", "rivalries",
+ "roaylties", "royalties",
+ "roboticus", "robotics",
+ "roganisms", "organisms",
+ "royalites", "royalties",
+ "roylaties", "royalties",
+ "ruleboook", "rulebook",
+ "sacarstic", "sarcastic",
+ "sacntuary", "sanctuary",
+ "sacrafice", "sacrifice",
+ "sacrastic", "sarcastic",
+ "sacrifise", "sacrifices",
+ "salughter", "slaughter",
+ "samckdown", "smackdown",
+ "sanctiond", "sanctioned",
+ "sancturay", "sanctuary",
+ "sancutary", "sanctuary",
+ "sandstrom", "sandstorm",
+ "sandwhich", "sandwich",
+ "sanhedrim", "sanhedrin",
+ "santcuary", "sanctuary",
+ "santioned", "sanctioned",
+ "sapphirre", "sapphire",
+ "sastified", "satisfied",
+ "sastifies", "satisfies",
+ "satelites", "satellites",
+ "saterdays", "saturdays",
+ "satisifed", "satisfied",
+ "satisifes", "satisfies",
+ "satrudays", "saturdays",
+ "satsified", "satisfied",
+ "satsifies", "satisfies",
+ "sattelite", "satellite",
+ "saxaphone", "saxophone",
+ "scaepgoat", "scapegoat",
+ "scaleable", "scalable",
+ "scandales", "scandals",
+ "scandalos", "scandals",
+ "scantuary", "sanctuary",
+ "scaricity", "scarcity",
+ "scarifice", "sacrifice",
+ "scarmbled", "scrambled",
+ "scartched", "scratched",
+ "scartches", "scratches",
+ "scavanged", "scavenged",
+ "sceintist", "scientist",
+ "scholalry", "scholarly",
+ "sciencers", "sciences",
+ "scientfic", "scientific",
+ "scientifc", "scientific",
+ "scientits", "scientist",
+ "sclupture", "sculpture",
+ "scnearios", "scenarios",
+ "scoreboad", "scoreboard",
+ "scottisch", "scottish",
+ "scracthed", "scratched",
+ "scracthes", "scratches",
+ "scrambeld", "scrambled",
+ "scrathces", "scratches",
+ "scrollade", "scrolled",
+ "scrutiney", "scrutiny",
+ "scrutinty", "scrutiny",
+ "sculpteur", "sculpture",
+ "sculputre", "sculpture",
+ "scultpure", "sculpture",
+ "scuplture", "sculpture",
+ "scuptures", "sculptures",
+ "seamlessy", "seamlessly",
+ "searchign", "searching",
+ "sebasitan", "sebastian",
+ "sebastain", "sebastian",
+ "sebsatian", "sebastian",
+ "secceeded", "seceded",
+ "secertary", "secretary",
+ "secratary", "secretary",
+ "secratery", "secretary",
+ "secretery", "secretary",
+ "secretley", "secretly",
+ "sednetary", "sedentary",
+ "seduciton", "seduction",
+ "semanitcs", "semantics",
+ "semestres", "semesters",
+ "semnatics", "semantics",
+ "semseters", "semesters",
+ "senatores", "senators",
+ "sendetary", "sedentary",
+ "sensitivy", "sensitivity",
+ "sentimant", "sentimental",
+ "sepcially", "specially",
+ "seperated", "separated",
+ "seperates", "separates",
+ "seperator", "separator",
+ "septmeber", "september",
+ "seraching", "searching",
+ "seriosuly", "seriously",
+ "serioulsy", "seriously",
+ "seriuosly", "seriously",
+ "servantes", "servants",
+ "settlment", "settlement",
+ "sexualizd", "sexualized",
+ "sexuallly", "sexually",
+ "shadasloo", "shadaloo",
+ "shaprness", "sharpness",
+ "sharpenss", "sharpness",
+ "shawhsank", "shawshank",
+ "sheilding", "shielding",
+ "shephered", "shepherd",
+ "shileding", "shielding",
+ "shitstrom", "shitstorm",
+ "shletered", "sheltered",
+ "shoudlers", "shoulders",
+ "shouldnot", "shouldnt",
+ "shperical", "spherical",
+ "shwashank", "shawshank",
+ "sidebaord", "sideboard",
+ "siganture", "signature",
+ "signapore", "singapore",
+ "signitory", "signatory",
+ "silhouete", "silhouette",
+ "similiair", "similiar",
+ "simliarly", "similarly",
+ "simluated", "simulated",
+ "simluator", "simulator",
+ "simplifiy", "simplify",
+ "simualted", "simulated",
+ "simualtor", "simulator",
+ "simulatie", "simulate",
+ "simulatin", "simulation",
+ "sinagpore", "singapore",
+ "sincerley", "sincerely",
+ "singature", "signature",
+ "singpaore", "singapore",
+ "singulair", "singular",
+ "singulary", "singularity",
+ "skateboad", "skateboard",
+ "skeletaal", "skeletal",
+ "skepitcal", "skeptical",
+ "skepticim", "skepticism",
+ "sketpical", "skeptical",
+ "slaughted", "slaughtered",
+ "slaugther", "slaughter",
+ "slipperly", "slippery",
+ "sluaghter", "slaughter",
+ "smackdwon", "smackdown",
+ "smealting", "smelting",
+ "smeesters", "semesters",
+ "snadstorm", "sandstorm",
+ "snippetts", "snippets",
+ "snowfalke", "snowflake",
+ "snowflaek", "snowflake",
+ "snowlfake", "snowflake",
+ "snwoballs", "snowballs",
+ "snythesis", "synthesis",
+ "snythetic", "synthetic",
+ "socailism", "socialism",
+ "socailist", "socialist",
+ "socailize", "socialize",
+ "soceities", "societies",
+ "socialini", "socializing",
+ "socialiss", "socialists",
+ "socialsim", "socialism",
+ "socieites", "societies",
+ "socilaism", "socialism",
+ "socilaist", "socialist",
+ "sociopati", "sociopathic",
+ "sociopats", "sociopaths",
+ "socratees", "socrates",
+ "socrateks", "socrates",
+ "soemthing", "something",
+ "sohpomore", "sophomore",
+ "soliliquy", "soliloquy",
+ "somehting", "something",
+ "someoneis", "someones",
+ "somethign", "something",
+ "somethins", "somethings",
+ "sopohmore", "sophomore",
+ "sotryline", "storyline",
+ "soundtrak", "soundtrack",
+ "sountrack", "soundtrack",
+ "sourthern", "southern",
+ "souvenier", "souvenir",
+ "soveregin", "sovereign",
+ "sovereing", "sovereign",
+ "soveriegn", "sovereign",
+ "spacegoat", "scapegoat",
+ "spagehtti", "spaghetti",
+ "spahgetti", "spaghetti",
+ "sparlking", "sparkling",
+ "spartants", "spartans",
+ "specailly", "specially",
+ "specailty", "specialty",
+ "specality", "specialty",
+ "speciales", "specials",
+ "specialis", "specials",
+ "speciatly", "specialty",
+ "specifing", "specifying",
+ "specimine", "specimen",
+ "spectrail", "spectral",
+ "specualte", "speculate",
+ "speechers", "speeches",
+ "spehrical", "spherical",
+ "speically", "specially",
+ "spetember", "september",
+ "sphagetti", "spaghetti",
+ "splatooon", "splatoon",
+ "sponosred", "sponsored",
+ "sponsered", "sponsored",
+ "sponsores", "sponsors",
+ "spontanes", "spontaneous",
+ "sponzored", "sponsored",
+ "sprakling", "sparkling",
+ "sprinkeld", "sprinkled",
+ "squadroon", "squadron",
+ "squirrles", "squirrels",
+ "squirrtle", "squirrel",
+ "squrriels", "squirrels",
+ "srirachia", "sriracha",
+ "srirachra", "sriracha",
+ "stabliize", "stabilize",
+ "stainlees", "stainless",
+ "startegic", "strategic",
+ "startlxde", "startled",
+ "statisitc", "statistic",
+ "staurdays", "saturdays",
+ "steadilly", "steadily",
+ "stealthly", "stealthy",
+ "stichting", "stitching",
+ "sticthing", "stitching",
+ "stimulans", "stimulants",
+ "stockplie", "stockpile",
+ "stornegst", "strongest",
+ "stragetic", "strategic",
+ "straightn", "straighten",
+ "strangets", "strangest",
+ "strategis", "strategies",
+ "strawbery", "strawberry",
+ "streamade", "streamed",
+ "streamare", "streamer",
+ "streamear", "streamer",
+ "strechted", "stretched",
+ "strechtes", "stretches",
+ "strecthed", "stretched",
+ "strecthes", "stretches",
+ "stregnths", "strengths",
+ "strenghen", "strengthen",
+ "strengthn", "strengthen",
+ "strentghs", "strengths",
+ "stressade", "stressed",
+ "stressers", "stresses",
+ "strictist", "strictest",
+ "stringnet", "stringent",
+ "stroyline", "storyline",
+ "structual", "structural",
+ "structurs", "structures",
+ "strucutre", "structure",
+ "struggeld", "struggled",
+ "struggels", "struggles",
+ "stryofoam", "styrofoam",
+ "stuctured", "structured",
+ "stuggling", "struggling",
+ "stupitidy", "stupidity",
+ "sturcture", "structure",
+ "sturggled", "struggled",
+ "sturggles", "struggles",
+ "styrofaom", "styrofoam",
+ "subarmine", "submarine",
+ "subculter", "subculture",
+ "submachne", "submachine",
+ "subpecies", "subspecies",
+ "subscirbe", "subscribe",
+ "subsidary", "subsidiary",
+ "subsizide", "subsidize",
+ "subsquent", "subsequent",
+ "subsrcibe", "subscribe",
+ "substanse", "substances",
+ "substanta", "substantial",
+ "substante", "substantive",
+ "substarte", "substrate",
+ "substitue", "substitute",
+ "substract", "subtract",
+ "subtances", "substances",
+ "subtiltes", "subtitles",
+ "subtitels", "subtitles",
+ "subtletly", "subtlety",
+ "subtlties", "subtitles",
+ "succedded", "succeeded",
+ "succeedes", "succeeds",
+ "succesful", "successful",
+ "succesion", "succession",
+ "succesive", "successive",
+ "suceeding", "succeeding",
+ "sucesfuly", "successfully",
+ "sucessful", "successful",
+ "sucession", "succession",
+ "sucessive", "successive",
+ "sufferage", "suffrage",
+ "sufferred", "suffered",
+ "sufficent", "sufficient",
+ "suggestes", "suggests",
+ "suggestie", "suggestive",
+ "sumbarine", "submarine",
+ "sumberged", "submerged",
+ "summenors", "summoners",
+ "summoenrs", "summoners",
+ "sunderlad", "sunderland",
+ "sunglases", "sunglasses",
+ "superfluu", "superfluous",
+ "superiour", "superior",
+ "superisor", "superiors",
+ "supermare", "supermarket",
+ "superviso", "supervision",
+ "suposedly", "supposedly",
+ "supportes", "supports",
+ "suppreses", "suppress",
+ "supressed", "suppressed",
+ "supresses", "suppresses",
+ "suprising", "surprising",
+ "suprizing", "surprising",
+ "supsicion", "suspicion",
+ "surounded", "surrounded",
+ "surprized", "surprised",
+ "surronded", "surrounded",
+ "surrouded", "surrounded",
+ "surrouned", "surround",
+ "survivers", "survivors",
+ "survivied", "survived",
+ "survivour", "survivor",
+ "susbcribe", "subscribe",
+ "susbtrate", "substrate",
+ "susncreen", "sunscreen",
+ "suspectes", "suspects",
+ "suspendes", "suspense",
+ "suspensie", "suspense",
+ "swastikka", "swastika",
+ "sweatshit", "sweatshirt",
+ "sweetheat", "sweetheart",
+ "switchign", "switching",
+ "swithcing", "switching",
+ "swtiching", "switching",
+ "sydnicate", "syndicate",
+ "sykwalker", "skywalker",
+ "sylablles", "syllables",
+ "syllabels", "syllables",
+ "symbolsim", "symbolism",
+ "symettric", "symmetric",
+ "symmetral", "symmetric",
+ "symmetria", "symmetrical",
+ "symoblism", "symbolism",
+ "sympathie", "sympathize",
+ "symphoney", "symphony",
+ "symptomes", "symptoms",
+ "symptomps", "symptoms",
+ "synagouge", "synagogue",
+ "syndacite", "syndicate",
+ "syndiacte", "syndicate",
+ "synidcate", "syndicate",
+ "synonymes", "synonyms",
+ "synonymis", "synonyms",
+ "synonymns", "synonyms",
+ "synonymos", "synonymous",
+ "synonymus", "synonyms",
+ "synopsies", "synopsis",
+ "syntehsis", "synthesis",
+ "syntehtic", "synthetic",
+ "syntethic", "synthetic",
+ "syphyllis", "syphilis",
+ "syracusae", "syracuse",
+ "sytrofoam", "styrofoam",
+ "tablespon", "tablespoon",
+ "tacticaly", "tactically",
+ "tanenhill", "tannehill",
+ "tannheill", "tannehill",
+ "targetted", "targeted",
+ "tawainese", "taiwanese",
+ "tawianese", "taiwanese",
+ "taxanomic", "taxonomic",
+ "teamfighs", "teamfights",
+ "teamfigth", "teamfight",
+ "teamifght", "teamfight",
+ "teampseak", "teamspeak",
+ "teaspooon", "teaspoon",
+ "techician", "technician",
+ "techinque", "technique",
+ "technolgy", "technology",
+ "teeangers", "teenagers",
+ "tehtering", "tethering",
+ "telegrpah", "telegraph",
+ "televsion", "television",
+ "temafight", "teamfight",
+ "tempaltes", "templates",
+ "temparate", "temperate",
+ "templaras", "templars",
+ "templares", "templars",
+ "temporali", "temporarily",
+ "tenacitiy", "tenacity",
+ "tensiones", "tensions",
+ "tentacels", "tentacles",
+ "tentacuel", "tentacle",
+ "tentalces", "tentacles",
+ "termianls", "terminals",
+ "terminato", "termination",
+ "terorrism", "terrorism",
+ "terorrist", "terrorist",
+ "terrabyte", "terabyte",
+ "terribley", "terribly",
+ "terriblly", "terribly",
+ "terriroty", "territory",
+ "terrorits", "terrorist",
+ "terrorsim", "terrorism",
+ "tesitcles", "testicles",
+ "tesitmony", "testimony",
+ "testicels", "testicles",
+ "testomony", "testimony",
+ "texturers", "textures",
+ "thankfuly", "thankfully",
+ "thankyoou", "thankyou",
+ "themselfs", "themselves",
+ "themselvs", "themselves",
+ "themslves", "themselves",
+ "theologia", "theological",
+ "therafter", "thereafter",
+ "therefoer", "therefor",
+ "therefour", "therefor",
+ "theroists", "theorists",
+ "thetering", "tethering",
+ "thirlling", "thrilling",
+ "thirteeen", "thirteen",
+ "thoecracy", "theocracy",
+ "thoerists", "theorists",
+ "thoroughy", "thoroughly",
+ "thoughout", "throughout",
+ "threatend", "threatened",
+ "throrough", "thorough",
+ "throughly", "thoroughly",
+ "througout", "throughout",
+ "thrusdays", "thursdays",
+ "thurdsays", "thursdays",
+ "thursdsay", "thursdays",
+ "thursters", "thrusters",
+ "tiawanese", "taiwanese",
+ "timestmap", "timestamp",
+ "tirangles", "triangles",
+ "tocuhdown", "touchdown",
+ "toghether", "together",
+ "tolerence", "tolerance",
+ "tommorrow", "tomorrow",
+ "torandoes", "tornadoes",
+ "torchligt", "torchlight",
+ "torelable", "tolerable",
+ "toritllas", "tortillas",
+ "tornaodes", "tornadoes",
+ "torpeados", "torpedoes",
+ "torrentas", "torrents",
+ "torrentes", "torrents",
+ "tortialls", "tortillas",
+ "tortillia", "tortilla",
+ "tortillla", "tortilla",
+ "tottehnam", "tottenham",
+ "tottenahm", "tottenham",
+ "tottneham", "tottenham",
+ "toturials", "tutorials",
+ "touchdwon", "touchdown",
+ "touristas", "tourists",
+ "touristes", "tourists",
+ "touristey", "touristy",
+ "touristly", "touristy",
+ "touristsy", "touristy",
+ "tournamet", "tournament",
+ "toxicitiy", "toxicity",
+ "trafficed", "trafficked",
+ "tragicaly", "tragically",
+ "traileras", "trailers",
+ "traingles", "triangles",
+ "trainwrek", "trainwreck",
+ "traitoris", "traitors",
+ "traitorus", "traitors",
+ "tramautic", "traumatic",
+ "tranlsate", "translate",
+ "transalte", "translate",
+ "transcris", "transcripts",
+ "transcrit", "transcript",
+ "transferd", "transferred",
+ "transfere", "transferred",
+ "transfors", "transforms",
+ "transfrom", "transform",
+ "transiten", "transient",
+ "transitin", "transitions",
+ "transofrm", "transform",
+ "transplat", "transplant",
+ "trasnfers", "transfers",
+ "trasnform", "transform",
+ "trasnport", "transport",
+ "traversie", "traverse",
+ "travestry", "travesty",
+ "treasuers", "treasures",
+ "treasurey", "treasury",
+ "treatmens", "treatments",
+ "treausres", "treasures",
+ "tremendos", "tremendous",
+ "trhilling", "thrilling",
+ "trhusters", "thrusters",
+ "triangels", "triangles",
+ "trianlges", "triangles",
+ "tribunaal", "tribunal",
+ "triguered", "triggered",
+ "trinagles", "triangles",
+ "truamatic", "traumatic",
+ "truthfuly", "truthfully",
+ "tunrtable", "turntable",
+ "turnaroud", "turnaround",
+ "turntabel", "turntable",
+ "typcially", "typically",
+ "tyrranies", "tyrannies",
+ "ubiquitos", "ubiquitous",
+ "ugprading", "upgrading",
+ "ukrainain", "ukrainian",
+ "ukrainias", "ukrainians",
+ "ukrainina", "ukrainian",
+ "ukrainisn", "ukrainians",
+ "ukrianian", "ukrainian",
+ "ulitmatum", "ultimatum",
+ "ulteriour", "ulterior",
+ "umbrellla", "umbrella",
+ "unaminous", "unanimous",
+ "unanmious", "unanimous",
+ "unanswerd", "unanswered",
+ "unanymous", "unanimous",
+ "unbannend", "unbanned",
+ "uncensord", "uncensored",
+ "uncomited", "uncommitted",
+ "undercunt", "undercut",
+ "underdong", "underdog",
+ "undergard", "undergrad",
+ "underming", "undermining",
+ "understad", "understands",
+ "underwaer", "underwear",
+ "underware", "underwear",
+ "undescore", "underscore",
+ "unforseen", "unforeseen",
+ "unfortune", "unfortunate",
+ "unfriendy", "unfriendly",
+ "unhealhty", "unhealthy",
+ "unheathly", "unhealthy",
+ "unhelathy", "unhealthy",
+ "unicornis", "unicorns",
+ "unicornus", "unicorns",
+ "uniformes", "uniforms",
+ "uninamous", "unanimous",
+ "unintuive", "unintuitive",
+ "uniquelly", "uniquely",
+ "unisntall", "uninstall",
+ "univerity", "university",
+ "universse", "universes",
+ "univesity", "university",
+ "unnistall", "uninstall",
+ "unoffical", "unofficial",
+ "unopenend", "unopened",
+ "unplayabe", "unplayable",
+ "unplesant", "unpleasant",
+ "unpopluar", "unpopular",
+ "unrankend", "unranked",
+ "unreliabe", "unreliable",
+ "unrwitten", "unwritten",
+ "untrianed", "untrained",
+ "unusaully", "unusually",
+ "unuseable", "unusable",
+ "unusuable", "unusable",
+ "unvierses", "universes",
+ "unweildly", "unwieldy",
+ "unwieldly", "unwieldy",
+ "unwirtten", "unwritten",
+ "unworthly", "unworthy",
+ "upcomming", "upcoming",
+ "upgarding", "upgrading",
+ "upgradded", "upgraded",
+ "uplfiting", "uplifting",
+ "uplifitng", "uplifting",
+ "urkainian", "ukrainian",
+ "utlimatum", "ultimatum",
+ "vacciante", "vaccinate",
+ "vaccinato", "vaccination",
+ "vacciners", "vaccines",
+ "vacestomy", "vasectomy",
+ "vaguaries", "vagaries",
+ "vaibility", "viability",
+ "vaildated", "validated",
+ "vairables", "variables",
+ "valdiated", "validated",
+ "valentein", "valentine",
+ "valentien", "valentine",
+ "valentins", "valentines",
+ "validitiy", "validity",
+ "valueable", "valuable",
+ "vanadlism", "vandalism",
+ "vandalsim", "vandalism",
+ "varaibles", "variables",
+ "varations", "variations",
+ "variantes", "variants",
+ "vascetomy", "vasectomy",
+ "vastecomy", "vasectomy",
+ "veganisim", "veganism",
+ "vegetarin", "vegetarians",
+ "vegitable", "vegetable",
+ "vehementy", "vehemently",
+ "veiwpoint", "viewpoint",
+ "velantine", "valentine",
+ "vendettta", "vendetta",
+ "venegance", "vengeance",
+ "veneuzela", "venezuela",
+ "venezeula", "venezuela",
+ "venezulea", "venezuela",
+ "vengaence", "vengeance",
+ "vengenace", "vengeance",
+ "ventilato", "ventilation",
+ "verbatium", "verbatim",
+ "verfiying", "verifying",
+ "verifiyng", "verifying",
+ "verisions", "revisions",
+ "versalite", "versatile",
+ "versatily", "versatility",
+ "versiones", "versions",
+ "versitale", "versatile",
+ "verstaile", "versatile",
+ "verticaly", "vertically",
+ "veryifing", "verifying",
+ "vicotrian", "victorian",
+ "vicotries", "victories",
+ "victoires", "victories",
+ "victorain", "victorian",
+ "victorina", "victorian",
+ "victorios", "victorious",
+ "videogaem", "videogame",
+ "videogams", "videogames",
+ "vidoegame", "videogame",
+ "viewpiont", "viewpoint",
+ "vigilence", "vigilance",
+ "vigliante", "vigilante",
+ "vigourous", "vigorous",
+ "viligante", "vigilante",
+ "viloently", "violently",
+ "vincinity", "vicinity",
+ "vioalting", "violating",
+ "violentce", "violence",
+ "virbation", "vibration",
+ "virgintiy", "virginity",
+ "virignity", "virginity",
+ "virutally", "virtually",
+ "visibiliy", "visibility",
+ "vitaminas", "vitamins",
+ "vitamines", "vitamins",
+ "vitrually", "virtually",
+ "vociemail", "voicemail",
+ "voilating", "violating",
+ "voilation", "violation",
+ "voilently", "violently",
+ "volatiliy", "volatility",
+ "voleyball", "volleyball",
+ "volontary", "voluntary",
+ "volonteer", "volunteer",
+ "volunatry", "voluntary",
+ "volunteed", "volunteered",
+ "vriginity", "virginity",
+ "wallpapes", "wallpapers",
+ "warrantly", "warranty",
+ "warrriors", "warriors",
+ "wavelengh", "wavelength",
+ "weakenend", "weakened",
+ "weakneses", "weakness",
+ "weaknesss", "weaknesses",
+ "wealtheir", "wealthier",
+ "weaponary", "weaponry",
+ "wedensday", "wednesday",
+ "wednesdsy", "wednesdays",
+ "wednessay", "wednesdays",
+ "wednseday", "wednesday",
+ "welathier", "wealthier",
+ "wendesday", "wednesday",
+ "wesbtrook", "westbrook",
+ "westernes", "westerners",
+ "westrbook", "westbrook",
+ "whereever", "wherever",
+ "whietlist", "whitelist",
+ "whilrwind", "whirlwind",
+ "whilsting", "whistling",
+ "whipsered", "whispered",
+ "whislting", "whistling",
+ "whisperes", "whispers",
+ "whitelsit", "whitelist",
+ "whitleist", "whitelist",
+ "whitsling", "whistling",
+ "whrilwind", "whirlwind",
+ "whsipered", "whispered",
+ "whtielist", "whitelist",
+ "widespred", "widespread",
+ "widesread", "widespread",
+ "windshied", "windshield",
+ "wintesses", "witnesses",
+ "wisconisn", "wisconsin",
+ "wishlisht", "wishlist",
+ "wishpered", "whispered",
+ "withdrawl", "withdrawal",
+ "withelist", "whitelist",
+ "witnesess", "witnesses",
+ "wolrdview", "worldview",
+ "wolrdwide", "worldwide",
+ "wonderlad", "wonderland",
+ "wordlview", "worldview",
+ "wordlwide", "worldwide",
+ "worhtless", "worthless",
+ "workfroce", "workforce",
+ "worldivew", "worldview",
+ "worldveiw", "worldview",
+ "worstened", "worsened",
+ "worthelss", "worthless",
+ "xenbolade", "xenoblade",
+ "xenobalde", "xenoblade",
+ "xenophoby", "xenophobia",
+ "xeonblade", "xenoblade",
+ "yementite", "yemenite",
+ "yorkshrie", "yorkshire",
+ "yorskhire", "yorkshire",
+ "yosemitie", "yosemite",
+ "youngents", "youngest",
+ "yourselvs", "yourselves",
+ "zimbabwae", "zimbabwe",
+ "zionistas", "zionists",
+ "zionistes", "zionists",
+ "abandond", "abandoned",
+ "abdomine", "abdomen",
+ "abilitiy", "ability",
+ "abilties", "abilities",
+ "abondons", "abandons",
+ "aboslute", "absolute",
+ "abosrbed", "absorbed",
+ "abruplty", "abruptly",
+ "abrutply", "abruptly",
+ "abscence", "absence",
+ "absestos", "asbestos",
+ "absoluts", "absolutes",
+ "absolvte", "absolve",
+ "absorbes", "absorbs",
+ "absoulte", "absolute",
+ "abstante", "bastante",
+ "abudance", "abundance",
+ "abudcted", "abducted",
+ "abundunt", "abundant",
+ "aburptly", "abruptly",
+ "abuseres", "abusers",
+ "abusrdly", "absurdly",
+ "academis", "academics",
+ "accademy", "academy",
+ "acccused", "accused",
+ "acceptes", "accepts",
+ "accidens", "accidents",
+ "accideny", "accidently",
+ "accoring", "according",
+ "accountt", "accountant",
+ "accpeted", "accepted",
+ "accuarcy", "accuracy",
+ "accumule", "accumulate",
+ "accusato", "accusation",
+ "accussed", "accused",
+ "acedamia", "academia",
+ "acedemic", "academic",
+ "acheived", "achieved",
+ "acheives", "achieves",
+ "achieval", "achievable",
+ "acnedote", "anecdote",
+ "acording", "according",
+ "acornyms", "acronyms",
+ "acousitc", "acoustic",
+ "acoutsic", "acoustic",
+ "acovados", "avocados",
+ "acquifer", "acquire",
+ "acquited", "acquitted",
+ "acquried", "acquired",
+ "acronmys", "acronyms",
+ "acronysm", "acronyms",
+ "acroynms", "acronyms",
+ "acrynoms", "acronyms",
+ "acsended", "ascended",
+ "actaully", "actually",
+ "activite", "activities",
+ "activits", "activities",
+ "activley", "actively",
+ "actresss", "actresses",
+ "actualey", "actualy",
+ "actualiy", "actuality",
+ "actualky", "actualy",
+ "actualmy", "actualy",
+ "actualoy", "actualy",
+ "actualpy", "actualy",
+ "actualty", "actualy",
+ "acutally", "actually",
+ "acutions", "auctions",
+ "adaptare", "adapter",
+ "adbandon", "abandon",
+ "adbucted", "abducted",
+ "addictes", "addicts",
+ "addictin", "addictions",
+ "addictis", "addictions",
+ "addional", "additional",
+ "addopted", "adopted",
+ "addresed", "addressed",
+ "adealide", "adelaide",
+ "adecuate", "adequate",
+ "adeilade", "adelaide",
+ "adeladie", "adelaide",
+ "adeliade", "adelaide",
+ "adeqaute", "adequate",
+ "adheisve", "adhesive",
+ "adhevise", "adhesive",
+ "adivsors", "advisors",
+ "admiraal", "admiral",
+ "adolence", "adolescent",
+ "adorbale", "adorable",
+ "adovcacy", "advocacy",
+ "adpaters", "adapters",
+ "adquired", "acquired",
+ "adquires", "acquires",
+ "adresing", "addressing",
+ "adressed", "addressed",
+ "adroable", "adorable",
+ "adultrey", "adultery",
+ "adventue", "adventures",
+ "adventus", "adventures",
+ "advertis", "adverts",
+ "advesary", "adversary",
+ "adviseer", "adviser",
+ "adviseur", "adviser",
+ "advocade", "advocated",
+ "advocats", "advocates",
+ "advsiors", "advisors",
+ "aethists", "atheists",
+ "affaires", "affairs",
+ "affilate", "affiliate",
+ "affintiy", "affinity",
+ "affleunt", "affluent",
+ "affulent", "affluent",
+ "afircans", "africans",
+ "africain", "african",
+ "afternon", "afternoon",
+ "againnst", "against",
+ "agnositc", "agnostic",
+ "agonstic", "agnostic",
+ "agravate", "aggravate",
+ "agreemnt", "agreement",
+ "agregate", "aggregate",
+ "agressie", "agressive",
+ "agressor", "aggressor",
+ "agrieved", "aggrieved",
+ "agruable", "arguable",
+ "agruably", "arguably",
+ "agrument", "argument",
+ "ahtletes", "athletes",
+ "aincents", "ancients",
+ "airboner", "airborne",
+ "airbrone", "airborne",
+ "aircarft", "aircraft",
+ "airplans", "airplanes",
+ "airporta", "airports",
+ "airpsace", "airspace",
+ "airscape", "airspace",
+ "akransas", "arkansas",
+ "alchemey", "alchemy",
+ "alchohol", "alcohol",
+ "alcholic", "alcoholic",
+ "alcoholc", "alcoholics",
+ "aldutery", "adultery",
+ "aleniate", "alienate",
+ "algoritm", "algorithm",
+ "alimoney", "alimony",
+ "alirghty", "alrighty",
+ "allaince", "alliance",
+ "alledged", "alleged",
+ "alledges", "alleges",
+ "allegedy", "allegedly",
+ "allegely", "allegedly",
+ "allegric", "allergic",
+ "allergey", "allergy",
+ "allianse", "alliances",
+ "alligned", "aligned",
+ "allinace", "alliance",
+ "allopone", "allophone",
+ "allready", "already",
+ "almigthy", "almighty",
+ "alpahbet", "alphabet",
+ "alrigthy", "alrighty",
+ "altantic", "atlantic",
+ "alterato", "alteration",
+ "alternar", "alternator",
+ "althetes", "athletes",
+ "althetic", "athletic",
+ "altriusm", "altruism",
+ "altrusim", "altruism",
+ "alturism", "altruism",
+ "aluminim", "aluminium",
+ "alumnium", "aluminum",
+ "alunimum", "aluminum",
+ "amatersu", "amateurs",
+ "amaterus", "amateurs",
+ "amendmet", "amendments",
+ "amercian", "american",
+ "amercias", "americas",
+ "amernian", "armenian",
+ "amethsyt", "amethyst",
+ "ameythst", "amethyst",
+ "ammended", "amended",
+ "amnestry", "amnesty",
+ "amoungst", "amongst",
+ "amplifiy", "amplify",
+ "amplifly", "amplify",
+ "amrchair", "armchair",
+ "amrenian", "armenian",
+ "amtheyst", "amethyst",
+ "analgoue", "analogue",
+ "analisys", "analysis",
+ "analitic", "analytic",
+ "analouge", "analogue",
+ "analysie", "analyse",
+ "analysit", "analyst",
+ "analyste", "analyse",
+ "analysze", "analyse",
+ "analzyed", "analyzed",
+ "anaolgue", "analogue",
+ "anarchim", "anarchism",
+ "anaylses", "analyses",
+ "anaylsis", "analysis",
+ "anaylsts", "analysts",
+ "anaylzed", "analyzed",
+ "ancedote", "anecdote",
+ "anceints", "ancients",
+ "ancinets", "ancients",
+ "andoirds", "androids",
+ "andorids", "androids",
+ "andriods", "androids",
+ "anecdots", "anecdotes",
+ "anectode", "anecdote",
+ "anedocte", "anecdote",
+ "aneroxia", "anorexia",
+ "aneroxic", "anorexic",
+ "angostic", "agnostic",
+ "angrilly", "angrily",
+ "anicents", "ancients",
+ "animatie", "animate",
+ "animatte", "animate",
+ "anlayses", "analyses",
+ "annoints", "anoints",
+ "annouced", "announced",
+ "annoucne", "announce",
+ "anntenas", "antennas",
+ "anoerxia", "anorexia",
+ "anoerxic", "anorexic",
+ "anonymos", "anonymous",
+ "anoreixa", "anorexia",
+ "anounced", "announced",
+ "anoxeria", "anorexia",
+ "anoxeric", "anorexic",
+ "answeres", "answers",
+ "antartic", "antarctic",
+ "antennea", "antenna",
+ "antennna", "antenna",
+ "anticipe", "anticipate",
+ "antiquae", "antique",
+ "antivirs", "antivirus",
+ "anwsered", "answered",
+ "anyhting", "anything",
+ "anyhwere", "anywhere",
+ "anyoneis", "anyones",
+ "anythign", "anything",
+ "anytying", "anything",
+ "aparment", "apartment",
+ "apartmet", "apartments",
+ "apenines", "apennines",
+ "aperutre", "aperture",
+ "aplhabet", "alphabet",
+ "apologes", "apologise",
+ "aposltes", "apostles",
+ "apostels", "apostles",
+ "appaluse", "applause",
+ "apparant", "apparent",
+ "appareal", "apparel",
+ "appareil", "apparel",
+ "apperead", "appeared",
+ "applaued", "applaud",
+ "appluase", "applause",
+ "appology", "apology",
+ "apporach", "approach",
+ "appraoch", "approach",
+ "apreture", "aperture",
+ "apsotles", "apostles",
+ "aqaurium", "aquarium",
+ "aqcuired", "acquired",
+ "aquaduct", "aqueduct",
+ "aquairum", "aquarium",
+ "aquaruim", "aquarium",
+ "aquiring", "acquiring",
+ "aquitted", "acquitted",
+ "arbitary", "arbitrary",
+ "arbitray", "arbitrary",
+ "arbiture", "arbiter",
+ "architet", "architect",
+ "archtype", "archetype",
+ "aremnian", "armenian",
+ "argentia", "argentina",
+ "argubaly", "arguably",
+ "arguemet", "arguement",
+ "arguemtn", "arguement",
+ "ariborne", "airborne",
+ "aricraft", "aircraft",
+ "ariplane", "airplane",
+ "ariports", "airports",
+ "arispace", "airspace",
+ "aristote", "aristotle",
+ "aritfact", "artifact",
+ "arizonia", "arizona",
+ "arkasnas", "arkansas",
+ "arlighty", "alrighty",
+ "armamant", "armament",
+ "armenain", "armenian",
+ "armenina", "armenian",
+ "armpitts", "armpits",
+ "armstrog", "armstrong",
+ "arpanoid", "paranoid",
+ "arpeture", "aperture",
+ "arragned", "arranged",
+ "arrestes", "arrests",
+ "arrestos", "arrests",
+ "arsenaal", "arsenal",
+ "artemios", "artemis",
+ "artemius", "artemis",
+ "arthrits", "arthritis",
+ "articule", "articulate",
+ "artifacs", "artifacts",
+ "artifcat", "artifact",
+ "artilley", "artillery",
+ "artisitc", "artistic",
+ "artistas", "artists",
+ "arugable", "arguable",
+ "arugably", "arguably",
+ "arugment", "argument",
+ "asborbed", "absorbed",
+ "asburdly", "absurdly",
+ "ascneded", "ascended",
+ "asissted", "assisted",
+ "askreddt", "askreddit",
+ "asnwered", "answered",
+ "aspectos", "aspects",
+ "asperges", "aspergers",
+ "assasins", "assassins",
+ "assemple", "assemble",
+ "assertin", "assertions",
+ "asshates", "asshats",
+ "asshatts", "asshats",
+ "assimile", "assimilate",
+ "assistat", "assistants",
+ "assitant", "assistant",
+ "assmeble", "assemble",
+ "assmebly", "assembly",
+ "asssasin", "assassin",
+ "assualts", "assaults",
+ "asteorid", "asteroid",
+ "asteriks", "asterisk",
+ "asteriod", "asteroid",
+ "asterois", "asteroids",
+ "astersik", "asterisk",
+ "asthetic", "aesthetic",
+ "astronat", "astronaut",
+ "asutrian", "austrian",
+ "atheisim", "atheism",
+ "atheistc", "atheistic",
+ "atheltes", "athletes",
+ "atheltic", "athletic",
+ "athenean", "athenian",
+ "athesits", "atheists",
+ "athetlic", "athletic",
+ "athients", "athiest",
+ "atittude", "attitude",
+ "atlantia", "atlanta",
+ "atmoizer", "atomizer",
+ "atomzier", "atomizer",
+ "atribute", "attribute",
+ "atrifact", "artifact",
+ "attackes", "attackers",
+ "attemped", "attempted",
+ "attemted", "attempted",
+ "attemtps", "attempts",
+ "attidute", "attitude",
+ "attitide", "attitude",
+ "attribue", "attribute",
+ "aucitons", "auctions",
+ "audactiy", "audacity",
+ "audcaity", "audacity",
+ "audeince", "audience",
+ "audiobok", "audiobook",
+ "austeriy", "austerity",
+ "austiran", "austrian",
+ "austitic", "autistic",
+ "austrain", "austrian",
+ "australa", "australian",
+ "austrija", "austria",
+ "austrila", "austria",
+ "autisitc", "autistic",
+ "autoattk", "autoattack",
+ "autograh", "autograph",
+ "automato", "automation",
+ "automony", "autonomy",
+ "autority", "authority",
+ "autsitic", "autistic",
+ "auxilary", "auxiliary",
+ "avacodos", "avocados",
+ "avaiable", "available",
+ "availabe", "available",
+ "availble", "available",
+ "avaition", "aviation",
+ "avalable", "available",
+ "avalance", "avalanche",
+ "avataras", "avatars",
+ "avatards", "avatars",
+ "avatares", "avatars",
+ "averadge", "averaged",
+ "avergaed", "averaged",
+ "avergaes", "averages",
+ "aviaiton", "aviation",
+ "avilable", "available",
+ "avnegers", "avengers",
+ "avodacos", "avocados",
+ "awekened", "weakened",
+ "awesomey", "awesomely",
+ "awfullly", "awfully",
+ "awkwardy", "awkwardly",
+ "awnsered", "answered",
+ "babysite", "babysitter",
+ "baceause", "because",
+ "bacehlor", "bachelor",
+ "bachleor", "bachelor",
+ "bacholer", "bachelor",
+ "backeast", "backseat",
+ "backerds", "backers",
+ "backfied", "backfield",
+ "backpacs", "backpacks",
+ "balcanes", "balances",
+ "balconey", "balcony",
+ "balconny", "balcony",
+ "ballistc", "ballistic",
+ "balnaced", "balanced",
+ "banannas", "bananas",
+ "banditas", "bandits",
+ "bandwith", "bandwidth",
+ "bangkock", "bangkok",
+ "baptisim", "baptism",
+ "barabric", "barbaric",
+ "barbarin", "barbarian",
+ "barbaris", "barbarians",
+ "bardford", "bradford",
+ "bargaing", "bargaining",
+ "baristia", "barista",
+ "barrakcs", "barracks",
+ "barrells", "barrels",
+ "basicaly", "basically",
+ "basiclay", "basicly",
+ "basicley", "basicly",
+ "basicliy", "basicly",
+ "batistia", "batista",
+ "battalin", "battalion",
+ "bayonent", "bayonet",
+ "beachead", "beachhead",
+ "beacuoup", "beaucoup",
+ "beardude", "bearded",
+ "beastley", "beastly",
+ "beatiful", "beautiful",
+ "beccause", "because",
+ "becuasse", "becuase",
+ "befirend", "befriend",
+ "befreind", "befriend",
+ "begginer", "beginner",
+ "begginig", "begging",
+ "begginng", "begging",
+ "begining", "beginning",
+ "beginnig", "beginning",
+ "behaivor", "behavior",
+ "behavios", "behaviours",
+ "behavoir", "behavior",
+ "behavour", "behavior",
+ "behngazi", "benghazi",
+ "behtesda", "bethesda",
+ "beleived", "believed",
+ "beleiver", "believer",
+ "beleives", "believes",
+ "beliefes", "beliefs",
+ "benefica", "beneficial",
+ "bengahzi", "benghazi",
+ "bengalas", "bengals",
+ "bengalos", "bengals",
+ "bengazhi", "benghazi",
+ "benghzai", "benghazi",
+ "bengzhai", "benghazi",
+ "benhgazi", "benghazi",
+ "benidect", "benedict",
+ "benifits", "benefits",
+ "berekley", "berkeley",
+ "berserkr", "berserker",
+ "beseiged", "besieged",
+ "betehsda", "bethesda",
+ "beteshda", "bethesda",
+ "bethdesa", "bethesda",
+ "bethedsa", "bethesda",
+ "bethseda", "bethesda",
+ "beyoncye", "beyonce",
+ "bibilcal", "biblical",
+ "bicylces", "bicycles",
+ "bigfooot", "bigfoot",
+ "bigining", "beginning",
+ "bilbical", "biblical",
+ "billboad", "billboard",
+ "bilsters", "blisters",
+ "bilzzard", "blizzard",
+ "bilzzcon", "blizzcon",
+ "biologia", "biological",
+ "birhtday", "birthday",
+ "birsbane", "brisbane",
+ "birthdsy", "birthdays",
+ "biseuxal", "bisexual",
+ "bisexaul", "bisexual",
+ "bitcions", "bitcoins",
+ "bitocins", "bitcoins",
+ "blackade", "blacked",
+ "blackend", "blacked",
+ "blackjak", "blackjack",
+ "blacklit", "blacklist",
+ "blatanty", "blatantly",
+ "blessins", "blessings",
+ "blessure", "blessing",
+ "bloggare", "blogger",
+ "bloggeur", "blogger",
+ "bluebery", "blueberry",
+ "bluetooh", "bluetooth",
+ "blugaria", "bulgaria",
+ "boardway", "broadway",
+ "bollcoks", "bollocks",
+ "bomberos", "bombers",
+ "bookmars", "bookmarks",
+ "boradway", "broadway",
+ "boredoom", "boredom",
+ "bouldore", "boulder",
+ "bounites", "bounties",
+ "boutnies", "bounties",
+ "boutqiue", "boutique",
+ "bouyancy", "buoyancy",
+ "boyfried", "boyfriend",
+ "bradcast", "broadcast",
+ "bradfrod", "bradford",
+ "brakeout", "breakout",
+ "braodway", "broadway",
+ "braverly", "bravery",
+ "breathis", "breaths",
+ "breathos", "breaths",
+ "brekaout", "breakout",
+ "brendamn", "brendan",
+ "breweres", "brewers",
+ "brewerey", "brewery",
+ "brewerks", "brewers",
+ "brewerys", "brewers",
+ "brigaged", "brigade",
+ "brigated", "brigade",
+ "brigthen", "brighten",
+ "briliant", "brilliant",
+ "brillant", "brilliant",
+ "bristool", "bristol",
+ "brithday", "birthday",
+ "brittish", "british",
+ "briusers", "bruisers",
+ "broadbad", "broadband",
+ "broadcat", "broadcasts",
+ "broadley", "broadly",
+ "brocolli", "broccoli",
+ "brodaway", "broadway",
+ "broncoes", "broncos",
+ "broswing", "browsing",
+ "browines", "brownies",
+ "browisng", "browsing",
+ "brtually", "brutally",
+ "brugundy", "burgundy",
+ "bruisend", "bruised",
+ "brussles", "brussels",
+ "brusting", "bursting",
+ "bubblews", "bubbles",
+ "buddhits", "buddhist",
+ "buddhsim", "buddhism",
+ "buddishm", "buddhism",
+ "buddisht", "buddhist",
+ "buglaria", "bulgaria",
+ "buhddism", "buddhism",
+ "buhddist", "buddhist",
+ "buidlers", "builders",
+ "buidling", "building",
+ "buildins", "buildings",
+ "buisness", "business",
+ "bulagria", "bulgaria",
+ "bulgaira", "bulgaria",
+ "buliders", "builders",
+ "buliding", "building",
+ "bulletts", "bullets",
+ "burisers", "bruisers",
+ "burriots", "burritos",
+ "burritio", "burrito",
+ "burritto", "burrito",
+ "burrtios", "burritos",
+ "burssels", "brussels",
+ "burtally", "brutally",
+ "burtsing", "bursting",
+ "busrting", "bursting",
+ "butcherd", "butchered",
+ "butterey", "buttery",
+ "butterfy", "butterfly",
+ "butterry", "buttery",
+ "butthoel", "butthole",
+ "bycicles", "bicycles",
+ "cabbagge", "cabbage",
+ "cabients", "cabinets",
+ "cabinate", "cabinet",
+ "cabinent", "cabinet",
+ "cabniets", "cabinets",
+ "caclulus", "calculus",
+ "cafetera", "cafeteria",
+ "caffinee", "caffeine",
+ "cahsiers", "cashiers",
+ "cainster", "canister",
+ "calander", "calendar",
+ "calcular", "calculator",
+ "calgarry", "calgary",
+ "calibler", "calibre",
+ "caloires", "calories",
+ "calrkson", "clarkson",
+ "calroies", "calories",
+ "calssify", "classify",
+ "calulate", "calculate",
+ "calymore", "claymore",
+ "camapign", "campaign",
+ "cambodai", "cambodia",
+ "camboida", "cambodia",
+ "cambpell", "campbell",
+ "cambride", "cambridge",
+ "cambrige", "cambridge",
+ "camoufle", "camouflage",
+ "campagin", "campaign",
+ "campaing", "campaign",
+ "campains", "campaigns",
+ "camperas", "campers",
+ "camperos", "campers",
+ "canadias", "canadians",
+ "cananbis", "cannabis",
+ "cancelas", "cancels",
+ "canceles", "cancels",
+ "cancells", "cancels",
+ "canceres", "cancers",
+ "cancerns", "cancers",
+ "cancerus", "cancers",
+ "candiate", "candidate",
+ "candiens", "candies",
+ "canistre", "canister",
+ "cannabil", "cannibal",
+ "cannbial", "cannibal",
+ "cannibas", "cannabis",
+ "cansiter", "canister",
+ "capitans", "captains",
+ "capitola", "capital",
+ "capitulo", "capitol",
+ "capmbell", "campbell",
+ "capsuels", "capsules",
+ "capsulse", "capsules",
+ "capsumel", "capsule",
+ "capteurs", "captures",
+ "captials", "capitals",
+ "captians", "captains",
+ "capusles", "capsules",
+ "caputres", "captures",
+ "cardboad", "cardboard",
+ "cardianl", "cardinal",
+ "cardnial", "cardinal",
+ "careflly", "carefully",
+ "carefull", "careful",
+ "carefuly", "carefully",
+ "caricate", "caricature",
+ "caridgan", "cardigan",
+ "caridnal", "cardinal",
+ "carinval", "carnival",
+ "carloina", "carolina",
+ "carnagie", "carnegie",
+ "carnigie", "carnegie",
+ "carnvial", "carnival",
+ "carrotts", "carrots",
+ "carrotus", "carrots",
+ "cartells", "cartels",
+ "cartmaan", "cartman",
+ "cartride", "cartridge",
+ "cartrige", "cartridge",
+ "carvinal", "carnival",
+ "casaulty", "casualty",
+ "casheirs", "cashiers",
+ "cashieer", "cashier",
+ "cashires", "cashiers",
+ "castleos", "castles",
+ "castlers", "castles",
+ "casulaty", "casualty",
+ "cataclym", "cataclysm",
+ "catagory", "category",
+ "cataline", "catiline",
+ "cataloge", "catalogue",
+ "catalsyt", "catalyst",
+ "cataylst", "catalyst",
+ "cathloic", "catholic",
+ "catlayst", "catalyst",
+ "caucasin", "caucasian",
+ "causalty", "casualty",
+ "cellural", "cellular",
+ "celullar", "cellular",
+ "celverly", "cleverly",
+ "cemetary", "cemetery",
+ "centeres", "centers",
+ "centerns", "centers",
+ "centrase", "centres",
+ "centrers", "centres",
+ "ceratine", "creatine",
+ "cerberal", "cerebral",
+ "cerbreus", "cerberus",
+ "cerbures", "cerberus",
+ "ceremone", "ceremonies",
+ "cerimony", "ceremony",
+ "ceromony", "ceremony",
+ "certainy", "certainty",
+ "challege", "challenge",
+ "chambear", "chamber",
+ "chambres", "chambers",
+ "champage", "champagne",
+ "chanisaw", "chainsaw",
+ "chanlder", "chandler",
+ "charcaol", "charcoal",
+ "chargehr", "charger",
+ "chargeur", "charger",
+ "chariman", "chairman",
+ "charimsa", "charisma",
+ "charmisa", "charisma",
+ "charocal", "charcoal",
+ "charsima", "charisma",
+ "chasiers", "cashiers",
+ "chassids", "chassis",
+ "chassies", "chassis",
+ "chatolic", "catholic",
+ "chcukles", "chuckles",
+ "checkare", "checker",
+ "checkear", "checker",
+ "cheesees", "cheeses",
+ "cheeseus", "cheeses",
+ "cheetoos", "cheetos",
+ "chemcial", "chemical",
+ "chemisty", "chemistry",
+ "chernobl", "chernobyl",
+ "chiansaw", "chainsaw",
+ "chidlish", "childish",
+ "chihuaha", "chihuahua",
+ "childres", "childrens",
+ "chillade", "chilled",
+ "chillead", "chilled",
+ "chillend", "chilled",
+ "chilvary", "chivalry",
+ "chinesse", "chinese",
+ "chivarly", "chivalry",
+ "chivlary", "chivalry",
+ "chlidish", "childish",
+ "chlroine", "chlorine",
+ "chmabers", "chambers",
+ "chocolae", "chocolates",
+ "chocolet", "chocolates",
+ "choesive", "cohesive",
+ "choicers", "choices",
+ "cholrine", "chlorine",
+ "chorline", "chlorine",
+ "chracter", "character",
+ "christin", "christian",
+ "chroline", "chlorine",
+ "chromose", "chromosome",
+ "chronice", "chronicles",
+ "chruches", "churches",
+ "chuckels", "chuckles",
+ "cielings", "ceilings",
+ "cigarete", "cigarettes",
+ "cigarets", "cigarettes",
+ "cilmbers", "climbers",
+ "cilnatro", "cilantro",
+ "ciltoris", "clitoris",
+ "circiuts", "circuits",
+ "circkets", "crickets",
+ "circlebs", "circles",
+ "circluar", "circular",
+ "ciricuit", "circuit",
+ "cirlcing", "circling",
+ "ciruclar", "circular",
+ "clannand", "clannad",
+ "clarifiy", "clarify",
+ "clarskon", "clarkson",
+ "clasical", "classical",
+ "classrom", "classroom",
+ "classsic", "classics",
+ "clausens", "clauses",
+ "cleanies", "cleanse",
+ "cleasner", "cleanser",
+ "clenaser", "cleanser",
+ "clevelry", "cleverly",
+ "clhorine", "chlorine",
+ "cliamtes", "climates",
+ "cliantro", "cilantro",
+ "clickare", "clicker",
+ "clickbat", "clickbait",
+ "clickear", "clicker",
+ "clientes", "clients",
+ "clincial", "clinical",
+ "clinicas", "clinics",
+ "clinicos", "clinics",
+ "clipboad", "clipboard",
+ "clitiros", "clitoris",
+ "closeing", "closing",
+ "closeley", "closely",
+ "clyamore", "claymore",
+ "clyinder", "cylinder",
+ "cmoputer", "computer",
+ "coindice", "coincide",
+ "collapes", "collapse",
+ "collares", "collars",
+ "collaris", "collars",
+ "collaros", "collars",
+ "collaspe", "collapse",
+ "colleage", "colleagues",
+ "collecte", "collective",
+ "collegue", "colleague",
+ "collisin", "collisions",
+ "collosal", "colossal",
+ "collpase", "collapse",
+ "coloardo", "colorado",
+ "colordao", "colorado",
+ "colubmia", "columbia",
+ "columnas", "columns",
+ "comadres", "comrades",
+ "comander", "commander",
+ "comandos", "commandos",
+ "comapany", "company",
+ "comapres", "compares",
+ "combiens", "combines",
+ "combinig", "combining",
+ "comediac", "comedic",
+ "comedias", "comedians",
+ "comestic", "cosmetic",
+ "comision", "commission",
+ "comiting", "committing",
+ "comitted", "committed",
+ "comittee", "committee",
+ "commandd", "commanded",
+ "commecen", "commence",
+ "commedic", "comedic",
+ "commense", "commenters",
+ "commenty", "commentary",
+ "commiest", "commits",
+ "commited", "committed",
+ "commitee", "committee",
+ "commites", "commits",
+ "committe", "committee",
+ "committs", "commits",
+ "commitus", "commits",
+ "commmand", "command",
+ "communit", "communist",
+ "companis", "companions",
+ "comparse", "compares",
+ "comparte", "compare",
+ "compasso", "compassion",
+ "compelte", "complete",
+ "compense", "compensate",
+ "complais", "complains",
+ "complane", "complacent",
+ "complate", "complacent",
+ "compleet", "complete",
+ "completi", "complexity",
+ "complets", "completes",
+ "complety", "completely",
+ "complexs", "complexes",
+ "complext", "complexity",
+ "complexy", "complexity",
+ "complict", "complicit",
+ "complier", "compiler",
+ "compones", "compose",
+ "componet", "components",
+ "componts", "compost",
+ "composet", "compost",
+ "composit", "compost",
+ "composte", "compose",
+ "comprese", "compressed",
+ "compreso", "compressor",
+ "compsers", "compress",
+ "comptown", "compton",
+ "compunet", "compute",
+ "computre", "compute",
+ "comradre", "comrade",
+ "comsetic", "cosmetic",
+ "conatins", "contains",
+ "conceald", "concealed",
+ "conceide", "conceived",
+ "conceled", "concede",
+ "concened", "concede",
+ "concepta", "conceptual",
+ "concered", "concede",
+ "concernt", "concert",
+ "concerte", "concrete",
+ "concesso", "concession",
+ "conceted", "concede",
+ "conceved", "concede",
+ "concibes", "concise",
+ "concider", "consider",
+ "concides", "concise",
+ "concious", "conscious",
+ "conclued", "conclude",
+ "concluse", "conclusive",
+ "concluso", "conclusion",
+ "concreet", "concrete",
+ "concrets", "concerts",
+ "condemnd", "condemned",
+ "conditon", "condition",
+ "condomes", "condoms",
+ "condomns", "condoms",
+ "conduict", "conduit",
+ "conected", "connected",
+ "conencts", "connects",
+ "confeses", "confess",
+ "confesos", "confess",
+ "confesso", "confession",
+ "configue", "configure",
+ "confilct", "conflict",
+ "confirmd", "confirmed",
+ "conflcit", "conflict",
+ "conflics", "conflicts",
+ "confrims", "confirms",
+ "conicide", "coincide",
+ "conlcude", "conclude",
+ "conqueor", "conquer",
+ "conquerd", "conquered",
+ "conqured", "conquered",
+ "conscent", "consent",
+ "consious", "conscious",
+ "constans", "constants",
+ "constast", "constants",
+ "constatn", "constant",
+ "constrat", "constraint",
+ "construt", "constructs",
+ "containd", "contained",
+ "containg", "containing",
+ "contaire", "containers",
+ "contanti", "contacting",
+ "contense", "contenders",
+ "contenst", "contents",
+ "contexta", "contextual",
+ "contextl", "contextual",
+ "contians", "contains",
+ "contined", "continued",
+ "contines", "continents",
+ "continum", "continuum",
+ "continus", "continues",
+ "continut", "continuity",
+ "continuu", "continuous",
+ "contracr", "contractor",
+ "contracs", "contracts",
+ "controll", "control",
+ "contruct", "construct",
+ "convenit", "convenient",
+ "convento", "convention",
+ "converst", "converts",
+ "convertr", "converter",
+ "conviced", "convinced",
+ "convicto", "conviction",
+ "convingi", "convincing",
+ "convinse", "convinces",
+ "cooldows", "cooldowns",
+ "coordine", "coordinate",
+ "coralina", "carolina",
+ "corollla", "corolla",
+ "corolloa", "corolla",
+ "corosion", "corrosion",
+ "corpsers", "corpses",
+ "corrdior", "corridor",
+ "correcty", "correctly",
+ "correnti", "correcting",
+ "corretly", "correctly",
+ "corrupto", "corruption",
+ "cosemtic", "cosmetic",
+ "cosutmes", "costumes",
+ "couldnot", "couldnt",
+ "coulored", "coloured",
+ "counries", "countries",
+ "counseil", "counsel",
+ "counsole", "counsel",
+ "counterd", "countered",
+ "countert", "counteract",
+ "countres", "counters",
+ "courtrom", "courtroom",
+ "courtsey", "courtesy",
+ "cousines", "cousins",
+ "cousings", "cousins",
+ "coutners", "counters",
+ "covanent", "covenant",
+ "coverted", "converted",
+ "coyotees", "coyotes",
+ "cpatains", "captains",
+ "cranbery", "cranberry",
+ "crayones", "crayons",
+ "creaeted", "created",
+ "createin", "creatine",
+ "createur", "creature",
+ "creatien", "creatine",
+ "creepgin", "creeping",
+ "cricling", "circling",
+ "cringely", "cringey",
+ "cringery", "cringey",
+ "criticas", "critics",
+ "critices", "critics",
+ "criticie", "criticise",
+ "criticim", "criticisms",
+ "criticis", "critics",
+ "criticms", "critics",
+ "criticos", "critics",
+ "criticts", "critics",
+ "criticus", "critics",
+ "critiera", "criteria",
+ "critized", "criticized",
+ "croatioa", "croatia",
+ "crossfie", "crossfire",
+ "crosshar", "crosshair",
+ "crosspot", "crosspost",
+ "crowbahr", "crowbar",
+ "cruasder", "crusader",
+ "cruciaal", "crucial",
+ "crucibel", "crucible",
+ "cruicble", "crucible",
+ "crusdaer", "crusader",
+ "crusiers", "cruisers",
+ "crusiing", "cruising",
+ "cruthces", "crutches",
+ "cthulhlu", "cthulhu",
+ "cthulluh", "cthulhu",
+ "cubpoard", "cupboard",
+ "cuddleys", "cuddles",
+ "culprint", "culprit",
+ "cultrual", "cultural",
+ "culutral", "cultural",
+ "cupbaord", "cupboard",
+ "cupborad", "cupboard",
+ "curcible", "crucible",
+ "curisers", "cruisers",
+ "curising", "cruising",
+ "currecny", "currency",
+ "currence", "currencies",
+ "currenly", "currently",
+ "currenty", "currently",
+ "cursader", "crusader",
+ "custcene", "cutscene",
+ "cutsceen", "cutscene",
+ "cutscens", "cutscenes",
+ "cutsence", "cutscene",
+ "cylcists", "cyclists",
+ "cylidner", "cylinder",
+ "cylindre", "cylinder",
+ "cynisicm", "cynicism",
+ "cyrstals", "crystals",
+ "dacquiri", "daiquiri",
+ "daimonds", "diamonds",
+ "dangeros", "dangers",
+ "dangerus", "dangers",
+ "darkenss", "darkness",
+ "darnkess", "darkness",
+ "dashboad", "dashboard",
+ "daugther", "daughter",
+ "deadlfit", "deadlift",
+ "deadlifs", "deadlifts",
+ "deafauts", "defaults",
+ "deafeted", "defeated",
+ "deafults", "defaults",
+ "dealying", "delaying",
+ "deamenor", "demeanor",
+ "deathcat", "deathmatch",
+ "debuffes", "debuffs",
+ "debufffs", "debuffs",
+ "decalred", "declared",
+ "decalres", "declares",
+ "decembre", "december",
+ "decidely", "decidedly",
+ "decieved", "deceived",
+ "decifits", "deficits",
+ "decipted", "depicted",
+ "declears", "declares",
+ "declinig", "declining",
+ "decmeber", "december",
+ "decribed", "described",
+ "decribes", "describes",
+ "dedicato", "dedication",
+ "deductie", "deductible",
+ "defautls", "defaults",
+ "defectos", "defects",
+ "defectus", "defects",
+ "defendas", "defends",
+ "defendes", "defenders",
+ "defendis", "defends",
+ "defendre", "defender",
+ "defendrs", "defends",
+ "defensea", "defenseman",
+ "defensen", "defenseman",
+ "defensie", "defensive",
+ "defetead", "defeated",
+ "deffined", "defined",
+ "deficiet", "deficient",
+ "definate", "definite",
+ "definaty", "definately",
+ "definety", "definetly",
+ "definito", "definition",
+ "definitv", "definitive",
+ "deflatin", "deflation",
+ "deflecto", "deflection",
+ "defualts", "defaults",
+ "degarded", "degraded",
+ "degenere", "degenerate",
+ "degraged", "degrade",
+ "degrated", "degrade",
+ "deisgned", "designed",
+ "deisgner", "designer",
+ "dekstops", "desktops",
+ "delcared", "declared",
+ "delcares", "declares",
+ "delepted", "depleted",
+ "delivere", "deliveries",
+ "delpeted", "depleted",
+ "delpoyed", "deployed",
+ "delyaing", "delaying",
+ "demandas", "demands",
+ "demandes", "demands",
+ "demenaor", "demeanor",
+ "democray", "democracy",
+ "demolito", "demolition",
+ "denseley", "densely",
+ "densitiy", "density",
+ "deomcrat", "democrat",
+ "deovtion", "devotion",
+ "departer", "departure",
+ "departue", "departure",
+ "depcited", "depicted",
+ "depelted", "depleted",
+ "dependat", "dependant",
+ "depictes", "depicts",
+ "depictin", "depictions",
+ "depolyed", "deployed",
+ "depositd", "deposited",
+ "depostis", "deposits",
+ "depresse", "depressive",
+ "depresso", "depression",
+ "derivate", "derivative",
+ "descened", "descend",
+ "descibed", "described",
+ "descirbe", "describe",
+ "descrise", "describes",
+ "desgined", "designed",
+ "desginer", "designer",
+ "desicive", "decisive",
+ "designad", "designated",
+ "designes", "designs",
+ "designet", "designated",
+ "desinged", "designed",
+ "desinger", "designer",
+ "desitned", "destined",
+ "desktiop", "desktop",
+ "desorder", "disorder",
+ "despides", "despised",
+ "despiste", "despise",
+ "destiney", "destiny",
+ "destinty", "destiny",
+ "destkops", "desktops",
+ "destorys", "destroys",
+ "destrose", "destroyers",
+ "destroyd", "destroyed",
+ "destroyr", "destroyers",
+ "detalied", "detailed",
+ "detectas", "detects",
+ "detectes", "detects",
+ "detectie", "detectives",
+ "determen", "determines",
+ "devasted", "devastated",
+ "develope", "develop",
+ "devialet", "deviate",
+ "deviatie", "deviate",
+ "devilers", "delivers",
+ "devloved", "devolved",
+ "devovled", "devolved",
+ "diaganol", "diagonal",
+ "diagnoal", "diagonal",
+ "diagnoes", "diagnose",
+ "diagnosi", "diagnostic",
+ "diagonse", "diagnose",
+ "diahrrea", "diarrhea",
+ "dialetcs", "dialects",
+ "dialgoue", "dialogue",
+ "dialouge", "dialogue",
+ "diarreah", "diarrhea",
+ "diarreha", "diarrhea",
+ "dichtomy", "dichotomy",
+ "dickisch", "dickish",
+ "dicovers", "discovers",
+ "dicovery", "discovery",
+ "dicussed", "discussed",
+ "diferent", "different",
+ "differnt", "different",
+ "difficut", "difficulty",
+ "diffrent", "different",
+ "diganose", "diagnose",
+ "dignitiy", "dignity",
+ "dimaonds", "diamonds",
+ "dinasour", "dinosaur",
+ "dinosaus", "dinosaurs",
+ "dinosuar", "dinosaur",
+ "dinsoaur", "dinosaur",
+ "dionsaur", "dinosaur",
+ "diphtong", "diphthong",
+ "diplomma", "diploma",
+ "dipthong", "diphthong",
+ "direclty", "directly",
+ "directin", "directions",
+ "directix", "directx",
+ "directos", "directors",
+ "directoy", "directory",
+ "directrx", "directx",
+ "dirfting", "drifting",
+ "disabeld", "disabled",
+ "disabels", "disables",
+ "disagred", "disagreed",
+ "disagres", "disagrees",
+ "disbaled", "disabled",
+ "disbales", "disables",
+ "disbelif", "disbelief",
+ "dischard", "discharged",
+ "dischare", "discharged",
+ "discound", "discounted",
+ "discoure", "discourse",
+ "discoved", "discovered",
+ "discreto", "discretion",
+ "discribe", "describe",
+ "disentry", "dysentery",
+ "disgiuse", "disguise",
+ "dishoner", "dishonored",
+ "dishonet", "dishonesty",
+ "dislikse", "dislikes",
+ "dismante", "dismantle",
+ "dismisse", "dismissive",
+ "disolved", "dissolved",
+ "dispacth", "dispatch",
+ "dispalys", "displays",
+ "dispence", "dispense",
+ "dispersa", "dispensary",
+ "displayd", "displayed",
+ "disposle", "dispose",
+ "disposte", "dispose",
+ "dispoves", "dispose",
+ "disptach", "dispatch",
+ "disricts", "districts",
+ "dissovle", "dissolve",
+ "distates", "distaste",
+ "distatse", "distaste",
+ "disticnt", "distinct",
+ "distorto", "distortion",
+ "distrcit", "district",
+ "districs", "districts",
+ "disturbd", "disturbed",
+ "disupted", "disputed",
+ "disuptes", "disputes",
+ "diversed", "diverse",
+ "diversiy", "diversify",
+ "dividens", "dividends",
+ "divintiy", "divinity",
+ "divisons", "divisions",
+ "doapmine", "dopamine",
+ "docrines", "doctrines",
+ "docrtine", "doctrine",
+ "doctines", "doctrines",
+ "doctirne", "doctrine",
+ "doctrins", "doctrines",
+ "dogamtic", "dogmatic",
+ "dolhpins", "dolphins",
+ "domapine", "dopamine",
+ "domecrat", "democrat",
+ "domiante", "dominate",
+ "dominato", "domination",
+ "dominats", "dominates",
+ "dominent", "dominant",
+ "dominoin", "dominion",
+ "donwload", "download",
+ "donwvote", "downvote",
+ "doomdsay", "doomsday",
+ "doosmday", "doomsday",
+ "doplhins", "dolphins",
+ "dopmaine", "dopamine",
+ "dormtund", "dortmund",
+ "dortumnd", "dortmund",
+ "dotrmund", "dortmund",
+ "douchely", "douchey",
+ "doucheus", "douches",
+ "dowloads", "downloads",
+ "downlaod", "download",
+ "downloas", "downloads",
+ "downstar", "downstairs",
+ "downvore", "downvoters",
+ "downvotr", "downvoters",
+ "downvots", "downvotes",
+ "draculea", "dracula",
+ "draculla", "dracula",
+ "dragones", "dragons",
+ "dragonus", "dragons",
+ "drfiting", "drifting",
+ "driectly", "directly",
+ "drifitng", "drifting",
+ "driveris", "drivers",
+ "drotmund", "dortmund",
+ "duaghter", "daughter",
+ "dumbbels", "dumbbells",
+ "dumptser", "dumpster",
+ "dumspter", "dumpster",
+ "dunegons", "dungeons",
+ "dungeoun", "dungeon",
+ "dungoens", "dungeons",
+ "dupicate", "duplicate",
+ "duplicas", "duplicates",
+ "dwarvens", "dwarves",
+ "dyanmics", "dynamics",
+ "dyanmite", "dynamite",
+ "dymanics", "dynamics",
+ "dymanite", "dynamite",
+ "dynastry", "dynasty",
+ "dysentry", "dysentery",
+ "dysphora", "dysphoria",
+ "earilest", "earliest",
+ "eatswood", "eastwood",
+ "eceonomy", "economy",
+ "ecidious", "deciduous",
+ "ecologia", "ecological",
+ "ecomonic", "economic",
+ "ecstacys", "ecstasy",
+ "ecstascy", "ecstasy",
+ "ecstasty", "ecstasy",
+ "ectastic", "ecstatic",
+ "editoras", "editors",
+ "editores", "editors",
+ "efficent", "efficient",
+ "egpytian", "egyptian",
+ "egyptain", "egyptian",
+ "egytpian", "egyptian",
+ "ehtereal", "ethereal",
+ "ehternet", "ethernet",
+ "eigtheen", "eighteen",
+ "electhor", "electro",
+ "electorn", "electron",
+ "elementy", "elementary",
+ "elephans", "elephants",
+ "elevatin", "elevation",
+ "elicided", "elicited",
+ "eligable", "eligible",
+ "elimiate", "eliminate",
+ "eliminas", "eliminates",
+ "elitisim", "elitism",
+ "elitistm", "elitism",
+ "ellected", "elected",
+ "embarass", "embarrass",
+ "embargos", "embargoes",
+ "embarras", "embarrass",
+ "embassay", "embassy",
+ "embassey", "embassy",
+ "embasssy", "embassy",
+ "emergend", "emerged",
+ "emergerd", "emerged",
+ "eminated", "emanated",
+ "emminent", "eminent",
+ "emmisary", "emissary",
+ "emmision", "emission",
+ "emmiting", "emitting",
+ "emmitted", "emitted",
+ "empathie", "empathize",
+ "empirial", "empirical",
+ "emulatin", "emulation",
+ "enahnces", "enhances",
+ "enchanct", "enchant",
+ "encolsed", "enclosed",
+ "endanged", "endangered",
+ "endevors", "endeavors",
+ "endevour", "endeavour",
+ "endlessy", "endlessly",
+ "endorces", "endorse",
+ "engeneer", "engineer",
+ "engeries", "energies",
+ "engineed", "engineered",
+ "engrames", "engrams",
+ "engramms", "engrams",
+ "enigneer", "engineer",
+ "enitrely", "entirely",
+ "enlcosed", "enclosed",
+ "enlsaved", "enslaved",
+ "ensalved", "enslaved",
+ "enterity", "entirety",
+ "entierly", "entirely",
+ "entierty", "entirety",
+ "entilted", "entitled",
+ "entirley", "entirely",
+ "entiteld", "entitled",
+ "entitity", "entity",
+ "entropay", "entropy",
+ "entrophy", "entropy",
+ "ephipany", "epiphany",
+ "epihpany", "epiphany",
+ "epilespy", "epilepsy",
+ "epilgoue", "epilogue",
+ "episdoes", "episodes",
+ "epitomie", "epitome",
+ "epliepsy", "epilepsy",
+ "epliogue", "epilogue",
+ "epsiodes", "episodes",
+ "epsresso", "espresso",
+ "eqaulity", "equality",
+ "eqaution", "equation",
+ "equailty", "equality",
+ "eraticly", "erratically",
+ "erroneos", "erroneous",
+ "errupted", "erupted",
+ "escalato", "escalation",
+ "esctatic", "ecstatic",
+ "esential", "essential",
+ "esitmate", "estimate",
+ "esperate", "seperate",
+ "esportes", "esports",
+ "estiamte", "estimate",
+ "estoeric", "esoteric",
+ "estonija", "estonia",
+ "estoniya", "estonia",
+ "etherael", "ethereal",
+ "etherent", "ethernet",
+ "ethicaly", "ethically",
+ "etiquete", "etiquette",
+ "etrailer", "retailer",
+ "eugencis", "eugenics",
+ "eugneics", "eugenics",
+ "euhporia", "euphoria",
+ "euhporic", "euphoric",
+ "euorpean", "european",
+ "euphoira", "euphoria",
+ "euphroia", "euphoria",
+ "euphroic", "euphoric",
+ "europian", "european",
+ "eurpoean", "european",
+ "evangers", "avengers",
+ "everyons", "everyones",
+ "evidencd", "evidenced",
+ "evidende", "evidenced",
+ "evloving", "evolving",
+ "evolveds", "evolves",
+ "evolveos", "evolves",
+ "evovling", "evolving",
+ "excecute", "execute",
+ "excedded", "exceeded",
+ "excelent", "excellent",
+ "exceptin", "exceptions",
+ "excerise", "exercise",
+ "excisted", "existed",
+ "exclusie", "exclusives",
+ "exculded", "excluded",
+ "exculdes", "excludes",
+ "exection", "execution",
+ "exectued", "executed",
+ "executie", "executive",
+ "executin", "execution",
+ "exellent", "excellent",
+ "exerbate", "exacerbate",
+ "exercide", "exercised",
+ "exercies", "exercise",
+ "exersice", "exercise",
+ "exersize", "exercise",
+ "exhalted", "exalted",
+ "exhaustn", "exhaustion",
+ "exhausto", "exhaustion",
+ "exicting", "exciting",
+ "exisitng", "existing",
+ "existane", "existance",
+ "existant", "existent",
+ "existend", "existed",
+ "exlcuded", "excluded",
+ "exlcudes", "excludes",
+ "exlporer", "explorer",
+ "exoticas", "exotics",
+ "exoticos", "exotics",
+ "expalins", "explains",
+ "expandas", "expands",
+ "expandes", "expands",
+ "expansie", "expansive",
+ "expectes", "expects",
+ "expectus", "expects",
+ "expedito", "expedition",
+ "expences", "expense",
+ "expensie", "expense",
+ "expensve", "expense",
+ "expertas", "experts",
+ "expertis", "experts",
+ "expertos", "experts",
+ "expireds", "expires",
+ "explaind", "explained",
+ "explaing", "explaining",
+ "expliots", "exploits",
+ "explodie", "explode",
+ "exploint", "exploit",
+ "explosie", "explosive",
+ "explosin", "explosions",
+ "exploted", "explode",
+ "expoldes", "explodes",
+ "expolits", "exploits",
+ "exportas", "exports",
+ "exportes", "exports",
+ "exportfs", "exports",
+ "exposees", "exposes",
+ "exposito", "exposition",
+ "expresse", "expressive",
+ "expresss", "expresses",
+ "expressy", "expressly",
+ "exressed", "expressed",
+ "exsitent", "existent",
+ "exsiting", "existing",
+ "extactly", "exactly",
+ "extemely", "extremely",
+ "extendes", "extends",
+ "extendos", "extends",
+ "extenion", "extension",
+ "extensie", "extensive",
+ "extensis", "extensions",
+ "extortin", "extortion",
+ "extracto", "extraction",
+ "extreems", "extremes",
+ "extremly", "extremely",
+ "eygptian", "egyptian",
+ "faboulus", "fabulous",
+ "fabricas", "fabrics",
+ "fabrices", "fabrics",
+ "fabricus", "fabrics",
+ "faceplam", "facepalm",
+ "facilisi", "facilities",
+ "faciltiy", "facility",
+ "facsists", "fascists",
+ "factores", "factors",
+ "factorys", "factors",
+ "factualy", "factually",
+ "faggotts", "faggots",
+ "faggotus", "faggots",
+ "falcones", "falcons",
+ "falgship", "flagship",
+ "faliures", "failures",
+ "falseley", "falsely",
+ "falshing", "flashing",
+ "falvored", "flavored",
+ "falvours", "flavours",
+ "familair", "familiar",
+ "famoulsy", "famously",
+ "fanatism", "fanaticism",
+ "fanatsic", "fanatics",
+ "fanserve", "fanservice",
+ "fantasty", "fantasy",
+ "farcking", "fracking",
+ "fascisim", "fascism",
+ "fashiond", "fashioned",
+ "fasicsts", "fascists",
+ "fatigure", "fatigue",
+ "favorits", "favorites",
+ "favourie", "favourites",
+ "feasable", "feasible",
+ "feasbile", "feasible",
+ "febraury", "february",
+ "februray", "february",
+ "feburary", "february",
+ "fedility", "fidelity",
+ "fedorahs", "fedoras",
+ "fedorans", "fedoras",
+ "feilding", "fielding",
+ "feisable", "feasible",
+ "feitshes", "fetishes",
+ "feltcher", "fletcher",
+ "felxible", "flexible",
+ "feminint", "femininity",
+ "feminsim", "feminism",
+ "feromone", "pheromone",
+ "fesiable", "feasible",
+ "festivas", "festivals",
+ "festivle", "festive",
+ "fictious", "fictitious",
+ "fideling", "fielding",
+ "fideltiy", "fidelity",
+ "fiedling", "fielding",
+ "fiedlity", "fidelity",
+ "fighitng", "fighting",
+ "figthing", "fighting",
+ "fileding", "fielding",
+ "fimilies", "families",
+ "finacial", "financial",
+ "fineshes", "finesse",
+ "fingersi", "fingertips",
+ "finnisch", "finnish",
+ "finsihes", "finishes",
+ "firebals", "fireballs",
+ "firendly", "friendly",
+ "firmwear", "firmware",
+ "firwmare", "firmware",
+ "flaghsip", "flagship",
+ "flamable", "flammable",
+ "flasghip", "flagship",
+ "flatterd", "flattered",
+ "flatteur", "flatter",
+ "flattire", "flatter",
+ "flavores", "flavors",
+ "flechter", "fletcher",
+ "flecther", "fletcher",
+ "flemmish", "flemish",
+ "flethcer", "fletcher",
+ "flexbile", "flexible",
+ "flexibel", "flexible",
+ "flippade", "flipped",
+ "flitered", "filtered",
+ "florecen", "florence",
+ "floridia", "florida",
+ "floruide", "fluoride",
+ "floruish", "flourish",
+ "flourine", "fluorine",
+ "floursih", "flourish",
+ "fluorish", "flourish",
+ "fluroide", "fluoride",
+ "folowing", "following",
+ "fontrier", "fontier",
+ "forasken", "forsaken",
+ "forbiden", "forbidden",
+ "foreamrs", "forearms",
+ "foreksin", "foreskin",
+ "forenics", "forensic",
+ "forenisc", "forensic",
+ "foresnic", "forensic",
+ "foreward", "foreword",
+ "foricbly", "forcibly",
+ "forigven", "forgiven",
+ "formatin", "formation",
+ "formelly", "formerly",
+ "formuals", "formulas",
+ "fornesic", "forensic",
+ "forresst", "forrest",
+ "forsekan", "forsaken",
+ "forsekin", "foreskin",
+ "forsenic", "forensic",
+ "forskaen", "forsaken",
+ "forsting", "frosting",
+ "fortitue", "fortitude",
+ "fortunae", "fortune",
+ "fortunte", "fortune",
+ "forumlas", "formulas",
+ "forunner", "forerunner",
+ "fossiles", "fossils",
+ "fossilis", "fossils",
+ "foundary", "foundry",
+ "fountian", "fountain",
+ "fourties", "forties",
+ "fowrards", "forwards",
+ "frackign", "fracking",
+ "framgent", "fragment",
+ "franches", "franchise",
+ "franchie", "franchises",
+ "franciso", "francisco",
+ "frankiln", "franklin",
+ "franlkin", "franklin",
+ "freckels", "freckles",
+ "freindly", "friendly",
+ "frequeny", "frequency",
+ "friendle", "friendlies",
+ "friendsi", "friendlies",
+ "frimware", "firmware",
+ "frogiven", "forgiven",
+ "frointer", "frontier",
+ "fromerly", "formerly",
+ "froniter", "frontier",
+ "fronteir", "frontier",
+ "frosaken", "forsaken",
+ "frutcose", "fructose",
+ "fucntion", "function",
+ "fufilled", "fulfilled",
+ "fulfiled", "fulfilled",
+ "fullfill", "fulfill",
+ "funciton", "function",
+ "fundirse", "fundies",
+ "funniliy", "funnily",
+ "funnilly", "funnily",
+ "furctose", "fructose",
+ "furition", "fruition",
+ "furuther", "further",
+ "futurers", "futures",
+ "futureus", "futures",
+ "gamemdoe", "gamemode",
+ "gamepaly", "gameplay",
+ "gamergat", "gamertag",
+ "gammeode", "gamemode",
+ "ganerate", "generate",
+ "garantee", "guarantee",
+ "gardient", "gradient",
+ "garfeild", "garfield",
+ "garfiled", "garfield",
+ "garflied", "garfield",
+ "garnison", "garrison",
+ "garrions", "garrison",
+ "garriosn", "garrison",
+ "garrsion", "garrison",
+ "gatherig", "gatherings",
+ "gauarana", "guaraná",
+ "gauntelt", "gauntlet",
+ "gauntles", "gauntlets",
+ "gaurdian", "guardian",
+ "gaurding", "guarding",
+ "gautnlet", "gauntlet",
+ "gemoetry", "geometry",
+ "generaly", "generally",
+ "generase", "generates",
+ "generats", "generates",
+ "genialia", "genitalia",
+ "genisues", "geniuses",
+ "genitala", "genitalia",
+ "genrates", "generates",
+ "gentials", "genitals",
+ "gentlemn", "gentlemen",
+ "genuises", "geniuses",
+ "geograpy", "geography",
+ "geomerty", "geometry",
+ "geomtery", "geometry",
+ "germanos", "germans",
+ "germanus", "germans",
+ "gernades", "grenades",
+ "giagbyte", "gigabyte",
+ "gigabtye", "gigabyte",
+ "gigaybte", "gigabyte",
+ "gigbayte", "gigabyte",
+ "gignatic", "gigantic",
+ "giltched", "glitched",
+ "giltches", "glitches",
+ "girafffe", "giraffe",
+ "girefing", "griefing",
+ "girlling", "grilling",
+ "gladiatr", "gladiator",
+ "glichted", "glitched",
+ "glichtes", "glitches",
+ "glicthed", "glitched",
+ "glicthes", "glitches",
+ "glitchey", "glitchy",
+ "glitchly", "glitchy",
+ "glitchty", "glitchy",
+ "glithced", "glitched",
+ "glithces", "glitches",
+ "gloablly", "globally",
+ "glodberg", "goldberg",
+ "glodfish", "goldfish",
+ "gloriuos", "glorious",
+ "gltiched", "glitched",
+ "gltiches", "glitches",
+ "gmaertag", "gamertag",
+ "goblings", "goblins",
+ "goddammn", "goddamn",
+ "goddammt", "goddammit",
+ "godesses", "goddesses",
+ "godlberg", "goldberg",
+ "godlfish", "goldfish",
+ "godounov", "godunov",
+ "godpseed", "godspeed",
+ "godspede", "godspeed",
+ "goldifsh", "goldfish",
+ "gonewidl", "gonewild",
+ "goodlcuk", "goodluck",
+ "goregous", "gorgeous",
+ "gorgoeus", "gorgeous",
+ "gorillia", "gorilla",
+ "gorillla", "gorilla",
+ "gospells", "gospels",
+ "gottleib", "gottlieb",
+ "gourmelt", "gourmet",
+ "gourment", "gourmet",
+ "gouvener", "governor",
+ "govement", "government",
+ "goverend", "governed",
+ "govermet", "goverment",
+ "governer", "governor",
+ "gradualy", "gradually",
+ "grafield", "garfield",
+ "grafitti", "graffiti",
+ "grahpics", "graphics",
+ "grahpite", "graphite",
+ "graident", "gradient",
+ "granolla", "granola",
+ "graphcis", "graphics",
+ "grapichs", "graphics",
+ "grappnel", "grapple",
+ "greandes", "grenades",
+ "greatful", "grateful",
+ "greeneer", "greener",
+ "greenhoe", "greenhouse",
+ "greenlad", "greenland",
+ "greenore", "greener",
+ "greusome", "gruesome",
+ "grieifng", "griefing",
+ "grifeing", "griefing",
+ "grizzlay", "grizzly",
+ "grizzley", "grizzly",
+ "grpahics", "graphics",
+ "grpahite", "graphite",
+ "gruseome", "gruesome",
+ "guantano", "guantanamo",
+ "guardain", "guardian",
+ "guardias", "guardians",
+ "guaridan", "guardian",
+ "guerrila", "guerrilla",
+ "guidence", "guidance",
+ "guiseppe", "giuseppe",
+ "guitards", "guitars",
+ "guitares", "guitars",
+ "guitarit", "guitarist",
+ "gullbile", "gullible",
+ "gunanine", "guanine",
+ "guniness", "guinness",
+ "gunniess", "guinness",
+ "guradian", "guardian",
+ "gurading", "guarding",
+ "gurantee", "guarantee",
+ "guresome", "gruesome",
+ "guttaral", "guttural",
+ "gutteral", "guttural",
+ "hacthing", "hatching",
+ "hafltime", "halftime",
+ "haircuit", "haircut",
+ "halfitme", "halftime",
+ "hallowen", "halloween",
+ "hamburgr", "hamburgers",
+ "hamitlon", "hamilton",
+ "hamliton", "hamilton",
+ "handcufs", "handcuffs",
+ "handeldy", "handedly",
+ "handlade", "handled",
+ "handlare", "handler",
+ "handledy", "handedly",
+ "hannbial", "hannibal",
+ "haording", "hoarding",
+ "hapening", "happening",
+ "happends", "happens",
+ "happenes", "happens",
+ "happilly", "happily",
+ "harldine", "hardline",
+ "harrased", "harassed",
+ "harrases", "harasses",
+ "hatchign", "hatching",
+ "hatesink", "heatsink",
+ "hathcing", "hatching",
+ "headachs", "headaches",
+ "headests", "headsets",
+ "headhsot", "headshot",
+ "headseat", "headset",
+ "healthit", "healthiest",
+ "heastink", "heatsink",
+ "heathern", "heathen",
+ "heatskin", "heatsink",
+ "heaviliy", "heavily",
+ "heavilly", "heavily",
+ "heavnely", "heavenly",
+ "hedeghog", "hedgehog",
+ "hegdehog", "hedgehog",
+ "heighest", "heights",
+ "heighted", "heightened",
+ "heirachy", "hierarchy",
+ "heistant", "hesitant",
+ "heistate", "hesitate",
+ "hellifre", "hellfire",
+ "helluvva", "helluva",
+ "helpfull", "helpful",
+ "heratige", "heritage",
+ "herclues", "hercules",
+ "heridity", "heredity",
+ "heroicas", "heroics",
+ "heroices", "heroics",
+ "heroicos", "heroics",
+ "heroicus", "heroics",
+ "hertiage", "heritage",
+ "herucles", "hercules",
+ "hestiant", "hesitant",
+ "hestiate", "hesitate",
+ "heveanly", "heavenly",
+ "hierachy", "hierarchy",
+ "hierarcy", "hierarchy",
+ "highlane", "highlander",
+ "hindiusm", "hinduism",
+ "hindusim", "hinduism",
+ "hinudism", "hinduism",
+ "hiptsers", "hipsters",
+ "hispanis", "hispanics",
+ "hispters", "hipsters",
+ "histroic", "historic",
+ "hodlings", "holdings",
+ "hoenstly", "honestly",
+ "hoildays", "holidays",
+ "holdiays", "holidays",
+ "hollywod", "hollywood",
+ "homeword", "homeworld",
+ "homineim", "hominem",
+ "homineum", "hominem",
+ "honeslty", "honestly",
+ "honeymon", "honeymoon",
+ "honsetly", "honestly",
+ "hopefuly", "hopefully",
+ "hopkings", "hopkins",
+ "hopsital", "hospital",
+ "horading", "hoarding",
+ "horzions", "horizons",
+ "hosptial", "hospital",
+ "hosteles", "hostels",
+ "hostiliy", "hostility",
+ "hotshoot", "hotshot",
+ "hotsport", "hotspot",
+ "hsyteria", "hysteria",
+ "htaching", "hatching",
+ "htiboxes", "hitboxes",
+ "huanting", "haunting",
+ "humaniod", "humanoid",
+ "humanite", "humanities",
+ "humantiy", "humanity",
+ "humerous", "humorous",
+ "huminoid", "humanoid",
+ "humitidy", "humidity",
+ "humoural", "humoral",
+ "humouros", "humorous",
+ "humurous", "humorous",
+ "hunderds", "hundreds",
+ "hundread", "hundred",
+ "hungarin", "hungarian",
+ "huntmsan", "huntsman",
+ "hutnsman", "huntsman",
+ "hybrides", "hybrids",
+ "hybridus", "hybrids",
+ "hydorgen", "hydrogen",
+ "hydratin", "hydration",
+ "hydregon", "hydrogen",
+ "hygience", "hygiene",
+ "hygienne", "hygiene",
+ "hyperbel", "hyperbole",
+ "hypocrit", "hypocrite",
+ "hyponsis", "hypnosis",
+ "hyrdogen", "hydrogen",
+ "icefrong", "icefrog",
+ "icelings", "ceilings",
+ "idaeidae", "idea",
+ "idealogy", "ideology",
+ "idealsim", "idealism",
+ "idenfity", "identify",
+ "idenitfy", "identify",
+ "identite", "identities",
+ "ideologe", "ideologies",
+ "illiegal", "illegal",
+ "illinios", "illinois",
+ "illionis", "illinois",
+ "illnesss", "illnesses",
+ "illumini", "illuminati",
+ "illustre", "illustrate",
+ "illution", "illusion",
+ "ilogical", "illogical",
+ "ilterate", "literate",
+ "imapired", "impaired",
+ "imgrants", "migrants",
+ "imigrant", "emigrant",
+ "immboile", "immobile",
+ "immenint", "imminent",
+ "immersie", "immerse",
+ "immersve", "immerse",
+ "immitate", "imitate",
+ "immoblie", "immobile",
+ "immortas", "immortals",
+ "impactes", "impacts",
+ "impactos", "impacts",
+ "imparied", "impaired",
+ "imperavi", "imperative",
+ "imperfet", "imperfect",
+ "implemet", "implements",
+ "implosed", "implode",
+ "impluses", "impulses",
+ "imporper", "improper",
+ "importas", "imports",
+ "importen", "importance",
+ "importes", "imports",
+ "imporved", "improved",
+ "imporves", "improves",
+ "impropre", "improper",
+ "improted", "imported",
+ "improvie", "improvised",
+ "impusles", "impulses",
+ "imrpoved", "improved",
+ "imrpoves", "improves",
+ "inbetwen", "inbetween",
+ "inclince", "incline",
+ "inclinde", "incline",
+ "includng", "including",
+ "incorect", "incorrect",
+ "incuding", "including",
+ "inculded", "included",
+ "indianas", "indians",
+ "indiands", "indians",
+ "indiania", "indiana",
+ "indianna", "indiana",
+ "indianos", "indians",
+ "indicato", "indication",
+ "indicats", "indicators",
+ "indonesa", "indonesia",
+ "indulgue", "indulge",
+ "infantis", "infants",
+ "infantus", "infants",
+ "infarred", "infrared",
+ "infectin", "infections",
+ "infermon", "inferno",
+ "infiltre", "infiltrate",
+ "infintie", "infinite",
+ "infintiy", "infinity",
+ "inflatie", "inflate",
+ "influens", "influences",
+ "informas", "informs",
+ "informis", "informs",
+ "infromal", "informal",
+ "infromed", "informed",
+ "ingenius", "ingenious",
+ "ingition", "ignition",
+ "ingorant", "ignorant",
+ "inheriet", "inherit",
+ "inherint", "inherit",
+ "inhumaan", "inhuman",
+ "inhumain", "inhuman",
+ "inifnite", "infinite",
+ "inifnity", "infinity",
+ "inisghts", "insights",
+ "initails", "initials",
+ "initaite", "initiate",
+ "initaled", "initialed",
+ "initally", "initially",
+ "initialy", "initially",
+ "initmacy", "intimacy",
+ "initmate", "intimate",
+ "injustie", "injustices",
+ "inlcuded", "included",
+ "inlcudes", "includes",
+ "innocens", "innocents",
+ "innocuos", "innocuous",
+ "innvoate", "innovate",
+ "inocence", "innocence",
+ "inpolite", "impolite",
+ "inpsired", "inspired",
+ "inquirey", "inquiry",
+ "inquirie", "inquire",
+ "inquiriy", "inquiry",
+ "inrested", "inserted",
+ "insanley", "insanely",
+ "insectes", "insects",
+ "insectos", "insects",
+ "insertas", "inserts",
+ "insertes", "inserts",
+ "insertos", "inserts",
+ "insidios", "insidious",
+ "insigths", "insights",
+ "insipred", "inspired",
+ "insipres", "inspires",
+ "insistas", "insists",
+ "insistes", "insists",
+ "insistis", "insists",
+ "insmonia", "insomnia",
+ "insomina", "insomnia",
+ "insonmia", "insomnia",
+ "inspried", "inspired",
+ "inspries", "inspires",
+ "instanse", "instances",
+ "instanty", "instantly",
+ "instered", "inserted",
+ "insticnt", "instinct",
+ "instincs", "instincts",
+ "institue", "institute",
+ "insultas", "insults",
+ "insultes", "insults",
+ "insultos", "insults",
+ "intamicy", "intimacy",
+ "intamite", "intimate",
+ "intendes", "intends",
+ "intendos", "intends",
+ "intentas", "intents",
+ "intented", "intended",
+ "interace", "interacted",
+ "interacs", "interacts",
+ "interect", "interacted",
+ "interent", "internet",
+ "interese", "interested",
+ "interfce", "interface",
+ "intergal", "integral",
+ "internts", "interns",
+ "internus", "interns",
+ "interpet", "interpret",
+ "interrim", "interim",
+ "interste", "interstate",
+ "interupt", "interrupt",
+ "intevene", "intervene",
+ "intially", "initially",
+ "intiials", "initials",
+ "intimaty", "intimately",
+ "intimide", "intimidate",
+ "intregal", "integral",
+ "intriuge", "intrigue",
+ "introdue", "introduces",
+ "introdus", "introduces",
+ "introvet", "introvert",
+ "intruige", "intrigue",
+ "intutive", "intuitive",
+ "inudstry", "industry",
+ "inventer", "inventor",
+ "invertes", "inverse",
+ "invincil", "invincible",
+ "invitato", "invitation",
+ "invloved", "involved",
+ "invloves", "involves",
+ "invovled", "involved",
+ "invovles", "involves",
+ "iranains", "iranians",
+ "iraninas", "iranians",
+ "iritable", "irritable",
+ "iritated", "irritated",
+ "ironicly", "ironically",
+ "irritato", "irritation",
+ "isalmist", "islamist",
+ "isarelis", "israelis",
+ "islamits", "islamist",
+ "islamsit", "islamist",
+ "islandes", "islanders",
+ "ismalist", "islamist",
+ "isntalls", "installs",
+ "isolatie", "isolate",
+ "israelli", "israeli",
+ "israleis", "israelis",
+ "isralies", "israelis",
+ "isrealis", "israelis",
+ "issueing", "issuing",
+ "italains", "italians",
+ "jaguards", "jaguars",
+ "jaguares", "jaguars",
+ "jailbrek", "jailbreak",
+ "jaimacan", "jamaican",
+ "jamacain", "jamaican",
+ "jamaicia", "jamaica",
+ "jamiacan", "jamaican",
+ "januaray", "january",
+ "janurary", "january",
+ "jeapardy", "jeopardy",
+ "jefferry", "jeffery",
+ "jefferty", "jeffery",
+ "jennigns", "jennings",
+ "jeoprady", "jeopardy",
+ "jepoardy", "jeopardy",
+ "jerusalm", "jerusalem",
+ "jewelrey", "jewelry",
+ "jewllery", "jewellery",
+ "joanthan", "jonathan",
+ "joepardy", "jeopardy",
+ "johanine", "johannine",
+ "jonatahn", "jonathan",
+ "journaal", "journal",
+ "journied", "journeyed",
+ "journies", "journeys",
+ "joysitck", "joystick",
+ "juadaism", "judaism",
+ "judaisim", "judaism",
+ "judgemet", "judgements",
+ "juducial", "judicial",
+ "jugnling", "jungling",
+ "junglign", "jungling",
+ "junlging", "jungling",
+ "justifiy", "justify",
+ "juveline", "juvenile",
+ "juvenlie", "juvenile",
+ "katemine", "ketamine",
+ "kennedey", "kennedy",
+ "ketmaine", "ketamine",
+ "keybaord", "keyboard",
+ "keyboars", "keyboards",
+ "keyborad", "keyboard",
+ "keychian", "keychain",
+ "kicthens", "kitchens",
+ "kindgoms", "kingdoms",
+ "kittiens", "kitties",
+ "knockbak", "knockback",
+ "knowlege", "knowledge",
+ "knuckels", "knuckles",
+ "koreanos", "koreans",
+ "kunckles", "knuckles",
+ "kurdisch", "kurdish",
+ "labatory", "lavatory",
+ "labenese", "lebanese",
+ "laboraty", "laboratory",
+ "laguages", "languages",
+ "landscae", "landscapes",
+ "langauge", "language",
+ "lanucher", "launcher",
+ "lanuches", "launches",
+ "laodouts", "loadouts",
+ "larwence", "lawrence",
+ "lasagnea", "lasagna",
+ "lasagnia", "lasagna",
+ "laucnhed", "launched",
+ "laucnher", "launcher",
+ "laucnhes", "launches",
+ "laundrey", "laundry",
+ "lawernce", "lawrence",
+ "lazyness", "laziness",
+ "leaglize", "legalize",
+ "lecteurs", "lectures",
+ "lecutres", "lectures",
+ "lefitsts", "leftists",
+ "leftsits", "leftists",
+ "legenday", "legendary",
+ "legionis", "legions",
+ "legitimt", "legitimate",
+ "lengthes", "lengths",
+ "lengthly", "lengthy",
+ "lentiles", "lentils",
+ "lentills", "lentils",
+ "lesbains", "lesbians",
+ "lesibans", "lesbians",
+ "levander", "lavender",
+ "levelign", "leveling",
+ "levetate", "levitate",
+ "leviathn", "leviathan",
+ "levleing", "leveling",
+ "liberato", "liberation",
+ "libertae", "liberate",
+ "libertea", "liberate",
+ "librarse", "libraries",
+ "licencie", "licence",
+ "licencse", "licence",
+ "liebrals", "liberals",
+ "liekable", "likeable",
+ "lifepsan", "lifespan",
+ "lifestel", "lifesteal",
+ "lifestye", "lifestyle",
+ "lighitng", "lighting",
+ "lightnig", "lightning",
+ "lightres", "lighters",
+ "lightrom", "lightroom",
+ "ligthers", "lighters",
+ "ligthing", "lighting",
+ "likebale", "likeable",
+ "limitant", "militant",
+ "limitato", "limitation",
+ "lincolin", "lincoln",
+ "lincolon", "lincoln",
+ "lineupes", "lineups",
+ "lingeire", "lingerie",
+ "lingiere", "lingerie",
+ "linnaena", "linnaean",
+ "lipstics", "lipsticks",
+ "liquidas", "liquids",
+ "liquides", "liquids",
+ "liquidos", "liquids",
+ "liscense", "license",
+ "lisenced", "silenced",
+ "listenes", "listens",
+ "listents", "listens",
+ "listners", "listeners",
+ "litature", "literature",
+ "litecion", "litecoin",
+ "liteicon", "litecoin",
+ "literaly", "literally",
+ "lithuana", "lithuania",
+ "litigato", "litigation",
+ "liverpol", "liverpool",
+ "locagion", "location",
+ "logtiech", "logitech",
+ "longitme", "longtime",
+ "longtiem", "longtime",
+ "looseley", "loosely",
+ "loreplay", "roleplay",
+ "luanched", "launched",
+ "luancher", "launcher",
+ "luanches", "launches",
+ "lubricat", "lubricant",
+ "lucifear", "lucifer",
+ "luckilly", "luckily",
+ "macarino", "macaroni",
+ "machiens", "machines",
+ "mackeral", "mackerel",
+ "macthups", "matchups",
+ "magasine", "magazine",
+ "magazins", "magazines",
+ "magentic", "magnetic",
+ "magicain", "magician",
+ "magisine", "magazine",
+ "magizine", "magazine",
+ "magnetis", "magnets",
+ "magnited", "magnitude",
+ "magnitue", "magnitude",
+ "mainfest", "manifest",
+ "maintian", "maintain",
+ "majoroty", "majority",
+ "makrsman", "marksman",
+ "malariya", "malaria",
+ "malasiya", "malaysia",
+ "malasyia", "malaysia",
+ "malayisa", "malaysia",
+ "malyasia", "malaysia",
+ "mamalian", "mammalian",
+ "manadrin", "mandarin",
+ "manaully", "manually",
+ "mandaste", "mandates",
+ "mandrain", "mandarin",
+ "mandrian", "mandarin",
+ "maneveur", "maneuver",
+ "manevuer", "maneuver",
+ "manfiest", "manifest",
+ "mangetic", "magnetic",
+ "manglade", "mangled",
+ "manifeso", "manifesto",
+ "manipule", "manipulate",
+ "manouver", "maneuver",
+ "manuales", "manuals",
+ "manuever", "maneuver",
+ "maraconi", "macaroni",
+ "maradeur", "marauder",
+ "maraduer", "marauder",
+ "maragret", "margaret",
+ "marbleds", "marbles",
+ "margerat", "margaret",
+ "margines", "margins",
+ "margings", "margins",
+ "marginis", "margins",
+ "marignal", "marginal",
+ "marilyin", "marilyn",
+ "marinens", "marines",
+ "markedet", "marketed",
+ "markeras", "markers",
+ "markerts", "markers",
+ "marniers", "mariners",
+ "marraige", "marriage",
+ "marryied", "married",
+ "marskman", "marksman",
+ "maruader", "marauder",
+ "marvelos", "marvelous",
+ "marxisim", "marxism",
+ "mascarra", "mascara",
+ "massacer", "massacre",
+ "massarce", "massacre",
+ "massasge", "massages",
+ "masscare", "massacre",
+ "masteris", "masteries",
+ "masturbe", "masturbate",
+ "materias", "materials",
+ "mathcups", "matchups",
+ "mathewes", "mathews",
+ "matieral", "material",
+ "matterss", "mattress",
+ "mauarder", "marauder",
+ "maximini", "maximizing",
+ "mayalsia", "malaysia",
+ "maybelle", "maybelline",
+ "maylasia", "malaysia",
+ "mccarhty", "mccarthy",
+ "mcgergor", "mcgregor",
+ "mchanics", "mechanics",
+ "mclarean", "mclaren",
+ "mcreggor", "mcgregor",
+ "meagtron", "megatron",
+ "meancing", "menacing",
+ "meaninng", "meaning",
+ "meatbals", "meatballs",
+ "mecahnic", "mechanic",
+ "mechanim", "mechanism",
+ "mechanis", "mechanics",
+ "medacine", "medicine",
+ "medatite", "meditate",
+ "medeival", "medieval",
+ "medevial", "medieval",
+ "mediavel", "medieval",
+ "medicaly", "medically",
+ "mediciad", "medicaid",
+ "medicins", "medicines",
+ "medicore", "mediocre",
+ "medievel", "medieval",
+ "mediocer", "mediocre",
+ "mediocry", "mediocrity",
+ "mediorce", "mediocre",
+ "meditato", "meditation",
+ "mediveal", "medieval",
+ "medoicre", "mediocre",
+ "meerkrat", "meerkat",
+ "megatorn", "megatron",
+ "meidcare", "medicare",
+ "meixcans", "mexicans",
+ "melboure", "melbourne",
+ "meltodwn", "meltdown",
+ "memoriez", "memorize",
+ "mencaing", "menacing",
+ "menstrul", "menstrual",
+ "mentiong", "mentioning",
+ "meoldies", "melodies",
+ "merchans", "merchants",
+ "mercurcy", "mercury",
+ "mercurey", "mercury",
+ "merficul", "merciful",
+ "merhcant", "merchant",
+ "mericful", "merciful",
+ "messgaed", "messaged",
+ "messiach", "messiah",
+ "metagaem", "metagame",
+ "metahpor", "metaphor",
+ "metamage", "metagame",
+ "methapor", "metaphor",
+ "metldown", "meltdown",
+ "metricas", "metrics",
+ "metrices", "metrics",
+ "metropos", "metropolis",
+ "mexcians", "mexicans",
+ "mexicain", "mexican",
+ "mhytical", "mythical",
+ "michagan", "michigan",
+ "michgian", "michigan",
+ "microtax", "microatx",
+ "microwae", "microwaves",
+ "midfeild", "midfield",
+ "midfiled", "midfield",
+ "midifeld", "midfield",
+ "migrains", "migraines",
+ "migriane", "migraine",
+ "milennia", "millennia",
+ "miligram", "milligram",
+ "miliitas", "militias",
+ "miliraty", "military",
+ "militais", "militias",
+ "millenia", "millennia",
+ "millenna", "millennia",
+ "miltiant", "militant",
+ "minature", "miniature",
+ "mindcrak", "mindcrack",
+ "minerial", "mineral",
+ "mingiame", "minigame",
+ "minimage", "minigame",
+ "minimals", "minimalist",
+ "minimalt", "minimalist",
+ "minimini", "minimizing",
+ "minimium", "minimum",
+ "miniscue", "miniscule",
+ "minsiter", "minister",
+ "minsitry", "ministry",
+ "miraculu", "miraculous",
+ "miralces", "miracles",
+ "mircales", "miracles",
+ "mircoatx", "microatx",
+ "mirgaine", "migraine",
+ "mirorred", "mirrored",
+ "misnadry", "misandry",
+ "misogynt", "misogynist",
+ "missigno", "mission",
+ "missiony", "missionary",
+ "misslies", "missiles",
+ "missorui", "missouri",
+ "misspeld", "misspelled",
+ "mistakey", "mistakenly",
+ "mistread", "mistreated",
+ "mobiltiy", "mobility",
+ "moderats", "moderates",
+ "modulair", "modular",
+ "moleculs", "molecules",
+ "momentos", "moments",
+ "momentus", "moments",
+ "monagomy", "monogamy",
+ "mongoles", "mongols",
+ "mongolos", "mongols",
+ "monitord", "monitored",
+ "monogmay", "monogamy",
+ "monolite", "monolithic",
+ "monologe", "monologue",
+ "monolopy", "monopoly",
+ "monoploy", "monopoly",
+ "monopols", "monopolies",
+ "monrachy", "monarchy",
+ "monstros", "monstrous",
+ "montaban", "montana",
+ "montains", "mountains",
+ "montanha", "montana",
+ "montania", "montana",
+ "montanna", "montana",
+ "montanta", "montana",
+ "montanya", "montana",
+ "montaran", "montana",
+ "monteize", "monetize",
+ "monteral", "montreal",
+ "montiors", "monitors",
+ "montnana", "montana",
+ "montypic", "monotypic",
+ "monumnet", "monument",
+ "moonligt", "moonlight",
+ "moprhine", "morphine",
+ "morbildy", "morbidly",
+ "mordibly", "morbidly",
+ "morevoer", "moreover",
+ "morhpine", "morphine",
+ "moribdly", "morbidly",
+ "mormones", "mormons",
+ "mormonts", "mormons",
+ "moroever", "moreover",
+ "morotola", "motorola",
+ "morphein", "morphine",
+ "morriosn", "morrison",
+ "morrocco", "morocco",
+ "morrsion", "morrison",
+ "mortards", "mortars",
+ "mortarts", "mortars",
+ "moruning", "mourning",
+ "mosnters", "monsters",
+ "mosqueto", "mosquitoes",
+ "mosquite", "mosquitoes",
+ "mosqutio", "mosquito",
+ "motoroal", "motorola",
+ "mounment", "monument",
+ "mounring", "mourning",
+ "mountian", "mountain",
+ "moustace", "moustache",
+ "movesped", "movespeed",
+ "mozillia", "mozilla",
+ "mozillla", "mozilla",
+ "msytical", "mystical",
+ "mucnhies", "munchies",
+ "mudering", "murdering",
+ "muffings", "muffins",
+ "muffinus", "muffins",
+ "mulitple", "multiple",
+ "mulitply", "multiply",
+ "multiplr", "multiplier",
+ "multipls", "multiples",
+ "mundance", "mundane",
+ "mundande", "mundane",
+ "muniches", "munchies",
+ "murderes", "murders",
+ "murderus", "murders",
+ "muscluar", "muscular",
+ "muscualr", "muscular",
+ "musicaly", "musically",
+ "musuclar", "muscular",
+ "mutliple", "multiple",
+ "mutliply", "multiply",
+ "myhtical", "mythical",
+ "mysitcal", "mystical",
+ "mysogyny", "misogyny",
+ "mysteris", "mysteries",
+ "mythraic", "mithraic",
+ "nagivate", "navigate",
+ "naopleon", "napoleon",
+ "napcakes", "pancakes",
+ "naploeon", "napoleon",
+ "napoelon", "napoleon",
+ "napolean", "napoleon",
+ "napoloen", "napoleon",
+ "narcissm", "narcissism",
+ "narcisst", "narcissist",
+ "narcotis", "narcotics",
+ "narwharl", "narwhal",
+ "naseuous", "nauseous",
+ "nashvile", "nashville",
+ "nasueous", "nauseous",
+ "natievly", "natively",
+ "nationas", "nationals",
+ "nationsl", "nationals",
+ "nativley", "natively",
+ "natuilus", "nautilus",
+ "naturaly", "naturally",
+ "naturels", "natures",
+ "naturely", "naturally",
+ "naturens", "natures",
+ "naturual", "natural",
+ "nauesous", "nauseous",
+ "naughtly", "naughty",
+ "nauitlus", "nautilus",
+ "nauseuos", "nauseous",
+ "nautiuls", "nautilus",
+ "nautlius", "nautilus",
+ "nautulis", "nautilus",
+ "naviagte", "navigate",
+ "navigato", "navigation",
+ "nazereth", "nazareth",
+ "necesary", "necessary",
+ "neckbead", "neckbeard",
+ "needlees", "needles",
+ "nefarios", "nefarious",
+ "negativy", "negativity",
+ "neglectn", "neglecting",
+ "neglible", "negligible",
+ "neigbour", "neighbour",
+ "neolitic", "neolithic",
+ "netboook", "netbook",
+ "neuronas", "neurons",
+ "neutraal", "neutral",
+ "neutralt", "neutrality",
+ "neutraly", "neutrality",
+ "newcaste", "newcastle",
+ "nickanme", "nickname",
+ "nickmane", "nickname",
+ "nieghbor", "neighbor",
+ "nightime", "nighttime",
+ "nightley", "nightly",
+ "nightlie", "nightlife",
+ "nihilsim", "nihilism",
+ "nilihism", "nihilism",
+ "nirtogen", "nitrogen",
+ "nirvanna", "nirvana",
+ "nitorgen", "nitrogen",
+ "niusance", "nuisance",
+ "noctrune", "nocturne",
+ "noctunre", "nocturne",
+ "nocturen", "nocturne",
+ "nominato", "nomination",
+ "nonsence", "nonsense",
+ "nonsesne", "nonsense",
+ "noramlly", "normally",
+ "norhtern", "northern",
+ "normalis", "normals",
+ "normalls", "normals",
+ "normalos", "normals",
+ "northeat", "northeast",
+ "northren", "northern",
+ "northwet", "northwest",
+ "norwegin", "norwegian",
+ "nostalga", "nostalgia",
+ "nostirls", "nostrils",
+ "notabley", "notably",
+ "notablly", "notably",
+ "noteable", "notable",
+ "noteably", "notably",
+ "noticabe", "noticable",
+ "notorios", "notorious",
+ "novmeber", "november",
+ "nromandy", "normandy",
+ "nuatilus", "nautilus",
+ "nuculear", "nuclear",
+ "nuetered", "neutered",
+ "nuisanse", "nuisance",
+ "nullifiy", "nullify",
+ "nurtient", "nutrient",
+ "nusaince", "nuisance",
+ "nusiance", "nuisance",
+ "nutirent", "nutrient",
+ "nutriens", "nutrients",
+ "nuturing", "nurturing",
+ "obdisian", "obsidian",
+ "obediant", "obedient",
+ "obession", "obsession",
+ "obilvion", "oblivion",
+ "obisdian", "obsidian",
+ "obsessie", "obsessive",
+ "obsessin", "obsession",
+ "obsidain", "obsidian",
+ "obstacal", "obstacle",
+ "obvilion", "oblivion",
+ "ocasions", "occasions",
+ "ocassion", "occasion",
+ "occaison", "occasion",
+ "occupato", "occupation",
+ "occuring", "occurring",
+ "octobear", "october",
+ "octopuns", "octopus",
+ "ofcoruse", "ofcourse",
+ "ofcoures", "ofcourse",
+ "ofcousre", "ofcourse",
+ "ofcrouse", "ofcourse",
+ "officals", "officials",
+ "officaly", "officially",
+ "offsited", "offside",
+ "ofocurse", "ofcourse",
+ "oligarcy", "oligarchy",
+ "olmypics", "olympics",
+ "olymipcs", "olympics",
+ "olypmics", "olympics",
+ "ommision", "omission",
+ "ommiting", "omitting",
+ "ommitted", "omitted",
+ "ongewild", "gonewild",
+ "onslaugt", "onslaught",
+ "operatie", "operative",
+ "opinoins", "opinions",
+ "oppinion", "opinion",
+ "opponant", "opponent",
+ "opposits", "opposites",
+ "oppossed", "opposed",
+ "oppresso", "oppression",
+ "optimaal", "optimal",
+ "optomism", "optimism",
+ "oragnise", "organise",
+ "orangerd", "orangered",
+ "orangers", "oranges",
+ "orangism", "organism",
+ "orchesta", "orchestra",
+ "ordianry", "ordinary",
+ "oreintal", "oriental",
+ "orgainse", "organise",
+ "orgainze", "organize",
+ "organims", "organism",
+ "organsie", "organise",
+ "organsim", "organism",
+ "organzie", "organize",
+ "orgasmes", "orgasms",
+ "orgasmos", "orgasms",
+ "orgasmus", "orgasms",
+ "orginize", "organise",
+ "orhtodox", "orthodox",
+ "oridnary", "ordinary",
+ "originas", "origins",
+ "origines", "origins",
+ "originsl", "originals",
+ "orphanes", "orphans",
+ "osbidian", "obsidian",
+ "othrodox", "orthodox",
+ "ourselvs", "ourselves",
+ "oustider", "outsider",
+ "outfeild", "outfield",
+ "outfidel", "outfield",
+ "outfiled", "outfield",
+ "outisder", "outsider",
+ "outplayd", "outplayed",
+ "outputed", "outputted",
+ "outsoure", "outsourced",
+ "overboad", "overboard",
+ "overclok", "overclock",
+ "overdrev", "overdrive",
+ "overhual", "overhaul",
+ "overlaod", "overload",
+ "overpiad", "overpaid",
+ "overules", "overuse",
+ "overwath", "overwatch",
+ "overwhem", "overwhelm",
+ "oximoron", "oxymoron",
+ "oylmpics", "olympics",
+ "pacakged", "packaged",
+ "packadge", "packaged",
+ "paficist", "pacifist",
+ "painfuly", "painfully",
+ "paitence", "patience",
+ "paitents", "patients",
+ "palidans", "paladins",
+ "palstics", "plastics",
+ "paltform", "platform",
+ "paltinum", "platinum",
+ "palyable", "playable",
+ "palyoffs", "playoffs",
+ "pancaeks", "pancakes",
+ "panckaes", "pancakes",
+ "pandoria", "pandora",
+ "pandorra", "pandora",
+ "panedmic", "pandemic",
+ "panethon", "pantheon",
+ "pankaces", "pancakes",
+ "panmedic", "pandemic",
+ "pantehon", "pantheon",
+ "panthoen", "pantheon",
+ "paradies", "paradise",
+ "paradyse", "parades",
+ "paragrah", "paragraph",
+ "paraiste", "parasite",
+ "paralell", "parallel",
+ "paralely", "parallelly",
+ "paralles", "parallels",
+ "parameds", "paramedics",
+ "paramter", "parameter",
+ "paranioa", "paranoia",
+ "paraniod", "paranoid",
+ "paraside", "paradise",
+ "parasits", "parasites",
+ "parastie", "parasite",
+ "parctise", "practise",
+ "paremsan", "parmesan",
+ "paristan", "partisan",
+ "parmasen", "parmesan",
+ "parmenas", "parmesan",
+ "parmsean", "parmesan",
+ "parnters", "partners",
+ "parralel", "parallel",
+ "parterns", "partners",
+ "partialy", "partially",
+ "partians", "partisan",
+ "partical", "particular",
+ "particel", "particle",
+ "partiets", "parties",
+ "partiots", "patriots",
+ "partnerd", "partnered",
+ "partsian", "partisan",
+ "passabel", "passable",
+ "passione", "passionate",
+ "passisve", "passives",
+ "passpost", "passports",
+ "passvies", "passives",
+ "passwors", "passwords",
+ "pasttime", "pastime",
+ "pastural", "pastoral",
+ "pateince", "patience",
+ "pateints", "patients",
+ "patethic", "pathetic",
+ "patheitc", "pathetic",
+ "patienty", "patiently",
+ "patirots", "patriots",
+ "patriarh", "patriarchy",
+ "patroits", "patriots",
+ "patrolls", "patrols",
+ "patronas", "patrons",
+ "patrones", "patrons",
+ "patronis", "patrons",
+ "patronos", "patrons",
+ "pattened", "patented",
+ "patterno", "patterson",
+ "pattersn", "patterson",
+ "pblisher", "publisher",
+ "peageant", "pageant",
+ "pebbleos", "pebbles",
+ "pebblers", "pebbles",
+ "pebblets", "pebbles",
+ "peciluar", "peculiar",
+ "pecuilar", "peculiar",
+ "peculair", "peculiar",
+ "peculure", "peculiar",
+ "peformed", "performed",
+ "peircing", "piercing",
+ "penaltis", "penalties",
+ "penatgon", "pentagon",
+ "penciles", "pencils",
+ "pendatic", "pedantic",
+ "pengiuns", "penguins",
+ "penisula", "peninsula",
+ "pensioen", "pension",
+ "pepperin", "pepperoni",
+ "perceded", "preceded",
+ "percente", "percentile",
+ "percieve", "perceive",
+ "percious", "precious",
+ "perclude", "preclude",
+ "perfecty", "perfectly",
+ "perfroms", "performs",
+ "perheaps", "perhaps",
+ "pericing", "piercing",
+ "peridoic", "periodic",
+ "perimetr", "perimeter",
+ "periodes", "periods",
+ "periodos", "periods",
+ "permanet", "permanent",
+ "permiere", "premiere",
+ "permises", "premises",
+ "permitas", "permits",
+ "permites", "permits",
+ "permitis", "permits",
+ "permitts", "permits",
+ "permiums", "premiums",
+ "peroidic", "periodic",
+ "perosnas", "personas",
+ "perpetue", "perpetuate",
+ "persaude", "persuade",
+ "perserve", "preserve",
+ "persisit", "persist",
+ "personel", "personnel",
+ "persones", "persons",
+ "personis", "persons",
+ "personsa", "personas",
+ "perstige", "prestige",
+ "persuaso", "persuasion",
+ "persuded", "persuaded",
+ "persuing", "pursuing",
+ "persuits", "pursuits",
+ "persumed", "presumed",
+ "pertaing", "pertaining",
+ "pertians", "pertains",
+ "pertinet", "pertinent",
+ "pervents", "prevents",
+ "perverst", "pervert",
+ "perviews", "previews",
+ "pervious", "previous",
+ "perxoide", "peroxide",
+ "pessiary", "pessary",
+ "petetion", "petition",
+ "petrolem", "petroleum",
+ "phantoom", "phantom",
+ "pharamcy", "pharmacy",
+ "pharmacs", "pharmacist",
+ "pharmsci", "pharmacist",
+ "phenomon", "phenomenon",
+ "phramacy", "pharmacy",
+ "phsyical", "physical",
+ "phsyique", "physique",
+ "phyiscal", "physical",
+ "phyisque", "physique",
+ "physcial", "physical",
+ "physicis", "physicians",
+ "physicks", "physics",
+ "physicts", "physicist",
+ "physqiue", "physique",
+ "picthers", "pitchers",
+ "pillards", "pillars",
+ "pillaris", "pillars",
+ "pinancle", "pinnacle",
+ "pinapple", "pineapple",
+ "pinnalce", "pinnacle",
+ "pinnaple", "pineapple",
+ "pinncale", "pinnacle",
+ "pinpiont", "pinpoint",
+ "pinteret", "pinterest",
+ "piolting", "piloting",
+ "pioneeer", "pioneer",
+ "pithcers", "pitchers",
+ "placebro", "placebo",
+ "placemet", "placements",
+ "planetas", "planets",
+ "planetos", "planets",
+ "plantiff", "plaintiff",
+ "plantium", "platinum",
+ "plasitcs", "plastics",
+ "platfrom", "platform",
+ "platimun", "platinum",
+ "platnium", "platinum",
+ "platnuim", "platinum",
+ "plausibe", "plausible",
+ "playbody", "playboy",
+ "playstye", "playstyle",
+ "pleasent", "pleasant",
+ "plehtora", "plethora",
+ "pleothra", "plethora",
+ "plethroa", "plethora",
+ "ploygamy", "polygamy",
+ "pnatheon", "pantheon",
+ "poeoples", "peoples",
+ "poingant", "poignant",
+ "pointeur", "pointer",
+ "pointure", "pointer",
+ "poisones", "poisons",
+ "poisonis", "poisons",
+ "poisonos", "poisons",
+ "poisonus", "poisons",
+ "polgyamy", "polygamy",
+ "polietly", "politely",
+ "politing", "piloting",
+ "politley", "politely",
+ "poltical", "political",
+ "poluting", "polluting",
+ "polution", "pollution",
+ "polygoon", "polygon",
+ "polymore", "polymer",
+ "pomotion", "promotion",
+ "popoulus", "populous",
+ "populair", "popular",
+ "populare", "popular",
+ "populary", "popularity",
+ "porcelan", "porcelain",
+ "porposes", "proposes",
+ "portabel", "portable",
+ "portalis", "portals",
+ "portalus", "portals",
+ "portayed", "portrayed",
+ "portgual", "portugal",
+ "portrais", "portraits",
+ "portrary", "portray",
+ "portrayl", "portrayal",
+ "portriat", "portrait",
+ "posessed", "possessed",
+ "posesses", "possesses",
+ "posioned", "poisoned",
+ "positivs", "positives",
+ "positivy", "positivity",
+ "possable", "possible",
+ "possably", "possibly",
+ "possbily", "possibly",
+ "posseses", "possesses",
+ "possesse", "possessive",
+ "possesss", "possesses",
+ "potrayed", "portrayed",
+ "poverful", "powerful",
+ "powerded", "powdered",
+ "powerpot", "powerpoint",
+ "pracitse", "practise",
+ "practial", "practical",
+ "practies", "practise",
+ "pratcise", "practise",
+ "praticle", "particle",
+ "prceeded", "preceded",
+ "preadtor", "predator",
+ "preample", "preamble",
+ "preceeds", "precedes",
+ "precisie", "precise",
+ "precisly", "precisely",
+ "precisou", "precious",
+ "preculde", "preclude",
+ "predicat", "predict",
+ "predicte", "predictive",
+ "preferas", "prefers",
+ "prefered", "preferred",
+ "preferes", "prefers",
+ "preferis", "prefers",
+ "preferrs", "prefers",
+ "preimere", "premiere",
+ "preimums", "premiums",
+ "preiodic", "periodic",
+ "preivews", "previews",
+ "prejudis", "prejudices",
+ "prelayed", "replayed",
+ "premeire", "premiere",
+ "premesis", "premises",
+ "premiare", "premier",
+ "premines", "premise",
+ "premuims", "premiums",
+ "preorded", "preordered",
+ "preordes", "preorders",
+ "preoxide", "peroxide",
+ "prepaird", "prepaid",
+ "preqeuls", "prequels",
+ "prequles", "prequels",
+ "prescrie", "prescribed",
+ "presense", "presence",
+ "presenst", "presets",
+ "presidet", "presidents",
+ "presists", "persists",
+ "presitge", "prestige",
+ "presonas", "personas",
+ "presuade", "persuade",
+ "pretador", "predator",
+ "pretains", "pertains",
+ "preveiws", "previews",
+ "preverse", "perverse",
+ "previwes", "previews",
+ "pricipal", "principal",
+ "priciple", "principle",
+ "priemere", "premiere",
+ "priestes", "priests",
+ "primaris", "primaries",
+ "primarly", "primarily",
+ "princila", "principals",
+ "principl", "principals",
+ "prisitne", "pristine",
+ "probelms", "problems",
+ "probleem", "problem",
+ "procalim", "proclaim",
+ "proccess", "process",
+ "proceded", "proceeded",
+ "proceder", "procedure",
+ "procedes", "proceeds",
+ "procedue", "procedure",
+ "proceeed", "proceed",
+ "procesed", "proceeds",
+ "processs", "processes",
+ "proclami", "proclaim",
+ "procliam", "proclaim",
+ "procotol", "protocol",
+ "prodcuts", "products",
+ "producto", "production",
+ "profesor", "professor",
+ "proficit", "proficient",
+ "profilic", "prolific",
+ "progroms", "pogroms",
+ "prohibis", "prohibits",
+ "prohpecy", "prophecy",
+ "prohpets", "prophets",
+ "projecte", "projectile",
+ "projecto", "projection",
+ "prolouge", "prologue",
+ "promplty", "promptly",
+ "promptes", "prompts",
+ "promptus", "prompts",
+ "promtply", "promptly",
+ "pronoune", "pronounced",
+ "propechy", "prophecy",
+ "propehcy", "prophecy",
+ "propehts", "prophets",
+ "prophacy", "prophecy",
+ "propmted", "prompted",
+ "propmtly", "promptly",
+ "proponet", "proponents",
+ "proposse", "proposes",
+ "proposte", "propose",
+ "proprety", "property",
+ "propsect", "prospect",
+ "prosepct", "prospect",
+ "prostite", "prostitute",
+ "protable", "portable",
+ "protecte", "protective",
+ "protiens", "proteins",
+ "protines", "proteins",
+ "protocal", "protocol",
+ "prototye", "prototype",
+ "protrait", "portrait",
+ "protrays", "portrays",
+ "protugal", "portugal",
+ "proverai", "proverbial",
+ "providee", "providence",
+ "proximty", "proximity",
+ "pruchase", "purchase",
+ "pryamids", "pyramids",
+ "ptichers", "pitchers",
+ "pubisher", "publisher",
+ "publiser", "publisher",
+ "puinsher", "punisher",
+ "pulisher", "publisher",
+ "pumkpins", "pumpkins",
+ "pumpinks", "pumpkins",
+ "pumpknis", "pumpkins",
+ "punshier", "punisher",
+ "punsiher", "punisher",
+ "punsihes", "punishes",
+ "purcahse", "purchase",
+ "pyramind", "pyramid",
+ "pyrimads", "pyramids",
+ "pyrmaids", "pyramids",
+ "qauntity", "quantity",
+ "qualifiy", "qualify",
+ "quanitfy", "quantify",
+ "quantaty", "quantity",
+ "quantite", "quantities",
+ "quantuum", "quantum",
+ "quarante", "quarantine",
+ "quartery", "quarterly",
+ "qucikest", "quickest",
+ "queation", "equation",
+ "quention", "quentin",
+ "quickets", "quickest",
+ "quicklyu", "quickly",
+ "rabbitos", "rabbits",
+ "rabbitts", "rabbits",
+ "racistas", "racists",
+ "racistes", "racists",
+ "radaince", "radiance",
+ "rahpsody", "rhapsody",
+ "raidance", "radiance",
+ "railraod", "railroad",
+ "randomes", "randoms",
+ "randomez", "randomized",
+ "randomns", "randoms",
+ "randomrs", "randoms",
+ "randomus", "randoms",
+ "raosting", "roasting",
+ "raphsody", "rhapsody",
+ "raptores", "raptors",
+ "raspbery", "raspberry",
+ "rationel", "rationale",
+ "realible", "reliable",
+ "realibly", "reliably",
+ "realiest", "earliest",
+ "realisim", "realism",
+ "realisme", "realise",
+ "realistc", "realistic",
+ "realiste", "realise",
+ "realoded", "reloaded",
+ "realsied", "realised",
+ "realtion", "relation",
+ "realtive", "relative",
+ "reamined", "remained",
+ "reapired", "repaired",
+ "reaplugs", "earplugs",
+ "reaserch", "research",
+ "reasonal", "reasonably",
+ "reatiler", "retailer",
+ "reaveled", "revealed",
+ "rebellis", "rebellious",
+ "reboudns", "rebounds",
+ "rebounce", "rebound",
+ "rebuildt", "rebuilt",
+ "rebuplic", "republic",
+ "receeded", "receded",
+ "recepits", "receipts",
+ "receptie", "receptive",
+ "receptos", "receptors",
+ "receving", "receiving",
+ "recident", "resident",
+ "reciding", "residing",
+ "recieved", "received",
+ "reciever", "receiver",
+ "recieves", "receives",
+ "recipees", "recipes",
+ "recipets", "recipes",
+ "recogise", "recognise",
+ "recogize", "recognize",
+ "recognie", "recognizes",
+ "recomend", "recommend",
+ "recommed", "recommend",
+ "reconnet", "reconnect",
+ "rectange", "rectangle",
+ "rectifiy", "rectify",
+ "recuring", "recurring",
+ "recurits", "recruits",
+ "redeisgn", "redesign",
+ "redemeed", "redeemed",
+ "redesgin", "redesign",
+ "redesing", "redesign",
+ "reedemed", "redeemed",
+ "refeeres", "referees",
+ "refelcts", "reflects",
+ "refelxes", "reflexes",
+ "referede", "referee",
+ "referene", "referee",
+ "referens", "references",
+ "referere", "referee",
+ "referign", "refering",
+ "refering", "referring",
+ "refernce", "references",
+ "reffered", "referred",
+ "refilles", "refills",
+ "refillls", "refills",
+ "reflecte", "reflective",
+ "reflecto", "reflection",
+ "reformes", "reforms",
+ "refreing", "refering",
+ "refrence", "reference",
+ "refreshd", "refreshed",
+ "refreshr", "refresher",
+ "refromed", "reformed",
+ "regardes", "regards",
+ "regenade", "renegade",
+ "regenere", "regenerate",
+ "regiones", "regions",
+ "regisrty", "registry",
+ "registed", "registered",
+ "regresas", "regress",
+ "regreses", "regress",
+ "regresos", "regress",
+ "regresse", "regressive",
+ "regresso", "regression",
+ "regrests", "regress",
+ "regretts", "regrets",
+ "regsitry", "registry",
+ "regualrs", "regulars",
+ "regualte", "regulate",
+ "reguarly", "regularly",
+ "regulary", "regularly",
+ "regulatr", "regulator",
+ "regulats", "regulators",
+ "rehersal", "rehearsal",
+ "rehtoric", "rhetoric",
+ "reiceved", "recieved",
+ "reigment", "regiment",
+ "reigonal", "regional",
+ "rekenton", "renekton",
+ "relaible", "reliable",
+ "relaibly", "reliably",
+ "relaised", "realised",
+ "relaoded", "reloaded",
+ "relasped", "relapsed",
+ "relatabe", "relatable",
+ "relateds", "relates",
+ "relativy", "relativity",
+ "relavent", "relevant",
+ "relected", "reelected",
+ "relegato", "relegation",
+ "releived", "relieved",
+ "releiver", "reliever",
+ "relevent", "relevant",
+ "relfects", "reflects",
+ "relfexes", "reflexes",
+ "reliased", "realised",
+ "religous", "religious",
+ "relpased", "relapsed",
+ "remainds", "remains",
+ "remainig", "remaining",
+ "remannts", "remnants",
+ "remarkes", "remarks",
+ "remembed", "remembered",
+ "remembee", "remembered",
+ "rememebr", "remember",
+ "remenant", "remnant",
+ "reminent", "remnant",
+ "remmeber", "remember",
+ "remotley", "remotely",
+ "renderes", "renders",
+ "reneagde", "renegade",
+ "renetkon", "renekton",
+ "renewabe", "renewables",
+ "renketon", "renekton",
+ "renmants", "remnants",
+ "renoylds", "reynolds",
+ "renteris", "renters",
+ "renyolds", "reynolds",
+ "reowrked", "reworked",
+ "repaires", "repairs",
+ "repalces", "replaces",
+ "reparied", "repaired",
+ "repblics", "republics",
+ "repbulic", "republic",
+ "repeatae", "repeatable",
+ "repeates", "repeats",
+ "repetion", "repetition",
+ "repharse", "rephrase",
+ "repitles", "reptiles",
+ "replased", "relapsed",
+ "replayes", "replays",
+ "replicae", "replicated",
+ "replubic", "republic",
+ "reportes", "reporters",
+ "reposity", "repository",
+ "repostas", "reposts",
+ "repostes", "reposts",
+ "repostig", "reposting",
+ "repostus", "reposts",
+ "represet", "represents",
+ "represso", "repression",
+ "reprhase", "rephrase",
+ "repsects", "respects",
+ "repsonds", "responds",
+ "repsonse", "response",
+ "repsoted", "reposted",
+ "repubics", "republics",
+ "republis", "republics",
+ "repulics", "republics",
+ "repulsie", "repulsive",
+ "requiers", "requires",
+ "requieum", "requiem",
+ "requilme", "requiem",
+ "requried", "required",
+ "requries", "requires",
+ "rescuecd", "rescued",
+ "researce", "researcher",
+ "resembes", "resembles",
+ "reserach", "research",
+ "resevoir", "reservoir",
+ "resgined", "resigned",
+ "residude", "residue",
+ "residule", "residue",
+ "resinged", "resigned",
+ "resistas", "resists",
+ "resisten", "resistance",
+ "resistes", "resists",
+ "resloved", "resolved",
+ "resloves", "resolves",
+ "resmeble", "resemble",
+ "resotred", "restored",
+ "resourse", "resources",
+ "resovled", "resolved",
+ "resovles", "resolves",
+ "respecte", "respective",
+ "respesct", "respects",
+ "responce", "response",
+ "responed", "respond",
+ "respones", "response",
+ "responsd", "responds",
+ "respoted", "reposted",
+ "restanti", "restarting",
+ "restrait", "restraint",
+ "restrics", "restricts",
+ "resuable", "reusable",
+ "retailes", "retailers",
+ "retalier", "retailer",
+ "rethoric", "rhetoric",
+ "retirase", "retires",
+ "retireds", "retires",
+ "retireus", "retires",
+ "retireve", "retrieve",
+ "retreive", "retrieve",
+ "retrived", "retrieved",
+ "retunred", "returned",
+ "reuasble", "reusable",
+ "reveales", "reveals",
+ "reveiwed", "reviewed",
+ "reveiwer", "reviewer",
+ "revelaed", "revealed",
+ "revelant", "relevant",
+ "revelead", "revealed",
+ "reverals", "reversal",
+ "reviewes", "reviewers",
+ "revlover", "revolver",
+ "revloves", "revolves",
+ "revovler", "revolver",
+ "revovles", "revolves",
+ "rewatchd", "rewatched",
+ "rewitten", "rewritten",
+ "rewritte", "rewrite",
+ "rewtched", "wretched",
+ "reynlods", "reynolds",
+ "reyonlds", "reynolds",
+ "rhaposdy", "rhapsody",
+ "rhaspody", "rhapsody",
+ "rheotric", "rhetoric",
+ "righteos", "righteous",
+ "rigntone", "ringtone",
+ "ringotne", "ringtone",
+ "ritalian", "ritalin",
+ "rivalrly", "rivalry",
+ "roachers", "roaches",
+ "robberts", "robbers",
+ "robberys", "robbers",
+ "robocoop", "robocop",
+ "robocorp", "robocop",
+ "robocoup", "robocop",
+ "roelplay", "roleplay",
+ "roganism", "organism",
+ "rolepaly", "roleplay",
+ "romaanin", "romanian",
+ "romainan", "romanian",
+ "romanain", "romanian",
+ "romanica", "romania",
+ "rosettta", "rosetta",
+ "rostaing", "roasting",
+ "routeros", "routers",
+ "rutgerus", "rutgers",
+ "ryenolds", "reynolds",
+ "sacrifie", "sacrifice",
+ "saddends", "saddens",
+ "saddenes", "saddens",
+ "sadisitc", "sadistic",
+ "salaires", "salaries",
+ "sandales", "sandals",
+ "sandalls", "sandals",
+ "sandstom", "sandstorm",
+ "sanotrum", "santorum",
+ "santourm", "santorum",
+ "santroum", "santorum",
+ "santurom", "santorum",
+ "sapcebar", "spacebar",
+ "sapphrie", "sapphire",
+ "sarcasam", "sarcasm",
+ "sarcasim", "sarcasm",
+ "sarcastc", "sarcastic",
+ "sargeant", "sergeant",
+ "sasauges", "sausages",
+ "sasuages", "sausages",
+ "satelite", "satellite",
+ "satellie", "satellites",
+ "saterday", "saturday",
+ "satifies", "satisfies",
+ "satisfiy", "satisfy",
+ "satrical", "satirical",
+ "satruday", "saturday",
+ "saturdsy", "saturdays",
+ "sawstika", "swastika",
+ "scandlas", "scandals",
+ "scannign", "scanning",
+ "scarmble", "scramble",
+ "scepture", "scepter",
+ "schedual", "schedule",
+ "schoalrs", "scholars",
+ "scholary", "scholarly",
+ "schoodle", "schooled",
+ "scientic", "scientific",
+ "scientis", "scientist",
+ "scoprion", "scorpion",
+ "scorates", "socrates",
+ "scoripon", "scorpion",
+ "scorpoin", "scorpion",
+ "scostman", "scotsman",
+ "scratchs", "scratches",
+ "scriptue", "scriptures",
+ "scriptus", "scripts",
+ "scritped", "scripted",
+ "scroates", "socrates",
+ "scropion", "scorpion",
+ "scrpited", "scripted",
+ "scruitny", "scrutiny",
+ "scrunity", "scrutiny",
+ "sctosman", "scotsman",
+ "sculpter", "sculpture",
+ "scurtiny", "scrutiny",
+ "seahakws", "seahawks",
+ "seahwaks", "seahawks",
+ "seantors", "senators",
+ "sebastin", "sebastian",
+ "seceeded", "succeeded",
+ "secertly", "secretly",
+ "secrelty", "secretly",
+ "secretas", "secrets",
+ "secretos", "secrets",
+ "secruity", "security",
+ "secuirty", "security",
+ "sedereal", "sidereal",
+ "seldomly", "seldom",
+ "selectie", "selective",
+ "selfiers", "selfies",
+ "semestre", "semester",
+ "semseter", "semester",
+ "senarios", "scenarios",
+ "senerity", "serenity",
+ "seniores", "seniors",
+ "senisble", "sensible",
+ "sensibel", "sensible",
+ "sensores", "sensors",
+ "senstive", "sensitive",
+ "sentaors", "senators",
+ "sentiers", "sentries",
+ "sentinet", "sentient",
+ "sentinte", "sentient",
+ "sentires", "sentries",
+ "sentreis", "sentries",
+ "separato", "separation",
+ "separete", "seperate",
+ "sepearte", "seperate",
+ "seperate", "separate",
+ "seplling", "spelling",
+ "sepreate", "seperate",
+ "sepulcre", "sepulchre",
+ "serached", "searched",
+ "seraches", "searches",
+ "serentiy", "serenity",
+ "sergaent", "sergeant",
+ "settigns", "settings",
+ "settting", "setting",
+ "seventen", "seventeen",
+ "severeal", "several",
+ "severeid", "severed",
+ "severide", "severed",
+ "severley", "severely",
+ "sexaully", "sexually",
+ "seziures", "seizures",
+ "sezuires", "seizures",
+ "shadoloo", "shadaloo",
+ "shangahi", "shanghai",
+ "shanghia", "shanghai",
+ "sharplay", "sharply",
+ "sharpley", "sharply",
+ "shawshak", "shawshank",
+ "shcolars", "scholars",
+ "shcooled", "schooled",
+ "sheilded", "shielded",
+ "shelterd", "sheltered",
+ "shelvers", "shelves",
+ "shelveys", "shelves",
+ "sherlcok", "sherlock",
+ "shetlers", "shelters",
+ "shfiting", "shifting",
+ "shifitng", "shifting",
+ "shifteer", "shifter",
+ "shileded", "shielded",
+ "shineing", "shining",
+ "shitstom", "shitstorm",
+ "shittoon", "shitton",
+ "shittown", "shitton",
+ "shleters", "shelters",
+ "shnaghai", "shanghai",
+ "shortend", "shortened",
+ "shotuout", "shoutout",
+ "shoudlnt", "shouldnt",
+ "shouldes", "shoulders",
+ "shoulndt", "shouldnt",
+ "shrapenl", "shrapnel",
+ "shrelock", "sherlock",
+ "shrinked", "shrunk",
+ "shrpanel", "shrapnel",
+ "shtiless", "shitless",
+ "shuoldnt", "shouldnt",
+ "sideboad", "sideboard",
+ "sidleine", "sideline",
+ "siezable", "sizeable",
+ "siezures", "seizures",
+ "signatue", "signatures",
+ "signfies", "signifies",
+ "signifiy", "signify",
+ "signigns", "signings",
+ "signular", "singular",
+ "silbings", "siblings",
+ "silicoln", "silicon",
+ "silicoon", "silicon",
+ "silimiar", "similiar",
+ "simialir", "similiar",
+ "simiilar", "similiar",
+ "similair", "similar",
+ "similari", "similiar",
+ "similart", "similarity",
+ "similary", "similarly",
+ "similiar", "similar",
+ "simliiar", "similiar",
+ "simluate", "simulate",
+ "simmilar", "similar",
+ "simpelst", "simplest",
+ "simplets", "simplest",
+ "simplicy", "simplicity",
+ "simplier", "simpler",
+ "simulato", "simulation",
+ "singlers", "singles",
+ "singluar", "singular",
+ "sinistre", "sinister",
+ "sinsiter", "sinister",
+ "sitckers", "stickers",
+ "sitrring", "stirring",
+ "sizebale", "sizeable",
+ "skateing", "skating",
+ "skecthes", "sketches",
+ "skelatel", "skeletal",
+ "skeletos", "skeletons",
+ "sketchey", "sketchy",
+ "sketpics", "skeptics",
+ "skillsto", "skillshots",
+ "skimrish", "skirmish",
+ "skpetics", "skeptics",
+ "skrimish", "skirmish",
+ "skteches", "sketches",
+ "skywalkr", "skywalker",
+ "slaptoon", "splatoon",
+ "slaverly", "slavery",
+ "slienced", "silenced",
+ "sliently", "silently",
+ "slighlty", "slightly",
+ "sligthly", "slightly",
+ "smartare", "smarter",
+ "snetries", "sentries",
+ "snippent", "snippet",
+ "snippert", "snippet",
+ "snowbals", "snowballs",
+ "snugglie", "snuggle",
+ "snydrome", "syndrome",
+ "snyopsis", "synopsis",
+ "soberity", "sobriety",
+ "sobreity", "sobriety",
+ "socailly", "socially",
+ "socalism", "socialism",
+ "socartes", "socrates",
+ "socialim", "socialism",
+ "socities", "societies",
+ "socttish", "scottish",
+ "soemthin", "somethin",
+ "soilders", "soldiers",
+ "solatary", "solitary",
+ "soldeirs", "soldiers",
+ "soliders", "soldiers",
+ "soluable", "soluble",
+ "solutide", "solitude",
+ "somalija", "somalia",
+ "somehtin", "somethin",
+ "someoens", "someones",
+ "somethis", "somethings",
+ "sometihn", "somethin",
+ "sometinh", "somethin",
+ "somoenes", "someones",
+ "somtimes", "sometimes",
+ "somwhere", "somewhere",
+ "soparnos", "sopranos",
+ "sophmore", "sophomore",
+ "sorcercy", "sorcery",
+ "sorcerey", "sorcery",
+ "sorceror", "sorcerer",
+ "sorcerry", "sorcery",
+ "sorpanos", "sopranos",
+ "southren", "southern",
+ "soverein", "sovereign",
+ "soverign", "sovereign",
+ "sovietes", "soviets",
+ "spagheti", "spaghetti",
+ "spainish", "spanish",
+ "spaltoon", "splatoon",
+ "spammade", "spammed",
+ "spammare", "spammer",
+ "spammear", "spammer",
+ "spammend", "spammed",
+ "spammeur", "spammer",
+ "spanisch", "spanish",
+ "sparklie", "sparkle",
+ "spawnign", "spawning",
+ "specemin", "specimen",
+ "speciaal", "special",
+ "specialt", "specialist",
+ "specialy", "specially",
+ "specialz", "specialize",
+ "specifed", "specified",
+ "specifiy", "specify",
+ "speciman", "specimen",
+ "specrtal", "spectral",
+ "speicals", "specials",
+ "spellign", "spelling",
+ "spendour", "splendour",
+ "sphereos", "spheres",
+ "spilnter", "splinter",
+ "spiltter", "splitter",
+ "spindrel", "spindle",
+ "spirites", "spirits",
+ "spiritis", "spirits",
+ "spiritus", "spirits",
+ "spirtied", "spirited",
+ "spleling", "spelling",
+ "splitner", "splinter",
+ "spoilerd", "spoiled",
+ "spoliers", "spoilers",
+ "sponsord", "sponsored",
+ "sporanos", "sopranos",
+ "spotifiy", "spotify",
+ "spotifty", "spotify",
+ "sppeches", "speeches",
+ "sprayade", "sprayed",
+ "spreaded", "spread",
+ "springst", "sprints",
+ "sprinkel", "sprinkle",
+ "sprintas", "sprints",
+ "spritual", "spiritual",
+ "sproutes", "sprouts",
+ "spwaning", "spawning",
+ "sqaudron", "squadron",
+ "sqaurely", "squarely",
+ "sqiurtle", "squirtle",
+ "squardon", "squadron",
+ "squareds", "squares",
+ "squarley", "squarely",
+ "squeakey", "squeaky",
+ "squeakly", "squeaky",
+ "squirlte", "squirtle",
+ "squirrle", "squirrel",
+ "squirtel", "squirtle",
+ "squishey", "squishy",
+ "squishly", "squishy",
+ "squritle", "squirtle",
+ "squrriel", "squirrel",
+ "squrtile", "squirtle",
+ "sriarcha", "sriracha",
+ "srriacha", "sriracha",
+ "sryacuse", "syracuse",
+ "staduims", "stadiums",
+ "staidums", "stadiums",
+ "staklers", "stalkers",
+ "stalekrs", "stalkers",
+ "stalkear", "stalker",
+ "staminia", "stamina",
+ "stampade", "stamped",
+ "stampeed", "stamped",
+ "stancels", "stances",
+ "stancers", "stances",
+ "standars", "standards",
+ "standbay", "standby",
+ "standbuy", "standby",
+ "stangant", "stagnant",
+ "staright", "straight",
+ "starined", "strained",
+ "starlted", "startled",
+ "startegy", "strategy",
+ "starteld", "startled",
+ "startsup", "startups",
+ "stateman", "statesman",
+ "staticts", "statist",
+ "stationd", "stationed",
+ "stationy", "stationary",
+ "statiskt", "statist",
+ "statistc", "statistic",
+ "statment", "statement",
+ "stattues", "statutes",
+ "statuets", "statutes",
+ "statuser", "stature",
+ "staurday", "saturday",
+ "steadliy", "steadily",
+ "stealhty", "stealthy",
+ "steathly", "stealthy",
+ "stelathy", "stealthy",
+ "sterilze", "sterile",
+ "steriods", "steroids",
+ "stichted", "stitched",
+ "sticthed", "stitched",
+ "sticthes", "stitches",
+ "stimulai", "stimuli",
+ "stimulas", "stimulants",
+ "stimulat", "stimulants",
+ "stimulli", "stimuli",
+ "stingent", "stringent",
+ "stirkers", "strikers",
+ "stlakers", "stalkers",
+ "stomache", "stomach",
+ "stormade", "stormed",
+ "stormend", "stormed",
+ "stradegy", "strategy",
+ "stragety", "strategy",
+ "straignt", "straighten",
+ "straigth", "straight",
+ "straings", "strains",
+ "strangel", "strangle",
+ "stranget", "strangest",
+ "stratgey", "strategy",
+ "stratled", "startled",
+ "streames", "streams",
+ "streamos", "streams",
+ "streamus", "streams",
+ "streamys", "streams",
+ "stregnth", "strength",
+ "stremear", "streamer",
+ "strenght", "strength",
+ "strengts", "strengths",
+ "strenous", "strenuous",
+ "strentgh", "strength",
+ "stretchs", "stretches",
+ "striaght", "straight",
+ "striclty", "strictly",
+ "striekrs", "strikers",
+ "strikely", "strikingly",
+ "stringet", "stringent",
+ "stubbron", "stubborn",
+ "stubmled", "stumbled",
+ "stucture", "structure",
+ "studioes", "studios",
+ "stuipder", "stupider",
+ "stumbeld", "stumbled",
+ "stupdily", "stupidly",
+ "stupidiy", "stupidity",
+ "stylisch", "stylish",
+ "styrofom", "styrofoam",
+ "suasages", "sausages",
+ "subltety", "subtlety",
+ "submarie", "submarines",
+ "subruban", "suburban",
+ "subscrie", "subscriber",
+ "subsidie", "subsidized",
+ "subsidiy", "subsidy",
+ "substace", "substance",
+ "substans", "substances",
+ "substite", "substitute",
+ "subtelty", "subtlety",
+ "subtetly", "subtlety",
+ "subtilte", "subtitle",
+ "subtitel", "subtitle",
+ "subtitls", "subtitles",
+ "subtltey", "subtlety",
+ "succeded", "succeeded",
+ "succedes", "succeeds",
+ "succeeed", "succeed",
+ "succesed", "succeeds",
+ "successs", "successes",
+ "succsess", "success",
+ "suceeded", "succeeded",
+ "sucesful", "successful",
+ "sucesion", "succession",
+ "sucesses", "successes",
+ "sucessor", "successor",
+ "sucessot", "successor",
+ "sucidial", "suicidal",
+ "suddnely", "suddenly",
+ "sufficit", "sufficient",
+ "suggesst", "suggests",
+ "suggeste", "suggestive",
+ "summenor", "summoner",
+ "summones", "summoners",
+ "sunfiber", "sunfire",
+ "sunscren", "sunscreen",
+ "superham", "superhuman",
+ "superheo", "superhero",
+ "superios", "superiors",
+ "supirsed", "suprised",
+ "suposing", "supposing",
+ "supporre", "supporters",
+ "suppoted", "supported",
+ "suprised", "surprised",
+ "suprized", "surprised",
+ "suprsied", "suprised",
+ "supsects", "suspects",
+ "supsense", "suspense",
+ "surbuban", "suburban",
+ "surounds", "surrounds",
+ "surpases", "surpass",
+ "surpress", "suppress",
+ "surprize", "surprise",
+ "surrouns", "surrounds",
+ "surveill", "surveil",
+ "surveyer", "surveyor",
+ "surviver", "survivor",
+ "suspened", "suspend",
+ "suspenso", "suspension",
+ "swaering", "swearing",
+ "swansoon", "swanson",
+ "swasitka", "swastika",
+ "swaskita", "swastika",
+ "swatiska", "swastika",
+ "swatsika", "swastika",
+ "swedisch", "swedish",
+ "swiftley", "swiftly",
+ "swithced", "switched",
+ "swithces", "switches",
+ "swtiched", "switched",
+ "swtiches", "switches",
+ "syarcuse", "syracuse",
+ "sydnrome", "syndrome",
+ "sylablle", "syllable",
+ "syllabel", "syllable",
+ "symapthy", "sympathy",
+ "symboles", "symbols",
+ "symhpony", "symphony",
+ "symmerty", "symmetry",
+ "symmtery", "symmetry",
+ "symoblic", "symbolic",
+ "symphaty", "sympathy",
+ "symptoom", "symptom",
+ "symtpoms", "symptoms",
+ "synomyns", "synonyms",
+ "synonmys", "synonyms",
+ "synonomy", "synonym",
+ "synoynms", "synonyms",
+ "synphony", "symphony",
+ "synposis", "synopsis",
+ "sypmathy", "sympathy",
+ "sypmtoms", "symptoms",
+ "sypnosis", "synopsis",
+ "syraucse", "syracuse",
+ "syrcause", "syracuse",
+ "syringae", "syringe",
+ "syringue", "syringe",
+ "sysamdin", "sysadmin",
+ "sysdamin", "sysadmin",
+ "tacticas", "tactics",
+ "tacticts", "tactics",
+ "tacticus", "tactics",
+ "tagliate", "tailgate",
+ "tahnkyou", "thankyou",
+ "tailsman", "talisman",
+ "taiwanee", "taiwanese",
+ "taligate", "tailgate",
+ "taliored", "tailored",
+ "tallents", "tallest",
+ "talsiman", "talisman",
+ "tanturms", "tantrums",
+ "tapitude", "aptitude",
+ "tasliman", "talisman",
+ "tattooes", "tattoos",
+ "tattooos", "tattoos",
+ "taxanomy", "taxonomy",
+ "teamfigt", "teamfight",
+ "teamspek", "teamspeak",
+ "teancity", "tenacity",
+ "teapsoon", "teaspoon",
+ "techniqe", "technique",
+ "teenages", "teenagers",
+ "telegrah", "telegraph",
+ "telphony", "telephony",
+ "tempalrs", "templars",
+ "tempalte", "template",
+ "templats", "templates",
+ "templeos", "temples",
+ "templers", "temples",
+ "temporay", "temporary",
+ "temprary", "temporary",
+ "tenacles", "tentacles",
+ "tenactiy", "tenacity",
+ "tencaity", "tenacity",
+ "tendancy", "tendency",
+ "tendence", "tendencies",
+ "tentacel", "tentacle",
+ "tentacls", "tentacles",
+ "tentalce", "tentacle",
+ "tequilia", "tequila",
+ "terriory", "territory",
+ "territoy", "territory",
+ "terroist", "terrorist",
+ "tesitcle", "testicle",
+ "testicel", "testicle",
+ "testifiy", "testify",
+ "teusdays", "tuesdays",
+ "texutres", "textures",
+ "thaliand", "thailand",
+ "theather", "theater",
+ "theathre", "theater",
+ "theature", "theater",
+ "theisitc", "theistic",
+ "themslef", "themself",
+ "theorits", "theorist",
+ "theraphy", "therapy",
+ "thereian", "therein",
+ "theroies", "theories",
+ "theroist", "theorist",
+ "thesitic", "theistic",
+ "thialand", "thailand",
+ "thiestic", "theistic",
+ "thikning", "thinking",
+ "thirites", "thirties",
+ "thirstay", "thirsty",
+ "thnakyou", "thankyou",
+ "thoeries", "theories",
+ "thoerist", "theorist",
+ "thomspon", "thompson",
+ "thopmson", "thompson",
+ "thougths", "thoughts",
+ "thourogh", "thorough",
+ "threates", "threatens",
+ "threefor", "therefor",
+ "thriteen", "thirteen",
+ "thrities", "thirties",
+ "throaths", "throats",
+ "throners", "thrones",
+ "throough", "thorough",
+ "throught", "thought",
+ "thrusday", "thursday",
+ "thumbnal", "thumbnails",
+ "thurdsay", "thursday",
+ "thursdsy", "thursdays",
+ "tightare", "tighter",
+ "timestap", "timestamp",
+ "tirangle", "triangle",
+ "tirbunal", "tribunal",
+ "titainum", "titanium",
+ "titanuim", "titanium",
+ "tocuhpad", "touchpad",
+ "togehter", "together",
+ "togheter", "together",
+ "toiletts", "toilets",
+ "tolerabe", "tolerable",
+ "tommorow", "tomorrow",
+ "tonguers", "tongues",
+ "toriodal", "toroidal",
+ "toritlla", "tortilla",
+ "tornadoe", "tornado",
+ "torotise", "tortoise",
+ "torpedeo", "torpedo",
+ "torphies", "trophies",
+ "tortiose", "tortoise",
+ "toruisty", "touristy",
+ "toruneys", "tourneys",
+ "touchapd", "touchpad",
+ "tounreys", "tourneys",
+ "tourisim", "tourism",
+ "touritsy", "touristy",
+ "tournyes", "tourneys",
+ "toursits", "tourists",
+ "toursity", "touristy",
+ "toxiticy", "toxicity",
+ "trabajao", "trabajo",
+ "trabajdo", "trabajo",
+ "trackres", "trackers",
+ "trageted", "targeted",
+ "traingle", "triangle",
+ "traitour", "traitor",
+ "trakcers", "trackers",
+ "traliers", "trailers",
+ "tranform", "transform",
+ "transeat", "translates",
+ "transfom", "transform",
+ "transfos", "transforms",
+ "transiet", "transient",
+ "transito", "transition",
+ "transpot", "transport",
+ "trasnfer", "transfer",
+ "tratiors", "traitors",
+ "traveles", "travels",
+ "traveres", "traverse",
+ "treasurs", "treasures",
+ "treatmet", "treatments",
+ "treatsie", "treaties",
+ "treausre", "treasure",
+ "tredning", "trending",
+ "tremelos", "tremolos",
+ "tresuary", "treasury",
+ "trialers", "trailers",
+ "trianers", "trainers",
+ "triangel", "triangle",
+ "triangls", "triangles",
+ "trianing", "training",
+ "trianlge", "triangle",
+ "triators", "traitors",
+ "tribuanl", "tribunal",
+ "trickyer", "trickery",
+ "triggern", "triggering",
+ "trilogoy", "trilogy",
+ "trinagle", "triangle",
+ "trinekts", "trinkets",
+ "tringale", "triangle",
+ "trinitiy", "trinity",
+ "triology", "trilogy",
+ "triumpth", "triumph",
+ "trohpies", "trophies",
+ "trollade", "trolled",
+ "tropcial", "tropical",
+ "trotilla", "tortilla",
+ "trpoical", "tropical",
+ "trubinal", "tribunal",
+ "trubines", "turbines",
+ "tsunamai", "tsunami",
+ "tuesdsay", "tuesdays",
+ "tunnells", "tunnels",
+ "turkisch", "turkish",
+ "turntabe", "turntable",
+ "turretts", "turrets",
+ "tusedays", "tuesdays",
+ "tutorual", "tutorial",
+ "twilgiht", "twilight",
+ "tylenool", "tylenol",
+ "typicaly", "typically",
+ "tyranies", "tyrannies",
+ "tyrannia", "tyrannical",
+ "ublisher", "publisher",
+ "udnercut", "undercut",
+ "udnerdog", "underdog",
+ "ugpraded", "upgraded",
+ "ugprades", "upgrades",
+ "ukrainie", "ukraine",
+ "ukrainin", "ukrainian",
+ "ukranian", "ukrainian",
+ "ulitmate", "ultimate",
+ "ultamite", "ultimate",
+ "ultiamte", "ultimate",
+ "ultimely", "ultimately",
+ "ultrason", "ultrasound",
+ "umberlla", "umbrella",
+ "unabnned", "unbanned",
+ "unbanend", "unbanned",
+ "uncanney", "uncanny",
+ "uncannny", "uncanny",
+ "underbog", "undergo",
+ "underglo", "undergo",
+ "undersog", "undergo",
+ "undertoe", "undertones",
+ "underwar", "underwater",
+ "unfailry", "unfairly",
+ "unfarily", "unfairly",
+ "ungodley", "ungodly",
+ "unhapppy", "unhappy",
+ "unhealty", "unhealthy",
+ "unicrons", "unicorns",
+ "unifroms", "uniforms",
+ "uniquley", "uniquely",
+ "univeral", "universal",
+ "unlikley", "unlikely",
+ "unlockes", "unlocks",
+ "unluckly", "unlucky",
+ "unpoened", "unopened",
+ "unqiuely", "uniquely",
+ "unrakned", "unranked",
+ "unrnaked", "unranked",
+ "unrpoven", "unproven",
+ "unsuable", "unusable",
+ "untraind", "untrained",
+ "unusualy", "unusually",
+ "unvierse", "universe",
+ "unworhty", "unworthy",
+ "upgarded", "upgraded",
+ "upgardes", "upgrades",
+ "uploades", "uploads",
+ "upstaris", "upstairs",
+ "upstiars", "upstairs",
+ "urethrea", "urethra",
+ "uruguary", "uruguay",
+ "ususally", "usually",
+ "utilitiy", "utility",
+ "utlimate", "ultimate",
+ "vaccinae", "vaccinated",
+ "vaccinet", "vaccinated",
+ "vacinity", "vicinity",
+ "vaguelly", "vaguely",
+ "vaiation", "aviation",
+ "vaieties", "varieties",
+ "vailidty", "validity",
+ "vairable", "variable",
+ "vaklyrie", "valkyrie",
+ "valenica", "valencia",
+ "valentie", "valentines",
+ "valentis", "valentines",
+ "validade", "validated",
+ "valkirye", "valkyrie",
+ "valkiyre", "valkyrie",
+ "valkriye", "valkyrie",
+ "valkryie", "valkyrie",
+ "valkyire", "valkyrie",
+ "valnecia", "valencia",
+ "valubale", "valuable",
+ "valykrie", "valkyrie",
+ "vamipres", "vampires",
+ "vampiers", "vampires",
+ "vampries", "vampires",
+ "vangurad", "vanguard",
+ "vanillia", "vanilla",
+ "vanillla", "vanilla",
+ "vanugard", "vanguard",
+ "varaible", "variable",
+ "varaints", "variants",
+ "variabel", "variable",
+ "varibale", "variable",
+ "varities", "varieties",
+ "vassales", "vassals",
+ "vassalls", "vassals",
+ "vassalos", "vassals",
+ "vaticaan", "vatican",
+ "vaticina", "vatican",
+ "vaulable", "valuable",
+ "vaylkrie", "valkyrie",
+ "vechiles", "vehicles",
+ "vectores", "vectors",
+ "vegansim", "veganism",
+ "vegtable", "vegetable",
+ "vehciles", "vehicles",
+ "vehicels", "vehicles",
+ "vehicule", "vehicle",
+ "veichles", "vehicles",
+ "venelope", "envelope",
+ "venemous", "venomous",
+ "vengance", "vengeance",
+ "vengence", "vengeance",
+ "verablly", "verbally",
+ "verbaitm", "verbatim",
+ "verisons", "versions",
+ "versatel", "versatile",
+ "vertabim", "verbatim",
+ "vertigro", "vertigo",
+ "vesseles", "vessels",
+ "vessells", "vessels",
+ "viabiliy", "viability",
+ "viatmins", "vitamins",
+ "vibratie", "vibrate",
+ "vibratin", "vibration",
+ "vicintiy", "vicinity",
+ "vicseral", "visceral",
+ "victimas", "victims",
+ "victimes", "victims",
+ "victorin", "victorian",
+ "victoris", "victories",
+ "vieweres", "viewers",
+ "viewpoit", "viewpoints",
+ "vigilane", "vigilante",
+ "vigliant", "vigilant",
+ "vikingos", "vikings",
+ "viligant", "vigilant",
+ "villegas", "villages",
+ "vindicte", "vindictive",
+ "vinicity", "vicinity",
+ "violatin", "violation",
+ "violenty", "violently",
+ "violetas", "violates",
+ "virament", "vraiment",
+ "virbator", "vibrator",
+ "virginas", "virgins",
+ "virgines", "virgins",
+ "virgings", "virgins",
+ "virginis", "virgins",
+ "virginus", "virgins",
+ "virtualy", "virtually",
+ "virtuels", "virtues",
+ "virtuose", "virtues",
+ "viscreal", "visceral",
+ "visercal", "visceral",
+ "visibily", "visibility",
+ "visibley", "visibly",
+ "visiblly", "visibly",
+ "vitailty", "vitality",
+ "vitimans", "vitamins",
+ "vitmains", "vitamins",
+ "vitories", "victories",
+ "voicemal", "voicemail",
+ "voilates", "violates",
+ "volatily", "volatility",
+ "volcando", "volcano",
+ "volcanoe", "volcano",
+ "volcaron", "volcano",
+ "vriament", "vraiment",
+ "wahtever", "whatever",
+ "wallpapr", "wallpapers",
+ "warantee", "warranty",
+ "warcarft", "warcraft",
+ "warrante", "warranties",
+ "warriros", "warriors",
+ "watchemn", "watchmen",
+ "watchign", "watching",
+ "wathcing", "watching",
+ "wathcmen", "watchmen",
+ "wathever", "whatever",
+ "watkings", "watkins",
+ "wealthly", "wealthy",
+ "webistes", "websites",
+ "websties", "websites",
+ "wednesdy", "wednesdays",
+ "weigthed", "weighted",
+ "weridest", "weirdest",
+ "werstler", "wrestler",
+ "wesbites", "websites",
+ "westbrok", "westbrook",
+ "westerse", "westerners",
+ "wherease", "whereas",
+ "whipsers", "whispers",
+ "whislist", "wishlist",
+ "whisltes", "whistles",
+ "whisperd", "whispered",
+ "whistels", "whistles",
+ "whitsles", "whistles",
+ "whsipers", "whispers",
+ "widgetas", "widgets",
+ "wieghted", "weighted",
+ "willaims", "williams",
+ "willfuly", "willfully",
+ "willimas", "williams",
+ "windsoar", "windsor",
+ "wininpeg", "winnipeg",
+ "winnigns", "winnings",
+ "winnpieg", "winnipeg",
+ "wiredest", "weirdest",
+ "wishlsit", "wishlist",
+ "wishpers", "whispers",
+ "withdral", "withdrawal",
+ "witnesss", "witnesses",
+ "wonderes", "wonders",
+ "wonderus", "wonders",
+ "workfore", "workforce",
+ "wouldnot", "wouldnt",
+ "wranlger", "wrangler",
+ "wreckign", "wrecking",
+ "wrecthed", "wretched",
+ "wrekcing", "wrecking",
+ "wreslter", "wrestler",
+ "wresters", "wrestlers",
+ "writting", "writing",
+ "wrnagler", "wrangler",
+ "wrteched", "wretched",
+ "yeilding", "yielding",
+ "yoesmite", "yosemite",
+ "yorksher", "yorkshire",
+ "yorkshie", "yorkshire",
+ "yosemeti", "yosemite",
+ "yosimete", "yosemite",
+ "zealotes", "zealots",
+ "zealoths", "zealots",
+ "zealotus", "zealots",
+ "zealouts", "zealous",
+ "zepplein", "zeppelin",
+ "zepplien", "zeppelin",
+ "zimbabew", "zimbabwe",
+ "zimbawbe", "zimbabwe",
+ "zinoists", "zionists",
+ "zionisim", "zionism",
+ "zionistm", "zionism",
+ "zionsits", "zionists",
+ "zoinists", "zionists",
+ "abiltiy", "ability",
+ "abodmen", "abdomen",
+ "abondon", "abandon",
+ "aboslve", "absolve",
+ "abosrbs", "absorbs",
+ "abriter", "arbiter",
+ "abrupty", "abruptly",
+ "absense", "absence",
+ "absolue", "absolute",
+ "absovle", "absolve",
+ "absrobs", "absorbs",
+ "absuers", "abusers",
+ "absurdy", "absurdly",
+ "absymal", "abysmal",
+ "abymsal", "abysmal",
+ "acadamy", "academy",
+ "acadmic", "academic",
+ "accesss", "access",
+ "accpets", "accepts",
+ "accross", "across",
+ "accuray", "accuracy",
+ "acheive", "achieve",
+ "achived", "achieved",
+ "acident", "accident",
+ "ackward", "awkward",
+ "acrlyic", "acrylic",
+ "actauly", "actualy",
+ "activit", "activist",
+ "activly", "actively",
+ "actualy", "actually",
+ "actulay", "actualy",
+ "acuracy", "accuracy",
+ "acusing", "causing",
+ "acustom", "accustom",
+ "acutaly", "actualy",
+ "acyrlic", "acrylic",
+ "adaptes", "adapters",
+ "adatper", "adapter",
+ "adbomen", "abdomen",
+ "addcits", "addicts",
+ "adderss", "address",
+ "addtion", "addition",
+ "adequet", "adequate",
+ "adequit", "adequate",
+ "adivser", "adviser",
+ "adivsor", "advisor",
+ "admited", "admitted",
+ "admrial", "admiral",
+ "adpater", "adapter",
+ "adquire", "acquire",
+ "adultey", "adultery",
+ "adverst", "adverts",
+ "adviced", "advised",
+ "advocay", "advocacy",
+ "advsior", "advisor",
+ "aeriels", "aerials",
+ "affaris", "affairs",
+ "affiars", "affairs",
+ "afircan", "african",
+ "africas", "africans",
+ "afwully", "awfully",
+ "againts", "against",
+ "agaisnt", "against",
+ "aganist", "against",
+ "aggreed", "agreed",
+ "agianst", "against",
+ "agreing", "agreeing",
+ "agruing", "arguing",
+ "ahtiest", "athiest",
+ "aicraft", "aircraft",
+ "ailmony", "alimony",
+ "airbore", "airborne",
+ "aircaft", "aircraft",
+ "airlfow", "airflow",
+ "airosft", "airsoft",
+ "airpost", "airports",
+ "airsfot", "airsoft",
+ "airzona", "arizona",
+ "alchmey", "alchemy",
+ "alchool", "alcohol",
+ "alcohal", "alcohol",
+ "aledged", "alleged",
+ "aledges", "alleges",
+ "alegbra", "algebra",
+ "algerba", "algebra",
+ "alienet", "alienate",
+ "alledge", "allege",
+ "allegry", "allergy",
+ "alltime", "all-time",
+ "almighy", "almighty",
+ "alochol", "alcohol",
+ "alotted", "allotted",
+ "alowing", "allowing",
+ "alphabt", "alphabet",
+ "alreayd", "already",
+ "alrighy", "alrighty",
+ "altanta", "atlanta",
+ "alteast", "atleast",
+ "altough", "although",
+ "alusion", "allusion",
+ "amateus", "amateurs",
+ "amatuer", "amateur",
+ "amature", "armature",
+ "amensia", "amnesia",
+ "amensty", "amnesty",
+ "amercia", "america",
+ "americs", "americas",
+ "ammount", "amount",
+ "ammused", "amused",
+ "amneisa", "amnesia",
+ "amnsety", "amnesty",
+ "amognst", "amongst",
+ "amongts", "amongst",
+ "amonsgt", "amongst",
+ "ampilfy", "amplify",
+ "amrpits", "armpits",
+ "analoge", "analogue",
+ "analsyt", "analyst",
+ "analyes", "analyse",
+ "analyts", "analyst",
+ "analzye", "analyze",
+ "anaylse", "analyse",
+ "anaylst", "analyst",
+ "anaylze", "analyze",
+ "anceint", "ancient",
+ "andorid", "android",
+ "andriod", "android",
+ "androis", "androids",
+ "angirly", "angrily",
+ "angluar", "angular",
+ "angualr", "angular",
+ "anicent", "ancient",
+ "anitque", "antique",
+ "anixety", "anxiety",
+ "anmesia", "amnesia",
+ "anmesty", "amnesty",
+ "annoint", "anoint",
+ "annualy", "annually",
+ "annuled", "annulled",
+ "anohter", "another",
+ "anomoly", "anomaly",
+ "answerd", "answered",
+ "anuglar", "angular",
+ "anulled", "annulled",
+ "anwsers", "answers",
+ "anwyays", "anyways",
+ "anxeity", "anxiety",
+ "anyoens", "anyones",
+ "anyonse", "anyones",
+ "anywyas", "anyways",
+ "aparent", "apparent",
+ "appeard", "appeared",
+ "appluad", "applaud",
+ "aproval", "approval",
+ "apsects", "aspects",
+ "apshalt", "asphalt",
+ "apsirin", "aspirin",
+ "aqcuire", "acquire",
+ "aquarim", "aquarium",
+ "aquired", "acquired",
+ "aranged", "arranged",
+ "arbitre", "arbiter",
+ "arcahic", "archaic",
+ "archiac", "archaic",
+ "arcylic", "acrylic",
+ "aresnal", "arsenal",
+ "aretmis", "artemis",
+ "argubly", "arguably",
+ "aribter", "arbiter",
+ "ariflow", "airflow",
+ "arisoft", "airsoft",
+ "aritsts", "artists",
+ "armchar", "armchair",
+ "arogant", "arrogant",
+ "arogent", "arrogant",
+ "arresst", "arrests",
+ "arround", "around",
+ "arsneal", "arsenal",
+ "artcile", "article",
+ "artical", "article",
+ "articel", "article",
+ "artistc", "artistic",
+ "artmeis", "artemis",
+ "artsits", "artists",
+ "aruging", "arguing",
+ "aseuxal", "asexual",
+ "asexaul", "asexual",
+ "ashpalt", "asphalt",
+ "asiprin", "aspirin",
+ "asissts", "assists",
+ "asnwers", "answers",
+ "asorbed", "absorbed",
+ "aspahlt", "asphalt",
+ "asphlat", "asphalt",
+ "aspriin", "aspirin",
+ "assagne", "assange",
+ "assasin", "assassin",
+ "assembe", "assemble",
+ "assemby", "assembly",
+ "assisst", "assists",
+ "assnage", "assange",
+ "asssits", "assists",
+ "assualt", "assault",
+ "asterik", "asterisk",
+ "asutria", "austria",
+ "atcualy", "actualy",
+ "atelast", "atleast",
+ "athesim", "atheism",
+ "athiesm", "atheism",
+ "athiest", "atheist",
+ "athiets", "athiest",
+ "athlets", "athletes",
+ "atlantc", "atlantic",
+ "atleats", "atleast",
+ "atlesat", "atleast",
+ "atorney", "attorney",
+ "atremis", "artemis",
+ "attemps", "attempts",
+ "attemts", "attempts",
+ "attened", "attended",
+ "attracs", "attracts",
+ "audbile", "audible",
+ "audibel", "audible",
+ "austira", "austria",
+ "austrai", "austria",
+ "autistc", "autistic",
+ "avation", "aviation",
+ "avtaars", "avatars",
+ "awakend", "awakened",
+ "bablyon", "babylon",
+ "backdor", "backdoor",
+ "backsta", "backseat",
+ "baclony", "balcony",
+ "badnits", "bandits",
+ "baiscly", "basicly",
+ "bakcers", "backers",
+ "balanse", "balances",
+ "balcked", "blacked",
+ "banhsee", "banshee",
+ "bankgok", "bangkok",
+ "baoynet", "bayonet",
+ "baptims", "baptism",
+ "baptsim", "baptism",
+ "baragin", "bargain",
+ "bargani", "bargain",
+ "bargian", "bargain",
+ "bariner", "brainer",
+ "barlkey", "barkley",
+ "barracs", "barracks",
+ "barrles", "barrels",
+ "barsita", "barista",
+ "barvery", "bravery",
+ "bascily", "basicly",
+ "basicly", "basically",
+ "basilcy", "basicly",
+ "basiton", "bastion",
+ "basnhee", "banshee",
+ "bastane", "bastante",
+ "bastars", "bastards",
+ "bastino", "bastion",
+ "bathrom", "bathroom",
+ "batitsa", "batista",
+ "batsita", "batista",
+ "bayblon", "babylon",
+ "baynoet", "bayonet",
+ "bayoent", "bayonet",
+ "bceuase", "becuase",
+ "beacuse", "because",
+ "bealtes", "beatles",
+ "beaslty", "beastly",
+ "beatels", "beatles",
+ "beaucop", "beaucoup",
+ "becamae", "became",
+ "becames", "becomes",
+ "becasue", "because",
+ "becouse", "because",
+ "becuaes", "becuase",
+ "becuase", "because",
+ "becusae", "becuase",
+ "befried", "befriend",
+ "beggins", "begins",
+ "beglian", "belgian",
+ "beglium", "belgium",
+ "begnals", "bengals",
+ "bejiing", "beijing",
+ "beleifs", "beliefs",
+ "beleive", "believe",
+ "belgain", "belgian",
+ "belguim", "belgium",
+ "believr", "believer",
+ "believs", "believes",
+ "belifes", "beliefs",
+ "beligan", "belgian",
+ "beligum", "belgium",
+ "belived", "believed",
+ "belives", "believes",
+ "benagls", "bengals",
+ "benedit", "benedict",
+ "benghai", "benghazi",
+ "benglas", "bengals",
+ "benifit", "benefit",
+ "beoynce", "beyonce",
+ "beraded", "bearded",
+ "bersekr", "berserk",
+ "beseige", "besiege",
+ "betales", "beatles",
+ "bethesa", "bethesda",
+ "betrayd", "betrayed",
+ "beucase", "becuase",
+ "bewteen", "between",
+ "bicthes", "bitches",
+ "bidrman", "birdman",
+ "biejing", "beijing",
+ "bifgoot", "bigfoot",
+ "bigorty", "bigotry",
+ "bigtoed", "bigoted",
+ "bigtory", "bigotry",
+ "biogted", "bigoted",
+ "biogtry", "bigotry",
+ "bioplar", "bipolar",
+ "biploar", "bipolar",
+ "birdamn", "birdman",
+ "birdges", "bridges",
+ "birgade", "brigade",
+ "bitcion", "bitcoin",
+ "bithced", "bitched",
+ "bithces", "bitches",
+ "bitocin", "bitcoin",
+ "bizzare", "bizarre",
+ "blacony", "balcony",
+ "blaimed", "blamed",
+ "blankes", "blankets",
+ "blegian", "belgian",
+ "blegium", "belgium",
+ "blizzad", "blizzard",
+ "blockes", "blockers",
+ "bloster", "bolster",
+ "blulets", "bullets",
+ "bobmers", "bombers",
+ "bollocs", "bollocks",
+ "bondary", "boundary",
+ "bonnano", "bonanno",
+ "bonsues", "bonuses",
+ "boraden", "broaden",
+ "borader", "broader",
+ "boradly", "broadly",
+ "bordeom", "boredom",
+ "boslter", "bolster",
+ "boudler", "boulder",
+ "boundry", "boundary",
+ "bounses", "bonuses",
+ "boutiqe", "boutique",
+ "bouyant", "buoyant",
+ "braevry", "bravery",
+ "braista", "barista",
+ "brakley", "barkley",
+ "branier", "brainer",
+ "braoden", "broaden",
+ "braoder", "broader",
+ "braodly", "broadly",
+ "brednan", "brendan",
+ "breifly", "briefly",
+ "breserk", "berserk",
+ "brethen", "brethren",
+ "brewrey", "brewery",
+ "briagde", "brigade",
+ "brianer", "brainer",
+ "bridman", "birdman",
+ "brielfy", "briefly",
+ "brigdes", "bridges",
+ "brightn", "brighten",
+ "brisben", "brisbane",
+ "britian", "britain",
+ "britsol", "bristol",
+ "briused", "bruised",
+ "briuser", "bruiser",
+ "briuses", "bruises",
+ "brocoli", "broccoli",
+ "bronocs", "broncos",
+ "browine", "brownie",
+ "brownei", "brownie",
+ "brownis", "brownies",
+ "bruglar", "burglar",
+ "brunete", "brunette",
+ "bruning", "burning",
+ "brusied", "bruised",
+ "brusies", "bruises",
+ "brusses", "brussels",
+ "brutaly", "brutally",
+ "btiched", "bitched",
+ "btiches", "bitches",
+ "bubbels", "bubbles",
+ "buddhim", "buddhism",
+ "buddhit", "buddhist",
+ "buddist", "buddhist",
+ "budgest", "budgets",
+ "bugdets", "budgets",
+ "buildes", "builders",
+ "bulgara", "bulgaria",
+ "bullest", "bullets",
+ "buoancy", "buoyancy",
+ "burguny", "burgundy",
+ "buriser", "bruiser",
+ "burlgar", "burglar",
+ "burnign", "burning",
+ "burried", "buried",
+ "burrtio", "burrito",
+ "busines", "business",
+ "busness", "business",
+ "butthoe", "butthole",
+ "buttrey", "buttery",
+ "cababge", "cabbage",
+ "cabines", "cabinets",
+ "cabniet", "cabinet",
+ "caclium", "calcium",
+ "cacuses", "caucuses",
+ "caffeen", "caffeine",
+ "cahched", "cached",
+ "cahotic", "chaotic",
+ "cahsier", "cashier",
+ "cailbre", "calibre",
+ "calaber", "caliber",
+ "calagry", "calgary",
+ "calback", "callback",
+ "calbire", "calibre",
+ "calcuim", "calcium",
+ "calculs", "calculus",
+ "calicum", "calcium",
+ "calrify", "clarify",
+ "calrity", "clarity",
+ "caluses", "clauses",
+ "camboda", "cambodia",
+ "campain", "campaign",
+ "campuss", "campuses",
+ "cancles", "cancels",
+ "cancres", "cancers",
+ "cancuks", "canucks",
+ "canides", "candies",
+ "cannnot", "cannot",
+ "canrage", "carnage",
+ "capible", "capable",
+ "capitas", "capitals",
+ "capsuls", "capsules",
+ "captais", "captains",
+ "captial", "capital",
+ "captiol", "capitol",
+ "captued", "captured",
+ "capturd", "captured",
+ "capusle", "capsule",
+ "carange", "carnage",
+ "carbien", "carbine",
+ "cardaic", "cardiac",
+ "cardina", "cardigan",
+ "careing", "caring",
+ "caridac", "cardiac",
+ "carmtan", "cartman",
+ "carnege", "carnage",
+ "carnige", "carnage",
+ "carolan", "carolina",
+ "carreer", "career",
+ "carrers", "careers",
+ "cartles", "cartels",
+ "caryons", "crayons",
+ "casette", "cassette",
+ "casheir", "cashier",
+ "cashies", "cashiers",
+ "cashire", "cashier",
+ "casltes", "castles",
+ "caspule", "capsule",
+ "cassete", "cassette",
+ "castels", "castles",
+ "casuing", "causing",
+ "cathlic", "catholic",
+ "cauncks", "canucks",
+ "cavarly", "cavalry",
+ "cavlary", "cavalry",
+ "celcius", "celsius",
+ "celisus", "celsius",
+ "celitcs", "celtics",
+ "celsuis", "celsius",
+ "centruy", "century",
+ "centuty", "century",
+ "ceratin", "certain",
+ "cermaic", "ceramic",
+ "certian", "certain",
+ "cervial", "cervical",
+ "cesspol", "cesspool",
+ "cetlics", "celtics",
+ "chambre", "chamber",
+ "charcol", "charcoal",
+ "charisa", "charisma",
+ "chasiss", "chassis",
+ "chatoic", "chaotic",
+ "cheeots", "cheetos",
+ "cheesse", "cheeses",
+ "chekcer", "checker",
+ "chelsae", "chelsea",
+ "cheslea", "chelsea",
+ "chiense", "chinese",
+ "childen", "children",
+ "chimeny", "chimney",
+ "chinees", "chinese",
+ "chinmey", "chimney",
+ "chipest", "chipset",
+ "chispet", "chipset",
+ "chivaly", "chivalry",
+ "chlesea", "chelsea",
+ "chnages", "changes",
+ "choatic", "chaotic",
+ "chocies", "choices",
+ "choosen", "chosen",
+ "chtulhu", "cthulhu",
+ "churchs", "churches",
+ "cilanto", "cilantro",
+ "cilents", "clients",
+ "circels", "circles",
+ "circuis", "circuits",
+ "cirlces", "circles",
+ "clacium", "calcium",
+ "claerer", "clearer",
+ "claerly", "clearly",
+ "clagary", "calgary",
+ "claibre", "calibre",
+ "claimes", "claims",
+ "clairfy", "clarify",
+ "clairty", "clarity",
+ "clanand", "clannad",
+ "clarfiy", "clarify",
+ "classis", "classics",
+ "clasues", "clauses",
+ "claymer", "claymore",
+ "claymoe", "claymore",
+ "cleanes", "cleanse",
+ "cleasne", "cleanse",
+ "cleints", "clients",
+ "clenase", "cleanse",
+ "clesius", "celsius",
+ "cletics", "celtics",
+ "clevery", "cleverly",
+ "climats", "climates",
+ "climbes", "climbers",
+ "clincis", "clinics",
+ "clitors", "clitoris",
+ "cloesly", "closely",
+ "closley", "closely",
+ "cluases", "clauses",
+ "cluprit", "culprit",
+ "coalese", "coalesce",
+ "coctail", "cocktail",
+ "cohesie", "cohesive",
+ "colgone", "cologne",
+ "collape", "collapse",
+ "collest", "collects",
+ "collony", "colony",
+ "collumn", "column",
+ "cologen", "cologne",
+ "colomba", "colombia",
+ "colonge", "cologne",
+ "colorao", "colorado",
+ "colourd", "coloured",
+ "columsn", "columns",
+ "comando", "commando",
+ "comapny", "company",
+ "comapre", "compare",
+ "comarde", "comrade",
+ "comback", "comeback",
+ "combins", "combines",
+ "comdeic", "comedic",
+ "comited", "committed",
+ "commano", "commando",
+ "commans", "commands",
+ "commere", "commerce",
+ "comming", "coming",
+ "commitd", "commited",
+ "compase", "compares",
+ "compede", "competed",
+ "compilr", "compiler",
+ "compnay", "company",
+ "compots", "compost",
+ "comrads", "comrades",
+ "comtpon", "compton",
+ "conceed", "concede",
+ "conceps", "concepts",
+ "conclue", "conclude",
+ "concret", "concert",
+ "condenm", "condemn",
+ "condiut", "conduit",
+ "condmen", "condemn",
+ "confids", "confides",
+ "confins", "confines",
+ "confise", "confines",
+ "conflit", "conflict",
+ "conived", "connived",
+ "connecs", "connects",
+ "conqeur", "conquer",
+ "conqure", "conquer",
+ "consept", "concept",
+ "consern", "concern",
+ "consums", "consumes",
+ "contacs", "contacts",
+ "contais", "contains",
+ "contast", "contacts",
+ "contemt", "contempt",
+ "contens", "contents",
+ "contess", "contests",
+ "contian", "contain",
+ "contine", "continue",
+ "convers", "converts",
+ "conveyd", "conveyed",
+ "convine", "convince",
+ "coprses", "corpses",
+ "coputer", "computer",
+ "corasir", "corsair",
+ "coratia", "croatia",
+ "coridal", "cordial",
+ "corsari", "corsair",
+ "corsiar", "corsair",
+ "corspes", "corpses",
+ "corwbar", "crowbar",
+ "costums", "costumes",
+ "coudlnt", "couldnt",
+ "coulmns", "columns",
+ "coulndt", "couldnt",
+ "counsle", "counsel",
+ "countes", "counters",
+ "courtey", "courtesy",
+ "covenat", "covenant",
+ "coytoes", "coyotes",
+ "crabine", "carbine",
+ "cralwed", "crawled",
+ "craotia", "croatia",
+ "craweld", "crawled",
+ "creamic", "ceramic",
+ "createn", "creatine",
+ "creater", "creature",
+ "creatie", "creatine",
+ "creatue", "creature",
+ "creepes", "creepers",
+ "creepig", "creeping",
+ "creulty", "cruelty",
+ "cricles", "circles",
+ "critera", "criteria",
+ "cropses", "corpses",
+ "crosair", "corsair",
+ "crpytic", "cryptic",
+ "crsytal", "crystal",
+ "crtical", "critical",
+ "crucibe", "crucible",
+ "cruetly", "cruelty",
+ "cruical", "crucial",
+ "crulety", "cruelty",
+ "crusdae", "crusade",
+ "crusier", "cruiser",
+ "crusies", "cruises",
+ "crusive", "cursive",
+ "crutchs", "crutches",
+ "crypitc", "cryptic",
+ "crystas", "crystals",
+ "crystsl", "crystals",
+ "crytpic", "cryptic",
+ "crytsal", "crystal",
+ "cthluhu", "cthulhu",
+ "cthuhlu", "cthulhu",
+ "cthuluh", "cthulhu",
+ "ctuhlhu", "cthulhu",
+ "cuasing", "causing",
+ "cubcile", "cubicle",
+ "cubilce", "cubicle",
+ "cuddels", "cuddles",
+ "culrpit", "culprit",
+ "culturs", "cultures",
+ "cupboad", "cupboard",
+ "cuplrit", "culprit",
+ "curatin", "curtain",
+ "curcial", "crucial",
+ "curcuit", "circuit",
+ "curelty", "cruelty",
+ "curiser", "cruiser",
+ "curisve", "cursive",
+ "currate", "curate",
+ "currens", "currents",
+ "curreny", "currency",
+ "currest", "currents",
+ "cursade", "crusade",
+ "curtian", "curtain",
+ "cyandie", "cyanide",
+ "cyclits", "cyclist",
+ "cycloen", "cyclone",
+ "cycolps", "cyclops",
+ "cylcist", "cyclist",
+ "cylcone", "cyclone",
+ "cylcops", "cyclops",
+ "cynaide", "cyanide",
+ "cyrptic", "cryptic",
+ "cyrstal", "crystal",
+ "dagners", "dangers",
+ "daimond", "diamond",
+ "damenor", "demeanor",
+ "dammage", "damage",
+ "darcula", "dracula",
+ "dargons", "dragons",
+ "darkets", "darkest",
+ "datbase", "database",
+ "daulity", "duality",
+ "dawrves", "dwarves",
+ "ddogers", "dodgers",
+ "ddoging", "dodging",
+ "deadlit", "deadlift",
+ "deadpol", "deadpool",
+ "deafult", "default",
+ "deahtly", "deathly",
+ "deatils", "details",
+ "deatlhy", "deathly",
+ "decalre", "declare",
+ "decison", "decision",
+ "declars", "declares",
+ "declase", "declares",
+ "decress", "decrees",
+ "decribe", "describe",
+ "decsend", "descend",
+ "dectect", "detect",
+ "defaint", "defiant",
+ "defauls", "defaults",
+ "defelct", "deflect",
+ "defensd", "defends",
+ "deffine", "define",
+ "definat", "defiant",
+ "definet", "definite",
+ "definie", "definite",
+ "definig", "defining",
+ "definit", "definite",
+ "defualt", "default",
+ "degarde", "degrade",
+ "degrase", "degrasse",
+ "degrate", "degrade",
+ "deiners", "deniers",
+ "deisgns", "designs",
+ "deivant", "deviant",
+ "dekstop", "desktop",
+ "delcare", "declare",
+ "delfect", "deflect",
+ "demenor", "demeanor",
+ "dementa", "dementia",
+ "demsond", "desmond",
+ "deneirs", "deniers",
+ "denisty", "density",
+ "densley", "densely",
+ "depcits", "depicts",
+ "dependd", "depended",
+ "depitcs", "depicts",
+ "deployd", "deployed",
+ "depsise", "despise",
+ "descrie", "describe",
+ "descuss", "discuss",
+ "desgins", "designs",
+ "desings", "designs",
+ "desitny", "destiny",
+ "desnely", "densely",
+ "desnity", "density",
+ "desomnd", "desmond",
+ "despict", "depict",
+ "despide", "despised",
+ "despies", "despise",
+ "destkop", "desktop",
+ "destory", "destroy",
+ "destros", "destroys",
+ "detaild", "detailed",
+ "detials", "details",
+ "detorit", "detroit",
+ "detriot", "detroit",
+ "deuling", "dueling",
+ "devaint", "deviant",
+ "devaite", "deviate",
+ "devided", "divided",
+ "devlove", "devolve",
+ "devotin", "devotion",
+ "devovle", "devolve",
+ "diabets", "diabetes",
+ "dialecs", "dialects",
+ "dialoge", "dialogue",
+ "diamons", "diamonds",
+ "diasble", "disable",
+ "dicksih", "dickish",
+ "dicover", "discover",
+ "dictats", "dictates",
+ "dieties", "deities",
+ "dilpoma", "diploma",
+ "dimaond", "diamond",
+ "dingity", "dignity",
+ "dinosar", "dinosaur",
+ "diosese", "diocese",
+ "dipolma", "diploma",
+ "dirbble", "dribble",
+ "directy", "directly",
+ "diretcx", "directx",
+ "dirived", "derived",
+ "dirvers", "drivers",
+ "disbale", "disable",
+ "disguss", "disgusts",
+ "disliks", "dislikes",
+ "disover", "discover",
+ "dispair", "despair",
+ "dispath", "dispatch",
+ "dispite", "despite",
+ "dispuse", "disputes",
+ "disputs", "disputes",
+ "dissole", "dissolve",
+ "distase", "distaste",
+ "distint", "distinct",
+ "divison", "division",
+ "docuhes", "douches",
+ "docuhey", "douchey",
+ "dogders", "dodgers",
+ "dogding", "dodging",
+ "dolhpin", "dolphin",
+ "dolphis", "dolphins",
+ "dominae", "dominate",
+ "dominno", "dominion",
+ "doplhin", "dolphin",
+ "dortmud", "dortmund",
+ "draclua", "dracula",
+ "dracual", "dracula",
+ "drakest", "darkest",
+ "dramtic", "dramatic",
+ "dribbel", "dribble",
+ "driectx", "directx",
+ "driftig", "drifting",
+ "drinkes", "drinkers",
+ "druming", "drumming",
+ "duailty", "duality",
+ "dualtiy", "duality",
+ "dubsetp", "dubstep",
+ "dulaity", "duality",
+ "duleing", "dueling",
+ "dunegon", "dungeon",
+ "dungeos", "dungeons",
+ "dungoen", "dungeon",
+ "durring", "during",
+ "dusbtep", "dubstep",
+ "dyansty", "dynasty",
+ "dynamis", "dynamics",
+ "dynsaty", "dynasty",
+ "earlies", "earliest",
+ "earliet", "earliest",
+ "earplus", "earplugs",
+ "eastwod", "eastwood",
+ "ebcuase", "becuase",
+ "ecilpse", "eclipse",
+ "eclipes", "eclipse",
+ "eclispe", "eclipse",
+ "eclpise", "eclipse",
+ "ectsasy", "ecstasy",
+ "edbiles", "edibles",
+ "edibels", "edibles",
+ "effords", "efforts",
+ "ehtanol", "ethanol",
+ "eifnach", "einfach",
+ "eighten", "eighteen",
+ "einfahc", "einfach",
+ "elasped", "elapsed",
+ "elcipse", "eclipse",
+ "elction", "election",
+ "elecrto", "electro",
+ "electic", "electric",
+ "electon", "election",
+ "ellitot", "elliott",
+ "elloitt", "elliott",
+ "elphant", "elephant",
+ "emabrgo", "embargo",
+ "emabssy", "embassy",
+ "emapthy", "empathy",
+ "embeded", "embedded",
+ "embrago", "embargo",
+ "eminate", "emanate",
+ "emipres", "empires",
+ "emision", "emission",
+ "emiting", "emitting",
+ "emition", "emission",
+ "emmited", "emitted",
+ "empahty", "empathy",
+ "emphsis", "emphasis",
+ "empiers", "empires",
+ "empited", "emptied",
+ "emplore", "employer",
+ "emporer", "emperor",
+ "empries", "empires",
+ "emtpied", "emptied",
+ "enameld", "enameled",
+ "encahnt", "enchant",
+ "encalve", "enclave",
+ "encrpyt", "encrypt",
+ "encyrpt", "encrypt",
+ "endores", "endorse",
+ "endrose", "endorse",
+ "energis", "energies",
+ "enforse", "enforces",
+ "enginer", "engineer",
+ "englsih", "english",
+ "enhanse", "enhances",
+ "enlcave", "enclave",
+ "enlgish", "english",
+ "enlsave", "enslave",
+ "ensalve", "enslave",
+ "entbook", "netbook",
+ "entirey", "entirety",
+ "entorpy", "entropy",
+ "epiloge", "epilogue",
+ "episdoe", "episode",
+ "epsiode", "episode",
+ "epsorts", "esports",
+ "eptiome", "epitome",
+ "equiped", "equipped",
+ "erested", "arrested",
+ "escapse", "escapes",
+ "escpaes", "escapes",
+ "esctasy", "ecstasy",
+ "esporst", "esports",
+ "espreso", "espresso",
+ "esprots", "esports",
+ "essense", "essence",
+ "etherel", "ethereal",
+ "ethnaol", "ethanol",
+ "euphora", "euphoria",
+ "europen", "european",
+ "eurpean", "european",
+ "everets", "everest",
+ "everset", "everest",
+ "evloved", "evolved",
+ "evloves", "evolves",
+ "evovled", "evolved",
+ "evovles", "evolves",
+ "exaclty", "exactly",
+ "exahust", "exhaust",
+ "examind", "examined",
+ "exapnds", "expands",
+ "exatled", "exalted",
+ "excange", "exchange",
+ "excatly", "exactly",
+ "excells", "excels",
+ "exceprt", "excerpt",
+ "excluse", "excludes",
+ "excrept", "excerpt",
+ "exculde", "exclude",
+ "exelent", "excellent",
+ "exemple", "example",
+ "exerpts", "excerpts",
+ "exhasut", "exhaust",
+ "exhuast", "exhaust",
+ "exising", "existing",
+ "existet", "existent",
+ "exlated", "exalted",
+ "exlcude", "exclude",
+ "exliled", "exiled",
+ "exludes", "excludes",
+ "exmaple", "example",
+ "exoitcs", "exotics",
+ "expalin", "explain",
+ "expeced", "expected",
+ "expells", "expels",
+ "expiers", "expires",
+ "explict", "explicit",
+ "expliot", "exploit",
+ "explods", "explodes",
+ "explose", "explodes",
+ "expolde", "explode",
+ "expolit", "exploit",
+ "exposse", "exposes",
+ "expries", "expires",
+ "exracts", "extracts",
+ "exsited", "existed",
+ "extered", "exerted",
+ "exterme", "extreme",
+ "extoics", "exotics",
+ "extreem", "extreme",
+ "extrems", "extremes",
+ "eyebals", "eyeballs",
+ "eyebros", "eyebrows",
+ "fabulos", "fabulous",
+ "facebok", "facebook",
+ "facepam", "facepalm",
+ "faclons", "falcons",
+ "facsism", "fascism",
+ "facsist", "fascist",
+ "failurs", "failures",
+ "faincee", "fiancee",
+ "falesly", "falsely",
+ "falired", "flaired",
+ "falshed", "flashed",
+ "falshes", "flashes",
+ "falsley", "falsely",
+ "falvors", "flavors",
+ "familes", "families",
+ "famoust", "famous",
+ "famousy", "famously",
+ "fanatsy", "fantasy",
+ "fantaic", "fanatic",
+ "faoming", "foaming",
+ "fascits", "fascist",
+ "fasicsm", "fascism",
+ "fasicst", "fascist",
+ "faslely", "falsely",
+ "fatiuge", "fatigue",
+ "febuary", "february",
+ "fecthed", "fetched",
+ "fecthes", "fetches",
+ "feminen", "feminine",
+ "feminie", "feminine",
+ "feminim", "feminism",
+ "feodras", "fedoras",
+ "fertily", "fertility",
+ "fesitve", "festive",
+ "fethced", "fetched",
+ "fethces", "fetches",
+ "fetishs", "fetishes",
+ "fianite", "finite",
+ "fianlly", "finally",
+ "fiercly", "fiercely",
+ "filcker", "flicker",
+ "filpped", "flipped",
+ "filterd", "filtered",
+ "finacee", "fiancee",
+ "fineses", "finesse",
+ "fininsh", "finnish",
+ "finishs", "finishes",
+ "finisse", "finishes",
+ "finnsih", "finnish",
+ "firends", "friends",
+ "firggin", "friggin",
+ "firsbee", "frisbee",
+ "firslty", "firstly",
+ "firtsly", "firstly",
+ "fitlers", "filters",
+ "flacons", "falcons",
+ "flahsed", "flashed",
+ "flahses", "flashes",
+ "flaried", "flaired",
+ "flasely", "falsely",
+ "flashig", "flashing",
+ "flavord", "flavored",
+ "flavous", "flavours",
+ "flawess", "flawless",
+ "flciker", "flicker",
+ "fliters", "filters",
+ "flordia", "florida",
+ "florene", "florence",
+ "fnaatic", "fanatic",
+ "fomaing", "foaming",
+ "fonetic", "phonetic",
+ "forefit", "forfeit",
+ "foregin", "foreign",
+ "foreing", "foreign",
+ "forfiet", "forfeit",
+ "forhead", "forehead",
+ "foriegn", "foreign",
+ "formaly", "formally",
+ "formery", "formerly",
+ "formost", "foremost",
+ "formual", "formula",
+ "formuls", "formulas",
+ "forrset", "forrest",
+ "forsakn", "forsaken",
+ "forsane", "forsaken",
+ "forumla", "formula",
+ "fountan", "fountain",
+ "fourten", "fourteen",
+ "fracter", "fracture",
+ "fragmet", "fragment",
+ "freedos", "freedoms",
+ "freinds", "friends",
+ "frigign", "friggin",
+ "fristly", "firstly",
+ "frostig", "frosting",
+ "frsibee", "frisbee",
+ "fruitin", "fruition",
+ "fullets", "fullest",
+ "fullset", "fullest",
+ "funides", "fundies",
+ "funtion", "function",
+ "furance", "furnace",
+ "furncae", "furnace",
+ "futhroc", "futhark",
+ "gadgest", "gadgets",
+ "gagdets", "gadgets",
+ "galatic", "galactic",
+ "galcier", "glacier",
+ "galsgow", "glasgow",
+ "gameply", "gameplay",
+ "gamerga", "gamertag",
+ "gankign", "ganking",
+ "ganster", "gangster",
+ "garabge", "garbage",
+ "garfied", "garfield",
+ "garnola", "granola",
+ "generas", "generals",
+ "genersl", "generals",
+ "geniuss", "geniuses",
+ "geogria", "georgia",
+ "geomety", "geometry",
+ "georiga", "georgia",
+ "gernade", "grenade",
+ "gerogia", "georgia",
+ "gigabye", "gigabyte",
+ "giltchy", "glitchy",
+ "gimmics", "gimmicks",
+ "gimmicy", "gimmicky",
+ "girzzly", "grizzly",
+ "glagsow", "glasgow",
+ "glaicer", "glacier",
+ "glicthy", "glitchy",
+ "glimpes", "glimpse",
+ "glimspe", "glimpse",
+ "glipmse", "glimpse",
+ "glitchd", "glitched",
+ "glitchs", "glitches",
+ "glithcy", "glitchy",
+ "globaly", "globally",
+ "gloiath", "goliath",
+ "glorios", "glorious",
+ "gltichy", "glitchy",
+ "gnaking", "ganking",
+ "gnawwed", "gnawed",
+ "goddanm", "goddamn",
+ "goddman", "goddamn",
+ "godliek", "godlike",
+ "godlman", "goldman",
+ "godsped", "godspeed",
+ "goergia", "georgia",
+ "goilath", "goliath",
+ "golaith", "goliath",
+ "golbins", "goblins",
+ "goldamn", "goldman",
+ "goldbeg", "goldberg",
+ "goldike", "godlike",
+ "golitah", "goliath",
+ "goodluk", "goodluck",
+ "gorumet", "gourmet",
+ "gosepls", "gospels",
+ "gosples", "gospels",
+ "gpysies", "gypsies",
+ "grabage", "garbage",
+ "grahpic", "graphic",
+ "grainte", "granite",
+ "grammer", "grammar",
+ "graniet", "granite",
+ "grantie", "granite",
+ "graphie", "graphite",
+ "graphis", "graphics",
+ "grappel", "grapple",
+ "greande", "grenade",
+ "grenads", "grenades",
+ "greneer", "greener",
+ "griaffe", "giraffe",
+ "gridles", "griddles",
+ "grillig", "grilling",
+ "grpahic", "graphic",
+ "guardin", "guardian",
+ "guiness", "guinness",
+ "gullibe", "gullible",
+ "gutiars", "guitars",
+ "gypises", "gypsies",
+ "gyspies", "gypsies",
+ "habaeus", "habeas",
+ "haethen", "heathen",
+ "hailfax", "halifax",
+ "halfiax", "halifax",
+ "handbok", "handbook",
+ "handedy", "handedly",
+ "handeld", "handled",
+ "hanlder", "handler",
+ "hannibl", "hannibal",
+ "hanuted", "haunted",
+ "haorder", "hoarder",
+ "hapened", "happened",
+ "happend", "happened",
+ "happliy", "happily",
+ "harased", "harassed",
+ "harases", "harasses",
+ "hardend", "hardened",
+ "hardwod", "hardwood",
+ "haricut", "haircut",
+ "hatchig", "hatching",
+ "hauntig", "haunting",
+ "haviest", "heaviest",
+ "headest", "headset",
+ "headses", "headsets",
+ "heaveny", "heavenly",
+ "heigher", "higher",
+ "heigths", "heights",
+ "helemts", "helmets",
+ "hellfie", "hellfire",
+ "hellvua", "helluva",
+ "helment", "helmet",
+ "helpped", "helped",
+ "hemlets", "helmets",
+ "henious", "heinous",
+ "heorics", "heroics",
+ "heorine", "heroine",
+ "heriocs", "heroics",
+ "herione", "heroine",
+ "herocis", "heroics",
+ "heronie", "heroine",
+ "hesiman", "heisman",
+ "hieghts", "heights",
+ "hienous", "heinous",
+ "hiesman", "heisman",
+ "himselv", "himself",
+ "hiptser", "hipster",
+ "hismelf", "himself",
+ "hispter", "hipster",
+ "hitboxs", "hitboxes",
+ "hoilday", "holiday",
+ "hokpins", "hopkins",
+ "holdiay", "holiday",
+ "holdins", "holdings",
+ "homniem", "hominem",
+ "horader", "hoarder",
+ "hosited", "hoisted",
+ "hosthot", "hotshot",
+ "hostles", "hostels",
+ "hostpot", "hotspot",
+ "hothsot", "hotshot",
+ "hotpsot", "hotspot",
+ "hotsopt", "hotspot",
+ "hounour", "honour",
+ "hseldon", "sheldon",
+ "huanted", "haunted",
+ "humanit", "humanist",
+ "humants", "humanist",
+ "humidiy", "humidity",
+ "humoros", "humorous",
+ "hunagry", "hungary",
+ "hunderd", "hundred",
+ "hundres", "hundreds",
+ "hungray", "hungary",
+ "hurdels", "hurdles",
+ "hurldes", "hurdles",
+ "husbans", "husbands",
+ "hweaton", "wheaton",
+ "hybirds", "hybrids",
+ "hydogen", "hydrogen",
+ "hygeine", "hygiene",
+ "hypnoss", "hypnosis",
+ "hyrbids", "hybrids",
+ "hystera", "hysteria",
+ "iceforg", "icefrog",
+ "ierland", "ireland",
+ "ignitin", "ignition",
+ "ignorat", "ignorant",
+ "illegas", "illegals",
+ "illegsl", "illegals",
+ "illinos", "illinois",
+ "imanent", "eminent",
+ "imapcts", "impacts",
+ "iminent", "eminent",
+ "imminet", "imminent",
+ "implict", "implicit",
+ "imploed", "implode",
+ "imploys", "employs",
+ "impluse", "impulse",
+ "impolde", "implode",
+ "importd", "imported",
+ "imporve", "improve",
+ "impules", "impulse",
+ "impusle", "impulse",
+ "imrpove", "improve",
+ "incldue", "include",
+ "incluse", "includes",
+ "indains", "indians",
+ "indeces", "indices",
+ "indiaan", "indiana",
+ "indluge", "indulge",
+ "indugle", "indulge",
+ "infalte", "inflate",
+ "infenro", "inferno",
+ "infered", "inferred",
+ "inferir", "inferior",
+ "infinet", "infinite",
+ "infinie", "infinite",
+ "infinit", "infinite",
+ "infornt", "infront",
+ "infroms", "informs",
+ "infrotn", "infront",
+ "inheirt", "inherit",
+ "inidans", "indians",
+ "initals", "initials",
+ "initisl", "initials",
+ "inlcine", "incline",
+ "inovker", "invoker",
+ "inpeach", "impeach",
+ "inpsect", "inspect",
+ "inpsire", "inspire",
+ "inquier", "inquire",
+ "inquriy", "inquiry",
+ "insaney", "insanely",
+ "inscets", "insects",
+ "insepct", "inspect",
+ "insipre", "inspire",
+ "insluts", "insults",
+ "instade", "instead",
+ "instint", "instinct",
+ "intenst", "intents",
+ "intered", "interred",
+ "interet", "interest",
+ "internt", "internet",
+ "interro", "interior",
+ "intrest", "interest",
+ "intrige", "intrigue",
+ "invlove", "involve",
+ "invoekr", "invoker",
+ "invovle", "involve",
+ "iornman", "ironman",
+ "iranain", "iranian",
+ "iranias", "iranians",
+ "iranina", "iranian",
+ "irleand", "ireland",
+ "ironamn", "ironman",
+ "isalmic", "islamic",
+ "isareli", "israeli",
+ "islamit", "islamist",
+ "islmaic", "islamic",
+ "isloate", "isolate",
+ "isralei", "israeli",
+ "isreali", "israeli",
+ "italias", "italians",
+ "jagaurs", "jaguars",
+ "jaguras", "jaguars",
+ "jamacia", "jamaica",
+ "jamaina", "jamaican",
+ "jamiaca", "jamaica",
+ "jamsine", "jasmine",
+ "janaury", "january",
+ "januray", "january",
+ "japanes", "japanese",
+ "jasmien", "jasmine",
+ "jaugars", "jaguars",
+ "jaunary", "january",
+ "jeircho", "jericho",
+ "jennins", "jennings",
+ "jeopary", "jeopardy",
+ "jeresys", "jerseys",
+ "jericoh", "jericho",
+ "jersyes", "jerseys",
+ "jewerly", "jewelry",
+ "jorunal", "journal",
+ "jounral", "journal",
+ "joystik", "joystick",
+ "juadism", "judaism",
+ "judasim", "judaism",
+ "judical", "judicial",
+ "juipter", "jupiter",
+ "junglig", "jungling",
+ "juptier", "jupiter",
+ "jusitfy", "justify",
+ "justfiy", "justify",
+ "karakoe", "karaoke",
+ "karoake", "karaoke",
+ "kenendy", "kennedy",
+ "kenndey", "kennedy",
+ "kentucy", "kentucky",
+ "keyboad", "keyboard",
+ "keychan", "keychain",
+ "keynode", "keynote",
+ "kicthen", "kitchen",
+ "killins", "killings",
+ "kineitc", "kinetic",
+ "kinghts", "knights",
+ "kinteic", "kinetic",
+ "kitches", "kitchens",
+ "kitites", "kitties",
+ "knietic", "kinetic",
+ "knigths", "knights",
+ "knuckel", "knuckle",
+ "kroeans", "koreans",
+ "krudish", "kurdish",
+ "ktichen", "kitchen",
+ "kubirck", "kubrick",
+ "kunckle", "knuckle",
+ "kurbick", "kubrick",
+ "kuridsh", "kurdish",
+ "laguage", "language",
+ "landins", "landings",
+ "lantren", "lantern",
+ "laready", "already",
+ "laregly", "largely",
+ "largley", "largely",
+ "lasanga", "lasagna",
+ "lasgana", "lasagna",
+ "latitue", "latitude",
+ "latnern", "lantern",
+ "launhed", "launched",
+ "lavendr", "lavender",
+ "leathal", "lethal",
+ "lefitst", "leftist",
+ "leftits", "leftist",
+ "legnths", "lengths",
+ "legnthy", "lengthy",
+ "legoins", "legions",
+ "leigons", "legions",
+ "lenghts", "lengths",
+ "lenoard", "leonard",
+ "lepoard", "leopard",
+ "lesbain", "lesbian",
+ "lesiban", "lesbian",
+ "lesiure", "leisure",
+ "liasion", "liaison",
+ "liasons", "liaisons",
+ "liberae", "liberate",
+ "liberas", "liberals",
+ "lienups", "lineups",
+ "liesure", "leisure",
+ "liftime", "lifetime",
+ "lighlty", "lightly",
+ "lightes", "lighters",
+ "ligthly", "lightly",
+ "linclon", "lincoln",
+ "linueps", "lineups",
+ "liqiuds", "liquids",
+ "lisence", "license",
+ "lisense", "license",
+ "listend", "listened",
+ "litecon", "litecoin",
+ "literae", "literate",
+ "lithuim", "lithium",
+ "litihum", "lithium",
+ "loadous", "loadouts",
+ "loenard", "leonard",
+ "loepard", "leopard",
+ "logiteh", "logitech",
+ "loosley", "loosely",
+ "luandry", "laundry",
+ "luckliy", "luckily",
+ "luicfer", "lucifer",
+ "lunatis", "lunatics",
+ "maching", "machine",
+ "machins", "machines",
+ "maclolm", "malcolm",
+ "macthup", "matchup",
+ "madsion", "madison",
+ "magents", "magnets",
+ "magicin", "magician",
+ "magolia", "magnolia",
+ "maidson", "madison",
+ "maintan", "maintain",
+ "mairlyn", "marilyn",
+ "malaira", "malaria",
+ "malaysa", "malaysia",
+ "malclom", "malcolm",
+ "manauls", "manuals",
+ "mandase", "mandates",
+ "mandats", "mandates",
+ "mangeld", "mangled",
+ "mangets", "magnets",
+ "manualy", "manually",
+ "manuver", "maneuver",
+ "marbels", "marbles",
+ "margart", "margaret",
+ "mariage", "marriage",
+ "mariens", "marines",
+ "maritan", "martian",
+ "marixsm", "marxism",
+ "mariyln", "marilyn",
+ "markede", "marketed",
+ "marlbes", "marbles",
+ "marliyn", "marilyn",
+ "marnies", "marines",
+ "marrage", "marriage",
+ "martail", "martial",
+ "martain", "martian",
+ "masacra", "mascara",
+ "massace", "massacre",
+ "mathcup", "matchup",
+ "mathwes", "mathews",
+ "matrial", "martial",
+ "maunals", "manuals",
+ "mcalren", "mclaren",
+ "meanins", "meanings",
+ "medicad", "medicaid",
+ "medicae", "medicare",
+ "medioce", "mediocre",
+ "meixcan", "mexican",
+ "meldoic", "melodic",
+ "melieux", "milieux",
+ "melodis", "melodies",
+ "memeber", "member",
+ "memoery", "memory",
+ "memorie", "memory",
+ "menally", "mentally",
+ "mentaly", "mentally",
+ "meoldic", "melodic",
+ "meranda", "veranda",
+ "merchat", "merchant",
+ "merucry", "mercury",
+ "messagd", "messaged",
+ "messaih", "messiah",
+ "metagem", "metagame",
+ "metalic", "metallic",
+ "mexcian", "mexican",
+ "michina", "michigan",
+ "midfied", "midfield",
+ "midotwn", "midtown",
+ "midtwon", "midtown",
+ "migrans", "migrants",
+ "militat", "militant",
+ "militis", "militias",
+ "miltary", "military",
+ "mimimum", "minimum",
+ "mineras", "minerals",
+ "mininos", "minions",
+ "ministr", "minister",
+ "ministy", "ministry",
+ "minoins", "minions",
+ "minstry", "ministry",
+ "minumum", "minimum",
+ "mirrord", "mirrored",
+ "misandy", "misandry",
+ "misison", "mission",
+ "misouri", "missouri",
+ "mispell", "misspell",
+ "missils", "missiles",
+ "mistery", "mystery",
+ "mobiliy", "mobility",
+ "modualr", "modular",
+ "momento", "memento",
+ "momment", "moment",
+ "monarcy", "monarchy",
+ "monatge", "montage",
+ "monglos", "mongols",
+ "monitos", "monitors",
+ "monstre", "monster",
+ "montaeg", "montage",
+ "montrel", "montreal",
+ "monumet", "monument",
+ "morbidy", "morbidly",
+ "morgage", "mortgage",
+ "morphen", "morphine",
+ "morphie", "morphine",
+ "morroco", "morocco",
+ "mortage", "mortgage",
+ "mosnter", "monster",
+ "mosture", "moisture",
+ "motivet", "motivate",
+ "motnage", "montage",
+ "motoral", "motorola",
+ "mountan", "mountain",
+ "movment", "movement",
+ "mucuous", "mucous",
+ "muesums", "museums",
+ "muliple", "multiple",
+ "mulsims", "muslims",
+ "multipe", "multiple",
+ "multipy", "multiply",
+ "munbers", "numbers",
+ "munchis", "munchies",
+ "murderd", "murdered",
+ "muscial", "musical",
+ "mushrom", "mushroom",
+ "musilms", "muslims",
+ "muslces", "muscles",
+ "musuems", "museums",
+ "mutatin", "mutation",
+ "mypsace", "myspace",
+ "mysapce", "myspace",
+ "napolen", "napoleon",
+ "narhwal", "narwhal",
+ "natique", "antique",
+ "nativey", "natively",
+ "natrual", "natural",
+ "naugthy", "naughty",
+ "nauseos", "nauseous",
+ "nautils", "nautilus",
+ "nautral", "natural",
+ "nautres", "natures",
+ "nectode", "netcode",
+ "needels", "needles",
+ "neruons", "neurons",
+ "neslave", "enslave",
+ "netocde", "netcode",
+ "netowrk", "network",
+ "netural", "neutral",
+ "neturon", "neutron",
+ "netwrok", "network",
+ "neurton", "neutron",
+ "neuterd", "neutered",
+ "nighlty", "nightly",
+ "nigthly", "nightly",
+ "nihilim", "nihilism",
+ "ninties", "1990s",
+ "niverse", "inverse",
+ "nocture", "nocturne",
+ "nominae", "nominate",
+ "nominet", "nominate",
+ "nonsene", "nonsense",
+ "noramls", "normals",
+ "norhern", "northern",
+ "normaly", "normally",
+ "normany", "normandy",
+ "northen", "northern",
+ "nostris", "nostrils",
+ "notario", "ontario",
+ "notebok", "notebook",
+ "nothern", "northern",
+ "nowdays", "nowadays",
+ "nrivana", "nirvana",
+ "nuaghty", "naughty",
+ "nubmers", "numbers",
+ "nucelar", "nuclear",
+ "nucelus", "nucleus",
+ "nuclean", "unclean",
+ "nuclues", "nucleus",
+ "nucular", "nuclear",
+ "nuerons", "neurons",
+ "nuetral", "neutral",
+ "nuetron", "neutron",
+ "nulcear", "nuclear",
+ "nullfiy", "nullify",
+ "nusance", "nuisance",
+ "nutriet", "nutrient",
+ "oarcles", "oracles",
+ "obivous", "obvious",
+ "obvoius", "obvious",
+ "ocarnia", "ocarina",
+ "ocasion", "occasion",
+ "occured", "occurred",
+ "ocotber", "october",
+ "ocotpus", "octopus",
+ "ocraina", "ocarina",
+ "ocuntry", "country",
+ "ocurred", "occurred",
+ "ofcoure", "ofcourse",
+ "offcers", "officers",
+ "offical", "official",
+ "offisde", "offside",
+ "oftenly", "often",
+ "ogrilla", "gorilla",
+ "olmypic", "olympic",
+ "olreans", "orleans",
+ "olympis", "olympics",
+ "olypmic", "olympic",
+ "omision", "omission",
+ "omiting", "omitting",
+ "omlette", "omelette",
+ "ommited", "omitted",
+ "onatrio", "ontario",
+ "onbaord", "onboard",
+ "onborad", "onboard",
+ "ontairo", "ontario",
+ "ontraio", "ontario",
+ "opartor", "operator",
+ "openess", "openness",
+ "opitcal", "optical",
+ "opitmal", "optimal",
+ "oponent", "opponent",
+ "oposite", "opposite",
+ "oppenly", "openly",
+ "opponet", "opponent",
+ "oprhans", "orphans",
+ "optimim", "optimism",
+ "oracels", "oracles",
+ "oragnes", "oranges",
+ "oragsms", "orgasms",
+ "oralces", "oracles",
+ "orbtial", "orbital",
+ "orcales", "oracles",
+ "orelans", "orleans",
+ "organes", "organise",
+ "organie", "organise",
+ "organim", "organism",
+ "orginal", "original",
+ "orhpans", "orphans",
+ "oribtal", "orbital",
+ "orlenas", "orleans",
+ "orpahns", "orphans",
+ "orthodx", "orthodox",
+ "outfied", "outfield",
+ "outsidr", "outsider",
+ "overhal", "overhaul",
+ "overpad", "overpaid",
+ "oversue", "overuse",
+ "overtun", "overturn",
+ "ownders", "wonders",
+ "owuldve", "wouldve",
+ "oylmpic", "olympic",
+ "pacakge", "package",
+ "pacifit", "pacifist",
+ "packade", "packaged",
+ "pacthes", "patches",
+ "pahntom", "phantom",
+ "paitent", "patient",
+ "palcebo", "placebo",
+ "pallete", "palette",
+ "palster", "plaster",
+ "palyboy", "playboy",
+ "pamflet", "pamphlet",
+ "pamplet", "pamphlet",
+ "pancaks", "pancakes",
+ "pandroa", "pandora",
+ "panthen", "pantheon",
+ "paradim", "paradigm",
+ "paradse", "parades",
+ "paralel", "parallel",
+ "paranoa", "paranoia",
+ "parises", "praises",
+ "parites", "parties",
+ "partice", "particle",
+ "partick", "patrick",
+ "partiel", "particle",
+ "partiot", "patriot",
+ "partols", "patrols",
+ "passabe", "passable",
+ "passivs", "passives",
+ "pasuing", "pausing",
+ "pateint", "patient",
+ "pathces", "patches",
+ "patiens", "patients",
+ "patirot", "patriot",
+ "patrcik", "patrick",
+ "patrios", "patriots",
+ "patroit", "patriot",
+ "peaples", "peoples",
+ "pebbels", "pebbles",
+ "peirced", "pierced",
+ "penatly", "penalty",
+ "pendulm", "pendulum",
+ "penguis", "penguins",
+ "penicls", "pencils",
+ "penison", "pension",
+ "penisse", "penises",
+ "penitum", "pentium",
+ "pensies", "penises",
+ "pensino", "pension",
+ "pentuim", "pentium",
+ "peopels", "peoples",
+ "percise", "precise",
+ "perdict", "predict",
+ "perfers", "prefers",
+ "perhasp", "perhaps",
+ "perhpas", "perhaps",
+ "perisan", "persian",
+ "perjery", "perjury",
+ "permade", "premade",
+ "permier", "premier",
+ "permise", "premise",
+ "permium", "premium",
+ "peroids", "periods",
+ "peronal", "personal",
+ "perpaid", "prepaid",
+ "perphas", "perhaps",
+ "persain", "persian",
+ "persets", "presets",
+ "persits", "persist",
+ "persued", "pursued",
+ "persuit", "pursuit",
+ "pervail", "prevail",
+ "perview", "preview",
+ "pharoah", "pharaoh",
+ "phatnom", "phantom",
+ "phsyics", "physics",
+ "phyiscs", "physics",
+ "physcis", "physics",
+ "physiqe", "physique",
+ "picthed", "pitched",
+ "picther", "pitcher",
+ "picthes", "pitches",
+ "piegons", "pigeons",
+ "piglrim", "pilgrim",
+ "pigoens", "pigeons",
+ "pilgirm", "pilgrim",
+ "pilrgim", "pilgrim",
+ "pinoeer", "pioneer",
+ "pinpoit", "pinpoint",
+ "pionere", "pioneer",
+ "pireced", "pierced",
+ "pithces", "pitches",
+ "plantes", "planets",
+ "plastis", "plastics",
+ "plastre", "plaster",
+ "plataeu", "plateau",
+ "plateua", "plateau",
+ "playabe", "playable",
+ "playofs", "playoffs",
+ "plesant", "pleasant",
+ "pligrim", "pilgrim",
+ "ploygon", "polygon",
+ "ploymer", "polymer",
+ "podemso", "podemos",
+ "podmeos", "podemos",
+ "poeples", "peoples",
+ "poignat", "poignant",
+ "poineer", "pioneer",
+ "pointes", "pointers",
+ "poisond", "poisoned",
+ "polgyon", "polygon",
+ "polical", "political",
+ "polishs", "polishes",
+ "polisse", "polishes",
+ "politey", "politely",
+ "poluted", "polluted",
+ "polutes", "pollutes",
+ "popluar", "popular",
+ "populer", "popular",
+ "populos", "populous",
+ "porpose", "propose",
+ "porshan", "portion",
+ "porshon", "portion",
+ "portait", "portrait",
+ "portary", "portray",
+ "portras", "portrays",
+ "portrat", "portrait",
+ "posions", "poisons",
+ "positon", "position",
+ "positve", "positive",
+ "possibe", "possible",
+ "possiby", "possibly",
+ "postdam", "potsdam",
+ "postion", "position",
+ "postive", "positive",
+ "potatos", "potatoes",
+ "potical", "optical",
+ "potrait", "portrait",
+ "powderd", "powdered",
+ "poweful", "powerful",
+ "poylgon", "polygon",
+ "poylmer", "polymer",
+ "practie", "practise",
+ "praisse", "praises",
+ "praries", "prairies",
+ "prasied", "praised",
+ "prasies", "praises",
+ "pratice", "practice",
+ "preamde", "premade",
+ "preceed", "precede",
+ "precice", "precise",
+ "preests", "presets",
+ "prehaps", "perhaps",
+ "preimer", "premier",
+ "preimum", "premium",
+ "preists", "priests",
+ "preivew", "preview",
+ "premeir", "premier",
+ "premiee", "premiere",
+ "premire", "premier",
+ "premits", "permits",
+ "premius", "premiums",
+ "premuim", "premium",
+ "prepair", "prepare",
+ "preriod", "period",
+ "presens", "presents",
+ "presest", "presets",
+ "presist", "persist",
+ "prestes", "presets",
+ "presude", "presumed",
+ "pretene", "pretense",
+ "pretens", "pretends",
+ "preveiw", "preview",
+ "prevert", "pervert",
+ "previal", "prevail",
+ "previes", "previews",
+ "previos", "previous",
+ "priased", "praised",
+ "priases", "praises",
+ "printes", "printers",
+ "pristen", "pristine",
+ "probabe", "probable",
+ "probaly", "probably",
+ "probelm", "problem",
+ "procede", "proceed",
+ "procees", "proceeds",
+ "procesd", "proceeds",
+ "proclam", "proclaim",
+ "produly", "proudly",
+ "produse", "produces",
+ "progidy", "prodigy",
+ "progrom", "pogrom",
+ "prohibt", "prohibit",
+ "prohpet", "prophet",
+ "prologe", "prologue",
+ "promose", "promotes",
+ "promots", "promotes",
+ "prompty", "promptly",
+ "promtps", "prompts",
+ "pronous", "pronouns",
+ "prooved", "proved",
+ "propeht", "prophet",
+ "prophey", "prophecy",
+ "propper", "proper",
+ "protals", "portals",
+ "protecs", "protects",
+ "protess", "protests",
+ "protocl", "protocol",
+ "protray", "portray",
+ "prouldy", "proudly",
+ "provded", "provided",
+ "provine", "province",
+ "prusuit", "pursuit",
+ "pryamid", "pyramid",
+ "pscyhed", "psyched",
+ "ptiched", "pitched",
+ "pticher", "pitcher",
+ "puasing", "pausing",
+ "publicy", "publicly",
+ "publsih", "publish",
+ "puhsups", "pushups",
+ "punishs", "punishes",
+ "punisse", "punishes",
+ "pursiut", "pursuit",
+ "pursude", "pursued",
+ "purused", "pursued",
+ "pushpus", "pushups",
+ "pyarmid", "pyramid",
+ "pyramis", "pyramids",
+ "pyrmaid", "pyramid",
+ "pysched", "psyched",
+ "qaulify", "qualify",
+ "qaulity", "quality",
+ "qauntum", "quantum",
+ "quailfy", "qualify",
+ "quailty", "quality",
+ "queires", "queries",
+ "queitly", "quietly",
+ "quereis", "queries",
+ "quicket", "quickest",
+ "quielty", "quietly",
+ "quitely", "quietly",
+ "qunatum", "quantum",
+ "qunetin", "quentin",
+ "racisst", "racists",
+ "racthet", "ratchet",
+ "radaint", "radiant",
+ "radiane", "radiance",
+ "radicas", "radicals",
+ "radiers", "raiders",
+ "raelism", "realism",
+ "raidant", "radiant",
+ "railrod", "railroad",
+ "rainbos", "rainbows",
+ "raoches", "roaches",
+ "raoming", "roaming",
+ "raptros", "raptors",
+ "raputre", "rapture",
+ "rathcet", "ratchet",
+ "ratpure", "rapture",
+ "reacing", "reaching",
+ "reagrds", "regards",
+ "realies", "realise",
+ "realsie", "realise",
+ "realsim", "realism",
+ "realtes", "relates",
+ "reamins", "remains",
+ "reapirs", "repairs",
+ "rebouns", "rebounds",
+ "rebulit", "rebuilt",
+ "recalim", "reclaim",
+ "receips", "receipts",
+ "recided", "resided",
+ "reciept", "receipt",
+ "recievd", "recieved",
+ "recieve", "receive",
+ "recitfy", "rectify",
+ "recived", "received",
+ "reclami", "reclaim",
+ "recliam", "reclaim",
+ "recorre", "recorder",
+ "recoves", "recovers",
+ "recpies", "recipes",
+ "redeemd", "redeemed",
+ "redners", "renders",
+ "refelct", "reflect",
+ "referal", "referral",
+ "refered", "referred",
+ "referig", "refering",
+ "referrs", "refers",
+ "reflexs", "reflexes",
+ "refrers", "refers",
+ "refroms", "reforms",
+ "refusla", "refusal",
+ "regerts", "regrets",
+ "regiems", "regimes",
+ "regimet", "regiment",
+ "registy", "registry",
+ "regluar", "regular",
+ "regrest", "regrets",
+ "regulae", "regulate",
+ "regulas", "regulars",
+ "regulsr", "regulars",
+ "reigmes", "regimes",
+ "reigons", "regions",
+ "reitres", "retires",
+ "reivews", "reviews",
+ "reknown", "renown",
+ "relaise", "realise",
+ "relapes", "relapse",
+ "relaspe", "relapse",
+ "relatie", "relative",
+ "relatin", "relation",
+ "relcaim", "reclaim",
+ "releive", "relieve",
+ "releses", "releases",
+ "relfect", "reflect",
+ "reliabe", "reliable",
+ "relient", "reliant",
+ "relized", "realised",
+ "relpase", "relapse",
+ "remaind", "remained",
+ "remaing", "remaining",
+ "remakrs", "remarks",
+ "remannt", "remnant",
+ "remeber", "remember",
+ "remians", "remains",
+ "remnans", "remnants",
+ "renderd", "rendered",
+ "renegae", "renegade",
+ "renmant", "remnant",
+ "rentors", "renters",
+ "rentres", "renters",
+ "renuion", "reunion",
+ "repaird", "repaired",
+ "repalys", "replays",
+ "repblic", "republic",
+ "repeast", "repeats",
+ "repects", "respects",
+ "repitle", "reptile",
+ "replase", "replaces",
+ "replayd", "replayed",
+ "reponse", "response",
+ "repostd", "reposted",
+ "repsawn", "respawn",
+ "repsond", "respond",
+ "repsots", "reposts",
+ "reptiel", "reptile",
+ "reptils", "reptiles",
+ "repubic", "republic",
+ "republi", "republic",
+ "repulic", "republic",
+ "reqiuem", "requiem",
+ "requeim", "requiem",
+ "requime", "requiem",
+ "requred", "required",
+ "resapwn", "respawn",
+ "rescuse", "rescues",
+ "resembe", "resemble",
+ "reslove", "resolve",
+ "resolvs", "resolves",
+ "resonet", "resonate",
+ "resouce", "resource",
+ "resovle", "resolve",
+ "respest", "respects",
+ "respone", "response",
+ "respwan", "respawn",
+ "ressits", "resists",
+ "restord", "restored",
+ "resuced", "rescued",
+ "resuces", "rescues",
+ "retrive", "retrieve",
+ "returnd", "returned",
+ "reuinon", "reunion",
+ "reveald", "revealed",
+ "reveiws", "reviews",
+ "revelas", "reveals",
+ "reveral", "reversal",
+ "reviere", "reviewer",
+ "reviewd", "reviewed",
+ "reviewr", "reviewer",
+ "revolvr", "revolver",
+ "revolvs", "revolves",
+ "rewirte", "rewrite",
+ "reworkd", "reworked",
+ "rewriet", "rewrite",
+ "reynols", "reynolds",
+ "rhapsoy", "rhapsody",
+ "rhythem", "rhythm",
+ "rhythim", "rhythm",
+ "rhytmic", "rhythmic",
+ "riaders", "raiders",
+ "ritlain", "ritalin",
+ "ritoers", "rioters",
+ "rivarly", "rivalry",
+ "rivlary", "rivalry",
+ "roahces", "roaches",
+ "robotis", "robotics",
+ "rococco", "rococo",
+ "roestta", "rosetta",
+ "roiters", "rioters",
+ "roleply", "roleplay",
+ "romaina", "romania",
+ "romaing", "roaming",
+ "romanin", "romanian",
+ "romanna", "romanian",
+ "roomate", "roommate",
+ "rotuers", "routers",
+ "rugters", "rutgers",
+ "rulebok", "rulebook",
+ "rumorus", "rumours",
+ "rumuors", "rumours",
+ "runnung", "running",
+ "ruslted", "rustled",
+ "russina", "russian",
+ "russion", "russian",
+ "rusteld", "rustled",
+ "rythmic", "rhythmic",
+ "rythyms", "rhythms",
+ "sacrasm", "sarcasm",
+ "saddnes", "saddens",
+ "sadistc", "sadistic",
+ "sadning", "sanding",
+ "salaris", "salaries",
+ "salavge", "salvage",
+ "salvery", "slavery",
+ "salying", "slaying",
+ "sampels", "samples",
+ "samruai", "samurai",
+ "samuari", "samurai",
+ "samuria", "samurai",
+ "sandlas", "sandals",
+ "sandnig", "sanding",
+ "sanlder", "sandler",
+ "santorm", "santorum",
+ "sapphie", "sapphire",
+ "sarcams", "sarcasm",
+ "sargant", "sergeant",
+ "sasuage", "sausage",
+ "satifsy", "satisfy",
+ "satsify", "satisfy",
+ "satsohi", "satoshi",
+ "savanha", "savannah",
+ "savannh", "savannah",
+ "saveing", "saving",
+ "sawnsea", "swansea",
+ "sawnson", "swanson",
+ "scandas", "scandals",
+ "scannig", "scanning",
+ "scartch", "scratch",
+ "scheems", "schemes",
+ "schoold", "schooled",
+ "sciense", "sciences",
+ "scinece", "science",
+ "scootes", "scooters",
+ "scorpin", "scorpion",
+ "scpeter", "scepter",
+ "scracth", "scratch",
+ "scrambe", "scramble",
+ "scritps", "scripts",
+ "scrolld", "scrolled",
+ "scrpits", "scripts",
+ "scyhter", "scyther",
+ "seached", "searched",
+ "seaches", "searches",
+ "seahaws", "seahawks",
+ "seantor", "senator",
+ "searchd", "searched",
+ "searchs", "searches",
+ "sebrian", "serbian",
+ "secerts", "secrets",
+ "secpter", "scepter",
+ "secrest", "secrets",
+ "secrety", "secretly",
+ "seflies", "selfies",
+ "seguoys", "segues",
+ "seinors", "seniors",
+ "selifes", "selfies",
+ "senoirs", "seniors",
+ "sensure", "censure",
+ "sentaor", "senator",
+ "sentris", "sentries",
+ "serbain", "serbian",
+ "sergeat", "sergeant",
+ "sergent", "sergeant",
+ "seriban", "serbian",
+ "servans", "servants",
+ "sesnors", "sensors",
+ "settins", "settings",
+ "severly", "severely",
+ "sexualy", "sexually",
+ "seziure", "seizure",
+ "shaddow", "shadow",
+ "shanghi", "shanghai",
+ "shaprie", "sharpie",
+ "shaprly", "sharply",
+ "sharipe", "sharpie",
+ "shcemes", "schemes",
+ "sheelpe", "sheeple",
+ "sheepel", "sheeple",
+ "shephed", "shepherd",
+ "sherlok", "sherlock",
+ "shetler", "shelter",
+ "shevles", "shelves",
+ "shfiter", "shifter",
+ "shieldd", "shielded",
+ "shiping", "shipping",
+ "shirely", "shirley",
+ "shitfer", "shifter",
+ "shledon", "sheldon",
+ "shleter", "shelter",
+ "shoudln", "should",
+ "shouldt", "shouldnt",
+ "shoutot", "shoutout",
+ "showede", "showered",
+ "showerd", "showered",
+ "shperes", "spheres",
+ "shriley", "shirley",
+ "siblins", "siblings",
+ "sidelen", "sideline",
+ "sideral", "sidereal",
+ "siezing", "seizing",
+ "siezure", "seizure",
+ "signfiy", "signify",
+ "signins", "signings",
+ "signles", "singles",
+ "silders", "sliders",
+ "silenty", "silently",
+ "similir", "similiar",
+ "simliar", "similar",
+ "simplet", "simplest",
+ "simpley", "simply",
+ "simplfy", "simplify",
+ "simpliy", "simplify",
+ "simposn", "simpson",
+ "simspon", "simpson",
+ "singals", "signals",
+ "singels", "singles",
+ "singify", "signify",
+ "singsog", "singsong",
+ "sitmuli", "stimuli",
+ "skecthy", "sketchy",
+ "skeletl", "skeletal",
+ "skeptis", "skeptics",
+ "sketchs", "sketches",
+ "sketpic", "skeptic",
+ "skpetic", "skeptic",
+ "sktechy", "sketchy",
+ "skwyard", "skyward",
+ "slavage", "salvage",
+ "slayign", "slaying",
+ "sldiers", "sliders",
+ "slefies", "selfies",
+ "slighly", "slightly",
+ "slighty", "slightly",
+ "slippes", "slippers",
+ "slippey", "slippery",
+ "smaples", "samples",
+ "smartre", "smarter",
+ "smaurai", "samurai",
+ "snadler", "sandler",
+ "snigles", "singles",
+ "snippes", "snippets",
+ "snodwen", "snowden",
+ "snwoden", "snowden",
+ "snycing", "syncing",
+ "snyergy", "synergy",
+ "socialy", "socially",
+ "sofware", "software",
+ "soildly", "solidly",
+ "soldies", "soldiers",
+ "soldily", "solidly",
+ "somaila", "somalia",
+ "someons", "someones",
+ "somethn", "somethin",
+ "southen", "southern",
+ "soveits", "soviets",
+ "spacebr", "spacebar",
+ "spainsh", "spanish",
+ "spansih", "spanish",
+ "spanwed", "spawned",
+ "sparkel", "sparkle",
+ "spartas", "spartans",
+ "spartsn", "spartans",
+ "sparyed", "sprayed",
+ "spawend", "spawned",
+ "spawnig", "spawning",
+ "specail", "special",
+ "specfic", "specific",
+ "specias", "specials",
+ "specisl", "specials",
+ "spectum", "spectrum",
+ "speechs", "speeches",
+ "spehres", "spheres",
+ "speical", "special",
+ "speices", "species",
+ "spellig", "spelling",
+ "spindel", "spindle",
+ "spiritd", "spirited",
+ "splaton", "splatoon",
+ "splittr", "splitter",
+ "spoiles", "spoilers",
+ "spoitfy", "spotify",
+ "spolied", "spoiled",
+ "sponser", "sponsor",
+ "sporles", "sproles",
+ "sporuts", "sprouts",
+ "spotfiy", "spotify",
+ "sprinke", "sprinkle",
+ "sproels", "sproles",
+ "spwaned", "spawned",
+ "sqaures", "squares",
+ "sqeuaky", "squeaky",
+ "sqiushy", "squishy",
+ "squarey", "squarely",
+ "squirel", "squirtle",
+ "squirle", "squirrel",
+ "squirrl", "squirrel",
+ "squirte", "squirtle",
+ "squsihy", "squishy",
+ "sriraca", "sriracha",
+ "srpouts", "sprouts",
+ "sryians", "syrians",
+ "sryinge", "syringe",
+ "stadius", "stadiums",
+ "staduim", "stadium",
+ "stagnat", "stagnant",
+ "staidum", "stadium",
+ "stakler", "stalker",
+ "stalkes", "stalkers",
+ "stamnia", "stamina",
+ "staoshi", "satoshi",
+ "starins", "strains",
+ "startde", "startled",
+ "startus", "startups",
+ "statits", "statist",
+ "statsit", "statist",
+ "statuer", "stature",
+ "statuse", "statutes",
+ "statuts", "statutes",
+ "stautes", "statues",
+ "stealty", "stealthy",
+ "steeles", "steelers",
+ "steorid", "steroid",
+ "steriel", "sterile",
+ "sterlie", "sterile",
+ "stickes", "stickers",
+ "stiring", "stirring",
+ "stirker", "striker",
+ "stirrig", "stirring",
+ "stitchs", "stitches",
+ "stlaker", "stalker",
+ "stlyish", "stylish",
+ "storeis", "stories",
+ "storise", "stories",
+ "stormde", "stormed",
+ "straigt", "straight",
+ "straind", "strained",
+ "streamd", "streamed",
+ "stregth", "strength",
+ "strengh", "strength",
+ "streoid", "steroid",
+ "stresss", "stresses",
+ "strians", "strains",
+ "stricty", "strictly",
+ "striekr", "striker",
+ "stromed", "stormed",
+ "stubbon", "stubborn",
+ "studing", "studying",
+ "stuidos", "studios",
+ "stunami", "tsunami",
+ "stupidr", "stupider",
+ "stupidy", "stupidly",
+ "stupire", "stupider",
+ "suasage", "sausage",
+ "subisdy", "subsidy",
+ "subjest", "subjects",
+ "subtiel", "subtitle",
+ "succede", "succeed",
+ "succeds", "succeeds",
+ "succees", "succeeds",
+ "succesd", "succeeds",
+ "suceeds", "succeeds",
+ "suddeny", "suddenly",
+ "suefull", "usefull",
+ "sufferd", "suffered",
+ "summonr", "summoner",
+ "summore", "summoner",
+ "sunggle", "snuggle",
+ "sunifre", "sunfire",
+ "superme", "supreme",
+ "suposed", "supposed",
+ "suposes", "supposes",
+ "suppoed", "supposed",
+ "suppost", "supports",
+ "suprass", "surpass",
+ "supress", "suppress",
+ "suprisd", "suprised",
+ "suprise", "surprise",
+ "suprize", "surprise",
+ "supsend", "suspend",
+ "suround", "surround",
+ "surpeme", "supreme",
+ "surroud", "surround",
+ "sweidsh", "swedish",
+ "swiflty", "swiftly",
+ "swiming", "swimming",
+ "switchs", "switches",
+ "switfly", "swiftly",
+ "swnasea", "swansea",
+ "sycning", "syncing",
+ "sycther", "scyther",
+ "syirans", "syrians",
+ "sykward", "skyward",
+ "syllabe", "syllable",
+ "symetry", "symmetry",
+ "symmety", "symmetry",
+ "symobls", "symbols",
+ "sympaty", "sympathy",
+ "symtpom", "symptom",
+ "synegry", "synergy",
+ "synoynm", "synonym",
+ "sypmtom", "symptom",
+ "syracue", "syracuse",
+ "syrains", "syrians",
+ "sysadmn", "sysadmin",
+ "systemc", "systemic",
+ "sytlish", "stylish",
+ "tabacco", "tobacco",
+ "tailban", "taliban",
+ "tailord", "tailored",
+ "talbian", "taliban",
+ "tallets", "tallest",
+ "tangeld", "tangled",
+ "tanlged", "tangled",
+ "targetd", "targeted",
+ "taryvon", "trayvon",
+ "teached", "taught",
+ "teaspon", "teaspoon",
+ "techeis", "techies",
+ "tehcies", "techies",
+ "temepst", "tempest",
+ "tempels", "temples",
+ "tempets", "tempest",
+ "templas", "templars",
+ "tempset", "tempest",
+ "tenacle", "tentacle",
+ "tendacy", "tendency",
+ "tequlia", "tequila",
+ "tesitfy", "testify",
+ "testice", "testicle",
+ "teusday", "tuesday",
+ "thankyu", "thankyou",
+ "thearpy", "therapy",
+ "theistc", "theistic",
+ "theives", "thieves",
+ "themsef", "themself",
+ "therefo", "thereof",
+ "therien", "therein",
+ "theroem", "theorem",
+ "thesits", "theists",
+ "thiests", "theists",
+ "thirldy", "thirdly",
+ "thirten", "thirteen",
+ "thirtsy", "thirsty",
+ "thoerem", "theorem",
+ "thorats", "throats",
+ "thornes", "thrones",
+ "thoruim", "thorium",
+ "thoughs", "thoughts",
+ "threadd", "threaded",
+ "threeof", "thereof",
+ "thridly", "thirdly",
+ "thristy", "thirsty",
+ "throast", "throats",
+ "throium", "thorium",
+ "thryoid", "thyroid",
+ "thyorid", "thyroid",
+ "thyriod", "thyroid",
+ "tigther", "tighter",
+ "tiolets", "toilets",
+ "tirdent", "trident",
+ "titanim", "titanium",
+ "tlaking", "talking",
+ "tobbaco", "tobacco",
+ "toliets", "toilets",
+ "tolkein", "tolkien",
+ "tomatos", "tomatoes",
+ "tongiht", "tonight",
+ "tonuges", "tongues",
+ "toppins", "toppings",
+ "torando", "tornado",
+ "torndao", "tornado",
+ "torpdeo", "torpedo",
+ "torrest", "torrents",
+ "tortila", "tortilla",
+ "toruney", "tourney",
+ "toubles", "troubles",
+ "touchda", "touchpad",
+ "tounrey", "tourney",
+ "tourisy", "touristy",
+ "tourits", "tourist",
+ "tournes", "tourneys",
+ "toursim", "tourism",
+ "toursit", "tourist",
+ "towords", "towards",
+ "trackes", "trackers",
+ "trailes", "trailers",
+ "traines", "trainers",
+ "trainig", "training",
+ "tralier", "trailer",
+ "tratior", "traitor",
+ "traveld", "traveled",
+ "travere", "traverse",
+ "travesy", "travesty",
+ "travles", "travels",
+ "treasue", "treasure",
+ "treatis", "treaties",
+ "tremelo", "tremolo",
+ "trendig", "trending",
+ "trialer", "trailer",
+ "triange", "triangle",
+ "triator", "traitor",
+ "trickey", "trickery",
+ "tridnet", "trident",
+ "trimuph", "triumph",
+ "trinkes", "trinkets",
+ "trinkst", "trinkets",
+ "trintiy", "trinity",
+ "triolgy", "trilogy",
+ "troleld", "trolled",
+ "troling", "trolling",
+ "tronado", "tornado",
+ "tropedo", "torpedo",
+ "trudnle", "trundle",
+ "truimph", "triumph",
+ "trukish", "turkish",
+ "trundel", "trundle",
+ "trunlde", "trundle",
+ "tryahrd", "tryhard",
+ "tryavon", "trayvon",
+ "tsamina", "stamina",
+ "tsnuami", "tsunami",
+ "tsuanmi", "tsunami",
+ "tsunmai", "tsunami",
+ "tuesdsy", "tuesdays",
+ "tunnles", "tunnels",
+ "turbins", "turbines",
+ "turksih", "turkish",
+ "turltes", "turtles",
+ "turrest", "turrets",
+ "turtels", "turtles",
+ "tuseday", "tuesday",
+ "tusnami", "tsunami",
+ "tutrles", "turtles",
+ "twiligt", "twilight",
+ "tyelnol", "tylenol",
+ "typcial", "typical",
+ "tyrhard", "tryhard",
+ "tyrrany", "tyranny",
+ "udpated", "updated",
+ "uesfull", "usefull",
+ "ugprade", "upgrade",
+ "ukarine", "ukraine",
+ "ukranie", "ukraine",
+ "ukriane", "ukraine",
+ "ultimae", "ultimate",
+ "umbrela", "umbrella",
+ "unahppy", "unhappy",
+ "unbannd", "unbanned",
+ "underog", "undergo",
+ "unfairy", "unfairly",
+ "ungoldy", "ungodly",
+ "unicors", "unicorns",
+ "uniquey", "uniquely",
+ "unknwon", "unknown",
+ "unkonwn", "unknown",
+ "unlcean", "unclean",
+ "unlcoks", "unlocks",
+ "unlcuky", "unlucky",
+ "unlikey", "unlikely",
+ "unopend", "unopened",
+ "unprone", "unproven",
+ "unusabe", "unusable",
+ "unworty", "unworthy",
+ "upgarde", "upgrade",
+ "upgrads", "upgrades",
+ "uplaods", "uploads",
+ "upsteam", "upstream",
+ "urainum", "uranium",
+ "uranuim", "uranium",
+ "uretrha", "urethra",
+ "urkaine", "ukraine",
+ "urnaium", "uranium",
+ "urugauy", "uruguay",
+ "usefull", "useful",
+ "usefuly", "usefully",
+ "utiltiy", "utility",
+ "utopain", "utopian",
+ "utpoian", "utopian",
+ "vaccins", "vaccines",
+ "vaccume", "vacuum",
+ "vageuly", "vaguely",
+ "vaguley", "vaguely",
+ "vairant", "variant",
+ "valenca", "valencia",
+ "valetta", "valletta",
+ "valkyre", "valkyrie",
+ "valuabe", "valuable",
+ "valuble", "valuable",
+ "vampirs", "vampires",
+ "vanguad", "vanguard",
+ "varaint", "variant",
+ "vareity", "variety",
+ "varians", "variants",
+ "varient", "variant",
+ "varisty", "varsity",
+ "varitey", "variety",
+ "varstiy", "varsity",
+ "vasalls", "vassals",
+ "vasslas", "vassals",
+ "vaugely", "vaguely",
+ "vecotrs", "vectors",
+ "vectros", "vectors",
+ "veitnam", "vietnam",
+ "veiwers", "viewers",
+ "vendeta", "vendetta",
+ "verbaly", "verbally",
+ "verical", "vertical",
+ "verious", "various",
+ "verison", "version",
+ "veritgo", "vertigo",
+ "versoin", "version",
+ "vertgio", "vertigo",
+ "vessles", "vessels",
+ "vetween", "between",
+ "viatmin", "vitamin",
+ "vibratr", "vibrator",
+ "vicitms", "victims",
+ "vientam", "vietnam",
+ "vigrins", "virgins",
+ "vikigns", "vikings",
+ "villian", "villain",
+ "villify", "vilify",
+ "virbate", "vibrate",
+ "virigns", "virgins",
+ "virtiol", "vitriol",
+ "virutal", "virtual",
+ "virutes", "virtues",
+ "visable", "visible",
+ "visably", "visibly",
+ "visbily", "visibly",
+ "visting", "visiting",
+ "vistors", "visitors",
+ "vitaliy", "vitality",
+ "vitamis", "vitamins",
+ "vitenam", "vietnam",
+ "vitirol", "vitriol",
+ "vitmain", "vitamin",
+ "vitroil", "vitriol",
+ "vitrual", "virtual",
+ "vitrues", "virtues",
+ "volatge", "voltage",
+ "volumne", "volume",
+ "votlage", "voltage",
+ "vrigins", "virgins",
+ "waclott", "walcott",
+ "wacther", "watcher",
+ "waitres", "waiters",
+ "waktins", "watkins",
+ "warcrat", "warcraft",
+ "wardobe", "wardrobe",
+ "wariwck", "warwick",
+ "warrany", "warranty",
+ "warrent", "warrant",
+ "warrios", "warriors",
+ "warwcik", "warwick",
+ "wathcer", "watcher",
+ "watiers", "waiters",
+ "waviers", "waivers",
+ "wawrick", "warwick",
+ "wayword", "wayward",
+ "webapge", "webpage",
+ "webiste", "website",
+ "webstie", "website",
+ "weigths", "weights",
+ "weilded", "wielded",
+ "weirldy", "weirdly",
+ "weirods", "weirdos",
+ "welathy", "wealthy",
+ "wendsay", "wednesday",
+ "wensday", "wednesday",
+ "wepbage", "webpage",
+ "weridly", "weirdly",
+ "weridos", "weirdos",
+ "werstle", "wrestle",
+ "wesbite", "website",
+ "whaeton", "wheaton",
+ "whipser", "whisper",
+ "whislte", "whistle",
+ "whistel", "whistle",
+ "whitsle", "whistle",
+ "whsiper", "whisper",
+ "wiaters", "waiters",
+ "wiavers", "waivers",
+ "widgest", "widgets",
+ "wieghts", "weights",
+ "wigdets", "widgets",
+ "windosr", "windsor",
+ "winnins", "winnings",
+ "winsdor", "windsor",
+ "wintson", "winston",
+ "wirting", "writing",
+ "wisnton", "winston",
+ "withces", "witches",
+ "witheld", "withheld",
+ "withing", "within",
+ "withold", "withhold",
+ "wlacott", "walcott",
+ "wokring", "working",
+ "workins", "workings",
+ "woudlnt", "wouldnt",
+ "woudlve", "wouldve",
+ "woulndt", "wouldnt",
+ "wreslte", "wrestle",
+ "wroking", "working",
+ "wtiches", "witches",
+ "wupport", "support",
+ "yaching", "yachting",
+ "younget", "youngest",
+ "youseff", "yousef",
+ "youself", "yourself",
+ "zaelots", "zealots",
+ "zealtos", "zealots",
+ "zelaots", "zealots",
+ "zelaous", "zealous",
+ "zimbabe", "zimbabwe",
+ "zionsim", "zionism",
+ "zionsit", "zionist",
+ "zoinism", "zionism",
+ "zoinist", "zionist",
+ "abbout", "about",
+ "abilty", "ability",
+ "absail", "abseil",
+ "abutts", "abuts",
+ "achive", "achieve",
+ "acused", "accused",
+ "addopt", "adopt",
+ "addres", "address",
+ "adress", "address",
+ "aeriel", "aerial",
+ "affort", "afford",
+ "agains", "against",
+ "aginst", "against",
+ "ahppen", "happen",
+ "aiport", "airport",
+ "aisian", "asian",
+ "albiet", "albeit",
+ "alchol", "alcohol",
+ "aledge", "allege",
+ "aleged", "alleged",
+ "allign", "align",
+ "almsot", "almost",
+ "alomst", "almost",
+ "alowed", "allowed",
+ "alwasy", "always",
+ "alwyas", "always",
+ "amking", "making",
+ "ammend", "amend",
+ "amoung", "among",
+ "aplied", "applied",
+ "appart", "apart",
+ "aquire", "acquire",
+ "aready", "already",
+ "arised", "arose",
+ "arival", "arrival",
+ "arrary", "array",
+ "artice", "article",
+ "asetic", "ascetic",
+ "asside", "aside",
+ "attemp", "attempt",
+ "attemt", "attempt",
+ "auther", "author",
+ "awared", "awarded",
+ "bedore", "before",
+ "beeing", "being",
+ "befoer", "before",
+ "beggin", "begin",
+ "beleif", "belief",
+ "belive", "believe",
+ "beteen", "between",
+ "betwen", "between",
+ "beween", "between",
+ "bianry", "binary",
+ "boyant", "buoyant",
+ "broady", "broadly",
+ "buddah", "buddha",
+ "buring", "burying",
+ "carcas", "carcass",
+ "casion", "caisson",
+ "casued", "caused",
+ "casues", "causes",
+ "ceasar", "caesar",
+ "cencus", "census",
+ "censur", "censor",
+ "cheifs", "chiefs",
+ "circut", "circuit",
+ "clasic", "classic",
+ "coform", "conform",
+ "comany", "company",
+ "coucil", "council",
+ "curent", "current",
+ "densly", "densely",
+ "deside", "decide",
+ "devels", "delves",
+ "devide", "divide",
+ "dieing", "dying",
+ "divice", "device",
+ "doulbe", "double",
+ "dreasm", "dreams",
+ "duting", "during",
+ "ealier", "earlier",
+ "eearly", "early",
+ "efford", "effort",
+ "emited", "emitted",
+ "emnity", "enmity",
+ "enduce", "induce",
+ "enlish", "english",
+ "erally", "orally",
+ "eratic", "erratic",
+ "ethose", "those",
+ "exampt", "exempt",
+ "excact", "exact",
+ "excell", "excel",
+ "exerpt", "excerpt",
+ "exinct", "extinct",
+ "expell", "expel",
+ "expoch", "epoch",
+ "extint", "extinct",
+ "facist", "fascist",
+ "faught", "fought",
+ "finaly", "finally",
+ "forsaw", "foresaw",
+ "fougth", "fought",
+ "fourty", "forty",
+ "foward", "forward",
+ "freind", "friend",
+ "fromed", "formed",
+ "fufill", "fulfill",
+ "futher", "further",
+ "gardai", "gardaí",
+ "geting", "getting",
+ "ghandi", "gandhi",
+ "glight", "flight",
+ "gloabl", "global",
+ "godess", "goddess",
+ "guilia", "giulia",
+ "guilio", "giulio",
+ "habeus", "habeas",
+ "harras", "harass",
+ "hatian", "haitian",
+ "heared", "heard",
+ "hertzs", "hertz",
+ "hieght", "height",
+ "higest", "highest",
+ "higway", "highway",
+ "honory", "honorary",
+ "howver", "however",
+ "hstory", "history",
+ "hunman", "human",
+ "husban", "husband",
+ "hvaing", "having",
+ "illess", "illness",
+ "ilness", "illness",
+ "imagin", "imagine",
+ "imense", "immense",
+ "includ", "include",
+ "inital", "initial",
+ "interm", "interim",
+ "intial", "initial",
+ "invlid", "invalid",
+ "iunior", "junior",
+ "jaques", "jacques",
+ "jospeh", "joseph",
+ "jouney", "journey",
+ "klenex", "kleenex",
+ "labled", "labelled",
+ "largst", "largest",
+ "larrry", "larry",
+ "lefted", "left",
+ "lenght", "length",
+ "lerans", "learns",
+ "liason", "liaison",
+ "libary", "library",
+ "lieing", "lying",
+ "lieved", "lived",
+ "littel", "little",
+ "livley", "lively",
+ "lonley", "lonely",
+ "mailny", "mainly",
+ "markes", "marks",
+ "mileau", "milieu",
+ "milion", "million",
+ "millon", "million",
+ "misile", "missile",
+ "missen", "mizzen",
+ "missle", "missile",
+ "mkaing", "making",
+ "moderm", "modem",
+ "moreso", "more",
+ "mounth", "month",
+ "myraid", "myriad",
+ "naieve", "naive",
+ "nestin", "nesting",
+ "nineth", "ninth",
+ "noveau", "nouveau",
+ "occour", "occur",
+ "occurr", "occur",
+ "offred", "offered",
+ "omited", "omitted",
+ "ouevre", "oeuvre",
+ "oxigen", "oxygen",
+ "p0enis", "penis",
+ "packge", "package",
+ "peaple", "people",
+ "pensle", "pencil",
+ "peopel", "people",
+ "peotry", "poetry",
+ "perade", "parade",
+ "persan", "person",
+ "persue", "pursue",
+ "plateu", "plateau",
+ "poenis", "penis",
+ "poisin", "poison",
+ "polute", "pollute",
+ "posess", "possess",
+ "posion", "poison",
+ "prairy", "prairie",
+ "prarie", "prairie",
+ "preiod", "period",
+ "privte", "private",
+ "proces", "process",
+ "proove", "prove",
+ "psuedo", "pseudo",
+ "psyhic", "psychic",
+ "pucini", "puccini",
+ "pumkin", "pumpkin",
+ "puting", "putting",
+ "pyscic", "psychic",
+ "quizes", "quizzes",
+ "quuery", "query",
+ "racaus", "raucous",
+ "radify", "ratify",
+ "raelly", "really",
+ "reacll", "recall",
+ "realyl", "really",
+ "reched", "reached",
+ "recide", "reside",
+ "recrod", "record",
+ "refect", "reflect",
+ "relaly", "really",
+ "renewl", "renewal",
+ "retuns", "returns",
+ "reveiw", "review",
+ "rhymme", "rhyme",
+ "rigeur", "rigueur",
+ "rocord", "record",
+ "rougly", "roughly",
+ "runing", "running",
+ "rythem", "rhythm",
+ "rythim", "rhythm",
+ "saftey", "safety",
+ "salery", "salary",
+ "satisy", "satisfy",
+ "satric", "satiric",
+ "saught", "sought",
+ "scince", "science",
+ "scirpt", "script",
+ "seceed", "succeed",
+ "seinor", "senior",
+ "sepina", "subpoena",
+ "sevice", "service",
+ "shamen", "shaman",
+ "sheild", "shield",
+ "shiped", "shipped",
+ "shorly", "shortly",
+ "shoudl", "should",
+ "shreak", "shriek",
+ "siezed", "seized",
+ "sixtin", "sistine",
+ "skiped", "skipped",
+ "sneeks", "sneaks",
+ "somene", "someone",
+ "soruce", "source",
+ "soudns", "sounds",
+ "sourth", "south",
+ "speach", "speech",
+ "spects", "aspects",
+ "spoace", "space",
+ "sqaure", "square",
+ "staion", "station",
+ "stange", "strange",
+ "stilus", "stylus",
+ "stirrs", "stirs",
+ "stopry", "story",
+ "strnad", "strand",
+ "studdy", "study",
+ "suceed", "succeed",
+ "sucess", "success",
+ "sucide", "suicide",
+ "sumary", "summary",
+ "suport", "support",
+ "supose", "suppose",
+ "surfce", "surface",
+ "surley", "surly",
+ "swaers", "swears",
+ "swepth", "swept",
+ "talekd", "talked",
+ "theese", "these",
+ "therby", "thereby",
+ "thigns", "things",
+ "thigsn", "things",
+ "thikns", "thinks",
+ "thiunk", "think",
+ "thnigs", "things",
+ "threee", "three",
+ "tkaing", "taking",
+ "tounge", "tongue",
+ "tourch", "torch",
+ "towrad", "toward",
+ "trafic", "traffic",
+ "troups", "troupes",
+ "truely", "truly",
+ "twelth", "twelfth",
+ "tyrany", "tyranny",
+ "unabel", "unable",
+ "unkown", "unknown",
+ "unmont", "unmount",
+ "unmout", "unmount",
+ "untill", "until",
+ "usally", "usually",
+ "useage", "usage",
+ "useing", "using",
+ "usualy", "usually",
+ "vaccum", "vacuum",
+ "variey", "variety",
+ "varing", "varying",
+ "varity", "variety",
+ "vasall", "vassal",
+ "vigeur", "vigueur",
+ "villin", "villain",
+ "vreity", "variety",
+ "vriety", "variety",
+ "whants", "wants",
+ "wheras", "whereas",
+ "wheter", "whether",
+ "wholey", "wholly",
+ "whther", "whether",
+ "wnated", "wanted",
+ "writen", "written",
+ "yaerly", "yearly",
+ "yotube", "youtube",
+ "zeebra", "zebra",
+ "abotu", "about",
+ "adres", "address",
+ "afair", "affair",
+ "agian", "again",
+ "agina", "again",
+ "agred", "agreed",
+ "alege", "allege",
+ "alsot", "also",
+ "altho", "although",
+ "amung", "among",
+ "anual", "annual",
+ "aroud", "around",
+ "arund", "around",
+ "asign", "assign",
+ "assit", "assist",
+ "asume", "assume",
+ "atain", "attain",
+ "autor", "author",
+ "baout", "about",
+ "blaim", "blame",
+ "boaut", "bout",
+ "boook", "book",
+ "borke", "broke",
+ "breif", "brief",
+ "caost", "coast",
+ "casue", "cause",
+ "chasr", "chaser",
+ "cheif", "chief",
+ "chuch", "church",
+ "claer", "clear",
+ "clera", "clear",
+ "coudl", "could",
+ "crowm", "crown",
+ "deram", "dram",
+ "diety", "deity",
+ "doens", "does",
+ "doign", "doing",
+ "donig", "doing",
+ "drnik", "drink",
+ "durig", "during",
+ "earnt", "earned",
+ "eigth", "eighth",
+ "eiter", "either",
+ "emtpy", "empty",
+ "endig", "ending",
+ "eveyr", "every",
+ "exept", "except",
+ "eyars", "years",
+ "eyasr", "years",
+ "fiels", "fields",
+ "firts", "flirts",
+ "fleed", "fled",
+ "fomed", "formed",
+ "foucs", "focus",
+ "foudn", "found",
+ "fouth", "fourth",
+ "frome", "from",
+ "ganes", "games",
+ "gaurd", "guard",
+ "gerat", "great",
+ "gogin", "going",
+ "goign", "going",
+ "gonig", "going",
+ "graet", "great",
+ "greif", "grief",
+ "gropu", "group",
+ "guage", "gauge",
+ "hapen", "happen",
+ "herad", "heard",
+ "heroe", "hero",
+ "higer", "higher",
+ "housr", "hours",
+ "htere", "there",
+ "htikn", "think",
+ "hting", "thing",
+ "htink", "think",
+ "hwihc", "which",
+ "hwile", "while",
+ "hwole", "whole",
+ "idaes", "ideas",
+ "idesa", "ideas",
+ "ihaca", "ithaca",
+ "knwos", "knows",
+ "konws", "knows",
+ "lastr", "last",
+ "lavae", "larvae",
+ "layed", "laid",
+ "leage", "league",
+ "leanr", "lean",
+ "leran", "learn",
+ "levle", "level",
+ "lible", "libel",
+ "liekd", "liked",
+ "liuke", "like",
+ "lmits", "limits",
+ "lonly", "lonely",
+ "lukid", "likud",
+ "lybia", "libya",
+ "maked", "marked",
+ "makse", "makes",
+ "mamal", "mammal",
+ "mileu", "milieu",
+ "mkaes", "makes",
+ "modle", "model",
+ "moent", "moment",
+ "moeny", "money",
+ "monts", "months",
+ "movei", "movie",
+ "muder", "murder",
+ "mysef", "myself",
+ "neice", "niece",
+ "ninty", "ninety",
+ "ocurr", "occur",
+ "oging", "going",
+ "opose", "oppose",
+ "orded", "ordered",
+ "orgin", "origin",
+ "otehr", "other",
+ "ouput", "output",
+ "owudl", "would",
+ "paide", "paid",
+ "palce", "place",
+ "pased", "passed",
+ "payed", "paid",
+ "peice", "piece",
+ "peoms", "poems",
+ "poety", "poetry",
+ "pwoer", "power",
+ "qtuie", "quite",
+ "qutie", "quite",
+ "realy", "really",
+ "repid", "rapid",
+ "rised", "raised",
+ "rulle", "rule",
+ "rwite", "write",
+ "rythm", "rhythm",
+ "safty", "safety",
+ "scoll", "scroll",
+ "seach", "search",
+ "seige", "siege",
+ "seing", "seeing",
+ "sence", "sense",
+ "sicne", "since",
+ "sieze", "seize",
+ "sinse", "sines",
+ "slowy", "slowly",
+ "snese", "sneeze",
+ "soley", "solely",
+ "sotry", "story",
+ "sotyr", "satyr",
+ "soudn", "sound",
+ "sould", "could",
+ "spred", "spread",
+ "stlye", "style",
+ "stong", "strong",
+ "stoyr", "story",
+ "strat", "start",
+ "stroy", "story",
+ "suppy", "supply",
+ "swaer", "swear",
+ "syrap", "syrup",
+ "sytem", "system",
+ "sytle", "style",
+ "tatoo", "tattoo",
+ "thast", "that",
+ "theif", "thief",
+ "theri", "their",
+ "thgat", "that",
+ "thier", "their",
+ "thign", "thing",
+ "thikn", "think",
+ "thnig", "thing",
+ "thrid", "third",
+ "thsoe", "those",
+ "thyat", "that",
+ "tihkn", "think",
+ "timne", "time",
+ "tiome", "time",
+ "tkaes", "takes",
+ "todya", "today",
+ "tyhat", "that",
+ "unsed", "used",
+ "weild", "wield",
+ "whant", "want",
+ "whcih", "which",
+ "whihc", "which",
+ "whith", "with",
+ "whlch", "which",
+ "wholy", "wholly",
+ "wierd", "weird",
+ "wille", "will",
+ "willk", "will",
+ "withh", "with",
+ "witht", "with",
+ "wiull", "will",
+ "wnats", "wants",
+ "wohle", "whole",
+ "worls", "world",
+ "woudl", "would",
+ "wriet", "write",
+ "wroet", "wrote",
+ "yaers", "years",
+ "yatch", "yacht",
+ "yearm", "year",
+ "yeasr", "years",
+ "yeild", "yield",
+ "yeras", "years",
+ "yersa", "years",
+ "agin", "again",
+ "agre", "agree",
+ "ahev", "have",
+ "ahve", "have",
+ "alse", "else",
+ "amke", "make",
+ "anbd", "and",
+ "andd", "and",
+ "apon", "upon",
+ "aslo", "also",
+ "awya", "away",
+ "bakc", "back",
+ "bcak", "back",
+ "clas", "class",
+ "cpoy", "coy",
+ "cxan", "cyan",
+ "daed", "dead",
+ "dael", "deal",
+ "diea", "idea",
+ "doub", "doubt",
+ "dyas", "dryas",
+ "eahc", "each",
+ "efel", "evil",
+ "eles", "eels",
+ "ened", "need",
+ "enxt", "next",
+ "esle", "else",
+ "eyar", "year",
+ "fatc", "fact",
+ "fidn", "find",
+ "fomr", "from",
+ "grwo", "grow",
+ "haev", "have",
+ "halp", "help",
+ "holf", "hold",
+ "hten", "then",
+ "htey", "they",
+ "htis", "this",
+ "hvae", "have",
+ "hvea", "have",
+ "inot", "into",
+ "iwll", "will",
+ "iwth", "with",
+ "jstu", "just",
+ "jsut", "just",
+ "knwo", "know",
+ "konw", "know",
+ "kwno", "know",
+ "liek", "like",
+ "loev", "love",
+ "lveo", "love",
+ "lvoe", "love",
+ "mkae", "make",
+ "mkea", "make",
+ "mroe", "more",
+ "nkow", "know",
+ "nkwo", "know",
+ "nmae", "name",
+ "noth", "north",
+ "nowe", "now",
+ "omre", "more",
+ "onot", "note",
+ "onyl", "only",
+ "owrk", "work",
+ "peom", "poem",
+ "pich", "pitch",
+ "rela", "real",
+ "sasy", "says",
+ "smae", "same",
+ "smoe", "some",
+ "soem", "some",
+ "sohw", "show",
+ "stpo", "stop",
+ "suop", "soup",
+ "syas", "says",
+ "tahn", "than",
+ "taht", "that",
+ "tast", "taste",
+ "tath", "that",
+ "tehy", "they",
+ "tghe", "the",
+ "ther", "there",
+ "thge", "the",
+ "thna", "than",
+ "thne", "then",
+ "thsi", "this",
+ "thta", "that",
+ "tiem", "time",
+ "tihs", "this",
+ "tjhe", "the",
+ "tkae", "take",
+ "tood", "todo",
+ "tust", "trust",
+ "twon", "town",
+ "twpo", "two",
+ "tyhe", "they",
+ "uise", "use",
+ "vell", "well",
+ "veyr", "very",
+ "vrey", "very",
+ "vyer", "very",
+ "vyre", "very",
+ "waht", "what",
+ "wass", "was",
+ "watn", "want",
+ "weas", "was",
+ "wehn", "when",
+ "whic", "which",
+ "whta", "what",
+ "wich", "which",
+ "wief", "wife",
+ "wiew", "view",
+ "wiht", "with",
+ "witn", "with",
+ "wnat", "want",
+ "wokr", "work",
+ "wrok", "work",
+ "wtih", "with",
+ "yaer", "year",
+ "yera", "year",
+ "yrea", "year",
+ "ytou", "you",
+ "adn", "and",
+ "ect", "etc",
+ "nto", "not",
+ "teh", "the",
+ "thn", "then",
+ "tje", "the",
+ "whn", "when",
+ "wih", "with",
+ "yuo", "you",
+}
+
+// DictAmerican converts UK spellings to US spellings
+var DictAmerican = []string{
+ "institutionalisation", "institutionalization",
+ "internationalisation", "internationalization",
+ "professionalisation", "professionalization",
+ "compartmentalising", "compartmentalizing",
+ "institutionalising", "institutionalizing",
+ "internationalising", "internationalizing",
+ "compartmentalised", "compartmentalized",
+ "compartmentalises", "compartmentalizes",
+ "decriminalisation", "decriminalization",
+ "denationalisation", "denationalization",
+ "fictionalisations", "fictionalizations",
+ "institutionalised", "institutionalized",
+ "institutionalises", "institutionalizes",
+ "intellectualising", "intellectualizing",
+ "internationalised", "internationalized",
+ "internationalises", "internationalizes",
+ "pedestrianisation", "pedestrianization",
+ "professionalising", "professionalizing",
+ "archaeologically", "archeologically",
+ "compartmentalise", "compartmentalize",
+ "decentralisation", "decentralization",
+ "demilitarisation", "demilitarization",
+ "externalisations", "externalizations",
+ "fictionalisation", "fictionalization",
+ "institutionalise", "institutionalize",
+ "intellectualised", "intellectualized",
+ "intellectualises", "intellectualizes",
+ "internationalise", "internationalize",
+ "nationalisations", "nationalizations",
+ "palaeontologists", "paleontologists",
+ "professionalised", "professionalized",
+ "professionalises", "professionalizes",
+ "rationalisations", "rationalizations",
+ "sensationalising", "sensationalizing",
+ "sentimentalising", "sentimentalizing",
+ "acclimatisation", "acclimatization",
+ "bougainvillaeas", "bougainvilleas",
+ "commercialising", "commercializing",
+ "conceptualising", "conceptualizing",
+ "contextualising", "contextualizing",
+ "crystallisation", "crystallization",
+ "decriminalising", "decriminalizing",
+ "democratisation", "democratization",
+ "denationalising", "denationalizing",
+ "depersonalising", "depersonalizing",
+ "desensitisation", "desensitization",
+ "destabilisation", "destabilization",
+ "disorganisation", "disorganization",
+ "extemporisation", "extemporization",
+ "externalisation", "externalization",
+ "familiarisation", "familiarization",
+ "generalisations", "generalizations",
+ "hospitalisation", "hospitalization",
+ "individualising", "individualizing",
+ "industrialising", "industrializing",
+ "intellectualise", "intellectualize",
+ "internalisation", "internalization",
+ "manoeuvrability", "maneuverability",
+ "marginalisation", "marginalization",
+ "materialisation", "materialization",
+ "miniaturisation", "miniaturization",
+ "nationalisation", "nationalization",
+ "neighbourliness", "neighborliness",
+ "overemphasising", "overemphasizing",
+ "palaeontologist", "paleontologist",
+ "particularising", "particularizing",
+ "pedestrianising", "pedestrianizing",
+ "professionalise", "professionalize",
+ "psychoanalysing", "psychoanalyzing",
+ "rationalisation", "rationalization",
+ "reorganisations", "reorganizations",
+ "revolutionising", "revolutionizing",
+ "sensationalised", "sensationalized",
+ "sensationalises", "sensationalizes",
+ "sentimentalised", "sentimentalized",
+ "sentimentalises", "sentimentalizes",
+ "specialisations", "specializations",
+ "standardisation", "standardization",
+ "synchronisation", "synchronization",
+ "systematisation", "systematization",
+ "aggrandisement", "aggrandizement",
+ "anaesthetising", "anesthetizing",
+ "archaeological", "archeological",
+ "archaeologists", "archeologists",
+ "bougainvillaea", "bougainvillea",
+ "characterising", "characterizing",
+ "collectivising", "collectivizing",
+ "commercialised", "commercialized",
+ "commercialises", "commercializes",
+ "conceptualised", "conceptualized",
+ "conceptualises", "conceptualizes",
+ "contextualised", "contextualized",
+ "contextualises", "contextualizes",
+ "decentralising", "decentralizing",
+ "decriminalised", "decriminalized",
+ "decriminalises", "decriminalizes",
+ "dehumanisation", "dehumanization",
+ "demilitarising", "demilitarizing",
+ "demobilisation", "demobilization",
+ "demoralisation", "demoralization",
+ "denationalised", "denationalized",
+ "denationalises", "denationalizes",
+ "depersonalised", "depersonalized",
+ "depersonalises", "depersonalizes",
+ "disembowelling", "disemboweling",
+ "dramatisations", "dramatizations",
+ "editorialising", "editorializing",
+ "encyclopaedias", "encyclopedias",
+ "fictionalising", "fictionalizing",
+ "fraternisation", "fraternization",
+ "generalisation", "generalization",
+ "gynaecological", "gynecological",
+ "gynaecologists", "gynecologists",
+ "haematological", "hematological",
+ "haematologists", "hematologists",
+ "immobilisation", "immobilization",
+ "individualised", "individualized",
+ "individualises", "individualizes",
+ "industrialised", "industrialized",
+ "industrialises", "industrializes",
+ "liberalisation", "liberalization",
+ "monopolisation", "monopolization",
+ "naturalisation", "naturalization",
+ "neighbourhoods", "neighborhoods",
+ "neutralisation", "neutralization",
+ "organisational", "organizational",
+ "outmanoeuvring", "outmaneuvering",
+ "overemphasised", "overemphasized",
+ "overemphasises", "overemphasizes",
+ "paediatricians", "pediatricians",
+ "particularised", "particularized",
+ "particularises", "particularizes",
+ "pasteurisation", "pasteurization",
+ "pedestrianised", "pedestrianized",
+ "pedestrianises", "pedestrianizes",
+ "philosophising", "philosophizing",
+ "politicisation", "politicization",
+ "popularisation", "popularization",
+ "pressurisation", "pressurization",
+ "prioritisation", "prioritization",
+ "privatisations", "privatizations",
+ "propagandising", "propagandizing",
+ "psychoanalysed", "psychoanalyzed",
+ "psychoanalyses", "psychoanalyzes",
+ "regularisation", "regularization",
+ "reorganisation", "reorganization",
+ "revolutionised", "revolutionized",
+ "revolutionises", "revolutionizes",
+ "secularisation", "secularization",
+ "sensationalise", "sensationalize",
+ "sentimentalise", "sentimentalize",
+ "serialisations", "serializations",
+ "specialisation", "specialization",
+ "sterilisations", "sterilizations",
+ "stigmatisation", "stigmatization",
+ "transistorised", "transistorized",
+ "unrecognisable", "unrecognizable",
+ "visualisations", "visualizations",
+ "westernisation", "westernization",
+ "accessorising", "accessorizing",
+ "acclimatising", "acclimatizing",
+ "amortisations", "amortizations",
+ "amphitheatres", "amphitheaters",
+ "anaesthetised", "anesthetized",
+ "anaesthetises", "anesthetizes",
+ "anaesthetists", "anesthetists",
+ "archaeologist", "archeologist",
+ "backpedalling", "backpedaling",
+ "behaviourists", "behaviorists",
+ "breathalysers", "breathalyzers",
+ "breathalysing", "breathalyzing",
+ "callisthenics", "calisthenics",
+ "cannibalising", "cannibalizing",
+ "characterised", "characterized",
+ "characterises", "characterizes",
+ "circularising", "circularizing",
+ "clarinettists", "clarinetists",
+ "collectivised", "collectivized",
+ "collectivises", "collectivizes",
+ "commercialise", "commercialize",
+ "computerising", "computerizing",
+ "conceptualise", "conceptualize",
+ "contextualise", "contextualize",
+ "criminalising", "criminalizing",
+ "crystallising", "crystallizing",
+ "decentralised", "decentralized",
+ "decentralises", "decentralizes",
+ "decriminalise", "decriminalize",
+ "demilitarised", "demilitarized",
+ "demilitarises", "demilitarizes",
+ "democratising", "democratizing",
+ "denationalise", "denationalize",
+ "depersonalise", "depersonalize",
+ "desensitising", "desensitizing",
+ "destabilising", "destabilizing",
+ "disembowelled", "disemboweled",
+ "dishonourable", "dishonorable",
+ "dishonourably", "dishonorably",
+ "dramatisation", "dramatization",
+ "editorialised", "editorialized",
+ "editorialises", "editorializes",
+ "encyclopaedia", "encyclopedia",
+ "encyclopaedic", "encyclopedic",
+ "extemporising", "extemporizing",
+ "externalising", "externalizing",
+ "familiarising", "familiarizing",
+ "fertilisation", "fertilization",
+ "fictionalised", "fictionalized",
+ "fictionalises", "fictionalizes",
+ "formalisation", "formalization",
+ "fossilisation", "fossilization",
+ "globalisation", "globalization",
+ "gynaecologist", "gynecologist",
+ "haematologist", "hematologist",
+ "haemophiliacs", "hemophiliacs",
+ "haemorrhaging", "hemorrhaging",
+ "harmonisation", "harmonization",
+ "hospitalising", "hospitalizing",
+ "hypothesising", "hypothesizing",
+ "immortalising", "immortalizing",
+ "individualise", "individualize",
+ "industrialise", "industrialize",
+ "internalising", "internalizing",
+ "marginalising", "marginalizing",
+ "materialising", "materializing",
+ "mechanisation", "mechanization",
+ "memorialising", "memorializing",
+ "miniaturising", "miniaturizing",
+ "miscatalogued", "miscataloged",
+ "misdemeanours", "misdemeanors",
+ "multicoloured", "multicolored",
+ "nationalising", "nationalizing",
+ "neighbourhood", "neighborhood",
+ "normalisation", "normalization",
+ "organisations", "organizations",
+ "outmanoeuvred", "outmaneuvered",
+ "outmanoeuvres", "outmaneuvers",
+ "overemphasise", "overemphasize",
+ "paediatrician", "pediatrician",
+ "palaeontology", "paleontology",
+ "particularise", "particularize",
+ "passivisation", "passivization",
+ "patronisingly", "patronizingly",
+ "pedestrianise", "pedestrianize",
+ "personalising", "personalizing",
+ "philosophised", "philosophized",
+ "philosophises", "philosophizes",
+ "privatisation", "privatization",
+ "propagandised", "propagandized",
+ "propagandises", "propagandizes",
+ "proselytisers", "proselytizers",
+ "proselytising", "proselytizing",
+ "psychoanalyse", "psychoanalyze",
+ "pulverisation", "pulverization",
+ "rationalising", "rationalizing",
+ "reconnoitring", "reconnoitering",
+ "revolutionise", "revolutionize",
+ "romanticising", "romanticizing",
+ "serialisation", "serialization",
+ "socialisation", "socialization",
+ "stabilisation", "stabilization",
+ "standardising", "standardizing",
+ "sterilisation", "sterilization",
+ "subsidisation", "subsidization",
+ "synchronising", "synchronizing",
+ "systematising", "systematizing",
+ "tantalisingly", "tantalizingly",
+ "underutilised", "underutilized",
+ "victimisation", "victimization",
+ "visualisation", "visualization",
+ "vocalisations", "vocalizations",
+ "vulgarisation", "vulgarization",
+ "accessorised", "accessorized",
+ "accessorises", "accessorizes",
+ "acclimatised", "acclimatized",
+ "acclimatises", "acclimatizes",
+ "amortisation", "amortization",
+ "amphitheatre", "amphitheater",
+ "anaesthetics", "anesthetics",
+ "anaesthetise", "anesthetize",
+ "anaesthetist", "anesthetist",
+ "antagonising", "antagonizing",
+ "appetisingly", "appetizingly",
+ "backpedalled", "backpedaled",
+ "bastardising", "bastardizing",
+ "behaviourism", "behaviorism",
+ "behaviourist", "behaviorist",
+ "bowdlerising", "bowdlerizing",
+ "breathalysed", "breathalyzed",
+ "breathalyser", "breathalyzer",
+ "breathalyses", "breathalyzes",
+ "cannibalised", "cannibalized",
+ "cannibalises", "cannibalizes",
+ "capitalising", "capitalizing",
+ "caramelising", "caramelizing",
+ "categorising", "categorizing",
+ "centigrammes", "centigrams",
+ "centralising", "centralizing",
+ "centrepieces", "centerpieces",
+ "characterise", "characterize",
+ "circularised", "circularized",
+ "circularises", "circularizes",
+ "clarinettist", "clarinetist",
+ "collectivise", "collectivize",
+ "colonisation", "colonization",
+ "computerised", "computerized",
+ "computerises", "computerizes",
+ "criminalised", "criminalized",
+ "criminalises", "criminalizes",
+ "crystallised", "crystallized",
+ "crystallises", "crystallizes",
+ "decentralise", "decentralize",
+ "dehumanising", "dehumanizing",
+ "demilitarise", "demilitarize",
+ "demobilising", "demobilizing",
+ "democratised", "democratized",
+ "democratises", "democratizes",
+ "demoralising", "demoralizing",
+ "desensitised", "desensitized",
+ "desensitises", "desensitizes",
+ "destabilised", "destabilized",
+ "destabilises", "destabilizes",
+ "discolouring", "discoloring",
+ "dishonouring", "dishonoring",
+ "disorganised", "disorganized",
+ "editorialise", "editorialize",
+ "endeavouring", "endeavoring",
+ "equalisation", "equalization",
+ "evangelising", "evangelizing",
+ "extemporised", "extemporized",
+ "extemporises", "extemporizes",
+ "externalised", "externalized",
+ "externalises", "externalizes",
+ "familiarised", "familiarized",
+ "familiarises", "familiarizes",
+ "fictionalise", "fictionalize",
+ "finalisation", "finalization",
+ "fraternising", "fraternizing",
+ "generalising", "generalizing",
+ "haemophiliac", "hemophiliac",
+ "haemorrhaged", "hemorrhaged",
+ "haemorrhages", "hemorrhages",
+ "haemorrhoids", "hemorrhoids",
+ "homoeopathic", "homeopathic",
+ "homogenising", "homogenizing",
+ "hospitalised", "hospitalized",
+ "hospitalises", "hospitalizes",
+ "hypothesised", "hypothesized",
+ "hypothesises", "hypothesizes",
+ "idealisation", "idealization",
+ "immobilisers", "immobilizers",
+ "immobilising", "immobilizing",
+ "immortalised", "immortalized",
+ "immortalises", "immortalizes",
+ "immunisation", "immunization",
+ "initialising", "initializing",
+ "internalised", "internalized",
+ "internalises", "internalizes",
+ "jeopardising", "jeopardizing",
+ "legalisation", "legalization",
+ "legitimising", "legitimizing",
+ "liberalising", "liberalizing",
+ "manoeuvrable", "maneuverable",
+ "manoeuvrings", "maneuverings",
+ "marginalised", "marginalized",
+ "marginalises", "marginalizes",
+ "marvellously", "marvelously",
+ "materialised", "materialized",
+ "materialises", "materializes",
+ "maximisation", "maximization",
+ "memorialised", "memorialized",
+ "memorialises", "memorializes",
+ "metabolising", "metabolizing",
+ "militarising", "militarizing",
+ "milligrammes", "milligrams",
+ "miniaturised", "miniaturized",
+ "miniaturises", "miniaturizes",
+ "misbehaviour", "misbehavior",
+ "misdemeanour", "misdemeanor",
+ "mobilisation", "mobilization",
+ "moisturisers", "moisturizers",
+ "moisturising", "moisturizing",
+ "monopolising", "monopolizing",
+ "moustachioed", "mustachioed",
+ "nationalised", "nationalized",
+ "nationalises", "nationalizes",
+ "naturalising", "naturalizing",
+ "neighbouring", "neighboring",
+ "neutralising", "neutralizing",
+ "oesophaguses", "esophaguses",
+ "organisation", "organization",
+ "orthopaedics", "orthopedics",
+ "outmanoeuvre", "outmaneuver",
+ "palaeolithic", "paleolithic",
+ "pasteurising", "pasteurizing",
+ "personalised", "personalized",
+ "personalises", "personalizes",
+ "philosophise", "philosophize",
+ "plagiarising", "plagiarizing",
+ "ploughshares", "plowshares",
+ "polarisation", "polarization",
+ "politicising", "politicizing",
+ "popularising", "popularizing",
+ "pressurising", "pressurizing",
+ "prioritising", "prioritizing",
+ "propagandise", "propagandize",
+ "proselytised", "proselytized",
+ "proselytiser", "proselytizer",
+ "proselytises", "proselytizes",
+ "radicalising", "radicalizing",
+ "rationalised", "rationalized",
+ "rationalises", "rationalizes",
+ "realisations", "realizations",
+ "recognisable", "recognizable",
+ "recognisably", "recognizably",
+ "recognisance", "recognizance",
+ "reconnoitred", "reconnoitered",
+ "reconnoitres", "reconnoiters",
+ "regularising", "regularizing",
+ "reorganising", "reorganizing",
+ "revitalising", "revitalizing",
+ "rhapsodising", "rhapsodizing",
+ "romanticised", "romanticized",
+ "romanticises", "romanticizes",
+ "scandalising", "scandalizing",
+ "scrutinising", "scrutinizing",
+ "secularising", "secularizing",
+ "specialising", "specializing",
+ "squirrelling", "squirreling",
+ "standardised", "standardized",
+ "standardises", "standardizes",
+ "stigmatising", "stigmatizing",
+ "sympathisers", "sympathizers",
+ "sympathising", "sympathizing",
+ "synchronised", "synchronized",
+ "synchronises", "synchronizes",
+ "synthesisers", "synthesizers",
+ "synthesising", "synthesizing",
+ "systematised", "systematized",
+ "systematises", "systematizes",
+ "technicolour", "technicolor",
+ "theatregoers", "theatergoers",
+ "traumatising", "traumatizing",
+ "trivialising", "trivializing",
+ "unauthorised", "unauthorized",
+ "uncatalogued", "uncataloged",
+ "unfavourable", "unfavorable",
+ "unfavourably", "unfavorably",
+ "unionisation", "unionization",
+ "unrecognised", "unrecognized",
+ "untrammelled", "untrammeled",
+ "urbanisation", "urbanization",
+ "vaporisation", "vaporization",
+ "vocalisation", "vocalization",
+ "watercolours", "watercolors",
+ "westernising", "westernizing",
+ "accessorise", "accessorize",
+ "acclimatise", "acclimatize",
+ "agonisingly", "agonizingly",
+ "amortisable", "amortizable",
+ "anaesthesia", "anesthesia",
+ "anaesthetic", "anesthetic",
+ "anglicising", "anglicizing",
+ "antagonised", "antagonized",
+ "antagonises", "antagonizes",
+ "apologising", "apologizing",
+ "archaeology", "archeology",
+ "authorising", "authorizing",
+ "bastardised", "bastardized",
+ "bastardises", "bastardizes",
+ "bedevilling", "bedeviling",
+ "behavioural", "behavioral",
+ "belabouring", "belaboring",
+ "bowdlerised", "bowdlerized",
+ "bowdlerises", "bowdlerizes",
+ "breathalyse", "breathalyze",
+ "brutalising", "brutalizing",
+ "cannibalise", "cannibalize",
+ "capitalised", "capitalized",
+ "capitalises", "capitalizes",
+ "caramelised", "caramelized",
+ "caramelises", "caramelizes",
+ "carbonising", "carbonizing",
+ "cataloguing", "cataloging",
+ "categorised", "categorized",
+ "categorises", "categorizes",
+ "cauterising", "cauterizing",
+ "centigramme", "centigram",
+ "centilitres", "centiliters",
+ "centimetres", "centimeters",
+ "centralised", "centralized",
+ "centralises", "centralizes",
+ "centrefolds", "centerfolds",
+ "centrepiece", "centerpiece",
+ "channelling", "channeling",
+ "chequebooks", "checkbooks",
+ "circularise", "circularize",
+ "colourfully", "colorfully",
+ "colourizing", "colorizing",
+ "computerise", "computerize",
+ "councillors", "councilors",
+ "counselling", "counseling",
+ "counsellors", "counselors",
+ "criminalise", "criminalize",
+ "criticising", "criticizing",
+ "crystallise", "crystallize",
+ "customising", "customizing",
+ "defenceless", "defenseless",
+ "dehumanised", "dehumanized",
+ "dehumanises", "dehumanizes",
+ "demobilised", "demobilized",
+ "demobilises", "demobilizes",
+ "democratise", "democratize",
+ "demoralised", "demoralized",
+ "demoralises", "demoralizes",
+ "deodorising", "deodorizing",
+ "desensitise", "desensitize",
+ "destabilise", "destabilize",
+ "discoloured", "discolored",
+ "dishevelled", "disheveled",
+ "dishonoured", "dishonored",
+ "dramatising", "dramatizing",
+ "economising", "economizing",
+ "empathising", "empathizing",
+ "emphasising", "emphasizing",
+ "endeavoured", "endeavored",
+ "epitomising", "epitomizing",
+ "evangelised", "evangelized",
+ "evangelises", "evangelizes",
+ "extemporise", "extemporize",
+ "externalise", "externalize",
+ "factorising", "factorizing",
+ "familiarise", "familiarize",
+ "fantasising", "fantasizing",
+ "favouritism", "favoritism",
+ "fertilisers", "fertilizers",
+ "fertilising", "fertilizing",
+ "flavourings", "flavorings",
+ "flavourless", "flavorless",
+ "flavoursome", "flavorsome",
+ "formalising", "formalizing",
+ "fossilising", "fossilizing",
+ "fraternised", "fraternized",
+ "fraternises", "fraternizes",
+ "galvanising", "galvanizing",
+ "generalised", "generalized",
+ "generalises", "generalizes",
+ "ghettoising", "ghettoizing",
+ "globalising", "globalizing",
+ "gruellingly", "gruelingly",
+ "gynaecology", "gynecology",
+ "haematology", "hematology",
+ "haemoglobin", "hemoglobin",
+ "haemophilia", "hemophilia",
+ "haemorrhage", "hemorrhage",
+ "harmonising", "harmonizing",
+ "homoeopaths", "homeopaths",
+ "homoeopathy", "homeopathy",
+ "homogenised", "homogenized",
+ "homogenises", "homogenizes",
+ "hospitalise", "hospitalize",
+ "hybridising", "hybridizing",
+ "hypnotising", "hypnotizing",
+ "hypothesise", "hypothesize",
+ "immobilised", "immobilized",
+ "immobiliser", "immobilizer",
+ "immobilises", "immobilizes",
+ "immortalise", "immortalize",
+ "impanelling", "impaneling",
+ "imperilling", "imperiling",
+ "initialised", "initialized",
+ "initialises", "initializes",
+ "initialling", "initialing",
+ "instalments", "installments",
+ "internalise", "internalize",
+ "italicising", "italicizing",
+ "jeopardised", "jeopardized",
+ "jeopardises", "jeopardizes",
+ "kilogrammes", "kilograms",
+ "legitimised", "legitimized",
+ "legitimises", "legitimizes",
+ "liberalised", "liberalized",
+ "liberalises", "liberalizes",
+ "lionisation", "lionization",
+ "liquidisers", "liquidizers",
+ "liquidising", "liquidizing",
+ "magnetising", "magnetizing",
+ "manoeuvring", "maneuvering",
+ "marginalise", "marginalize",
+ "marshalling", "marshaling",
+ "materialise", "materialize",
+ "mechanising", "mechanizing",
+ "memorialise", "memorialize",
+ "mesmerising", "mesmerizing",
+ "metabolised", "metabolized",
+ "metabolises", "metabolizes",
+ "micrometres", "micrometers",
+ "militarised", "militarized",
+ "militarises", "militarizes",
+ "milligramme", "milligram",
+ "millilitres", "milliliters",
+ "millimetres", "millimeters",
+ "miniaturise", "miniaturize",
+ "modernising", "modernizing",
+ "moisturised", "moisturized",
+ "moisturiser", "moisturizer",
+ "moisturises", "moisturizes",
+ "monopolised", "monopolized",
+ "monopolises", "monopolizes",
+ "nationalise", "nationalize",
+ "naturalised", "naturalized",
+ "naturalises", "naturalizes",
+ "neighbourly", "neighborly",
+ "neutralised", "neutralized",
+ "neutralises", "neutralizes",
+ "normalising", "normalizing",
+ "orthopaedic", "orthopedic",
+ "ostracising", "ostracizing",
+ "oxidisation", "oxidization",
+ "paediatrics", "pediatrics",
+ "paedophiles", "pedophiles",
+ "paedophilia", "pedophilia",
+ "passivising", "passivizing",
+ "pasteurised", "pasteurized",
+ "pasteurises", "pasteurizes",
+ "patronising", "patronizing",
+ "personalise", "personalize",
+ "plagiarised", "plagiarized",
+ "plagiarises", "plagiarizes",
+ "ploughshare", "plowshare",
+ "politicised", "politicized",
+ "politicises", "politicizes",
+ "popularised", "popularized",
+ "popularises", "popularizes",
+ "praesidiums", "presidiums",
+ "pressurised", "pressurized",
+ "pressurises", "pressurizes",
+ "prioritised", "prioritized",
+ "prioritises", "prioritizes",
+ "privatising", "privatizing",
+ "proselytise", "proselytize",
+ "publicising", "publicizing",
+ "pulverising", "pulverizing",
+ "quarrelling", "quarreling",
+ "radicalised", "radicalized",
+ "radicalises", "radicalizes",
+ "randomising", "randomizing",
+ "rationalise", "rationalize",
+ "realisation", "realization",
+ "recognising", "recognizing",
+ "reconnoitre", "reconnoiter",
+ "regularised", "regularized",
+ "regularises", "regularizes",
+ "remodelling", "remodeling",
+ "reorganised", "reorganized",
+ "reorganises", "reorganizes",
+ "revitalised", "revitalized",
+ "revitalises", "revitalizes",
+ "rhapsodised", "rhapsodized",
+ "rhapsodises", "rhapsodizes",
+ "romanticise", "romanticize",
+ "scandalised", "scandalized",
+ "scandalises", "scandalizes",
+ "sceptically", "skeptically",
+ "scrutinised", "scrutinized",
+ "scrutinises", "scrutinizes",
+ "secularised", "secularized",
+ "secularises", "secularizes",
+ "sensitising", "sensitizing",
+ "serialising", "serializing",
+ "sermonising", "sermonizing",
+ "shrivelling", "shriveling",
+ "signalising", "signalizing",
+ "snorkelling", "snorkeling",
+ "snowploughs", "snowplow",
+ "socialising", "socializing",
+ "solemnising", "solemnizing",
+ "specialised", "specialized",
+ "specialises", "specializes",
+ "squirrelled", "squirreled",
+ "stabilisers", "stabilizers",
+ "stabilising", "stabilizing",
+ "standardise", "standardize",
+ "stencilling", "stenciling",
+ "sterilisers", "sterilizers",
+ "sterilising", "sterilizing",
+ "stigmatised", "stigmatized",
+ "stigmatises", "stigmatizes",
+ "subsidisers", "subsidizers",
+ "subsidising", "subsidizing",
+ "summarising", "summarizing",
+ "symbolising", "symbolizing",
+ "sympathised", "sympathized",
+ "sympathiser", "sympathizer",
+ "sympathises", "sympathizes",
+ "synchronise", "synchronize",
+ "synthesised", "synthesized",
+ "synthesiser", "synthesizer",
+ "synthesises", "synthesizes",
+ "systematise", "systematize",
+ "tantalising", "tantalizing",
+ "temporising", "temporizing",
+ "tenderising", "tenderizing",
+ "terrorising", "terrorizing",
+ "theatregoer", "theatergoer",
+ "traumatised", "traumatized",
+ "traumatises", "traumatizes",
+ "trivialised", "trivialized",
+ "trivialises", "trivializes",
+ "tyrannising", "tyrannizing",
+ "uncivilised", "uncivilized",
+ "unorganised", "unorganized",
+ "unravelling", "unraveling",
+ "utilisation", "utilization",
+ "vandalising", "vandalizing",
+ "verbalising", "verbalizing",
+ "victimising", "victimizing",
+ "visualising", "visualizing",
+ "vulgarising", "vulgarizing",
+ "watercolour", "watercolor",
+ "westernised", "westernized",
+ "westernises", "westernizes",
+ "worshipping", "worshiping",
+ "aeroplanes", "airplanes",
+ "amortising", "amortizing",
+ "anglicised", "anglicized",
+ "anglicises", "anglicizes",
+ "annualised", "annualized",
+ "antagonise", "antagonize",
+ "apologised", "apologized",
+ "apologises", "apologizes",
+ "appetisers", "appetizers",
+ "appetising", "appetizing",
+ "authorised", "authorized",
+ "authorises", "authorizes",
+ "bannisters", "banisters",
+ "bastardise", "bastardize",
+ "bedevilled", "bedeviled",
+ "behaviours", "behaviors",
+ "bejewelled", "bejeweled",
+ "belaboured", "belabored",
+ "bowdlerise", "bowdlerize",
+ "brutalised", "brutalized",
+ "brutalises", "brutalizes",
+ "canalising", "canalizing",
+ "cancelling", "canceling",
+ "canonising", "canonizing",
+ "capitalise", "capitalize",
+ "caramelise", "caramelize",
+ "carbonised", "carbonized",
+ "carbonises", "carbonizes",
+ "catalogued", "cataloged",
+ "catalogues", "catalogs",
+ "catalysing", "catalyzing",
+ "categorise", "categorize",
+ "cauterised", "cauterized",
+ "cauterises", "cauterizes",
+ "centilitre", "centiliter",
+ "centimetre", "centimeter",
+ "centralise", "centralize",
+ "centrefold", "centerfold",
+ "channelled", "channeled",
+ "chequebook", "checkbook",
+ "chiselling", "chiseling",
+ "civilising", "civilizing",
+ "clamouring", "clamoring",
+ "colonisers", "colonizers",
+ "colonising", "colonizing",
+ "colourants", "colorants",
+ "colourized", "colorized",
+ "colourizes", "colorizes",
+ "colourless", "colorless",
+ "connexions", "connections",
+ "councillor", "councilor",
+ "counselled", "counseled",
+ "counsellor", "counselor",
+ "criticised", "criticized",
+ "criticises", "criticizes",
+ "cudgelling", "cudgeling",
+ "customised", "customized",
+ "customises", "customizes",
+ "dehumanise", "dehumanize",
+ "demobilise", "demobilize",
+ "demonising", "demonizing",
+ "demoralise", "demoralize",
+ "deodorised", "deodorized",
+ "deodorises", "deodorizes",
+ "deputising", "deputizing",
+ "digitising", "digitizing",
+ "discolours", "discolors",
+ "dishonours", "dishonors",
+ "dramatised", "dramatized",
+ "dramatises", "dramatizes",
+ "drivelling", "driveling",
+ "economised", "economized",
+ "economises", "economizes",
+ "empathised", "empathized",
+ "empathises", "empathizes",
+ "emphasised", "emphasized",
+ "emphasises", "emphasizes",
+ "enamelling", "enameling",
+ "endeavours", "endeavors",
+ "energising", "energizing",
+ "epaulettes", "epaulets",
+ "epicentres", "epicenters",
+ "epitomised", "epitomized",
+ "epitomises", "epitomizes",
+ "equalisers", "equalizers",
+ "equalising", "equalizing",
+ "eulogising", "eulogizing",
+ "evangelise", "evangelize",
+ "factorised", "factorized",
+ "factorises", "factorizes",
+ "fantasised", "fantasized",
+ "fantasises", "fantasizes",
+ "favourable", "favorable",
+ "favourably", "favorably",
+ "favourites", "favorites",
+ "feminising", "feminizing",
+ "fertilised", "fertilized",
+ "fertiliser", "fertilizer",
+ "fertilises", "fertilizes",
+ "fibreglass", "fiberglass",
+ "finalising", "finalizing",
+ "flavouring", "flavoring",
+ "formalised", "formalized",
+ "formalises", "formalizes",
+ "fossilised", "fossilized",
+ "fossilises", "fossilizes",
+ "fraternise", "fraternize",
+ "fulfilment", "fulfillment",
+ "funnelling", "funneling",
+ "galvanised", "galvanized",
+ "galvanises", "galvanizes",
+ "gambolling", "gamboling",
+ "gaolbreaks", "jailbreaks",
+ "generalise", "generalize",
+ "ghettoised", "ghettoized",
+ "ghettoises", "ghettoizes",
+ "globalised", "globalized",
+ "globalises", "globalizes",
+ "gonorrhoea", "gonorrhea",
+ "grovelling", "groveling",
+ "harbouring", "harboring",
+ "harmonised", "harmonized",
+ "harmonises", "harmonizes",
+ "homoeopath", "homeopath",
+ "homogenise", "homogenize",
+ "honourable", "honorable",
+ "honourably", "honorably",
+ "humanising", "humanizing",
+ "humourless", "humorless",
+ "hybridised", "hybridized",
+ "hybridises", "hybridizes",
+ "hypnotised", "hypnotized",
+ "hypnotises", "hypnotizes",
+ "idealising", "idealizing",
+ "immobilise", "immobilize",
+ "immunising", "immunizing",
+ "impanelled", "impaneled",
+ "imperilled", "imperiled",
+ "inflexions", "inflections",
+ "initialise", "initialize",
+ "initialled", "initialed",
+ "instalment", "installment",
+ "ionisation", "ionization",
+ "italicised", "italicized",
+ "italicises", "italicizes",
+ "jeopardise", "jeopardize",
+ "kilogramme", "kilogram",
+ "kilometres", "kilometers",
+ "lacklustre", "lackluster",
+ "legalising", "legalizing",
+ "legitimise", "legitimize",
+ "liberalise", "liberalize",
+ "liquidised", "liquidized",
+ "liquidiser", "liquidizer",
+ "liquidises", "liquidizes",
+ "localising", "localizing",
+ "magnetised", "magnetized",
+ "magnetises", "magnetizes",
+ "manoeuvred", "maneuvered",
+ "manoeuvres", "maneuvers",
+ "marshalled", "marshaled",
+ "marvelling", "marveling",
+ "marvellous", "marvelous",
+ "maximising", "maximizing",
+ "mechanised", "mechanized",
+ "mechanises", "mechanizes",
+ "memorising", "memorizing",
+ "mesmerised", "mesmerized",
+ "mesmerises", "mesmerizes",
+ "metabolise", "metabolize",
+ "micrometre", "micrometer",
+ "militarise", "militarize",
+ "millilitre", "milliliter",
+ "millimetre", "millimeter",
+ "minimising", "minimizing",
+ "mobilising", "mobilizing",
+ "modernised", "modernized",
+ "modernises", "modernizes",
+ "moisturise", "moisturize",
+ "monopolise", "monopolize",
+ "moralising", "moralizing",
+ "mouldering", "moldering",
+ "moustached", "mustached",
+ "moustaches", "mustaches",
+ "naturalise", "naturalize",
+ "neighbours", "neighbors",
+ "neutralise", "neutralize",
+ "normalised", "normalized",
+ "normalises", "normalizes",
+ "oesophagus", "esophagus",
+ "optimising", "optimizing",
+ "organisers", "organizers",
+ "organising", "organizing",
+ "ostracised", "ostracized",
+ "ostracises", "ostracizes",
+ "paederasts", "pederasts",
+ "paediatric", "pediatric",
+ "paedophile", "pedophile",
+ "panellists", "panelists",
+ "paralysing", "paralyzing",
+ "parcelling", "parceling",
+ "passivised", "passivized",
+ "passivises", "passivizes",
+ "pasteurise", "pasteurize",
+ "patronised", "patronized",
+ "patronises", "patronizes",
+ "penalising", "penalizing",
+ "pencilling", "penciling",
+ "plagiarise", "plagiarize",
+ "polarising", "polarizing",
+ "politicise", "politicize",
+ "popularise", "popularize",
+ "practising", "practicing",
+ "praesidium", "presidium",
+ "pressurise", "pressurize",
+ "prioritise", "prioritize",
+ "privatised", "privatized",
+ "privatises", "privatizes",
+ "programmes", "programs",
+ "publicised", "publicized",
+ "publicises", "publicizes",
+ "pulverised", "pulverized",
+ "pulverises", "pulverizes",
+ "pummelling", "pummeled",
+ "quarrelled", "quarreled",
+ "radicalise", "radicalize",
+ "randomised", "randomized",
+ "randomises", "randomizes",
+ "realisable", "realizable",
+ "recognised", "recognized",
+ "recognises", "recognizes",
+ "refuelling", "refueling",
+ "regularise", "regularize",
+ "remodelled", "remodeled",
+ "remoulding", "remolding",
+ "reorganise", "reorganize",
+ "revitalise", "revitalize",
+ "rhapsodise", "rhapsodize",
+ "ritualised", "ritualized",
+ "sanitising", "sanitizing",
+ "satirising", "satirizing",
+ "scandalise", "scandalize",
+ "scepticism", "skepticism",
+ "scrutinise", "scrutinize",
+ "secularise", "secularize",
+ "sensitised", "sensitized",
+ "sensitises", "sensitizes",
+ "sepulchres", "sepulchers",
+ "serialised", "serialized",
+ "serialises", "serializes",
+ "sermonised", "sermonized",
+ "sermonises", "sermonizes",
+ "shovelling", "shoveling",
+ "shrivelled", "shriveled",
+ "signalised", "signalized",
+ "signalises", "signalizes",
+ "signalling", "signaling",
+ "snivelling", "sniveling",
+ "snorkelled", "snorkeled",
+ "snowplough", "snowplow",
+ "socialised", "socialized",
+ "socialises", "socializes",
+ "sodomising", "sodomizing",
+ "solemnised", "solemnized",
+ "solemnises", "solemnizes",
+ "specialise", "specialize",
+ "spiralling", "spiraling",
+ "splendours", "splendors",
+ "stabilised", "stabilized",
+ "stabiliser", "stabilizer",
+ "stabilises", "stabilizes",
+ "stencilled", "stenciled",
+ "sterilised", "sterilized",
+ "steriliser", "sterilizer",
+ "sterilises", "sterilizes",
+ "stigmatise", "stigmatize",
+ "subsidised", "subsidized",
+ "subsidiser", "subsidizer",
+ "subsidises", "subsidizes",
+ "succouring", "succoring",
+ "sulphurous", "sulfurous",
+ "summarised", "summarized",
+ "summarises", "summarizes",
+ "swivelling", "swiveling",
+ "symbolised", "symbolized",
+ "symbolises", "symbolizes",
+ "sympathise", "sympathize",
+ "synthesise", "synthesize",
+ "tantalised", "tantalized",
+ "tantalises", "tantalizes",
+ "temporised", "temporized",
+ "temporises", "temporizes",
+ "tenderised", "tenderized",
+ "tenderises", "tenderizes",
+ "terrorised", "terrorized",
+ "terrorises", "terrorizes",
+ "theorising", "theorizing",
+ "traumatise", "traumatize",
+ "travellers", "travelers",
+ "travelling", "traveling",
+ "tricolours", "tricolors",
+ "trivialise", "trivialize",
+ "tunnelling", "tunneling",
+ "tyrannised", "tyrannized",
+ "tyrannises", "tyrannizes",
+ "unequalled", "unequaled",
+ "unionising", "unionizing",
+ "unravelled", "unraveled",
+ "unrivalled", "unrivaled",
+ "urbanising", "urbanizing",
+ "utilisable", "utilizable",
+ "vandalised", "vandalized",
+ "vandalises", "vandalizes",
+ "vaporising", "vaporizing",
+ "verbalised", "verbalized",
+ "verbalises", "verbalizes",
+ "victimised", "victimized",
+ "victimises", "victimizes",
+ "visualised", "visualized",
+ "visualises", "visualizes",
+ "vocalising", "vocalizing",
+ "vulcanised", "vulcanized",
+ "vulgarised", "vulgarized",
+ "vulgarises", "vulgarizes",
+ "weaselling", "weaseling",
+ "westernise", "westernize",
+ "womanisers", "womanizers",
+ "womanising", "womanizing",
+ "worshipped", "worshiped",
+ "worshipper", "worshiper",
+ "aeroplane", "airplane",
+ "aetiology", "etiology",
+ "agonising", "agonizing",
+ "almanacks", "almanacs",
+ "aluminium", "aluminum",
+ "amortised", "amortized",
+ "amortises", "amortizes",
+ "analogues", "analogs",
+ "analysing", "analyzing",
+ "anglicise", "anglicize",
+ "apologise", "apologize",
+ "appetiser", "appetizer",
+ "armourers", "armorers",
+ "armouries", "armories",
+ "artefacts", "artifacts",
+ "authorise", "authorize",
+ "baptising", "baptizing",
+ "behaviour", "behavior",
+ "belabours", "belabors",
+ "brutalise", "brutalize",
+ "callipers", "calipers",
+ "canalised", "canalized",
+ "canalises", "canalizes",
+ "cancelled", "canceled",
+ "canonised", "canonized",
+ "canonises", "canonizes",
+ "carbonise", "carbonize",
+ "carolling", "caroling",
+ "catalogue", "catalog",
+ "catalysed", "catalyzed",
+ "catalyses", "catalyzes",
+ "cauterise", "cauterize",
+ "cavilling", "caviling",
+ "chequered", "checkered",
+ "chiselled", "chiseled",
+ "civilised", "civilized",
+ "civilises", "civilizes",
+ "clamoured", "clamored",
+ "colonised", "colonized",
+ "coloniser", "colonizer",
+ "colonises", "colonizes",
+ "colourant", "colorant",
+ "coloureds", "coloreds",
+ "colourful", "colorful",
+ "colouring", "coloring",
+ "colourize", "colorize",
+ "connexion", "connection",
+ "criticise", "criticize",
+ "cruellest", "cruelest",
+ "cudgelled", "cudgeled",
+ "customise", "customize",
+ "demeanour", "demeanor",
+ "demonised", "demonized",
+ "demonises", "demonizes",
+ "deodorise", "deodorize",
+ "deputised", "deputized",
+ "deputises", "deputizes",
+ "dialogues", "dialogs",
+ "diarrhoea", "diarrhea",
+ "digitised", "digitized",
+ "digitises", "digitizes",
+ "discolour", "discolor",
+ "disfavour", "disfavor",
+ "dishonour", "dishonor",
+ "dramatise", "dramatize",
+ "drivelled", "driveled",
+ "economise", "economize",
+ "empathise", "empathize",
+ "emphasise", "emphasize",
+ "enamelled", "enameled",
+ "enamoured", "enamored",
+ "endeavour", "endeavor",
+ "energised", "energized",
+ "energises", "energizes",
+ "epaulette", "epaulet",
+ "epicentre", "epicenter",
+ "epitomise", "epitomize",
+ "equalised", "equalized",
+ "equaliser", "equalizer",
+ "equalises", "equalizes",
+ "eulogised", "eulogized",
+ "eulogises", "eulogizes",
+ "factorise", "factorize",
+ "fantasise", "fantasize",
+ "favouring", "favoring",
+ "favourite", "favorite",
+ "feminised", "feminized",
+ "feminises", "feminizes",
+ "fertilise", "fertilize",
+ "finalised", "finalized",
+ "finalises", "finalizes",
+ "flautists", "flutists",
+ "flavoured", "flavored",
+ "formalise", "formalize",
+ "fossilise", "fossilize",
+ "funnelled", "funneled",
+ "galvanise", "galvanize",
+ "gambolled", "gamboled",
+ "gaolbirds", "jailbirds",
+ "gaolbreak", "jailbreak",
+ "ghettoise", "ghettoize",
+ "globalise", "globalize",
+ "gravelled", "graveled",
+ "grovelled", "groveled",
+ "gruelling", "grueling",
+ "harboured", "harbored",
+ "harmonise", "harmonize",
+ "honouring", "honoring",
+ "humanised", "humanized",
+ "humanises", "humanizes",
+ "humouring", "humoring",
+ "hybridise", "hybridize",
+ "hypnotise", "hypnotize",
+ "idealised", "idealized",
+ "idealises", "idealizes",
+ "idolising", "idolizing",
+ "immunised", "immunized",
+ "immunises", "immunizes",
+ "inflexion", "inflection",
+ "italicise", "italicize",
+ "itemising", "itemizing",
+ "jewellers", "jewelers",
+ "jewellery", "jewelry",
+ "kilometre", "kilometer",
+ "labelling", "labeling",
+ "labourers", "laborers",
+ "labouring", "laboring",
+ "legalised", "legalized",
+ "legalises", "legalizes",
+ "leukaemia", "leukemia",
+ "levellers", "levelers",
+ "levelling", "leveling",
+ "libelling", "libeling",
+ "libellous", "libelous",
+ "licencing", "licensing",
+ "lionising", "lionizing",
+ "liquidise", "liquidize",
+ "localised", "localized",
+ "localises", "localizes",
+ "magnetise", "magnetize",
+ "manoeuvre", "maneuver",
+ "marvelled", "marveled",
+ "maximised", "maximized",
+ "maximises", "maximizes",
+ "mechanise", "mechanize",
+ "mediaeval", "medieval",
+ "memorised", "memorized",
+ "memorises", "memorizes",
+ "mesmerise", "mesmerize",
+ "minimised", "minimized",
+ "minimises", "minimizes",
+ "mobilised", "mobilized",
+ "mobilises", "mobilizes",
+ "modellers", "modelers",
+ "modelling", "modeling",
+ "modernise", "modernize",
+ "moralised", "moralized",
+ "moralises", "moralizes",
+ "motorised", "motorized",
+ "mouldered", "moldered",
+ "mouldiest", "moldiest",
+ "mouldings", "moldings",
+ "moustache", "mustache",
+ "neighbour", "neighbor",
+ "normalise", "normalize",
+ "odourless", "odorless",
+ "oestrogen", "estrogen",
+ "optimised", "optimized",
+ "optimises", "optimizes",
+ "organised", "organized",
+ "organiser", "organizer",
+ "organises", "organizes",
+ "ostracise", "ostracize",
+ "oxidising", "oxidizing",
+ "paederast", "pederast",
+ "panelling", "paneling",
+ "panellist", "panelist",
+ "paralysed", "paralyzed",
+ "paralyses", "paralyzes",
+ "parcelled", "parceled",
+ "passivise", "passivize",
+ "patronise", "patronize",
+ "pedalling", "pedaling",
+ "penalised", "penalized",
+ "penalises", "penalizes",
+ "pencilled", "penciled",
+ "ploughing", "plowing",
+ "ploughman", "plowman",
+ "ploughmen", "plowmen",
+ "polarised", "polarized",
+ "polarises", "polarizes",
+ "practised", "practiced",
+ "practises", "practices",
+ "pretences", "pretenses",
+ "primaeval", "primeval",
+ "privatise", "privatize",
+ "programme", "program",
+ "publicise", "publicize",
+ "pulverise", "pulverize",
+ "pummelled", "pummel",
+ "randomise", "randomize",
+ "ravelling", "raveling",
+ "realising", "realizing",
+ "recognise", "recognize",
+ "refuelled", "refueled",
+ "remoulded", "remolded",
+ "revellers", "revelers",
+ "revelling", "reveling",
+ "rivalling", "rivaling",
+ "saltpetre", "saltpeter",
+ "sanitised", "sanitized",
+ "sanitises", "sanitizes",
+ "satirised", "satirized",
+ "satirises", "satirizes",
+ "savouries", "savories",
+ "savouring", "savoring",
+ "sceptical", "skeptical",
+ "sensitise", "sensitize",
+ "sepulchre", "sepulcher",
+ "serialise", "serialize",
+ "sermonise", "sermonize",
+ "shovelled", "shoveled",
+ "signalise", "signalize",
+ "signalled", "signaled",
+ "snivelled", "sniveled",
+ "socialise", "socialize",
+ "sodomised", "sodomized",
+ "sodomises", "sodomizes",
+ "solemnise", "solemnize",
+ "spiralled", "spiraled",
+ "splendour", "splendor",
+ "stabilise", "stabilize",
+ "sterilise", "sterilize",
+ "subsidise", "subsidize",
+ "succoured", "succored",
+ "sulphates", "sulfates",
+ "sulphides", "sulfides",
+ "summarise", "summarize",
+ "swivelled", "swiveled",
+ "symbolise", "symbolize",
+ "syphoning", "siphoning",
+ "tantalise", "tantalize",
+ "tasselled", "tasseled",
+ "temporise", "temporize",
+ "tenderise", "tenderize",
+ "terrorise", "terrorize",
+ "theorised", "theorized",
+ "theorises", "theorizes",
+ "towelling", "toweling",
+ "travelled", "traveled",
+ "traveller", "traveler",
+ "trialling", "trialing",
+ "tricolour", "tricolor",
+ "tunnelled", "tunneled",
+ "tyrannise", "tyrannize",
+ "unionised", "unionized",
+ "unionises", "unionizes",
+ "unsavoury", "unsavory",
+ "urbanised", "urbanized",
+ "urbanises", "urbanizes",
+ "utilising", "utilizing",
+ "vandalise", "vandalize",
+ "vaporised", "vaporized",
+ "vaporises", "vaporizes",
+ "verbalise", "verbalize",
+ "victimise", "victimize",
+ "visualise", "visualize",
+ "vocalised", "vocalized",
+ "vocalises", "vocalizes",
+ "vulgarise", "vulgarize",
+ "weaselled", "weaseled",
+ "womanised", "womanized",
+ "womaniser", "womanizer",
+ "womanises", "womanizes",
+ "yodelling", "yodeling",
+ "yoghourts", "yogurts",
+ "agonised", "agonized",
+ "agonises", "agonizes",
+ "almanack", "almanac",
+ "amortise", "amortize",
+ "analogue", "analog",
+ "analysed", "analyzed",
+ "analyses", "analyzes",
+ "armoured", "armored",
+ "armourer", "armorer",
+ "artefact", "artifact",
+ "baptised", "baptized",
+ "baptises", "baptizes",
+ "baulking", "balking",
+ "belabour", "belabor",
+ "bevelled", "beveled",
+ "calibres", "calibers",
+ "calliper", "caliper",
+ "canalise", "canalize",
+ "canonise", "canonize",
+ "carolled", "caroled",
+ "catalyse", "catalyze",
+ "cavilled", "caviled",
+ "civilise", "civilize",
+ "clamours", "clamors",
+ "clangour", "clangor",
+ "colonise", "colonize",
+ "coloured", "colored",
+ "cosiness", "coziness",
+ "crueller", "crueler",
+ "defences", "defenses",
+ "demonise", "demonize",
+ "deputise", "deputize",
+ "dialling", "dialing",
+ "dialogue", "dialog",
+ "digitise", "digitize",
+ "draughty", "drafty",
+ "duelling", "dueling",
+ "energise", "energize",
+ "enthrals", "enthralls",
+ "equalise", "equalize",
+ "eulogise", "eulogize",
+ "favoured", "favored",
+ "feminise", "feminize",
+ "finalise", "finalize",
+ "flautist", "flutist",
+ "flavours", "flavors",
+ "foetuses", "fetuses",
+ "fuelling", "fueling",
+ "gaolbird", "jailbird",
+ "gryphons", "griffins",
+ "harbours", "harbors",
+ "honoured", "honored",
+ "humanise", "humanize",
+ "humoured", "humored",
+ "idealise", "idealize",
+ "idolised", "idolized",
+ "idolises", "idolizes",
+ "immunise", "immunize",
+ "ionisers", "ionizers",
+ "ionising", "ionizing",
+ "itemised", "itemized",
+ "itemises", "itemizes",
+ "jewelled", "jeweled",
+ "jeweller", "jeweler",
+ "labelled", "labeled",
+ "laboured", "labored",
+ "labourer", "laborer",
+ "legalise", "legalize",
+ "levelled", "leveled",
+ "leveller", "leveler",
+ "libelled", "libeled",
+ "licenced", "licensed",
+ "licences", "licenses",
+ "lionised", "lionized",
+ "lionises", "lionizes",
+ "localise", "localize",
+ "maximise", "maximize",
+ "memorise", "memorize",
+ "minimise", "minimize",
+ "misspelt", "misspelled",
+ "mobilise", "mobilize",
+ "modelled", "modeled",
+ "modeller", "modeler",
+ "moralise", "moralize",
+ "moulders", "molders",
+ "mouldier", "moldier",
+ "moulding", "molding",
+ "moulting", "molting",
+ "offences", "offenses",
+ "optimise", "optimize",
+ "organise", "organize",
+ "oxidised", "oxidized",
+ "oxidises", "oxidizes",
+ "panelled", "paneled",
+ "paralyse", "paralyze",
+ "parlours", "parlors",
+ "pedalled", "pedaled",
+ "penalise", "penalize",
+ "philtres", "filters",
+ "ploughed", "plowed",
+ "polarise", "polarize",
+ "practise", "practice",
+ "pretence", "pretense",
+ "ravelled", "raveled",
+ "realised", "realized",
+ "realises", "realizes",
+ "remoulds", "remolds",
+ "revelled", "reveled",
+ "reveller", "reveler",
+ "rivalled", "rivaled",
+ "rumoured", "rumored",
+ "sanitise", "sanitize",
+ "satirise", "satirize",
+ "saviours", "saviors",
+ "savoured", "savored",
+ "sceptics", "skeptics",
+ "sceptres", "scepters",
+ "sodomise", "sodomize",
+ "spectres", "specters",
+ "succours", "succors",
+ "sulphate", "sulfate",
+ "sulphide", "sulfide",
+ "syphoned", "siphoned",
+ "theatres", "theaters",
+ "theorise", "theorize",
+ "towelled", "toweled",
+ "toxaemia", "toxemia",
+ "trialled", "trialed",
+ "unionise", "unionize",
+ "urbanise", "urbanize",
+ "utilised", "utilized",
+ "utilises", "utilizes",
+ "vaporise", "vaporize",
+ "vocalise", "vocalize",
+ "womanise", "womanize",
+ "yodelled", "yodeled",
+ "yoghourt", "yogurt",
+ "yoghurts", "yogurts",
+ "agonise", "agonize",
+ "anaemia", "anemia",
+ "anaemic", "anemic",
+ "analyse", "analyze",
+ "arbours", "arbors",
+ "armoury", "armory",
+ "baptise", "baptize",
+ "baulked", "balked",
+ "behoved", "behooved",
+ "behoves", "behooves",
+ "calibre", "caliber",
+ "candour", "candor",
+ "centred", "centered",
+ "centres", "centers",
+ "cheques", "checks",
+ "clamour", "clamor",
+ "colours", "colors",
+ "cosiest", "coziest",
+ "defence", "defense",
+ "dialled", "dialed",
+ "distils", "distills",
+ "duelled", "dueled",
+ "enthral", "enthrall",
+ "favours", "favors",
+ "fervour", "fervor",
+ "flavour", "flavor",
+ "fuelled", "fueled",
+ "fulfils", "fulfills",
+ "gaolers", "jailers",
+ "gaoling", "jailing",
+ "gipsies", "gypsies",
+ "glueing", "gluing",
+ "goitres", "goiters",
+ "grammes", "grams",
+ "groynes", "groins",
+ "gryphon", "griffin",
+ "harbour", "harbor",
+ "honours", "honors",
+ "humours", "humors",
+ "idolise", "idolize",
+ "instals", "installs",
+ "instils", "instills",
+ "ionised", "ionized",
+ "ioniser", "ionizer",
+ "ionises", "ionizes",
+ "itemise", "itemize",
+ "labours", "labors",
+ "licence", "license",
+ "lionise", "lionize",
+ "louvred", "louvered",
+ "louvres", "louvers",
+ "moulded", "molded",
+ "moulder", "molder",
+ "moulted", "molted",
+ "offence", "offense",
+ "oxidise", "oxidize",
+ "parlour", "parlor",
+ "philtre", "filter",
+ "ploughs", "plows",
+ "pyjamas", "pajamas",
+ "rancour", "rancor",
+ "realise", "realize",
+ "remould", "remold",
+ "rigours", "rigors",
+ "rumours", "rumors",
+ "saviour", "savior",
+ "savours", "savors",
+ "savoury", "savory",
+ "sceptic", "skeptic",
+ "sceptre", "scepter",
+ "spectre", "specter",
+ "storeys", "stories",
+ "succour", "succor",
+ "sulphur", "sulfur",
+ "syphons", "siphons",
+ "theatre", "theater",
+ "tumours", "tumors",
+ "utilise", "utilize",
+ "vapours", "vapors",
+ "waggons", "wagons",
+ "yoghurt", "yogurt",
+ "ageing", "aging",
+ "appals", "appalls",
+ "arbour", "arbor",
+ "ardour", "ardor",
+ "baulks", "balks",
+ "behove", "behoove",
+ "centre", "center",
+ "cheque", "check",
+ "chilli", "chili",
+ "colour", "color",
+ "cosier", "cozier",
+ "cosies", "cozies",
+ "cosily", "cozily",
+ "distil", "distill",
+ "edoema", "edema",
+ "enrols", "enrolls",
+ "faecal", "fecal",
+ "faeces", "feces",
+ "favour", "favor",
+ "fibres", "fibers",
+ "foetal", "fetal",
+ "foetid", "fetid",
+ "foetus", "fetus",
+ "fulfil", "fulfill",
+ "gaoled", "jailed",
+ "gaoler", "jailer",
+ "goitre", "goiter",
+ "gramme", "gram",
+ "groyne", "groin",
+ "honour", "honor",
+ "humour", "humor",
+ "instal", "install",
+ "instil", "instill",
+ "ionise", "ionize",
+ "labour", "labor",
+ "litres", "liters",
+ "lustre", "luster",
+ "meagre", "meager",
+ "metres", "meters",
+ "mitres", "miters",
+ "moulds", "molds",
+ "mouldy", "moldy",
+ "moults", "molts",
+ "odours", "odors",
+ "plough", "plow",
+ "pyjama", "pajama",
+ "rigour", "rigor",
+ "rumour", "rumor",
+ "savour", "savor",
+ "storey", "story",
+ "syphon", "siphon",
+ "tumour", "tumor",
+ "valour", "valor",
+ "vapour", "vapor",
+ "vigour", "vigor",
+ "waggon", "wagon",
+ "appal", "appall",
+ "baulk", "balk",
+ "enrol", "enroll",
+ "fibre", "fiber",
+ "gaols", "jails",
+ "litre", "liter",
+ "metre", "meter",
+ "mitre", "miter",
+ "mould", "mold",
+ "moult", "molt",
+ "odour", "odor",
+ "tyres", "tires",
+ "cosy", "cozy",
+ "gaol", "jail",
+ "tyre", "tire",
+}
+
+// DictBritish converts US spellings to UK spellings
+var DictBritish = []string{
+ "institutionalization", "institutionalisation",
+ "internationalization", "internationalisation",
+ "professionalization", "professionalisation",
+ "compartmentalizing", "compartmentalising",
+ "institutionalizing", "institutionalising",
+ "internationalizing", "internationalising",
+ "compartmentalized", "compartmentalised",
+ "compartmentalizes", "compartmentalises",
+ "decriminalization", "decriminalisation",
+ "denationalization", "denationalisation",
+ "fictionalizations", "fictionalisations",
+ "institutionalized", "institutionalised",
+ "institutionalizes", "institutionalises",
+ "intellectualizing", "intellectualising",
+ "internationalized", "internationalised",
+ "internationalizes", "internationalises",
+ "pedestrianization", "pedestrianisation",
+ "professionalizing", "professionalising",
+ "compartmentalize", "compartmentalise",
+ "decentralization", "decentralisation",
+ "demilitarization", "demilitarisation",
+ "externalizations", "externalisations",
+ "fictionalization", "fictionalisation",
+ "institutionalize", "institutionalise",
+ "intellectualized", "intellectualised",
+ "intellectualizes", "intellectualises",
+ "internationalize", "internationalise",
+ "nationalizations", "nationalisations",
+ "professionalized", "professionalised",
+ "professionalizes", "professionalises",
+ "rationalizations", "rationalisations",
+ "sensationalizing", "sensationalising",
+ "sentimentalizing", "sentimentalising",
+ "acclimatization", "acclimatisation",
+ "commercializing", "commercialising",
+ "conceptualizing", "conceptualising",
+ "contextualizing", "contextualising",
+ "crystallization", "crystallisation",
+ "decriminalizing", "decriminalising",
+ "democratization", "democratisation",
+ "denationalizing", "denationalising",
+ "depersonalizing", "depersonalising",
+ "desensitization", "desensitisation",
+ "disorganization", "disorganisation",
+ "extemporization", "extemporisation",
+ "externalization", "externalisation",
+ "familiarization", "familiarisation",
+ "generalizations", "generalisations",
+ "hospitalization", "hospitalisation",
+ "individualizing", "individualising",
+ "industrializing", "industrialising",
+ "intellectualize", "intellectualise",
+ "internalization", "internalisation",
+ "maneuverability", "manoeuvrability",
+ "materialization", "materialisation",
+ "miniaturization", "miniaturisation",
+ "nationalization", "nationalisation",
+ "overemphasizing", "overemphasising",
+ "paleontologists", "palaeontologists",
+ "particularizing", "particularising",
+ "pedestrianizing", "pedestrianising",
+ "professionalize", "professionalise",
+ "psychoanalyzing", "psychoanalysing",
+ "rationalization", "rationalisation",
+ "reorganizations", "reorganisations",
+ "revolutionizing", "revolutionising",
+ "sensationalized", "sensationalised",
+ "sensationalizes", "sensationalises",
+ "sentimentalized", "sentimentalised",
+ "sentimentalizes", "sentimentalises",
+ "specializations", "specialisations",
+ "standardization", "standardisation",
+ "synchronization", "synchronisation",
+ "systematization", "systematisation",
+ "aggrandizement", "aggrandisement",
+ "characterizing", "characterising",
+ "collectivizing", "collectivising",
+ "commercialized", "commercialised",
+ "commercializes", "commercialises",
+ "conceptualized", "conceptualised",
+ "conceptualizes", "conceptualises",
+ "contextualized", "contextualised",
+ "contextualizes", "contextualises",
+ "decentralizing", "decentralising",
+ "decriminalized", "decriminalised",
+ "decriminalizes", "decriminalises",
+ "dehumanization", "dehumanisation",
+ "demilitarizing", "demilitarising",
+ "demobilization", "demobilisation",
+ "demoralization", "demoralisation",
+ "denationalized", "denationalised",
+ "denationalizes", "denationalises",
+ "depersonalized", "depersonalised",
+ "depersonalizes", "depersonalises",
+ "dramatizations", "dramatisations",
+ "editorializing", "editorialising",
+ "fictionalizing", "fictionalising",
+ "fraternization", "fraternisation",
+ "generalization", "generalisation",
+ "immobilization", "immobilisation",
+ "individualized", "individualised",
+ "individualizes", "individualises",
+ "industrialized", "industrialised",
+ "industrializes", "industrialises",
+ "liberalization", "liberalisation",
+ "monopolization", "monopolisation",
+ "naturalization", "naturalisation",
+ "neighborliness", "neighbourliness",
+ "neutralization", "neutralisation",
+ "organizational", "organisational",
+ "outmaneuvering", "outmanoeuvring",
+ "overemphasized", "overemphasised",
+ "overemphasizes", "overemphasises",
+ "paleontologist", "palaeontologist",
+ "particularized", "particularised",
+ "particularizes", "particularises",
+ "pasteurization", "pasteurisation",
+ "pedestrianized", "pedestrianised",
+ "pedestrianizes", "pedestrianises",
+ "philosophizing", "philosophising",
+ "politicization", "politicisation",
+ "popularization", "popularisation",
+ "pressurization", "pressurisation",
+ "prioritization", "prioritisation",
+ "privatizations", "privatisations",
+ "propagandizing", "propagandising",
+ "psychoanalyzed", "psychoanalysed",
+ "psychoanalyzes", "psychoanalyses",
+ "reconnoitering", "reconnoitring",
+ "regularization", "regularisation",
+ "reorganization", "reorganisation",
+ "revolutionized", "revolutionised",
+ "revolutionizes", "revolutionises",
+ "secularization", "secularisation",
+ "sensationalize", "sensationalise",
+ "sentimentalize", "sentimentalise",
+ "serializations", "serialisations",
+ "specialization", "specialisation",
+ "sterilizations", "sterilisations",
+ "stigmatization", "stigmatisation",
+ "transistorized", "transistorised",
+ "unrecognizable", "unrecognisable",
+ "visualizations", "visualisations",
+ "westernization", "westernisation",
+ "accessorizing", "accessorising",
+ "acclimatizing", "acclimatising",
+ "amortizations", "amortisations",
+ "amphitheaters", "amphitheatres",
+ "anesthetizing", "anaesthetising",
+ "archeologists", "archaeologists",
+ "breathalyzers", "breathalysers",
+ "breathalyzing", "breathalysing",
+ "cannibalizing", "cannibalising",
+ "characterized", "characterised",
+ "characterizes", "characterises",
+ "circularizing", "circularising",
+ "collectivized", "collectivised",
+ "collectivizes", "collectivises",
+ "commercialize", "commercialise",
+ "computerizing", "computerising",
+ "conceptualize", "conceptualise",
+ "contextualize", "contextualise",
+ "criminalizing", "criminalising",
+ "crystallizing", "crystallising",
+ "decentralized", "decentralised",
+ "decentralizes", "decentralises",
+ "decriminalize", "decriminalise",
+ "demilitarized", "demilitarised",
+ "demilitarizes", "demilitarises",
+ "democratizing", "democratising",
+ "denationalize", "denationalise",
+ "depersonalize", "depersonalise",
+ "desensitizing", "desensitising",
+ "destabilizing", "destabilising",
+ "disemboweling", "disembowelling",
+ "dramatization", "dramatisation",
+ "editorialized", "editorialised",
+ "editorializes", "editorialises",
+ "extemporizing", "extemporising",
+ "externalizing", "externalising",
+ "familiarizing", "familiarising",
+ "fertilization", "fertilisation",
+ "fictionalized", "fictionalised",
+ "fictionalizes", "fictionalises",
+ "formalization", "formalisation",
+ "fossilization", "fossilisation",
+ "globalization", "globalisation",
+ "gynecological", "gynaecological",
+ "gynecologists", "gynaecologists",
+ "harmonization", "harmonisation",
+ "hematological", "haematological",
+ "hematologists", "haematologists",
+ "hospitalizing", "hospitalising",
+ "hypothesizing", "hypothesising",
+ "immortalizing", "immortalising",
+ "individualize", "individualise",
+ "industrialize", "industrialise",
+ "internalizing", "internalising",
+ "marginalizing", "marginalising",
+ "materializing", "materialising",
+ "mechanization", "mechanisation",
+ "memorializing", "memorialising",
+ "miniaturizing", "miniaturising",
+ "nationalizing", "nationalising",
+ "neighborhoods", "neighbourhoods",
+ "normalization", "normalisation",
+ "organizations", "organisations",
+ "outmaneuvered", "outmanoeuvred",
+ "overemphasize", "overemphasise",
+ "particularize", "particularise",
+ "passivization", "passivisation",
+ "patronizingly", "patronisingly",
+ "pedestrianize", "pedestrianise",
+ "pediatricians", "paediatricians",
+ "personalizing", "personalising",
+ "philosophized", "philosophised",
+ "philosophizes", "philosophises",
+ "privatization", "privatisation",
+ "propagandized", "propagandised",
+ "propagandizes", "propagandises",
+ "proselytizers", "proselytisers",
+ "proselytizing", "proselytising",
+ "psychoanalyze", "psychoanalyse",
+ "pulverization", "pulverisation",
+ "rationalizing", "rationalising",
+ "reconnoitered", "reconnoitred",
+ "revolutionize", "revolutionise",
+ "romanticizing", "romanticising",
+ "serialization", "serialisation",
+ "socialization", "socialisation",
+ "standardizing", "standardising",
+ "sterilization", "sterilisation",
+ "subsidization", "subsidisation",
+ "synchronizing", "synchronising",
+ "systematizing", "systematising",
+ "tantalizingly", "tantalisingly",
+ "underutilized", "underutilised",
+ "victimization", "victimisation",
+ "visualization", "visualisation",
+ "vocalizations", "vocalisations",
+ "vulgarization", "vulgarisation",
+ "accessorized", "accessorised",
+ "accessorizes", "accessorises",
+ "acclimatized", "acclimatised",
+ "acclimatizes", "acclimatises",
+ "amortization", "amortisation",
+ "amphitheater", "amphitheatre",
+ "anesthetists", "anaesthetists",
+ "anesthetized", "anaesthetised",
+ "anesthetizes", "anaesthetises",
+ "antagonizing", "antagonising",
+ "appetizingly", "appetisingly",
+ "archeologist", "archaeologist",
+ "backpedaling", "backpedalling",
+ "bastardizing", "bastardising",
+ "behaviorists", "behaviourists",
+ "bowdlerizing", "bowdlerising",
+ "breathalyzed", "breathalysed",
+ "breathalyzes", "breathalyses",
+ "cannibalized", "cannibalised",
+ "cannibalizes", "cannibalises",
+ "capitalizing", "capitalising",
+ "caramelizing", "caramelising",
+ "categorizing", "categorising",
+ "centerpieces", "centrepieces",
+ "centralizing", "centralising",
+ "characterize", "characterise",
+ "circularized", "circularised",
+ "circularizes", "circularises",
+ "clarinetists", "clarinettists",
+ "collectivize", "collectivise",
+ "colonization", "colonisation",
+ "computerized", "computerised",
+ "computerizes", "computerises",
+ "criminalized", "criminalised",
+ "criminalizes", "criminalises",
+ "crystallized", "crystallised",
+ "crystallizes", "crystallises",
+ "decentralize", "decentralise",
+ "dehumanizing", "dehumanising",
+ "demilitarize", "demilitarise",
+ "demobilizing", "demobilising",
+ "democratized", "democratised",
+ "democratizes", "democratises",
+ "demoralizing", "demoralising",
+ "desensitized", "desensitised",
+ "desensitizes", "desensitises",
+ "destabilized", "destabilised",
+ "destabilizes", "destabilises",
+ "disemboweled", "disembowelled",
+ "dishonorable", "dishonourable",
+ "dishonorably", "dishonourably",
+ "disorganized", "disorganised",
+ "editorialize", "editorialise",
+ "equalization", "equalisation",
+ "evangelizing", "evangelising",
+ "extemporized", "extemporised",
+ "extemporizes", "extemporises",
+ "externalized", "externalised",
+ "externalizes", "externalises",
+ "familiarized", "familiarised",
+ "familiarizes", "familiarises",
+ "fictionalize", "fictionalise",
+ "finalization", "finalisation",
+ "fraternizing", "fraternising",
+ "generalizing", "generalising",
+ "gynecologist", "gynaecologist",
+ "hematologist", "haematologist",
+ "hemophiliacs", "haemophiliacs",
+ "hemorrhaging", "haemorrhaging",
+ "homogenizing", "homogenising",
+ "hospitalized", "hospitalised",
+ "hospitalizes", "hospitalises",
+ "hypothesized", "hypothesised",
+ "hypothesizes", "hypothesises",
+ "idealization", "idealisation",
+ "immobilizers", "immobilisers",
+ "immobilizing", "immobilising",
+ "immortalized", "immortalised",
+ "immortalizes", "immortalises",
+ "immunization", "immunisation",
+ "initializing", "initialising",
+ "installments", "instalments",
+ "internalized", "internalised",
+ "internalizes", "internalises",
+ "jeopardizing", "jeopardising",
+ "legalization", "legalisation",
+ "legitimizing", "legitimising",
+ "liberalizing", "liberalising",
+ "maneuverable", "manoeuvrable",
+ "maneuverings", "manoeuvrings",
+ "marginalized", "marginalised",
+ "marginalizes", "marginalises",
+ "materialized", "materialised",
+ "materializes", "materialises",
+ "maximization", "maximisation",
+ "memorialized", "memorialised",
+ "memorializes", "memorialises",
+ "metabolizing", "metabolising",
+ "militarizing", "militarising",
+ "miniaturized", "miniaturised",
+ "miniaturizes", "miniaturises",
+ "miscataloged", "miscatalogued",
+ "misdemeanors", "misdemeanours",
+ "mobilization", "mobilisation",
+ "moisturizers", "moisturisers",
+ "moisturizing", "moisturising",
+ "monopolizing", "monopolising",
+ "multicolored", "multicoloured",
+ "nationalized", "nationalised",
+ "nationalizes", "nationalises",
+ "naturalizing", "naturalising",
+ "neighborhood", "neighbourhood",
+ "neutralizing", "neutralising",
+ "organization", "organisation",
+ "outmaneuvers", "outmanoeuvres",
+ "paleontology", "palaeontology",
+ "pasteurizing", "pasteurising",
+ "pediatrician", "paediatrician",
+ "personalized", "personalised",
+ "personalizes", "personalises",
+ "philosophize", "philosophise",
+ "plagiarizing", "plagiarising",
+ "polarization", "polarisation",
+ "politicizing", "politicising",
+ "popularizing", "popularising",
+ "pressurizing", "pressurising",
+ "prioritizing", "prioritising",
+ "propagandize", "propagandise",
+ "proselytized", "proselytised",
+ "proselytizer", "proselytiser",
+ "proselytizes", "proselytises",
+ "radicalizing", "radicalising",
+ "rationalized", "rationalised",
+ "rationalizes", "rationalises",
+ "realizations", "realisations",
+ "recognizable", "recognisable",
+ "recognizably", "recognisably",
+ "recognizance", "recognisance",
+ "reconnoiters", "reconnoitres",
+ "regularizing", "regularising",
+ "reorganizing", "reorganising",
+ "revitalizing", "revitalising",
+ "rhapsodizing", "rhapsodising",
+ "romanticized", "romanticised",
+ "romanticizes", "romanticises",
+ "scandalizing", "scandalising",
+ "scrutinizing", "scrutinising",
+ "secularizing", "secularising",
+ "standardized", "standardised",
+ "standardizes", "standardises",
+ "stigmatizing", "stigmatising",
+ "sympathizers", "sympathisers",
+ "sympathizing", "sympathising",
+ "synchronized", "synchronised",
+ "synchronizes", "synchronises",
+ "synthesizing", "synthesising",
+ "systematized", "systematised",
+ "systematizes", "systematises",
+ "theatergoers", "theatregoers",
+ "traumatizing", "traumatising",
+ "trivializing", "trivialising",
+ "unauthorized", "unauthorised",
+ "unionization", "unionisation",
+ "unrecognized", "unrecognised",
+ "urbanization", "urbanisation",
+ "vaporization", "vaporisation",
+ "vocalization", "vocalisation",
+ "westernizing", "westernising",
+ "accessorize", "accessorise",
+ "acclimatize", "acclimatise",
+ "agonizingly", "agonisingly",
+ "amortizable", "amortisable",
+ "anesthetics", "anaesthetics",
+ "anesthetist", "anaesthetist",
+ "anesthetize", "anaesthetise",
+ "anglicizing", "anglicising",
+ "antagonized", "antagonised",
+ "antagonizes", "antagonises",
+ "apologizing", "apologising",
+ "backpedaled", "backpedalled",
+ "bastardized", "bastardised",
+ "bastardizes", "bastardises",
+ "behaviorism", "behaviourism",
+ "behaviorist", "behaviourist",
+ "bowdlerized", "bowdlerised",
+ "bowdlerizes", "bowdlerises",
+ "brutalizing", "brutalising",
+ "cannibalize", "cannibalise",
+ "capitalized", "capitalised",
+ "capitalizes", "capitalises",
+ "caramelized", "caramelised",
+ "caramelizes", "caramelises",
+ "carbonizing", "carbonising",
+ "categorized", "categorised",
+ "categorizes", "categorises",
+ "cauterizing", "cauterising",
+ "centerfolds", "centrefolds",
+ "centerpiece", "centrepiece",
+ "centiliters", "centilitres",
+ "centimeters", "centimetres",
+ "centralized", "centralised",
+ "centralizes", "centralises",
+ "circularize", "circularise",
+ "clarinetist", "clarinettist",
+ "computerize", "computerise",
+ "criminalize", "criminalise",
+ "criticizing", "criticising",
+ "crystallize", "crystallise",
+ "customizing", "customising",
+ "defenseless", "defenceless",
+ "dehumanized", "dehumanised",
+ "dehumanizes", "dehumanises",
+ "demobilized", "demobilised",
+ "demobilizes", "demobilises",
+ "democratize", "democratise",
+ "demoralized", "demoralised",
+ "demoralizes", "demoralises",
+ "deodorizing", "deodorising",
+ "desensitize", "desensitise",
+ "destabilize", "destabilise",
+ "discoloring", "discolouring",
+ "dishonoring", "dishonouring",
+ "dramatizing", "dramatising",
+ "economizing", "economising",
+ "empathizing", "empathising",
+ "emphasizing", "emphasising",
+ "endeavoring", "endeavouring",
+ "epitomizing", "epitomising",
+ "esophaguses", "oesophaguses",
+ "evangelized", "evangelised",
+ "evangelizes", "evangelises",
+ "extemporize", "extemporise",
+ "externalize", "externalise",
+ "factorizing", "factorising",
+ "familiarize", "familiarise",
+ "fantasizing", "fantasising",
+ "fertilizers", "fertilisers",
+ "fertilizing", "fertilising",
+ "formalizing", "formalising",
+ "fossilizing", "fossilising",
+ "fraternized", "fraternised",
+ "fraternizes", "fraternises",
+ "fulfillment", "fulfilment",
+ "galvanizing", "galvanising",
+ "generalized", "generalised",
+ "generalizes", "generalises",
+ "ghettoizing", "ghettoising",
+ "globalizing", "globalising",
+ "harmonizing", "harmonising",
+ "hemophiliac", "haemophiliac",
+ "hemorrhaged", "haemorrhaged",
+ "hemorrhages", "haemorrhages",
+ "hemorrhoids", "haemorrhoids",
+ "homogenized", "homogenised",
+ "homogenizes", "homogenises",
+ "hospitalize", "hospitalise",
+ "hybridizing", "hybridising",
+ "hypnotizing", "hypnotising",
+ "hypothesize", "hypothesise",
+ "immobilized", "immobilised",
+ "immobilizer", "immobiliser",
+ "immobilizes", "immobilises",
+ "immortalize", "immortalise",
+ "initialized", "initialised",
+ "initializes", "initialises",
+ "installment", "instalment",
+ "internalize", "internalise",
+ "italicizing", "italicising",
+ "jeopardized", "jeopardised",
+ "jeopardizes", "jeopardises",
+ "legitimized", "legitimised",
+ "legitimizes", "legitimises",
+ "liberalized", "liberalised",
+ "liberalizes", "liberalises",
+ "lionization", "lionisation",
+ "liquidizers", "liquidisers",
+ "liquidizing", "liquidising",
+ "magnetizing", "magnetising",
+ "maneuvering", "manoeuvring",
+ "marginalize", "marginalise",
+ "marvelously", "marvellously",
+ "materialize", "materialise",
+ "mechanizing", "mechanising",
+ "memorialize", "memorialise",
+ "mesmerizing", "mesmerising",
+ "metabolized", "metabolised",
+ "metabolizes", "metabolises",
+ "militarized", "militarised",
+ "militarizes", "militarises",
+ "milliliters", "millilitres",
+ "millimeters", "millimetres",
+ "miniaturize", "miniaturise",
+ "misbehavior", "misbehaviour",
+ "misdemeanor", "misdemeanour",
+ "modernizing", "modernising",
+ "moisturized", "moisturised",
+ "moisturizer", "moisturiser",
+ "moisturizes", "moisturises",
+ "monopolized", "monopolised",
+ "monopolizes", "monopolises",
+ "nationalize", "nationalise",
+ "naturalized", "naturalised",
+ "naturalizes", "naturalises",
+ "neighboring", "neighbouring",
+ "neutralized", "neutralised",
+ "neutralizes", "neutralises",
+ "normalizing", "normalising",
+ "orthopedics", "orthopaedics",
+ "ostracizing", "ostracising",
+ "outmaneuver", "outmanoeuvre",
+ "oxidization", "oxidisation",
+ "pasteurized", "pasteurised",
+ "pasteurizes", "pasteurises",
+ "patronizing", "patronising",
+ "personalize", "personalise",
+ "plagiarized", "plagiarised",
+ "plagiarizes", "plagiarises",
+ "politicized", "politicised",
+ "politicizes", "politicises",
+ "popularized", "popularised",
+ "popularizes", "popularises",
+ "pressurized", "pressurised",
+ "pressurizes", "pressurises",
+ "prioritized", "prioritised",
+ "prioritizes", "prioritises",
+ "privatizing", "privatising",
+ "proselytize", "proselytise",
+ "publicizing", "publicising",
+ "pulverizing", "pulverising",
+ "radicalized", "radicalised",
+ "radicalizes", "radicalises",
+ "randomizing", "randomising",
+ "rationalize", "rationalise",
+ "realization", "realisation",
+ "recognizing", "recognising",
+ "reconnoiter", "reconnoitre",
+ "regularized", "regularised",
+ "regularizes", "regularises",
+ "reorganized", "reorganised",
+ "reorganizes", "reorganises",
+ "revitalized", "revitalised",
+ "revitalizes", "revitalises",
+ "rhapsodized", "rhapsodised",
+ "rhapsodizes", "rhapsodises",
+ "romanticize", "romanticise",
+ "scandalized", "scandalised",
+ "scandalizes", "scandalises",
+ "scrutinized", "scrutinised",
+ "scrutinizes", "scrutinises",
+ "secularized", "secularised",
+ "secularizes", "secularises",
+ "sensitizing", "sensitising",
+ "serializing", "serialising",
+ "sermonizing", "sermonising",
+ "signalizing", "signalising",
+ "skeptically", "sceptically",
+ "socializing", "socialising",
+ "solemnizing", "solemnising",
+ "specialized", "specialised",
+ "specializes", "specialises",
+ "squirreling", "squirrelling",
+ "stabilizers", "stabilisers",
+ "stabilizing", "stabilising",
+ "standardize", "standardise",
+ "sterilizers", "sterilisers",
+ "sterilizing", "sterilising",
+ "stigmatized", "stigmatised",
+ "stigmatizes", "stigmatises",
+ "subsidizers", "subsidisers",
+ "subsidizing", "subsidising",
+ "summarizing", "summarising",
+ "symbolizing", "symbolising",
+ "sympathized", "sympathised",
+ "sympathizer", "sympathiser",
+ "sympathizes", "sympathises",
+ "synchronize", "synchronise",
+ "synthesized", "synthesised",
+ "synthesizes", "synthesises",
+ "systematize", "systematise",
+ "tantalizing", "tantalising",
+ "temporizing", "temporising",
+ "tenderizing", "tenderising",
+ "terrorizing", "terrorising",
+ "theatergoer", "theatregoer",
+ "traumatized", "traumatised",
+ "traumatizes", "traumatises",
+ "trivialized", "trivialised",
+ "trivializes", "trivialises",
+ "tyrannizing", "tyrannising",
+ "uncataloged", "uncatalogued",
+ "uncivilized", "uncivilised",
+ "unfavorable", "unfavourable",
+ "unfavorably", "unfavourably",
+ "unorganized", "unorganised",
+ "untrammeled", "untrammelled",
+ "utilization", "utilisation",
+ "vandalizing", "vandalising",
+ "verbalizing", "verbalising",
+ "victimizing", "victimising",
+ "visualizing", "visualising",
+ "vulgarizing", "vulgarising",
+ "watercolors", "watercolours",
+ "westernized", "westernised",
+ "westernizes", "westernises",
+ "amortizing", "amortising",
+ "anesthesia", "anaesthesia",
+ "anesthetic", "anaesthetic",
+ "anglicized", "anglicised",
+ "anglicizes", "anglicises",
+ "annualized", "annualised",
+ "antagonize", "antagonise",
+ "apologized", "apologised",
+ "apologizes", "apologises",
+ "appetizers", "appetisers",
+ "appetizing", "appetising",
+ "archeology", "archaeology",
+ "authorizes", "authorises",
+ "bastardize", "bastardise",
+ "bedeviling", "bedevilling",
+ "behavioral", "behavioural",
+ "belaboring", "belabouring",
+ "bowdlerize", "bowdlerise",
+ "brutalized", "brutalised",
+ "brutalizes", "brutalises",
+ "canalizing", "canalising",
+ "canonizing", "canonising",
+ "capitalize", "capitalise",
+ "caramelize", "caramelise",
+ "carbonized", "carbonised",
+ "carbonizes", "carbonises",
+ "cataloging", "cataloguing",
+ "catalyzing", "catalysing",
+ "categorize", "categorise",
+ "cauterized", "cauterised",
+ "cauterizes", "cauterises",
+ "centerfold", "centrefold",
+ "centiliter", "centilitre",
+ "centimeter", "centimetre",
+ "centralize", "centralise",
+ "channeling", "channelling",
+ "checkbooks", "chequebooks",
+ "civilizing", "civilising",
+ "colonizers", "colonisers",
+ "colonizing", "colonising",
+ "colorfully", "colourfully",
+ "colorizing", "colourizing",
+ "councilors", "councillors",
+ "counselors", "counsellors",
+ "criticized", "criticised",
+ "criticizes", "criticises",
+ "customized", "customised",
+ "customizes", "customises",
+ "dehumanize", "dehumanise",
+ "demobilize", "demobilise",
+ "demonizing", "demonising",
+ "demoralize", "demoralise",
+ "deodorized", "deodorised",
+ "deodorizes", "deodorises",
+ "deputizing", "deputising",
+ "digitizing", "digitising",
+ "discolored", "discoloured",
+ "disheveled", "dishevelled",
+ "dishonored", "dishonoured",
+ "dramatized", "dramatised",
+ "dramatizes", "dramatises",
+ "economized", "economised",
+ "economizes", "economises",
+ "empathized", "empathised",
+ "empathizes", "empathises",
+ "emphasized", "emphasised",
+ "emphasizes", "emphasises",
+ "endeavored", "endeavoured",
+ "energizing", "energising",
+ "epicenters", "epicentres",
+ "epitomized", "epitomised",
+ "epitomizes", "epitomises",
+ "equalizers", "equalisers",
+ "equalizing", "equalising",
+ "eulogizing", "eulogising",
+ "evangelize", "evangelise",
+ "factorized", "factorised",
+ "factorizes", "factorises",
+ "fantasized", "fantasised",
+ "fantasizes", "fantasises",
+ "favoritism", "favouritism",
+ "feminizing", "feminising",
+ "fertilized", "fertilised",
+ "fertilizer", "fertiliser",
+ "fertilizes", "fertilises",
+ "fiberglass", "fibreglass",
+ "finalizing", "finalising",
+ "flavorings", "flavourings",
+ "flavorless", "flavourless",
+ "flavorsome", "flavoursome",
+ "formalized", "formalised",
+ "formalizes", "formalises",
+ "fossilized", "fossilised",
+ "fossilizes", "fossilises",
+ "fraternize", "fraternise",
+ "galvanized", "galvanised",
+ "galvanizes", "galvanises",
+ "generalize", "generalise",
+ "ghettoized", "ghettoised",
+ "ghettoizes", "ghettoises",
+ "globalized", "globalised",
+ "globalizes", "globalises",
+ "gruelingly", "gruellingly",
+ "gynecology", "gynaecology",
+ "harmonized", "harmonised",
+ "harmonizes", "harmonises",
+ "hematology", "haematology",
+ "hemoglobin", "haemoglobin",
+ "hemophilia", "haemophilia",
+ "hemorrhage", "haemorrhage",
+ "homogenize", "homogenise",
+ "humanizing", "humanising",
+ "hybridized", "hybridised",
+ "hybridizes", "hybridises",
+ "hypnotized", "hypnotised",
+ "hypnotizes", "hypnotises",
+ "idealizing", "idealising",
+ "immobilize", "immobilise",
+ "immunizing", "immunising",
+ "impaneling", "impanelling",
+ "imperiling", "imperilling",
+ "initialing", "initialling",
+ "initialize", "initialise",
+ "ionization", "ionisation",
+ "italicized", "italicised",
+ "italicizes", "italicises",
+ "jeopardize", "jeopardise",
+ "kilometers", "kilometres",
+ "lackluster", "lacklustre",
+ "legalizing", "legalising",
+ "legitimize", "legitimise",
+ "liberalize", "liberalise",
+ "liquidized", "liquidised",
+ "liquidizer", "liquidiser",
+ "liquidizes", "liquidises",
+ "localizing", "localising",
+ "magnetized", "magnetised",
+ "magnetizes", "magnetises",
+ "maneuvered", "manoeuvred",
+ "marshaling", "marshalling",
+ "maximizing", "maximising",
+ "mechanized", "mechanised",
+ "mechanizes", "mechanises",
+ "memorizing", "memorising",
+ "mesmerized", "mesmerised",
+ "mesmerizes", "mesmerises",
+ "metabolize", "metabolise",
+ "militarize", "militarise",
+ "milliliter", "millilitre",
+ "millimeter", "millimetre",
+ "minimizing", "minimising",
+ "mobilizing", "mobilising",
+ "modernized", "modernised",
+ "modernizes", "modernises",
+ "moisturize", "moisturise",
+ "monopolize", "monopolise",
+ "moralizing", "moralising",
+ "naturalize", "naturalise",
+ "neighborly", "neighbourly",
+ "neutralize", "neutralise",
+ "normalized", "normalised",
+ "normalizes", "normalises",
+ "optimizing", "optimising",
+ "organizers", "organisers",
+ "organizing", "organising",
+ "orthopedic", "orthopaedic",
+ "ostracized", "ostracised",
+ "ostracizes", "ostracises",
+ "paralyzing", "paralysing",
+ "pasteurize", "pasteurise",
+ "patronized", "patronised",
+ "patronizes", "patronises",
+ "pedophiles", "paedophiles",
+ "pedophilia", "paedophilia",
+ "penalizing", "penalising",
+ "plagiarize", "plagiarise",
+ "plowshares", "ploughshares",
+ "polarizing", "polarising",
+ "politicize", "politicise",
+ "popularize", "popularise",
+ "prioritize", "prioritise",
+ "privatized", "privatised",
+ "privatizes", "privatises",
+ "publicized", "publicised",
+ "publicizes", "publicises",
+ "pulverized", "pulverised",
+ "pulverizes", "pulverises",
+ "quarreling", "quarrelling",
+ "radicalize", "radicalise",
+ "randomized", "randomised",
+ "randomizes", "randomises",
+ "realizable", "realisable",
+ "recognized", "recognised",
+ "recognizes", "recognises",
+ "regularize", "regularise",
+ "remodeling", "remodelling",
+ "reorganize", "reorganise",
+ "revitalize", "revitalise",
+ "rhapsodize", "rhapsodise",
+ "ritualized", "ritualised",
+ "sanitizing", "sanitising",
+ "satirizing", "satirising",
+ "scandalize", "scandalise",
+ "scrutinize", "scrutinise",
+ "secularize", "secularise",
+ "sensitized", "sensitised",
+ "sensitizes", "sensitises",
+ "sepulchers", "sepulchres",
+ "serialized", "serialised",
+ "serializes", "serialises",
+ "sermonized", "sermonised",
+ "sermonizes", "sermonises",
+ "shriveling", "shrivelling",
+ "signalized", "signalised",
+ "signalizes", "signalises",
+ "skepticism", "scepticism",
+ "socialized", "socialised",
+ "socializes", "socialises",
+ "sodomizing", "sodomising",
+ "solemnized", "solemnised",
+ "solemnizes", "solemnises",
+ "specialize", "specialise",
+ "squirreled", "squirrelled",
+ "stabilized", "stabilised",
+ "stabilizer", "stabiliser",
+ "stabilizes", "stabilises",
+ "stenciling", "stencilling",
+ "sterilized", "sterilised",
+ "sterilizer", "steriliser",
+ "sterilizes", "sterilises",
+ "stigmatize", "stigmatise",
+ "subsidized", "subsidised",
+ "subsidizer", "subsidiser",
+ "subsidizes", "subsidises",
+ "summarized", "summarised",
+ "summarizes", "summarises",
+ "symbolized", "symbolised",
+ "symbolizes", "symbolises",
+ "sympathize", "sympathise",
+ "tantalized", "tantalised",
+ "tantalizes", "tantalises",
+ "temporized", "temporised",
+ "temporizes", "temporises",
+ "tenderized", "tenderised",
+ "tenderizes", "tenderises",
+ "terrorized", "terrorised",
+ "terrorizes", "terrorises",
+ "theorizing", "theorising",
+ "traumatize", "traumatise",
+ "trivialize", "trivialise",
+ "tyrannized", "tyrannised",
+ "tyrannizes", "tyrannises",
+ "unionizing", "unionising",
+ "unraveling", "unravelling",
+ "urbanizing", "urbanising",
+ "utilizable", "utilisable",
+ "vandalized", "vandalised",
+ "vandalizes", "vandalises",
+ "vaporizing", "vaporising",
+ "verbalized", "verbalised",
+ "verbalizes", "verbalises",
+ "victimized", "victimised",
+ "victimizes", "victimises",
+ "visualized", "visualised",
+ "visualizes", "visualises",
+ "vocalizing", "vocalising",
+ "vulcanized", "vulcanised",
+ "vulgarized", "vulgarised",
+ "vulgarizes", "vulgarises",
+ "watercolor", "watercolour",
+ "westernize", "westernise",
+ "womanizers", "womanisers",
+ "womanizing", "womanising",
+ "worshiping", "worshipping",
+ "agonizing", "agonising",
+ "airplanes", "aeroplanes",
+ "amortized", "amortised",
+ "amortizes", "amortises",
+ "analyzing", "analysing",
+ "apologize", "apologise",
+ "appetizer", "appetiser",
+ "artifacts", "artefacts",
+ "baptizing", "baptising",
+ "bedeviled", "bedevilled",
+ "behaviors", "behaviours",
+ "bejeweled", "bejewelled",
+ "belabored", "belaboured",
+ "brutalize", "brutalise",
+ "canalized", "canalised",
+ "canalizes", "canalises",
+ "canonized", "canonised",
+ "canonizes", "canonises",
+ "carbonize", "carbonise",
+ "cataloged", "catalogued",
+ "catalyzed", "catalysed",
+ "catalyzes", "catalyses",
+ "cauterize", "cauterise",
+ "channeled", "channelled",
+ "checkbook", "chequebook",
+ "checkered", "chequered",
+ "chiseling", "chiselling",
+ "civilized", "civilised",
+ "civilizes", "civilises",
+ "clamoring", "clamouring",
+ "colonized", "colonised",
+ "colonizer", "coloniser",
+ "colonizes", "colonises",
+ "colorants", "colourants",
+ "colorized", "colourized",
+ "colorizes", "colourizes",
+ "colorless", "colourless",
+ "councilor", "councillor",
+ "counseled", "counselled",
+ "counselor", "counsellor",
+ "criticize", "criticise",
+ "cudgeling", "cudgelling",
+ "customize", "customise",
+ "demonized", "demonised",
+ "demonizes", "demonises",
+ "deodorize", "deodorise",
+ "deputized", "deputised",
+ "deputizes", "deputises",
+ "digitized", "digitised",
+ "digitizes", "digitises",
+ "discolors", "discolours",
+ "dishonors", "dishonours",
+ "dramatize", "dramatise",
+ "driveling", "drivelling",
+ "economize", "economise",
+ "empathize", "empathise",
+ "emphasize", "emphasise",
+ "enameling", "enamelling",
+ "endeavors", "endeavours",
+ "energized", "energised",
+ "energizes", "energises",
+ "enthralls", "enthrals",
+ "epicenter", "epicentre",
+ "epitomize", "epitomise",
+ "equalized", "equalised",
+ "equalizer", "equaliser",
+ "equalizes", "equalises",
+ "eulogized", "eulogised",
+ "eulogizes", "eulogises",
+ "factorize", "factorise",
+ "fantasize", "fantasise",
+ "favorable", "favourable",
+ "favorably", "favourably",
+ "favorites", "favourites",
+ "feminized", "feminised",
+ "feminizes", "feminises",
+ "fertilize", "fertilise",
+ "finalized", "finalised",
+ "finalizes", "finalises",
+ "flavoring", "flavouring",
+ "formalize", "formalise",
+ "fossilize", "fossilise",
+ "funneling", "funnelling",
+ "galvanize", "galvanise",
+ "gamboling", "gambolling",
+ "ghettoize", "ghettoise",
+ "globalize", "globalise",
+ "gonorrhea", "gonorrhoea",
+ "groveling", "grovelling",
+ "harboring", "harbouring",
+ "harmonize", "harmonise",
+ "honorably", "honourably",
+ "humanized", "humanised",
+ "humanizes", "humanises",
+ "hybridize", "hybridise",
+ "hypnotize", "hypnotise",
+ "idealized", "idealised",
+ "idealizes", "idealises",
+ "idolizing", "idolising",
+ "immunized", "immunised",
+ "immunizes", "immunises",
+ "impaneled", "impanelled",
+ "imperiled", "imperilled",
+ "initialed", "initialled",
+ "italicize", "italicise",
+ "itemizing", "itemising",
+ "kilometer", "kilometre",
+ "legalized", "legalised",
+ "legalizes", "legalises",
+ "lionizing", "lionising",
+ "liquidize", "liquidise",
+ "localized", "localised",
+ "localizes", "localises",
+ "magnetize", "magnetise",
+ "maneuvers", "manoeuvres",
+ "marshaled", "marshalled",
+ "marveling", "marvelling",
+ "marvelous", "marvellous",
+ "maximized", "maximised",
+ "maximizes", "maximises",
+ "mechanize", "mechanise",
+ "memorized", "memorised",
+ "memorizes", "memorises",
+ "mesmerize", "mesmerise",
+ "minimized", "minimised",
+ "minimizes", "minimises",
+ "mobilized", "mobilised",
+ "mobilizes", "mobilises",
+ "modernize", "modernise",
+ "moldering", "mouldering",
+ "moralized", "moralised",
+ "moralizes", "moralises",
+ "motorized", "motorised",
+ "mustached", "moustached",
+ "mustaches", "moustaches",
+ "neighbors", "neighbours",
+ "normalize", "normalise",
+ "optimized", "optimised",
+ "optimizes", "optimises",
+ "organized", "organised",
+ "organizer", "organiser",
+ "organizes", "organises",
+ "ostracize", "ostracise",
+ "oxidizing", "oxidising",
+ "panelists", "panellists",
+ "paralyzed", "paralysed",
+ "paralyzes", "paralyses",
+ "parceling", "parcelling",
+ "patronize", "patronise",
+ "pedophile", "paedophile",
+ "penalized", "penalised",
+ "penalizes", "penalises",
+ "penciling", "pencilling",
+ "plowshare", "ploughshare",
+ "polarized", "polarised",
+ "polarizes", "polarises",
+ "practiced", "practised",
+ "pretenses", "pretences",
+ "privatize", "privatise",
+ "publicize", "publicise",
+ "pulverize", "pulverise",
+ "quarreled", "quarrelled",
+ "randomize", "randomise",
+ "realizing", "realising",
+ "recognize", "recognise",
+ "refueling", "refuelling",
+ "remodeled", "remodelled",
+ "remolding", "remoulding",
+ "saltpeter", "saltpetre",
+ "sanitized", "sanitised",
+ "sanitizes", "sanitises",
+ "satirized", "satirised",
+ "satirizes", "satirises",
+ "sensitize", "sensitise",
+ "sepulcher", "sepulchre",
+ "serialize", "serialise",
+ "sermonize", "sermonise",
+ "shoveling", "shovelling",
+ "shriveled", "shrivelled",
+ "signaling", "signalling",
+ "signalize", "signalise",
+ "skeptical", "sceptical",
+ "sniveling", "snivelling",
+ "snorkeled", "snorkelled",
+ "socialize", "socialise",
+ "sodomized", "sodomised",
+ "sodomizes", "sodomises",
+ "solemnize", "solemnise",
+ "spiraling", "spiralling",
+ "splendors", "splendours",
+ "stabilize", "stabilise",
+ "stenciled", "stencilled",
+ "sterilize", "sterilise",
+ "subsidize", "subsidise",
+ "succoring", "succouring",
+ "sulfurous", "sulphurous",
+ "summarize", "summarise",
+ "swiveling", "swivelling",
+ "symbolize", "symbolise",
+ "tantalize", "tantalise",
+ "temporize", "temporise",
+ "tenderize", "tenderise",
+ "terrorize", "terrorise",
+ "theorized", "theorised",
+ "theorizes", "theorises",
+ "travelers", "travellers",
+ "traveling", "travelling",
+ "tricolors", "tricolours",
+ "tunneling", "tunnelling",
+ "tyrannize", "tyrannise",
+ "unequaled", "unequalled",
+ "unionized", "unionised",
+ "unionizes", "unionises",
+ "unraveled", "unravelled",
+ "unrivaled", "unrivalled",
+ "urbanized", "urbanised",
+ "urbanizes", "urbanises",
+ "utilizing", "utilising",
+ "vandalize", "vandalise",
+ "vaporized", "vaporised",
+ "vaporizes", "vaporises",
+ "verbalize", "verbalise",
+ "victimize", "victimise",
+ "visualize", "visualise",
+ "vocalized", "vocalised",
+ "vocalizes", "vocalises",
+ "vulgarize", "vulgarise",
+ "weaseling", "weaselling",
+ "womanized", "womanised",
+ "womanizer", "womaniser",
+ "womanizes", "womanises",
+ "worshiped", "worshipped",
+ "worshiper", "worshipper",
+ "agonized", "agonised",
+ "agonizes", "agonises",
+ "airplane", "aeroplane",
+ "aluminum", "aluminium",
+ "amortize", "amortise",
+ "analyzed", "analysed",
+ "analyzes", "analyses",
+ "armorers", "armourers",
+ "armories", "armouries",
+ "artifact", "artefact",
+ "baptized", "baptised",
+ "baptizes", "baptises",
+ "behavior", "behaviour",
+ "behooved", "behoved",
+ "behooves", "behoves",
+ "belabors", "belabours",
+ "calibers", "calibres",
+ "canalize", "canalise",
+ "canonize", "canonise",
+ "catalogs", "catalogues",
+ "catalyze", "catalyse",
+ "caviling", "cavilling",
+ "centered", "centred",
+ "chiseled", "chiselled",
+ "civilize", "civilise",
+ "clamored", "clamoured",
+ "colonize", "colonise",
+ "colorant", "colourant",
+ "coloreds", "coloureds",
+ "colorful", "colourful",
+ "coloring", "colouring",
+ "colorize", "colourize",
+ "coziness", "cosiness",
+ "cruelest", "cruellest",
+ "cudgeled", "cudgelled",
+ "defenses", "defences",
+ "demeanor", "demeanour",
+ "demonize", "demonise",
+ "deputize", "deputise",
+ "diarrhea", "diarrhoea",
+ "digitize", "digitise",
+ "disfavor", "disfavour",
+ "dishonor", "dishonour",
+ "distills", "distils",
+ "driveled", "drivelled",
+ "enameled", "enamelled",
+ "enamored", "enamoured",
+ "endeavor", "endeavour",
+ "energize", "energise",
+ "epaulets", "epaulettes",
+ "equalize", "equalise",
+ "estrogen", "oestrogen",
+ "etiology", "aetiology",
+ "eulogize", "eulogise",
+ "favoring", "favouring",
+ "favorite", "favourite",
+ "feminize", "feminise",
+ "finalize", "finalise",
+ "flavored", "flavoured",
+ "flutists", "flautists",
+ "fulfills", "fulfils",
+ "funneled", "funnelled",
+ "gamboled", "gambolled",
+ "graveled", "gravelled",
+ "groveled", "grovelled",
+ "grueling", "gruelling",
+ "harbored", "harboured",
+ "honoring", "honouring",
+ "humanize", "humanise",
+ "humoring", "humouring",
+ "idealize", "idealise",
+ "idolized", "idolised",
+ "idolizes", "idolises",
+ "immunize", "immunise",
+ "ionizing", "ionising",
+ "itemized", "itemised",
+ "itemizes", "itemises",
+ "jewelers", "jewellers",
+ "labeling", "labelling",
+ "laborers", "labourers",
+ "laboring", "labouring",
+ "legalize", "legalise",
+ "leukemia", "leukaemia",
+ "levelers", "levellers",
+ "leveling", "levelling",
+ "libeling", "libelling",
+ "libelous", "libellous",
+ "lionized", "lionised",
+ "lionizes", "lionises",
+ "localize", "localise",
+ "louvered", "louvred",
+ "maneuver", "manoeuvre",
+ "marveled", "marvelled",
+ "maximize", "maximise",
+ "memorize", "memorise",
+ "minimize", "minimise",
+ "mobilize", "mobilise",
+ "modelers", "modellers",
+ "modeling", "modelling",
+ "moldered", "mouldered",
+ "moldiest", "mouldiest",
+ "moldings", "mouldings",
+ "moralize", "moralise",
+ "mustache", "moustache",
+ "neighbor", "neighbour",
+ "odorless", "odourless",
+ "offenses", "offences",
+ "optimize", "optimise",
+ "organize", "organise",
+ "oxidized", "oxidised",
+ "oxidizes", "oxidises",
+ "paneling", "panelling",
+ "panelist", "panellist",
+ "paralyze", "paralyse",
+ "parceled", "parcelled",
+ "pedaling", "pedalling",
+ "penalize", "penalise",
+ "penciled", "pencilled",
+ "polarize", "polarise",
+ "pretense", "pretence",
+ "pummeled", "pummelling",
+ "raveling", "ravelling",
+ "realized", "realised",
+ "realizes", "realises",
+ "refueled", "refuelled",
+ "remolded", "remoulded",
+ "revelers", "revellers",
+ "reveling", "revelling",
+ "rivaling", "rivalling",
+ "sanitize", "sanitise",
+ "satirize", "satirise",
+ "savories", "savouries",
+ "savoring", "savouring",
+ "scepters", "sceptres",
+ "shoveled", "shovelled",
+ "signaled", "signalled",
+ "skeptics", "sceptics",
+ "sniveled", "snivelled",
+ "sodomize", "sodomise",
+ "specters", "spectres",
+ "spiraled", "spiralled",
+ "splendor", "splendour",
+ "succored", "succoured",
+ "sulfates", "sulphates",
+ "sulfides", "sulphides",
+ "swiveled", "swivelled",
+ "tasseled", "tasselled",
+ "theaters", "theatres",
+ "theorize", "theorise",
+ "toweling", "towelling",
+ "traveler", "traveller",
+ "trialing", "trialling",
+ "tricolor", "tricolour",
+ "tunneled", "tunnelled",
+ "unionize", "unionise",
+ "unsavory", "unsavoury",
+ "urbanize", "urbanise",
+ "utilized", "utilised",
+ "utilizes", "utilises",
+ "vaporize", "vaporise",
+ "vocalize", "vocalise",
+ "weaseled", "weaselled",
+ "womanize", "womanise",
+ "yodeling", "yodelling",
+ "agonize", "agonise",
+ "analyze", "analyse",
+ "appalls", "appals",
+ "armored", "armoured",
+ "armorer", "armourer",
+ "baptize", "baptise",
+ "behoove", "behove",
+ "belabor", "belabour",
+ "beveled", "bevelled",
+ "caliber", "calibre",
+ "caroled", "carolled",
+ "caviled", "cavilled",
+ "centers", "centres",
+ "clamors", "clamours",
+ "clangor", "clangour",
+ "colored", "coloured",
+ "coziest", "cosiest",
+ "crueler", "crueller",
+ "defense", "defence",
+ "dialing", "dialling",
+ "dialogs", "dialogues",
+ "distill", "distil",
+ "dueling", "duelling",
+ "enrolls", "enrols",
+ "epaulet", "epaulette",
+ "favored", "favoured",
+ "flavors", "flavours",
+ "flutist", "flautist",
+ "fueling", "fuelling",
+ "fulfill", "fulfil",
+ "goiters", "goitres",
+ "harbors", "harbours",
+ "honored", "honoured",
+ "humored", "humoured",
+ "idolize", "idolise",
+ "ionized", "ionised",
+ "ionizes", "ionises",
+ "itemize", "itemise",
+ "jeweled", "jewelled",
+ "jeweler", "jeweller",
+ "jewelry", "jewellery",
+ "labeled", "labelled",
+ "labored", "laboured",
+ "laborer", "labourer",
+ "leveled", "levelled",
+ "leveler", "leveller",
+ "libeled", "libelled",
+ "lionize", "lionise",
+ "louvers", "louvres",
+ "modeled", "modelled",
+ "modeler", "modeller",
+ "molders", "moulders",
+ "moldier", "mouldier",
+ "molding", "moulding",
+ "molting", "moulting",
+ "offense", "offence",
+ "oxidize", "oxidise",
+ "pajamas", "pyjamas",
+ "paneled", "panelled",
+ "parlors", "parlours",
+ "pedaled", "pedalled",
+ "plowing", "ploughing",
+ "plowman", "ploughman",
+ "plowmen", "ploughmen",
+ "realize", "realise",
+ "remolds", "remoulds",
+ "reveled", "revelled",
+ "reveler", "reveller",
+ "rivaled", "rivalled",
+ "rumored", "rumoured",
+ "saviors", "saviours",
+ "savored", "savoured",
+ "scepter", "sceptre",
+ "skeptic", "sceptic",
+ "specter", "spectre",
+ "succors", "succours",
+ "sulfate", "sulphate",
+ "sulfide", "sulphide",
+ "theater", "theatre",
+ "toweled", "towelled",
+ "toxemia", "toxaemia",
+ "trialed", "trialled",
+ "utilize", "utilise",
+ "yodeled", "yodelled",
+ "anemia", "anaemia",
+ "anemic", "anaemic",
+ "appall", "appal",
+ "arbors", "arbours",
+ "armory", "armoury",
+ "candor", "candour",
+ "center", "centre",
+ "clamor", "clamour",
+ "colors", "colours",
+ "cozier", "cosier",
+ "cozies", "cosies",
+ "cozily", "cosily",
+ "dialed", "dialled",
+ "drafty", "draughty",
+ "dueled", "duelled",
+ "favors", "favours",
+ "fervor", "fervour",
+ "fibers", "fibres",
+ "flavor", "flavour",
+ "fueled", "fuelled",
+ "goiter", "goitre",
+ "harbor", "harbour",
+ "honors", "honours",
+ "humors", "humours",
+ "labors", "labours",
+ "liters", "litres",
+ "louver", "louvre",
+ "luster", "lustre",
+ "meager", "meagre",
+ "miters", "mitres",
+ "molded", "moulded",
+ "molder", "moulder",
+ "molted", "moulted",
+ "pajama", "pyjama",
+ "parlor", "parlour",
+ "plowed", "ploughed",
+ "rancor", "rancour",
+ "remold", "remould",
+ "rigors", "rigours",
+ "rumors", "rumours",
+ "savors", "savours",
+ "savory", "savoury",
+ "succor", "succour",
+ "tumors", "tumours",
+ "vapors", "vapours",
+ "aging", "ageing",
+ "arbor", "arbour",
+ "ardor", "ardour",
+ "armor", "armour",
+ "chili", "chilli",
+ "color", "colour",
+ "edema", "edoema",
+ "favor", "favour",
+ "fecal", "faecal",
+ "feces", "faeces",
+ "fiber", "fibre",
+ "honor", "honour",
+ "humor", "humour",
+ "labor", "labour",
+ "liter", "litre",
+ "miter", "mitre",
+ "molds", "moulds",
+ "moldy", "mouldy",
+ "molts", "moults",
+ "odors", "odours",
+ "plows", "ploughs",
+ "rigor", "rigour",
+ "rumor", "rumour",
+ "savor", "savour",
+ "valor", "valour",
+ "vapor", "vapour",
+ "vigor", "vigour",
+ "cozy", "cosy",
+ "mold", "mould",
+ "molt", "moult",
+ "odor", "odour",
+ "plow", "plough",
+}
diff --git a/vendor/github.com/golangci/prealloc/LICENSE b/vendor/github.com/golangci/prealloc/LICENSE
new file mode 100644
index 000000000..9310fbcff
--- /dev/null
+++ b/vendor/github.com/golangci/prealloc/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Alex Kohler
+
+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.
diff --git a/vendor/github.com/golangci/prealloc/README.md b/vendor/github.com/golangci/prealloc/README.md
new file mode 100644
index 000000000..162ede3ba
--- /dev/null
+++ b/vendor/github.com/golangci/prealloc/README.md
@@ -0,0 +1,198 @@
+# prealloc
+
+prealloc is a Go static analysis tool to find slice declarations that could potentially be preallocated.
+
+## Installation
+
+ go get -u github.com/alexkohler/prealloc
+
+## Usage
+
+Similar to other Go static analysis tools (such as golint, go vet), prealloc can be invoked with one or more filenames, directories, or packages named by its import path. Prealloc also supports the `...` wildcard.
+
+ prealloc [flags] files/directories/packages
+
+### Flags
+- **-simple** (default true) - Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. Setting this to false may increase false positives.
+- **-rangeloops** (default true) - Report preallocation suggestions on range loops.
+- **-forloops** (default false) - Report preallocation suggestions on for loops. This is false by default due to there generally being weirder things happening inside for loops (at least from what I've observed in the Standard Library).
+- **-set_exit_status** (default false) - Set exit status to 1 if any issues are found.
+
+## Purpose
+
+While the [Go *does* attempt to avoid reallocation by growing the capacity in advance](https://github.com/golang/go/blob/87e48c5afdcf5e01bb2b7f51b7643e8901f4b7f9/src/runtime/slice.go#L100-L112), this sometimes isn't enough for longer slices. If the size of a slice is known at the time of its creation, it should be specified.
+
+Consider the following benchmark: (this can be found in prealloc_test.go in this repo)
+
+```Go
+import "testing"
+
+func BenchmarkNoPreallocate(b *testing.B) {
+ existing := make([]int64, 10, 10)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ // Don't preallocate our initial slice
+ var init []int64
+ for _, element := range existing {
+ init = append(init, element)
+ }
+ }
+}
+
+func BenchmarkPreallocate(b *testing.B) {
+ existing := make([]int64, 10, 10)
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ // Preallocate our initial slice
+ init := make([]int64, 0, len(existing))
+ for _, element := range existing {
+ init = append(init, element)
+ }
+ }
+}
+```
+
+```Bash
+$ go test -bench=. -benchmem
+goos: linux
+goarch: amd64
+BenchmarkNoPreallocate-4 3000000 510 ns/op 248 B/op 5 allocs/op
+BenchmarkPreallocate-4 20000000 111 ns/op 80 B/op 1 allocs/op
+```
+
+As you can see, not preallocating can cause a performance hit, primarily due to Go having to reallocate the underlying array. The pattern benchmarked above is common in Go: declare a slice, then write some sort of range or for loop that appends or indexes into it. The purpose of this tool is to flag slice/loop declarations like the one in `BenchmarkNoPreallocate`.
+
+## Example
+
+Some examples from the Go 1.9.2 source:
+
+```Bash
+$ prealloc go/src/....
+archive/tar/reader_test.go:854 Consider preallocating ss
+archive/zip/zip_test.go:201 Consider preallocating all
+cmd/api/goapi.go:301 Consider preallocating missing
+cmd/api/goapi.go:476 Consider preallocating files
+cmd/asm/internal/asm/endtoend_test.go:345 Consider preallocating extra
+cmd/cgo/main.go:60 Consider preallocating ks
+cmd/cgo/ast.go:149 Consider preallocating pieces
+cmd/compile/internal/ssa/flagalloc.go:64 Consider preallocating oldSched
+cmd/compile/internal/ssa/regalloc.go:719 Consider preallocating phis
+cmd/compile/internal/ssa/regalloc.go:718 Consider preallocating oldSched
+cmd/compile/internal/ssa/regalloc.go:1674 Consider preallocating oldSched
+cmd/compile/internal/ssa/gen/rulegen.go:145 Consider preallocating ops
+cmd/compile/internal/ssa/gen/rulegen.go:145 Consider preallocating ops
+cmd/dist/build.go:893 Consider preallocating all
+cmd/dist/build.go:1246 Consider preallocating plats
+cmd/dist/build.go:1264 Consider preallocating results
+cmd/dist/buildgo.go:59 Consider preallocating list
+cmd/doc/pkg.go:363 Consider preallocating names
+cmd/fix/typecheck.go:219 Consider preallocating b
+cmd/go/internal/base/path.go:34 Consider preallocating out
+cmd/go/internal/get/get.go:175 Consider preallocating out
+cmd/go/internal/load/pkg.go:1894 Consider preallocating dirent
+cmd/go/internal/work/build.go:2402 Consider preallocating absOfiles
+cmd/go/internal/work/build.go:2731 Consider preallocating absOfiles
+cmd/internal/objfile/pe.go:48 Consider preallocating syms
+cmd/internal/objfile/pe.go:38 Consider preallocating addrs
+cmd/internal/objfile/goobj.go:43 Consider preallocating syms
+cmd/internal/objfile/elf.go:35 Consider preallocating syms
+cmd/link/internal/ld/lib.go:1070 Consider preallocating argv
+cmd/vet/all/main.go:91 Consider preallocating pp
+database/sql/sql.go:66 Consider preallocating list
+debug/macho/file.go:506 Consider preallocating all
+internal/trace/order.go:55 Consider preallocating batches
+mime/quotedprintable/reader_test.go:191 Consider preallocating outcomes
+net/dnsclient_unix_test.go:954 Consider preallocating confLines
+net/interface_solaris.go:85 Consider preallocating ifat
+net/interface_linux_test.go:91 Consider preallocating ifmat4
+net/interface_linux_test.go:100 Consider preallocating ifmat6
+net/internal/socktest/switch.go:34 Consider preallocating st
+os/os_windows_test.go:766 Consider preallocating args
+runtime/pprof/internal/profile/filter.go:77 Consider preallocating lines
+runtime/pprof/internal/profile/profile.go:554 Consider preallocating names
+text/template/parse/node.go:189 Consider preallocating decl
+```
+
+```Go
+// cmd/api/goapi.go:301
+var missing []string
+for feature := range optionalSet {
+ missing = append(missing, feature)
+}
+
+// cmd/fix/typecheck.go:219
+var b []ast.Expr
+for _, x := range a {
+ b = append(b, x)
+}
+
+// net/internal/socktest/switch.go:34
+var st []Stat
+sw.smu.RLock()
+for _, s := range sw.stats {
+ ns := *s
+ st = append(st, ns)
+}
+sw.smu.RUnlock()
+
+// cmd/api/goapi.go:301
+var missing []string
+for feature := range optionalSet {
+ missing = append(missing, feature)
+}
+```
+
+Even if the size the slice is being preallocated to is small, there's still a performance gain to be had in explicitly specifying the capacity rather than leaving it up to `append` to discover that it needs to preallocate. Of course, preallocation doesn't need to be done *everywhere*. This tool's job is just to help suggest places where one should consider preallocating.
+
+## How do I fix prealloc's suggestions?
+
+During the declaration of your slice, rather than using the zero value of the slice with `var`, initialize it with Go's built-in `make` function, passing the appropriate type and length. This length will generally be whatever you are ranging over. Fixing the examples from above would look like so:
+
+```Go
+// cmd/api/goapi.go:301
+missing := make([]string, 0, len(optionalSet))
+for feature := range optionalSet {
+ missing = append(missing, feature)
+}
+
+// cmd/fix/typecheck.go:219
+b := make([]ast.Expr, 0, len(a))
+for _, x := range a {
+ b = append(b, x)
+}
+
+// net/internal/socktest/switch.go:34
+st := make([]Stat, 0, len(sw.stats))
+sw.smu.RLock()
+for _, s := range sw.stats {
+ ns := *s
+ st = append(st, ns)
+}
+sw.smu.RUnlock()
+
+// cmd/api/goapi.go:301
+missing := make ([]string, 0, len(optionalSet))
+for feature := range optionalSet {
+ missing = append(missing, feature)
+}
+```
+
+
+
+## TODO
+
+- Configuration on whether or not to run on test files
+- Support for embedded ifs (currently, prealloc will only find breaks/returns/continues/gotos if they are in a single if block, I'd like to expand this to supporting multiple if blocks in the future).
+- Globbing support (e.g. prealloc *.go)
+
+
+## Contributing
+
+Pull requests welcome!
+
+
+## Other static analysis tools
+
+If you've enjoyed prealloc, take a look at my other static anaylsis tools!
+- [nakedret](https://github.com/alexkohler/nakedret) - Finds naked returns.
+- [unimport](https://github.com/alexkohler/unimport) - Finds unnecessary import aliases.
diff --git a/vendor/github.com/golangci/prealloc/import.go b/vendor/github.com/golangci/prealloc/import.go
new file mode 100644
index 000000000..b747965ee
--- /dev/null
+++ b/vendor/github.com/golangci/prealloc/import.go
@@ -0,0 +1,310 @@
+package prealloc
+
+/*
+
+This file holds a direct copy of the import path matching code of
+https://github.com/golang/go/blob/master/src/cmd/go/main.go. It can be
+replaced when https://golang.org/issue/8768 is resolved.
+
+It has been updated to follow upstream changes in a few ways.
+
+*/
+
+import (
+ "fmt"
+ "go/build"
+ "log"
+ "os"
+ "path"
+ "path/filepath"
+ "regexp"
+ "runtime"
+ "strings"
+)
+
+var buildContext = build.Default
+
+var (
+ goroot = filepath.Clean(runtime.GOROOT())
+ gorootSrc = filepath.Join(goroot, "src")
+)
+
+// importPathsNoDotExpansion returns the import paths to use for the given
+// command line, but it does no ... expansion.
+func importPathsNoDotExpansion(args []string) []string {
+ if len(args) == 0 {
+ return []string{"."}
+ }
+ var out []string
+ for _, a := range args {
+ // Arguments are supposed to be import paths, but
+ // as a courtesy to Windows developers, rewrite \ to /
+ // in command-line arguments. Handles .\... and so on.
+ if filepath.Separator == '\\' {
+ a = strings.Replace(a, `\`, `/`, -1)
+ }
+
+ // Put argument in canonical form, but preserve leading ./.
+ if strings.HasPrefix(a, "./") {
+ a = "./" + path.Clean(a)
+ if a == "./." {
+ a = "."
+ }
+ } else {
+ a = path.Clean(a)
+ }
+ if a == "all" || a == "std" {
+ out = append(out, allPackages(a)...)
+ continue
+ }
+ out = append(out, a)
+ }
+ return out
+}
+
+// importPaths returns the import paths to use for the given command line.
+func importPaths(args []string) []string {
+ args = importPathsNoDotExpansion(args)
+ var out []string
+ for _, a := range args {
+ if strings.Contains(a, "...") {
+ if build.IsLocalImport(a) {
+ out = append(out, allPackagesInFS(a)...)
+ } else {
+ out = append(out, allPackages(a)...)
+ }
+ continue
+ }
+ out = append(out, a)
+ }
+ return out
+}
+
+// matchPattern(pattern)(name) reports whether
+// name matches pattern. Pattern is a limited glob
+// pattern in which '...' means 'any string' and there
+// is no other special syntax.
+func matchPattern(pattern string) func(name string) bool {
+ re := regexp.QuoteMeta(pattern)
+ re = strings.Replace(re, `\.\.\.`, `.*`, -1)
+ // Special case: foo/... matches foo too.
+ if strings.HasSuffix(re, `/.*`) {
+ re = re[:len(re)-len(`/.*`)] + `(/.*)?`
+ }
+ reg := regexp.MustCompile(`^` + re + `$`)
+ return func(name string) bool {
+ return reg.MatchString(name)
+ }
+}
+
+// hasPathPrefix reports whether the path s begins with the
+// elements in prefix.
+func hasPathPrefix(s, prefix string) bool {
+ switch {
+ default:
+ return false
+ case len(s) == len(prefix):
+ return s == prefix
+ case len(s) > len(prefix):
+ if prefix != "" && prefix[len(prefix)-1] == '/' {
+ return strings.HasPrefix(s, prefix)
+ }
+ return s[len(prefix)] == '/' && s[:len(prefix)] == prefix
+ }
+}
+
+// treeCanMatchPattern(pattern)(name) reports whether
+// name or children of name can possibly match pattern.
+// Pattern is the same limited glob accepted by matchPattern.
+func treeCanMatchPattern(pattern string) func(name string) bool {
+ wildCard := false
+ if i := strings.Index(pattern, "..."); i >= 0 {
+ wildCard = true
+ pattern = pattern[:i]
+ }
+ return func(name string) bool {
+ return len(name) <= len(pattern) && hasPathPrefix(pattern, name) ||
+ wildCard && strings.HasPrefix(name, pattern)
+ }
+}
+
+// allPackages returns all the packages that can be found
+// under the $GOPATH directories and $GOROOT matching pattern.
+// The pattern is either "all" (all packages), "std" (standard packages)
+// or a path including "...".
+func allPackages(pattern string) []string {
+ pkgs := matchPackages(pattern)
+ if len(pkgs) == 0 {
+ fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
+ }
+ return pkgs
+}
+
+func matchPackages(pattern string) []string {
+ match := func(string) bool { return true }
+ treeCanMatch := func(string) bool { return true }
+ if pattern != "all" && pattern != "std" {
+ match = matchPattern(pattern)
+ treeCanMatch = treeCanMatchPattern(pattern)
+ }
+
+ have := map[string]bool{
+ "builtin": true, // ignore pseudo-package that exists only for documentation
+ }
+ if !buildContext.CgoEnabled {
+ have["runtime/cgo"] = true // ignore during walk
+ }
+ var pkgs []string
+
+ // Commands
+ cmd := filepath.Join(goroot, "src/cmd") + string(filepath.Separator)
+ filepath.Walk(cmd, func(path string, fi os.FileInfo, err error) error {
+ if err != nil || !fi.IsDir() || path == cmd {
+ return nil
+ }
+ name := path[len(cmd):]
+ if !treeCanMatch(name) {
+ return filepath.SkipDir
+ }
+ // Commands are all in cmd/, not in subdirectories.
+ if strings.Contains(name, string(filepath.Separator)) {
+ return filepath.SkipDir
+ }
+
+ // We use, e.g., cmd/gofmt as the pseudo import path for gofmt.
+ name = "cmd/" + name
+ if have[name] {
+ return nil
+ }
+ have[name] = true
+ if !match(name) {
+ return nil
+ }
+ _, err = buildContext.ImportDir(path, 0)
+ if err != nil {
+ if _, noGo := err.(*build.NoGoError); !noGo {
+ log.Print(err)
+ }
+ return nil
+ }
+ pkgs = append(pkgs, name)
+ return nil
+ })
+
+ for _, src := range buildContext.SrcDirs() {
+ if (pattern == "std" || pattern == "cmd") && src != gorootSrc {
+ continue
+ }
+ src = filepath.Clean(src) + string(filepath.Separator)
+ root := src
+ if pattern == "cmd" {
+ root += "cmd" + string(filepath.Separator)
+ }
+ filepath.Walk(root, func(path string, fi os.FileInfo, err error) error {
+ if err != nil || !fi.IsDir() || path == src {
+ return nil
+ }
+
+ // Avoid .foo, _foo, testdata and vendor directory trees.
+ _, elem := filepath.Split(path)
+ if strings.HasPrefix(elem, ".") || strings.HasPrefix(elem, "_") || elem == "testdata" || elem == "vendor" {
+ return filepath.SkipDir
+ }
+
+ name := filepath.ToSlash(path[len(src):])
+ if pattern == "std" && (strings.Contains(name, ".") || name == "cmd") {
+ // The name "std" is only the standard library.
+ // If the name is cmd, it's the root of the command tree.
+ return filepath.SkipDir
+ }
+ if !treeCanMatch(name) {
+ return filepath.SkipDir
+ }
+ if have[name] {
+ return nil
+ }
+ have[name] = true
+ if !match(name) {
+ return nil
+ }
+ _, err = buildContext.ImportDir(path, 0)
+ if err != nil {
+ if _, noGo := err.(*build.NoGoError); noGo {
+ return nil
+ }
+ }
+ pkgs = append(pkgs, name)
+ return nil
+ })
+ }
+ return pkgs
+}
+
+// allPackagesInFS is like allPackages but is passed a pattern
+// beginning ./ or ../, meaning it should scan the tree rooted
+// at the given directory. There are ... in the pattern too.
+func allPackagesInFS(pattern string) []string {
+ pkgs := matchPackagesInFS(pattern)
+ if len(pkgs) == 0 {
+ fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
+ }
+ return pkgs
+}
+
+func matchPackagesInFS(pattern string) []string {
+ // Find directory to begin the scan.
+ // Could be smarter but this one optimization
+ // is enough for now, since ... is usually at the
+ // end of a path.
+ i := strings.Index(pattern, "...")
+ dir, _ := path.Split(pattern[:i])
+
+ // pattern begins with ./ or ../.
+ // path.Clean will discard the ./ but not the ../.
+ // We need to preserve the ./ for pattern matching
+ // and in the returned import paths.
+ prefix := ""
+ if strings.HasPrefix(pattern, "./") {
+ prefix = "./"
+ }
+ match := matchPattern(pattern)
+
+ var pkgs []string
+ filepath.Walk(dir, func(path string, fi os.FileInfo, err error) error {
+ if err != nil || !fi.IsDir() {
+ return nil
+ }
+ if path == dir {
+ // filepath.Walk starts at dir and recurses. For the recursive case,
+ // the path is the result of filepath.Join, which calls filepath.Clean.
+ // The initial case is not Cleaned, though, so we do this explicitly.
+ //
+ // This converts a path like "./io/" to "io". Without this step, running
+ // "cd $GOROOT/src/pkg; go list ./io/..." would incorrectly skip the io
+ // package, because prepending the prefix "./" to the unclean path would
+ // result in "././io", and match("././io") returns false.
+ path = filepath.Clean(path)
+ }
+
+ // Avoid .foo, _foo, testdata and vendor directory trees, but do not avoid "." or "..".
+ _, elem := filepath.Split(path)
+ dot := strings.HasPrefix(elem, ".") && elem != "." && elem != ".."
+ if dot || strings.HasPrefix(elem, "_") || elem == "testdata" || elem == "vendor" {
+ return filepath.SkipDir
+ }
+
+ name := prefix + filepath.ToSlash(path)
+ if !match(name) {
+ return nil
+ }
+ if _, err = build.ImportDir(path, 0); err != nil {
+ if _, noGo := err.(*build.NoGoError); !noGo {
+ log.Print(err)
+ }
+ return nil
+ }
+ pkgs = append(pkgs, name)
+ return nil
+ })
+ return pkgs
+}
diff --git a/vendor/github.com/golangci/prealloc/prealloc.go b/vendor/github.com/golangci/prealloc/prealloc.go
new file mode 100644
index 000000000..1235ad363
--- /dev/null
+++ b/vendor/github.com/golangci/prealloc/prealloc.go
@@ -0,0 +1,403 @@
+package prealloc
+
+import (
+ "errors"
+ "flag"
+ "fmt"
+ "go/ast"
+ "go/build"
+ "go/parser"
+ "go/token"
+ "log"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+// Support: (in order of priority)
+// * Full make suggestion with type?
+// * Test flag
+// * Embedded ifs?
+// * Use an import rather than the duplcated import.go
+
+const (
+ pwd = "./"
+)
+
+func usage() {
+ log.Printf("Usage of %s:\n", os.Args[0])
+ log.Printf("\nprealloc [flags] # runs on package in current directory\n")
+ log.Printf("\nprealloc [flags] [packages]\n")
+ log.Printf("Flags:\n")
+ flag.PrintDefaults()
+}
+
+type sliceDeclaration struct {
+ name string
+ // sType string
+ genD *ast.GenDecl
+}
+
+type returnsVisitor struct {
+ // flags
+ simple bool
+ includeRangeLoops bool
+ includeForLoops bool
+ // visitor fields
+ sliceDeclarations []*sliceDeclaration
+ preallocHints []Hint
+ returnsInsideOfLoop bool
+ arrayTypes []string
+}
+
+func NoMain() {
+
+ // Remove log timestamp
+ log.SetFlags(0)
+
+ simple := flag.Bool("simple", true, "Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them")
+ includeRangeLoops := flag.Bool("rangeloops", true, "Report preallocation suggestions on range loops")
+ includeForLoops := flag.Bool("forloops", false, "Report preallocation suggestions on for loops")
+ setExitStatus := flag.Bool("set_exit_status", false, "Set exit status to 1 if any issues are found")
+ flag.Usage = usage
+ flag.Parse()
+
+ hints, err := checkForPreallocations(flag.Args(), simple, includeRangeLoops, includeForLoops)
+ if err != nil {
+ log.Println(err)
+ }
+
+ for _, hint := range hints {
+ log.Println(hint)
+ }
+ if *setExitStatus && len(hints) > 0 {
+ os.Exit(1)
+ }
+}
+
+func checkForPreallocations(args []string, simple, includeRangeLoops *bool, includeForLoops *bool) ([]Hint, error) {
+
+ fset := token.NewFileSet()
+
+ files, err := parseInput(args, fset)
+ if err != nil {
+ return nil, fmt.Errorf("could not parse input %v", err)
+ }
+
+ if simple == nil {
+ return nil, errors.New("simple nil")
+ }
+
+ if includeRangeLoops == nil {
+ return nil, errors.New("includeRangeLoops nil")
+ }
+
+ if includeForLoops == nil {
+ return nil, errors.New("includeForLoops nil")
+ }
+
+ hints := []Hint{}
+ for _, f := range files {
+ retVis := &returnsVisitor{
+ simple: *simple,
+ includeRangeLoops: *includeRangeLoops,
+ includeForLoops: *includeForLoops,
+ }
+ ast.Walk(retVis, f)
+ // if simple is true, then we actually have to check if we had returns
+ // inside of our loop. Otherwise, we can just report all messages.
+ if !retVis.simple || !retVis.returnsInsideOfLoop {
+ hints = append(hints, retVis.preallocHints...)
+ }
+ }
+
+ return hints, nil
+}
+
+func Check(files []*ast.File, simple, includeRangeLoops, includeForLoops bool) []Hint {
+ hints := []Hint{}
+ for _, f := range files {
+ retVis := &returnsVisitor{
+ simple: simple,
+ includeRangeLoops: includeRangeLoops,
+ includeForLoops: includeForLoops,
+ }
+ ast.Walk(retVis, f)
+
+ // if simple is true, then we actually have to check if we had returns
+ // inside of our loop. Otherwise, we can just report all messages.
+ if !retVis.simple || !retVis.returnsInsideOfLoop {
+ hints = append(hints, retVis.preallocHints...)
+ }
+ }
+
+ return hints
+}
+
+func parseInput(args []string, fset *token.FileSet) ([]*ast.File, error) {
+ var directoryList []string
+ var fileMode bool
+ files := make([]*ast.File, 0)
+
+ if len(args) == 0 {
+ directoryList = append(directoryList, pwd)
+ } else {
+ for _, arg := range args {
+ if strings.HasSuffix(arg, "/...") && isDir(arg[:len(arg)-len("/...")]) {
+
+ for _, dirname := range allPackagesInFS(arg) {
+ directoryList = append(directoryList, dirname)
+ }
+
+ } else if isDir(arg) {
+ directoryList = append(directoryList, arg)
+
+ } else if exists(arg) {
+ if strings.HasSuffix(arg, ".go") {
+ fileMode = true
+ f, err := parser.ParseFile(fset, arg, nil, 0)
+ if err != nil {
+ return nil, err
+ }
+ files = append(files, f)
+ } else {
+ return nil, fmt.Errorf("invalid file %v specified", arg)
+ }
+ } else {
+
+ //TODO clean this up a bit
+ imPaths := importPaths([]string{arg})
+ for _, importPath := range imPaths {
+ pkg, err := build.Import(importPath, ".", 0)
+ if err != nil {
+ return nil, err
+ }
+ var stringFiles []string
+ stringFiles = append(stringFiles, pkg.GoFiles...)
+ // files = append(files, pkg.CgoFiles...)
+ stringFiles = append(stringFiles, pkg.TestGoFiles...)
+ if pkg.Dir != "." {
+ for i, f := range stringFiles {
+ stringFiles[i] = filepath.Join(pkg.Dir, f)
+ }
+ }
+
+ fileMode = true
+ for _, stringFile := range stringFiles {
+ f, err := parser.ParseFile(fset, stringFile, nil, 0)
+ if err != nil {
+ return nil, err
+ }
+ files = append(files, f)
+ }
+
+ }
+ }
+ }
+ }
+
+ // if we're not in file mode, then we need to grab each and every package in each directory
+ // we can to grab all the files
+ if !fileMode {
+ for _, fpath := range directoryList {
+ pkgs, err := parser.ParseDir(fset, fpath, nil, 0)
+ if err != nil {
+ return nil, err
+ }
+
+ for _, pkg := range pkgs {
+ for _, f := range pkg.Files {
+ files = append(files, f)
+ }
+ }
+ }
+ }
+
+ return files, nil
+}
+
+func isDir(filename string) bool {
+ fi, err := os.Stat(filename)
+ return err == nil && fi.IsDir()
+}
+
+func exists(filename string) bool {
+ _, err := os.Stat(filename)
+ return err == nil
+}
+
+func contains(slice []string, item string) bool {
+ for _, s := range slice {
+ if s == item {
+ return true
+ }
+ }
+
+ return false
+}
+
+func (v *returnsVisitor) Visit(node ast.Node) ast.Visitor {
+
+ v.sliceDeclarations = nil
+ v.returnsInsideOfLoop = false
+
+ switch n := node.(type) {
+ case *ast.TypeSpec:
+ if _, ok := n.Type.(*ast.ArrayType); ok {
+ if n.Name != nil {
+ v.arrayTypes = append(v.arrayTypes, n.Name.Name)
+ }
+ }
+ case *ast.FuncDecl:
+ if n.Body != nil {
+ for _, stmt := range n.Body.List {
+ switch s := stmt.(type) {
+ // Find non pre-allocated slices
+ case *ast.DeclStmt:
+ genD, ok := s.Decl.(*ast.GenDecl)
+ if !ok {
+ continue
+ }
+ if genD.Tok == token.TYPE {
+ for _, spec := range genD.Specs {
+ tSpec, ok := spec.(*ast.TypeSpec)
+ if !ok {
+ continue
+ }
+
+ if _, ok := tSpec.Type.(*ast.ArrayType); ok {
+ if tSpec.Name != nil {
+ v.arrayTypes = append(v.arrayTypes, tSpec.Name.Name)
+ }
+ }
+ }
+ } else if genD.Tok == token.VAR {
+ for _, spec := range genD.Specs {
+ vSpec, ok := spec.(*ast.ValueSpec)
+ if !ok {
+ continue
+ }
+ var isArrType bool
+ switch val := vSpec.Type.(type) {
+ case *ast.ArrayType:
+ isArrType = true
+ case *ast.Ident:
+ isArrType = contains(v.arrayTypes, val.Name)
+ }
+ if isArrType {
+ if vSpec.Names != nil {
+ /*atID, ok := arrayType.Elt.(*ast.Ident)
+ if !ok {
+ continue
+ }*/
+
+ // We should handle multiple slices declared on same line e.g. var mySlice1, mySlice2 []uint32
+ for _, vName := range vSpec.Names {
+ v.sliceDeclarations = append(v.sliceDeclarations, &sliceDeclaration{name: vName.Name /*sType: atID.Name,*/, genD: genD})
+ }
+ }
+ }
+ }
+ }
+
+ case *ast.RangeStmt:
+ if v.includeRangeLoops {
+ if len(v.sliceDeclarations) == 0 {
+ continue
+ }
+ if s.Body != nil {
+ v.handleLoops(s.Body)
+ }
+ }
+
+ case *ast.ForStmt:
+ if v.includeForLoops {
+ if len(v.sliceDeclarations) == 0 {
+ continue
+ }
+ if s.Body != nil {
+ v.handleLoops(s.Body)
+ }
+ }
+
+ default:
+ }
+ }
+ }
+ }
+ return v
+}
+
+// handleLoops is a helper function to share the logic required for both *ast.RangeLoops and *ast.ForLoops
+func (v *returnsVisitor) handleLoops(blockStmt *ast.BlockStmt) {
+
+ for _, stmt := range blockStmt.List {
+ switch bodyStmt := stmt.(type) {
+ case *ast.AssignStmt:
+ asgnStmt := bodyStmt
+ for _, expr := range asgnStmt.Rhs {
+ callExpr, ok := expr.(*ast.CallExpr)
+ if !ok {
+ continue // should this be break? comes back to multi-call support I think
+ }
+ ident, ok := callExpr.Fun.(*ast.Ident)
+ if !ok {
+ continue
+ }
+ if ident.Name == "append" {
+ // see if this append is appending the slice we found
+ for _, lhsExpr := range asgnStmt.Lhs {
+ lhsIdent, ok := lhsExpr.(*ast.Ident)
+ if !ok {
+ continue
+ }
+ for _, sliceDecl := range v.sliceDeclarations {
+ if sliceDecl.name == lhsIdent.Name {
+ // This is a potential mark, we just need to make sure there are no returns/continues in the
+ // range loop.
+ // now we just need to grab whatever we're ranging over
+ /*sxIdent, ok := s.X.(*ast.Ident)
+ if !ok {
+ continue
+ }*/
+
+ v.preallocHints = append(v.preallocHints, Hint{
+ Pos: sliceDecl.genD.Pos(),
+ DeclaredSliceName: sliceDecl.name,
+ })
+ }
+ }
+ }
+
+ }
+ }
+ case *ast.IfStmt:
+ ifStmt := bodyStmt
+ if ifStmt.Body != nil {
+ for _, ifBodyStmt := range ifStmt.Body.List {
+ // TODO should probably handle embedded ifs here
+ switch /*ift :=*/ ifBodyStmt.(type) {
+ case *ast.BranchStmt, *ast.ReturnStmt:
+ v.returnsInsideOfLoop = true
+ default:
+ }
+ }
+ }
+
+ default:
+
+ }
+ }
+
+}
+
+// Hint stores the information about an occurence of a slice that could be
+// preallocated.
+type Hint struct {
+ Pos token.Pos
+ DeclaredSliceName string
+}
+
+func (h Hint) String() string {
+ return fmt.Sprintf("%v: Consider preallocating %v", h.Pos, h.DeclaredSliceName)
+}
diff --git a/vendor/github.com/golangci/revgrep/.gitignore b/vendor/github.com/golangci/revgrep/.gitignore
new file mode 100644
index 000000000..0540fe2ca
--- /dev/null
+++ b/vendor/github.com/golangci/revgrep/.gitignore
@@ -0,0 +1 @@
+testdata/git
diff --git a/vendor/github.com/golangci/revgrep/.travis.yml b/vendor/github.com/golangci/revgrep/.travis.yml
new file mode 100644
index 000000000..d16d8b5bd
--- /dev/null
+++ b/vendor/github.com/golangci/revgrep/.travis.yml
@@ -0,0 +1,7 @@
+language: go
+before_install:
+ - go get github.com/mattn/goveralls
+ - go get golang.org/x/tools/cmd/cover
+script:
+ - $HOME/gopath/bin/goveralls -service=travis-ci
+
diff --git a/vendor/github.com/golangci/revgrep/LICENSE b/vendor/github.com/golangci/revgrep/LICENSE
new file mode 100644
index 000000000..8dada3eda
--- /dev/null
+++ b/vendor/github.com/golangci/revgrep/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/vendor/github.com/golangci/revgrep/README.md b/vendor/github.com/golangci/revgrep/README.md
new file mode 100644
index 000000000..31faefee9
--- /dev/null
+++ b/vendor/github.com/golangci/revgrep/README.md
@@ -0,0 +1,58 @@
+# Overview
+
+[![Build Status](https://travis-ci.org/bradleyfalzon/revgrep.svg?branch=master)](https://travis-ci.org/bradleyfalzon/revgrep) [![Coverage
+Status](https://coveralls.io/repos/github/bradleyfalzon/revgrep/badge.svg?branch=master)](https://coveralls.io/github/bradleyfalzon/revgrep?branch=master) [![GoDoc](https://godoc.org/github.com/bradleyfalzon/revgrep?status.svg)](https://godoc.org/github.com/bradleyfalzon/revgrep)
+
+`revgrep` is a CLI tool used to filter static analysis tools to only lines changed based on a commit reference.
+
+# Install
+
+```bash
+go get -u github.com/bradleyfalzon/revgrep/...
+```
+
+# Usage
+
+In the scenario below, a change was made causing a warning in `go vet` on line 5, but `go vet` will show all warnings.
+Using `revgrep`, you can show only warnings for lines of code that have been changed (in this case, hiding line 6).
+
+```bash
+[user@host dir (master)]$ go vet
+main.go:5: missing argument for Sprintf("%s"): format reads arg 1, have only 0 args
+main.go:6: missing argument for Sprintf("%s"): format reads arg 1, have only 0 args
+[user@host dir (master)]$ go vet |& revgrep
+main.go:5: missing argument for Sprintf("%s"): format reads arg 1, have only 0 args
+```
+
+`|&` is shown above as many static analysis programs write to `stderr`, not `stdout`, `|&` combines both `stderr` and
+`stdout`. It could also be achieved with `go vet 2>&1 | revgrep`.
+
+`revgrep` CLI tool will return an exit status of 1 if any issues match, else it will return 0. Consider using
+`${PIPESTATUS[0]}` for the exit status of the `go vet` command in the above example.
+
+```
+Usage: revgrep [options] [from-rev] [to-rev]
+
+from-rev filters issues to lines changed since (and including) this revision
+ to-rev filters issues to lines changed since (and including) this revision, requires <from-rev>
+
+ If no revisions are given, and there are unstaged changes or untracked files, only those changes are shown
+ If no revisions are given, and there are no unstaged changes or untracked files, only changes in HEAD~ are shown
+ If from-rev is given and to-rev is not, only changes between from-rev and HEAD are shown.
+
+ -d Show debug output
+ -regexp string
+ Regexp to match path, line number, optional column number, and message
+```
+
+# Other Examples
+
+Issues between branches:
+```bash
+[user@host dir (feature/branch)]$ go vet |& revgrep master
+```
+
+Issues since last push:
+```bash
+[user@host dir (master)]$ go vet |& revgrep origin/master
+```
diff --git a/vendor/github.com/golangci/revgrep/revgrep.go b/vendor/github.com/golangci/revgrep/revgrep.go
new file mode 100644
index 000000000..1a56dcf4e
--- /dev/null
+++ b/vendor/github.com/golangci/revgrep/revgrep.go
@@ -0,0 +1,395 @@
+package revgrep
+
+import (
+ "bufio"
+ "bytes"
+ "errors"
+ "fmt"
+ "io"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "regexp"
+ "strconv"
+ "strings"
+)
+
+// Checker provides APIs to filter static analysis tools to specific commits,
+// such as showing only issues since last commit.
+type Checker struct {
+ // Patch file (unified) to read to detect lines being changed, if nil revgrep
+ // will attempt to detect the VCS and generate an appropriate patch. Auto
+ // detection will search for uncommitted changes first, if none found, will
+ // generate a patch from last committed change. File paths within patches
+ // must be relative to current working directory.
+ Patch io.Reader
+ // NewFiles is a list of file names (with absolute paths) where the entire
+ // contents of the file is new.
+ NewFiles []string
+ // Debug sets the debug writer for additional output.
+ Debug io.Writer
+ // RevisionFrom check revision starting at, leave blank for auto detection
+ // ignored if patch is set.
+ RevisionFrom string
+ // RevisionTo checks revision finishing at, leave blank for auto detection
+ // ignored if patch is set.
+ RevisionTo string
+ // Regexp to match path, line number, optional column number, and message.
+ Regexp string
+ // AbsPath is used to make an absolute path of an issue's filename to be
+ // relative in order to match patch file. If not set, current working
+ // directory is used.
+ AbsPath string
+
+ // Calculated changes for next calls to IsNewIssue
+ changes map[string][]pos
+}
+
+// Issue contains metadata about an issue found.
+type Issue struct {
+ // File is the name of the file as it appeared from the patch.
+ File string
+ // LineNo is the line number of the file.
+ LineNo int
+ // ColNo is the column number or 0 if none could be parsed.
+ ColNo int
+ // HunkPos is position from file's first @@, for new files this will be the
+ // line number.
+ //
+ // See also: https://developer.github.com/v3/pulls/comments/#create-a-comment
+ HunkPos int
+ // Issue text as it appeared from the tool.
+ Issue string
+ // Message is the issue without file name, line number and column number.
+ Message string
+}
+
+func (c *Checker) preparePatch() error {
+ // Check if patch is supplied, if not, retrieve from VCS
+ if c.Patch == nil {
+ var err error
+ c.Patch, c.NewFiles, err = GitPatch(c.RevisionFrom, c.RevisionTo)
+ if err != nil {
+ return fmt.Errorf("could not read git repo: %s", err)
+ }
+ if c.Patch == nil {
+ return errors.New("no version control repository found")
+ }
+ }
+
+ return nil
+}
+
+type InputIssue interface {
+ FilePath() string
+ Line() int
+}
+
+type simpleInputIssue struct {
+ filePath string
+ lineNumber int
+}
+
+func (i simpleInputIssue) FilePath() string {
+ return i.filePath
+}
+
+func (i simpleInputIssue) Line() int {
+ return i.lineNumber
+}
+
+func (c *Checker) Prepare() error {
+ returnErr := c.preparePatch()
+ c.changes = c.linesChanged()
+ return returnErr
+}
+
+func (c Checker) IsNewIssue(i InputIssue) (hunkPos int, isNew bool) {
+ fchanges, ok := c.changes[i.FilePath()]
+ if !ok { // file wasn't changed
+ return 0, false
+ }
+
+ var (
+ fpos pos
+ changed bool
+ )
+ // found file, see if lines matched
+ for _, pos := range fchanges {
+ if pos.lineNo == int(i.Line()) {
+ fpos = pos
+ changed = true
+ break
+ }
+ }
+
+ if changed || fchanges == nil {
+ // either file changed or it's a new file
+ hunkPos := fpos.lineNo
+ if changed { // existing file changed
+ hunkPos = fpos.hunkPos
+ }
+
+ return hunkPos, true
+ }
+
+ return 0, false
+}
+
+// Check scans reader and writes any lines to writer that have been added in
+// Checker.Patch.
+//
+// Returns issues written to writer when no error occurs.
+//
+// If no VCS could be found or other VCS errors occur, all issues are written
+// to writer and an error is returned.
+//
+// File paths in reader must be relative to current working directory or
+// absolute.
+func (c Checker) Check(reader io.Reader, writer io.Writer) (issues []Issue, err error) {
+ returnErr := c.Prepare()
+ writeAll := returnErr != nil
+
+ // file.go:lineNo:colNo:message
+ // colNo is optional, strip spaces before message
+ lineRE := regexp.MustCompile(`(.*?\.go):([0-9]+):([0-9]+)?:?\s*(.*)`)
+ if c.Regexp != "" {
+ lineRE, err = regexp.Compile(c.Regexp)
+ if err != nil {
+ return nil, fmt.Errorf("could not parse regexp: %v", err)
+ }
+ }
+
+ // TODO consider lazy loading this, if there's nothing in stdin, no point
+ // checking for recent changes
+ c.debugf("lines changed: %+v", c.changes)
+
+ absPath := c.AbsPath
+ if absPath == "" {
+ absPath, err = os.Getwd()
+ if err != nil {
+ returnErr = fmt.Errorf("could not get current working directory: %s", err)
+ }
+ }
+
+ // Scan each line in reader and only write those lines if lines changed
+ scanner := bufio.NewScanner(reader)
+ for scanner.Scan() {
+ line := lineRE.FindSubmatch(scanner.Bytes())
+ if line == nil {
+ c.debugf("cannot parse file+line number: %s", scanner.Text())
+ continue
+ }
+
+ if writeAll {
+ fmt.Fprintln(writer, scanner.Text())
+ continue
+ }
+
+ // Make absolute path names relative
+ path := string(line[1])
+ if rel, err := filepath.Rel(absPath, path); err == nil {
+ c.debugf("rewrote path from %q to %q (absPath: %q)", path, rel, absPath)
+ path = rel
+ }
+
+ // Parse line number
+ lno, err := strconv.ParseUint(string(line[2]), 10, 64)
+ if err != nil {
+ c.debugf("cannot parse line number: %q", scanner.Text())
+ continue
+ }
+
+ // Parse optional column number
+ var cno uint64
+ if len(line[3]) > 0 {
+ cno, err = strconv.ParseUint(string(line[3]), 10, 64)
+ if err != nil {
+ c.debugf("cannot parse column number: %q", scanner.Text())
+ // Ignore this error and continue
+ }
+ }
+
+ // Extract message
+ msg := string(line[4])
+
+ c.debugf("path: %q, lineNo: %v, colNo: %v, msg: %q", path, lno, cno, msg)
+ i := simpleInputIssue{
+ filePath: path,
+ lineNumber: int(lno),
+ }
+ hunkPos, changed := c.IsNewIssue(i)
+ if changed {
+ issue := Issue{
+ File: path,
+ LineNo: int(lno),
+ ColNo: int(cno),
+ HunkPos: hunkPos,
+ Issue: scanner.Text(),
+ Message: msg,
+ }
+ issues = append(issues, issue)
+ fmt.Fprintln(writer, scanner.Text())
+ } else {
+ c.debugf("unchanged: %s", scanner.Text())
+ }
+ }
+ if err := scanner.Err(); err != nil {
+ returnErr = fmt.Errorf("error reading standard input: %s", err)
+ }
+ return issues, returnErr
+}
+
+func (c Checker) debugf(format string, s ...interface{}) {
+ if c.Debug != nil {
+ fmt.Fprint(c.Debug, "DEBUG: ")
+ fmt.Fprintf(c.Debug, format+"\n", s...)
+ }
+}
+
+type pos struct {
+ lineNo int // line number
+ hunkPos int // position relative to first @@ in file
+}
+
+// linesChanges returns a map of file names to line numbers being changed.
+// If key is nil, the file has been recently added, else it contains a slice
+// of positions that have been added.
+func (c Checker) linesChanged() map[string][]pos {
+ type state struct {
+ file string
+ lineNo int // current line number within chunk
+ hunkPos int // current line count since first @@ in file
+ changes []pos // position of changes
+ }
+
+ var (
+ s state
+ changes = make(map[string][]pos)
+ )
+
+ for _, file := range c.NewFiles {
+ changes[file] = nil
+ }
+
+ if c.Patch == nil {
+ return changes
+ }
+
+ scanner := bufio.NewScanner(c.Patch)
+ for scanner.Scan() {
+ line := scanner.Text() // TODO scanner.Bytes()
+ c.debugf(line)
+ s.lineNo++
+ s.hunkPos++
+ switch {
+ case strings.HasPrefix(line, "+++ ") && len(line) > 4:
+ if s.changes != nil {
+ // record the last state
+ changes[s.file] = s.changes
+ }
+ // 6 removes "+++ b/"
+ s = state{file: line[6:], hunkPos: -1, changes: []pos{}}
+ case strings.HasPrefix(line, "@@ "):
+ // @@ -1 +2,4 @@
+ // chdr ^^^^^^^^^^^^^
+ // ahdr ^^^^
+ // cstart ^
+ chdr := strings.Split(line, " ")
+ ahdr := strings.Split(chdr[2], ",")
+ // [1:] to remove leading plus
+ cstart, err := strconv.ParseUint(ahdr[0][1:], 10, 64)
+ if err != nil {
+ panic(err)
+ }
+ s.lineNo = int(cstart) - 1 // -1 as cstart is the next line number
+ case strings.HasPrefix(line, "-"):
+ s.lineNo--
+ case strings.HasPrefix(line, "+"):
+ s.changes = append(s.changes, pos{lineNo: s.lineNo, hunkPos: s.hunkPos})
+ }
+
+ }
+ if err := scanner.Err(); err != nil {
+ fmt.Fprintln(os.Stderr, "reading standard input:", err)
+ }
+ // record the last state
+ changes[s.file] = s.changes
+
+ return changes
+}
+
+// GitPatch returns a patch from a git repository, if no git repository was
+// was found and no errors occurred, nil is returned, else an error is returned
+// revisionFrom and revisionTo defines the git diff parameters, if left blank
+// and there are unstaged changes or untracked files, only those will be returned
+// else only check changes since HEAD~. If revisionFrom is set but revisionTo
+// is not, untracked files will be included, to exclude untracked files set
+// revisionTo to HEAD~. It's incorrect to specify revisionTo without a
+// revisionFrom.
+func GitPatch(revisionFrom, revisionTo string) (io.Reader, []string, error) {
+ var patch bytes.Buffer
+
+ // check if git repo exists
+ if err := exec.Command("git", "status").Run(); err != nil {
+ // don't return an error, we assume the error is not repo exists
+ return nil, nil, nil
+ }
+
+ // make a patch for untracked files
+ var newFiles []string
+ ls, err := exec.Command("git", "ls-files", "-o").CombinedOutput()
+ if err != nil {
+ return nil, nil, fmt.Errorf("error executing git ls-files: %s", err)
+ }
+ for _, file := range bytes.Split(ls, []byte{'\n'}) {
+ if len(file) == 0 || bytes.HasSuffix(file, []byte{'/'}) {
+ // ls-files was sometimes showing directories when they were ignored
+ // I couldn't create a test case for this as I couldn't reproduce correctly
+ // for the moment, just exclude files with trailing /
+ continue
+ }
+ newFiles = append(newFiles, string(file))
+ }
+
+ if revisionFrom != "" {
+ cmd := exec.Command("git", "diff", "--relative", revisionFrom)
+ if revisionTo != "" {
+ cmd.Args = append(cmd.Args, revisionTo)
+ }
+ cmd.Stdout = &patch
+ if err := cmd.Run(); err != nil {
+ return nil, nil, fmt.Errorf("error executing git diff %q %q: %s", revisionFrom, revisionTo, err)
+ }
+
+ if revisionTo == "" {
+ return &patch, newFiles, nil
+ }
+ return &patch, nil, nil
+ }
+
+ // make a patch for unstaged changes
+ // use --no-prefix to remove b/ given: +++ b/main.go
+ cmd := exec.Command("git", "diff", "--relative")
+ cmd.Stdout = &patch
+ if err := cmd.Run(); err != nil {
+ return nil, nil, fmt.Errorf("error executing git diff: %s", err)
+ }
+ unstaged := patch.Len() > 0
+
+ // If there's unstaged changes OR untracked changes (or both), then this is
+ // a suitable patch
+ if unstaged || newFiles != nil {
+ return &patch, newFiles, nil
+ }
+
+ // check for changes in recent commit
+
+ cmd = exec.Command("git", "diff", "--relative", "HEAD~")
+ cmd.Stdout = &patch
+ if err := cmd.Run(); err != nil {
+ return nil, nil, fmt.Errorf("error executing git diff HEAD~: %s", err)
+ }
+
+ return &patch, nil, nil
+}
diff --git a/vendor/github.com/golangci/unconvert/LICENSE b/vendor/github.com/golangci/unconvert/LICENSE
new file mode 100644
index 000000000..744875676
--- /dev/null
+++ b/vendor/github.com/golangci/unconvert/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2012 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/golangci/unconvert/README b/vendor/github.com/golangci/unconvert/README
new file mode 100644
index 000000000..dbaea4f57
--- /dev/null
+++ b/vendor/github.com/golangci/unconvert/README
@@ -0,0 +1,36 @@
+About:
+
+The unconvert program analyzes Go packages to identify unnecessary
+type conversions; i.e., expressions T(x) where x already has type T.
+
+Install:
+
+ $ go get github.com/mdempsky/unconvert
+
+Usage:
+
+ $ unconvert -v bytes fmt
+ GOROOT/src/bytes/reader.go:117:14: unnecessary conversion
+ abs = int64(r.i) + offset
+ ^
+ GOROOT/src/fmt/print.go:411:21: unnecessary conversion
+ p.fmt.integer(int64(v), 16, unsigned, udigits)
+ ^
+
+Flags:
+
+Using the -v flag, unconvert will also print the source line and a
+caret to indicate the unnecessary conversion's position therein.
+
+Using the -apply flag, unconvert will rewrite the Go source files
+without the unnecessary type conversions.
+
+Using the -all flag, unconvert will analyze the Go packages under all
+possible GOOS/GOARCH combinations, and only identify conversions that
+are unnecessary in all cases.
+
+E.g., syscall.Timespec's Sec and Nsec fields are int64 under
+linux/amd64 but int32 under linux/386. An int64(ts.Sec) conversion
+that appears in a linux/amd64-only file will be identified as
+unnecessary, but it will be preserved if it occurs in a file that's
+compiled for both linux/amd64 and linux/386.
diff --git a/vendor/github.com/golangci/unconvert/unconvert.go b/vendor/github.com/golangci/unconvert/unconvert.go
new file mode 100644
index 000000000..38737d39f
--- /dev/null
+++ b/vendor/github.com/golangci/unconvert/unconvert.go
@@ -0,0 +1,665 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Unconvert removes redundant type conversions from Go packages.
+package unconvert
+
+import (
+ "bytes"
+ "flag"
+ "fmt"
+ "go/ast"
+ "go/build"
+ "go/format"
+ "go/parser"
+ "go/token"
+ "go/types"
+ "io/ioutil"
+ "log"
+ "os"
+ "reflect"
+ "runtime/pprof"
+ "sort"
+ "sync"
+ "unicode"
+
+ "github.com/kisielk/gotool"
+ "golang.org/x/text/width"
+ "golang.org/x/tools/go/loader"
+)
+
+// Unnecessary conversions are identified by the position
+// of their left parenthesis within a source file.
+
+type editSet map[token.Position]struct{}
+
+type fileToEditSet map[string]editSet
+
+func apply(file string, edits editSet) {
+ if len(edits) == 0 {
+ return
+ }
+
+ fset := token.NewFileSet()
+ f, err := parser.ParseFile(fset, file, nil, parser.ParseComments)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Note: We modify edits during the walk.
+ v := editor{edits: edits, file: fset.File(f.Package)}
+ ast.Walk(&v, f)
+ if len(edits) != 0 {
+ log.Printf("%s: missing edits %s", file, edits)
+ }
+
+ // TODO(mdempsky): Write to temporary file and rename.
+ var buf bytes.Buffer
+ err = format.Node(&buf, fset, f)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ err = ioutil.WriteFile(file, buf.Bytes(), 0)
+ if err != nil {
+ log.Fatal(err)
+ }
+}
+
+type editor struct {
+ edits editSet
+ file *token.File
+}
+
+func (e *editor) Visit(n ast.Node) ast.Visitor {
+ if n == nil {
+ return nil
+ }
+ v := reflect.ValueOf(n).Elem()
+ for i, n := 0, v.NumField(); i < n; i++ {
+ switch f := v.Field(i).Addr().Interface().(type) {
+ case *ast.Expr:
+ e.rewrite(f)
+ case *[]ast.Expr:
+ for i := range *f {
+ e.rewrite(&(*f)[i])
+ }
+ }
+ }
+ return e
+}
+
+func (e *editor) rewrite(f *ast.Expr) {
+ call, ok := (*f).(*ast.CallExpr)
+ if !ok {
+ return
+ }
+
+ pos := e.file.Position(call.Lparen)
+ if _, ok := e.edits[pos]; !ok {
+ return
+ }
+ *f = call.Args[0]
+ delete(e.edits, pos)
+}
+
+var (
+ cr = []byte{'\r'}
+ nl = []byte{'\n'}
+)
+
+func print(conversions []token.Position) {
+ var file string
+ var lines [][]byte
+
+ for _, pos := range conversions {
+ fmt.Printf("%s:%d:%d: unnecessary conversion\n", pos.Filename, pos.Line, pos.Column)
+ if *flagV {
+ if pos.Filename != file {
+ buf, err := ioutil.ReadFile(pos.Filename)
+ if err != nil {
+ log.Fatal(err)
+ }
+ file = pos.Filename
+ lines = bytes.Split(buf, nl)
+ }
+
+ line := bytes.TrimSuffix(lines[pos.Line-1], cr)
+ fmt.Printf("%s\n", line)
+
+ // For files processed by cgo, Column is the
+ // column location after cgo processing, which
+ // may be different than the source column
+ // that we want here. In lieu of a better
+ // heuristic for detecting this case, at least
+ // avoid panicking if column is out of bounds.
+ if pos.Column <= len(line) {
+ fmt.Printf("%s^\n", rub(line[:pos.Column-1]))
+ }
+ }
+ }
+}
+
+// Rub returns a copy of buf with all non-whitespace characters replaced
+// by spaces (like rubbing them out with white out).
+func rub(buf []byte) []byte {
+ // TODO(mdempsky): Handle combining characters?
+ var res bytes.Buffer
+ for _, r := range string(buf) {
+ if unicode.IsSpace(r) {
+ res.WriteRune(r)
+ continue
+ }
+ switch width.LookupRune(r).Kind() {
+ case width.EastAsianWide, width.EastAsianFullwidth:
+ res.WriteString(" ")
+ default:
+ res.WriteByte(' ')
+ }
+ }
+ return res.Bytes()
+}
+
+var (
+ flagAll = flag.Bool("unconvert.all", false, "type check all GOOS and GOARCH combinations")
+ flagApply = flag.Bool("unconvert.apply", false, "apply edits to source files")
+ flagCPUProfile = flag.String("unconvert.cpuprofile", "", "write CPU profile to file")
+ // TODO(mdempsky): Better description and maybe flag name.
+ flagSafe = flag.Bool("unconvert.safe", false, "be more conservative (experimental)")
+ flagV = flag.Bool("unconvert.v", false, "verbose output")
+)
+
+func usage() {
+ fmt.Fprintf(os.Stderr, "usage: unconvert [flags] [package ...]\n")
+ flag.PrintDefaults()
+}
+
+func nomain() {
+ flag.Usage = usage
+ flag.Parse()
+
+ if *flagCPUProfile != "" {
+ f, err := os.Create(*flagCPUProfile)
+ if err != nil {
+ log.Fatal(err)
+ }
+ pprof.StartCPUProfile(f)
+ defer pprof.StopCPUProfile()
+ }
+
+ importPaths := gotool.ImportPaths(flag.Args())
+ if len(importPaths) == 0 {
+ return
+ }
+
+ var m fileToEditSet
+ if *flagAll {
+ m = mergeEdits(importPaths)
+ } else {
+ m = computeEdits(importPaths, build.Default.GOOS, build.Default.GOARCH, build.Default.CgoEnabled)
+ }
+
+ if *flagApply {
+ var wg sync.WaitGroup
+ for f, e := range m {
+ wg.Add(1)
+ f, e := f, e
+ go func() {
+ defer wg.Done()
+ apply(f, e)
+ }()
+ }
+ wg.Wait()
+ } else {
+ var conversions []token.Position
+ for _, positions := range m {
+ for pos := range positions {
+ conversions = append(conversions, pos)
+ }
+ }
+ sort.Sort(byPosition(conversions))
+ print(conversions)
+ if len(conversions) > 0 {
+ os.Exit(1)
+ }
+ }
+}
+
+func Run(prog *loader.Program) []token.Position {
+ m := computeEditsFromProg(prog)
+ var conversions []token.Position
+ for _, positions := range m {
+ for pos := range positions {
+ conversions = append(conversions, pos)
+ }
+ }
+ return conversions
+}
+
+var plats = [...]struct {
+ goos, goarch string
+}{
+ // TODO(mdempsky): buildall.bash also builds linux-386-387 and linux-arm-arm5.
+ {"android", "386"},
+ {"android", "amd64"},
+ {"android", "arm"},
+ {"android", "arm64"},
+ {"darwin", "386"},
+ {"darwin", "amd64"},
+ {"darwin", "arm"},
+ {"darwin", "arm64"},
+ {"dragonfly", "amd64"},
+ {"freebsd", "386"},
+ {"freebsd", "amd64"},
+ {"freebsd", "arm"},
+ {"linux", "386"},
+ {"linux", "amd64"},
+ {"linux", "arm"},
+ {"linux", "arm64"},
+ {"linux", "mips64"},
+ {"linux", "mips64le"},
+ {"linux", "ppc64"},
+ {"linux", "ppc64le"},
+ {"linux", "s390x"},
+ {"nacl", "386"},
+ {"nacl", "amd64p32"},
+ {"nacl", "arm"},
+ {"netbsd", "386"},
+ {"netbsd", "amd64"},
+ {"netbsd", "arm"},
+ {"openbsd", "386"},
+ {"openbsd", "amd64"},
+ {"openbsd", "arm"},
+ {"plan9", "386"},
+ {"plan9", "amd64"},
+ {"plan9", "arm"},
+ {"solaris", "amd64"},
+ {"windows", "386"},
+ {"windows", "amd64"},
+}
+
+func mergeEdits(importPaths []string) fileToEditSet {
+ m := make(fileToEditSet)
+ for _, plat := range plats {
+ for f, e := range computeEdits(importPaths, plat.goos, plat.goarch, false) {
+ if e0, ok := m[f]; ok {
+ for k := range e0 {
+ if _, ok := e[k]; !ok {
+ delete(e0, k)
+ }
+ }
+ } else {
+ m[f] = e
+ }
+ }
+ }
+ return m
+}
+
+type noImporter struct{}
+
+func (noImporter) Import(path string) (*types.Package, error) {
+ panic("golang.org/x/tools/go/loader said this wouldn't be called")
+}
+
+func computeEdits(importPaths []string, os, arch string, cgoEnabled bool) fileToEditSet {
+ ctxt := build.Default
+ ctxt.GOOS = os
+ ctxt.GOARCH = arch
+ ctxt.CgoEnabled = cgoEnabled
+
+ var conf loader.Config
+ conf.Build = &ctxt
+ conf.TypeChecker.Importer = noImporter{}
+ for _, importPath := range importPaths {
+ conf.Import(importPath)
+ }
+ prog, err := conf.Load()
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ return computeEditsFromProg(prog)
+}
+
+func computeEditsFromProg(prog *loader.Program) fileToEditSet {
+ type res struct {
+ file string
+ edits editSet
+ }
+ ch := make(chan res)
+ var wg sync.WaitGroup
+ for _, pkg := range prog.InitialPackages() {
+ for _, file := range pkg.Files {
+ pkg, file := pkg, file
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ v := visitor{pkg: pkg, file: prog.Fset.File(file.Package), edits: make(editSet)}
+ ast.Walk(&v, file)
+ ch <- res{v.file.Name(), v.edits}
+ }()
+ }
+ }
+ go func() {
+ wg.Wait()
+ close(ch)
+ }()
+
+ m := make(fileToEditSet)
+ for r := range ch {
+ m[r.file] = r.edits
+ }
+ return m
+}
+
+type step struct {
+ n ast.Node
+ i int
+}
+
+type visitor struct {
+ pkg *loader.PackageInfo
+ file *token.File
+ edits editSet
+ path []step
+}
+
+func (v *visitor) Visit(node ast.Node) ast.Visitor {
+ if node != nil {
+ v.path = append(v.path, step{n: node})
+ } else {
+ n := len(v.path)
+ v.path = v.path[:n-1]
+ if n >= 2 {
+ v.path[n-2].i++
+ }
+ }
+
+ if call, ok := node.(*ast.CallExpr); ok {
+ v.unconvert(call)
+ }
+ return v
+}
+
+func (v *visitor) unconvert(call *ast.CallExpr) {
+ // TODO(mdempsky): Handle useless multi-conversions.
+
+ // Conversions have exactly one argument.
+ if len(call.Args) != 1 || call.Ellipsis != token.NoPos {
+ return
+ }
+ ft, ok := v.pkg.Types[call.Fun]
+ if !ok {
+ fmt.Println("Missing type for function")
+ return
+ }
+ if !ft.IsType() {
+ // Function call; not a conversion.
+ return
+ }
+ at, ok := v.pkg.Types[call.Args[0]]
+ if !ok {
+ fmt.Println("Missing type for argument")
+ return
+ }
+ if !types.Identical(ft.Type, at.Type) {
+ // A real conversion.
+ return
+ }
+ if isUntypedValue(call.Args[0], &v.pkg.Info) {
+ // Workaround golang.org/issue/13061.
+ return
+ }
+ if *flagSafe && !v.isSafeContext(at.Type) {
+ // TODO(mdempsky): Remove this message.
+ fmt.Println("Skipped a possible type conversion because of -safe at", v.file.Position(call.Pos()))
+ return
+ }
+ if v.isCgoCheckPointerContext() {
+ // cmd/cgo generates explicit type conversions that
+ // are often redundant when introducing
+ // _cgoCheckPointer calls (issue #16). Users can't do
+ // anything about these, so skip over them.
+ return
+ }
+
+ v.edits[v.file.Position(call.Lparen)] = struct{}{}
+}
+
+func (v *visitor) isCgoCheckPointerContext() bool {
+ ctxt := &v.path[len(v.path)-2]
+ if ctxt.i != 1 {
+ return false
+ }
+ call, ok := ctxt.n.(*ast.CallExpr)
+ if !ok {
+ return false
+ }
+ ident, ok := call.Fun.(*ast.Ident)
+ if !ok {
+ return false
+ }
+ return ident.Name == "_cgoCheckPointer"
+}
+
+// isSafeContext reports whether the current context requires
+// an expression of type t.
+//
+// TODO(mdempsky): That's a bad explanation.
+func (v *visitor) isSafeContext(t types.Type) bool {
+ ctxt := &v.path[len(v.path)-2]
+ switch n := ctxt.n.(type) {
+ case *ast.AssignStmt:
+ pos := ctxt.i - len(n.Lhs)
+ if pos < 0 {
+ fmt.Println("Type conversion on LHS of assignment?")
+ return false
+ }
+ if n.Tok == token.DEFINE {
+ // Skip := assignments.
+ return true
+ }
+ // We're a conversion in the pos'th element of n.Rhs.
+ // Check that the corresponding element of n.Lhs is of type t.
+ lt, ok := v.pkg.Types[n.Lhs[pos]]
+ if !ok {
+ fmt.Println("Missing type for LHS expression")
+ return false
+ }
+ return types.Identical(t, lt.Type)
+ case *ast.BinaryExpr:
+ if n.Op == token.SHL || n.Op == token.SHR {
+ if ctxt.i == 1 {
+ // RHS of a shift is always safe.
+ return true
+ }
+ // For the LHS, we should inspect up another level.
+ fmt.Println("TODO(mdempsky): Handle LHS of shift expressions")
+ return true
+ }
+ var other ast.Expr
+ if ctxt.i == 0 {
+ other = n.Y
+ } else {
+ other = n.X
+ }
+ ot, ok := v.pkg.Types[other]
+ if !ok {
+ fmt.Println("Missing type for other binop subexpr")
+ return false
+ }
+ return types.Identical(t, ot.Type)
+ case *ast.CallExpr:
+ pos := ctxt.i - 1
+ if pos < 0 {
+ // Type conversion in the function subexpr is okay.
+ return true
+ }
+ ft, ok := v.pkg.Types[n.Fun]
+ if !ok {
+ fmt.Println("Missing type for function expression")
+ return false
+ }
+ sig, ok := ft.Type.(*types.Signature)
+ if !ok {
+ // "Function" is either a type conversion (ok) or a builtin (ok?).
+ return true
+ }
+ params := sig.Params()
+ var pt types.Type
+ if sig.Variadic() && n.Ellipsis == token.NoPos && pos >= params.Len()-1 {
+ pt = params.At(params.Len() - 1).Type().(*types.Slice).Elem()
+ } else {
+ pt = params.At(pos).Type()
+ }
+ return types.Identical(t, pt)
+ case *ast.CompositeLit, *ast.KeyValueExpr:
+ fmt.Println("TODO(mdempsky): Compare against value type of composite literal type at", v.file.Position(n.Pos()))
+ return true
+ case *ast.ReturnStmt:
+ // TODO(mdempsky): Is there a better way to get the corresponding
+ // return parameter type?
+ var funcType *ast.FuncType
+ for i := len(v.path) - 1; funcType == nil && i >= 0; i-- {
+ switch f := v.path[i].n.(type) {
+ case *ast.FuncDecl:
+ funcType = f.Type
+ case *ast.FuncLit:
+ funcType = f.Type
+ }
+ }
+ var typeExpr ast.Expr
+ for i, j := ctxt.i, 0; j < len(funcType.Results.List); j++ {
+ f := funcType.Results.List[j]
+ if len(f.Names) == 0 {
+ if i >= 1 {
+ i--
+ continue
+ }
+ } else {
+ if i >= len(f.Names) {
+ i -= len(f.Names)
+ continue
+ }
+ }
+ typeExpr = f.Type
+ break
+ }
+ if typeExpr == nil {
+ fmt.Println(ctxt)
+ }
+ pt, ok := v.pkg.Types[typeExpr]
+ if !ok {
+ fmt.Println("Missing type for return parameter at", v.file.Position(n.Pos()))
+ return false
+ }
+ return types.Identical(t, pt.Type)
+ case *ast.StarExpr, *ast.UnaryExpr:
+ // TODO(mdempsky): I think these are always safe.
+ return true
+ case *ast.SwitchStmt:
+ // TODO(mdempsky): I think this is always safe?
+ return true
+ default:
+ // TODO(mdempsky): When can this happen?
+ fmt.Printf("... huh, %T at %v\n", n, v.file.Position(n.Pos()))
+ return true
+ }
+}
+
+func isUntypedValue(n ast.Expr, info *types.Info) (res bool) {
+ switch n := n.(type) {
+ case *ast.BinaryExpr:
+ switch n.Op {
+ case token.SHL, token.SHR:
+ // Shifts yield an untyped value if their LHS is untyped.
+ return isUntypedValue(n.X, info)
+ case token.EQL, token.NEQ, token.LSS, token.GTR, token.LEQ, token.GEQ:
+ // Comparisons yield an untyped boolean value.
+ return true
+ case token.ADD, token.SUB, token.MUL, token.QUO, token.REM,
+ token.AND, token.OR, token.XOR, token.AND_NOT,
+ token.LAND, token.LOR:
+ return isUntypedValue(n.X, info) && isUntypedValue(n.Y, info)
+ }
+ case *ast.UnaryExpr:
+ switch n.Op {
+ case token.ADD, token.SUB, token.NOT, token.XOR:
+ return isUntypedValue(n.X, info)
+ }
+ case *ast.BasicLit:
+ // Basic literals are always untyped.
+ return true
+ case *ast.ParenExpr:
+ return isUntypedValue(n.X, info)
+ case *ast.SelectorExpr:
+ return isUntypedValue(n.Sel, info)
+ case *ast.Ident:
+ if obj, ok := info.Uses[n]; ok {
+ if obj.Pkg() == nil && obj.Name() == "nil" {
+ // The universal untyped zero value.
+ return true
+ }
+ if b, ok := obj.Type().(*types.Basic); ok && b.Info()&types.IsUntyped != 0 {
+ // Reference to an untyped constant.
+ return true
+ }
+ }
+ case *ast.CallExpr:
+ if b, ok := asBuiltin(n.Fun, info); ok {
+ switch b.Name() {
+ case "real", "imag":
+ return isUntypedValue(n.Args[0], info)
+ case "complex":
+ return isUntypedValue(n.Args[0], info) && isUntypedValue(n.Args[1], info)
+ }
+ }
+ }
+
+ return false
+}
+
+func asBuiltin(n ast.Expr, info *types.Info) (*types.Builtin, bool) {
+ for {
+ paren, ok := n.(*ast.ParenExpr)
+ if !ok {
+ break
+ }
+ n = paren.X
+ }
+
+ ident, ok := n.(*ast.Ident)
+ if !ok {
+ return nil, false
+ }
+
+ obj, ok := info.Uses[ident]
+ if !ok {
+ return nil, false
+ }
+
+ b, ok := obj.(*types.Builtin)
+ return b, ok
+}
+
+type byPosition []token.Position
+
+func (p byPosition) Len() int {
+ return len(p)
+}
+
+func (p byPosition) Less(i, j int) bool {
+ if p[i].Filename != p[j].Filename {
+ return p[i].Filename < p[j].Filename
+ }
+ if p[i].Line != p[j].Line {
+ return p[i].Line < p[j].Line
+ }
+ return p[i].Column < p[j].Column
+}
+
+func (p byPosition) Swap(i, j int) {
+ p[i], p[j] = p[j], p[i]
+}